@burnsred/entity 0.6.5 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.6.6](https://github.com/burnsred/burnsred-entity-library/compare/v0.6.5...v0.6.6) (2026-02-11)
7
+
8
+ **Note:** Version bump only for package @burnsred/entity
9
+
10
+
11
+
12
+
13
+
6
14
  ## [0.6.5](https://github.com/burnsred/burnsred-entity-library/compare/v0.6.5-dev.3...v0.6.5) (2024-06-20)
7
15
 
8
16
  **Note:** Version bump only for package @burnsred/entity
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import { EntityFields, EntityRecord } from '../types';
2
+ import { default as Entity } from './entity';
3
+ declare class TodoEntity extends Entity {
4
+ static paginated: boolean;
5
+ static paths: {
6
+ apiBase: string;
7
+ };
8
+ static fields: EntityFields<TodoEntityFields>;
9
+ }
10
+ export type TodoEntityFields = {
11
+ uuid: string;
12
+ title: string;
13
+ is_done: boolean;
14
+ type: string;
15
+ created_at: string;
16
+ updated_at: string;
17
+ };
18
+ export type TodoEntityRecord = EntityRecord<TodoEntityFields>;
19
+ export default TodoEntity;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,223 @@
1
+ import { List, Map } from 'immutable';
2
+ /** A validation function that returns an error string or a falsy value when valid. */
3
+ export type Validator = (value: unknown, options: Partial<ValidateOptions>) => string | false | null | undefined;
4
+ /** Options passed to each validator function during field validation. */
5
+ export interface ValidateOptions {
6
+ /** The Field instance being validated. */
7
+ field: any;
8
+ /** The key name of the field within the entity. */
9
+ fieldName?: string;
10
+ /** The full entity record being validated. */
11
+ record?: Map<string, unknown>;
12
+ /** Field name for nested lookups. */
13
+ name?: string;
14
+ /** Override validators for this validation pass. */
15
+ validators?: Validator[] | ((defaults: Validator[]) => Validator[]);
16
+ [key: string]: unknown;
17
+ }
18
+ /** An entity-level cleaner that transforms a record before submission. */
19
+ export type EntityCleaner = (record: Map<string, unknown>, options: EntityCleanOptions) => Map<string, unknown>;
20
+ /** Options passed to entity-level cleaners. */
21
+ export interface EntityCleanOptions {
22
+ /** The Entity class running the cleaner. */
23
+ entity?: any;
24
+ [key: string]: unknown;
25
+ }
26
+ /** A field-level cleaner that transforms a single field value. */
27
+ export type FieldCleaner = (value: unknown, options: FieldCleanOptions) => unknown;
28
+ /** Options passed to field-level cleaners. */
29
+ export interface FieldCleanOptions {
30
+ /** The Field instance running the cleaner. */
31
+ field?: any;
32
+ [key: string]: unknown;
33
+ }
34
+ /** Options accepted by the `Field` base class constructor. */
35
+ export interface FieldOptions {
36
+ /** If true, the field is not required (skips isRequired validator). */
37
+ blank?: boolean;
38
+ /** Field-level cleaners applied before validation. */
39
+ cleaners?: FieldCleaner[];
40
+ /** If true, the field holds a List of values rather than a single value. */
41
+ many?: boolean;
42
+ /** Custom validators, or a function that receives defaults and returns validators. */
43
+ validators?: Validator[] | ((defaults: Validator[]) => Validator[]);
44
+ /** Immutable List of selectable options for enum/select fields. */
45
+ options?: List<unknown>;
46
+ /** Faker.js path (e.g. `'name.firstName'`) or `'index'` for mock data generation. */
47
+ mock?: string;
48
+ /** Extra arguments passed to the faker mock function. */
49
+ mockConfigs?: unknown[];
50
+ /** Default value, or a function `({ data }) => value` for computed defaults. */
51
+ default?: unknown | ((context: {
52
+ data: unknown;
53
+ }) => unknown);
54
+ /** If true, the field is excluded from `toData()` serialisation. */
55
+ local?: boolean;
56
+ /** Widget type hint (e.g. `'char'`, `'boolean'`, `'date'`, `'entity'`). */
57
+ type?: string;
58
+ /** Allow extra properties from subclasses. */
59
+ [key: string]: unknown;
60
+ }
61
+ /** Options for EntityField constructor. Requires an `entity` class reference. */
62
+ export interface EntityFieldOptions extends FieldOptions {
63
+ /** The Entity class this field references. */
64
+ entity: any;
65
+ /** Whether this is a nested (inline) relationship. Defaults to true. */
66
+ nested?: boolean;
67
+ }
68
+ /** Options for DateField constructor. */
69
+ export interface DateFieldOptions extends FieldOptions {
70
+ /** Whether the field allows a time component. */
71
+ allowTime?: boolean;
72
+ /** Moment.js format string (e.g. `'YYYY-MM-DD'`). */
73
+ dateFormat?: string;
74
+ }
75
+ /** Static paths configuration on an Entity class. */
76
+ export interface EntityPaths {
77
+ /** Base URL for API requests (e.g. `'/api/items/'`). */
78
+ apiBase?: string;
79
+ /** Base URL for frontend routes (e.g. `'/items/'`). */
80
+ urlBase?: string;
81
+ [key: string]: string | undefined;
82
+ }
83
+ /**
84
+ * A utility type to assist in debugging complex generic types.
85
+ *
86
+ * WIP
87
+ *
88
+ * ```ts
89
+ * type User = Typed{
90
+ * // ...complex type definition
91
+ * };
92
+ *
93
+ * type Debug =
94
+ *
95
+ * // { name: string; age: number; }
96
+ * ```
97
+ *
98
+ * @link [Matt Pocock: 6 TypeScript tips..](https://www.youtube.com/watch?v=lraHlXpuhKs&t=420s)
99
+ */
100
+ export type Prettify<T> = {
101
+ [K in keyof T]: T[K];
102
+ } & {};
103
+ /**
104
+ * A type-safe wrapper around Immutable.js `Map`.
105
+ *
106
+ * Provides typed overloads for common Map operations so IDE
107
+ * autocompletion and type-checking work against the declared field
108
+ * names and value types in `T`.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * type MyFields = {
113
+ * uuid: string;
114
+ * title: string;
115
+ * is_done: boolean;
116
+ * nested: TypedMap<{
117
+ * foo: string;
118
+ * }>;
119
+ * };
120
+ *
121
+ * const record: TypedMap<MyFields> = Map({
122
+ * uuid: '123',
123
+ * title: 'Todo 1',
124
+ * is_done: false,
125
+ * nested: Map({
126
+ * foo: 'bar',
127
+ * }),
128
+ * });
129
+ *
130
+ * record.get('title'); // string
131
+ * record.get('is_done'); // boolean
132
+ * record.set('title', 'New'); // TypedMap<MyFields>
133
+ * // ^ autocompleted and type-checked
134
+ * const obj = record.toJS(); // { uuid: string, title: string, is_done: boolean }
135
+ * ```
136
+ *
137
+ * ### Methods not typed
138
+ *
139
+ * - Deep path operations (getIn, setIn, deleteIn, updateIn)
140
+ * these require recursive type utilities that are fragile
141
+ * and complex; the base Map signatures work fine for path-based access.
142
+ * - Iteration methods (filter, map, filterNot, flatMap)
143
+ * these transform the map's type, so overriding them to return this
144
+ * would be incorrect. The base Map types handle them adequately.
145
+ *
146
+ * @see https://stackoverflow.com/questions/43607652/typescript-immutable-proper-way-of-extending-immutable-map-type
147
+ * @see https://stackoverflow.com/questions/46284131/typescript-and-immutable-js-interface
148
+ */
149
+ export interface TypedMap<T> extends Map<string, unknown> {
150
+ get<K extends keyof T & string>(key: K): T[K];
151
+ get<K extends keyof T & string>(key: K, notSetValue: T[K]): T[K];
152
+ /**
153
+ * @deprecated prefer `get` instead, for robust type-checking
154
+ *
155
+ * ```ts
156
+ * record.getIn(['nested', 'foo']) // ❌ return type: unknown
157
+ * // ^ only the first key is checked
158
+ *
159
+ * record.get('nested')?.get('foo') // ✅ return type: string
160
+ * // ^ each key is checked
161
+ *
162
+ * record.get('nested')?.get('foo') ?? null
163
+ * // ^ ^
164
+ * // ensure you use optional chaining and nullish coalescing for safety!
165
+ * ```
166
+ */
167
+ getIn<K extends keyof T & string>(keyArray: [K, ...(string | number)[]], notSetValue?: unknown): unknown;
168
+ has(key: keyof T & string): boolean;
169
+ set<K extends keyof T & string>(key: K, value: T[K]): this;
170
+ /**
171
+ * @deprecated prefer `set` instead, for robust type-checking
172
+ *
173
+ * ```ts
174
+ * record.setIn(['nested', 'foo'], 'bar') // ❌ keys are not checked
175
+ * record.set('nested').set('foo', 'bar') // ✅ each key is checked
176
+ * ```
177
+ */
178
+ setIn(keyArray: unknown[], value: unknown): this;
179
+ delete(key: keyof T & string): this;
180
+ remove(key: keyof T & string): this;
181
+ update<K extends keyof T & string>(key: K, updater: (value: T[K]) => T[K]): this;
182
+ update<K extends keyof T & string>(key: K, notSetValue: T[K], updater: (value: T[K]) => T[K]): this;
183
+ update<R>(updater: (value: this) => R): R;
184
+ merge(...collections: Array<Partial<T>>): this;
185
+ merge<KC, VC>(...collections: Array<Iterable<[KC, VC]>>): Map<string | KC, unknown>;
186
+ merge<C>(...collections: Array<{
187
+ [key: string]: C;
188
+ }>): Map<string, unknown>;
189
+ mergeWith(merger: (oldVal: unknown, newVal: unknown, key: string) => unknown, ...collections: Array<Partial<T>>): this;
190
+ mergeDeep(...collections: Array<Partial<T>>): this;
191
+ mergeDeepWith(merger: (oldVal: unknown, newVal: unknown, key: unknown) => unknown, ...collections: Array<Partial<T>>): this;
192
+ /**
193
+ * Deep conversion — recursively converts nested immutable
194
+ * collections to plain JS objects / arrays.
195
+ *
196
+ * FIXME this type is not actually recursive
197
+ */
198
+ toJS(): {
199
+ [K in keyof T]: T[K];
200
+ };
201
+ /**
202
+ * Shallow conversion — only unwraps the top-level Map.
203
+ * Nested immutable values stay as-is. This is the method
204
+ * `JSON.stringify()` calls under the hood.
205
+ *
206
+ * For flat structures the return type matches `toJS()`;
207
+ * the difference is only observable when `T` contains
208
+ * nested immutable collections.
209
+ */
210
+ toJSON(): {
211
+ [K in keyof T]: T[K];
212
+ };
213
+ /** Shallow conversion to a plain object (same as `toJSON` for Maps). */
214
+ toObject(): {
215
+ [K in keyof T]: T[K];
216
+ };
217
+ withMutations(mutator: (mutable: this) => void): this;
218
+ }
219
+ export interface EntityRecord<T> extends TypedMap<T> {
220
+ }
221
+ export type EntityFields<T> = {
222
+ [FieldName in keyof T]: unknown;
223
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
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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"}
package/package.json CHANGED
@@ -17,12 +17,12 @@
17
17
  "private": false,
18
18
  "repository": "https://github.com/burnsred/burnsred-entity-library.git",
19
19
  "sideEffects": false,
20
- "version": "0.6.5",
20
+ "version": "0.6.6",
21
21
  "publishConfig": {
22
22
  "access": "public"
23
23
  },
24
24
  "scripts": {
25
- "build": "rollup -c=../../configs/rollup.config.js",
25
+ "build": "rollup -c=../../configs/rollup.config.js --bundleConfigAsCjs",
26
26
  "pack:dryrun": "npm pack && rm ./*.tgz",
27
27
  "destroy": "rimraf dist"
28
28
  },
@@ -39,5 +39,5 @@
39
39
  "lodash": ">=4.12.0",
40
40
  "moment": ">=2.0.0"
41
41
  },
42
- "gitHead": "85d20112d7be32a68fc51b90f2c142f79a8e6556"
42
+ "gitHead": "7f9371620f3492c9505efdffa876e0d02cd56adf"
43
43
  }