@reharik/smart-enum 0.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.
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/database.ts
21
+ var database_exports = {};
22
+ __export(database_exports, {
23
+ EnumRevivalError: () => EnumRevivalError,
24
+ enumeration: () => enumeration,
25
+ isSmartEnum: () => isSmartEnum,
26
+ isSmartEnumItem: () => isSmartEnumItem,
27
+ prepareForDatabase: () => prepareForDatabase,
28
+ revivePayloadFromDatabase: () => revivePayloadFromDatabase,
29
+ reviveRowFromDatabase: () => reviveRowFromDatabase
30
+ });
31
+ module.exports = __toCommonJS(database_exports);
32
+
33
+ // src/enumerations.ts
34
+ var import_case_anything = require("case-anything");
35
+
36
+ // src/extensionMethods.ts
37
+ var addExtensionMethods = (enumItems) => {
38
+ const findBy = (field, target) => enumItems.find((item) => item[field] === target);
39
+ const requireBy = (field, target, label) => {
40
+ const item = findBy(field, target);
41
+ if (!item) {
42
+ throw new Error(`No enum ${label} found for '${String(target)}'`);
43
+ }
44
+ return item;
45
+ };
46
+ return {
47
+ fromValue: (value) => requireBy("value", value, "value"),
48
+ tryFromValue: (value) => value ? findBy("value", value) : void 0,
49
+ fromKey: (key) => requireBy("key", key, "key"),
50
+ tryFromKey: (key) => key ? findBy("key", key) : void 0,
51
+ items: () => [...enumItems],
52
+ values: () => enumItems.map((item) => item.value),
53
+ keys: () => enumItems.map((item) => item.key)
54
+ };
55
+ };
56
+
57
+ // src/types.ts
58
+ var SMART_ENUM_ITEM = Symbol("smart-enum-item");
59
+ var SMART_ENUM_ID = Symbol("smart-enum-id");
60
+ var SMART_ENUM = Symbol("smart-enum");
61
+
62
+ // src/enumerations.ts
63
+ function normalizeInput(input) {
64
+ if (Array.isArray(input)) {
65
+ return Object.fromEntries(
66
+ input.map((k) => [k, {}])
67
+ );
68
+ }
69
+ return input;
70
+ }
71
+ var finalizeEnumItem = (item, enumType, enumInstanceId) => {
72
+ Object.defineProperty(item, SMART_ENUM_ITEM, {
73
+ value: true,
74
+ enumerable: false
75
+ });
76
+ Object.defineProperty(item, SMART_ENUM_ID, {
77
+ value: enumInstanceId,
78
+ enumerable: false
79
+ });
80
+ Object.defineProperty(item, "__smart_enum_brand", {
81
+ value: true,
82
+ enumerable: false
83
+ });
84
+ Object.defineProperty(item, "__smart_enum_type", {
85
+ value: enumType,
86
+ enumerable: false
87
+ });
88
+ Object.defineProperty(item, "toJSON", {
89
+ value: () => ({ __smart_enum_type: enumType, value: item.value }),
90
+ enumerable: false
91
+ });
92
+ Object.defineProperty(item, "toPostgres", {
93
+ value: () => item.value,
94
+ enumerable: false
95
+ });
96
+ return item;
97
+ };
98
+ var formatProperties = (k, formatters) => formatters.reduce(
99
+ (acc, formatter) => {
100
+ acc[formatter.key] = formatter.format(k);
101
+ return acc;
102
+ },
103
+ {
104
+ value: (0, import_case_anything.constantCase)(k),
105
+ display: (0, import_case_anything.capitalCase)(k)
106
+ }
107
+ );
108
+ function buildEnumFromObject(enumType, input, propertyAutoFormatters) {
109
+ const formattersWithDefaults = [
110
+ { key: "value", format: import_case_anything.constantCase },
111
+ { key: "display", format: import_case_anything.capitalCase },
112
+ ...propertyAutoFormatters ?? []
113
+ ];
114
+ const rawEnumItems = {};
115
+ const enumInstanceId = Symbol("smart-enum-instance");
116
+ let index = 0;
117
+ for (const key in input) {
118
+ if (Object.prototype.hasOwnProperty.call(input, key)) {
119
+ const typedKey = key;
120
+ const value = input[typedKey];
121
+ const enumItemBase = {
122
+ index,
123
+ key: typedKey,
124
+ ...formatProperties(typedKey, formattersWithDefaults),
125
+ ...value
126
+ };
127
+ const enumItem = finalizeEnumItem(
128
+ enumItemBase,
129
+ enumType,
130
+ enumInstanceId
131
+ );
132
+ Object.freeze(enumItem);
133
+ rawEnumItems[typedKey] = enumItem;
134
+ index++;
135
+ }
136
+ }
137
+ const extensionMethods = addExtensionMethods(
138
+ Object.values(rawEnumItems)
139
+ );
140
+ const enumObject = {
141
+ ...rawEnumItems,
142
+ ...extensionMethods
143
+ };
144
+ Object.defineProperty(enumObject, SMART_ENUM, {
145
+ value: true,
146
+ enumerable: false
147
+ });
148
+ Object.freeze(enumObject);
149
+ return enumObject;
150
+ }
151
+ function enumeration(enumType, props) {
152
+ const normalized = normalizeInput(props.input);
153
+ return buildEnumFromObject(
154
+ enumType,
155
+ normalized,
156
+ props.propertyAutoFormatters
157
+ );
158
+ }
159
+
160
+ // src/utilities/typeGuards.ts
161
+ var isSmartEnumItem = (x) => {
162
+ return !!x && typeof x === "object" && Reflect.get(x, SMART_ENUM_ITEM) === true;
163
+ };
164
+ var isSmartEnum = (x) => {
165
+ return !!x && typeof x === "object" && Reflect.get(x, SMART_ENUM) === true;
166
+ };
167
+
168
+ // src/db/prepareForDatabase.ts
169
+ var isPlainObject = (x) => typeof x === "object" && x !== null && Object.getPrototypeOf(x) === Object.prototype;
170
+ var prepareForDatabase = (payload) => {
171
+ const seen = /* @__PURE__ */ new WeakMap();
172
+ const walk = (v) => {
173
+ if (isSmartEnumItem(v)) {
174
+ return v.value;
175
+ }
176
+ if (typeof v === "object" && v !== null && seen.has(v)) {
177
+ return seen.get(v);
178
+ }
179
+ if (Array.isArray(v)) {
180
+ const arr = [];
181
+ seen.set(v, arr);
182
+ for (const item of v) {
183
+ arr.push(walk(item));
184
+ }
185
+ return arr;
186
+ }
187
+ if (isPlainObject(v)) {
188
+ const out = {};
189
+ seen.set(v, out);
190
+ for (const [k, val] of Object.entries(v)) {
191
+ out[k] = walk(val);
192
+ }
193
+ return out;
194
+ }
195
+ return v;
196
+ };
197
+ return walk(payload);
198
+ };
199
+
200
+ // src/db/enumRevivalError.ts
201
+ var EnumRevivalError = class extends Error {
202
+ constructor(message, path, value) {
203
+ super(message);
204
+ this.path = path;
205
+ this.value = value;
206
+ this.name = "EnumRevivalError";
207
+ }
208
+ };
209
+
210
+ // src/db/reviveRowFromDatabase.ts
211
+ var reviveRowFromDatabase = (row, options) => {
212
+ const { fieldEnumMapping, strict = false } = options;
213
+ const out = { ...row };
214
+ for (const [field, smartEnum] of Object.entries(fieldEnumMapping)) {
215
+ if (!Object.hasOwn(out, field)) {
216
+ continue;
217
+ }
218
+ const raw = out[field];
219
+ if (typeof raw !== "string") {
220
+ continue;
221
+ }
222
+ const revived = smartEnum.tryFromValue(raw);
223
+ if (revived !== void 0) {
224
+ out[field] = revived;
225
+ } else if (strict) {
226
+ throw new EnumRevivalError(
227
+ `Cannot revive field ${JSON.stringify(field)}: unknown enum value ${JSON.stringify(raw)}`,
228
+ field,
229
+ raw
230
+ );
231
+ }
232
+ }
233
+ return out;
234
+ };
235
+
236
+ // src/db/revivePayloadFromDatabase.ts
237
+ var isObjectRecord = (x) => typeof x === "object" && x !== null && !Array.isArray(x);
238
+ var parsePath = (pathStr) => {
239
+ const tokens = pathStr.split(".").filter(Boolean);
240
+ const segs = [];
241
+ for (const token of tokens) {
242
+ if (token.endsWith("[]")) {
243
+ const name = token.slice(0, -2);
244
+ if (name.length === 0) {
245
+ throw new Error(
246
+ `Invalid enum revival path "${pathStr}": empty key before []`
247
+ );
248
+ }
249
+ segs.push({ type: "prop", name }, { type: "arrayEach" });
250
+ } else {
251
+ segs.push({ type: "prop", name: token });
252
+ }
253
+ }
254
+ const last = segs.at(-1);
255
+ if (!last || last.type !== "prop") {
256
+ throw new Error(
257
+ `Invalid enum revival path "${pathStr}": must end with a property name (not [])`
258
+ );
259
+ }
260
+ return segs;
261
+ };
262
+ var reviveLeaf = (host, key, smartEnum, strict, pathLabel) => {
263
+ const raw = host[key];
264
+ if (typeof raw !== "string") {
265
+ return;
266
+ }
267
+ const revived = smartEnum.tryFromValue(raw);
268
+ if (revived !== void 0) {
269
+ host[key] = revived;
270
+ } else if (strict) {
271
+ throw new EnumRevivalError(
272
+ `Cannot revive path "${pathLabel}": unknown enum value ${JSON.stringify(raw)}`,
273
+ pathLabel,
274
+ raw
275
+ );
276
+ }
277
+ };
278
+ var walkPath = (value, segs, segIndex, smartEnum, strict, pathLabel) => {
279
+ const seg = segs[segIndex];
280
+ if (seg === void 0) {
281
+ return;
282
+ }
283
+ const isLast = segIndex === segs.length - 1;
284
+ if (isLast) {
285
+ if (seg.type !== "prop") {
286
+ return;
287
+ }
288
+ if (!isObjectRecord(value)) {
289
+ if (strict) {
290
+ throw new EnumRevivalError(
291
+ `Cannot revive path "${pathLabel}": expected object at parent of "${seg.name}"`,
292
+ pathLabel,
293
+ value
294
+ );
295
+ }
296
+ return;
297
+ }
298
+ reviveLeaf(value, seg.name, smartEnum, strict, pathLabel);
299
+ return;
300
+ }
301
+ if (seg.type === "prop") {
302
+ if (!isObjectRecord(value)) {
303
+ if (strict) {
304
+ throw new EnumRevivalError(
305
+ `Cannot revive path "${pathLabel}": expected object at "${seg.name}"`,
306
+ pathLabel,
307
+ value
308
+ );
309
+ }
310
+ return;
311
+ }
312
+ walkPath(value[seg.name], segs, segIndex + 1, smartEnum, strict, pathLabel);
313
+ return;
314
+ }
315
+ if (seg.type === "arrayEach") {
316
+ if (!Array.isArray(value)) {
317
+ if (strict) {
318
+ throw new EnumRevivalError(
319
+ `Cannot revive path "${pathLabel}": expected array before nested path`,
320
+ pathLabel,
321
+ value
322
+ );
323
+ }
324
+ return;
325
+ }
326
+ for (const el of value) {
327
+ walkPath(el, segs, segIndex + 1, smartEnum, strict, pathLabel);
328
+ }
329
+ }
330
+ };
331
+ var revivePayloadFromDatabase = (payload, options) => {
332
+ const { pathEnumMapping, strict = false } = options;
333
+ const root = structuredClone(payload);
334
+ for (const [pathStr, smartEnum] of Object.entries(pathEnumMapping)) {
335
+ const segs = parsePath(pathStr);
336
+ walkPath(root, segs, 0, smartEnum, strict, pathStr);
337
+ }
338
+ return root;
339
+ };
340
+ // Annotate the CommonJS export names for ESM import in node:
341
+ 0 && (module.exports = {
342
+ EnumRevivalError,
343
+ enumeration,
344
+ isSmartEnum,
345
+ isSmartEnumItem,
346
+ prepareForDatabase,
347
+ revivePayloadFromDatabase,
348
+ reviveRowFromDatabase
349
+ });
350
+ //# sourceMappingURL=database.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/database.ts","../src/enumerations.ts","../src/extensionMethods.ts","../src/types.ts","../src/utilities/typeGuards.ts","../src/db/prepareForDatabase.ts","../src/db/enumRevivalError.ts","../src/db/reviveRowFromDatabase.ts","../src/db/revivePayloadFromDatabase.ts"],"sourcesContent":["/**\n * Smart Enums — database persistence helpers (`src/db`).\n *\n * Transport wire revival (`initializeSmartEnumMappings`, `reviveAfterTransport`)\n * is exported from `ts-smart-enum/transport` and `ts-smart-enum` root.\n *\n * @example\n * ```typescript\n * import {\n * enumeration,\n * prepareForDatabase,\n * reviveRowFromDatabase,\n * } from 'ts-smart-enum/database';\n * ```\n */\n\nexport { enumeration } from './enumerations.js';\nexport { isSmartEnumItem, isSmartEnum } from './utilities/typeGuards.js';\nexport {\n prepareForDatabase,\n reviveRowFromDatabase,\n revivePayloadFromDatabase,\n EnumRevivalError,\n} from './db/index.js';\nexport type { Logger } from './utilities/logger.js';\nexport type {\n Enumeration,\n AnyEnumLike,\n DatabaseFormat,\n SmartApiHelperConfig,\n LogLevel,\n SmartEnumMappingsConfig,\n SmartEnumLike,\n FieldEnumMapping,\n ReviveRowOptions,\n PathEnumMapping,\n RevivePayloadOptions,\n} from './types.js';\n","import { capitalCase, constantCase } from 'case-anything';\n\nimport { addExtensionMethods } from './extensionMethods.js';\nimport { SMART_ENUM, SMART_ENUM_ID, SMART_ENUM_ITEM } from './types.js';\n\ntype BuiltInOverrideKeys =\n | 'key'\n | 'value'\n | 'display'\n | 'deprecated'\n | 'index'\n | '__smart_enum_brand'\n | '__smart_enum_type';\n\nexport type StandardEnumItem = {\n readonly __smart_enum_brand: true;\n readonly __smart_enum_type: string;\n readonly key: string;\n readonly value: string;\n readonly display: string;\n readonly index: number;\n readonly deprecated?: boolean;\n readonly toPostgres: () => string;\n};\n\nexport type EnumInputItem = Partial<{\n key: string;\n value: string;\n display: string;\n deprecated: boolean;\n}> &\n object;\n\nexport type ObjectEnumInput = Record<string, EnumInputItem>;\n\ntype EmptyEnumInputItem = Record<never, never>;\n\ntype Separator = '-' | '_' | ' ' | '.';\n\ntype IsUpperChar<C extends string> =\n C extends Uppercase<C> ? (C extends Lowercase<C> ? false : true) : false;\n\ntype IsLowerChar<C extends string> =\n C extends Lowercase<C> ? (C extends Uppercase<C> ? false : true) : false;\n\ntype PushUnderscore<S extends string> = S extends '' | `${string}_`\n ? S\n : `${S}_`;\n\ntype TrimUnderscore<S extends string> = S extends `_${infer R}`\n ? TrimUnderscore<R>\n : S extends `${infer R}_`\n ? TrimUnderscore<R>\n : S;\n\ntype CollapseUnderscores<S extends string> = S extends `${infer A}__${infer B}`\n ? CollapseUnderscores<`${A}_${B}`>\n : S;\n\ntype ConstantCaseInternal<\n S extends string,\n Prev extends string = '',\n Out extends string = '',\n> = S extends `${infer C}${infer Rest}`\n ? C extends Separator\n ? ConstantCaseInternal<Rest, C, PushUnderscore<Out>>\n : IsUpperChar<C> extends true\n ? IsLowerChar<Prev> extends true\n ? ConstantCaseInternal<Rest, C, `${PushUnderscore<Out>}${Uppercase<C>}`>\n : ConstantCaseInternal<Rest, C, `${Out}${Uppercase<C>}`>\n : ConstantCaseInternal<Rest, C, `${Out}${Uppercase<C>}`>\n : CollapseUnderscores<TrimUnderscore<Out>>;\n\ntype ConstantCase<S extends string> = string extends S\n ? string\n : ConstantCaseInternal<S>;\n\ntype ArrayToObjectType<T extends readonly string[]> = {\n [K in T[number]]: EmptyEnumInputItem & { readonly value?: ConstantCase<K> };\n};\n\ntype NormalizedInputType<TInput> = TInput extends readonly string[]\n ? ArrayToObjectType<TInput>\n : TInput extends ObjectEnumInput\n ? TInput\n : never;\n\ntype UnionKeys<T> = T extends T ? keyof T : never;\n\ntype MergeUnionToObject<T> = {\n [K in UnionKeys<T>]: T extends Record<K, infer V> ? V : undefined;\n};\n\ntype ExtraShapeUnion<TObj extends ObjectEnumInput> = {\n [K in keyof TObj]: Omit<TObj[K], BuiltInOverrideKeys>;\n}[keyof TObj];\n\nexport type InferredExtraFields<TObj extends ObjectEnumInput> =\n MergeUnionToObject<ExtraShapeUnion<TObj>>;\n\nexport type EnumItemFromNormalizedObject<\n TObj extends ObjectEnumInput,\n K extends keyof TObj = keyof TObj,\n> = Omit<StandardEnumItem, 'key' | 'value'> &\n InferredExtraFields<TObj> & {\n readonly key: Extract<K, string>;\n readonly value: TObj[K] extends { value?: infer V }\n ? Extract<V, string> extends never\n ? string\n : Extract<V, string>\n : string;\n };\n\nexport type EnumMemberUnionFromNormalizedObject<TObj extends ObjectEnumInput> =\n {\n [K in keyof TObj]: EnumItemFromNormalizedObject<TObj, K>;\n }[keyof TObj];\n\nexport type CoreEnumMethods<TItem extends StandardEnumItem> = {\n fromValue(value: string): TItem;\n tryFromValue(value?: string | null): TItem | undefined;\n fromKey(key: string): TItem;\n tryFromKey(key?: string | null): TItem | undefined;\n items(): readonly TItem[];\n values(): readonly string[];\n keys(): readonly string[];\n};\n\nexport type EnumFromNormalizedObject<TObj extends ObjectEnumInput> = {\n [K in keyof TObj]: EnumItemFromNormalizedObject<TObj, K>;\n} & CoreEnumMethods<EnumMemberUnionFromNormalizedObject<TObj>>;\n\nexport type EnumerationProps<TInput> = {\n input: TInput;\n propertyAutoFormatters?: PropertyAutoFormatter[];\n};\n\nexport type EnumItem<TEnum> = {\n [K in keyof TEnum]: TEnum[K] extends { __smart_enum_brand: true }\n ? TEnum[K]\n : never;\n}[keyof TEnum];\n\nexport type PropertyAutoFormatter = {\n key: string;\n format: (k: string) => string;\n};\n\ntype FinalizedEnumFields = Pick<\n StandardEnumItem,\n '__smart_enum_brand' | '__smart_enum_type'\n>;\n\ntype FinalizableEnumItem = {\n key: string;\n value: string;\n display: string;\n index: number;\n deprecated?: boolean;\n};\n\nfunction normalizeInput<TInput extends readonly string[] | ObjectEnumInput>(\n input: TInput,\n): NormalizedInputType<TInput> {\n if (Array.isArray(input)) {\n return Object.fromEntries(\n input.map(k => [k, {}]),\n ) as NormalizedInputType<TInput>;\n }\n\n return input as NormalizedInputType<TInput>;\n}\n\nconst finalizeEnumItem = <T extends { value: string }>(\n item: T,\n enumType: string,\n enumInstanceId: symbol,\n): T & FinalizedEnumFields => {\n Object.defineProperty(item, SMART_ENUM_ITEM, {\n value: true,\n enumerable: false,\n });\n\n Object.defineProperty(item, SMART_ENUM_ID, {\n value: enumInstanceId,\n enumerable: false,\n });\n\n Object.defineProperty(item, '__smart_enum_brand', {\n value: true,\n enumerable: false,\n });\n\n Object.defineProperty(item, '__smart_enum_type', {\n value: enumType,\n enumerable: false,\n });\n\n Object.defineProperty(item, 'toJSON', {\n value: () => ({ __smart_enum_type: enumType, value: item.value }),\n enumerable: false,\n });\n\n Object.defineProperty(item, 'toPostgres', {\n value: () => item.value,\n enumerable: false,\n });\n\n return item as T & FinalizedEnumFields;\n};\n\nconst formatProperties = (\n k: string,\n formatters: PropertyAutoFormatter[],\n): { value: string; display: string } & Record<string, string> =>\n formatters.reduce(\n (acc, formatter) => {\n acc[formatter.key] = formatter.format(k);\n return acc;\n },\n {\n value: constantCase(k),\n display: capitalCase(k),\n } as { value: string; display: string } & Record<string, string>,\n );\n\nfunction buildEnumFromObject<TObj extends ObjectEnumInput>(\n enumType: string,\n input: TObj,\n propertyAutoFormatters?: PropertyAutoFormatter[],\n): EnumFromNormalizedObject<TObj> {\n const formattersWithDefaults: PropertyAutoFormatter[] = [\n { key: 'value', format: constantCase },\n { key: 'display', format: capitalCase },\n ...(propertyAutoFormatters ?? []),\n ];\n\n type TItem = EnumItemFromNormalizedObject<TObj>;\n\n const rawEnumItems = {} as {\n [K in keyof TObj]: EnumItemFromNormalizedObject<TObj, K>;\n };\n\n const enumInstanceId = Symbol('smart-enum-instance');\n let index = 0;\n\n for (const key in input) {\n if (Object.prototype.hasOwnProperty.call(input, key)) {\n const typedKey = key;\n const value = input[typedKey];\n\n const enumItemBase = {\n index,\n key: typedKey,\n ...formatProperties(typedKey, formattersWithDefaults),\n ...value,\n } as FinalizableEnumItem & TObj[typeof typedKey];\n\n const enumItem = finalizeEnumItem(\n enumItemBase,\n enumType,\n enumInstanceId,\n ) as unknown as TItem;\n\n Object.freeze(enumItem);\n rawEnumItems[typedKey] = enumItem;\n index++;\n }\n }\n\n const extensionMethods = addExtensionMethods<TItem>(\n Object.values(rawEnumItems) as TItem[],\n );\n\n const enumObject = {\n ...rawEnumItems,\n ...extensionMethods,\n } as EnumFromNormalizedObject<TObj>;\n\n Object.defineProperty(enumObject, SMART_ENUM, {\n value: true,\n enumerable: false,\n });\n\n Object.freeze(enumObject);\n\n return enumObject;\n}\n\nexport function enumeration<const TArr extends readonly string[]>(\n enumType: string,\n props: EnumerationProps<TArr>,\n): EnumFromNormalizedObject<NormalizedInputType<TArr>>;\n\nexport function enumeration<const TObj extends ObjectEnumInput>(\n enumType: string,\n props: EnumerationProps<TObj>,\n): EnumFromNormalizedObject<NormalizedInputType<TObj>>;\n\nexport function enumeration(\n enumType: string,\n props: EnumerationProps<readonly string[] | ObjectEnumInput>,\n) {\n const normalized = normalizeInput(props.input);\n return buildEnumFromObject(\n enumType,\n normalized,\n props.propertyAutoFormatters,\n );\n}\n","import type { CoreEnumMethods, StandardEnumItem } from './types.js';\nexport const addExtensionMethods = <TItem extends StandardEnumItem>(\n enumItems: readonly TItem[],\n): CoreEnumMethods<TItem> => {\n const findBy = <K extends keyof TItem>(field: K, target: TItem[K]) =>\n enumItems.find(item => item[field] === target);\n\n const requireBy = <K extends keyof TItem>(\n field: K,\n target: TItem[K],\n label: string,\n ) => {\n const item = findBy(field, target);\n if (!item) {\n throw new Error(`No enum ${label} found for '${String(target)}'`);\n }\n return item;\n };\n\n return {\n fromValue: value => requireBy('value', value as TItem['value'], 'value'),\n tryFromValue: value =>\n value ? findBy('value', value as TItem['value']) : undefined,\n\n fromKey: key => requireBy('key', key as TItem['key'], 'key'),\n tryFromKey: key => (key ? findBy('key', key as TItem['key']) : undefined),\n\n items: () => [...enumItems],\n values: () => enumItems.map(item => item.value),\n keys: () => enumItems.map(item => item.key),\n };\n};\n","/**\n * Type guard to check if a value is not null or undefined\n * @param value - The value to check\n * @returns True if the value is defined and not null\n */\nexport const notEmpty = <X>(\n value: X | null | undefined,\n): value is NonNullable<X> => {\n // eslint-disable-next-line unicorn/no-null\n return value != null;\n};\n\n// Public symbols used at runtime for detection/identity (not used in type keys)\nexport const SMART_ENUM_ITEM = Symbol('smart-enum-item');\nexport const SMART_ENUM_ID = Symbol('smart-enum-id');\nexport const SMART_ENUM = Symbol('smart-enum');\n\n/**\n * Options for filtering enum items in various methods\n */\nexport type EnumFilterOptions = {\n /** Include items with null/undefined values (default: false) */\n showEmpty?: boolean;\n /** Include deprecated items (default: false) */\n showDeprecated?: boolean;\n};\n\n// export type EnumInput = readonly string[] | ObjectEnumInput;\n\n/**\n * Compile-time transformer: replaces Smart Enum items with string values,\n * recursively over arrays and objects. Structural detection checks for\n * presence of `key` and `value`.\n */\nexport type SerializedSmartEnums<T> = T extends { value: string; key: unknown }\n ? string\n : T extends ReadonlyArray<infer U>\n ? ReadonlyArray<SerializedSmartEnums<U>>\n : T extends Array<infer U>\n ? SerializedSmartEnums<U>[]\n : T extends object\n ? { [K in keyof T]: SerializedSmartEnums<T[K]> }\n : T;\n\n/**\n * Revived shape: for keys present in mapping M, the string becomes the\n * corresponding enum item type (derived from the provided enum object);\n * other fields recurse.\n */\nexport type EnumItemFromEnum<TEnum> =\n TEnum extends Record<string, infer V>\n ? V extends { __smart_enum_brand: true }\n ? V\n : never\n : never;\n\n// Structural constraint for enum objects passed to reviveSmartEnums mapping\nexport type AnyEnumLike = {\n tryFromValue: (value?: string | null) => unknown;\n tryFromKey: (key?: string | null) => unknown;\n} & Record<string, unknown>;\n\nexport type SmartEnumLike<T = unknown> = {\n tryFromValue: (value: string) => T | undefined;\n};\n\nexport type FieldEnumMapping = Record<string, SmartEnumLike>;\n\nexport type ReviveRowOptions = {\n fieldEnumMapping: FieldEnumMapping;\n strict?: boolean;\n};\n\nexport type PathEnumMapping = Record<string, SmartEnumLike>;\n\nexport type RevivePayloadOptions = {\n pathEnumMapping: PathEnumMapping;\n strict?: boolean;\n};\n\nexport type RevivedSmartEnums<T, M extends Record<string, AnyEnumLike>> =\n T extends ReadonlyArray<infer U>\n ? RevivedSmartEnums<U, M>[]\n : T extends Array<infer U>\n ? RevivedSmartEnums<U, M>[]\n : T extends object\n ? {\n [K in keyof T]: K extends Extract<keyof M, string>\n ? Enumeration<M[K]>\n : RevivedSmartEnums<T[K], M>;\n }\n : T;\n\nexport type SmartEnumItemSerialized = {\n __smart_enum_type: string;\n value: string;\n};\n\n/** Example shape for transport tests (`reviveAfterTransport` registry). */\nexport type SmartApiHelperConfig = {\n enumRegistry: Record<string, AnyEnumLike>;\n};\n\n/**\n * Compile-time transformer: replaces Smart Enum items with string values,\n * recursively over arrays and objects. Used for database storage.\n */\nexport type DatabaseFormat<T> = T extends { value: string; key: unknown }\n ? string\n : T extends ReadonlyArray<infer U>\n ? ReadonlyArray<DatabaseFormat<U>>\n : T extends Array<infer U>\n ? DatabaseFormat<U>[]\n : T extends object\n ? { [K in keyof T]: DatabaseFormat<T[K]> }\n : T;\n\n/**\n * Log levels for smart enum mappings\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/**\n * Configuration for smart enum mappings initialization\n */\nexport type SmartEnumMappingsConfig = {\n enumRegistry: Record<string, AnyEnumLike>;\n logLevel?: LogLevel;\n logger?: import('./utilities/logger.js').Logger;\n};\n\ntype BuiltInOverrideKeys =\n | 'key'\n | 'value'\n | 'display'\n | 'deprecated'\n | 'index'\n | '__smart_enum_brand'\n | '__smart_enum_type';\n\nexport type StandardEnumItem = {\n readonly __smart_enum_brand: true;\n readonly __smart_enum_type: string;\n readonly key: string;\n readonly value: string;\n readonly display: string;\n readonly index: number;\n readonly deprecated?: boolean;\n readonly toPostgres: () => string;\n};\nexport type EnumInputItem = Partial<{\n key: string;\n value: string;\n display: string;\n deprecated: boolean;\n}> &\n Record<string, unknown>;\n\nexport type ObjectEnumInput = Record<string, EnumInputItem>;\n\nexport type EmptyEnumInputItem = Record<never, never>;\n\nexport type ArrayToObjectType<T extends readonly string[]> = {\n [K in T[number]]: EmptyEnumInputItem;\n};\n\nexport type NormalizedInputType<TInput> = TInput extends readonly string[]\n ? ArrayToObjectType<TInput>\n : TInput extends ObjectEnumInput\n ? TInput\n : never;\n\nexport type EnumItemFromNormalizedObject<\n TObj extends ObjectEnumInput,\n K extends keyof TObj = keyof TObj,\n> = Omit<StandardEnumItem, 'key'> &\n InferredExtraFields<TObj> & {\n readonly key: Extract<K, string>;\n };\n\nexport type EnumMemberUnionFromNormalizedObject<TObj extends ObjectEnumInput> =\n {\n [K in keyof TObj]: EnumItemFromNormalizedObject<TObj, K>;\n }[keyof TObj];\n\nexport type EnumFromNormalizedObject<TObj extends ObjectEnumInput> = {\n [K in keyof TObj]: EnumItemFromNormalizedObject<TObj, K>;\n} & CoreEnumMethods<EnumMemberUnionFromNormalizedObject<TObj>>;\n\nexport type UnionKeys<T> = T extends T ? keyof T : never;\n\n/*\nTo widen the type of the OptionalObject from literals to their actual types,\ne.g.\nshape?: \"round\" | \"square\" | \"long\";\nslices?: true;\nlayers?: 2;\n--turns into:--\nshape: string | undefined;\nslices: boolean| undefined;\nlayers: number| undefined;\n\nwe can use the following code:\ntype Widen<T> = T extends string\n ? string\n : T extends number\n ? number\n : T extends boolean\n ? boolean\n : T;\n\ntype MergeUnionToObject<T> = {\n [K in UnionKeys<T>]: T extends Record<K, infer V> ? Widen<V> : undefined;\n};\n*/\n\ntype MergeUnionToObject<T> = {\n [K in UnionKeys<T>]: T extends Record<K, infer V> ? V : undefined;\n};\n\ntype ExtraShapeUnion<TObj extends ObjectEnumInput> = {\n [K in keyof TObj]: Omit<TObj[K], BuiltInOverrideKeys>;\n}[keyof TObj];\n\nexport type InferredExtraFields<TObj extends ObjectEnumInput> =\n MergeUnionToObject<ExtraShapeUnion<TObj>>;\n\nexport type PropertyAutoFormatter = {\n /** The property name to generate */\n key: string;\n /** Function to transform the key into the property value */\n format: (k: string) => string;\n};\n\nexport type CoreEnumMethods<TItem extends StandardEnumItem> = {\n fromValue(value: string): TItem;\n tryFromValue(value?: string | null): TItem | undefined;\n fromKey(key: string): TItem;\n tryFromKey(key?: string | null): TItem | undefined;\n items(): readonly TItem[];\n values(): readonly string[];\n keys(): readonly string[];\n};\n\nexport type EnumerationProps<TInput> = {\n input: TInput;\n propertyAutoFormatters?: PropertyAutoFormatter[];\n};\n\nexport type Enumeration<TEnum> =\n TEnum extends Record<string, infer V>\n ? V extends { __smart_enum_brand: true }\n ? V\n : never\n : never;\n\nexport type FinalizedEnumFields = Pick<\n StandardEnumItem,\n '__smart_enum_brand' | '__smart_enum_type'\n>;\nexport type FinalizableEnumItem = {\n key: string;\n value: string;\n display: string;\n index: number;\n deprecated?: boolean;\n};\n","import {\n SMART_ENUM_ITEM,\n SMART_ENUM,\n SmartEnumItemSerialized,\n} from '../types.js';\n\n/**\n * Runtime type guard to detect Smart Enum items created by this library.\n * Returns true if the value has the SMART_ENUM_ITEM symbol.\n *\n * @example\n * ```typescript\n * import { Status } from './status';\n * const item = Status.active;\n * isSmartEnumItem(item); // true\n * isSmartEnumItem({ key: 'active', value: 'ACTIVE' }); // false (plain object)\n * if (isSmartEnumItem(x)) {\n * console.log(x.value, x.__smart_enum_type); // narrowed to enum item\n * }\n * ```\n */\nexport const isSmartEnumItem = (\n x: unknown,\n): x is {\n key: string;\n value: string;\n index?: number;\n __smart_enum_type?: string;\n} => {\n return (\n !!x && typeof x === 'object' && Reflect.get(x, SMART_ENUM_ITEM) === true\n );\n};\n\n/**\n * Runtime type guard to detect a full Smart Enum object created by this library.\n * Returns true if the object has the SMART_ENUM property.\n *\n * @example\n * ```typescript\n * import { MyEnum } from './blah';\n * isSmartEnum(MyEnum) === true; // true\n * isSmartEnum(MyEnum.one) === false; // false (this is an item, not the enum)\n * ```\n */\nexport const isSmartEnum = (x: unknown): boolean => {\n return !!x && typeof x === 'object' && Reflect.get(x, SMART_ENUM) === true;\n};\n\n/**\n * Runtime type guard to detect a serialized Smart Enum item created by this library.\n * Returns true if the value has `__smart_enum_type` and `value` (wire/database shape).\n *\n * @example\n * ```typescript\n * const wire = { __smart_enum_type: 'Status', value: 'ACTIVE' };\n * isSerializedSmartEnumItem(wire); // true\n * isSerializedSmartEnumItem(Status.active); // false (live enum item)\n * if (isSerializedSmartEnumItem(x)) {\n * reviveItem(x.__smart_enum_type, x.value); // narrowed to SmartEnumItemSerialized\n * }\n * ```\n */\nexport const isSerializedSmartEnumItem = (\n x: unknown,\n): x is SmartEnumItemSerialized => {\n return (\n !!x &&\n typeof x === 'object' &&\n Reflect.has(x, '__smart_enum_type') &&\n Reflect.has(x, 'value')\n );\n};\n","import { isSmartEnumItem } from '../utilities/typeGuards.js';\nimport type { DatabaseFormat } from '../types.js';\n\ntype PlainObject = Record<string, unknown>;\n\nconst isPlainObject = (x: unknown): x is PlainObject =>\n typeof x === 'object' &&\n x !== null &&\n Object.getPrototypeOf(x) === Object.prototype;\n\n/**\n * Recursively replaces smart enum items with their `.value` strings for persistence.\n * Inbound revival requires explicit mapping (`reviveRowFromDatabase`, etc.).\n */\nexport const prepareForDatabase = <T>(payload: T): DatabaseFormat<T> => {\n const seen = new WeakMap<object, unknown>();\n\n const walk = (v: unknown): unknown => {\n if (isSmartEnumItem(v)) {\n return v.value;\n }\n\n if (typeof v === 'object' && v !== null && seen.has(v)) {\n return seen.get(v);\n }\n\n if (Array.isArray(v)) {\n const arr: unknown[] = [];\n seen.set(v, arr);\n for (const item of v) {\n arr.push(walk(item));\n }\n return arr;\n }\n if (isPlainObject(v)) {\n const out: PlainObject = {};\n seen.set(v, out);\n for (const [k, val] of Object.entries(v)) {\n out[k] = walk(val);\n }\n return out;\n }\n return v;\n };\n\n return walk(payload) as DatabaseFormat<T>;\n};\n","export class EnumRevivalError extends Error {\n public constructor(\n message: string,\n public readonly path: string,\n public readonly value: unknown,\n ) {\n super(message);\n this.name = 'EnumRevivalError';\n }\n}\n","import type { ReviveRowOptions } from '../types.js';\n\nimport { EnumRevivalError } from './enumRevivalError.js';\n\nexport const reviveRowFromDatabase = <T extends Record<string, unknown>>(\n row: T,\n options: ReviveRowOptions,\n): T => {\n const { fieldEnumMapping, strict = false } = options;\n const out = { ...row } as Record<string, unknown>;\n\n for (const [field, smartEnum] of Object.entries(fieldEnumMapping)) {\n if (!Object.hasOwn(out, field)) {\n continue;\n }\n const raw = out[field];\n if (typeof raw !== 'string') {\n continue;\n }\n const revived = smartEnum.tryFromValue(raw);\n if (revived !== undefined) {\n out[field] = revived as unknown;\n } else if (strict) {\n throw new EnumRevivalError(\n `Cannot revive field ${JSON.stringify(field)}: unknown enum value ${JSON.stringify(raw)}`,\n field,\n raw,\n );\n }\n }\n\n return out as T;\n};\n","import type { RevivePayloadOptions, SmartEnumLike } from '../types.js';\n\nimport { EnumRevivalError } from './enumRevivalError.js';\n\ntype PlainObject = Record<string, unknown>;\n\n/** Plain data objects (including `structuredClone` output where prototype may not be Object.prototype). */\nconst isObjectRecord = (x: unknown): x is PlainObject =>\n typeof x === 'object' && x !== null && !Array.isArray(x);\n\ntype PathSeg = { type: 'prop'; name: string } | { type: 'arrayEach' };\n\nconst parsePath = (pathStr: string): PathSeg[] => {\n const tokens = pathStr.split('.').filter(Boolean);\n const segs: PathSeg[] = [];\n\n for (const token of tokens) {\n if (token.endsWith('[]')) {\n const name = token.slice(0, -2);\n if (name.length === 0) {\n throw new Error(\n `Invalid enum revival path \"${pathStr}\": empty key before []`,\n );\n }\n segs.push({ type: 'prop', name }, { type: 'arrayEach' });\n } else {\n segs.push({ type: 'prop', name: token });\n }\n }\n\n const last = segs.at(-1);\n if (!last || last.type !== 'prop') {\n throw new Error(\n `Invalid enum revival path \"${pathStr}\": must end with a property name (not [])`,\n );\n }\n\n return segs;\n};\n\nconst reviveLeaf = (\n host: PlainObject,\n key: string,\n smartEnum: SmartEnumLike,\n strict: boolean,\n pathLabel: string,\n): void => {\n const raw = host[key];\n if (typeof raw !== 'string') {\n return;\n }\n const revived = smartEnum.tryFromValue(raw);\n if (revived !== undefined) {\n host[key] = revived as unknown;\n } else if (strict) {\n throw new EnumRevivalError(\n `Cannot revive path \"${pathLabel}\": unknown enum value ${JSON.stringify(raw)}`,\n pathLabel,\n raw,\n );\n }\n};\n\nconst walkPath = (\n value: unknown,\n segs: PathSeg[],\n segIndex: number,\n smartEnum: SmartEnumLike,\n strict: boolean,\n pathLabel: string,\n): void => {\n const seg = segs[segIndex];\n if (seg === undefined) {\n return;\n }\n\n const isLast = segIndex === segs.length - 1;\n\n if (isLast) {\n if (seg.type !== 'prop') {\n return;\n }\n if (!isObjectRecord(value)) {\n if (strict) {\n throw new EnumRevivalError(\n `Cannot revive path \"${pathLabel}\": expected object at parent of \"${seg.name}\"`,\n pathLabel,\n value,\n );\n }\n return;\n }\n reviveLeaf(value, seg.name, smartEnum, strict, pathLabel);\n return;\n }\n\n if (seg.type === 'prop') {\n if (!isObjectRecord(value)) {\n if (strict) {\n throw new EnumRevivalError(\n `Cannot revive path \"${pathLabel}\": expected object at \"${seg.name}\"`,\n pathLabel,\n value,\n );\n }\n return;\n }\n walkPath(value[seg.name], segs, segIndex + 1, smartEnum, strict, pathLabel);\n return;\n }\n\n if (seg.type === 'arrayEach') {\n if (!Array.isArray(value)) {\n if (strict) {\n throw new EnumRevivalError(\n `Cannot revive path \"${pathLabel}\": expected array before nested path`,\n pathLabel,\n value,\n );\n }\n return;\n }\n for (const el of value) {\n walkPath(el, segs, segIndex + 1, smartEnum, strict, pathLabel);\n }\n }\n};\n\nexport const revivePayloadFromDatabase = <T>(\n payload: T,\n options: RevivePayloadOptions,\n): T => {\n const { pathEnumMapping, strict = false } = options;\n const root = structuredClone(payload);\n\n for (const [pathStr, smartEnum] of Object.entries(pathEnumMapping)) {\n const segs = parsePath(pathStr);\n walkPath(root as unknown, segs, 0, smartEnum, strict, pathStr);\n }\n\n return root;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,2BAA0C;;;ACCnC,IAAM,sBAAsB,CACjC,cAC2B;AAC3B,QAAM,SAAS,CAAwB,OAAU,WAC/C,UAAU,KAAK,UAAQ,KAAK,KAAK,MAAM,MAAM;AAE/C,QAAM,YAAY,CAChB,OACA,QACA,UACG;AACH,UAAM,OAAO,OAAO,OAAO,MAAM;AACjC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,WAAW,KAAK,eAAe,OAAO,MAAM,CAAC,GAAG;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,WAAS,UAAU,SAAS,OAAyB,OAAO;AAAA,IACvE,cAAc,WACZ,QAAQ,OAAO,SAAS,KAAuB,IAAI;AAAA,IAErD,SAAS,SAAO,UAAU,OAAO,KAAqB,KAAK;AAAA,IAC3D,YAAY,SAAQ,MAAM,OAAO,OAAO,GAAmB,IAAI;AAAA,IAE/D,OAAO,MAAM,CAAC,GAAG,SAAS;AAAA,IAC1B,QAAQ,MAAM,UAAU,IAAI,UAAQ,KAAK,KAAK;AAAA,IAC9C,MAAM,MAAM,UAAU,IAAI,UAAQ,KAAK,GAAG;AAAA,EAC5C;AACF;;;AClBO,IAAM,kBAAkB,OAAO,iBAAiB;AAChD,IAAM,gBAAgB,OAAO,eAAe;AAC5C,IAAM,aAAa,OAAO,YAAY;;;AFkJ7C,SAAS,eACP,OAC6B;AAC7B,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,OAAO;AAAA,MACZ,MAAM,IAAI,OAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,mBAAmB,CACvB,MACA,UACA,mBAC4B;AAC5B,SAAO,eAAe,MAAM,iBAAiB;AAAA,IAC3C,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAED,SAAO,eAAe,MAAM,eAAe;AAAA,IACzC,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAED,SAAO,eAAe,MAAM,sBAAsB;AAAA,IAChD,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAED,SAAO,eAAe,MAAM,qBAAqB;AAAA,IAC/C,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAED,SAAO,eAAe,MAAM,UAAU;AAAA,IACpC,OAAO,OAAO,EAAE,mBAAmB,UAAU,OAAO,KAAK,MAAM;AAAA,IAC/D,YAAY;AAAA,EACd,CAAC;AAED,SAAO,eAAe,MAAM,cAAc;AAAA,IACxC,OAAO,MAAM,KAAK;AAAA,IAClB,YAAY;AAAA,EACd,CAAC;AAED,SAAO;AACT;AAEA,IAAM,mBAAmB,CACvB,GACA,eAEA,WAAW;AAAA,EACT,CAAC,KAAK,cAAc;AAClB,QAAI,UAAU,GAAG,IAAI,UAAU,OAAO,CAAC;AACvC,WAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,WAAO,mCAAa,CAAC;AAAA,IACrB,aAAS,kCAAY,CAAC;AAAA,EACxB;AACF;AAEF,SAAS,oBACP,UACA,OACA,wBACgC;AAChC,QAAM,yBAAkD;AAAA,IACtD,EAAE,KAAK,SAAS,QAAQ,kCAAa;AAAA,IACrC,EAAE,KAAK,WAAW,QAAQ,iCAAY;AAAA,IACtC,GAAI,0BAA0B,CAAC;AAAA,EACjC;AAIA,QAAM,eAAe,CAAC;AAItB,QAAM,iBAAiB,OAAO,qBAAqB;AACnD,MAAI,QAAQ;AAEZ,aAAW,OAAO,OAAO;AACvB,QAAI,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AACpD,YAAM,WAAW;AACjB,YAAM,QAAQ,MAAM,QAAQ;AAE5B,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,KAAK;AAAA,QACL,GAAG,iBAAiB,UAAU,sBAAsB;AAAA,QACpD,GAAG;AAAA,MACL;AAEA,YAAM,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO,OAAO,QAAQ;AACtB,mBAAa,QAAQ,IAAI;AACzB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB;AAAA,IACvB,OAAO,OAAO,YAAY;AAAA,EAC5B;AAEA,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO,eAAe,YAAY,YAAY;AAAA,IAC5C,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAED,SAAO,OAAO,UAAU;AAExB,SAAO;AACT;AAYO,SAAS,YACd,UACA,OACA;AACA,QAAM,aAAa,eAAe,MAAM,KAAK;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;AGhSO,IAAM,kBAAkB,CAC7B,MAMG;AACH,SACE,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,QAAQ,IAAI,GAAG,eAAe,MAAM;AAExE;AAaO,IAAM,cAAc,CAAC,MAAwB;AAClD,SAAO,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,QAAQ,IAAI,GAAG,UAAU,MAAM;AACxE;;;AC1CA,IAAM,gBAAgB,CAAC,MACrB,OAAO,MAAM,YACb,MAAM,QACN,OAAO,eAAe,CAAC,MAAM,OAAO;AAM/B,IAAM,qBAAqB,CAAI,YAAkC;AACtE,QAAM,OAAO,oBAAI,QAAyB;AAE1C,QAAM,OAAO,CAAC,MAAwB;AACpC,QAAI,gBAAgB,CAAC,GAAG;AACtB,aAAO,EAAE;AAAA,IACX;AAEA,QAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG;AACtD,aAAO,KAAK,IAAI,CAAC;AAAA,IACnB;AAEA,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,YAAM,MAAiB,CAAC;AACxB,WAAK,IAAI,GAAG,GAAG;AACf,iBAAW,QAAQ,GAAG;AACpB,YAAI,KAAK,KAAK,IAAI,CAAC;AAAA,MACrB;AACA,aAAO;AAAA,IACT;AACA,QAAI,cAAc,CAAC,GAAG;AACpB,YAAM,MAAmB,CAAC;AAC1B,WAAK,IAAI,GAAG,GAAG;AACf,iBAAW,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,CAAC,GAAG;AACxC,YAAI,CAAC,IAAI,KAAK,GAAG;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,OAAO;AACrB;;;AC9CO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACnC,YACL,SACgB,MACA,OAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,IAAM,wBAAwB,CACnC,KACA,YACM;AACN,QAAM,EAAE,kBAAkB,SAAS,MAAM,IAAI;AAC7C,QAAM,MAAM,EAAE,GAAG,IAAI;AAErB,aAAW,CAAC,OAAO,SAAS,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACjE,QAAI,CAAC,OAAO,OAAO,KAAK,KAAK,GAAG;AAC9B;AAAA,IACF;AACA,UAAM,MAAM,IAAI,KAAK;AACrB,QAAI,OAAO,QAAQ,UAAU;AAC3B;AAAA,IACF;AACA,UAAM,UAAU,UAAU,aAAa,GAAG;AAC1C,QAAI,YAAY,QAAW;AACzB,UAAI,KAAK,IAAI;AAAA,IACf,WAAW,QAAQ;AACjB,YAAM,IAAI;AAAA,QACR,uBAAuB,KAAK,UAAU,KAAK,CAAC,wBAAwB,KAAK,UAAU,GAAG,CAAC;AAAA,QACvF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACzBA,IAAM,iBAAiB,CAAC,MACtB,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAIzD,IAAM,YAAY,CAAC,YAA+B;AAChD,QAAM,SAAS,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AAChD,QAAM,OAAkB,CAAC;AAEzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,IAAI,GAAG;AACxB,YAAM,OAAO,MAAM,MAAM,GAAG,EAAE;AAC9B,UAAI,KAAK,WAAW,GAAG;AACrB,cAAM,IAAI;AAAA,UACR,8BAA8B,OAAO;AAAA,QACvC;AAAA,MACF;AACA,WAAK,KAAK,EAAE,MAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,IACzD,OAAO;AACL,WAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,GAAG,EAAE;AACvB,MAAI,CAAC,QAAQ,KAAK,SAAS,QAAQ;AACjC,UAAM,IAAI;AAAA,MACR,8BAA8B,OAAO;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,CACjB,MACA,KACA,WACA,QACA,cACS;AACT,QAAM,MAAM,KAAK,GAAG;AACpB,MAAI,OAAO,QAAQ,UAAU;AAC3B;AAAA,EACF;AACA,QAAM,UAAU,UAAU,aAAa,GAAG;AAC1C,MAAI,YAAY,QAAW;AACzB,SAAK,GAAG,IAAI;AAAA,EACd,WAAW,QAAQ;AACjB,UAAM,IAAI;AAAA,MACR,uBAAuB,SAAS,yBAAyB,KAAK,UAAU,GAAG,CAAC;AAAA,MAC5E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,WAAW,CACf,OACA,MACA,UACA,WACA,QACA,cACS;AACT,QAAM,MAAM,KAAK,QAAQ;AACzB,MAAI,QAAQ,QAAW;AACrB;AAAA,EACF;AAEA,QAAM,SAAS,aAAa,KAAK,SAAS;AAE1C,MAAI,QAAQ;AACV,QAAI,IAAI,SAAS,QAAQ;AACvB;AAAA,IACF;AACA,QAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,UAAI,QAAQ;AACV,cAAM,IAAI;AAAA,UACR,uBAAuB,SAAS,oCAAoC,IAAI,IAAI;AAAA,UAC5E;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,eAAW,OAAO,IAAI,MAAM,WAAW,QAAQ,SAAS;AACxD;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,QAAQ;AACvB,QAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,UAAI,QAAQ;AACV,cAAM,IAAI;AAAA,UACR,uBAAuB,SAAS,0BAA0B,IAAI,IAAI;AAAA,UAClE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,aAAS,MAAM,IAAI,IAAI,GAAG,MAAM,WAAW,GAAG,WAAW,QAAQ,SAAS;AAC1E;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,aAAa;AAC5B,QAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAI,QAAQ;AACV,cAAM,IAAI;AAAA,UACR,uBAAuB,SAAS;AAAA,UAChC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,eAAW,MAAM,OAAO;AACtB,eAAS,IAAI,MAAM,WAAW,GAAG,WAAW,QAAQ,SAAS;AAAA,IAC/D;AAAA,EACF;AACF;AAEO,IAAM,4BAA4B,CACvC,SACA,YACM;AACN,QAAM,EAAE,iBAAiB,SAAS,MAAM,IAAI;AAC5C,QAAM,OAAO,gBAAgB,OAAO;AAEpC,aAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,eAAe,GAAG;AAClE,UAAM,OAAO,UAAU,OAAO;AAC9B,aAAS,MAAiB,MAAM,GAAG,WAAW,QAAQ,OAAO;AAAA,EAC/D;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,20 @@
1
+ import { D as DatabaseFormat, h as ReviveRowOptions, j as RevivePayloadOptions } from './core-DgjOZ8Bg.cjs';
2
+ export { A as AnyEnumLike, E as Enumeration, F as FieldEnumMapping, b as LogLevel, L as Logger, P as PathEnumMapping, S as SmartApiHelperConfig, g as SmartEnumLike, c as SmartEnumMappingsConfig, e as enumeration, a as isSmartEnum, i as isSmartEnumItem } from './core-DgjOZ8Bg.cjs';
3
+
4
+ /**
5
+ * Recursively replaces smart enum items with their `.value` strings for persistence.
6
+ * Inbound revival requires explicit mapping (`reviveRowFromDatabase`, etc.).
7
+ */
8
+ declare const prepareForDatabase: <T>(payload: T) => DatabaseFormat<T>;
9
+
10
+ declare const reviveRowFromDatabase: <T extends Record<string, unknown>>(row: T, options: ReviveRowOptions) => T;
11
+
12
+ declare const revivePayloadFromDatabase: <T>(payload: T, options: RevivePayloadOptions) => T;
13
+
14
+ declare class EnumRevivalError extends Error {
15
+ readonly path: string;
16
+ readonly value: unknown;
17
+ constructor(message: string, path: string, value: unknown);
18
+ }
19
+
20
+ export { DatabaseFormat, EnumRevivalError, RevivePayloadOptions, ReviveRowOptions, prepareForDatabase, revivePayloadFromDatabase, reviveRowFromDatabase };
@@ -0,0 +1,20 @@
1
+ import { D as DatabaseFormat, h as ReviveRowOptions, j as RevivePayloadOptions } from './core-DgjOZ8Bg.js';
2
+ export { A as AnyEnumLike, E as Enumeration, F as FieldEnumMapping, b as LogLevel, L as Logger, P as PathEnumMapping, S as SmartApiHelperConfig, g as SmartEnumLike, c as SmartEnumMappingsConfig, e as enumeration, a as isSmartEnum, i as isSmartEnumItem } from './core-DgjOZ8Bg.js';
3
+
4
+ /**
5
+ * Recursively replaces smart enum items with their `.value` strings for persistence.
6
+ * Inbound revival requires explicit mapping (`reviveRowFromDatabase`, etc.).
7
+ */
8
+ declare const prepareForDatabase: <T>(payload: T) => DatabaseFormat<T>;
9
+
10
+ declare const reviveRowFromDatabase: <T extends Record<string, unknown>>(row: T, options: ReviveRowOptions) => T;
11
+
12
+ declare const revivePayloadFromDatabase: <T>(payload: T, options: RevivePayloadOptions) => T;
13
+
14
+ declare class EnumRevivalError extends Error {
15
+ readonly path: string;
16
+ readonly value: unknown;
17
+ constructor(message: string, path: string, value: unknown);
18
+ }
19
+
20
+ export { DatabaseFormat, EnumRevivalError, RevivePayloadOptions, ReviveRowOptions, prepareForDatabase, revivePayloadFromDatabase, reviveRowFromDatabase };
@@ -0,0 +1,21 @@
1
+ import {
2
+ EnumRevivalError,
3
+ prepareForDatabase,
4
+ revivePayloadFromDatabase,
5
+ reviveRowFromDatabase
6
+ } from "./chunk-YGXDKW6W.js";
7
+ import {
8
+ enumeration,
9
+ isSmartEnum,
10
+ isSmartEnumItem
11
+ } from "./chunk-NASPJET6.js";
12
+ export {
13
+ EnumRevivalError,
14
+ enumeration,
15
+ isSmartEnum,
16
+ isSmartEnumItem,
17
+ prepareForDatabase,
18
+ revivePayloadFromDatabase,
19
+ reviveRowFromDatabase
20
+ };
21
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}