@reharik/smart-enum 0.4.5 → 0.4.7

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.
@@ -1,230 +0,0 @@
1
- import {
2
- isSmartEnumItem
3
- } from "./chunk-WNCJN5E6.js";
4
-
5
- // src/db/prepareForDatabase.ts
6
- var isPlainObject = (x) => typeof x === "object" && x !== null && Object.getPrototypeOf(x) === Object.prototype;
7
- var prepareForDatabase = (payload) => {
8
- const seen = /* @__PURE__ */ new WeakMap();
9
- const walk = (v) => {
10
- if (isSmartEnumItem(v)) {
11
- return v.value;
12
- }
13
- if (typeof v === "object" && v !== null && seen.has(v)) {
14
- return seen.get(v);
15
- }
16
- if (Array.isArray(v)) {
17
- const arr = [];
18
- seen.set(v, arr);
19
- for (const item of v) {
20
- arr.push(walk(item));
21
- }
22
- return arr;
23
- }
24
- if (isPlainObject(v)) {
25
- const out = {};
26
- seen.set(v, out);
27
- for (const [k, val] of Object.entries(v)) {
28
- out[k] = walk(val);
29
- }
30
- return out;
31
- }
32
- return v;
33
- };
34
- return walk(payload);
35
- };
36
-
37
- // src/db/enumRevivalError.ts
38
- var EnumRevivalError = class extends Error {
39
- constructor(message, path, value) {
40
- super(message);
41
- this.path = path;
42
- this.value = value;
43
- this.name = "EnumRevivalError";
44
- }
45
- };
46
-
47
- // src/db/reviveRowFromDatabase.ts
48
- var reviveRowFromDatabase = (row, options) => {
49
- const { fieldEnumMapping, strict = false } = options;
50
- const out = { ...row };
51
- for (const [field, smartEnum] of Object.entries(fieldEnumMapping)) {
52
- if (!Object.hasOwn(out, field)) {
53
- continue;
54
- }
55
- const raw = out[field];
56
- if (typeof raw === "string") {
57
- const revived = smartEnum.tryFromValue(raw);
58
- if (revived !== void 0) {
59
- out[field] = revived;
60
- } else if (strict) {
61
- throw new EnumRevivalError(
62
- `Cannot revive field ${JSON.stringify(field)}: unknown enum value ${JSON.stringify(raw)}`,
63
- field,
64
- raw
65
- );
66
- }
67
- continue;
68
- }
69
- if (Array.isArray(raw)) {
70
- const revivedItems = [];
71
- for (const item of raw) {
72
- if (typeof item !== "string") {
73
- revivedItems.push(item);
74
- continue;
75
- }
76
- const revived = smartEnum.tryFromValue(item);
77
- if (revived !== void 0) {
78
- revivedItems.push(revived);
79
- } else if (strict) {
80
- throw new EnumRevivalError(
81
- `Cannot revive field ${JSON.stringify(field)}: unknown enum value ${JSON.stringify(item)} in array`,
82
- field,
83
- item
84
- );
85
- } else {
86
- revivedItems.push(item);
87
- }
88
- }
89
- out[field] = revivedItems;
90
- continue;
91
- }
92
- }
93
- return out;
94
- };
95
-
96
- // src/db/revivePayloadFromDatabase.ts
97
- var isObjectRecord = (x) => typeof x === "object" && x !== null && !Array.isArray(x);
98
- var parsePath = (pathStr) => {
99
- const tokens = pathStr.split(".").filter(Boolean);
100
- const segs = [];
101
- for (const token of tokens) {
102
- if (token.endsWith("[]")) {
103
- const name = token.slice(0, -2);
104
- if (name.length === 0) {
105
- throw new Error(
106
- `Invalid enum revival path "${pathStr}": empty key before []`
107
- );
108
- }
109
- segs.push({ type: "prop", name }, { type: "arrayEach" });
110
- } else {
111
- segs.push({ type: "prop", name: token });
112
- }
113
- }
114
- const last = segs.at(-1);
115
- if (!last || last.type !== "prop") {
116
- throw new Error(
117
- `Invalid enum revival path "${pathStr}": must end with a property name (not [])`
118
- );
119
- }
120
- return segs;
121
- };
122
- var reviveLeaf = (host, key, smartEnum, strict, pathLabel) => {
123
- const raw = host[key];
124
- if (typeof raw === "string") {
125
- const revived = smartEnum.tryFromValue(raw);
126
- if (revived !== void 0) {
127
- host[key] = revived;
128
- } else if (strict) {
129
- throw new EnumRevivalError(
130
- `Cannot revive path "${pathLabel}": unknown enum value ${JSON.stringify(raw)}`,
131
- pathLabel,
132
- raw
133
- );
134
- }
135
- return;
136
- }
137
- if (Array.isArray(raw)) {
138
- const revivedItems = [];
139
- for (const item of raw) {
140
- if (typeof item !== "string") {
141
- revivedItems.push(item);
142
- continue;
143
- }
144
- const revived = smartEnum.tryFromValue(item);
145
- if (revived !== void 0) {
146
- revivedItems.push(revived);
147
- } else if (strict) {
148
- throw new EnumRevivalError(
149
- `Cannot revive path "${pathLabel}": unknown enum value ${JSON.stringify(item)} in array`,
150
- pathLabel,
151
- item
152
- );
153
- } else {
154
- revivedItems.push(item);
155
- }
156
- }
157
- host[key] = revivedItems;
158
- return;
159
- }
160
- };
161
- var walkPath = (value, segs, segIndex, smartEnum, strict, pathLabel) => {
162
- const seg = segs[segIndex];
163
- if (seg === void 0) {
164
- return;
165
- }
166
- const isLast = segIndex === segs.length - 1;
167
- if (isLast) {
168
- if (seg.type !== "prop") {
169
- return;
170
- }
171
- if (!isObjectRecord(value)) {
172
- if (strict) {
173
- throw new EnumRevivalError(
174
- `Cannot revive path "${pathLabel}": expected object at parent of "${seg.name}"`,
175
- pathLabel,
176
- value
177
- );
178
- }
179
- return;
180
- }
181
- reviveLeaf(value, seg.name, smartEnum, strict, pathLabel);
182
- return;
183
- }
184
- if (seg.type === "prop") {
185
- if (!isObjectRecord(value)) {
186
- if (strict) {
187
- throw new EnumRevivalError(
188
- `Cannot revive path "${pathLabel}": expected object at "${seg.name}"`,
189
- pathLabel,
190
- value
191
- );
192
- }
193
- return;
194
- }
195
- walkPath(value[seg.name], segs, segIndex + 1, smartEnum, strict, pathLabel);
196
- return;
197
- }
198
- if (seg.type === "arrayEach") {
199
- if (!Array.isArray(value)) {
200
- if (strict) {
201
- throw new EnumRevivalError(
202
- `Cannot revive path "${pathLabel}": expected array before nested path`,
203
- pathLabel,
204
- value
205
- );
206
- }
207
- return;
208
- }
209
- for (const el of value) {
210
- walkPath(el, segs, segIndex + 1, smartEnum, strict, pathLabel);
211
- }
212
- }
213
- };
214
- var revivePayloadFromDatabase = (payload, options) => {
215
- const { pathEnumMapping, strict = false } = options;
216
- const root = structuredClone(payload);
217
- for (const [pathStr, smartEnum] of Object.entries(pathEnumMapping)) {
218
- const segs = parsePath(pathStr);
219
- walkPath(root, segs, 0, smartEnum, strict, pathStr);
220
- }
221
- return root;
222
- };
223
-
224
- export {
225
- prepareForDatabase,
226
- EnumRevivalError,
227
- reviveRowFromDatabase,
228
- revivePayloadFromDatabase
229
- };
230
- //# sourceMappingURL=chunk-62LMAE3X.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/db/prepareForDatabase.ts","../src/db/enumRevivalError.ts","../src/db/reviveRowFromDatabase.ts","../src/db/revivePayloadFromDatabase.ts"],"sourcesContent":["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\n if (typeof raw === 'string') {\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 continue;\n }\n\n if (Array.isArray(raw)) {\n const revivedItems: unknown[] = [];\n for (const item of raw) {\n if (typeof item !== 'string') {\n revivedItems.push(item);\n continue;\n }\n const revived = smartEnum.tryFromValue(item);\n if (revived !== undefined) {\n revivedItems.push(revived);\n } else if (strict) {\n throw new EnumRevivalError(\n `Cannot revive field ${JSON.stringify(field)}: unknown enum value ${JSON.stringify(item)} in array`,\n field,\n item,\n );\n } else {\n revivedItems.push(item);\n }\n }\n out[field] = revivedItems;\n continue;\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\n if (typeof raw === 'string') {\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 return;\n }\n\n if (Array.isArray(raw)) {\n const revivedItems: unknown[] = [];\n for (const item of raw) {\n if (typeof item !== 'string') {\n revivedItems.push(item);\n continue;\n }\n const revived = smartEnum.tryFromValue(item);\n if (revived !== undefined) {\n revivedItems.push(revived);\n } else if (strict) {\n throw new EnumRevivalError(\n `Cannot revive path \"${pathLabel}\": unknown enum value ${JSON.stringify(item)} in array`,\n pathLabel,\n item,\n );\n } else {\n revivedItems.push(item);\n }\n }\n host[key] = revivedItems;\n return;\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":"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","names":[]}
@@ -1,54 +0,0 @@
1
- import {
2
- addExtensionMethods,
3
- isSmartEnumItem
4
- } from "./chunk-WNCJN5E6.js";
5
-
6
- // src/utilities/getSubsetByProp.ts
7
- var RESERVED_ENUM_MEMBER_KEYS = /* @__PURE__ */ new Set([
8
- "fromValue",
9
- "tryFromValue",
10
- "fromKey",
11
- "tryFromKey",
12
- "items",
13
- "values",
14
- "keys"
15
- ]);
16
- var getSubsetByProp = (enumInstance, prop, value) => {
17
- const matching = [];
18
- const memberEntries = {};
19
- for (const key of Reflect.ownKeys(enumInstance)) {
20
- if (typeof key !== "string" || RESERVED_ENUM_MEMBER_KEYS.has(key)) {
21
- continue;
22
- }
23
- const entry = enumInstance[key];
24
- if (!isSmartEnumItem(entry)) {
25
- continue;
26
- }
27
- const item = entry;
28
- if (Object.is(item[prop], value)) {
29
- memberEntries[key] = item;
30
- matching.push(item);
31
- }
32
- }
33
- const methods = addExtensionMethods(
34
- matching
35
- );
36
- return {
37
- ...memberEntries,
38
- ...methods
39
- };
40
- };
41
- var subsetByProp = (prop) => (enumInstance, value) => (
42
- // `getSubsetByProp` widens `prop` in its return; re-assert to keep curried literal `P` for Pick/Extract.
43
- getSubsetByProp(
44
- enumInstance,
45
- prop,
46
- value
47
- )
48
- );
49
-
50
- export {
51
- getSubsetByProp,
52
- subsetByProp
53
- };
54
- //# sourceMappingURL=chunk-F65KCMGE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utilities/getSubsetByProp.ts"],"sourcesContent":["import { addExtensionMethods } from '../extensionMethods.js';\nimport type {\n SmartEnumLike,\n SmartEnumMemberUnion,\n SmartEnumSubsetItemUnion,\n SmartEnumSubsetView,\n StandardEnumItem,\n} from '../types.js';\n\nimport { isSmartEnumItem } from './typeGuards.js';\n\nconst RESERVED_ENUM_MEMBER_KEYS = new Set([\n 'fromValue',\n 'tryFromValue',\n 'fromKey',\n 'tryFromKey',\n 'items',\n 'values',\n 'keys',\n]);\n\n/**\n * Returns an enum-like view of members whose `prop` equals `value`.\n * Original item objects are reused (not cloned). Method lookups only consider the subset.\n *\n * Requires a {@link SmartEnumLike} (e.g. the result of {@link enumeration}).\n *\n * @example\n * ```ts\n * const mediaOnly = getSubsetByProp(AppErrorEnum, 'source', 'mediaItem' as const);\n * ```\n */\nexport const getSubsetByProp = <\n TEnum extends Record<string, unknown> &\n SmartEnumLike<SmartEnumMemberUnion<TEnum>>,\n P extends keyof SmartEnumMemberUnion<TEnum> & string,\n V extends SmartEnumMemberUnion<TEnum>[P],\n>(\n enumInstance: TEnum,\n prop: P,\n value: V,\n): SmartEnumSubsetView<TEnum, SmartEnumMemberUnion<TEnum>, P, V> => {\n const matching: StandardEnumItem[] = [];\n const memberEntries: Record<string, StandardEnumItem> = {};\n\n for (const key of Reflect.ownKeys(enumInstance)) {\n if (typeof key !== 'string' || RESERVED_ENUM_MEMBER_KEYS.has(key)) {\n continue;\n }\n const entry = enumInstance[key];\n if (!isSmartEnumItem(entry)) {\n continue;\n }\n const item = entry as StandardEnumItem;\n if (Object.is((item as Record<string, unknown>)[prop], value)) {\n memberEntries[key] = item;\n matching.push(item);\n }\n }\n\n type ItemUnion = SmartEnumMemberUnion<TEnum>;\n\n const methods = addExtensionMethods(\n matching as unknown as readonly SmartEnumSubsetItemUnion<ItemUnion, P, V>[],\n );\n\n return {\n ...memberEntries,\n ...methods,\n } as SmartEnumSubsetView<TEnum, ItemUnion, P, V>;\n};\n\ntype SubsetByPropFn = <const P extends string>(\n prop: P,\n) => <\n TEnum extends Record<string, unknown> &\n SmartEnumLike<SmartEnumMemberUnion<TEnum>>,\n V extends SmartEnumMemberUnion<TEnum>[P & keyof SmartEnumMemberUnion<TEnum>],\n>(\n enumInstance: TEnum,\n value: V,\n) => SmartEnumSubsetView<\n TEnum,\n SmartEnumMemberUnion<TEnum>,\n P & keyof SmartEnumMemberUnion<TEnum>,\n V\n>;\n\n/**\n * Curried variant of {@link getSubsetByProp}: fix `prop` first, then `(enumInstance, value)`.\n *\n * @example\n * ```ts\n * const bySource = subsetByProp('source');\n * const mediaItemErrors = bySource(AppErrorEnum, 'mediaItem' as const);\n * ```\n */\nexport const subsetByProp: SubsetByPropFn = <const P extends string>(prop: P) =>\n <\n TEnum extends Record<string, unknown> &\n SmartEnumLike<SmartEnumMemberUnion<TEnum>>,\n V extends SmartEnumMemberUnion<TEnum>[P &\n keyof SmartEnumMemberUnion<TEnum>],\n >(\n enumInstance: TEnum,\n value: V,\n ): SmartEnumSubsetView<\n TEnum,\n SmartEnumMemberUnion<TEnum>,\n P & keyof SmartEnumMemberUnion<TEnum>,\n V\n > =>\n // `getSubsetByProp` widens `prop` in its return; re-assert to keep curried literal `P` for Pick/Extract.\n getSubsetByProp(\n enumInstance,\n prop as keyof SmartEnumMemberUnion<TEnum> & string,\n value,\n ) as unknown as SmartEnumSubsetView<\n TEnum,\n SmartEnumMemberUnion<TEnum>,\n P & keyof SmartEnumMemberUnion<TEnum>,\n V\n >;\n"],"mappings":";;;;;;AAWA,IAAM,4BAA4B,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaM,IAAM,kBAAkB,CAM7B,cACA,MACA,UACkE;AAClE,QAAM,WAA+B,CAAC;AACtC,QAAM,gBAAkD,CAAC;AAEzD,aAAW,OAAO,QAAQ,QAAQ,YAAY,GAAG;AAC/C,QAAI,OAAO,QAAQ,YAAY,0BAA0B,IAAI,GAAG,GAAG;AACjE;AAAA,IACF;AACA,UAAM,QAAQ,aAAa,GAAG;AAC9B,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B;AAAA,IACF;AACA,UAAM,OAAO;AACb,QAAI,OAAO,GAAI,KAAiC,IAAI,GAAG,KAAK,GAAG;AAC7D,oBAAc,GAAG,IAAI;AACrB,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAIA,QAAM,UAAU;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AA2BO,IAAM,eAA+B,CAAyB,SACnE,CAME,cACA;AAAA;AAAA,EAQA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;","names":[]}
@@ -1,73 +0,0 @@
1
- import {
2
- getLogger,
3
- info,
4
- reviveSmartEnums,
5
- serializeSmartEnums,
6
- setLogger
7
- } from "./chunk-WNCJN5E6.js";
8
-
9
- // src/utilities/transport/transportRegistry.ts
10
- var createLevelFilteredLogger = (logger, level) => {
11
- const levels = {
12
- debug: 0,
13
- info: 1,
14
- warn: 2,
15
- error: 3
16
- };
17
- const currentLevel = levels[level];
18
- return {
19
- debug: (message, ...args) => {
20
- if (currentLevel <= levels.debug) {
21
- logger.debug(message, ...args);
22
- }
23
- },
24
- info: (message, ...args) => {
25
- if (currentLevel <= levels.info) {
26
- logger.info(message, ...args);
27
- }
28
- },
29
- warn: (message, ...args) => {
30
- if (currentLevel <= levels.warn) {
31
- logger.warn(message, ...args);
32
- }
33
- },
34
- error: (message, ...args) => {
35
- if (currentLevel <= levels.error) {
36
- logger.error(message, ...args);
37
- }
38
- }
39
- };
40
- };
41
- var globalEnumRegistry;
42
- var initializeSmartEnumMappings = (config) => {
43
- globalEnumRegistry = config.enumRegistry;
44
- const logLevel = config.logLevel ?? "error";
45
- const logger = config.logger ?? getLogger();
46
- setLogger(createLevelFilteredLogger(logger, logLevel));
47
- info("Initialized smart enum mappings", {
48
- enumCount: Object.keys(config.enumRegistry).length,
49
- enumTypes: Object.keys(config.enumRegistry),
50
- logLevel
51
- });
52
- };
53
- var getGlobalEnumRegistry = () => globalEnumRegistry;
54
-
55
- // src/utilities/transport/reviveAfterTransport.ts
56
- var reviveAfterTransport = (payload) => {
57
- const registry = getGlobalEnumRegistry();
58
- if (!registry) {
59
- return payload;
60
- }
61
- return reviveSmartEnums(payload, registry);
62
- };
63
-
64
- // src/utilities/transport/serializeForTransport.ts
65
- var serializeForTransport = (payload) => serializeSmartEnums(payload);
66
-
67
- export {
68
- initializeSmartEnumMappings,
69
- getGlobalEnumRegistry,
70
- reviveAfterTransport,
71
- serializeForTransport
72
- };
73
- //# sourceMappingURL=chunk-QNY5W4SX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utilities/transport/transportRegistry.ts","../src/utilities/transport/reviveAfterTransport.ts","../src/utilities/transport/serializeForTransport.ts"],"sourcesContent":["import type {\n AnyEnumLike,\n LogLevel,\n SmartEnumMappingsConfig,\n} from '../../types.js';\nimport { info, setLogger, getLogger, type Logger } from '../logger.js';\n\nconst createLevelFilteredLogger = (logger: Logger, level: LogLevel): Logger => {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n };\n\n const currentLevel = levels[level];\n\n return {\n debug: (message: string, ...args: unknown[]) => {\n if (currentLevel <= levels.debug) {\n logger.debug(message, ...args);\n }\n },\n info: (message: string, ...args: unknown[]) => {\n if (currentLevel <= levels.info) {\n logger.info(message, ...args);\n }\n },\n warn: (message: string, ...args: unknown[]) => {\n if (currentLevel <= levels.warn) {\n logger.warn(message, ...args);\n }\n },\n error: (message: string, ...args: unknown[]) => {\n if (currentLevel <= levels.error) {\n logger.error(message, ...args);\n }\n },\n };\n};\n\nlet globalEnumRegistry: Record<string, AnyEnumLike> | undefined;\n\n/**\n * Wire-format registry for `reviveAfterTransport` / `reviveSmartEnums`.\n * Not used for database string revival.\n */\nexport const initializeSmartEnumMappings = (\n config: SmartEnumMappingsConfig,\n): void => {\n globalEnumRegistry = config.enumRegistry;\n\n const logLevel = config.logLevel ?? 'error';\n const logger = config.logger ?? getLogger();\n setLogger(createLevelFilteredLogger(logger, logLevel));\n\n info('Initialized smart enum mappings', {\n enumCount: Object.keys(config.enumRegistry).length,\n enumTypes: Object.keys(config.enumRegistry),\n logLevel,\n });\n};\n\nexport const getGlobalEnumRegistry = ():\n | Record<string, AnyEnumLike>\n | undefined => globalEnumRegistry;\n","import { reviveSmartEnums } from '../transformation.js';\n\nimport { getGlobalEnumRegistry } from './transportRegistry.js';\n\n/**\n * Revives smart enums after transport. Requires `initializeSmartEnumMappings`.\n */\nexport const reviveAfterTransport = <T>(payload: unknown): T => {\n const registry = getGlobalEnumRegistry();\n if (!registry) {\n return payload as T;\n }\n return reviveSmartEnums(payload, registry);\n};\n","import { serializeSmartEnums } from '../transformation.js';\nimport type { SerializedSmartEnums } from '../../types.js';\n\n/**\n * Serializes smart enums for transport (to client or API).\n * Wire payloads include `__smart_enum_type` for `reviveAfterTransport`.\n */\nexport const serializeForTransport = <T>(payload: T): SerializedSmartEnums<T> =>\n serializeSmartEnums(payload);\n"],"mappings":";;;;;;;;;AAOA,IAAM,4BAA4B,CAAC,QAAgB,UAA4B;AAC7E,QAAM,SAAmC;AAAA,IACvC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAEA,QAAM,eAAe,OAAO,KAAK;AAEjC,SAAO;AAAA,IACL,OAAO,CAAC,YAAoB,SAAoB;AAC9C,UAAI,gBAAgB,OAAO,OAAO;AAChC,eAAO,MAAM,SAAS,GAAG,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,MAAM,CAAC,YAAoB,SAAoB;AAC7C,UAAI,gBAAgB,OAAO,MAAM;AAC/B,eAAO,KAAK,SAAS,GAAG,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,MAAM,CAAC,YAAoB,SAAoB;AAC7C,UAAI,gBAAgB,OAAO,MAAM;AAC/B,eAAO,KAAK,SAAS,GAAG,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,UAAI,gBAAgB,OAAO,OAAO;AAChC,eAAO,MAAM,SAAS,GAAG,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI;AAMG,IAAM,8BAA8B,CACzC,WACS;AACT,uBAAqB,OAAO;AAE5B,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,SAAS,OAAO,UAAU,UAAU;AAC1C,YAAU,0BAA0B,QAAQ,QAAQ,CAAC;AAErD,OAAK,mCAAmC;AAAA,IACtC,WAAW,OAAO,KAAK,OAAO,YAAY,EAAE;AAAA,IAC5C,WAAW,OAAO,KAAK,OAAO,YAAY;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEO,IAAM,wBAAwB,MAEpB;;;AC1DV,IAAM,uBAAuB,CAAI,YAAwB;AAC9D,QAAM,WAAW,sBAAsB;AACvC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB,SAAS,QAAQ;AAC3C;;;ACNO,IAAM,wBAAwB,CAAI,YACvC,oBAAoB,OAAO;","names":[]}