functional-models 3.10.0 → 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.
Files changed (83) hide show
  1. package/cjs/errors.cjs +38 -0
  2. package/cjs/errors.cjs.map +7 -0
  3. package/cjs/index.cjs +2426 -0
  4. package/cjs/index.cjs.map +7 -0
  5. package/cjs/lib.cjs +431 -0
  6. package/cjs/lib.cjs.map +7 -0
  7. package/cjs/models.cjs +571 -0
  8. package/cjs/models.cjs.map +7 -0
  9. package/cjs/orm/index.cjs +1765 -0
  10. package/cjs/orm/index.cjs.map +7 -0
  11. package/cjs/orm/internal-libs.cjs +136 -0
  12. package/cjs/orm/internal-libs.cjs.map +7 -0
  13. package/cjs/orm/libs.cjs +88 -0
  14. package/cjs/orm/libs.cjs.map +7 -0
  15. package/cjs/orm/models.cjs +1027 -0
  16. package/cjs/orm/models.cjs.map +7 -0
  17. package/cjs/orm/properties.cjs +989 -0
  18. package/cjs/orm/properties.cjs.map +7 -0
  19. package/cjs/orm/query.cjs +376 -0
  20. package/cjs/orm/query.cjs.map +7 -0
  21. package/cjs/orm/types.cjs +59 -0
  22. package/cjs/orm/types.cjs.map +7 -0
  23. package/cjs/orm/validation.cjs +301 -0
  24. package/cjs/orm/validation.cjs.map +7 -0
  25. package/cjs/properties.cjs +998 -0
  26. package/cjs/properties.cjs.map +7 -0
  27. package/cjs/serialization.cjs +75 -0
  28. package/cjs/serialization.cjs.map +7 -0
  29. package/cjs/types.cjs +65 -0
  30. package/cjs/types.cjs.map +7 -0
  31. package/cjs/utils.cjs +187 -0
  32. package/cjs/utils.cjs.map +7 -0
  33. package/cjs/validation.cjs +431 -0
  34. package/cjs/validation.cjs.map +7 -0
  35. package/errors.js +3 -4
  36. package/errors.js.map +1 -1
  37. package/index.d.ts +13 -13
  38. package/index.js +13 -52
  39. package/index.js.map +1 -1
  40. package/lib.d.ts +2 -2
  41. package/lib.js +45 -65
  42. package/lib.js.map +1 -1
  43. package/models.d.ts +1 -1
  44. package/models.js +22 -30
  45. package/models.js.map +1 -1
  46. package/orm/index.d.ts +9 -9
  47. package/orm/index.js +9 -48
  48. package/orm/index.js.map +1 -1
  49. package/orm/internal-libs.js +7 -11
  50. package/orm/internal-libs.js.map +1 -1
  51. package/orm/libs.d.ts +1 -1
  52. package/orm/libs.js +8 -16
  53. package/orm/libs.js.map +1 -1
  54. package/orm/models.d.ts +2 -2
  55. package/orm/models.js +20 -26
  56. package/orm/models.js.map +1 -1
  57. package/orm/properties.d.ts +22 -22
  58. package/orm/properties.js +26 -36
  59. package/orm/properties.js.map +1 -1
  60. package/orm/query.d.ts +1 -1
  61. package/orm/query.js +31 -52
  62. package/orm/query.js.map +1 -1
  63. package/orm/types.d.ts +1 -1
  64. package/orm/types.js +7 -10
  65. package/orm/types.js.map +1 -1
  66. package/orm/validation.d.ts +2 -2
  67. package/orm/validation.js +5 -13
  68. package/orm/validation.js.map +1 -1
  69. package/package.json +50 -65
  70. package/properties.d.ts +21 -21
  71. package/properties.js +65 -94
  72. package/properties.js.map +1 -1
  73. package/serialization.d.ts +1 -1
  74. package/serialization.js +3 -9
  75. package/serialization.js.map +1 -1
  76. package/types.js +4 -6
  77. package/types.js.map +1 -1
  78. package/utils.d.ts +2 -1
  79. package/utils.js +8 -23
  80. package/utils.js.map +1 -1
  81. package/validation.d.ts +1 -1
  82. package/validation.js +19 -50
  83. package/validation.js.map +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../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"],
4
+ "sourcesContent": ["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"],
5
+ "mappings": "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",
6
+ "names": ["import_merge", "import_get", "PluralEndings", "AsyncLock", "flow", "isEmpty", "value", "flatMap", "import_merge", "import_get", "get", "kebabCase", "choices", "flow", "isDate", "merge", "get", "model", "value"]
7
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/serialization.ts
31
+ var serialization_exports = {};
32
+ __export(serialization_exports, {
33
+ toJsonAble: () => toJsonAble
34
+ });
35
+ module.exports = __toCommonJS(serialization_exports);
36
+ var import_merge = __toESM(require("lodash/merge.js"), 1);
37
+ var isModelInstance = (obj) => {
38
+ return Boolean(obj.toObj);
39
+ };
40
+ var _getValue = async (value) => {
41
+ if (value === void 0) {
42
+ return void 0;
43
+ }
44
+ if (value === null) {
45
+ return null;
46
+ }
47
+ const type = typeof value;
48
+ const asFunction = value;
49
+ if (type === "function") {
50
+ return _getValue(await asFunction());
51
+ }
52
+ if (isModelInstance(value)) {
53
+ return _getValue(await value.toObj());
54
+ }
55
+ const asDate = value;
56
+ if (type === "object" && asDate.toISOString) {
57
+ return _getValue(asDate.toISOString());
58
+ }
59
+ return value;
60
+ };
61
+ var toJsonAble = (keyToFunc) => () => {
62
+ return Object.entries(keyToFunc).reduce(async (acc, [key, value]) => {
63
+ const realAcc = await acc;
64
+ const trueValue = await _getValue(await value);
65
+ if (trueValue === void 0) {
66
+ return realAcc;
67
+ }
68
+ return (0, import_merge.default)(realAcc, { [key]: trueValue });
69
+ }, Promise.resolve({}));
70
+ };
71
+ // Annotate the CommonJS export names for ESM import in node:
72
+ 0 && (module.exports = {
73
+ toJsonAble
74
+ });
75
+ //# sourceMappingURL=serialization.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/serialization.ts"],
4
+ "sourcesContent": ["import merge from 'lodash/merge.js'\nimport {\n PropertyGetters,\n JsonAble,\n ToObjectFunction,\n DataDescription,\n JsonifiedData,\n ModelInstance,\n ToObjectResult,\n} from './types.js'\n\nconst isModelInstance = (obj: any): obj is ModelInstance<any> => {\n return Boolean(obj.toObj)\n}\n\nconst _getValue = async (value: any): Promise<JsonAble | null> => {\n if (value === undefined) {\n return undefined\n }\n if (value === null) {\n return null\n }\n const type = typeof value\n const asFunction = value as (...args: any[]) => any\n if (type === 'function') {\n return _getValue(await asFunction())\n }\n // Nested Object\n if (isModelInstance(value)) {\n return _getValue(await value.toObj())\n }\n // Dates\n const asDate = value as Date\n if (type === 'object' && asDate.toISOString) {\n return _getValue(asDate.toISOString())\n }\n return value\n}\n\nconst toJsonAble =\n <T extends DataDescription>(\n keyToFunc: PropertyGetters<T>\n ): ToObjectFunction<T> =>\n <R extends T | JsonifiedData<T> = JsonifiedData<T>>(): Promise<\n ToObjectResult<R>\n > => {\n return Object.entries(keyToFunc).reduce(async (acc, [key, value]) => {\n const realAcc = await acc\n const trueValue = await _getValue(await value)\n if (trueValue === undefined) {\n return realAcc\n }\n return merge(realAcc, { [key]: trueValue })\n }, Promise.resolve({})) as Promise<ToObjectResult<R>>\n }\n\nexport { toJsonAble }\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAWlB,IAAM,kBAAkB,CAAC,QAAwC;AAC/D,SAAO,QAAQ,IAAI,KAAK;AAC1B;AAEA,IAAM,YAAY,OAAO,UAAyC;AAChE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,aAAa;AACnB,MAAI,SAAS,YAAY;AACvB,WAAO,UAAU,MAAM,WAAW,CAAC;AAAA,EACrC;AAEA,MAAI,gBAAgB,KAAK,GAAG;AAC1B,WAAO,UAAU,MAAM,MAAM,MAAM,CAAC;AAAA,EACtC;AAEA,QAAM,SAAS;AACf,MAAI,SAAS,YAAY,OAAO,aAAa;AAC3C,WAAO,UAAU,OAAO,YAAY,CAAC;AAAA,EACvC;AACA,SAAO;AACT;AAEA,IAAM,aACJ,CACE,cAEF,MAEK;AACH,SAAO,OAAO,QAAQ,SAAS,EAAE,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,MAAM;AACnE,UAAM,UAAU,MAAM;AACtB,UAAM,YAAY,MAAM,UAAU,MAAM,KAAK;AAC7C,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AACA,eAAO,aAAAA,SAAM,SAAS,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC;AAAA,EAC5C,GAAG,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACxB;",
6
+ "names": ["merge"]
7
+ }
package/cjs/types.cjs ADDED
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/types.ts
21
+ var types_exports = {};
22
+ __export(types_exports, {
23
+ ApiMethod: () => ApiMethod,
24
+ PrimitiveValueType: () => PrimitiveValueType,
25
+ PropertyType: () => PropertyType
26
+ });
27
+ module.exports = __toCommonJS(types_exports);
28
+ var ApiMethod = /* @__PURE__ */ ((ApiMethod2) => {
29
+ ApiMethod2["create"] = "create";
30
+ ApiMethod2["retrieve"] = "retrieve";
31
+ ApiMethod2["update"] = "update";
32
+ ApiMethod2["delete"] = "delete";
33
+ ApiMethod2["search"] = "search";
34
+ return ApiMethod2;
35
+ })(ApiMethod || {});
36
+ var PropertyType = /* @__PURE__ */ ((PropertyType2) => {
37
+ PropertyType2["UniqueId"] = "UniqueId";
38
+ PropertyType2["Date"] = "Date";
39
+ PropertyType2["Datetime"] = "Datetime";
40
+ PropertyType2["Array"] = "Array";
41
+ PropertyType2["ModelReference"] = "ModelReference";
42
+ PropertyType2["Integer"] = "Integer";
43
+ PropertyType2["Text"] = "Text";
44
+ PropertyType2["BigText"] = "BigText";
45
+ PropertyType2["Number"] = "Number";
46
+ PropertyType2["Object"] = "Object";
47
+ PropertyType2["Email"] = "Email";
48
+ PropertyType2["Boolean"] = "Boolean";
49
+ return PropertyType2;
50
+ })(PropertyType || {});
51
+ var PrimitiveValueType = /* @__PURE__ */ ((PrimitiveValueType2) => {
52
+ PrimitiveValueType2["boolean"] = "boolean";
53
+ PrimitiveValueType2["string"] = "string";
54
+ PrimitiveValueType2["object"] = "object";
55
+ PrimitiveValueType2["number"] = "number";
56
+ PrimitiveValueType2["integer"] = "integer";
57
+ return PrimitiveValueType2;
58
+ })(PrimitiveValueType || {});
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ ApiMethod,
62
+ PrimitiveValueType,
63
+ PropertyType
64
+ });
65
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/types.ts"],
4
+ "sourcesContent": ["import * as openapi from 'openapi-types'\nimport { ZodObject, ZodType } from 'zod'\n\nexport type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never }\n\nexport type XOR<T, U> = T | U extends object\n ? (Without<T, U> & U) | (Without<U, T> & T)\n : T | U\n\n/**\n * A function that returns the value, or just the value\n */\ntype MaybeFunction<T> = T | (() => T)\n\n/**\n * The data or a promise that returns the data\n */\ntype MaybePromise<T> = T | Promise<T>\n\n/**\n * The value or null\n */\ntype Nullable<T> = T | null\n\n/**\n * The value, or undefined\n */\ntype Maybe<T> = T | undefined\n\n/**\n * The value or an array of the types of value\n */\ntype Arrayable<T> = T | readonly T[]\n\n/**\n * A JSON compliant object.\n */\ntype JsonObj = Readonly<{\n [s: string]: JsonAble | null | undefined\n}>\n\n/**\n * A description of valid json values.\n */\ntype JsonAble =\n | Arrayable<JsonObj>\n | readonly (number | string | boolean)[]\n | readonly JsonAble[]\n | number\n | string\n | boolean\n | null\n | undefined\n\n/**\n * This is a fully Json compliant version of a DataDescription\n */\ntype JsonifiedData<T extends DataDescription> = {\n readonly [P in keyof T]: JsonAble\n}\n\n/**\n * Removes promises from every property of an object.\n */\ntype RemovePromises<T extends object> = {\n // @ts-ignore\n [K in keyof T as T[K] extends Promise<any> ? K : never]: Awaited<T[K]>\n} & {\n [K in keyof T as T[K] extends Promise<any> ? never : K]: T[K]\n}\n\n/**\n * The types that are allowed in a choice.\n */\ntype ChoiceTypes = null | string | number | boolean\n\n/**\n * A Model Reference that is only string|number|undefined|null\n */\ntype FlattenModelReferences<TData extends DataDescription> = {\n [K in keyof TData as TData[K] extends ModelInstance<any>\n ? never\n : K]: TData[K]\n} & {\n [K in keyof TData as TData[K] extends ModelInstance<TData>\n ? K\n : never]: PrimaryKeyType\n}\n\n/**\n * The result of a \"toObj()\" call. See {@link ModelInstance.toObj}\n * This is guaranteed to be JSON compliant.\n */\ntype ToObjectResult<TData extends DataDescription> = RemovePromises<\n FlattenModelReferences<TData>\n>\n\n/**\n * A function that will provide a JSON compliant representation of the data.\n * Useful for saving in a database, or sending out over a network.\n */\ntype ToObjectFunction<TData extends DataDescription> = <\n R extends TData | JsonifiedData<TData> = JsonifiedData<TData>,\n>() => Promise<ToObjectResult<R>>\n\n/**\n * Getter functions that provide access to the value of a property of an instance.\n */\ntype PropertyGetters<TData extends DataDescription> = {\n readonly [PropertyKey in keyof Required<TData>]: () => TData[PropertyKey]\n}\n\n/**\n * The most basic description of data supported by this framework.\n * This includes all of JSON and additional functionality for referenced models.\n */\ntype DataDescription = Readonly<{\n [s: string]:\n | Promise<PrimaryKeyType>\n | Arrayable<number>\n | Arrayable<string>\n | Arrayable<boolean>\n | Arrayable<null>\n | Arrayable<DataDescription>\n | Arrayable<Date>\n | Arrayable<undefined>\n | ModelReferenceType<any>\n | Arrayable<JsonAble>\n}>\n\nexport type CanBeNullableType<T extends DataValue> = XOR<\n T | undefined | null,\n T\n>\n\n/**\n * These are the allowable types for setting a property of data to.\n */\ntype DataValue = MaybePromise<\n | Arrayable<JsonAble>\n | (() => DataValue) // A lazy function that provides a value.\n | Arrayable<null>\n | Arrayable<undefined>\n | Arrayable<Date>\n | Arrayable<DataDescription>\n>\n\n/**\n * Additional context to a validation. Sometimes there are other validation information needed than what can be provided within a model itself.\n */\ntype ValidatorContext = Readonly<Record<string, any>>\n\n/**\n * A collection of errors for a property or model.\n */\ntype ValidationErrors = readonly string[]\n\n/**\n * The response to a validation attempt of a model at the lowest level. Something is bad (a string), or its good (undefined)\n */\ntype ComponentValidationErrorResponse = string | undefined\n\n/**\n * The errors across an entire model. Contains both overall errors, as well as individualized property errors.\n */\ntype ModelErrors<TData extends DataDescription> = {\n readonly [Property in keyof Partial<TData>]: ValidationErrors\n} & Readonly<{ overall?: ValidationErrors }>\n\n/**\n * The most flexible representation of a Property Validator.\n * @param value - The raw value being evaluated\n * @param model - The model (e.g. for datastore lookups). Use model.create(data) if you need an instance.\n * @param instanceData - An already JSONified version of the model. This is a convenience so toObj() does not need to be called so frequently.\n * @param context - Additional outside context to help with validation. (Most cases this is unused)\n */\ntype PropertyValidatorComponentTypeAdvanced<\n TValue,\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = (\n value: TValue,\n model: ModelType<TData, TModelExtensions, TModelInstanceExtensions>,\n instanceData: ToObjectResult<TData>,\n context: ValidatorContext\n) => ComponentValidationErrorResponse\n\n/**\n * A Property Validator that does not use Promises\n */\ntype PropertyValidatorComponentSync<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = PropertyValidatorComponentTypeAdvanced<\n any,\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n>\n\n/**\n * A simple property validator that just looks at the value.\n * @param value - A single value to validate\n */\ntype ValuePropertyValidatorComponent<TValue extends Arrayable<DataValue>> = (\n value: TValue\n) => ComponentValidationErrorResponse\n\n/**\n * A property validator that returns a promise.\n * @param value - The value to validate\n * @param model - The model (e.g. for datastore lookups). Use model.create(data) if you need an instance.\n * @param instanceData - The jsonified version of the data\n * @param context - Additional context to validate against.\n */\ntype PropertyValidatorComponentAsync<\n TData extends DataDescription,\n TModelExtensions extends object,\n TModelInstanceExtensions extends object,\n> = (\n value: Arrayable<DataValue>,\n model: ModelType<TData, TModelExtensions, TModelInstanceExtensions>,\n instanceData: ToObjectResult<TData>,\n context: ValidatorContext\n) => Promise<ComponentValidationErrorResponse>\n\n/**\n * A property validator that is either Sync or Async.\n */\ntype PropertyValidatorComponent<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> =\n | PropertyValidatorComponentSync<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n | PropertyValidatorComponentAsync<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n\n/**\n * The validator for an entire property. This is composed of multiple underlying validators that all get executed and then assembled together.\n * @param model - The model (the instance's model). Use model.create(data) if you need an instance.\n * @param instanceData - The instance data to compare\n * @param context - Additional context for validating.\n */\ntype PropertyValidator<TData extends DataDescription> = (\n model: ModelType<TData>,\n instanceData: ToObjectResult<TData>,\n context: ValidatorContext\n) => Promise<ValidationErrors>\n\n/**\n * The component of a Model Validator. These are combined to create a single model validator.\n * @param model - The model. Use model.create(data) if you need an instance.\n * @param instanceData - The JSONified version of the model.\n * @param context - Additional context to assist with validating.\n */\ntype ModelValidatorComponent<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = (\n model: ModelType<TData, TModelExtensions, TModelInstanceExtensions>,\n instanceData: ToObjectResult<TData>,\n context: ValidatorContext\n) => Promise<ComponentValidationErrorResponse>\n\n/**\n * A function that will get the value of a property.\n * Depending on what the property is, it'll either be a primitive value\n * or it'll be a referenced model.\n */\ntype ValueGetter<\n /**\n * The type of value\n */\n TValue extends Arrayable<DataValue>,\n /**\n * The value existing within a specific type of data.\n */\n TData extends DataDescription = DataDescription,\n /**\n * Any additional model extensions.\n */\n TModelExtensions extends object = object,\n /**\n * Any additional model instance extensions.\n */\n TModelInstanceExtensions extends object = object,\n> = () => MaybePromise<\n TValue | ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * An instance of a property. This is used to describe a property in depth as well as provide functionality like validating values.\n * @interface\n */\ntype PropertyInstance<\n /**\n * The type of value that the property represents.\n */\n TValue extends Arrayable<DataValue>,\n /**\n * The data that the property sits within.\n */\n TData extends DataDescription = DataDescription,\n /**\n * Any additional model extensions.\n */\n TModelExtensions extends object = object,\n /**\n * Any additional model instance extensions.\n */\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Gets the configuration passed into the property constructor.\n */\n getConfig: () => object\n /**\n * Gets available choices for limiting the value of this property.\n */\n getChoices: () => readonly ChoiceTypes[]\n /**\n * If there is a default value\n */\n getDefaultValue: () => TValue | undefined\n /**\n * If there is a constant value that never changes. (This is used above all else).\n */\n getConstantValue: () => TValue | undefined\n /**\n * Gets the ValueType of the property. Unless custom properties are used, the value is a {@link PropertyType}.\n * Otherwise the value could be string for custom types.\n */\n getPropertyType: () => PropertyType | string\n /**\n * Creates a value getter.\n * @param value - The type of value\n * @param modelData - The type of data.\n * @param modelInstance - An instance of the model that has the data.\n */\n createGetter: (\n value: TValue,\n modelData: TData,\n modelInstance: ModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => ValueGetter<TValue, TData, TModelExtensions, TModelInstanceExtensions>\n /**\n * Function that exposes a zod schema for this property.\n */\n getZod: () => ZodType<TValue>\n /**\n * Gets a validator for the property. This is not normally used.\n * Instead for validation look at {@link ModelInstance.validate}\n * @param valueGetter - The getter for the value.\n */\n getValidator: (\n valueGetter: ValueGetter<\n TValue,\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => PropertyValidator<TData>\n}>\n\n/**\n * A list of properties that make up a model.\n */\ntype PropertiesList<TData extends DataDescription> = {\n readonly [P in keyof TData as TData[P] extends Arrayable<DataValue>\n ? P\n : never]: PropertyInstance<any>\n}\n\n/**\n * An extends a Property to add additional functions helpful for dealing with\n * referenced models.\n */\ninterface ModelReferencePropertyInstance<\n TData extends DataDescription,\n TProperty extends Arrayable<DataValue>,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> extends PropertyInstance<TProperty> {\n /**\n * Gets the id (foreign key) of the referenced model.\n * @param instanceValues - The ModelReference. (key, data, or instance)\n */\n readonly getReferencedId: (\n instanceValues: ModelReferenceType<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => Maybe<PrimaryKeyType>\n\n /**\n * Gets reference's model\n */\n readonly getReferencedModel: () => ModelType<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n}\n\n/**\n * A property of a model that references another model instance.\n * This is a basic implementation of a \"foreign key\".\n * The value of this property can be either a key type (string|number), or a model instance, or the model data itself. It depends on the ModelInstanceFetcher.\n */\ntype ModelReferenceType<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = MaybePromise<\n | TData\n | ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n | ToObjectResult<TData>\n | PrimaryKeyType\n>\n\n/**\n * Common property validator choices.\n * @interface\n */\ntype CommonValidators = Readonly<{\n /**\n * Is this property required?\n */\n required?: boolean\n /**\n * Can the property only be an integer?\n */\n isInteger?: boolean\n /**\n * Can the property only be a number?\n */\n isNumber?: boolean\n /**\n * Can the property only be a string?\n */\n isString?: boolean\n /**\n * Is the property an array of values?\n */\n isArray?: boolean\n /**\n * Is the property only true or false?\n */\n isBoolean?: boolean\n}>\n\n/**\n * Standard configuration options for properties.\n * @interface\n */\ntype PropertyConfigOptions<TValue extends Arrayable<DataValue>> = Readonly<\n Partial<{\n /**\n * A type override to override the property type of a property.\n */\n typeOverride: PropertyType | string\n /**\n * A default value if one is never given.\n */\n defaultValue: TValue\n /**\n * Determines if this value needs to go through denormalization.\n */\n isDenormalized: boolean\n /**\n * The value of the property (if provided)\n */\n value: TValue\n /**\n * Possible limiting choices of what the property can be.\n */\n choices: readonly ChoiceTypes[]\n /**\n * A lazy loading method, which will only run when the value is actually retrieved.\n * IMPORTANT: Do not include promises as part of this because they are not thread safe.\n * @param value - The current value\n * @param modelData - The models current data\n */\n lazyLoadMethod: <TData extends DataDescription>(\n value: TValue,\n modelData: CreateParams<TData>\n ) => TValue\n /**\n * A thread safe (Atomic) version of lazyLoadMethod. Use this for all lazy loadings that requires Promises.\n * @param value - The current value\n * @param modelData - The models current data.\n */\n lazyLoadMethodAtomic: <TData extends DataDescription>(\n value: TValue,\n modelData: CreateParams<TData>\n ) => Promise<TValue>\n /**\n * An optional function that can select a \"part\" of the value to return.\n * @param instanceValue\n */\n valueSelector: (instanceValue: MaybePromise<TValue>) => TValue\n /**\n * Additional validators for the property.\n */\n validators: readonly PropertyValidatorComponent<any>[]\n /**\n * An optional zod schema for this property. If provided, it will be used as an\n * override for the generated schema.\n */\n zod?: ZodType<any>\n /**\n * A short human readable description of the property for documentation.\n */\n description?: string\n /**\n * The maximum length of the value. (Drives validation)\n */\n maxLength: number\n /**\n * The minimum length of the value. (Drives validation)\n */\n minLength: number\n /**\n * The maximum size of the value. (Drives validation)\n */\n maxValue: number\n /**\n * The minimum size of the value. (Drives validation)\n */\n minValue: number\n /**\n * If the value should be created automatically. Used in date creation.\n */\n autoNow: boolean\n /**\n * If you are using ModelReferences, this is required.\n * A fetcher used for getting model references.\n * This configuration item is used within the {@link AdvancedModelReferenceProperty} and any other property\n * that is lazy loading (atomically) models.\n */\n fetcher: ModelInstanceFetcher\n }>\n>\n\n/**\n * A function that has the ability to fetch an instance of a model.\n * This is the backbone that provides the \"ModelReference\" functionality.\n * This is useful downstream for building ORMs and other systems that require\n * hydrating \"foreign key\" models.\n * @param model - The model type that is being fetched.\n * @param primaryKey - The primary key of the desired data.\n */\ntype ModelInstanceFetcher<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n model: ModelType<TData, TModelExtensions, TModelInstanceExtensions>,\n primaryKey: PrimaryKeyType\n) =>\n | Promise<\n | TData\n | ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n | ToObjectResult<TData>\n >\n | Promise<null>\n | Promise<undefined>\n\n/**\n * The configurations for a property.\n */\ntype PropertyConfig<TValue extends Arrayable<DataValue>> =\n | (PropertyConfigOptions<TValue> & CommonValidators)\n | undefined\n\n/**\n * Depending on your system a primary key is either a string or a number.\n */\ntype PrimaryKeyType = string | number\n\n/**\n * A function that has the ability to build models. (The models themselves, not instances of models)\n * This is actually a \"factory of model factories\" but we're just calling it a ModelFactory.\n *\n * IMPORTANT:\n * If you want to override and create extended Models/ModelInstances this is the place to do it.\n * Create your own ModelFactory that adds additional functionality.\n * For expanding a Model, you can just add it to the overall object. that {@link ModelFactory} produces.\n *\n * For expanding a ModelInstance, you will want to wrap the \"create()\" function of {@link ModelType}\n *\n * @param modelDefinition - The minimal model definitions needed.\n * @param options - Additional model options.\n */\ntype ModelFactory<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n TModelFactoryOptionsExtensions extends object = object,\n> = <TData extends DataDescription>(\n modelDefinition: MinimalModelDefinition<TData>,\n options?: ModelFactoryOptions<TData, TModelFactoryOptionsExtensions>\n) => ModelType<TData, TModelExtensions, TModelInstanceExtensions>\n\n/**\n * Input parameters to a model's create function.\n */\ntype CreateParams<\n TData extends DataDescription,\n IgnoreProperties extends string = '',\n> = Omit<TData | RemovePromises<TData>, IgnoreProperties>\n\n/**\n * Higher Level Methods associated with a model based API. CRUDS\n */\nenum ApiMethod {\n create = 'create',\n retrieve = 'retrieve',\n update = 'update',\n delete = 'delete',\n search = 'search',\n}\n\n/**\n * Basic REST information for a model.\n * @interface\n */\ntype RestInfo = {\n /**\n * The endpoint (not including the base domain). This format can include \":id\" to describe a specific instance id.\n * Example: /api/v2/whatever-i-want/model/:id\n * The following are the defaults by API method:\n * create: '/namespace/app',\n * retrieve: '/namespace/app/id',\n * update: '/namespace/app/id',\n * delete: '/namespace/app/id',\n * search: '/namespace/app/search',\n */\n endpoint: string\n /**\n * Security descriptions\n */\n security: openapi.OpenAPIV3_1.SecurityRequirementObject\n /**\n * The HTTP Method. The following are the defaults used:\n * create: post,\n * retrieve: get,\n * update: put,\n * delete: delete,\n * search: post,\n */\n method: openapi.OpenAPIV3_1.HttpMethods\n}\n\n/**\n * A minimum input for a RestInfo.\n */\ntype RestInfoMinimum = {\n security?: openapi.OpenAPIV3_1.SecurityRequirementObject\n} & Omit<RestInfo, 'security'>\n\n/**\n * Functional API documentation for a given model. This allows the automatic creation of tools and documentation such as OpenApi specs.\n * This uses the standard \"CRUDS\" api methods that you might see on any API involving a model.\n * Create, Retrieve, Update, Delete, Search\n * @interface\n */\ntype ApiInfo = {\n /**\n * If true, no api information should be published. This means, that no code-generation tool should produce\n * any api code/documentation as it relates to this model. If you want partial publishing, look at \"onlyPublish\"\n */\n noPublish: boolean\n /**\n * Similar to noPublish, but granular. This will only publish the methods shown. If noPublish is provided,\n * this will be empty. If onlyPublish is empty, and noPublish is false, then all methods will be published.\n */\n onlyPublish: readonly ApiMethod[]\n /**\n * A description of each Api method to its rest info.\n * If this is not manually overrided then defaults are used for each.\n */\n rest: Record<ApiMethod, RestInfo>\n /**\n * Create normally can support bulk inserts (more than one). If this property is true, create will only handle \"one\" model at a time.\n */\n createOnlyOne: boolean\n}\n\n/**\n * An {@link ApiInfo} that has only part of RestInfo completed. (useful for overriding defaults)\n * @interface\n */\ntype ApiInfoPartialRest = Readonly<{\n rest: Partial<Record<ApiMethod, RestInfoMinimum>>\n}> &\n Omit<ApiInfo, 'rest'>\n\n/**\n * Expressively defines metadata for a given model.\n * @interface\n */\ntype ModelDefinition<TData extends DataDescription> = Readonly<{\n /**\n * The primary name for the model and instances of the model. This should be a name for multiple of the model instances.\n */\n pluralName: string\n /**\n * The name that this model exists within, such as an app. This is used to combine with the pluralName to create\n * a unique name across a system that it is used in.\n *\n * Recommended:\n * If you are creating reusable libraries/packages for people, we recommend using the name of the package itself.\n * Example: \"@my-scoped-package/name\"\n *\n * If you are creating this model to be used locally, just use the \"app\" name that the model corresponds to.\n * Example: \"auth\"\n *\n * The namespace is also used in the auto-generation of {@link RestInfo.endpoint}. If you want to design the endpoint so that it looks/reads/flows better then consider overriding the endpoint yourself.\n */\n namespace: string\n /**\n * The properties that make up the model.\n */\n properties: PropertiesList<Required<TData>>\n /**\n * The name of the property that has the unique id for the model. Used to uniquely identify instances of this model vs other ones.\n */\n primaryKeyName: string\n /**\n * Validators of the overall model (rather than properties)\n */\n modelValidators: readonly ModelValidatorComponent<TData>[]\n /**\n * The name for a model/instance where there is one of them.\n */\n singularName: string\n /**\n * A text used for displaying the name of the model in a UI.\n */\n displayName: string\n /**\n * A helpful human-readable description that explains what the model is and what it is used for.\n */\n description: string\n /**\n * The raw api information provided in. When looking for a fleshed out version of this data\n * look at {@link ModelType.getApiInfo}\n */\n api?: Partial<ApiInfoPartialRest>\n /**\n * A zod schema for the model.\n */\n schema: ZodObject<DataDescription>\n}>\n\n/**\n * The most minimum information needed to create a model.\n * @interface\n */\ntype MinimalModelDefinition<TData extends DataDescription> = Partial<\n ModelDefinition<TData>\n> & {\n namespace: string\n pluralName: string\n properties: PropertiesList<Required<TData>>\n}\n\n/**\n * Represents a Model. A Model creates instances (ModelInstance) as well as describes generally about the data. (ModelDefinition).\n * @typeParam TData - The type of data\n * @typeParam TModelExtensions - Extensions on the model.\n * @typeParam TModelInstanceExtensions - Extensions on the instances produced by this model.\n * @interface\n */\ntype ModelType<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * This is a unique name combining namespace + pluralName. This can be used as a key to uniquely identify\n * this model across an entire system.\n * Example:\n * pluralName=MyModels\n * namespace=@my-package/namespace\n *\n * Return: '@my-package/namespace/MyModels'\n */\n getName: () => string\n /**\n * Gets the metadata that describes the model.\n */\n getModelDefinition: () => ModelDefinition<TData>\n /**\n * Gets the primary key of instance data. This helpful method shortcuts having to figure out the primaryKey's name\n * and then reaching inside the instance data to get the primary key.\n * @param instanceData The underlying instance data that has the primary key.\n */\n getPrimaryKey: (instanceData: TData | ToObjectResult<TData>) => PrimaryKeyType\n /**\n * Gets the Api Information on the model.\n *\n * This will take what is manually provided via the ModelDefinition and autopopulate everything that is possible\n * with default values, or values that make sense based on the ApiInformation provided.\n */\n getApiInfo: () => Required<ApiInfo>\n /**\n * Creates an instance of this model with the data that is provided.\n *\n * @typeParam IgnorePrimaryKey - One or more properties to ignore type restrictions on. This is extremely useful for primaryKeys that have not been created yet, or other generated properties (that are required instead of optional).\n * @param data - The data that makes up an instance of the model.\n * NOTE: A tradeoff was made between supporting the DataDescription vs a ToObjectReturn<DataDescription>. One or the other could be supported, but not both.\n * In order to support executing create() while passing in data that comes from \".toObj()\" we recommend using that case feature of toObj().\n */\n create: <IgnoreProperties extends string = ''>(\n data: CreateParams<TData, IgnoreProperties>\n ) => ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n}> &\n TModelExtensions\n\n/**\n * A function that can provide a model reference.\n */\ntype ModelReferenceFunctions = Record<string, () => Maybe<PrimaryKeyType>>\n\n/**\n * Records of Property name to Validator.\n */\ntype PropertyValidators<TData extends DataDescription> = Readonly<\n Record<string, PropertyValidator<TData>>\n>\n\n/**\n * An instance of a Model. This \"wrapper\" fully embodies the power of the framework, and provides the most enrichment of a single piece of a data possible.\n * @typeParam TData - The type of data\n * @typeParam TModelExtensions - Extensions on the overall model.\n * @typeParam TModelInstanceExtensions - Extensions on all instances of a model.\n * @interface\n */\ntype ModelInstance<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Gets the value of individual properties on the instance.\n * These are memoized.\n */\n get: PropertyGetters<TData>\n /**\n * Gets all model references that this instance may have as record of property name to function getter.\n *\n */\n getReferences: () => ModelReferenceFunctions\n /**\n * Gets a basic representation of the data.\n * This function is memoized.\n */\n toObj: ToObjectFunction<TData>\n /**\n * Gets the primary key of the instance (without having to know the primary key name).\n */\n getPrimaryKey: () => PrimaryKeyType\n /**\n * Gets the validators for this model instance.\n */\n getValidators: () => PropertyValidators<TData>\n /**\n * Runs validation against this instance.\n * This function is memoized.\n * @param options\n */\n validate: (options?: object) => Promise<ModelErrors<TData> | undefined>\n /**\n * Gets the model that backs this instance.\n */\n getModel: () => ModelType<TData, TModelExtensions, TModelInstanceExtensions>\n}> &\n TModelInstanceExtensions\n\n/**\n * A callback function for receiving when a new model has been created.\n * @param instance - A newly created model instance.\n */\ntype ModelCreatedCallback<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = (\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => void\n\n/**\n * Options to pass into model generation.\n * @interface\n */\ntype ModelFactoryOptions<\n TData extends DataDescription,\n TModelFactoryOptionsExtensions extends object = object,\n> = Record<string, any> &\n Readonly<{\n /**\n * 1 or more (array) of callback functions for when models get created.\n */\n instanceCreatedCallback?: Arrayable<ModelCreatedCallback<TData>>\n }> &\n TModelFactoryOptionsExtensions\n\n/**\n * A function that can calculate a denormalized value. This is very useful for property values that have very complicated and often expensive calculations (but should be calculated once).\n * NOTE: The data that comes in (to be normalized) via the modelData, is the raw data passed into create(). If other functions must fire to create values, they will not be present. Example: Foreign keys.\n * @param modelData - The model's data as it was passed into the create() function.\n * @param modelInstance - The instance that the model corresponds with\n */\ntype CalculateDenormalization<\n TValue extends CanBeNullableType<DataValue>,\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = (\n modelData: CreateParams<TData>,\n modelInstance: ModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n) => MaybePromise<TValue | undefined>\n\n/**\n * Higher level value types that describe what the value of a property is.\n * These values can be used to generate expressive APIs as well as GUI elements.\n */\nenum PropertyType {\n UniqueId = 'UniqueId',\n Date = 'Date',\n Datetime = 'Datetime',\n Array = 'Array',\n ModelReference = 'ModelReference',\n Integer = 'Integer',\n Text = 'Text',\n BigText = 'BigText',\n Number = 'Number',\n Object = 'Object',\n Email = 'Email',\n Boolean = 'Boolean',\n}\n\n/**\n * The most primitive data types that can be used.\n */\nenum PrimitiveValueType {\n boolean = 'boolean',\n string = 'string',\n object = 'object',\n number = 'number',\n integer = 'integer',\n}\n\n/**\n * Dates can either be a Date or a string\n */\ntype DateValueType = Date | string\n\n/**\n * A useful type for setting the props object of a Model constructor.\n */\ntype ModelConstructorProps = Readonly<{\n Model: ModelFactory\n}>\n\n/**\n * A useful type for setting the props object of a Model constructor that has model references that need a fetcher\n */\ntype ModelWithReferencesConstructorProps = ModelConstructorProps &\n Readonly<{\n fetcher: ModelInstanceFetcher\n }>\n\nexport {\n PrimitiveValueType,\n PropertyType,\n MaybeFunction,\n Maybe,\n MaybePromise,\n Nullable,\n Arrayable,\n JsonAble,\n ToObjectFunction,\n ToObjectResult,\n ModelInstance,\n ModelType,\n PropertyValidatorComponent,\n PropertyValidatorComponentSync,\n PropertyValidatorComponentAsync,\n PropertyValidator,\n ModelValidatorComponent,\n PropertyInstance,\n PropertyConfig,\n DataValue,\n ValueGetter,\n ModelReferenceType,\n ModelDefinition,\n ModelFactoryOptions,\n ModelReferencePropertyInstance,\n PropertyGetters,\n PropertyValidators,\n PropertyValidatorComponentTypeAdvanced,\n DataDescription,\n ModelReferenceFunctions,\n ModelErrors,\n PrimaryKeyType,\n ModelFactory,\n ModelInstanceFetcher,\n CreateParams,\n ValidatorContext,\n ValuePropertyValidatorComponent,\n ValidationErrors,\n ComponentValidationErrorResponse,\n JsonifiedData,\n JsonObj,\n CalculateDenormalization,\n PropertiesList,\n MinimalModelDefinition,\n ChoiceTypes,\n PropertyConfigOptions,\n CommonValidators,\n DateValueType,\n ApiInfo,\n RestInfo,\n ApiMethod,\n RemovePromises,\n FlattenModelReferences,\n ApiInfoPartialRest,\n RestInfoMinimum,\n ModelConstructorProps,\n ModelWithReferencesConstructorProps,\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAonBA,IAAK,YAAL,kBAAKA,eAAL;AACE,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AALN,SAAAA;AAAA,GAAA;AA8TL,IAAK,eAAL,kBAAKC,kBAAL;AACE,EAAAA,cAAA,cAAW;AACX,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,cAAW;AACX,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,oBAAiB;AACjB,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AAZP,SAAAA;AAAA,GAAA;AAkBL,IAAK,qBAAL,kBAAKC,wBAAL;AACE,EAAAA,oBAAA,aAAU;AACV,EAAAA,oBAAA,YAAS;AACT,EAAAA,oBAAA,YAAS;AACT,EAAAA,oBAAA,YAAS;AACT,EAAAA,oBAAA,aAAU;AALP,SAAAA;AAAA,GAAA;",
6
+ "names": ["ApiMethod", "PropertyType", "PrimitiveValueType"]
7
+ }
package/cjs/utils.cjs ADDED
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/utils.ts
31
+ var utils_exports = {};
32
+ __export(utils_exports, {
33
+ createHeadAndTail: () => createHeadAndTail,
34
+ createUuid: () => createUuid,
35
+ flowFindFirst: () => flowFindFirst,
36
+ getRandomValues: () => getRandomValues,
37
+ isPromise: () => isPromise,
38
+ loweredTitleCase: () => loweredTitleCase,
39
+ memoizeAsync: () => memoizeAsync,
40
+ memoizeSync: () => memoizeSync,
41
+ singularize: () => singularize,
42
+ toTitleCase: () => toTitleCase
43
+ });
44
+ module.exports = __toCommonJS(utils_exports);
45
+ var import_async_lock = __toESM(require("async-lock"), 1);
46
+
47
+ // node_modules/uuid/dist-node/stringify.js
48
+ var byteToHex = [];
49
+ for (let i = 0; i < 256; ++i) {
50
+ byteToHex.push((i + 256).toString(16).slice(1));
51
+ }
52
+ function unsafeStringify(arr, offset = 0) {
53
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
54
+ }
55
+
56
+ // node_modules/uuid/dist-node/rng.js
57
+ var rnds8 = new Uint8Array(16);
58
+ function rng() {
59
+ return crypto.getRandomValues(rnds8);
60
+ }
61
+
62
+ // node_modules/uuid/dist-node/v4.js
63
+ function v4(options, buf, offset) {
64
+ if (!buf && !options && crypto.randomUUID) {
65
+ return crypto.randomUUID();
66
+ }
67
+ return _v4(options, buf, offset);
68
+ }
69
+ function _v4(options, buf, offset) {
70
+ options = options || {};
71
+ const rnds = options.random ?? options.rng?.() ?? rng();
72
+ if (rnds.length < 16) {
73
+ throw new Error("Random bytes length must be >= 16");
74
+ }
75
+ rnds[6] = rnds[6] & 15 | 64;
76
+ rnds[8] = rnds[8] & 63 | 128;
77
+ if (buf) {
78
+ offset = offset || 0;
79
+ if (offset < 0 || offset + 16 > buf.length) {
80
+ throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
81
+ }
82
+ for (let i = 0; i < 16; ++i) {
83
+ buf[offset + i] = rnds[i];
84
+ }
85
+ return buf;
86
+ }
87
+ return unsafeStringify(rnds);
88
+ }
89
+ var v4_default = v4;
90
+
91
+ // src/utils.ts
92
+ var import_get_random_values = __toESM(require("get-random-values"), 1);
93
+ var getRandomValues = () => {
94
+ const array = new Uint8Array(1);
95
+ if (typeof window !== "undefined") {
96
+ if (window.crypto) {
97
+ return window.crypto.getRandomValues(array);
98
+ }
99
+ if (window.msCrypto) {
100
+ return window.msCrypto.getRandomValues(array);
101
+ }
102
+ }
103
+ return (0, import_get_random_values.default)(array);
104
+ };
105
+ var toTitleCase = (string) => {
106
+ return `${string.slice(0, 1).toUpperCase()}${string.slice(1)}`;
107
+ };
108
+ var loweredTitleCase = (string) => {
109
+ return `${string.slice(0, 1).toLowerCase()}${string.slice(1)}`;
110
+ };
111
+ var isPromise = (something) => {
112
+ if (something?.then) {
113
+ return true;
114
+ }
115
+ return false;
116
+ };
117
+ var PluralEndings = /* @__PURE__ */ ((PluralEndings2) => {
118
+ PluralEndings2["ves"] = "fe";
119
+ PluralEndings2["ies"] = "y";
120
+ PluralEndings2["i"] = "us";
121
+ PluralEndings2["zes"] = "ze";
122
+ PluralEndings2["ses"] = "s";
123
+ PluralEndings2["es"] = "e";
124
+ PluralEndings2["s"] = "";
125
+ return PluralEndings2;
126
+ })(PluralEndings || {});
127
+ var _singularizingRe = new RegExp(
128
+ `(${Object.keys(PluralEndings).join("|")})$`,
129
+ "u"
130
+ );
131
+ var singularize = (word) => {
132
+ return word.replace(_singularizingRe, (r) => PluralEndings[r]);
133
+ };
134
+ var createHeadAndTail = (values, joiner) => {
135
+ const head = values[0];
136
+ const tail = values.slice(1).join(joiner);
137
+ return [head, tail];
138
+ };
139
+ var flowFindFirst = (funcs) => (input) => {
140
+ return funcs.reduce((acc, func) => {
141
+ if (acc) {
142
+ return acc;
143
+ }
144
+ return func(input);
145
+ }, void 0);
146
+ };
147
+ var memoizeSync = (method) => {
148
+ let value = void 0;
149
+ let called = false;
150
+ return (...args) => {
151
+ if (!called) {
152
+ called = true;
153
+ value = method(...args);
154
+ }
155
+ return value;
156
+ };
157
+ };
158
+ var memoizeAsync = (method) => {
159
+ const key = v4_default();
160
+ const lock = new import_async_lock.default();
161
+ let value = void 0;
162
+ let called = false;
163
+ return async (...args) => {
164
+ return lock.acquire(key, async () => {
165
+ if (!called) {
166
+ called = true;
167
+ value = await method(...args);
168
+ }
169
+ return value;
170
+ });
171
+ };
172
+ };
173
+ var createUuid = v4_default;
174
+ // Annotate the CommonJS export names for ESM import in node:
175
+ 0 && (module.exports = {
176
+ createHeadAndTail,
177
+ createUuid,
178
+ flowFindFirst,
179
+ getRandomValues,
180
+ isPromise,
181
+ loweredTitleCase,
182
+ memoizeAsync,
183
+ memoizeSync,
184
+ singularize,
185
+ toTitleCase
186
+ });
187
+ //# sourceMappingURL=utils.cjs.map