functional-models 3.9.5 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/errors.cjs +38 -0
- package/cjs/errors.cjs.map +7 -0
- package/cjs/index.cjs +2426 -0
- package/cjs/index.cjs.map +7 -0
- package/cjs/lib.cjs +431 -0
- package/cjs/lib.cjs.map +7 -0
- package/cjs/models.cjs +571 -0
- package/cjs/models.cjs.map +7 -0
- package/cjs/orm/index.cjs +1765 -0
- package/cjs/orm/index.cjs.map +7 -0
- package/cjs/orm/internal-libs.cjs +136 -0
- package/cjs/orm/internal-libs.cjs.map +7 -0
- package/cjs/orm/libs.cjs +88 -0
- package/cjs/orm/libs.cjs.map +7 -0
- package/cjs/orm/models.cjs +1027 -0
- package/cjs/orm/models.cjs.map +7 -0
- package/cjs/orm/properties.cjs +989 -0
- package/cjs/orm/properties.cjs.map +7 -0
- package/cjs/orm/query.cjs +376 -0
- package/cjs/orm/query.cjs.map +7 -0
- package/cjs/orm/types.cjs +59 -0
- package/cjs/orm/types.cjs.map +7 -0
- package/cjs/orm/validation.cjs +301 -0
- package/cjs/orm/validation.cjs.map +7 -0
- package/cjs/properties.cjs +998 -0
- package/cjs/properties.cjs.map +7 -0
- package/cjs/serialization.cjs +75 -0
- package/cjs/serialization.cjs.map +7 -0
- package/cjs/types.cjs +65 -0
- package/cjs/types.cjs.map +7 -0
- package/cjs/utils.cjs +187 -0
- package/cjs/utils.cjs.map +7 -0
- package/cjs/validation.cjs +431 -0
- package/cjs/validation.cjs.map +7 -0
- package/errors.js +3 -4
- package/errors.js.map +1 -1
- package/index.d.ts +13 -13
- package/index.js +13 -52
- package/index.js.map +1 -1
- package/lib.d.ts +5 -5
- package/lib.js +45 -65
- package/lib.js.map +1 -1
- package/models.d.ts +1 -1
- package/models.js +22 -30
- package/models.js.map +1 -1
- package/orm/index.d.ts +9 -9
- package/orm/index.js +9 -48
- package/orm/index.js.map +1 -1
- package/orm/internal-libs.js +7 -11
- package/orm/internal-libs.js.map +1 -1
- package/orm/libs.d.ts +1 -1
- package/orm/libs.js +8 -16
- package/orm/libs.js.map +1 -1
- package/orm/models.d.ts +2 -2
- package/orm/models.js +20 -26
- package/orm/models.js.map +1 -1
- package/orm/properties.d.ts +28 -28
- package/orm/properties.js +28 -36
- package/orm/properties.js.map +1 -1
- package/orm/query.d.ts +1 -1
- package/orm/query.js +31 -52
- package/orm/query.js.map +1 -1
- package/orm/types.d.ts +2 -2
- package/orm/types.js +7 -10
- package/orm/types.js.map +1 -1
- package/orm/validation.d.ts +2 -2
- package/orm/validation.js +5 -13
- package/orm/validation.js.map +1 -1
- package/package.json +50 -65
- package/properties.d.ts +133 -133
- package/properties.js +66 -94
- package/properties.js.map +1 -1
- package/serialization.d.ts +1 -1
- package/serialization.js +3 -9
- package/serialization.js.map +1 -1
- package/types.d.ts +6 -1
- package/types.js +4 -6
- package/types.js.map +1 -1
- package/utils.d.ts +2 -1
- package/utils.js +8 -23
- package/utils.js.map +1 -1
- package/validation.d.ts +1 -1
- package/validation.js +19 -50
- package/validation.js.map +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/orm/properties.ts", "../../../src/properties.ts", "../../../node_modules/uuid/dist-node/stringify.js", "../../../node_modules/uuid/dist-node/rng.js", "../../../node_modules/uuid/dist-node/v4.js", "../../../src/validation.ts", "../../../src/utils.ts", "../../../src/lib.ts", "../../../src/orm/validation.ts", "../../../src/orm/query.ts", "../../../src/orm/types.ts", "../../../src/orm/internal-libs.ts"],
|
|
4
|
+
"sourcesContent": ["import merge from 'lodash/merge.js'\nimport identity from 'lodash/identity.js'\nimport {\n PrimaryKeyType,\n DateValueType,\n PropertyConfig,\n Arrayable,\n DataValue,\n MaybeFunction,\n ModelType,\n DataDescription,\n ModelInstance,\n CreateParams,\n PropertyType,\n CanBeNullableType,\n} from '../types.js'\nimport {\n DatetimeProperty,\n IntegerProperty,\n TextProperty,\n UuidProperty,\n} from '../properties.js'\nimport { unique } from './validation.js'\nimport { OrmPropertyConfig, DatabaseKeyPropertyConfig } from './types.js'\nimport { getPrimaryKeyGenerator } from './internal-libs.js'\n\nconst _defaultPropertyConfig = {\n unique: undefined,\n}\n\n/**\n * A property that automatically updates whenever the model instance is saved.\n * @param config\n */\nexport const LastModifiedDateProperty = <\n T extends CanBeNullableType<DateValueType> = DateValueType,\n>(\n config: PropertyConfig<T> = {}\n) => {\n const additionalMetadata = { lastModifiedUpdateMethod: () => new Date() }\n return DatetimeProperty<T>(config, additionalMetadata)\n}\n\n/**\n * A property that represents a foreign key to another model 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 * NOTE: auto is ignored in config.\n * @param config - Additional configurations.\n */\nexport const ForeignKeyProperty = <\n TValue extends PrimaryKeyType,\n TModel extends DataDescription,\n>(\n model: MaybeFunction<ModelType<TModel>>,\n config: Omit<\n DatabaseKeyPropertyConfig<TValue>,\n 'auto' | 'primaryKeyGenerator'\n > = {}\n) => {\n const _getModel = () => {\n if (typeof model === 'function') {\n return model()\n }\n return model\n }\n\n const _getProperty = () => {\n if (config.dataType === PropertyType.UniqueId) {\n return UuidProperty(\n merge(config as DatabaseKeyPropertyConfig<string>, {\n autoNow: false,\n })\n )\n }\n if (config.dataType === PropertyType.Integer) {\n return IntegerProperty(config as DatabaseKeyPropertyConfig<number>)\n }\n return TextProperty(config as DatabaseKeyPropertyConfig<string>)\n }\n const property = _getProperty()\n return merge(property, {\n getReferencedId: (instanceValues: TValue) => {\n return instanceValues\n },\n getReferencedModel: _getModel,\n })\n}\n\n/**\n * A property that represents a primary 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 * Includes an optional primaryKeyGenerator function that can be used to generate a primary key. This can allow primary keys that are generated at runtime, or grabbed from a database.\n * @param config - Additional configurations.\n * @returns\n */\nexport const PrimaryKeyProperty = <\n TValue extends CanBeNullableType<PrimaryKeyType> = PrimaryKeyType,\n>(\n config: DatabaseKeyPropertyConfig<TValue> = {}\n) => {\n const _getProperty = () => {\n const auto = config.auto === undefined ? true : config.auto ? true : false\n const lazyLoadMethod = (\n value: TValue,\n modelData: CreateParams<any>,\n instance: ModelInstance<any>\n ) => {\n if (config.primaryKeyGenerator) {\n // @ts-ignore\n return config.primaryKeyGenerator(value, modelData, instance)\n }\n if (auto) {\n // @ts-ignore\n return getPrimaryKeyGenerator(config)(value, modelData, instance)\n }\n return value\n }\n\n if (config.dataType === PropertyType.UniqueId) {\n return UuidProperty(\n merge(config as DatabaseKeyPropertyConfig<string>, {\n autoNow: auto,\n lazyLoadMethod,\n })\n )\n }\n if (config.dataType === PropertyType.Integer) {\n return IntegerProperty(\n merge(config as DatabaseKeyPropertyConfig<number>, {\n lazyLoadMethod,\n })\n )\n }\n return TextProperty(\n merge(config as DatabaseKeyPropertyConfig<string>, {\n lazyLoadMethod,\n })\n )\n }\n return _getProperty()\n}\n\n/**\n * Creates an orm based property config.\n * @param config - Additional configurations.\n */\nexport const ormPropertyConfig = <T extends Arrayable<DataValue>>(\n config: OrmPropertyConfig<T> = _defaultPropertyConfig\n): PropertyConfig<T> => {\n return merge(config, {\n validators: [\n ...(config.validators ? config.validators : []),\n config.unique ? unique(config.unique) : null,\n ].filter(identity),\n })\n}\n", "import merge from 'lodash/merge.js'\nimport get from 'lodash/get.js'\nimport { v4 as uuidv4 } from 'uuid'\nimport { ZodType } from 'zod'\nimport {\n arrayType,\n createPropertyValidator,\n isType,\n isValidUuid,\n maxNumber,\n meetsRegex,\n minNumber,\n optionalValidator,\n referenceTypeMatch,\n} from './validation.js'\nimport { createHeadAndTail, memoizeAsync, memoizeSync } from './utils.js'\nimport {\n ModelReferenceType,\n ModelInstance,\n Maybe,\n PrimaryKeyType,\n ModelType,\n PropertyInstance,\n DataValue,\n PropertyConfig,\n ValueGetter,\n MaybeFunction,\n Arrayable,\n PropertyValidator,\n ModelReferencePropertyInstance,\n DataDescription,\n JsonAble,\n JsonifiedData,\n CalculateDenormalization,\n PropertyType,\n DateValueType,\n PrimitiveValueType,\n CanBeNullableType,\n} from './types.js'\nimport {\n getValueForModelInstance,\n getValueForReferencedModel,\n isReferencedProperty,\n getCommonTextValidators,\n getCommonNumberValidators,\n mergeValidators,\n isModelInstance,\n createZodForProperty,\n} from './lib.js'\n\nconst MAX_YEAR = 3000\nconst EMAIL_REGEX =\n /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/u\n\n/**\n * The base function that creates a fully loaded instance of a property. All standard issue properties use this function.\n * @param propertyType - The property's value type.\n * @param config - Configurations\n * @param additionalMetadata - Additional metadata that you want to add to a given property.\n * @typeParam TValue - The typescript value that the property produces.\n * @typeParam TData - The DataDescription that this property instance belongs to.\n * @typeParam TModelExtensions - Any additional model extensions\n * @typeParam TModelInstanceExtensions - Any additional model instance extensions\n */\nexport const Property = <\n TValue extends Arrayable<DataValue>,\n TData extends DataDescription = DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n>(\n propertyType: PropertyType | string,\n config: PropertyConfig<TValue> = {},\n additionalMetadata = {}\n): PropertyInstance<\n TValue,\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n> => {\n if (!propertyType && !config?.typeOverride) {\n throw new Error(`Property type must be provided.`)\n }\n if (config?.typeOverride) {\n propertyType = config.typeOverride\n }\n\n const getConstantValue = () =>\n (config?.value !== undefined ? config.value : undefined) as TValue\n\n const getDefaultValue = () =>\n (config?.defaultValue !== undefined\n ? config.defaultValue\n : undefined) as TValue\n\n const getChoices = () => config?.choices || []\n\n const lazyLoadMethod = config?.lazyLoadMethod || false\n\n const valueSelector = config?.valueSelector || (x => x)\n if (typeof valueSelector !== 'function') {\n throw new Error(`valueSelector must be a function`)\n }\n\n const createGetter = (\n instanceValue: TValue,\n modelData: TData,\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ): ValueGetter<TValue, TData, TModelExtensions, TModelInstanceExtensions> => {\n const constantValue = getConstantValue()\n if (constantValue !== undefined) {\n return () => constantValue\n }\n const defaultValue = getDefaultValue()\n if (\n defaultValue !== undefined &&\n (instanceValue === null || instanceValue === undefined)\n ) {\n return () => defaultValue\n }\n\n const method = lazyLoadMethod\n ? lazyLoadMethod\n : config.lazyLoadMethodAtomic\n ? memoizeAsync(config.lazyLoadMethodAtomic)\n : typeof instanceValue === 'function'\n ? (instanceValue as () => TValue)\n : () => instanceValue\n const valueGetter: ValueGetter<\n TValue,\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n > = memoizeSync(() => {\n // @ts-ignore\n const result: TValue | Promise<TValue> = method(\n instanceValue,\n modelData,\n // @ts-ignore\n instance\n )\n return valueSelector(result)\n })\n return valueGetter\n }\n\n const getValidator = (\n valueGetter: ValueGetter<\n TValue,\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => {\n const validator = createPropertyValidator(valueGetter, config)\n const _propertyValidatorWrapper: PropertyValidator<\n TData\n // eslint-disable-next-line functional/prefer-tacit\n > = async (model, instanceData, propertyConfiguration) => {\n return validator(model, instanceData, propertyConfiguration)\n }\n return _propertyValidatorWrapper\n }\n\n // Build a zod schema for this property. If a zod schema is provided in the\n // config it will be used as an override.\n const getZod = (): ZodType<TValue> => {\n const provided = (config as any)?.zod\n if (provided) {\n return provided as ZodType<TValue>\n }\n\n return createZodForProperty(propertyType, config)()\n }\n\n const propertyInstance: PropertyInstance<\n TValue,\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n > = {\n ...additionalMetadata,\n getConfig: () => config || {},\n getChoices,\n getDefaultValue,\n getConstantValue,\n getPropertyType: () => propertyType,\n createGetter,\n getZod,\n getValidator,\n }\n return propertyInstance\n}\n\n/**\n * Config object for a date property\n */\ntype DatePropertyConfig<T extends Arrayable<DataValue>> = {\n /**\n * A function that can format the date into a string.\n * Can use date-fns, moment, or any other function.\n * @param date - The date will be a date object\n * @param format - The format property passed in if provided.\n */\n formatFunction?: (date: Date, format?: string) => string\n /**\n * The format the date should be in. This is a framework agnostic format, and should be based on your format function.\n * NOTE: If a formatFunction is not provided, this is completely ignored. For dates YYYY-MM-DD is the default and for Datetimes it is ISOString()\n */\n format?: string\n} & PropertyConfig<T>\n\n/**\n * Determines if the value is a Date object.\n * @param value Any value\n */\nconst isDate = (value: any): value is Date => {\n if (value === null) {\n return false\n }\n return typeof value === 'object' && value.toISOString\n}\n\n/**\n * A Property for Dates. Supports both strings and Date objects.\n * This does NOT include time information.\n * @param config - A configuration that enables overriding of date formatting\n * @param additionalMetadata\n */\nexport const DateProperty = <\n T extends CanBeNullableType<DateValueType> = DateValueType,\n>(\n config: DatePropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Date,\n merge(\n {\n lazyLoadMethod: (value: Arrayable<DataValue>) => {\n if (isDate(value)) {\n if (config.formatFunction) {\n return config.formatFunction(value, config.format)\n }\n return value.toISOString().split('T')[0]\n }\n if (!value && config?.autoNow) {\n const date = new Date()\n if (config.formatFunction) {\n return config.formatFunction(date, config.format)\n }\n return date.toISOString().split('T')[0]\n }\n return value\n },\n },\n config\n ),\n additionalMetadata\n )\n\n/**\n * A property for Date AND Times. Supports both strings and Date Objects.\n * @param config - A configuration that enables overriding of date and time formatting\n * @param additionalMetadata\n */\nexport const DatetimeProperty = <\n T extends CanBeNullableType<DateValueType> = DateValueType,\n>(\n config: DatePropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Datetime,\n merge(\n {\n lazyLoadMethod: (value: Arrayable<DataValue>) => {\n if (isDate(value)) {\n if (config.formatFunction) {\n return config.formatFunction(value, config.format)\n }\n return value.toISOString()\n }\n if (!value && config?.autoNow) {\n const date = new Date()\n if (config.formatFunction) {\n return config.formatFunction(date, config.format)\n }\n return date.toISOString()\n }\n return value\n },\n },\n config\n ),\n additionalMetadata\n )\n\n/**\n * A property that has an array of sub values.\n * @param config\n * @param additionalMetadata\n */\nexport const ArrayProperty = <\n T extends CanBeNullableType<DataValue> = DataValue,\n>(\n config = {},\n additionalMetadata = {}\n) =>\n Property<readonly T[]>(\n PropertyType.Array,\n {\n defaultValue: [],\n ...config,\n isArray: true,\n },\n additionalMetadata\n )\n\n/**\n * A property that is an array, but only of a single value type. This is an {@link ArrayProperty} but with a validator for the type.\n * @param valueType - The type. (Only supports primitive data types, no objects)\n * @param config\n * @param additionalMetadata\n */\nexport const SingleTypeArrayProperty = <\n TValue extends Omit<PrimitiveValueType, 'object'>,\n>(\n valueType: TValue,\n config = {},\n additionalMetadata = {}\n) =>\n Property<readonly TValue[]>(\n PropertyType.Array,\n {\n defaultValue: [],\n ...config,\n isArray: true,\n validators: mergeValidators(\n config,\n // @ts-ignore\n arrayType(valueType)\n ),\n },\n additionalMetadata\n )\n\n/**\n * A property that has simple objects. These must be JSON compliant. These are validated.\n * @param config\n * @param additionalMetadata\n */\nexport const ObjectProperty = <\n TObject extends CanBeNullableType<\n Readonly<Record<string, JsonAble>>\n > = Readonly<Record<string, JsonAble>>,\n>(\n config = {},\n additionalMetadata = {}\n) =>\n Property<TObject>(\n PropertyType.Object,\n merge(config, {\n validators: mergeValidators(config, isType('object')),\n }),\n additionalMetadata\n )\n\n/**\n * A simple text property. If it's possible to put ALOT of text in this field consider using the {@link BigTextProperty}\n * @param config - Additional Configurations\n * @param additionalMetadata - Additional Metadata\n */\nexport const TextProperty = <T extends CanBeNullableType<string> = string>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Text,\n merge(config, {\n isString: true,\n // @ts-ignore\n validators: mergeValidators(config, ...getCommonTextValidators(config)),\n }),\n additionalMetadata\n )\n\n/**\n * A property for large blocks of strings.\n * @param config - Additional configurations\n * @param additionalMetadata - Additional metadata\n */\nexport const BigTextProperty = <T extends CanBeNullableType<string> = string>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.BigText,\n merge(config, {\n isString: true,\n validators: mergeValidators(\n config,\n ...getCommonTextValidators<T>(config)\n ),\n }),\n additionalMetadata\n )\n\n/**\n * A property that houses integers. No floats allowed.\n * @param config\n * @param additionalMetadata\n */\nexport const IntegerProperty = <T extends CanBeNullableType<number> = number>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Integer,\n merge(config, {\n isInteger: true,\n validators: mergeValidators(\n config,\n ...getCommonNumberValidators<T>(config)\n ),\n }),\n additionalMetadata\n )\n\n/**\n * An integer property that represents a year. NOTE: This is exclusively focused on a year in a modern context.\n * Validates from 0 to 3000\n * @param config\n * @param additionalMetadata\n */\nexport const YearProperty = <T extends CanBeNullableType<number> = number>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Integer,\n merge(config, {\n isInteger: true,\n validators: mergeValidators(\n config,\n ...getCommonNumberValidators(config),\n minNumber(0),\n maxNumber(MAX_YEAR)\n ),\n }),\n additionalMetadata\n )\n\n/**\n * A property for numbers. This could be integers or float values.\n * @param config\n * @param additionalMetadata\n */\nexport const NumberProperty = <T extends CanBeNullableType<number> = number>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Number,\n merge(config, {\n isNumber: true,\n validators: mergeValidators(config, ...getCommonNumberValidators(config)),\n }),\n additionalMetadata\n )\n\n/**\n * A property that has a fixed value that can never be changed. Can be useful for things like embedding the name of a model into JSONified objects.\n * @param valueType - The value type for this property.\n * @param value - The value to fix.\n * @param config\n * @param additionalMetadata\n */\nexport const ConstantValueProperty = <\n TDataValue extends CanBeNullableType<\n Arrayable<DataValue>\n > = Arrayable<DataValue>,\n>(\n valueType: PropertyType | string,\n value: TDataValue,\n config: PropertyConfig<TDataValue> = {},\n additionalMetadata = {}\n) =>\n Property<TDataValue>(\n valueType,\n merge(config, {\n value,\n }),\n additionalMetadata\n )\n\n/**\n * A property that encapsulates email addresses. Provides validation for making sure an email is valid.\n * @param config\n * @param additionalMetadata\n */\nexport const EmailProperty = <T extends CanBeNullableType<string> = string>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n TextProperty<T>(\n merge(config, {\n type: PropertyType.Email,\n validators: mergeValidators(config, meetsRegex(EMAIL_REGEX)),\n }),\n additionalMetadata\n )\n\n/**\n * A property that has a true or false value.\n * @param config\n * @param additionalMetadata\n */\nexport const BooleanProperty = <T extends CanBeNullableType<boolean> = boolean>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Boolean,\n merge(config, {\n isBoolean: true,\n }),\n additionalMetadata\n )\n\n/**\n * A property that is used for Primary Keys. If no value is provided a UUID is automatically created.\n * This property has required on it.\n * @param config - Additional configurations. NOTE: required is ALWAYS true.\n * @param additionalMetadata - Any additional metadata.\n */\nexport const PrimaryKeyUuidProperty = <\n T extends CanBeNullableType<string> = string,\n>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.UniqueId,\n merge(config, {\n required: true,\n isString: true,\n validators: mergeValidators(config, isValidUuid),\n lazyLoadMethod: (value: Arrayable<DataValue>) => {\n if (!value) {\n return uuidv4()\n }\n return value\n },\n }),\n additionalMetadata\n )\n\n/**\n * A property that has a uuid.\n * This property has required on it.\n * If you want it to automatically create a uuid add { autoNow: true } to the config.\n * @param config - Additional configurations.\n * @param additionalMetadata - Any additional metadata.\n */\nexport const UuidProperty = <T extends CanBeNullableType<string> = string>(\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.UniqueId,\n merge(config, {\n isString: true,\n validators: mergeValidators(\n config,\n config.required ? isValidUuid : optionalValidator(isValidUuid)\n ),\n lazyLoadMethod: (value: Arrayable<DataValue>) => {\n if (!value) {\n if (config.autoNow) {\n return uuidv4()\n }\n }\n return value\n },\n }),\n additionalMetadata\n )\n\n/**\n * A property that has a reference to another model instance. A \"Foreign Key\" if you will.\n * For full functionality a {@link ModelInstanceFetcher} must be provided in the config.\n * This property has complex functionalities.\n *\n * When a model calls \"instance.get.whatever()\" to get the value of a ModelReferenceProperty, it uses the model fetcher\n * to retrieve the model. (Could be saved elsewhere, or a database). When the promise is awaited, the value returned\n * is a ModelInstance object.\n *\n * However, when `toObj()` is called on that same instance, only the primary key value is returned. This is so that\n * when you call `toObj()` on the main instance, the \"foreign key\" gets filled in.\n *\n * This is useful for a save function with an ORM.\n * @param model - Either the model itself or a function that creates the model when needed (lazy).\n * @param config\n * @param additionalMetadata\n */\nexport const ModelReferenceProperty = <T extends DataDescription>(\n model: MaybeFunction<ModelType<T>>,\n config: PropertyConfig<ModelReferenceType<T>> = {},\n additionalMetadata = {}\n) => AdvancedModelReferenceProperty<T>(model, config, additionalMetadata)\n\n/**\n * The full implementation of a ModelReference, useful for typing certain extended functionalities.\n * For a full description see {@link ModelReferenceProperty}\n * @param model - A model or a function that returns the model.\n * @param config\n * @param additionalMetadata\n */\nexport const AdvancedModelReferenceProperty = <\n T extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n>(\n model: MaybeFunction<\n ModelType<T, TModelExtensions, TModelInstanceExtensions>\n >,\n config: PropertyConfig<\n ModelReferenceType<T, TModelExtensions, TModelInstanceExtensions>\n > = {},\n additionalMetadata = {}\n) => {\n if (!model) {\n throw new Error('Must include the referenced model')\n }\n\n const _getModel = () => {\n if (typeof model === 'function') {\n return model()\n }\n return model\n }\n\n // @ts-ignore\n const validator = referenceTypeMatch(model)\n const validators = mergeValidators(config, validator)\n\n const _getId =\n (\n instanceValues: ModelReferenceType<\n T,\n ModelType<T, TModelExtensions, TModelInstanceExtensions>\n >\n ) =>\n (): Maybe<PrimaryKeyType> => {\n if (!instanceValues) {\n return undefined\n }\n if (typeof instanceValues === 'number') {\n return instanceValues\n }\n if (typeof instanceValues === 'string') {\n return instanceValues\n }\n if (\n (\n instanceValues as ModelInstance<\n T,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ).getPrimaryKey\n ) {\n return (\n instanceValues as ModelInstance<\n T,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ).getPrimaryKey()\n }\n\n const theModel = _getModel()\n const primaryKey = theModel.getModelDefinition().primaryKeyName\n\n // @ts-ignore\n return (instanceValues as JsonifiedData<T>)[primaryKey] as PrimaryKeyType\n }\n\n const lazyLoadMethodAtomic = async (\n instanceValues: ModelReferenceType<\n T,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => {\n const valueIsModelInstance = isModelInstance(instanceValues)\n\n const _getInstanceReturn = (objToUse: ModelReferenceType<T>) => {\n // We need to determine if the object we just got is an actual model instance to determine if we need to make one.\n const objIsModelInstance = isModelInstance(objToUse)\n const instance = objIsModelInstance\n ? objToUse\n : // @ts-ignore\n _getModel().create(objToUse as JsonifiedData<T>)\n // We are replacing the toObj function, because the reference type in the end should be the primary key when serialized.\n return merge({}, instance, {\n toObj: memoizeAsync(_getId(instanceValues)),\n })\n }\n\n // @ts-ignore\n if (valueIsModelInstance) {\n return _getInstanceReturn(instanceValues)\n }\n\n // TypedJson?\n const theModel = _getModel()\n const primaryKey = theModel.getModelDefinition().primaryKeyName\n if (get(instanceValues, primaryKey)) {\n return _getInstanceReturn(instanceValues)\n }\n\n if (config?.fetcher) {\n const id = await _getId(instanceValues)()\n const model = _getModel()\n if (id !== null && id !== undefined) {\n const obj = await config.fetcher(model, id)\n return _getInstanceReturn(obj as ModelReferenceType<T>)\n }\n return null\n }\n return _getId(instanceValues)()\n }\n\n const p: ModelReferencePropertyInstance<\n T,\n ModelReferenceType<T, TModelExtensions, TModelInstanceExtensions>,\n TModelExtensions,\n TModelInstanceExtensions\n > = merge(\n Property<ModelReferenceType<T, TModelExtensions, TModelInstanceExtensions>>(\n PropertyType.ModelReference,\n merge({}, config, {\n validators,\n lazyLoadMethodAtomic,\n }),\n additionalMetadata\n ),\n {\n getReferencedId: (\n instanceValues: ModelReferenceType<\n T,\n ModelType<T, TModelExtensions, TModelInstanceExtensions>\n >\n ) => _getId(instanceValues)(),\n getReferencedModel: _getModel,\n }\n )\n return p\n}\n\n/**\n * A property for Denormalizing. This represents a complex value that has been simplified for ease of use.\n * One common use is for creating \"Display Values\" in a GUI. This process can be extremely expensive, such as having to\n * get selected values 2 or 3 Foreign Keys deep.\n *\n * This property allows passing in a calculate function that will only be executed once, and only if there is no value, and then only when asked.\n *\n * To recalculate the value, you need to run the calculate function on the property itself, passing in new model data.\n * @param propertyType - A property type.\n * @param calculate - A function for calculating the denormalized value.\n * @param config - A Config\n * @param additionalMetadata _ Any additional metadata.\n */\nexport const DenormalizedProperty = <\n TValue extends CanBeNullableType<DataValue>,\n T extends DataDescription,\n>(\n propertyType: string,\n calculate: CalculateDenormalization<TValue, T>,\n config: PropertyConfig<TValue> = {},\n additionalMetadata = {}\n) => {\n const property = Property<TValue>(\n propertyType,\n merge(config, {\n isDenormalized: true,\n lazyLoadMethodAtomic: async (\n value: string | undefined,\n modelData: T,\n modelInstance: ModelInstance<T, any>\n ) => {\n if (value !== undefined) {\n return value\n }\n return calculate(modelData, modelInstance)\n },\n }),\n additionalMetadata\n )\n return merge(property, {\n calculate,\n })\n}\n\n/**\n * A Denormalized Property that is for text.\n * @param calculate - A function that can get a string\n * @param config - Any configs\n * @param additionalMetadata - Optional Metadata\n */\nexport const DenormalizedTextProperty = <\n T extends DataDescription,\n TData extends CanBeNullableType<string> = string,\n>(\n calculate: CalculateDenormalization<TData, T>,\n config: PropertyConfig<TData> = {},\n additionalMetadata = {}\n) =>\n DenormalizedProperty<TData, T>(\n PropertyType.Text,\n calculate,\n merge(config, {\n isString: true,\n validators: mergeValidators<TData>(\n config,\n ...getCommonTextValidators<TData>(config)\n ),\n }),\n additionalMetadata\n )\n\n/**\n * A Denormalized Property that is for numbers.\n * @param calculate - A function that can get a string\n * @param config - Any configs\n * @param additionalMetadata - Optional Metadata\n */\nexport const DenormalizedNumberProperty = <\n T extends DataDescription,\n TData extends CanBeNullableType<number> = number,\n>(\n calculate: CalculateDenormalization<TData, T>,\n config: PropertyConfig<TData> = {},\n additionalMetadata = {}\n) =>\n DenormalizedProperty<TData, T>(\n PropertyType.Number,\n calculate,\n merge(config, {\n isNumber: true,\n validators: mergeValidators(config, ...getCommonNumberValidators(config)),\n }),\n additionalMetadata\n )\n\n/**\n * A Denormalized Property that is for integers.\n * @param calculate - A function that can get a string\n * @param config - Any configs\n * @param additionalMetadata - Optional Metadata\n */\nexport const DenormalizedIntegerProperty = <\n T extends DataDescription,\n TData extends CanBeNullableType<number> = number,\n>(\n calculate: CalculateDenormalization<TData, T>,\n config: PropertyConfig<TData> = {},\n additionalMetadata = {}\n) =>\n DenormalizedProperty<TData, T>(\n PropertyType.Integer,\n calculate,\n merge(config, {\n isInteger: true,\n validators: mergeValidators(config, ...getCommonNumberValidators(config)),\n }),\n additionalMetadata\n )\n\n/**\n * An id that is naturally formed by other properties within a model.\n * Instead of having a \"globally unique\" id the model is unique because the composition of values of properties.\n * @param propertyKeys A list (in order) of property keys needed to make the id. These keys can take nested paths\n * if a property is an object, array, or even a model instance object. Example: 'nested.path.here'.\n * Note: If ANY of the properties are undefined, the key becomes undefined. This is to ensure key structure integrity.\n * Additionally, if the property key points to a referenced model 1 of 2 things will happen.\n * 1. If the key is not nested (Example: model.myReferenceObj) then the key to the referenced model will be used.\n * 2. If the key IS nested (Example: model.myReferenceObj.name) then the instance will be retrieved and then the\n * property for that model instance is used.\n * @param joiner A string that will be passed to \".join()\" for creating a single string.\n * @param config\n * @param additionalMetadata\n */\nexport const NaturalIdProperty = <T extends CanBeNullableType<string> = string>(\n propertyKeys: readonly string[],\n joiner: string,\n config: PropertyConfig<T> = {},\n additionalMetadata = {}\n) =>\n Property<T>(\n PropertyType.Text,\n merge(config, {\n isString: true,\n validators: mergeValidators(config, ...getCommonTextValidators(config)),\n lazyLoadMethodAtomic: async (\n value: string | undefined,\n model: DataDescription,\n modelInstance: ModelInstance<any>\n ) => {\n const data = await propertyKeys.reduce(async (accP, key) => {\n const acc = await accP\n const [head] = createHeadAndTail(key.split('.'), '.')\n const value = await (isReferencedProperty(modelInstance, head)\n ? getValueForReferencedModel(modelInstance, key)\n : getValueForModelInstance(modelInstance, key))\n return acc.concat(value)\n }, Promise.resolve([]))\n // If any of these values are not set, we do not want to have a value at all.\n if (data.some(value => value === undefined)) {\n return undefined\n }\n return data.join(joiner)\n },\n }),\n additionalMetadata\n )\n", "import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "const rnds8 = new Uint8Array(16);\nexport default function rng() {\n return crypto.getRandomValues(rnds8);\n}\n", "import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (!buf && !options && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n", "import isEmpty from 'lodash/isEmpty.js'\nimport merge from 'lodash/merge.js'\nimport flatMap from 'lodash/flatMap.js'\nimport get from 'lodash/get.js'\nimport {\n DataDescription,\n ModelInstance,\n ModelType,\n ModelValidatorComponent,\n PropertyValidatorComponent,\n PropertyValidatorComponentSync,\n PropertyValidator,\n PropertyConfig,\n PropertyValidators,\n ValueGetter,\n Arrayable,\n DataValue,\n ModelErrors,\n ValidatorContext,\n ValuePropertyValidatorComponent,\n ValidationErrors,\n MaybeFunction,\n PropertyValidatorComponentTypeAdvanced,\n PrimitiveValueType,\n ToObjectResult,\n} from './types.js'\nimport { flowFindFirst } from './utils.js'\n\nconst multiValidator = <T extends Arrayable<DataValue>>(\n validators: ValuePropertyValidatorComponent<T>[]\n): ValuePropertyValidatorComponent<T> => {\n const flow = flowFindFirst<T, string>(\n validators as ((t: T) => undefined | string)[]\n )\n return flow as ValuePropertyValidatorComponent<T>\n}\n\nconst filterEmpty = <T>(\n array: readonly (T | undefined | null)[]\n): readonly T[] => {\n return array.filter(x => x) as readonly T[]\n}\n\nconst _trueOrError =\n <T extends Arrayable<DataValue>>(\n method: (t: T) => boolean,\n error: string\n ): ValuePropertyValidatorComponent<T> =>\n (value: T) => {\n if (method(value) === false) {\n return error\n }\n return undefined\n }\n\nconst _typeOrError =\n <T extends Arrayable<DataValue>>(\n type: string,\n errorMessage: string\n ): ValuePropertyValidatorComponent<T> =>\n (value: T) => {\n if (typeof value !== type) {\n return errorMessage\n }\n return undefined\n }\n\nconst isType =\n <T extends Arrayable<DataValue>>(\n type: string\n ): ValuePropertyValidatorComponent<T> =>\n (value: T) => {\n // @ts-ignore\n return _typeOrError(type, `Must be a ${type}`)(value)\n }\nconst isNumber = isType<number>('number')\nconst isInteger = _trueOrError<number>(Number.isInteger, 'Must be an integer')\n\nconst isObject = multiValidator<object>([\n isType<object>('object'),\n x => (Array.isArray(x) ? 'Must be an object, but got an array' : undefined),\n])\nconst isBoolean = isType<boolean>('boolean')\nconst isString = isType<string>('string')\nconst isArray = _trueOrError<readonly DataValue[]>(\n (v: any) => Array.isArray(v),\n 'Value is not an array'\n)\n\nconst PRIMITIVE_TO_SPECIAL_TYPE_VALIDATOR: Record<\n PrimitiveValueType,\n ValuePropertyValidatorComponent<any>\n> = {\n [PrimitiveValueType.boolean]: isBoolean,\n [PrimitiveValueType.string]: isString,\n [PrimitiveValueType.integer]: isInteger,\n [PrimitiveValueType.number]: isNumber,\n [PrimitiveValueType.object]: isObject,\n}\n\nconst arrayType =\n <TValue extends DataValue>(\n type: PrimitiveValueType\n ): ValuePropertyValidatorComponent<readonly TValue[]> =>\n (value: readonly TValue[]) => {\n const arrayError = isArray(value)\n if (arrayError) {\n return arrayError\n }\n const validator = PRIMITIVE_TO_SPECIAL_TYPE_VALIDATOR[type] || isType(type)\n return (value as readonly []).reduce(\n (acc: string | undefined, v: DataValue) => {\n if (acc) {\n return acc\n }\n\n return validator(v)\n },\n undefined\n )\n }\n\nconst meetsRegex =\n <TValue extends DataValue>(\n regex: string | RegExp,\n flags?: string,\n errorMessage = 'Format was invalid'\n ): ValuePropertyValidatorComponent<TValue> =>\n (value: TValue) => {\n const reg = new RegExp(regex, flags)\n // @ts-ignore\n return _trueOrError((v: string) => reg.test(v), errorMessage)(value)\n }\n\nconst choices =\n <T extends DataValue>(\n choiceArray: readonly T[]\n ): ValuePropertyValidatorComponent<T> =>\n (value: T | readonly T[]) => {\n if (Array.isArray(value)) {\n const bad = value.find(v => !choiceArray.includes(v))\n if (bad) {\n return `${bad} is not a valid choice`\n }\n } else {\n if (!choiceArray.includes(value as T)) {\n return `${value} is not a valid choice`\n }\n }\n return undefined\n }\n\nconst isDate: ValuePropertyValidatorComponent<Date> = (value: Date) => {\n if (!value) {\n return 'Date value is empty'\n }\n if (!value.toISOString) {\n return 'Value is not a date'\n }\n return undefined\n}\n\nconst isRequired: ValuePropertyValidatorComponent<any> = (value?: any) => {\n if (value === true || value === false) {\n return undefined\n }\n // @ts-ignore\n if (isNumber(value) === undefined) {\n return undefined\n }\n const empty = isEmpty(value)\n if (empty) {\n // @ts-ignore\n if (isDate(value)) {\n return 'A value is required'\n }\n }\n return undefined\n}\n\nconst maxNumber =\n (max: number): ValuePropertyValidatorComponent<number> =>\n (value: number) => {\n // @ts-ignore\n const numberError = isNumber(value)\n if (numberError) {\n return numberError\n }\n if (value && value > max) {\n return `The maximum is ${max}`\n }\n return undefined\n }\n\nconst minNumber =\n (min: number): ValuePropertyValidatorComponent<number> =>\n (value: number) => {\n // @ts-ignore\n const numberError = isNumber(value)\n if (numberError) {\n return numberError\n }\n if (value && value < min) {\n return `The minimum is ${min}`\n }\n return undefined\n }\n\nconst maxTextLength =\n (max: number): ValuePropertyValidatorComponent<string> =>\n (value: string) => {\n // @ts-ignore\n const stringError = isString(value)\n if (stringError) {\n return stringError\n }\n if (value && value.length > max) {\n return `The maximum length is ${max}`\n }\n return undefined\n }\n\nconst minTextLength =\n (min: number): ValuePropertyValidatorComponent<string> =>\n (value: string) => {\n // @ts-ignore\n const stringError = isString(value)\n if (stringError) {\n return stringError\n }\n if (value && value.length < min) {\n return `The minimum length is ${min}`\n }\n return undefined\n }\n\nconst aggregateValidator = <T extends DataDescription>(\n value: any,\n methodOrMethods:\n | PropertyValidatorComponent<T>\n | readonly PropertyValidatorComponent<T>[]\n): PropertyValidator<T> => {\n const toDo = Array.isArray(methodOrMethods)\n ? methodOrMethods\n : [methodOrMethods]\n\n const _aggregativeValidator: PropertyValidator<T> = async (\n model: ModelType<T>,\n instanceData: ToObjectResult<T>,\n propertyConfiguration: ValidatorContext\n ) => {\n const values = await Promise.all(\n toDo.map(method => {\n return method(value, model, instanceData, propertyConfiguration)\n })\n )\n return filterEmpty(values)\n }\n return _aggregativeValidator\n}\n\nconst emptyValidator = () => undefined\n\nconst _boolChoice =\n <T extends DataDescription>(\n method: (configValue: any) => PropertyValidatorComponentSync<T>\n ) =>\n (configValue: any) => {\n const func = method(configValue)\n const validatorWrapper: PropertyValidatorComponentSync<T> = func\n return validatorWrapper\n }\n\ntype MethodConfigDict<T extends DataDescription> = Readonly<{\n [s: string]: (config: any) => PropertyValidatorComponentSync<T>\n}>\n\nconst simpleFuncWrap =\n <T extends DataDescription>(validator: PropertyValidatorComponentSync<T>) =>\n () => {\n return validator\n }\n\nconst includeOrDont =\n <T extends DataDescription>(\n method: () => PropertyValidatorComponentSync<T>\n ) =>\n (configValue: any) => {\n if (configValue === false) {\n return emptyValidator\n }\n const func = method()\n const validatorWrapper: PropertyValidatorComponentSync<T> = func\n return validatorWrapper\n }\n\nconst CONFIG_TO_VALIDATE_METHOD = <\n T extends DataDescription,\n>(): MethodConfigDict<T> => ({\n required: includeOrDont(simpleFuncWrap(isRequired)),\n isInteger: _boolChoice<T>(simpleFuncWrap(isInteger)),\n isNumber: _boolChoice<T>(simpleFuncWrap(isNumber)),\n isString: _boolChoice<T>(simpleFuncWrap(isString)),\n isArray: _boolChoice<T>(simpleFuncWrap(isArray)),\n isBoolean: _boolChoice<T>(simpleFuncWrap(isBoolean)),\n choices: _boolChoice<T>(choices),\n})\n\nconst createPropertyValidator = <\n TValue extends Arrayable<DataValue>,\n T extends DataDescription = DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n>(\n valueGetter: ValueGetter<\n TValue,\n T,\n TModelExtensions,\n TModelInstanceExtensions\n >,\n config: PropertyConfig<TValue>\n): PropertyValidator<T> => {\n const _propertyValidator = async (\n model: ModelType<T>,\n instanceData: ToObjectResult<T>,\n propertyConfiguration: ValidatorContext\n ): Promise<ValidationErrors> => {\n return Promise.resolve().then(async () => {\n const configToValidateMethod = CONFIG_TO_VALIDATE_METHOD<T>()\n if (!config) {\n config = {}\n }\n const validators: readonly PropertyValidatorComponent<T>[] = [\n ...Object.entries(config).map(([key, value]) => {\n const method = configToValidateMethod[key]\n if (method) {\n return method(value)\n }\n return emptyValidator\n }),\n ...(config.validators ? config.validators : []),\n ].filter(x => x) as PropertyValidatorComponent<T>[]\n const value = await valueGetter()\n const isRequiredValue = config.required\n ? true\n : validators.includes(isRequired)\n if (!value && !isRequiredValue) {\n return []\n }\n const validator = aggregateValidator(value, validators)\n const errors = await validator(model, instanceData, propertyConfiguration)\n return [...new Set(flatMap(errors))]\n })\n }\n return _propertyValidator\n}\n\nconst createModelValidator = <\n T extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n>(\n validators: PropertyValidators<T>,\n modelValidators?: readonly ModelValidatorComponent<\n T,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n) => {\n const _modelValidator = async (\n instance: ModelInstance<T, TModelExtensions, TModelInstanceExtensions>,\n propertyConfiguration: ValidatorContext\n ): Promise<ModelErrors<T> | undefined> => {\n return Promise.resolve().then(async () => {\n if (!instance) {\n throw new Error(`Instance cannot be empty`)\n }\n const model = instance.getModel()\n const keysAndFunctions = Object.entries(validators)\n const instanceData = await instance.toObj<T>()\n const propertyValidationErrors = await Promise.all(\n keysAndFunctions.map(async ([key, validator]) => {\n return [\n key,\n await validator(model, instanceData, propertyConfiguration),\n ]\n })\n )\n const modelValidationErrors = (\n await Promise.all(\n modelValidators\n ? modelValidators.map(validator => {\n return validator(model, instanceData, propertyConfiguration)\n })\n : []\n )\n ).filter(x => x) as readonly string[]\n const propertyErrors = propertyValidationErrors\n .filter(([, errors]) => Boolean(errors) && errors.length > 0)\n .reduce((acc, [key, errors]) => {\n return merge(acc, { [String(key)]: errors })\n }, {} as ModelErrors<T>)\n const final =\n modelValidationErrors.length > 0\n ? merge(propertyErrors, { overall: modelValidationErrors })\n : propertyErrors\n if (isEmpty(final)) {\n return undefined\n }\n return final\n })\n }\n return _modelValidator\n}\n\nconst isValid = <T extends DataDescription>(errors: ModelErrors<T>) => {\n return Object.keys(errors).length < 1\n}\n\nconst referenceTypeMatch = (\n referencedModel: MaybeFunction<ModelType<any>>\n): PropertyValidatorComponentTypeAdvanced<\n ModelInstance<any, any, any>,\n any\n> => {\n return (value?: ModelInstance<any, any, any>) => {\n const theType = typeof value\n switch (theType) {\n case 'string':\n case 'number':\n case 'undefined':\n return undefined\n default:\n break\n }\n if (value === null) {\n return undefined\n }\n // This needs to stay here, as it delays the creation long enough for\n // self referencing types.\n const model =\n typeof referencedModel === 'function'\n ? referencedModel()\n : referencedModel\n // Assumption: By the time this is received, value === a model instance.\n const eModel = model.getName()\n const aModel = value.getModel().getName()\n if (eModel !== aModel) {\n return `Model should be ${eModel} instead, received ${aModel}`\n }\n return undefined\n }\n}\n\n/**\n * A validator that can validate an entire object.\n *\n * @param required - If this object is required.\n * @param keyToValidators - An object that has a dotted path key to the property to validate, and one or more validators for it.\n */\nconst objectValidator = <T extends object>({\n required,\n keyToValidators,\n}: {\n required?: boolean\n keyToValidators: Record<\n string,\n | ValuePropertyValidatorComponent<any>\n | ValuePropertyValidatorComponent<any>[]\n >\n}): ValuePropertyValidatorComponent<T> => {\n return (obj: T) => {\n if (!obj) {\n if (required) {\n return 'Must include a value'\n }\n return undefined\n }\n const isNotObj = isObject(obj)\n if (isNotObj) {\n return isNotObj\n }\n return (\n Object.entries(keyToValidators)\n .reduce((acc, [key, validator]) => {\n const theValidator = Array.isArray(validator)\n ? multiValidator(validator)\n : (validator as ValuePropertyValidatorComponent<any>)\n const value = get(obj, key)\n const error = theValidator(value)\n if (error) {\n return acc.concat(`${key}: ${error}`)\n }\n return acc\n }, [] as string[])\n .join(', ') || undefined\n )\n }\n}\n\nconst optionalValidator = <T extends Arrayable<DataValue>>(\n validator: ValuePropertyValidatorComponent<T>\n): ValuePropertyValidatorComponent<T> => {\n return (v: T | undefined): string | undefined => {\n if (v === undefined || v === null) {\n return undefined\n }\n return validator(v)\n }\n}\n\nconst UUID_VALIDATOR =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/iu\n\nconst isValidUuid: ValuePropertyValidatorComponent<string> = (uuid: string) => {\n const stringError = isString(uuid)\n if (stringError) {\n return stringError\n }\n return meetsRegex<string>(UUID_VALIDATOR, 'g', 'Invalid UUID format')(uuid)\n}\n\nexport {\n isNumber,\n isBoolean,\n isString,\n isInteger,\n isType,\n isDate,\n isArray,\n isRequired,\n maxNumber,\n minNumber,\n choices,\n maxTextLength,\n minTextLength,\n meetsRegex,\n aggregateValidator,\n emptyValidator,\n createPropertyValidator,\n createModelValidator,\n arrayType,\n isValid,\n referenceTypeMatch,\n multiValidator,\n isObject,\n objectValidator,\n optionalValidator,\n isValidUuid,\n}\n", "import AsyncLock from 'async-lock'\nimport { v4 as uuidv4 } from 'uuid'\n// @ts-ignore\nimport getRandomValuesFunc from 'get-random-values'\n\nconst getRandomValues = (): Uint8Array => {\n const array = new Uint8Array(1)\n if (typeof window !== 'undefined') {\n if (window.crypto) {\n return window.crypto.getRandomValues(array)\n }\n // @ts-ignore\n if (window.msCrypto) {\n // @ts-ignore\n return window.msCrypto.getRandomValues(array)\n }\n }\n\n return getRandomValuesFunc(array)\n}\n\nconst toTitleCase = (string: string) => {\n return `${string.slice(0, 1).toUpperCase()}${string.slice(1)}`\n}\n\nconst loweredTitleCase = (string: string) => {\n return `${string.slice(0, 1).toLowerCase()}${string.slice(1)}`\n}\n\nconst isPromise = <T>(something: any): something is Promise<T> => {\n if (something?.then) {\n return true\n }\n return false\n}\n\nenum PluralEndings {\n ves = 'fe',\n ies = 'y',\n i = 'us',\n zes = 'ze',\n ses = 's',\n es = 'e',\n s = '',\n}\nconst _singularizingRe = new RegExp(\n `(${Object.keys(PluralEndings).join('|')})$`,\n 'u'\n)\n\nconst singularize = (word: string) => {\n // @ts-ignore\n return word.replace(_singularizingRe, r => PluralEndings[r])\n}\n\nconst createHeadAndTail = (values: readonly string[], joiner: string) => {\n const head = values[0]\n const tail = values.slice(1).join(joiner)\n return [head, tail]\n}\n\nconst flowFindFirst =\n <T, TResult>(funcs: ((t: T) => undefined | TResult)[]) =>\n (input: T) => {\n return funcs.reduce((acc: undefined | TResult, func) => {\n if (acc) {\n return acc\n }\n return func(input)\n }, undefined) as string | TResult\n }\n\nconst memoizeSync = <T, A extends Array<any>>(method: (...args: A) => T) => {\n /* eslint-disable functional/no-let */\n let value: any = undefined\n let called = false\n return (...args: A): T => {\n if (!called) {\n called = true\n value = method(...args)\n }\n\n return value\n }\n /* eslint-enable functional/no-let */\n}\n\nconst memoizeAsync = <T, A extends Array<any>>(method: (...args: A) => T) => {\n const key = uuidv4()\n const lock = new AsyncLock()\n /* eslint-disable functional/no-let */\n let value: any = undefined\n let called = false\n return async (...args: A): Promise<T> => {\n return lock.acquire(key, async () => {\n if (!called) {\n called = true\n value = await method(...args)\n }\n\n return value\n })\n }\n /* eslint-enable functional/no-let */\n}\n\nconst createUuid = uuidv4\n\nexport {\n getRandomValues,\n loweredTitleCase,\n toTitleCase,\n isPromise,\n createHeadAndTail,\n singularize,\n flowFindFirst,\n memoizeSync,\n memoizeAsync,\n createUuid,\n}\n", "import { OpenAPIV3 } from 'openapi-types'\nimport kebabCase from 'lodash/kebabCase.js'\nimport flow from 'lodash/flow.js'\nimport merge from 'lodash/merge.js'\nimport get from 'lodash/get.js'\nimport { z, ZodType } from 'zod'\nimport {\n ApiInfo,\n ApiInfoPartialRest,\n ApiMethod,\n Arrayable,\n DataDescription,\n DataValue,\n ModelInstance,\n PrimaryKeyType,\n PropertyConfig,\n CanBeNullableType,\n PropertyValidatorComponent,\n PropertyValidatorComponentTypeAdvanced,\n RestInfo,\n RestInfoMinimum,\n} from './types.js'\nimport { createHeadAndTail } from './utils.js'\nimport {\n emptyValidator,\n maxNumber,\n maxTextLength,\n minNumber,\n minTextLength,\n} from './validation.js'\nimport HttpMethods = OpenAPIV3.HttpMethods\n\nconst NULL_ENDPOINT = 'NULL'\nconst NULL_METHOD = HttpMethods.HEAD\nconst ID_KEY = ':id'\n\nconst getValueForReferencedModel = async (\n modelInstance: ModelInstance<any>,\n path: string\n): Promise<PrimaryKeyType | any> => {\n const [head, tail] = createHeadAndTail(path.split('.'), '.')\n // If there are no nested keys, just return the reference id.\n if (!tail) {\n return modelInstance.getReferences()[head]()\n }\n const modelReference = await modelInstance.get[head]()\n if (modelReference.toObj) {\n const [nestedHead, nestedTail] = createHeadAndTail(tail.split('.'), '.')\n const value = await modelReference.get[nestedHead]()\n if (nestedTail) {\n return get(value, nestedTail)\n }\n return value\n }\n return get(modelReference, tail)\n}\n\nconst getValueForModelInstance = async (\n modelInstance: ModelInstance<any>,\n path: string\n): Promise<PrimaryKeyType | any> => {\n const [head, tail] = createHeadAndTail(path.split('.'), '.')\n const value = await modelInstance.get[head]()\n return tail ? get(value, tail) : value\n}\n\nconst isReferencedProperty = (\n modelInstance: ModelInstance<any>,\n key: string\n) => {\n return modelInstance.getReferences()[key]\n}\n\nconst getCommonTextValidators = <T extends CanBeNullableType<string> = string>(\n config: PropertyConfig<T>\n): readonly PropertyValidatorComponent<any>[] => {\n return [\n getValidatorFromConfigElseEmpty(config?.maxLength, maxTextLength),\n getValidatorFromConfigElseEmpty(config?.minLength, minTextLength),\n ]\n}\n\nconst getValidatorFromConfigElseEmpty = <\n T extends DataDescription,\n TValue extends DataValue,\n>(\n input: TValue | undefined,\n\n validatorGetter: (t: TValue) => PropertyValidatorComponent<T>\n): PropertyValidatorComponent<T> => {\n if (input !== undefined) {\n const validator = validatorGetter(input)\n return validator\n }\n return emptyValidator\n}\n\nconst getCommonNumberValidators = <\n T extends CanBeNullableType<number> = number,\n>(\n config: PropertyConfig<T>\n): readonly PropertyValidatorComponent<any>[] => {\n return [\n getValidatorFromConfigElseEmpty(config?.minValue, minNumber),\n getValidatorFromConfigElseEmpty(config?.maxValue, maxNumber),\n ]\n}\n\nconst mergeValidators = <\n TValue extends Arrayable<CanBeNullableType<DataValue>> = Arrayable<DataValue>,\n>(\n config: PropertyConfig<TValue> | undefined,\n ...validators: readonly (\n | PropertyValidatorComponent<any>\n | PropertyValidatorComponentTypeAdvanced<any, any>\n )[]\n): PropertyValidatorComponent<any>[] => {\n return [...validators, ...(config?.validators ? config.validators : [])]\n}\n\nconst isModelInstance = (obj: any): obj is ModelInstance<any, any> => {\n // @ts-ignore\n return Boolean(obj && obj.getPrimaryKey)\n}\n\nconst getModelName = (namespace: string, pluralName: string) => {\n return `${namespace}/${pluralName}`\n}\n\nconst parseModelName = (modelName: string) => {\n const parts = modelName.split('/')\n // eslint-disable-next-line functional/immutable-data\n const pluralName = parts.pop()\n const namespace = parts.join('/')\n return { namespace, pluralName }\n}\n\nconst buildValidEndpoint = (...components: readonly string[]) => {\n const suffix = components\n .map(x => {\n if (x === ID_KEY) {\n return x\n }\n return kebabCase(x)\n })\n .map(s => s.toLowerCase())\n .join('/')\n return `/${suffix}`\n}\n\nconst _generateRestInfo =\n (method: HttpMethods, withId: boolean, ...additional: readonly string[]) =>\n (pluralName: string, namespace: string) =>\n (existing?: RestInfoMinimum): RestInfo => {\n if (existing) {\n return {\n // Default add security, then override it.\n security: {},\n ...existing,\n }\n }\n const endpoint = withId\n ? buildValidEndpoint(namespace, pluralName, ID_KEY)\n : buildValidEndpoint(namespace, pluralName, ...additional)\n return {\n method,\n endpoint,\n // We cannot auto create security.\n security: {},\n }\n }\n\nconst _apiMethodToRestInfoGenerator = {\n [ApiMethod.create]: _generateRestInfo(HttpMethods.POST, false),\n [ApiMethod.retrieve]: _generateRestInfo(HttpMethods.GET, true),\n [ApiMethod.update]: _generateRestInfo(HttpMethods.PUT, true),\n [ApiMethod.delete]: _generateRestInfo(HttpMethods.DELETE, true),\n [ApiMethod.search]: _generateRestInfo(HttpMethods.POST, false, 'search'),\n}\n\nconst getNullRestInfo = () => {\n return {\n endpoint: NULL_ENDPOINT,\n method: NULL_METHOD,\n security: {},\n }\n}\n\nconst _fillOutRestInfo = (\n pluralName: string,\n namespace: string,\n partial: Partial<ApiInfoPartialRest> | undefined,\n nullRest: Record<ApiMethod, RestInfo>\n) => {\n const finishedRestInfo: Record<ApiMethod, RestInfo> = Object.entries(\n ApiMethod\n ).reduce(\n (acc, [, method]) => {\n const existing =\n partial && partial.rest && partial.rest[method]\n ? partial.rest[method]\n : undefined\n const restInfo = _apiMethodToRestInfoGenerator[method](\n pluralName,\n namespace\n )(existing)\n return merge(acc, {\n [method]: restInfo,\n })\n },\n nullRest as Record<ApiMethod, RestInfo>\n )\n return {\n noPublish: false,\n onlyPublish: [],\n rest: finishedRestInfo,\n createOnlyOne: partial?.createOnlyOne || false,\n }\n}\n\nconst populateApiInformation = (\n pluralName: string,\n namespace: string,\n partial: Partial<ApiInfoPartialRest> | undefined\n): Readonly<Required<ApiInfo>> => {\n const nullRest = {\n delete: getNullRestInfo(),\n search: getNullRestInfo(),\n update: getNullRestInfo(),\n retrieve: getNullRestInfo(),\n create: getNullRestInfo(),\n }\n\n if (!partial) {\n return _fillOutRestInfo(pluralName, namespace, partial, nullRest)\n }\n // Are we not going to publish at all? All \"nulled\" out.\n if (partial.noPublish) {\n return {\n onlyPublish: [],\n noPublish: true,\n rest: nullRest,\n createOnlyOne: false,\n }\n }\n\n const rest: Partial<Record<ApiMethod, RestInfoMinimum>> = partial.rest || {}\n // Should we only publish some but not all?\n if (partial.onlyPublish && partial.onlyPublish.length > 0) {\n return partial.onlyPublish.reduce(\n (acc, method) => {\n const restInfo = _apiMethodToRestInfoGenerator[method](\n pluralName,\n namespace\n )(rest[method])\n return merge(acc, {\n rest: {\n [method]: restInfo,\n },\n })\n },\n {\n noPublish: false,\n onlyPublish: partial.onlyPublish,\n createOnlyOne: Boolean(partial.createOnlyOne),\n rest: nullRest,\n } as ApiInfo\n )\n }\n return _fillOutRestInfo(pluralName, namespace, partial, nullRest)\n}\n\n/**\n * Create a zod schema generator for a property given its type and config.\n * Returns a function that when called produces the zod schema.\n */\nconst createZodForProperty =\n (propertyType: any, config?: PropertyConfig<any>) => () => {\n const myConfig: PropertyConfig<any> = config || {}\n const provided = myConfig.zod\n if (provided) {\n return provided as ZodType<any>\n }\n\n const _getZodForPropertyType = (pt: any) => {\n if (myConfig.choices) {\n return z.enum(myConfig.choices as any)\n }\n switch (pt) {\n case 'UniqueId':\n return z.string()\n case 'Date':\n case 'Datetime':\n return z.union([z.string(), z.date()])\n case 'Integer':\n return z.number().int()\n case 'Number':\n return z.number()\n case 'Boolean':\n return z.boolean()\n case 'Array':\n return z.array(z.any())\n case 'Object':\n return z.object().loose()\n case 'Email':\n return z.email()\n case 'Text':\n case 'BigText':\n return z.string()\n case 'ModelReference':\n return z.union([z.string(), z.number()])\n default:\n return z.any()\n }\n }\n\n const baseSchema = _getZodForPropertyType(propertyType)\n const choices = (config as any)?.choices\n const schemaFromChoices =\n choices && Array.isArray(choices) && choices.length > 0\n ? z.union(choices.map((c: any) => z.literal(c)) as any)\n : baseSchema\n\n const finalSchema = flow([\n s =>\n typeof myConfig.minValue === 'number' ? s.min(myConfig.minValue) : s,\n s =>\n typeof myConfig.maxValue === 'number' ? s.max(myConfig.maxValue) : s,\n s =>\n typeof myConfig.minLength === 'number' ? s.min(myConfig.minLength) : s,\n s =>\n typeof myConfig.maxLength === 'number' ? s.max(myConfig.maxLength) : s,\n s =>\n myConfig.defaultValue !== undefined\n ? s.default(myConfig.defaultValue)\n : s,\n s => (myConfig.required ? s : s.optional()),\n // Attach description for Zod consumers and OpenAPI generators.\n s => {\n if (myConfig.description) {\n // zod's describe helps Zod introspection; some zod-openapi versions expect metadata via .meta or .openapi\n // Use .describe and also attach .meta with openapi description if available.\n if (typeof s.openapi === 'function') {\n return s.openapi({ description: myConfig.description })\n }\n return s.meta\n ? s.meta({ description: myConfig.description })\n : s.describe(myConfig.description)\n }\n return s\n },\n ])(schemaFromChoices)\n\n return finalSchema as ZodType<any>\n }\n\nexport {\n isReferencedProperty,\n getValueForModelInstance,\n getValueForReferencedModel,\n getCommonTextValidators,\n getValidatorFromConfigElseEmpty,\n getCommonNumberValidators,\n mergeValidators,\n isModelInstance,\n getModelName,\n buildValidEndpoint,\n populateApiInformation,\n NULL_ENDPOINT,\n NULL_METHOD,\n createZodForProperty,\n parseModelName,\n}\n", "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 */\ntype 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\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\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", "import { PropertyType, PrimaryKeyType } from '../types.js'\nimport { createUuid, getRandomValues } from '../utils.js'\nimport {\n DatabaseKeyPropertyConfig,\n PrimaryKeyGenerator,\n PrimaryKeyPropertyType,\n} from './types.js'\n\nconst _getModelIdPropertyType = (\n config: DatabaseKeyPropertyConfig<any> = {}\n): PrimaryKeyPropertyType => {\n return config.dataType || PropertyType.UniqueId\n}\n\nexport const getPrimaryKeyGenerator = <TValue extends PrimaryKeyType>(\n config: DatabaseKeyPropertyConfig<TValue> = {}\n): PrimaryKeyGenerator => {\n const custom = config.primaryKeyGenerator\n if (custom) {\n return custom\n }\n const idType = _getModelIdPropertyType(config)\n switch (idType) {\n case PropertyType.Integer:\n return () => Promise.resolve(getRandomValues()[0]!)\n default: {\n return () => Promise.resolve(createUuid())\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_merge", "import_merge", "import_get", "getRandomValuesFunc", "PluralEndings", "AsyncLock", "flow", "isEmpty", "value", "flatMap", "import_merge", "import_get", "kebabCase", "choices", "flow", "isDate", "merge", "isDate", "merge", "merge", "merge", "import_flow", "import_merge", "EqualitySymbol", "omit", "merge", "isDate", "flow", "merge", "property", "identity"]
|
|
7
|
+
}
|