{
  "version": 3,
  "sources": ["../../../src/orm/validation.ts", "../../../src/orm/query.ts", "../../../src/orm/types.ts"],
  "sourcesContent": ["import flow from 'lodash/flow.js'\nimport {\n  PropertyValidatorComponentAsync,\n  DataDescription,\n  PrimaryKeyType,\n  ComponentValidationErrorResponse,\n  JsonAble,\n  ModelValidatorComponent,\n} from '../types.js'\nimport { queryBuilder } from './query.js'\nimport {\n  OrmSearch,\n  OrmValidatorContext,\n  OrmModel,\n  OrmModelExtensions,\n  OrmModelInstanceExtensions,\n} from './types.js'\n\nconst _doUniqueCheck = async <T extends DataDescription>(\n  query: OrmSearch,\n  model: OrmModel<T>,\n  instanceData: T | JsonAble,\n  buildErrorMessage: () => ComponentValidationErrorResponse\n): Promise<ComponentValidationErrorResponse> => {\n  const results = await model.search(query)\n  const resultsLength = results.instances.length\n  // There is nothing stored with this value.\n  if (resultsLength < 1) {\n    return undefined\n  }\n  const ids: readonly PrimaryKeyType[] = await Promise.all(\n    results.instances.map((x: any) => x.getPrimaryKey())\n  )\n  // We have our match by id.\n  // @ts-ignore\n  const instanceId = instanceData[model.getModelDefinition().primaryKeyName]\n  if (ids.length === 1 && ids[0] === instanceId) {\n    return undefined\n  }\n  if (ids.length > 1) {\n    // This is a weird but possible case where there is more than one item. We don't want to error\n    // if the instance we are checking is already in the datastore.\n    if (ids.find(x => x === instanceId)) {\n      return undefined\n    }\n  }\n  return buildErrorMessage()\n}\n\n/**\n * A validator that ensures that there is only one instance stored, that has a unique combination of values.\n * @param propertyKeyArray - An array of property names that create the unique match.\n */\nconst uniqueTogether = <T extends DataDescription>(\n  propertyKeyArray: readonly string[]\n): ModelValidatorComponent<\n  T,\n  OrmModelExtensions,\n  OrmModelInstanceExtensions\n> => {\n  const _uniqueTogether = async (\n    model: OrmModel<T>,\n    instanceData: T | JsonAble,\n    options: OrmValidatorContext\n  ) => {\n    if (options?.noOrmValidation) {\n      return undefined\n    }\n    const properties = propertyKeyArray.map(key => {\n      // @ts-ignore\n      return [key, instanceData[key]]\n    })\n    const query = flow(\n      properties.map(([key, value], index) => {\n        return b => {\n          // We only want to do an 'and' if there is another property.\n          if (index + 1 >= properties.length) {\n            return b.property(key, value, { caseSensitive: false })\n          }\n          return b.property(key, value, { caseSensitive: false }).and()\n        }\n      })\n    )(queryBuilder().take(2)).compile()\n    return _doUniqueCheck<T>(query, model, instanceData, () => {\n      return propertyKeyArray.length > 1\n        ? `${propertyKeyArray.join(\n            ','\n          )} must be unique together. Another instance found.`\n        : `${propertyKeyArray[0]} must be unique. Another instance found.`\n    })\n  }\n  return _uniqueTogether\n}\n\n/**\n * Validates that a stored instance is the only one that has a value for a specific property.\n * This only validates before the instance goes into the datastore.\n * @param propertyKey - The property key to check.\n */\nconst unique = <T extends DataDescription>(\n  propertyKey: string\n): PropertyValidatorComponentAsync<\n  T,\n  OrmModelExtensions,\n  OrmModelInstanceExtensions\n> => {\n  const _unique: PropertyValidatorComponentAsync<\n    T,\n    OrmModelExtensions,\n    OrmModelInstanceExtensions\n  > = (value, model, instanceData, options) => {\n    return uniqueTogether<T>([propertyKey])(model, instanceData, options)\n  }\n  return _unique\n}\n\n/**\n * Creates a base orm context.\n * @param noOrmValidation - Determines if the validation process should ignore any ORM related validation. (If you don't want to do a database query for a specific validation).\n */\nconst buildOrmValidatorContext = ({\n  noOrmValidation = false,\n}): OrmValidatorContext => ({\n  noOrmValidation,\n})\n\nexport { unique, uniqueTogether, buildOrmValidatorContext }\n", "import merge from 'lodash/merge.js'\nimport omit from 'lodash/omit.js'\nimport {\n  AllowableEqualitySymbols,\n  BooleanQuery,\n  BuilderV2Link,\n  DatastoreValueType,\n  DatesAfterQuery,\n  DatesBeforeQuery,\n  EqualitySymbol,\n  InnerBuilderV2,\n  MaxMatchStatement,\n  OrmSearch,\n  PaginationQuery,\n  PropertyOptions,\n  PropertyQuery,\n  Query,\n  QueryBuilder,\n  QueryTokens,\n  SortOrder,\n  SortStatement,\n  SubBuilderFunction,\n} from './types.js'\n\nconst THREE = 3\n\nconst _objectize = <T>(key: string, value: T) => {\n  return value\n    ? {\n        [key]: value,\n      }\n    : {}\n}\n\nconst _additionalLink = (data: OrmSearch): InnerBuilderV2 & BuilderV2Link => {\n  const inner = _builderV2(data)\n  const partialLink = omit(_link(data), ['and', 'or'])\n  // @ts-ignore\n  return {\n    ...inner,\n    ...partialLink,\n  }\n}\n\nconst _link = (data: OrmSearch): BuilderV2Link => {\n  return {\n    and: () => {\n      return _queryBuilder({ ...data, query: data.query.concat('AND') })\n    },\n    or: () => {\n      return _queryBuilder({ ...data, query: data.query.concat('OR') })\n    },\n    compile: () => {\n      return data\n    },\n    take: (num: number) => {\n      return _additionalLink({ ...data, take: take(num) })\n    },\n    sort: (key: string, order = SortOrder.asc) => {\n      return _additionalLink({ ...data, sort: sort(key, order) })\n    },\n    pagination: (value: any) => {\n      return _additionalLink({ ...data, page: pagination(value) })\n    },\n  }\n}\n\nconst _canCompile = (obj: any): obj is { compile: () => OrmSearch } => {\n  return Boolean(obj.compile)\n}\n\nconst _builderV2 = (data: OrmSearch): InnerBuilderV2 => {\n  const _myProperty = (name: string, value: any, options?: PropertyOptions) => {\n    // @ts-ignore\n    const p = property(name, value, options)\n    return _link(merge(data, { query: data.query.concat(p) }))\n  }\n\n  const complex = (subBuilderFunc: SubBuilderFunction) => {\n    const subBuilder = _queryBuilder()\n    const result = subBuilderFunc(subBuilder)\n    if (_canCompile(result)) {\n      const queryTokens: [readonly QueryTokens[]] = [result.compile().query]\n      return _link(\n        merge(data, {\n          query: data.query.concat(queryTokens),\n        })\n      )\n    }\n    // @ts-ignore\n    return _link(merge(data, { query: data.query.concat([result.query]) }))\n  }\n\n  const thisDatesBefore = (\n    key: string,\n    jsDate: Date | string,\n    { valueType = DatastoreValueType.date, equalToAndBefore = true } = {}\n  ) => {\n    const p = datesBefore(key, jsDate, { valueType, equalToAndBefore })\n    return _link(merge(data, { query: data.query.concat(p) }))\n  }\n\n  const thisDatesAfter = (\n    key: string,\n    jsDate: Date | string,\n    { valueType = DatastoreValueType.date, equalToAndAfter = true } = {}\n  ) => {\n    const p = datesAfter(key, jsDate, { valueType, equalToAndAfter })\n    return _link(merge(data, { query: data.query.concat(p) }))\n  }\n\n  return {\n    datesBefore: thisDatesBefore,\n    datesAfter: thisDatesAfter,\n    complex,\n    property: _myProperty,\n  }\n}\n\nconst _queryBuilder = (\n  data: Partial<OrmSearch> | undefined = undefined\n): QueryBuilder => {\n  const theData = merge(\n    {\n      query: [],\n    },\n    data\n  )\n  const builder = _builderV2(theData)\n  const linkData = _additionalLink(theData)\n  // @ts-ignore\n  return {\n    ...builder,\n    ...linkData,\n    compile: () => {\n      return {\n        ..._objectize('take', theData.take),\n        ..._objectize('sort', theData.sort),\n        ..._objectize('page', theData.page),\n        query: [],\n      } as OrmSearch\n    },\n  }\n}\n\n/**\n * Creates a property query.\n * @param key - The property's name/key/column to match on\n * @param value - The value to match\n * @param options - Additional options for changing this property query.\n */\nconst property = (\n  key: string,\n  value: any,\n  options: PropertyOptions = {}\n): PropertyQuery => {\n  const {\n    equalitySymbol = EqualitySymbol.eq,\n    caseSensitive,\n    startsWith,\n    endsWith,\n    includes,\n    type,\n  } = options\n  const typeToUse = type || DatastoreValueType.string\n  if (!AllowableEqualitySymbols.includes(equalitySymbol)) {\n    throw new Error(`${equalitySymbol} is not a valid symbol`)\n  }\n  if (\n    equalitySymbol !== EqualitySymbol.eq &&\n    equalitySymbol !== EqualitySymbol.ne &&\n    typeToUse === DatastoreValueType.string\n  ) {\n    throw new Error(`Cannot use a non = symbol for a string type`)\n  }\n\n  const propertyEntry: PropertyQuery = {\n    type: 'property',\n    key,\n    value,\n    valueType: typeToUse,\n    equalitySymbol,\n    options: {\n      ..._objectize('caseSensitive', caseSensitive),\n      ..._objectize('startsWith', startsWith),\n      ..._objectize('endsWith', endsWith),\n      ..._objectize('includes', includes),\n    },\n  }\n  return propertyEntry\n}\n\n/**\n * Limits the number of results to the provided count.\n * @param max - The maximum results to find\n */\nconst take = (max: number): MaxMatchStatement => {\n  const parsed = parseInt(`${max}`, 10)\n  if (Number.isNaN(parsed)) {\n    throw new Error(`Number \"${max}\" is not integerable`)\n  }\n  return parsed\n}\n\n/**\n * Creates a sort query\n * @param key - The key to sort on\n * @param order - The order of the sort.\n */\nconst sort = (\n  key: string,\n  order: SortOrder | undefined = SortOrder.asc\n): SortStatement => {\n  if (order !== SortOrder.asc && order !== SortOrder.dsc) {\n    throw new Error('Sort must be either asc or dsc')\n  }\n  return {\n    key,\n    order,\n  }\n}\n\n/**\n * Creates a pagination query.\n * @param value - Anything\n */\nconst pagination = (value: any): PaginationQuery => {\n  return value\n}\n\n/**\n * Creates a query that looks at dated objects after the given date.\n * @param key - The property's key\n * @param jsDate - The date value being examined\n * @param options - Additional options\n */\nconst datesAfter = (\n  key: string,\n  jsDate: Date | string,\n  options: { valueType: DatastoreValueType; equalToAndAfter: boolean } = {\n    valueType: DatastoreValueType.date,\n    equalToAndAfter: true,\n  }\n): DatesAfterQuery => {\n  const { valueType = DatastoreValueType.date, equalToAndAfter = true } =\n    options\n  return {\n    type: 'datesAfter',\n    key,\n    date: isDate(jsDate) ? jsDate.toISOString() : jsDate,\n    valueType,\n    options: {\n      equalToAndAfter,\n    },\n  }\n}\n\n/**\n * Determines if the object is a Date\n * @param obj - Date or string\n */\nconst isDate = (obj: Date | string): obj is Date => {\n  // @ts-ignore\n  return Boolean(obj.toISOString)\n}\n\n/**\n * Creates a search query that looks at dates before the given date.\n * @param key - The property's key\n * @param jsDate - The date value being examined.\n * @param options - Additional options\n */\nconst datesBefore = (\n  key: string,\n  jsDate: Date | string,\n  options: { valueType: DatastoreValueType; equalToAndBefore: boolean } = {\n    valueType: DatastoreValueType.date,\n    equalToAndBefore: true,\n  }\n): DatesBeforeQuery => {\n  const { valueType = DatastoreValueType.date, equalToAndBefore = true } =\n    options\n  return {\n    type: 'datesBefore',\n    key,\n    date: isDate(jsDate) ? jsDate.toISOString() : jsDate,\n    valueType,\n    options: {\n      equalToAndBefore,\n    },\n  }\n}\n\n/**\n * Creates a builder that can create search queries.\n * This is a structured way to build search queries.\n */\nconst queryBuilder = (): QueryBuilder => {\n  return _queryBuilder()\n}\n\n/**\n * Determines if the token is an Orm Property based statement\n * @param value\n */\nconst isPropertyBasedQuery = (value: any): value is Query => {\n  if (!value || !value.type) {\n    return false\n  }\n  return (\n    value.type === 'property' ||\n    value.type === 'datesBefore' ||\n    value.type === 'datesAfter'\n  )\n}\n\n/**\n * Determines if the value is a boolean\n * @param value - The value to examine.\n */\nconst isALinkToken = (value: any): value is BooleanQuery => {\n  if (!value) {\n    return false\n  }\n  if (typeof value !== 'string') {\n    return false\n  }\n  value = value.toLowerCase()\n  return value === 'and' || value === 'or'\n}\n\n/**\n * Creates an AND\n */\nconst and = () => 'AND'\n\n/**\n * Creates an OR\n */\nconst or = () => 'OR'\n\n/**\n * A helper query that is text based.\n * @param key - The property key/name\n * @param value - The value to match\n * @param options - Additional text based options\n */\nconst textQuery = (\n  key: string,\n  value: string | undefined | null,\n  options?: Omit<Partial<PropertyOptions>, 'type' | 'equalitySymbol'>\n) =>\n  property(\n    key,\n    value,\n    Object.assign({}, options, {\n      equalitySymbol: undefined,\n      type: DatastoreValueType.string,\n    })\n  )\n\n/**\n * A helper query that is number based.\n * @param key - The property key/name\n * @param value - The value to match\n * @param equalitySymbol - A matching symbol for the number\n */\nconst numberQuery = (\n  key: string,\n  value: number | string | undefined | null,\n  equalitySymbol: EqualitySymbol = EqualitySymbol.eq\n) =>\n  property(key, value, {\n    equalitySymbol,\n    type: DatastoreValueType.number,\n  })\n\n/**\n * A helper query that is for boolean values.\n * @param key - The property key/name\n * @param value - The value to match\n */\nconst booleanQuery = (key: string, value: boolean | undefined | null) =>\n  property(key, value, {\n    type: DatastoreValueType.boolean,\n    equalitySymbol: EqualitySymbol.eq,\n  })\n\n/**\n * A useful utility for processing {@link QueryTokens} with a {@link DatastoreAdapter}\n * Takes the first 3 values (property, LINK, property) and then shifts the list left by 2, so that it can create another property, LINK, property\n * @param data - The list of values\n */\nconst threeitize = <T>(data: T[]): T[][] => {\n  if (data.length === 0 || data.length === 1) {\n    return []\n  }\n  if (data.length % 2 === 0) {\n    throw new Error('Must be an odd number of 3 or greater.')\n  }\n  const three = data.slice(0, THREE)\n  const rest = data.slice(2)\n  const moreThrees = threeitize(rest)\n  return [three, ...moreThrees]\n}\n\nconst _validateTokenTypes = (token: QueryTokens) => {\n  if (Array.isArray(token)) {\n    token.forEach(_validateTokenTypes)\n    return\n  }\n  if (isPropertyBasedQuery(token)) {\n    return\n  }\n  if (isALinkToken(token)) {\n    return\n  }\n  throw new Error(`Unknown token type ${token}`)\n}\n\nconst _validateTokenStructure = (o: QueryTokens[]) => {\n  const first = o[0]\n  if (first === 'AND' || first === 'OR') {\n    throw new Error('Cannot have AND or OR at the very start.')\n  }\n  const last = o[o.length - 1]\n  if (last === 'AND' || last === 'OR') {\n    throw new Error('Cannot have AND or OR at the very end.')\n  }\n  if (o.every(x => x !== 'AND' && x !== 'OR')) {\n    o.every(_validateArrayOrQuery)\n    return\n  }\n  const totalLinks = o.filter(x => x === 'AND' || x === 'OR')\n  const nonLinks = o.filter(x => x !== 'AND' && x !== 'OR')\n  if (totalLinks.length !== nonLinks.length - 1) {\n    throw new Error('Must separate each statement with an AND or OR')\n  }\n  // eslint-disable-next-line functional/immutable-data\n  const threes = threeitize(o).reverse()\n  threes.forEach(([a, l, b]) => {\n    if (l !== 'AND' && l !== 'OR') {\n      // @ts-ignore\n      if (isPropertyBasedQuery(l)) {\n        throw new Error('Must have AND/OR between property queries')\n      }\n      throw new Error('Must have AND/OR between nested queries')\n    }\n    _validateArrayOrQuery(a)\n    _validateArrayOrQuery(b)\n  })\n  return\n}\n\nconst _validateArrayOrQuery = (o: QueryTokens) => {\n  if (Array.isArray(o)) {\n    _validateTokenStructure(o)\n    return\n  }\n  if (isPropertyBasedQuery(o)) {\n    return\n  }\n  throw new Error('Order of link tokens and queries invalid')\n}\n\nconst validateOrmSearch = (search: OrmSearch) => {\n  if (Array.isArray(search.query) === false) {\n    throw new Error(`Query must be an array`)\n  }\n  if (search.query.length < 1) {\n    return\n  }\n  _validateTokenTypes(search.query)\n  _validateTokenStructure(search.query)\n}\n\nexport {\n  queryBuilder,\n  take,\n  pagination,\n  sort,\n  property,\n  and,\n  or,\n  isALinkToken,\n  isPropertyBasedQuery,\n  datesBefore,\n  datesAfter,\n  textQuery,\n  numberQuery,\n  booleanQuery,\n  threeitize,\n  validateOrmSearch,\n}\n", "import {\n  Arrayable,\n  DataValue,\n  Maybe,\n  ModelInstance,\n  ModelType,\n  DataDescription,\n  PrimaryKeyType,\n  MinimalModelDefinition,\n  PropertyConfig,\n  ValidatorContext,\n  ToObjectResult,\n  ModelInstanceFetcher,\n  ModelFactoryOptions,\n  CreateParams,\n  PropertyType,\n  CanBeNullableType,\n} from '../types.js'\n\n/**\n * Equals symbols for doing database matching\n */\nexport enum EqualitySymbol {\n  // Equals\n  eq = '=',\n  // Less than\n  lt = '<',\n  // Equal to or less than\n  lte = '<=',\n  // Greater than\n  gt = '>',\n  // Equal to or greater than\n  gte = '>=',\n  // Not equal to\n  ne = '!=',\n}\n\n/**\n * The value types that map to database types.\n */\nexport enum DatastoreValueType {\n  string = 'string',\n  number = 'number',\n  date = 'date',\n  object = 'object',\n  boolean = 'boolean',\n}\n\n/**\n * A list of allowable equality symbols.\n */\nexport const AllowableEqualitySymbols = Object.values(EqualitySymbol)\n\n/**\n * A function that can save.\n */\ntype SaveMethod<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n  /**\n   * An instance to save\n   */\n  instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<\n  OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A method that can delete\n */\ntype DeleteMethod<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n  instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<void>\n\n/**\n * A function that allows overriding the save functionality for a specific model.\n */\nexport type SaveOverride<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n  existingSave: SaveMethod<TModelExtensions, TModelInstanceExtensions>,\n  instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<\n  OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A function that allows overriding the delete functionality for a specific model.\n */\nexport type DeleteOverride<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n  existingDelete: DeleteMethod<TModelExtensions, TModelInstanceExtensions>,\n  instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<void>\n\n/**\n * A result of an ORM search.\n * @interface\n */\nexport type OrmSearchResult<\n  TData extends DataDescription,\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = Readonly<{\n  /**\n   * A list of instances\n   */\n  instances: readonly OrmModelInstance<\n    TData,\n    TModelExtensions,\n    TModelInstanceExtensions\n  >[]\n  /**\n   * An optional page value. The exact structure is provided by the datastore itself.\n   */\n  page?: any\n}>\n\n/**\n * ORM based ModelFactory extensions.\n * @interface\n */\nexport type OrmModelFactoryOptionsExtensions<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = Readonly<{\n  /**\n   * Optional: The save function to override.\n   */\n  save?: SaveOverride<TModelExtensions, TModelInstanceExtensions>\n  /**\n   * Optional: The delete function to override.\n   */\n  delete?: DeleteOverride<TModelExtensions, TModelInstanceExtensions>\n}>\n\n/**\n * Extensions to the Model type\n * @interface\n */\nexport type OrmModelExtensions<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = Readonly<{\n  /**\n   * Save the model\n   * @param instance - The instance to save.\n   */\n  save: <TData extends DataDescription>(\n    instance: OrmModelInstance<\n      TData,\n      TModelExtensions,\n      TModelInstanceExtensions\n    >\n  ) => Promise<\n    OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n  >\n  /**\n   * Deletes an instance by its id.\n   * @param id - The id to delete\n   */\n  delete: (id: PrimaryKeyType) => Promise<void>\n  /**\n   * Attempts to get an instance by its id\n   * @param primaryKey\n   */\n  retrieve: <TData extends DataDescription>(\n    primaryKey: PrimaryKeyType\n  ) => Promise<\n    Maybe<OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>>\n  >\n  /**\n   * Searches instances by the provided search query\n   * @param query\n   */\n  search: <TData extends DataDescription>(\n    query: OrmSearch\n  ) => Promise<\n    OrmSearchResult<\n      TData,\n      OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n    >\n  >\n  /**\n   * Searches for a single instance with the given query.\n   * @param query\n   */\n  searchOne: <TData extends DataDescription>(\n    query: Omit<OrmSearch, 'take'>\n  ) => Promise<\n    | OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n    | undefined\n  >\n  /**\n   * Creates and saves an instance. An optimization in some databases\n   * @param query\n   */\n  createAndSave: <TData extends DataDescription>(\n    data: OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n  ) => Promise<\n    OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n  >\n  /**\n   * Inserts multiple objects at once. Can often see great optimizations in some databases.\n   * @param query\n   */\n  bulkInsert: <TData extends DataDescription>(\n    instances: readonly OrmModelInstance<\n      TData,\n      TModelExtensions,\n      TModelInstanceExtensions\n    >[]\n  ) => Promise<void>\n  /**\n   * Deletes multiple instances at once.\n   * @param instances\n   */\n  bulkDelete: <TData extends DataDescription>(\n    keysOrInstances:\n      | readonly OrmModelInstance<\n          TData,\n          TModelExtensions,\n          TModelInstanceExtensions\n        >[]\n      | readonly PrimaryKeyType[]\n  ) => Promise<void>\n  /**\n   * Counts the number of models saved in the database.\n   */\n  count: () => Promise<number>\n}>\n\n/**\n * Instance overrides that give it ORM functions.\n * @interface\n */\nexport type OrmModelInstanceExtensions<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = Readonly<{\n  /**\n   * Save this model.\n   */\n  save: <TData extends DataDescription>() => Promise<\n    OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n  >\n  /**\n   * Delete this model.\n   */\n  delete: () => Promise<void>\n}>\n\n/**\n * ORM based configurations for a model.\n * @interface\n */\nexport type OrmModelConfigurations = Readonly<{\n  /**\n   * Validator that there is only a single value in the datastore that has the properties given.\n   * Example:\n   * [\"name\", \"text\"]\n   * This will make sure that there can only be a single row in the database that has a unique combination of name and text.\n   */\n  uniqueTogether?: readonly string[]\n  /**\n   * Optional property name that stores the model's expiry as a Unix timestamp in minutes.\n   * Datastores can use this to prune expired records.\n   */\n  ttlPropertyName?: string\n}>\n\n/**\n * A minimum orm model definition\n * @interface\n */\nexport type MinimumOrmModelDefinition<TData extends DataDescription> =\n  MinimalModelDefinition<TData> & OrmModelConfigurations\n\n/**\n * A model factory that produces ORM based models.\n *\n */\nexport type OrmModelFactory<\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n  TModelOptionsExtensions extends object = object,\n> = <TData extends DataDescription>(\n  /**\n   * The model definition for the model\n   */\n  modelDef: MinimumOrmModelDefinition<TData>,\n  /**\n   * Additional options for this model.\n   */\n  options?: ModelFactoryOptions<\n    TData,\n    OrmModelFactoryOptionsExtensions<\n      TModelExtensions,\n      TModelInstanceExtensions\n    > &\n      TModelOptionsExtensions\n  >\n) => OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n\n/**\n * A search result from a datastore\n * @interface\n */\nexport type DatastoreSearchResult<T extends DataDescription> = Readonly<{\n  /**\n   * An array of objects that represent the data from the datastore.\n   */\n  instances: readonly ToObjectResult<T>[]\n  /**\n   * Any pagination information.\n   */\n  page?: any\n}>\n\n/**\n * A model that has ORM functions attached.\n * @interface\n */\nexport type OrmModel<\n  TData extends DataDescription,\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = ModelType<\n  TData,\n  OrmModelExtensions<TModelExtensions, TModelInstanceExtensions>,\n  OrmModelInstanceExtensions<TModelExtensions, TModelInstanceExtensions>\n> & {\n  getModelDefinition: () => ReturnType<ModelType<TData>['getModelDefinition']> &\n    OrmModelConfigurations\n}\n\n/**\n * A Model Instance with ORM functions attached.\n * @interface\n */\nexport type OrmModelInstance<\n  TData extends DataDescription,\n  TModelExtensions extends object = object,\n  TModelInstanceExtensions extends object = object,\n> = ModelInstance<\n  TData,\n  OrmModelExtensions<TModelExtensions, TModelInstanceExtensions>,\n  OrmModelInstanceExtensions<TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * An interface that describes a datastore. By implementing this interface, databases can be swapped.\n * @interface\n */\nexport type DatastoreAdapter = Readonly<{\n  /**\n   * Saving a model.\n   * @param instance\n   */\n  save: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n  ) => Promise<ToObjectResult<TData>>\n  /**\n   * Deleting an instance.\n   * @param model\n   * @param id\n   */\n  delete: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n    id: PrimaryKeyType\n  ) => Promise<void>\n  /**\n   * Attempts to retrieves an instance.\n   * @param model\n   * @param primaryKey\n   */\n  retrieve: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n    primaryKey: PrimaryKeyType\n  ) => Promise<Maybe<ToObjectResult<TData>>>\n  /**\n   * Searches for instances by a query.\n   * @param model\n   * @param query\n   */\n  search: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n    query: OrmSearch\n  ) => Promise<DatastoreSearchResult<TData>>\n  /**\n   * Optional: An optimized bulkInsert function. (Highly recommended)\n   * @param model\n   * @param instances\n   */\n  bulkInsert?: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n    instances: readonly ModelInstance<\n      TData,\n      TModelExtensions,\n      TModelInstanceExtensions\n    >[]\n  ) => Promise<void>\n  /**\n   * Optional: An optimized bulkDelete function. (Highly recommended)\n   * @param model\n   * @param keysOrInstances\n   */\n  bulkDelete?: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n    keys: readonly PrimaryKeyType[]\n  ) => Promise<void>\n  /**\n   * Optional: An optimized createAndSave function.\n   * @param instance\n   */\n  createAndSave?: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n  ) => Promise<ToObjectResult<TData>>\n  /**\n   * Optional: An optimized counting function. Highly recommended.\n   * @param model\n   */\n  count?: <\n    TData extends DataDescription,\n    TModelExtensions extends object = object,\n    TModelInstanceExtensions extends object = object,\n  >(\n    model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n  ) => Promise<number>\n}>\n\n/**\n * A search that describes a property and its value.\n * @interface\n */\nexport type PropertyQuery = Readonly<{\n  /**\n   * Distinguishes this as a property  query.\n   */\n  type: 'property'\n  /**\n   * The property's key\n   */\n  key: string\n  /**\n   * The value to search for.\n   */\n  value: any\n  /**\n   * The type of database value.\n   */\n  valueType: DatastoreValueType\n  /**\n   * How the value should be compared.\n   */\n  equalitySymbol: EqualitySymbol\n  /**\n   * Options for additional matching.\n   */\n  options: PropertyOptions\n}>\n\n/**\n * A property search for a string value.\n */\nexport type StringPropertyQuery = PropertyQuery & {\n  valueType: DatastoreValueType.string\n  equalitySymbol: EqualitySymbol.eq | EqualitySymbol.ne\n  options: PropertyOptions\n}\n\n/**\n * A search that looks at dated objects after the given date.\n * @interface\n */\nexport type DatesAfterQuery = Readonly<{\n  /**\n   * Distinguishes this query\n   */\n  type: 'datesAfter'\n  /**\n   * The property's key\n   */\n  key: string\n  /**\n   * The date value being examined.\n   */\n  date: string\n  /**\n   * The database type.\n   */\n  valueType: DatastoreValueType\n  /**\n   * Options for additional searching\n   */\n  options: {\n    /**\n     * Should this search be equalsTo as well as after?\n     */\n    equalToAndAfter: boolean\n  }\n}>\n\n/**\n * A search query that looks at dates before the given date.\n * @interface\n */\nexport type DatesBeforeQuery = Readonly<{\n  /**\n   * Distinguishes this query\n   */\n  type: 'datesBefore'\n  /**\n   * The property's key.\n   */\n  key: string\n  /**\n   * The date value being examined.\n   */\n  date: string\n  /**\n   * The database value type.\n   */\n  valueType: DatastoreValueType\n  /**\n   * Options for additional searching\n   */\n  options: {\n    /**\n     * Should this search be equalsTo as well as before?\n     */\n    equalToAndBefore: boolean\n  }\n}>\n\n/**\n * Additional configurations for ORM based properties.\n * @interface\n */\nexport type OrmPropertyConfig<T extends Arrayable<DataValue>> =\n  PropertyConfig<T> &\n    Readonly<{\n      /**\n       * Validator: Checks to make sure that there is only one instance in a datastore that has this property's value.\n       * NOTE: The value is a property KEY. Not true or false.\n       */\n      unique?: string\n    }>\n\n/**\n * Additional context that is provided for ORM based instance.\n * @interface\n */\nexport type OrmValidatorContext = Readonly<{\n  /**\n   * IMPORTANT: Sometimes you do not want to do any ORM based validation because of speed.\n   * This disables any orm based validation, and only runs non-orm validation.\n   */\n  noOrmValidation?: boolean\n}> &\n  ValidatorContext\n\n/**\n * Options for a property query.\n */\nexport type PropertyOptions = {\n  /**\n   * Is this a case sensitive search?\n   */\n  caseSensitive?: boolean\n  /**\n   * Is the value a startsWith query?\n   */\n  startsWith?: boolean\n  /**\n   * Is the value a endsWith query?\n   */\n  endsWith?: boolean\n  /**\n   * Is the value a includes query?\n   */\n  includes?: boolean\n  /**\n   * The type of value\n   */\n  type?: DatastoreValueType\n  /**\n   * An equality symbol.\n   */\n  equalitySymbol?: EqualitySymbol\n}\n\n/**\n * An object that has both an Orm Model Factory (that can make Orm Models) as well as a loaded fetcher\n * that can retrieve referenced models as needed. See {@see \"functional-models.ModelReference\"}\n * @interface\n */\nexport type Orm = {\n  /**\n   * A model factory that can produce {@link OrmModel}\n   */\n  Model: OrmModelFactory\n  /**\n   * A fetcher for use with Model References\n   */\n  fetcher: ModelInstanceFetcher<OrmModelExtensions, OrmModelInstanceExtensions>\n}\n\n/**\n * The sort order.\n */\nexport enum SortOrder {\n  asc = 'asc',\n  dsc = 'dsc',\n}\n\n/**\n * The number of instances to receive back from a query.\n */\nexport type MaxMatchStatement = number\n\n/**\n * Defines how a sort should happen. Which column and what order.\n * @interface\n */\nexport type SortStatement = {\n  /**\n   * The property's key/name. Also could be a \"column\"\n   */\n  key: string\n  /**\n   * Ascending or Descending sort.\n   */\n  order: SortOrder\n}\n\n/**\n * Pagination can be anything.\n */\nexport type PaginationQuery = any\n\n/**\n * A query to a search function.\n * @interface\n */\nexport type OrmSearch = {\n  /**\n   * Optional: A number of max records to return.\n   */\n  take?: MaxMatchStatement\n  /**\n   * Optional: Sorting.\n   */\n  sort?: SortStatement\n  /**\n   * Optional: Pagination information\n   */\n  page?: PaginationQuery\n  /**\n   * Optional: Querying tokens.\n   */\n  query: readonly QueryTokens[]\n}\n\n/**\n * Statements that make up the meat of QueryTokens\n */\nexport type Query =\n  | PropertyQuery\n  | DatesAfterQuery\n  | DatesBeforeQuery\n  | StringPropertyQuery\n\n/**\n * A token type that links two queries together.\n */\nexport type BooleanQuery = 'AND' | 'OR'\n\n/**\n * A generic structure of querys.\n */\nexport type QueryTokens =\n  | readonly QueryTokens[][]\n  | readonly QueryTokens[]\n  | BooleanQuery\n  | Query\n\n/**\n * Builder functions that are not property related.\n * @interface\n */\ntype NonQueryBuilder = Readonly<{\n  /**\n   * Creates a pagination.\n   * @param value - Can be anything\n   */\n  pagination: (value: any) => BuilderV2Link & InnerBuilderV2\n  /**\n   * Creates a sort.\n   * @param key - The key to sort on\n   * @param sortOrder - The order to sort by. Defaults to ascending.\n   */\n  sort: (key: string, sortOrder?: SortOrder) => BuilderV2Link & InnerBuilderV2\n  /**\n   * Maximum number of elements to return.\n   * @param count - The count\n   */\n  take: (count: number) => BuilderV2Link & InnerBuilderV2\n  /**\n   * Compiles the builder into a search query.\n   */\n  compile: () => OrmSearch\n}>\n\n/**\n * An in between or ending type to a builder creating a SearchQuery\n * @interface\n */\nexport type BuilderV2Link = NonQueryBuilder &\n  Readonly<{\n    /**\n     * Links together two or more {@link Query} or complex queries.\n     */\n    and: () => QueryBuilder\n    /**\n     * Links together two or more {@link Query} or complex queries.\n     */\n    or: () => QueryBuilder\n  }>\n\n/**\n * A function that can either take a builder or raw QueryTokens[] and create a sub-query.\n * @param builder - Can be either a BuilderV2 or a hand written Query\n **/\nexport type SubBuilderFunction = (\n  builder: QueryBuilder\n) => Omit<OrmSearch, 'take' | 'sort' | 'page'> | (QueryBuilder | BuilderV2Link)\n\n/**\n * A search builder is a structured way to create a complex query.\n * @interface\n */\nexport type QueryBuilder = InnerBuilderV2 & NonQueryBuilder\n\n/**\n * A builder for version 3.0 search queries.\n * @interface\n */\nexport type InnerBuilderV2 = {\n  /**\n   * Creates a query that has nested property queries.\n   * @param subBuilderFunc - A function that can return a Builder\n   */\n  complex: (subBuilderFunc: SubBuilderFunction) => BuilderV2Link\n  /**\n   * Searches for elements that are after the given date.\n   * NOTE: It can be very important to set the valueType to either string or Date depending on what datastore you are using.\n   * @param key - The property name/key to use.\n   * @param jsDate - The date to search.\n   * @param options - Additional options.\n   */\n  datesAfter: (\n    key: string,\n    jsDate: Date | string,\n    options?: { valueType?: DatastoreValueType; equalToAndAfter?: boolean }\n  ) => BuilderV2Link\n  /**\n   * Searches for elements that are before the given date.\n   * NOTE: It can be very important to set the valueType to either string or Date depending on what datastore you are using.\n   * @param key - The property name/key to use.\n   * @param jsDate - The date to search.\n   * @param options - Additional options.\n   */\n  datesBefore: (\n    key: string,\n    jsDate: Date | string,\n    options?: { valueType?: DatastoreValueType; equalToAndBefore?: boolean }\n  ) => BuilderV2Link\n  /**\n   * Search a value\n   * @param key - The property name/key to use.\n   * @param value - The value to match.\n   * @param options - Additional options.\n   */\n  property: (\n    key: string,\n    value: any,\n    options?: Partial<PropertyOptions>\n  ) => BuilderV2Link\n}\n\n/**\n * The types of primary key properties.\n */\nexport type PrimaryKeyPropertyType =\n  | PropertyType.UniqueId\n  | PropertyType.Text\n  | PropertyType.Integer\n\n/**\n * A function that can generate a primary key for a model.\n * @param model - The model to generate a primary key for.\n * @returns A promise that resolves to the primary key.\n */\nexport type PrimaryKeyGenerator = <\n  TValue extends PrimaryKeyType,\n  TData extends DataDescription,\n>(\n  value: TValue,\n  modelData: CreateParams<TData>,\n  instance: ModelInstance<TData>\n) => Promise<PrimaryKeyType>\n\n/**\n * A property that represents a key in a database.\n * By default it is a \"uuid\" type, but if you want to use an arbitrary string, or an integer type you can set the `dataType` property.\n * @interface\n */\nexport type DatabaseKeyPropertyConfig<\n  TValue extends CanBeNullableType<PrimaryKeyType> = PrimaryKeyType,\n> = PropertyConfig<TValue> &\n  Readonly<{\n    /**\n     * Sets the type of the key.\n     * @default PrimaryKeyDataType.Uuid\n     */\n    dataType?: PrimaryKeyPropertyType\n    /**\n     * If true, the key will be automatically generated if not provided. Only applies to uuids and integers\n     * @default true\n     */\n    auto?: boolean\n    /**\n     * Optional: A custom primary key generator function to use for models. If the property type is UniqueId (default) then this will produce random UUID. If the property type is a number, a random number will be generated.\n     * If using a SQL-like database that uses numbers, its HIGHLY recommended to get a number from the database itself.\n     */\n    primaryKeyGenerator?: PrimaryKeyGenerator\n  }>\n"],
  "mappings": "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",
  "names": ["EqualitySymbol", "omit", "merge", "flow"]
}
