@burnsred/entity 0.6.6 → 1.0.1

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 (105) hide show
  1. package/README.md +174 -1
  2. package/dist/cleaner/as-boolean.d.ts +7 -0
  3. package/dist/cleaner/as-boolean.js +10 -0
  4. package/dist/cleaner/as-boolean.js.map +1 -0
  5. package/dist/cleaner/as-date.d.ts +1 -0
  6. package/dist/cleaner/as-date.js +5 -0
  7. package/dist/cleaner/as-date.js.map +1 -0
  8. package/dist/cleaner/as-integer.d.ts +1 -0
  9. package/dist/cleaner/as-integer.js +5 -0
  10. package/dist/cleaner/as-integer.js.map +1 -0
  11. package/dist/cleaner/as-number.d.ts +1 -0
  12. package/dist/cleaner/as-number.js +5 -0
  13. package/dist/cleaner/as-number.js.map +1 -0
  14. package/dist/cleaner/as-string.d.ts +1 -0
  15. package/dist/cleaner/as-string.js +4 -0
  16. package/dist/cleaner/as-string.js.map +1 -0
  17. package/dist/cleaner/collapse-spaces.d.ts +4 -0
  18. package/dist/cleaner/collapse-spaces.js +7 -0
  19. package/dist/cleaner/collapse-spaces.js.map +1 -0
  20. package/dist/cleaner/index.d.ts +7 -0
  21. package/dist/cleaner/index.js +8 -0
  22. package/dist/cleaner/index.js.map +1 -0
  23. package/dist/cleaner/trim.d.ts +1 -0
  24. package/dist/cleaner/trim.js +4 -0
  25. package/dist/cleaner/trim.js.map +1 -0
  26. package/dist/entity/Entity.d.ts +20 -0
  27. package/dist/entity/Entity.js +63 -0
  28. package/dist/entity/Entity.js.map +1 -0
  29. package/dist/entity/index.d.ts +8 -0
  30. package/dist/entity/index.js +9 -0
  31. package/dist/entity/index.js.map +1 -0
  32. package/dist/field/BooleanField.d.ts +7 -0
  33. package/dist/field/BooleanField.js +8 -0
  34. package/dist/field/BooleanField.js.map +1 -0
  35. package/dist/field/CharField.d.ts +7 -0
  36. package/dist/field/CharField.js +8 -0
  37. package/dist/field/CharField.js.map +1 -0
  38. package/dist/field/DateField.d.ts +9 -0
  39. package/dist/field/DateField.js +19 -0
  40. package/dist/field/DateField.js.map +1 -0
  41. package/dist/field/DateTimeField.d.ts +9 -0
  42. package/dist/field/DateTimeField.js +14 -0
  43. package/dist/field/DateTimeField.js.map +1 -0
  44. package/dist/field/EntityField.d.ts +24 -0
  45. package/dist/field/EntityField.js +63 -0
  46. package/dist/field/EntityField.js.map +1 -0
  47. package/dist/field/Field.d.ts +42 -0
  48. package/dist/field/Field.js +97 -0
  49. package/dist/field/Field.js.map +1 -0
  50. package/dist/field/IdField.d.ts +15 -0
  51. package/dist/field/IdField.js +23 -0
  52. package/dist/field/IdField.js.map +1 -0
  53. package/dist/field/IntegerField.d.ts +6 -0
  54. package/dist/field/IntegerField.js +9 -0
  55. package/dist/field/IntegerField.js.map +1 -0
  56. package/dist/field/NumberField.d.ts +7 -0
  57. package/dist/field/NumberField.js +8 -0
  58. package/dist/field/NumberField.js.map +1 -0
  59. package/dist/field/TextField.d.ts +4 -0
  60. package/dist/field/TextField.js +5 -0
  61. package/dist/field/TextField.js.map +1 -0
  62. package/dist/field/index.d.ts +68 -0
  63. package/dist/field/index.js +12 -0
  64. package/dist/field/index.js.map +1 -0
  65. package/dist/index.d.ts +67 -0
  66. package/dist/index.js +5 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/validator/entity-valid.d.ts +9 -0
  69. package/dist/validator/entity-valid.js +12 -0
  70. package/dist/validator/entity-valid.js.map +1 -0
  71. package/dist/validator/index.d.ts +2 -0
  72. package/dist/validator/index.js +3 -0
  73. package/dist/validator/index.js.map +1 -0
  74. package/dist/validator/value-range.d.ts +8 -0
  75. package/dist/validator/value-range.js +24 -0
  76. package/dist/validator/value-range.js.map +1 -0
  77. package/package.json +21 -37
  78. package/CHANGELOG.md +0 -116
  79. package/LICENSE +0 -21
  80. package/dist/development.js +0 -1377
  81. package/dist/development.js.map +0 -1
  82. package/dist/entity/src/cleaner/remove-multi-space.test.d.ts +0 -1
  83. package/dist/entity/src/cleaner/slice-to-max-length.test.d.ts +0 -1
  84. package/dist/entity/src/entity/entity.test.d.ts +0 -1
  85. package/dist/entity/src/entity/sample-todo-entity.d.ts +0 -19
  86. package/dist/entity/src/entity/sample-useQuery.d.ts +0 -1
  87. package/dist/entity/src/field/field-any.test.d.ts +0 -1
  88. package/dist/entity/src/field/field-boolean.test.d.ts +0 -1
  89. package/dist/entity/src/field/field-char.test.d.ts +0 -1
  90. package/dist/entity/src/field/field-date.test.d.ts +0 -1
  91. package/dist/entity/src/field/field-datetime.test.d.ts +0 -1
  92. package/dist/entity/src/field/field-entity.test.d.ts +0 -1
  93. package/dist/entity/src/field/field-enum.test.d.ts +0 -1
  94. package/dist/entity/src/field/field-id.test.d.ts +0 -1
  95. package/dist/entity/src/field/field-integer.test.d.ts +0 -1
  96. package/dist/entity/src/field/field-number.test.d.ts +0 -1
  97. package/dist/entity/src/field/field-text.test.d.ts +0 -1
  98. package/dist/entity/src/field/field.test.d.ts +0 -1
  99. package/dist/entity/src/types.d.ts +0 -223
  100. package/dist/entity/src/validator/allow-blank.test.d.ts +0 -1
  101. package/dist/entity/src/validator/is-required.test.d.ts +0 -1
  102. package/dist/entity/src/validator/may-not-be-blank.test.d.ts +0 -1
  103. package/dist/legacy.js +0 -30
  104. package/dist/production.min.js +0 -1
  105. package/dist/production.min.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"production.min.js","sources":["../src/cleaner/remove-multi-space.js","../src/cleaner/slice-to-max-length.js","../src/validator/allow-blank.js","../src/validator/entity-valid.js","../src/validator/is-required.js","../src/validator/is-required-if.js","../src/validator/list.js","../src/validator/may-not-be-blank.js","../src/field/field.js","../src/field/field-any.js","../src/field/field-boolean.js","../src/field/field-char.js","../src/field/field-date.js","../src/field/field-datetime.js","../src/field/field-entity.js","../src/field/field-id.js","../src/entity/entity.js","../src/entity/entity-locale.js","../src/entity/entity-enum.js","../src/field/field-enum.js","../src/field/field-number.js","../src/field/field-integer.js","../src/field/field-text.js","../src/entity/entity-filter.js","../src/entity/entity-title.js"],"sourcesContent":["import { isString } from 'es-toolkit';\n\nexport default (value) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!isString(value))\n throw new Error(\n 'cleaners.removeMultiSpace: value must be of type string',\n );\n }\n\n return value.replace(/\\s\\s+/g, ' ');\n};\n","import { isString } from 'es-toolkit';\n\nexport default (value, { field }) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!isString(value))\n throw new Error(\n 'cleaners.removeMultiSpace: value must be of type string',\n );\n }\n\n return field.maxLength ? value.slice(0, field.maxLength) : value;\n};\n","/**\n * @typedef {import('../types').Validator} Validator\n */\n\n/** @type {Validator} A no-op validator that always passes. Replaces `isRequired` on blank fields. */\nexport default () => false;\n","/**\n * @typedef {import('../types').Validator} Validator\n */\n\n/** @type {Validator} Delegates validation to the referenced entity's `validate` method. */\nexport default (value, options = {}) => {\n const errors = options.field.entity.validate(value, options);\n\n return !!errors && errors.size > 0 && errors;\n};\n","/**\n * @typedef {import('../types').Validator} Validator\n */\n\n/** @type {Validator} Returns `'May not be blank'` when the field considers the value blank. */\nexport default (value, configs = {}) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!configs.field)\n throw new Error('validators.isRequired: \"field\" option is required');\n }\n\n return configs.field.isBlank(value, configs) && 'May not be blank';\n};\n","import { isFunction } from 'es-toolkit';\n\nimport isRequired from './is-required';\n\n/**\n * @typedef {import('../types').Validator} Validator\n */\n\n/**\n * Higher-order validator: requires the field only when `predicate` returns true.\n *\n * @param {(context: object) => boolean} predicate\n * @returns {Validator}\n */\nexport default (predicate) => (value, configs) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!isFunction(predicate))\n throw new Error(\n 'validators.isRequiredIf: predicate argument must be of type function',\n );\n }\n\n return predicate({ value, ...configs }) && isRequired(value, configs);\n};\n","import { List, Map } from 'immutable';\n\n/**\n * @typedef {import('../types').Validator} Validator\n */\n\n/**\n * Higher-order validator: applies a set of validators to each item in a List.\n * Returns a Map with per-item errors when any item fails.\n *\n * @param {Validator[]} validators\n * @returns {Validator}\n */\nexport default (validators) => (/** @type {any} */ values, configs) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!List.isList(values))\n throw new Error('validators.list: \"values\" must be a list');\n }\n\n const errors = values.map((value) =>\n List(validators)\n .map((validator) => validator(value, configs))\n .filter((error) => error),\n );\n\n return (\n errors.some((error) => error.size > 0) &&\n Map({\n errors,\n list: true,\n message: 'Invalid list',\n })\n );\n};\n","import isRequired from './is-required';\n\n/**\n * @typedef {import('../types').Validator} Validator\n */\n\n/**\n * @type {Validator}\n * Validates that the field is not blank, respecting optional flag overrides.\n * Falls back to `isRequired` when the field is not blank-able.\n */\nexport default (value, configs = {}) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!configs.field)\n throw new Error('validator.mayNotBeBlank: \"field\" option is required');\n }\n\n const validator =\n configs.flag && configs.field.flags[/** @type {string} */ (configs.flag)];\n\n const defaultError = !configs.field.blank && isRequired(value, configs);\n\n if (!validator) return defaultError;\n\n const flagError = validator(value, configs);\n\n return defaultError\n ? flagError && defaultError\n : flagError && 'May not be blank';\n};\n","import { isFunction } from 'es-toolkit';\nimport { fromJS, isImmutable, List, Map } from 'immutable';\n\nimport isRequired from '../validator/is-required';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n * @typedef {import('../types').FieldCleanOptions} FieldCleanOptions\n * @typedef {import('../types').ValidateOptions} ValidateOptions\n * @typedef {import('../types').Validator} Validator\n * @typedef {import('../types').FieldCleaner} FieldCleaner\n */\n\n/**\n * Base class for all field types.\n *\n * A Field describes a single attribute on an Entity — how to convert it\n * between API data and Immutable values, validate it, and display it.\n *\n * Constructor options are merged onto `this` via `Object.assign`, so every\n * key in {@link FieldOptions} becomes an instance property.\n */\nexport default class Field {\n // Properties set via Object.assign in the constructor.\n // Declared here so TypeScript can see them on instances.\n\n /** @type {boolean} */\n blank = false;\n /** @type {FieldCleaner[]} */\n cleaners = [];\n /** @type {boolean} */\n many = false;\n /** @type {Validator[]} */\n validators = [];\n /** @type {import('immutable').List<unknown> | undefined} */\n options;\n /** @type {string | undefined} */\n mock;\n /** @type {unknown[] | undefined} */\n mockConfigs;\n /** @type {boolean | undefined} */\n local;\n /** @type {string | undefined} */\n type;\n\n // Subclass-specific properties also set via Object.assign.\n // Declared on base so subclass field initializers don't overwrite them.\n\n /** @type {any} Entity class (EntityField). */\n entity;\n /** @type {boolean | undefined} Whether this is a nested relationship (EntityField). */\n nested;\n /** @type {string | undefined} Date format string (DateField). */\n dateFormat;\n /** @type {boolean | undefined} Whether time is allowed (DateField). */\n allowTime;\n\n /**\n * Create a new Field.\n *\n * @param {FieldOptions} options\n */\n constructor(options = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (options.options && !List.isList(options.options))\n throw new Error(\n `Field.constructor (${this.constructor.name}): options.options must be a an immutable List`,\n );\n if (\n options.options &&\n options.options.size !== options.options.toSet().size\n )\n throw new Error(\n `Field.constructor (${this.constructor.name}): options.options must have unique items.`,\n );\n }\n\n const defaults = {\n blank: false,\n cleaners: [],\n many: false,\n validators: options.blank ? [] : [isRequired],\n };\n\n Object.assign(this, defaults, options, {\n validators: isFunction(options.validators)\n ? options.validators(defaults.validators)\n : options.validators || defaults.validators,\n });\n }\n\n /**\n * Run the field's cleaners against a value.\n *\n * @param {unknown} record — the value to clean\n * @param {FieldCleanOptions} configs\n * @returns {unknown} the cleaned value\n */\n clean(record, configs = {}) {\n const newOptions = { ...configs, field: this };\n\n return this.cleaners.reduce(\n (prev, cleaner) => cleaner(prev, newOptions),\n record,\n );\n }\n\n /**\n * Convert raw API data into an Immutable value.\n *\n * @param {unknown} data — raw data from the API response\n * @param {object} [context] - extra context passed by Entity.dataToRecord\n * @returns {unknown} Immutable-compatible value\n */\n dataToValue(data, context) {\n return fromJS(data);\n }\n\n /**\n * Return the default value for this field.\n *\n * @returns {any}\n */\n default() {\n return this.many ? List() : null;\n }\n\n /**\n * Extract this field's errors from the entity error structure.\n * Base Field does not support nested name lookups — see EntityField.\n *\n * @param {List} errors — the full error list for this field\n * @param {{ name?: string }} configs\n * @returns {List}\n */\n getErrors(errors, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (configs.name)\n throw new Error(\n `Field.getErrors (${this.constructor.name}): option \"name\" is not supported.`,\n );\n }\n\n return errors;\n }\n\n /**\n * Extract errors for a specific index in a `many` field's List.\n *\n * @param {List} errors — the full error list\n * @param {{ index?: number }} options\n * @returns {List}\n */\n getErrorsArray(errors, options = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (options.index === undefined)\n throw new Error(\n `Field.getErrorsArray (${this.constructor.name}): option \"index\" is required.`,\n );\n }\n\n return errors\n .filter((error) => Map.isMap(error) && error.get('list'))\n .flatMap((error) => error.getIn(['errors', options.index]));\n }\n\n /**\n * Resolve the Field instance for a given name.\n * Base Field returns itself (does not support nested lookup — see EntityField).\n *\n * @param {{ name?: string }} options\n * @returns {Field | null}\n */\n getField(options = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (options.name)\n throw new Error(\n `Field.getField (${this.constructor.name}): method with option name is not supported.`,\n );\n }\n\n return options.name ? null : this;\n }\n\n /**\n * Get the ID of a value. Not supported on base Field -- see EntityField.\n *\n * @param {any} [_value]\n * @param {object} [_configs]\n * @returns {any}\n */\n getId(_value, _configs) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n `Field.getId (${this.constructor.name}): method is not supported.`,\n );\n }\n }\n\n /**\n * Get a key suitable for React list rendering.\n *\n * @param {unknown} value\n * @returns {string}\n */\n getKey(value) {\n return this.toString(value);\n }\n\n /**\n * Return the selectable options for this field (e.g. for dropdowns).\n *\n * @returns {List}\n */\n getOptions() {\n return this.options || List();\n }\n\n /**\n * Extract this field's value from a record.\n * Base Field returns the value directly (does not support nested lookup — see EntityField).\n *\n * @param {unknown} value\n * @param {{ name?: string }} options\n * @returns {unknown}\n */\n getValue(value, options = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (options.name)\n throw new Error(\n `Field.getValue (${this.constructor.name}): option \"name\" is not supported.`,\n );\n }\n\n return options.name ? null : value;\n }\n\n /**\n * Check whether the value is considered blank/empty.\n *\n * @param {any} value\n * @param {{ name?: string }} options\n * @returns {boolean}\n */\n isBlank(value = null, options = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (options.name)\n throw new Error(\n `Field.isBlank (${this.constructor.name}): method with option name is not supported.`,\n );\n }\n\n return value === null || (this.many ? value.size === 0 : value === '');\n }\n\n /**\n * Convert an Immutable value back to plain JS for API submission.\n *\n * @param {unknown} value\n * @param {object} [context] - extra context passed by Entity.toData\n * @returns {unknown}\n */\n toData(value, context) {\n return isImmutable(value) ? value.toJS() : value;\n }\n\n /**\n * Convert a value to a URL query-parameter string.\n *\n * @param {any} value\n * @returns {string}\n */\n toParams(value) {\n return (value && value.toString()) || '';\n }\n\n /**\n * Convert a value to its display string.\n *\n * @param {any} value\n * @returns {string}\n */\n toString(value = null) {\n return value === null ? '' : value.toString();\n }\n\n /**\n * Run the field's validators against a value and return a List of error strings.\n *\n * @param {unknown} value\n * @param {Partial<ValidateOptions>} options\n * @returns {import('immutable').List} error messages (empty if valid)\n */\n validate(value, options = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this.many && !List.isList(value))\n throw new Error(\n `Field.validate (${this.constructor.name}-${options.fieldName}): \"value\" must be an \"Immutable List\" with field option \"many\"`,\n );\n }\n\n const validators = isFunction(options.validators)\n ? options.validators(this.validators)\n : options.validators || this.validators;\n\n return List(validators)\n .map((validator) => validator(value, { ...options, field: this }))\n .filter((error) => error);\n }\n}\n","import Field from './field';\n\n/**\n * Generic field with no special behaviour.\n * Serves as the direct base for most concrete field types.\n */\nexport default class AnyField extends Field {}\n","import AnyField from './field-any';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n */\n\n/** A field that stores boolean values. */\nexport default class BooleanField extends AnyField {\n /** @param {FieldOptions} configs */\n constructor(configs = {}) {\n super({ type: 'boolean', ...configs });\n }\n}\n","import { List } from 'immutable';\n\nimport AnyField from './field-any';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n */\n\n/** A field that stores short string values. */\nexport default class CharField extends AnyField {\n /** @param {FieldOptions} configs */\n constructor(configs = {}) {\n super({ type: 'char', ...configs });\n }\n\n /** @returns {List | string} */\n default() {\n return this.many ? List() : '';\n }\n}\n","import moment from 'moment';\n\nimport AnyField from './field-any';\n\n/**\n * @typedef {import('../types').DateFieldOptions} DateFieldOptions\n */\n\n/** A field for date values, backed by Moment.js. */\nexport default class DateField extends AnyField {\n /** @param {DateFieldOptions} configs */\n constructor(configs = {}) {\n super({\n allowTime: false,\n dateFormat: 'YYYY-MM-DD',\n type: 'date',\n ...configs,\n });\n }\n\n /**\n * Parse raw data into a Moment instance.\n *\n * @param {any} data\n * @returns {any}\n */\n dataToValue(data) {\n return data && moment(data);\n }\n\n /**\n * Format a Moment value back to a date string for the API.\n *\n * @param {moment.Moment | null} value\n * @returns {string | null}\n */\n toData(value) {\n return value && value.format(this.dateFormat);\n }\n\n /**\n * @param {moment.Moment | null} value\n * @returns {string}\n */\n toParams(value) {\n return (value && value.format(this.dateFormat)) || '';\n }\n\n /**\n * @param {moment.Moment | null} value\n * @returns {string}\n */\n toString(value) {\n return (value && value.format(this.dateFormat)) || '';\n }\n}\n","import DateField from './field-date';\n\n/**\n * @typedef {import('../types').DateFieldOptions} DateFieldOptions\n */\n\n/** A date field that includes a time component. */\nexport default class DateTimeField extends DateField {\n /** @param {DateFieldOptions} configs */\n constructor(configs = {}) {\n super({\n dateFormat: 'YYYY-MM-DD HH:mm',\n allowTime: true,\n ...configs,\n });\n }\n}\n","import { isFunction, isString } from 'es-toolkit';\nimport { List, Map } from 'immutable';\n\nimport AnyField from './field-any';\nimport entityValid from '../validator/entity-valid';\nimport list from '../validator/list';\n\n/**\n * @typedef {import('../types').EntityFieldOptions} EntityFieldOptions\n */\n\n/**\n * A field that references another Entity (a foreign-key / nested relationship).\n *\n * Unlike base Field, EntityField supports nested name lookups in\n * `getField`, `getErrors`, `getValue`, `getId`, and `isBlank`.\n */\nexport default class EntityField extends AnyField {\n /** @param {Partial<EntityFieldOptions>} configs -- requires `entity` */\n constructor(configs = {}) {\n const defaults = {\n nested: true,\n type: 'entity',\n };\n\n const entityValidators = configs.many\n ? [list([entityValid])]\n : [entityValid];\n\n super(\n Object.assign(defaults, configs, {\n validators: (defaultValidators) =>\n isFunction(configs.validators)\n ? configs.validators(defaultValidators.concat(entityValidators))\n : configs.validators || defaultValidators.concat(entityValidators),\n }),\n );\n\n if (process.env.NODE_ENV !== 'production') {\n if (!configs.entity)\n throw new Error(\n `${this.constructor.name}.constructor: \"entity\" option is required`,\n );\n }\n }\n\n /**\n * Convert raw API data into an entity record via the referenced Entity.\n *\n * @param {object | null} data\n * @returns {import('immutable').Map<string, unknown> | null}\n */\n dataToValue(data) {\n return this.entity.dataToRecord(data);\n }\n\n /** @returns {List | import('immutable').Map<string, unknown> | null} */\n default() {\n if (this.many) return List();\n\n return this.blank ? null : this.entity.dataToRecord({});\n }\n\n /**\n * Extract errors, optionally drilling into a nested field by name.\n *\n * @param {List} errors\n * @param {{ name?: string }} configs\n * @returns {List}\n */\n getErrors(errors, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (configs.name && !isString(configs.name))\n throw new Error(\n `EntityField.getErrors (${this.entity.name}): \"name\" option must be either a string or undefined`,\n );\n if (configs.name && !this.entity.fields[configs.name])\n throw new Error(\n `EntityField.getErrors (${this.entity.name}): field \"${configs.name}\" not found`,\n );\n }\n\n return configs.name\n ? errors\n .filter((error) => Map.isMap(error) && error.get('detail'))\n .flatMap((error) =>\n Map.isMap(error.getIn(['errors', configs.name]))\n ? List([error.getIn(['errors', configs.name])])\n : error.getIn(['errors', configs.name]),\n )\n .filter((error) => error)\n : errors;\n }\n\n /**\n * Resolve a nested Field by name, or return this EntityField.\n *\n * @param {{ name?: string, [key: string]: unknown }} configs\n * @returns {any}\n */\n getField(configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (configs.name && !isString(configs.name))\n throw new Error(\n `EntityField.getField (${this.entity.name}): \"name\" option must be either a string or undefined`,\n );\n if (configs.name && !this.entity.fields[configs.name])\n throw new Error(\n `EntityField.getField (${this.entity.name}): field \"${configs.name}\" not found`,\n );\n }\n\n return configs.name ? this.entity.fields[configs.name] : this;\n }\n\n /**\n * Get the entity ID from a record, optionally via a nested field name.\n *\n * @param {unknown} value\n * @param {{ name?: string, [key: string]: unknown }} configs\n * @returns {string | undefined}\n */\n getId(value, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (configs.name && !isString(configs.name))\n throw new Error(\n `EntityField.getId (${this.entity.name}): \"name\" option must be either a string or undefined`,\n );\n if (configs.name && !this.entity.fields[configs.name])\n throw new Error(\n `EntityField.getId (${this.entity.name}): field \"${configs.name}\" not found`,\n );\n }\n\n return this.getField({ value, ...configs }).entity.getId(\n this.getValue(value, configs),\n );\n }\n\n /**\n * @param {any} value\n * @returns {any}\n */\n getKey(value) {\n return this.getId(value);\n }\n\n /** @returns {List} */\n getOptions() {\n return this.options || this.entity.options || List();\n }\n\n /**\n * Get the value, optionally drilling into a nested field by name.\n *\n * @param {any} value\n * @param {{ name?: string }} configs\n * @returns {unknown}\n */\n getValue(value, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (configs.name && !isString(configs.name))\n throw new Error(\n `EntityField.getValue (${this.entity.name}): \"name\" option must be either a string or undefined`,\n );\n if (configs.name && !this.entity.fields[configs.name])\n throw new Error(\n `EntityField.getValue (${this.entity.name}): field \"${configs.name}\" not found`,\n );\n }\n\n return configs.name && value ? value.get(configs.name) : value;\n }\n\n /**\n * @param {unknown} value\n * @param {{ name?: string }} configs\n * @returns {boolean}\n */\n isBlank(value = null, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (configs.name && !isString(configs.name))\n throw new Error(\n `EntityField.isBlank (${this.entity.name}): \"name\" option must be either a string or undefined`,\n );\n if (configs.name && !this.entity.fields[configs.name])\n throw new Error(\n `EntityField.isBlank (${this.entity.name}): field \"${configs.name}\" not found`,\n );\n }\n\n return (\n value == null ||\n (this.many ? /** @type {any} */ (value).size === 0 : value === '')\n );\n }\n\n /**\n * Delegate serialisation to the referenced Entity's `toData`.\n *\n * @param {import('immutable').Map<string, unknown> | null | undefined} value\n * @param {object} configs\n * @returns {object | null | undefined}\n */\n toData(value, configs = {}) {\n return this.entity.toData(value, configs);\n }\n\n /**\n * @param {import('immutable').Map<string, unknown> | null} value\n * @returns {unknown}\n */\n valueToParam(value = null) {\n return value === null ? undefined : value.get(this.entity.idField);\n }\n\n /**\n * @param {any} value\n * @param {{ name?: string }} [configs]\n * @returns {any}\n */\n toParams(value, configs) {\n return this.getId(value, configs);\n }\n\n /**\n * @param {import('immutable').Map<string, unknown> | null} value\n * @param {object} configs\n * @returns {string}\n */\n toString(value, configs = {}) {\n return this.entity.toString(value, configs);\n }\n}\n","import { isFunction } from 'es-toolkit';\nimport AnyField from './field-any';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n */\n\n/** A field for entity primary-key values. Does not support `many`. */\nexport default class IdField extends AnyField {\n /** @param {FieldOptions} configs */\n constructor(configs = {}) {\n super(configs);\n\n if (process.env.NODE_ENV !== 'production') {\n if (configs.many)\n throw new Error(\n `${this.constructor.name}.constructor: \"many\" option is not supported.`,\n );\n }\n }\n\n /**\n * Coerce data to a string ID.\n *\n * @param {any} data\n * @returns {any}\n */\n dataToValue(data) {\n return isFunction(data?.toString) ? data.toString() : data;\n }\n\n /** @returns {undefined} */\n default() {\n return undefined;\n }\n}\n","import {\n flowRight,\n isFunction,\n keyBy,\n mapValues,\n range,\n sample,\n sampleSize,\n} from 'es-toolkit';\nimport { get } from 'es-toolkit/compat';\nimport { List, Map } from 'immutable';\n\nimport EntityField from '../field/field-entity';\nimport IdField from '../field/field-id';\n\n/**\n * @typedef {import('../types').EntityCleaner} EntityCleaner\n * @typedef {import('../types').EntityCleanOptions} EntityCleanOptions\n * @typedef {import('../types').EntityPaths} EntityPaths\n * @typedef {import('../types').FieldOptions} FieldOptions\n * @typedef {import('../types').Validator} Validator\n */\n\n/**\n * Base class for all entities.\n *\n * An Entity describes a domain model — its fields, validation rules,\n * data conversion logic, and (via a duck) its API integration.\n * All methods are static; Entity is never instantiated directly.\n */\nexport default class Entity {\n /** @type {EntityCleaner[]} */\n static cleaners = [];\n\n /** @type {string} Primary-key field name. */\n static idField = 'uuid';\n\n /** @type {Record<string, any>} */\n static fields = {\n uuid: new IdField({ blank: true, mock: 'random.uuid' }),\n };\n\n /** @type {EntityPaths} */\n static paths = {};\n\n /** @type {any} Duck instance, set externally by the duck system. */\n static duck;\n\n /**\n * Remove an item from a List of records by index.\n *\n * @param {List} records\n * @param {{ index?: number | null }} options\n * @returns {List}\n */\n static actionArrayDeleteAtIndex(records, { index = null } = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!List.isList(records))\n throw new Error(\n `Entity.actionArrayDeleteAt (${this.name}): \"records\" must be an immutable List.`,\n );\n if (index === null)\n throw new Error(\n `Entity.actionArrayDeleteAt (${this.name}): \"index\" option must be set.`,\n );\n }\n\n return records.delete(/** @type {number} */ (index));\n }\n\n /**\n * Move an item within a List of records from one index to another.\n *\n * @param {List} records\n * @param {{ index?: number | null, indexTo?: number | null }} options\n * @returns {List}\n */\n static actionArrayMoveAtIndex(\n records,\n { index = null, indexTo = null } = {},\n ) {\n if (process.env.NODE_ENV !== 'production') {\n if (!List.isList(records))\n throw new Error(\n `Entity.actionArrayMoveAtIndex (${this.name}): \"records\" must be an immutable List.`,\n );\n if (index === null)\n throw new Error(\n `Entity.actionArrayMoveAtIndex (${this.name}): \"index\" option must be set.`,\n );\n if (indexTo === null)\n throw new Error(\n `Entity.actionArrayMoveAtIndex (${this.name}): \"indexTo\" option must be set.`,\n );\n }\n\n return records\n .delete(/** @type {number} */ (index))\n .insert(\n /** @type {number} */ (indexTo),\n records.get(/** @type {number} */ (index)),\n );\n }\n\n /**\n * Reset a record to defaults (or to `configs.valueInitial`), preserving the ID.\n *\n * @param {Map<string, unknown>} record\n * @param {{ valueInitial?: Map<string, unknown> }} configs\n * @returns {Map<string, unknown> | null}\n */\n static actionReset(record, configs = {}) {\n return (\n configs.valueInitial ||\n this.dataToRecord({\n [this.idField]: record.get(this.idField),\n })\n );\n }\n\n /**\n * Run entity-level cleaners against a record.\n *\n * @param {Map<string, unknown>} record\n * @param {EntityCleanOptions} configs\n * @returns {Map<string, unknown>}\n */\n static clean(record, configs = {}) {\n const newOptions = { ...configs, entity: this };\n\n return this.cleaners.reduce(\n (prev, cleaner) => cleaner(prev, newOptions),\n record,\n );\n }\n\n /**\n * Convert plain API data into an Immutable Map record.\n * Applies field defaults for missing keys and runs each field's `dataToValue`.\n *\n * @param {object | null} data\n * @returns {Map<string, unknown> | null}\n */\n static dataToRecord(data = null) {\n const fieldDataToValue = (value, key) =>\n List.isList(value) || Array.isArray(value)\n ? List(value).map((val) => this.fields[key].dataToValue(val, { data }))\n : this.fields[key].dataToValue(value, { data });\n\n const getDefaultFromField = (field) =>\n isFunction(field.default) ? field.default({ data }) : field.default;\n\n const values = Map(data)\n .filter((value, key) => key in this.fields)\n .filterNot((value) => value === undefined)\n .map(fieldDataToValue);\n\n return (\n data &&\n Map(this.fields)\n .filter((value, key) => data[key] === undefined)\n .map(getDefaultFromField)\n .merge(values)\n );\n }\n\n /**\n * Create an EntityField that references this Entity class.\n *\n * @param {Partial<FieldOptions>} configs\n * @returns {EntityField}\n */\n static getEntityField(configs = {}) {\n return new EntityField({ entity: this, ...configs });\n }\n\n /**\n * Extract the primary-key value from a record.\n *\n * @param {Map<string, unknown> | null} record\n * @param {object} [configs]\n * @returns {any}\n */\n static getId(record = null, configs) {\n return record === null ? undefined : record.get(this.idField);\n }\n\n /**\n * Return the entity's paths configuration.\n *\n * @param {object} [configs]\n * @returns {EntityPaths}\n */\n static getPaths(configs) {\n return this.paths;\n }\n\n /**\n * Return the total size / count of records (override in subclasses).\n *\n * @returns {number}\n */\n static getSize() {\n return 0;\n }\n\n /**\n * Check whether the given class is an Entity subclass.\n *\n * @param {any} maybeEntity\n * @returns {boolean}\n */\n static isEntity(maybeEntity) {\n return !!maybeEntity && maybeEntity.prototype instanceof Entity;\n }\n\n /**\n * Check whether the given class descends from this Entity.\n *\n * @param {any} maybeDescendant\n * @returns {boolean}\n */\n static isEntityDescendant(maybeDescendant) {\n return !!maybeDescendant && maybeDescendant.prototype instanceof this;\n }\n\n /**\n * Shorthand for `validate(record, configs).size === 0`.\n *\n * @param {Map<string, unknown> | null | undefined} record\n * @param {object} configs\n * @returns {boolean}\n */\n static isValid(record, configs) {\n const errors = this.validate(record, configs);\n return !errors || errors.size === 0;\n }\n\n /**\n * Check validity from an existing errors structure (e.g. from the API).\n *\n * @param {List | null | undefined} errors\n * @param {{ name?: string[] }} configs\n * @returns {boolean}\n */\n static isValidFromErrors(errors, configs = {}) {\n return configs.name\n ? configs.name.some(\n (n) =>\n /** @type {List} */ (errors)\n .filter((error) => Map.isMap(error) && error.get('detail'))\n .flatMap((error) => error.getIn(['errors', n]))\n .filter((error) => error).size > 0,\n )\n : !errors || errors.size === 0;\n }\n\n /**\n * Generate a single mock data object using faker.\n *\n * @param {object} faker - faker.js instance\n * @param {number} index - current item index\n * @param {object} [mockData] - override values\n * @returns {object}\n */\n static mock(faker, index, mockData) {\n return flowRight(\n (record) => this.toData(record),\n (data) => this.dataToRecord(data),\n (fields) => ({\n ...mapValues(fields, (field) => {\n if (\n field instanceof EntityField &&\n !field.blank &&\n field.entity.store\n ) {\n return field.many\n ? sampleSize(Object.values(field.entity.store), 1)\n : sample(Object.values(field.entity.store));\n }\n\n return (\n field.mock &&\n (field.mock === 'index'\n ? index\n : get(faker, field.mock)(...(field.mockConfigs || [])))\n );\n }),\n ...mockData,\n }),\n )(this.fields);\n }\n\n /**\n * Generate multiple mock records, keyed by the entity's `idField`.\n *\n * @param {object} faker - faker.js instance\n * @param {{ size?: number }} configs\n * @returns {Record<string, object>}\n */\n static mockMany(faker, configs = {}) {\n return keyBy(\n range(configs.size || 0).map((index) => this.mock(faker, index)),\n (item) => item[this.idField],\n );\n }\n\n /**\n * Convert an Immutable Map record back to a plain JS object for the API.\n * Filters out fields not in the entity definition and local-only fields.\n *\n * @param {Map<string, unknown> | null | undefined} record\n * @returns {object | null | undefined}\n */\n static toData(record) {\n if (process.env.NODE_ENV !== 'production') {\n if (record && !Map.isMap(record))\n throw new Error(\n `Entity.toData (${this.name}): record must be either a Map or null or undefined`,\n );\n }\n\n const fieldValueToData = (value, key) =>\n List.isList(value)\n ? value.map((val) => this.fields[key].toData(val, { record })).toArray()\n : this.fields[key].toData(value, { record });\n\n return (\n record &&\n record\n .filter((value, key) => key in this.fields)\n .filterNot((value, key) => this.fields[key].local)\n .map(fieldValueToData)\n .toObject()\n );\n }\n\n /**\n * Return a display string for a record (defaults to the ID field value).\n *\n * @param {Map<string, unknown> | null | undefined} record\n * @returns {any}\n */\n static toString(record) {\n if (process.env.NODE_ENV !== 'production') {\n if (record && !Map.isMap(record))\n throw new Error(\n `Entity.toString (${this.name}): record must be either a Map or null or undefined`,\n );\n }\n\n return (record && record.get(this.idField)) || '';\n }\n\n /**\n * Validate a record against all field validators.\n * Returns `null` when valid, or a Map with `{ detail, message, errors }`.\n *\n * @param {Map<string, unknown> | null | undefined} record\n * @param {{ fields?: Record<string, any>, [key: string]: unknown }} configs\n * @returns {Map<string, unknown> | null | undefined}\n */\n static validate(record, configs = {}) {\n if (!record) return record;\n\n const detailErrors = Map(this.fields)\n .filter((field, key) => !configs.fields || configs.fields[key])\n .map((field, key) =>\n field.validate(record.get(key), {\n ...configs,\n fieldName: key,\n record,\n validators: configs.fields?.[key],\n }),\n )\n .filterNot((errors) => errors.size === 0);\n\n return detailErrors.size === 0\n ? null\n : Map({\n detail: true,\n message: 'Invalid Entity',\n errors: detailErrors,\n });\n }\n}\n","import Entity from './entity';\nimport AnyField from '../field/field-any';\nimport CharField from '../field/field-char';\nimport IdField from '../field/field-id';\n\n/** An entity for react-intl locale message records. */\nexport default class Locale extends Entity {\n static fields = {\n messages: new AnyField(),\n defaultMessage: new CharField(),\n description: new CharField(),\n id: new CharField(),\n uuid: new IdField({ mock: 'random.uuid' }),\n };\n}\n","import Entity from './entity';\nimport EntityLocale from './entity-locale';\nimport BooleanField from '../field/field-boolean';\nimport CharField from '../field/field-char';\nimport EntityField from '../field/field-entity';\n\n/** An entity representing a fixed set of options (value + label). */\nexport default class Enum extends Entity {\n static idField = 'value';\n\n static fields = {\n disabled: new BooleanField({ default: false }),\n hidden: new BooleanField({ default: false }),\n label: new CharField(),\n locale: new EntityField({\n blank: true,\n entity: EntityLocale,\n }),\n value: new CharField(),\n };\n\n /**\n * Display the enum label.\n *\n * @param {import('immutable').Map<string, unknown> | null | undefined} record\n * @returns {any}\n */\n static toString(record) {\n return (record && record.get('label')) || '';\n }\n}\n","import { List } from 'immutable';\n\nimport EntityField from './field-entity';\nimport EntityEnum from '../entity/entity-enum';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n */\n\n/** A field backed by the `EntityEnum` entity, for fixed option sets. */\nexport default class EnumField extends EntityField {\n /** @param {FieldOptions} configs */\n constructor(configs = {}) {\n super({ entity: EntityEnum, type: 'enum', ...configs });\n }\n\n /**\n * Look up the matching option record from the options List.\n *\n * @param {any} data - the enum value string from the API\n * @returns {any}\n */\n dataToValue(data = null) {\n return (\n data &&\n this.getOptions().find((option) => this.entity.getId(option) === data)\n );\n }\n\n /** @returns {List | null} */\n default() {\n return this.many ? List() : null;\n }\n\n /**\n * Check whether a specific enum value is currently selected.\n *\n * @param {any} value\n * @param {{ name: string }} options\n * @returns {boolean}\n */\n isEnumActive(value, { name }) {\n return this.many\n ? value.some((v) => v.get('value') === name)\n : !!value && value.get('value') === name;\n }\n\n /**\n * Extract the enum ID string for API submission.\n *\n * @param {import('immutable').Map<string, unknown> | null} value\n * @returns {string | undefined}\n */\n valueToData(value = null) {\n return value && this.entity.getId(value);\n }\n\n valueToParam(value = null) {\n return value === null ? undefined : this.entity.getId(value);\n }\n}\n","import AnyField from './field-any';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n */\n\n/** A field for numeric values. */\nexport default class NumberField extends AnyField {\n /** @param {FieldOptions} options */\n constructor(options = {}) {\n super({ type: 'number', ...options });\n }\n}\n","import NumberField from './field-number';\n\n/** A numeric field that parses values as integers. */\nexport default class IntegerField extends NumberField {\n /**\n * Parse raw data as an integer via `parseInt`.\n *\n * @param {any} data\n * @returns {number | null}\n */\n dataToValue(data) {\n const value = parseInt(data, 10);\n\n return Number.isNaN(value) ? null : value;\n }\n}\n","import CharField from './field-char';\n\n/**\n * @typedef {import('../types').FieldOptions} FieldOptions\n */\n\n/** A field for long-form text (uses the `'text'` widget type). */\nexport default class TextField extends CharField {\n /** @param {FieldOptions} configs */\n constructor(configs = {}) {\n super({ type: 'text', ...configs });\n }\n}\n","import { List, Map } from 'immutable';\n\nimport Entity from './entity';\n\nimport IdField from '../field/field-id';\nimport IntegerField from '../field/field-integer';\n\n/** Base entity for filter/query-parameter records (pagination, search, etc.). */\nexport default class Filter extends Entity {\n static fields = {\n page: new IntegerField({ default: 1 }),\n page_size: new IntegerField({ default: 20 }),\n uuid: new IdField({ blank: true, mock: 'random.uuid' }),\n };\n\n /**\n * Serialise a filter record into a flat Map of query-parameter strings.\n * Returning a Map from `field.toParams` will flatten the output.\n *\n * @param {import('immutable').Map<string, unknown> | null | undefined} record\n * @param {object} options\n * @returns {any}\n */\n static toParams(record, options = {}) {\n const fieldValueToParams = (value, key) =>\n List.isList(value)\n ? value\n .map((val) =>\n this.fields[key].toParams(val, { record, ...options }),\n )\n .reduce(\n (prev, param) =>\n prev.mergeWith(\n (prevParam, nextParam) =>\n prevParam ? `${prevParam},${nextParam}` : nextParam,\n Map.isMap(param) ? param : Map({ [key]: param }),\n ),\n Map(),\n )\n : this.fields[key].toParams(value, { record, ...options });\n\n return record\n ? record\n .filter((_, key) => key in this.fields)\n .filterNot((_, key) => this.fields[key].local)\n .filterNot((value) => value === undefined)\n .map(fieldValueToParams)\n .flatten()\n : Map();\n }\n}\n","import { isString } from 'es-toolkit';\nimport queryString from 'query-string';\nimport { Map } from 'immutable';\n\nimport Entity from './entity';\nimport EntityLocale from './entity-locale';\n\nimport BooleanField from '../field/field-boolean';\nimport CharField from '../field/field-char';\nimport EntityField from '../field/field-entity';\nimport IdField from '../field/field-id';\nimport IntegerField from '../field/field-integer';\nimport TextField from '../field/field-text';\n\n/**\n * Base entity for titled, orderable domain models with archive/save\n * actions and URL generation helpers.\n */\nexport default class Title extends Entity {\n static fields = {\n description: new TextField({ blank: true }),\n is_archived: new BooleanField({ default: false }),\n locale: new EntityField({\n blank: true,\n entity: EntityLocale,\n }),\n order: new IntegerField({ mock: 'index' }),\n title: new CharField({ mock: 'lorem.sentence' }),\n title_short: new CharField({ blank: true }),\n uuid: new IdField({ blank: true, mock: 'random.uuid' }),\n };\n\n static paths = {\n urlBase: '',\n };\n\n /**\n * Dispatch an archive action via the duck.\n *\n * @param {import('immutable').Map<string, unknown>} record\n * @param {object} configs\n * @returns {any}\n */\n static actionArchive(record, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!this?.duck?.actions?.save)\n throw new Error(\n `EntityTitle.actionArchive (${this.name}): \"save\" action is required in duck`,\n );\n }\n\n return this.duck.actions.save(record, {\n action: 'archive',\n method: 'post',\n ...configs,\n });\n }\n\n /**\n * Delete at index and re-number the `order` field on remaining items.\n *\n * @param {import('immutable').List} records\n * @param {{ index?: number | null }} configs\n * @returns {import('immutable').List}\n */\n static actionArrayDeleteAtIndexOrdered(records, configs) {\n return this.actionArrayDeleteAtIndex(records, configs).map((record, i) =>\n record.set('order', i),\n );\n }\n\n /**\n * Move at index and re-number the `order` field on all items.\n *\n * @param {import('immutable').List} records\n * @param {{ index?: number | null, indexTo?: number | null }} configs\n * @returns {import('immutable').List}\n */\n static actionArrayMoveAtIndexOrdered(records, configs) {\n return this.actionArrayMoveAtIndex(records, configs).map((record, i) =>\n record.set('order', i),\n );\n }\n\n /**\n * Dispatch a save action via the duck.\n *\n * @param {import('immutable').Map<string, unknown>} record\n * @param {object} configs\n * @returns {any}\n */\n static actionSave(record, configs = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!this?.duck?.actions?.save)\n throw new Error(\n `EntityTitle.actionSave (${this.name}): \"save\" action is required in duck`,\n );\n }\n\n return this.duck.actions.save(record, {\n invalidateList: true,\n ...configs,\n });\n }\n\n /**\n * Build a relative link path for a record.\n *\n * @param {import('immutable').Map<string, unknown> | null} record\n * @param {any} configs\n * @returns {string}\n */\n static toLink(record, configs = {}) {\n const computedParams = (configs.params || Map()).filterNot(\n (param) => param === undefined,\n );\n\n const path = /** @type {string} */ (this.getPaths(configs).urlBase);\n if (process.env.NODE_ENV !== 'production') {\n if (!/^\\/.*\\/$/.test(path))\n throw new Error(\n `EntityTitle.toLink (${this.name}): \"urlBase\" property must start with a \"/\" and end with a \"/\"`,\n );\n if (computedParams.some((value) => !isString(value)))\n throw new Error(\n `EntityTitle.toLink (${this.name}): every params must be a string or undefined`,\n );\n }\n\n return `${path}${this.getId(record, configs)}/?${queryString.stringify(\n computedParams.toJS(),\n )}`;\n }\n\n /**\n * Display the record title.\n *\n * @param {import('immutable').Map<string, unknown> | null | undefined} record\n * @returns {any}\n */\n static toString(record) {\n return (record && record.get('title')) || '';\n }\n\n /**\n * Display the record title prefixed with its 1-based order number.\n *\n * @param {import('immutable').Map<string, unknown> | null | undefined} record\n * @returns {string}\n */\n static toStringOrdered(record) {\n return record\n ? `${/** @type {number} */ (record.get('order')) + 1}. ${this.toString(record)}`\n : '';\n }\n\n /**\n * Build a full absolute URL for a record.\n *\n * @param {import('immutable').Map<string, unknown> | null} record\n * @param {any} configs\n * @returns {string}\n */\n static toUrl(record, configs = {}) {\n const computedParams = (configs.params || Map())\n .remove('page')\n .remove('page_size')\n .filterNot((param) => param === undefined);\n\n const path = /** @type {string} */ (this.getPaths(configs).urlBase);\n\n if (process.env.NODE_ENV !== 'production') {\n if (!/^\\/.*\\/$/.test(path))\n throw new Error(\n `EntityTitle.toUrl (${this.name}): \"urlBase\" property must start with a \"/\" and end with a \"/\"`,\n );\n if (computedParams.some((param) => !isString(param)))\n throw new Error(\n `EntityTitle.toUrl (${this.name}): every params must be a string or undefined`,\n );\n if (!(configs.settings && configs.settings.BASE_URL))\n throw new Error(\n `EntityTitle.toUrl (${this.name}): \"settings.BASE_URL\" must be set.`,\n );\n }\n\n return `${configs.settings.BASE_URL}${path}${this.getId(\n record,\n configs,\n )}/?${queryString.stringify(computedParams.toJS())}`;\n }\n\n /**\n * Build a full absolute API export URL (xlsx format).\n *\n * @param {any} configs\n * @returns {string}\n */\n static toUrlExport(configs = {}) {\n const computedParams = configs.params\n ? configs.params\n .remove('page')\n .remove('page_size')\n .filterNot((param) => param === undefined)\n : Map();\n\n const path = /** @type {string} */ (this.getPaths(configs).apiBase);\n\n if (process.env.NODE_ENV !== 'production') {\n if (!/^\\/.*\\/$/.test(path))\n throw new Error(\n `EntityTitle.toUrlExport (${this.name}): \"apiBase\" property must start with a \"/\" and end with a \"/\"`,\n );\n if (computedParams.some((param) => !isString(param)))\n throw new Error(\n `EntityTitle.toUrlExport (${this.name}): every params must be a string or undefined`,\n );\n if (!(configs.settings && configs.settings.BASE_API_URL))\n throw new Error(\n `EntityTitle.toUrlExport (${this.name}): \"settings.BASE_API_URL\" must be set.`,\n );\n }\n\n return `${configs.settings.BASE_API_URL}${path}?${queryString.stringify(\n computedParams.toJS(),\n )}&format=xlsx`;\n }\n}\n"],"names":["removeMultiSpace","__name","value","isString","sliceToMaxLength","field","allowBlank","entityValid","options","errors","isRequired","configs","isRequiredIf","predicate","isFunction","list","validators","values","List","validator","error","Map","mayNotBeBlank","defaultError","flagError","_Field","defaults","record","newOptions","prev","cleaner","data","context","fromJS","_value","_configs","isImmutable","Field","_AnyField","AnyField","_BooleanField","BooleanField","_CharField","CharField","_DateField","moment","DateField","_DateTimeField","DateTimeField","_EntityField","entityValidators","defaultValidators","EntityField","_IdField","IdField","_Entity","records","index","indexTo","fieldDataToValue","key","val","getDefaultFromField","maybeEntity","maybeDescendant","n","faker","mockData","flowRight","fields","mapValues","sampleSize","sample","get","keyBy","range","item","fieldValueToData","detailErrors","_a","__publicField","Entity","_Locale","Locale","_Enum","EntityLocale","Enum","_EnumField","EntityEnum","option","name","v","EnumField","_NumberField","NumberField","_IntegerField","IntegerField","_TextField","TextField","_Filter","fieldValueToParams","param","prevParam","nextParam","_","Filter","_Title","_b","computedParams","path","queryString","Title"],"mappings":"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"}