{
  "version": 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"],
  "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"],
  "mappings": "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",
  "names": ["import_merge", "import_get", "PluralEndings", "AsyncLock", "flow", "isEmpty", "value", "flatMap", "import_merge", "import_get", "get", "kebabCase", "choices", "flow", "isDate", "merge", "get", "model", "value"]
}
