@payloadcms/plugin-import-export 4.0.0-internal.5b1e7cd → 4.0.0-internal.c2b57ce
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/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
- package/dist/export/batchProcessor.d.ts +9 -1
- package/dist/export/batchProcessor.d.ts.map +1 -1
- package/dist/export/batchProcessor.js +57 -15
- package/dist/export/batchProcessor.js.map +1 -1
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +98 -20
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/handleDownload.d.ts.map +1 -1
- package/dist/export/handlePreview.d.ts.map +1 -1
- package/dist/export/handlePreview.js +39 -14
- package/dist/export/handlePreview.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +14 -2
- package/dist/import/batchProcessor.d.ts.map +1 -1
- package/dist/import/batchProcessor.js +49 -27
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/createImport.d.ts +1 -10
- package/dist/import/createImport.d.ts.map +1 -1
- package/dist/import/createImport.js +34 -53
- package/dist/import/createImport.js.map +1 -1
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
- package/dist/import/getFields.d.ts.map +1 -1
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/handlePreview.d.ts.map +1 -1
- package/dist/import/handlePreview.js +32 -6
- package/dist/import/handlePreview.js.map +1 -1
- package/dist/index.d.ts +50 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -6
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +189 -42
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/applyFieldHooks.d.ts +22 -0
- package/dist/utilities/applyFieldHooks.d.ts.map +1 -0
- package/dist/utilities/applyFieldHooks.js +117 -0
- package/dist/utilities/applyFieldHooks.js.map +1 -0
- package/dist/utilities/applyFieldHooks.spec.js +205 -0
- package/dist/utilities/applyFieldHooks.spec.js.map +1 -0
- package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
- package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -1
- package/dist/utilities/collectDisabledFieldPaths.js +1 -1
- package/dist/utilities/collectDisabledFieldPaths.js.map +1 -1
- package/dist/utilities/fieldToRegex.d.ts.map +1 -1
- package/dist/utilities/flattenObject.d.ts +8 -6
- package/dist/utilities/flattenObject.d.ts.map +1 -1
- package/dist/utilities/flattenObject.js +85 -75
- package/dist/utilities/flattenObject.js.map +1 -1
- package/dist/utilities/flattenObject.spec.js +158 -0
- package/dist/utilities/flattenObject.spec.js.map +1 -0
- package/dist/utilities/flattenedFields.d.ts +21 -0
- package/dist/utilities/flattenedFields.d.ts.map +1 -0
- package/dist/utilities/flattenedFields.js +34 -0
- package/dist/utilities/flattenedFields.js.map +1 -0
- package/dist/utilities/getExportFieldFunctions.d.ts +5 -5
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getExportFieldFunctions.js +84 -98
- package/dist/utilities/getExportFieldFunctions.js.map +1 -1
- package/dist/utilities/getExportFieldFunctions.spec.js +50 -0
- package/dist/utilities/getExportFieldFunctions.spec.js.map +1 -0
- package/dist/utilities/getFileFromDoc.d.ts.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts +5 -5
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getImportFieldFunctions.js +95 -103
- package/dist/utilities/getImportFieldFunctions.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.spec.js +167 -0
- package/dist/utilities/getImportFieldFunctions.spec.js.map +1 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts +1 -1
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
- package/dist/utilities/getSchemaColumns.js +2 -2
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/getSelect.d.ts.map +1 -1
- package/dist/utilities/isPlainObject.d.ts +2 -0
- package/dist/utilities/isPlainObject.d.ts.map +1 -0
- package/dist/utilities/isPlainObject.js +3 -0
- package/dist/utilities/isPlainObject.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -1
- package/dist/utilities/parseJSON.d.ts.map +1 -1
- package/dist/utilities/polymorphicRel.d.ts +14 -0
- package/dist/utilities/polymorphicRel.d.ts.map +1 -0
- package/dist/utilities/polymorphicRel.js +17 -0
- package/dist/utilities/polymorphicRel.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -1
- package/dist/utilities/processRichTextField.js.map +1 -1
- package/dist/utilities/removeDisabledFields.d.ts.map +1 -1
- package/dist/utilities/removeDisabledFields.js.map +1 -1
- package/dist/utilities/setNestedValue.d.ts.map +1 -1
- package/dist/utilities/setNestedValue.js +10 -8
- package/dist/utilities/setNestedValue.js.map +1 -1
- package/dist/utilities/siblingDoc.spec.js +278 -0
- package/dist/utilities/siblingDoc.spec.js.map +1 -0
- package/dist/utilities/sortHelpers.d.ts.map +1 -1
- package/dist/utilities/unflattenObject.d.ts +4 -3
- package/dist/utilities/unflattenObject.d.ts.map +1 -1
- package/dist/utilities/unflattenObject.js +49 -169
- package/dist/utilities/unflattenObject.js.map +1 -1
- package/dist/utilities/unflattenObject.spec.js +33 -0
- package/dist/utilities/unflattenObject.spec.js.map +1 -1
- package/dist/utilities/unflattenPostProcess.d.ts +11 -0
- package/dist/utilities/unflattenPostProcess.d.ts.map +1 -0
- package/dist/utilities/unflattenPostProcess.js +148 -0
- package/dist/utilities/unflattenPostProcess.js.map +1 -0
- package/dist/utilities/validateLimitValue.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { getImportFieldFunctions } from './getImportFieldFunctions.js';
|
|
3
|
+
const mockReq = {
|
|
4
|
+
payload: {
|
|
5
|
+
logger: {
|
|
6
|
+
error: vi.fn()
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const callHook = (hooks, key, value)=>{
|
|
11
|
+
const entry = hooks[key];
|
|
12
|
+
if (!entry || entry.type !== 'beforeImport') {
|
|
13
|
+
throw new Error(`Expected beforeImport hook for ${key}`);
|
|
14
|
+
}
|
|
15
|
+
return entry.fn({
|
|
16
|
+
columnName: key,
|
|
17
|
+
data: {},
|
|
18
|
+
format: 'csv',
|
|
19
|
+
operation: 'create',
|
|
20
|
+
req: mockReq,
|
|
21
|
+
siblingData: {},
|
|
22
|
+
siblingDoc: {},
|
|
23
|
+
value
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
describe('getImportFieldFunctions empty-cell guards', ()=>{
|
|
27
|
+
describe('checkbox', ()=>{
|
|
28
|
+
const fields = [
|
|
29
|
+
{
|
|
30
|
+
name: 'flag',
|
|
31
|
+
type: 'checkbox'
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
it('should return undefined for empty string instead of false', ()=>{
|
|
35
|
+
const hooks = getImportFieldFunctions({
|
|
36
|
+
fields
|
|
37
|
+
});
|
|
38
|
+
expect(callHook(hooks, 'flag', '')).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
it('should return undefined for null', ()=>{
|
|
41
|
+
const hooks = getImportFieldFunctions({
|
|
42
|
+
fields
|
|
43
|
+
});
|
|
44
|
+
expect(callHook(hooks, 'flag', null)).toBeUndefined();
|
|
45
|
+
});
|
|
46
|
+
it('should return undefined for undefined', ()=>{
|
|
47
|
+
const hooks = getImportFieldFunctions({
|
|
48
|
+
fields
|
|
49
|
+
});
|
|
50
|
+
expect(callHook(hooks, 'flag', undefined)).toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
it('should still parse "true" as true', ()=>{
|
|
53
|
+
const hooks = getImportFieldFunctions({
|
|
54
|
+
fields
|
|
55
|
+
});
|
|
56
|
+
expect(callHook(hooks, 'flag', 'true')).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it('should still parse "false" as false', ()=>{
|
|
59
|
+
const hooks = getImportFieldFunctions({
|
|
60
|
+
fields
|
|
61
|
+
});
|
|
62
|
+
expect(callHook(hooks, 'flag', 'false')).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it('should still pass through real booleans', ()=>{
|
|
65
|
+
const hooks = getImportFieldFunctions({
|
|
66
|
+
fields
|
|
67
|
+
});
|
|
68
|
+
expect(callHook(hooks, 'flag', true)).toBe(true);
|
|
69
|
+
expect(callHook(hooks, 'flag', false)).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('number (without hasMany)', ()=>{
|
|
73
|
+
const fields = [
|
|
74
|
+
{
|
|
75
|
+
name: 'count',
|
|
76
|
+
type: 'number'
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
it('should return undefined for empty string instead of 0', ()=>{
|
|
80
|
+
const hooks = getImportFieldFunctions({
|
|
81
|
+
fields
|
|
82
|
+
});
|
|
83
|
+
expect(callHook(hooks, 'count', '')).toBeUndefined();
|
|
84
|
+
});
|
|
85
|
+
it('should return undefined for null', ()=>{
|
|
86
|
+
const hooks = getImportFieldFunctions({
|
|
87
|
+
fields
|
|
88
|
+
});
|
|
89
|
+
expect(callHook(hooks, 'count', null)).toBeUndefined();
|
|
90
|
+
});
|
|
91
|
+
it('should return undefined for undefined', ()=>{
|
|
92
|
+
const hooks = getImportFieldFunctions({
|
|
93
|
+
fields
|
|
94
|
+
});
|
|
95
|
+
expect(callHook(hooks, 'count', undefined)).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
it('should still parse a numeric string', ()=>{
|
|
98
|
+
const hooks = getImportFieldFunctions({
|
|
99
|
+
fields
|
|
100
|
+
});
|
|
101
|
+
expect(callHook(hooks, 'count', '42')).toBe(42);
|
|
102
|
+
});
|
|
103
|
+
it('should still pass through a real number', ()=>{
|
|
104
|
+
const hooks = getImportFieldFunctions({
|
|
105
|
+
fields
|
|
106
|
+
});
|
|
107
|
+
expect(callHook(hooks, 'count', 7)).toBe(7);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('date', ()=>{
|
|
111
|
+
const fields = [
|
|
112
|
+
{
|
|
113
|
+
name: 'when',
|
|
114
|
+
type: 'date'
|
|
115
|
+
}
|
|
116
|
+
];
|
|
117
|
+
it('should return undefined for empty string', ()=>{
|
|
118
|
+
const hooks = getImportFieldFunctions({
|
|
119
|
+
fields
|
|
120
|
+
});
|
|
121
|
+
expect(callHook(hooks, 'when', '')).toBeUndefined();
|
|
122
|
+
});
|
|
123
|
+
it('should return undefined for null', ()=>{
|
|
124
|
+
const hooks = getImportFieldFunctions({
|
|
125
|
+
fields
|
|
126
|
+
});
|
|
127
|
+
expect(callHook(hooks, 'when', null)).toBeUndefined();
|
|
128
|
+
});
|
|
129
|
+
it('should still parse a valid ISO date', ()=>{
|
|
130
|
+
const hooks = getImportFieldFunctions({
|
|
131
|
+
fields
|
|
132
|
+
});
|
|
133
|
+
const iso = '2026-05-06T00:00:00.000Z';
|
|
134
|
+
expect(callHook(hooks, 'when', iso)).toBe(iso);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('json', ()=>{
|
|
138
|
+
const fields = [
|
|
139
|
+
{
|
|
140
|
+
name: 'meta',
|
|
141
|
+
type: 'json'
|
|
142
|
+
}
|
|
143
|
+
];
|
|
144
|
+
it('should return undefined for empty string', ()=>{
|
|
145
|
+
const hooks = getImportFieldFunctions({
|
|
146
|
+
fields
|
|
147
|
+
});
|
|
148
|
+
expect(callHook(hooks, 'meta', '')).toBeUndefined();
|
|
149
|
+
});
|
|
150
|
+
it('should return undefined for null', ()=>{
|
|
151
|
+
const hooks = getImportFieldFunctions({
|
|
152
|
+
fields
|
|
153
|
+
});
|
|
154
|
+
expect(callHook(hooks, 'meta', null)).toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
it('should still parse a valid JSON string', ()=>{
|
|
157
|
+
const hooks = getImportFieldFunctions({
|
|
158
|
+
fields
|
|
159
|
+
});
|
|
160
|
+
expect(callHook(hooks, 'meta', '{"a":1}')).toEqual({
|
|
161
|
+
a: 1
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
//# sourceMappingURL=getImportFieldFunctions.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getImportFieldFunctions.spec.ts"],"sourcesContent":["import { FlattenedField, PayloadRequest } from 'payload'\n\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { getImportFieldFunctions } from './getImportFieldFunctions.js'\n\nconst mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n} as unknown as PayloadRequest\n\nconst callHook = (\n hooks: ReturnType<typeof getImportFieldFunctions>,\n key: string,\n value: unknown,\n) => {\n const entry = hooks[key]\n if (!entry || entry.type !== 'beforeImport') {\n throw new Error(`Expected beforeImport hook for ${key}`)\n }\n return entry.fn({\n columnName: key,\n data: {},\n format: 'csv',\n operation: 'create',\n req: mockReq,\n siblingData: {},\n siblingDoc: {},\n value,\n })\n}\n\ndescribe('getImportFieldFunctions empty-cell guards', () => {\n describe('checkbox', () => {\n const fields: FlattenedField[] = [{ name: 'flag', type: 'checkbox' } as FlattenedField]\n\n it('should return undefined for empty string instead of false', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', null)).toBeUndefined()\n })\n\n it('should return undefined for undefined', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', undefined)).toBeUndefined()\n })\n\n it('should still parse \"true\" as true', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', 'true')).toBe(true)\n })\n\n it('should still parse \"false\" as false', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', 'false')).toBe(false)\n })\n\n it('should still pass through real booleans', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'flag', true)).toBe(true)\n expect(callHook(hooks, 'flag', false)).toBe(false)\n })\n })\n\n describe('number (without hasMany)', () => {\n const fields: FlattenedField[] = [{ name: 'count', type: 'number' } as FlattenedField]\n\n it('should return undefined for empty string instead of 0', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', null)).toBeUndefined()\n })\n\n it('should return undefined for undefined', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', undefined)).toBeUndefined()\n })\n\n it('should still parse a numeric string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', '42')).toBe(42)\n })\n\n it('should still pass through a real number', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'count', 7)).toBe(7)\n })\n })\n\n describe('date', () => {\n const fields: FlattenedField[] = [{ name: 'when', type: 'date' } as FlattenedField]\n\n it('should return undefined for empty string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'when', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'when', null)).toBeUndefined()\n })\n\n it('should still parse a valid ISO date', () => {\n const hooks = getImportFieldFunctions({ fields })\n const iso = '2026-05-06T00:00:00.000Z'\n expect(callHook(hooks, 'when', iso)).toBe(iso)\n })\n })\n\n describe('json', () => {\n const fields: FlattenedField[] = [{ name: 'meta', type: 'json' } as FlattenedField]\n\n it('should return undefined for empty string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'meta', '')).toBeUndefined()\n })\n\n it('should return undefined for null', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'meta', null)).toBeUndefined()\n })\n\n it('should still parse a valid JSON string', () => {\n const hooks = getImportFieldFunctions({ fields })\n expect(callHook(hooks, 'meta', '{\"a\":1}')).toEqual({ a: 1 })\n })\n })\n})\n"],"names":["describe","expect","it","vi","getImportFieldFunctions","mockReq","payload","logger","error","fn","callHook","hooks","key","value","entry","type","Error","columnName","data","format","operation","req","siblingData","siblingDoc","fields","name","toBeUndefined","undefined","toBe","iso","toEqual","a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPluginCollections.d.ts","sourceRoot":"","sources":["../../src/utilities/getPluginCollections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAK3D,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"getPluginCollections.d.ts","sourceRoot":"","sources":["../../src/utilities/getPluginCollections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAK3D,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,GAAU,2BAGxC;IACD,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,OAAO,CAAC,uBAAuB,CAyLlC,CAAA"}
|
|
@@ -37,7 +37,7 @@ export declare const getSchemaColumns: ({ collectionConfig, disabledFields, fiel
|
|
|
37
37
|
/**
|
|
38
38
|
* Merges schema-derived columns with data-discovered columns.
|
|
39
39
|
* Schema columns provide the base ordering, data columns add any additional
|
|
40
|
-
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from
|
|
40
|
+
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from beforeExport hooks).
|
|
41
41
|
*/
|
|
42
42
|
export declare const mergeColumns: (schemaColumns: string[], dataColumns: string[]) => string[];
|
|
43
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSchemaColumns.d.ts","sourceRoot":"","sources":["../../src/utilities/getSchemaColumns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAIxD,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"getSchemaColumns.d.ts","sourceRoot":"","sources":["../../src/utilities/getSchemaColumns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAIxD,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,oFAM9B,oBAAoB,KAAG,MAAM,EAmC/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,eAAe,MAAM,EAAE,EAAE,aAAa,MAAM,EAAE,KAAG,MAAM,EAqEnF,CAAA;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmC5F"}
|
|
@@ -45,7 +45,7 @@ import { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js';
|
|
|
45
45
|
/**
|
|
46
46
|
* Merges schema-derived columns with data-discovered columns.
|
|
47
47
|
* Schema columns provide the base ordering, data columns add any additional
|
|
48
|
-
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from
|
|
48
|
+
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from beforeExport hooks).
|
|
49
49
|
*/ export const mergeColumns = (schemaColumns, dataColumns)=>{
|
|
50
50
|
const result = [
|
|
51
51
|
...schemaColumns
|
|
@@ -101,7 +101,7 @@ import { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js';
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
// Remove schema columns that were fully replaced by
|
|
104
|
+
// Remove schema columns that were fully replaced by beforeExport-derived columns (e.g. "user" → "user_id", "user_email")
|
|
105
105
|
for (const [schemaCol, derivedCols] of insertedDerived){
|
|
106
106
|
if (!dataColumns.includes(schemaCol) && derivedCols.length > 0) {
|
|
107
107
|
const idx = result.indexOf(schemaCol);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getSchemaColumns.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from 'payload'\n\nimport { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js'\n\nexport type GetSchemaColumnsArgs = {\n /**\n * The collection configuration to derive columns from\n */\n collectionConfig: SanitizedCollectionConfig\n /**\n * Array of disabled field paths from plugin config\n */\n disabledFields?: string[]\n /**\n * User-selected fields to export. If provided, only these fields (and their nested fields) will be included.\n */\n fields?: string[]\n /**\n * The locale to export. When 'all', localized fields are expanded to include all locale suffixes.\n */\n locale?: null | string\n /**\n * Available locale codes from config. Required when locale='all'.\n */\n localeCodes?: string[]\n}\n\n/**\n * Derives CSV column names from the collection schema.\n * This provides a base set of columns from field definitions.\n *\n * Note: For arrays/blocks with multiple items, the schema only generates index 0.\n * Additional indices from actual data should be merged with these columns.\n *\n * Benefits:\n * - Provides consistent base columns\n * - Works for empty exports\n * - Ensures proper column ordering\n */\nexport const getSchemaColumns = ({\n collectionConfig,\n disabledFields = [],\n fields: selectedFields,\n locale,\n localeCodes,\n}: GetSchemaColumnsArgs): string[] => {\n const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0\n\n let schemaColumns = getFlattenedFieldKeys(\n collectionConfig.flattenedFields,\n '',\n expandLocales ? { localeCodes } : {},\n )\n\n // Add id if not present in schema\n const hasIdField = schemaColumns.includes('id')\n if (!hasIdField) {\n schemaColumns = ['id', ...schemaColumns]\n }\n\n if (selectedFields && selectedFields.length > 0) {\n schemaColumns = filterToSelectedFields(schemaColumns, selectedFields)\n }\n\n if (disabledFields.length > 0) {\n const disabledSet = new Set<string>()\n for (const path of disabledFields) {\n disabledSet.add(path.replace(/\\./g, '_'))\n }\n schemaColumns = schemaColumns.filter((col) => {\n for (const disabled of disabledSet) {\n if (col === disabled || col.startsWith(`${disabled}_`)) {\n return false\n }\n }\n return true\n })\n }\n\n return schemaColumns\n}\n\n/**\n * Merges schema-derived columns with data-discovered columns.\n * Schema columns provide the base ordering, data columns add any additional\n * columns (e.g., array indices beyond 0, dynamic fields, derived columns from toCSV).\n */\nexport const mergeColumns = (schemaColumns: string[], dataColumns: string[]): string[] => {\n const result = [...schemaColumns]\n const schemaSet = new Set(schemaColumns)\n const insertedDerived = new Map<string, string[]>()\n\n for (const col of dataColumns) {\n if (!schemaSet.has(col)) {\n let inserted = false\n\n for (const schemaCol of schemaColumns) {\n if (col.startsWith(`${schemaCol}_`)) {\n const suffix = col.slice(schemaCol.length + 1)\n // Skip if suffix starts with a digit (array index pattern like field_0_*)\n if (!/^\\d/.test(suffix)) {\n const baseIdx = result.indexOf(schemaCol)\n if (baseIdx !== -1) {\n const derivedList = insertedDerived.get(schemaCol) || []\n const insertIdx = baseIdx + 1 + derivedList.length\n result.splice(insertIdx, 0, col)\n derivedList.push(col)\n insertedDerived.set(schemaCol, derivedList)\n schemaSet.add(col)\n inserted = true\n break\n }\n }\n }\n }\n\n if (!inserted) {\n // Check for array indices (e.g., field_1_*), insert after field_0_*\n const match = col.match(/^(.+?)_(\\d+)(_.*)?$/)\n if (match) {\n const [, basePath, index, suffix] = match\n if (basePath && index) {\n const prevIndex = parseInt(index, 10) - 1\n const prevCol = `${basePath}_${prevIndex}${suffix ?? ''}`\n const prevIdx = result.indexOf(prevCol)\n if (prevIdx !== -1) {\n // Insert after the previous index column\n result.splice(prevIdx + 1, 0, col)\n schemaSet.add(col)\n continue\n }\n }\n }\n\n const createdAtIdx = result.indexOf('createdAt')\n if (createdAtIdx !== -1) {\n result.splice(createdAtIdx, 0, col)\n } else {\n result.push(col)\n }\n schemaSet.add(col)\n }\n }\n }\n\n // Remove schema columns that were fully replaced by toCSV-derived columns (e.g. \"user\" → \"user_id\", \"user_email\")\n for (const [schemaCol, derivedCols] of insertedDerived) {\n if (!dataColumns.includes(schemaCol) && derivedCols.length > 0) {\n const idx = result.indexOf(schemaCol)\n if (idx !== -1) {\n result.splice(idx, 1)\n }\n }\n }\n\n return result\n}\n\n/**\n * Filters schema columns to only include those matching user-selected fields.\n * Preserves the order specified by the user in selectedFields.\n *\n * Container fields (groups, arrays, blocks) don't produce their own column, so we prefix-expand\n * to find their children (e.g., 'group' → 'group_name', 'group_age').\n * Leaf fields (date, text, select) produce an exact column, so we only match exactly to avoid\n * including siblings with similar prefixes (e.g., 'dateWithTimezone' won't pull 'dateWithTimezone_tz').\n */\nexport function filterToSelectedFields(columns: string[], selectedFields: string[]): string[] {\n const result: string[] = []\n const columnsSet = new Set(columns)\n\n // Convert selected fields to underscore notation patterns\n const patterns = selectedFields.map((field) => {\n const underscored = field.replace(/\\./g, '_')\n return {\n exact: underscored,\n original: field,\n prefix: `${underscored}_`,\n }\n })\n\n // Iterate through user-specified fields in order to preserve their ordering\n for (const pattern of patterns) {\n const hasExactColumn = columnsSet.has(pattern.exact)\n\n if (hasExactColumn && !result.includes(pattern.exact)) {\n result.push(pattern.exact)\n }\n\n // Only prefix-expand if no exact column match exists (containers need expansion, leaves don't)\n if (!hasExactColumn) {\n for (const column of columns) {\n if (column.startsWith(pattern.prefix)) {\n if (!result.includes(column)) {\n result.push(column)\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["getFlattenedFieldKeys","getSchemaColumns","collectionConfig","disabledFields","fields","selectedFields","locale","localeCodes","expandLocales","length","schemaColumns","flattenedFields","hasIdField","includes","filterToSelectedFields","disabledSet","Set","path","add","replace","filter","col","disabled","startsWith","mergeColumns","dataColumns","result","schemaSet","insertedDerived","Map","has","inserted","schemaCol","suffix","slice","test","baseIdx","indexOf","derivedList","get","insertIdx","splice","push","set","match","basePath","index","prevIndex","parseInt","prevCol","prevIdx","createdAtIdx","derivedCols","idx","columns","columnsSet","patterns","map","field","underscored","exact","original","prefix","pattern","hasExactColumn","column"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,6BAA4B;AAyBlE;;;;;;;;;;;CAWC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,gBAAgB,EAChBC,iBAAiB,EAAE,EACnBC,QAAQC,cAAc,EACtBC,MAAM,EACNC,WAAW,EACU;IACrB,MAAMC,gBAAgBF,WAAW,SAASC,eAAeA,YAAYE,MAAM,GAAG;IAE9E,IAAIC,gBAAgBV,sBAClBE,iBAAiBS,eAAe,EAChC,IACAH,gBAAgB;QAAED;IAAY,IAAI,CAAC;IAGrC,kCAAkC;IAClC,MAAMK,aAAaF,cAAcG,QAAQ,CAAC;IAC1C,IAAI,CAACD,YAAY;QACfF,gBAAgB;YAAC;eAASA;SAAc;IAC1C;IAEA,IAAIL,kBAAkBA,eAAeI,MAAM,GAAG,GAAG;QAC/CC,gBAAgBI,uBAAuBJ,eAAeL;IACxD;IAEA,IAAIF,eAAeM,MAAM,GAAG,GAAG;QAC7B,MAAMM,cAAc,IAAIC;QACxB,KAAK,MAAMC,QAAQd,eAAgB;YACjCY,YAAYG,GAAG,CAACD,KAAKE,OAAO,CAAC,OAAO;QACtC;QACAT,gBAAgBA,cAAcU,MAAM,CAAC,CAACC;YACpC,KAAK,MAAMC,YAAYP,YAAa;gBAClC,IAAIM,QAAQC,YAAYD,IAAIE,UAAU,CAAC,GAAGD,SAAS,CAAC,CAAC,GAAG;oBACtD,OAAO;gBACT;YACF;YACA,OAAO;QACT;IACF;IAEA,OAAOZ;AACT,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMc,eAAe,CAACd,eAAyBe;IACpD,MAAMC,SAAS;WAAIhB;KAAc;IACjC,MAAMiB,YAAY,IAAIX,IAAIN;IAC1B,MAAMkB,kBAAkB,IAAIC;IAE5B,KAAK,MAAMR,OAAOI,YAAa;QAC7B,IAAI,CAACE,UAAUG,GAAG,CAACT,MAAM;YACvB,IAAIU,WAAW;YAEf,KAAK,MAAMC,aAAatB,cAAe;gBACrC,IAAIW,IAAIE,UAAU,CAAC,GAAGS,UAAU,CAAC,CAAC,GAAG;oBACnC,MAAMC,SAASZ,IAAIa,KAAK,CAACF,UAAUvB,MAAM,GAAG;oBAC5C,0EAA0E;oBAC1E,IAAI,CAAC,MAAM0B,IAAI,CAACF,SAAS;wBACvB,MAAMG,UAAUV,OAAOW,OAAO,CAACL;wBAC/B,IAAII,YAAY,CAAC,GAAG;4BAClB,MAAME,cAAcV,gBAAgBW,GAAG,CAACP,cAAc,EAAE;4BACxD,MAAMQ,YAAYJ,UAAU,IAAIE,YAAY7B,MAAM;4BAClDiB,OAAOe,MAAM,CAACD,WAAW,GAAGnB;4BAC5BiB,YAAYI,IAAI,CAACrB;4BACjBO,gBAAgBe,GAAG,CAACX,WAAWM;4BAC/BX,UAAUT,GAAG,CAACG;4BACdU,WAAW;4BACX;wBACF;oBACF;gBACF;YACF;YAEA,IAAI,CAACA,UAAU;gBACb,oEAAoE;gBACpE,MAAMa,QAAQvB,IAAIuB,KAAK,CAAC;gBACxB,IAAIA,OAAO;oBACT,MAAM,GAAGC,UAAUC,OAAOb,OAAO,GAAGW;oBACpC,IAAIC,YAAYC,OAAO;wBACrB,MAAMC,YAAYC,SAASF,OAAO,MAAM;wBACxC,MAAMG,UAAU,GAAGJ,SAAS,CAAC,EAAEE,YAAYd,UAAU,IAAI;wBACzD,MAAMiB,UAAUxB,OAAOW,OAAO,CAACY;wBAC/B,IAAIC,YAAY,CAAC,GAAG;4BAClB,yCAAyC;4BACzCxB,OAAOe,MAAM,CAACS,UAAU,GAAG,GAAG7B;4BAC9BM,UAAUT,GAAG,CAACG;4BACd;wBACF;oBACF;gBACF;gBAEA,MAAM8B,eAAezB,OAAOW,OAAO,CAAC;gBACpC,IAAIc,iBAAiB,CAAC,GAAG;oBACvBzB,OAAOe,MAAM,CAACU,cAAc,GAAG9B;gBACjC,OAAO;oBACLK,OAAOgB,IAAI,CAACrB;gBACd;gBACAM,UAAUT,GAAG,CAACG;YAChB;QACF;IACF;IAEA,kHAAkH;IAClH,KAAK,MAAM,CAACW,WAAWoB,YAAY,IAAIxB,gBAAiB;QACtD,IAAI,CAACH,YAAYZ,QAAQ,CAACmB,cAAcoB,YAAY3C,MAAM,GAAG,GAAG;YAC9D,MAAM4C,MAAM3B,OAAOW,OAAO,CAACL;YAC3B,IAAIqB,QAAQ,CAAC,GAAG;gBACd3B,OAAOe,MAAM,CAACY,KAAK;YACrB;QACF;IACF;IAEA,OAAO3B;AACT,EAAC;AAED;;;;;;;;CAQC,GACD,OAAO,SAASZ,uBAAuBwC,OAAiB,EAAEjD,cAAwB;IAChF,MAAMqB,SAAmB,EAAE;IAC3B,MAAM6B,aAAa,IAAIvC,IAAIsC;IAE3B,0DAA0D;IAC1D,MAAME,WAAWnD,eAAeoD,GAAG,CAAC,CAACC;QACnC,MAAMC,cAAcD,MAAMvC,OAAO,CAAC,OAAO;QACzC,OAAO;YACLyC,OAAOD;YACPE,UAAUH;YACVI,QAAQ,GAAGH,YAAY,CAAC,CAAC;QAC3B;IACF;IAEA,4EAA4E;IAC5E,KAAK,MAAMI,WAAWP,SAAU;QAC9B,MAAMQ,iBAAiBT,WAAWzB,GAAG,CAACiC,QAAQH,KAAK;QAEnD,IAAII,kBAAkB,CAACtC,OAAOb,QAAQ,CAACkD,QAAQH,KAAK,GAAG;YACrDlC,OAAOgB,IAAI,CAACqB,QAAQH,KAAK;QAC3B;QAEA,+FAA+F;QAC/F,IAAI,CAACI,gBAAgB;YACnB,KAAK,MAAMC,UAAUX,QAAS;gBAC5B,IAAIW,OAAO1C,UAAU,CAACwC,QAAQD,MAAM,GAAG;oBACrC,IAAI,CAACpC,OAAOb,QAAQ,CAACoD,SAAS;wBAC5BvC,OAAOgB,IAAI,CAACuB;oBACd;gBACF;YACF;QACF;IACF;IAEA,OAAOvC;AACT"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSchemaColumns.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from 'payload'\n\nimport { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js'\n\nexport type GetSchemaColumnsArgs = {\n /**\n * The collection configuration to derive columns from\n */\n collectionConfig: SanitizedCollectionConfig\n /**\n * Array of disabled field paths from plugin config\n */\n disabledFields?: string[]\n /**\n * User-selected fields to export. If provided, only these fields (and their nested fields) will be included.\n */\n fields?: string[]\n /**\n * The locale to export. When 'all', localized fields are expanded to include all locale suffixes.\n */\n locale?: null | string\n /**\n * Available locale codes from config. Required when locale='all'.\n */\n localeCodes?: string[]\n}\n\n/**\n * Derives CSV column names from the collection schema.\n * This provides a base set of columns from field definitions.\n *\n * Note: For arrays/blocks with multiple items, the schema only generates index 0.\n * Additional indices from actual data should be merged with these columns.\n *\n * Benefits:\n * - Provides consistent base columns\n * - Works for empty exports\n * - Ensures proper column ordering\n */\nexport const getSchemaColumns = ({\n collectionConfig,\n disabledFields = [],\n fields: selectedFields,\n locale,\n localeCodes,\n}: GetSchemaColumnsArgs): string[] => {\n const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0\n\n let schemaColumns = getFlattenedFieldKeys(\n collectionConfig.flattenedFields,\n '',\n expandLocales ? { localeCodes } : {},\n )\n\n // Add id if not present in schema\n const hasIdField = schemaColumns.includes('id')\n if (!hasIdField) {\n schemaColumns = ['id', ...schemaColumns]\n }\n\n if (selectedFields && selectedFields.length > 0) {\n schemaColumns = filterToSelectedFields(schemaColumns, selectedFields)\n }\n\n if (disabledFields.length > 0) {\n const disabledSet = new Set<string>()\n for (const path of disabledFields) {\n disabledSet.add(path.replace(/\\./g, '_'))\n }\n schemaColumns = schemaColumns.filter((col) => {\n for (const disabled of disabledSet) {\n if (col === disabled || col.startsWith(`${disabled}_`)) {\n return false\n }\n }\n return true\n })\n }\n\n return schemaColumns\n}\n\n/**\n * Merges schema-derived columns with data-discovered columns.\n * Schema columns provide the base ordering, data columns add any additional\n * columns (e.g., array indices beyond 0, dynamic fields, derived columns from beforeExport hooks).\n */\nexport const mergeColumns = (schemaColumns: string[], dataColumns: string[]): string[] => {\n const result = [...schemaColumns]\n const schemaSet = new Set(schemaColumns)\n const insertedDerived = new Map<string, string[]>()\n\n for (const col of dataColumns) {\n if (!schemaSet.has(col)) {\n let inserted = false\n\n for (const schemaCol of schemaColumns) {\n if (col.startsWith(`${schemaCol}_`)) {\n const suffix = col.slice(schemaCol.length + 1)\n // Skip if suffix starts with a digit (array index pattern like field_0_*)\n if (!/^\\d/.test(suffix)) {\n const baseIdx = result.indexOf(schemaCol)\n if (baseIdx !== -1) {\n const derivedList = insertedDerived.get(schemaCol) || []\n const insertIdx = baseIdx + 1 + derivedList.length\n result.splice(insertIdx, 0, col)\n derivedList.push(col)\n insertedDerived.set(schemaCol, derivedList)\n schemaSet.add(col)\n inserted = true\n break\n }\n }\n }\n }\n\n if (!inserted) {\n // Check for array indices (e.g., field_1_*), insert after field_0_*\n const match = col.match(/^(.+?)_(\\d+)(_.*)?$/)\n if (match) {\n const [, basePath, index, suffix] = match\n if (basePath && index) {\n const prevIndex = parseInt(index, 10) - 1\n const prevCol = `${basePath}_${prevIndex}${suffix ?? ''}`\n const prevIdx = result.indexOf(prevCol)\n if (prevIdx !== -1) {\n // Insert after the previous index column\n result.splice(prevIdx + 1, 0, col)\n schemaSet.add(col)\n continue\n }\n }\n }\n\n const createdAtIdx = result.indexOf('createdAt')\n if (createdAtIdx !== -1) {\n result.splice(createdAtIdx, 0, col)\n } else {\n result.push(col)\n }\n schemaSet.add(col)\n }\n }\n }\n\n // Remove schema columns that were fully replaced by beforeExport-derived columns (e.g. \"user\" → \"user_id\", \"user_email\")\n for (const [schemaCol, derivedCols] of insertedDerived) {\n if (!dataColumns.includes(schemaCol) && derivedCols.length > 0) {\n const idx = result.indexOf(schemaCol)\n if (idx !== -1) {\n result.splice(idx, 1)\n }\n }\n }\n\n return result\n}\n\n/**\n * Filters schema columns to only include those matching user-selected fields.\n * Preserves the order specified by the user in selectedFields.\n *\n * Container fields (groups, arrays, blocks) don't produce their own column, so we prefix-expand\n * to find their children (e.g., 'group' → 'group_name', 'group_age').\n * Leaf fields (date, text, select) produce an exact column, so we only match exactly to avoid\n * including siblings with similar prefixes (e.g., 'dateWithTimezone' won't pull 'dateWithTimezone_tz').\n */\nexport function filterToSelectedFields(columns: string[], selectedFields: string[]): string[] {\n const result: string[] = []\n const columnsSet = new Set(columns)\n\n // Convert selected fields to underscore notation patterns\n const patterns = selectedFields.map((field) => {\n const underscored = field.replace(/\\./g, '_')\n return {\n exact: underscored,\n original: field,\n prefix: `${underscored}_`,\n }\n })\n\n // Iterate through user-specified fields in order to preserve their ordering\n for (const pattern of patterns) {\n const hasExactColumn = columnsSet.has(pattern.exact)\n\n if (hasExactColumn && !result.includes(pattern.exact)) {\n result.push(pattern.exact)\n }\n\n // Only prefix-expand if no exact column match exists (containers need expansion, leaves don't)\n if (!hasExactColumn) {\n for (const column of columns) {\n if (column.startsWith(pattern.prefix)) {\n if (!result.includes(column)) {\n result.push(column)\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["getFlattenedFieldKeys","getSchemaColumns","collectionConfig","disabledFields","fields","selectedFields","locale","localeCodes","expandLocales","length","schemaColumns","flattenedFields","hasIdField","includes","filterToSelectedFields","disabledSet","Set","path","add","replace","filter","col","disabled","startsWith","mergeColumns","dataColumns","result","schemaSet","insertedDerived","Map","has","inserted","schemaCol","suffix","slice","test","baseIdx","indexOf","derivedList","get","insertIdx","splice","push","set","match","basePath","index","prevIndex","parseInt","prevCol","prevIdx","createdAtIdx","derivedCols","idx","columns","columnsSet","patterns","map","field","underscored","exact","original","prefix","pattern","hasExactColumn","column"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"getSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,EAAE,KAAG,iBAoB5C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isPlainObject.d.ts","sourceRoot":"","sources":["../../src/utilities/isPlainObject.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACR,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/isPlainObject.ts"],"sourcesContent":["export const isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n"],"names":["isPlainObject","value","Array","isArray"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB,CAACC,QAC5B,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACC,MAAMC,OAAO,CAACF,OAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCSV.d.ts","sourceRoot":"","sources":["../../src/utilities/parseCSV.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"parseCSV.d.ts","sourceRoot":"","sources":["../../src/utilities/parseCSV.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAU,eAAe,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA8D7F,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseJSON.d.ts","sourceRoot":"","sources":["../../src/utilities/parseJSON.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"parseJSON.d.ts","sourceRoot":"","sources":["../../src/utilities/parseJSON.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,eAAe,aAAa,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAiB/E,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PolymorphicRelValue = {
|
|
2
|
+
relationTo: string;
|
|
3
|
+
value: {
|
|
4
|
+
id: number | string;
|
|
5
|
+
} | number | string;
|
|
6
|
+
};
|
|
7
|
+
export declare const isPolymorphicRelValue: (v: unknown) => v is PolymorphicRelValue;
|
|
8
|
+
/**
|
|
9
|
+
* Returns the id of a populated polymorphic relationship value, or `undefined`
|
|
10
|
+
* if the inner value is missing. Handles both depth=0 (`value` is the bare id)
|
|
11
|
+
* and depth>=1 (`value` is the populated doc).
|
|
12
|
+
*/
|
|
13
|
+
export declare const getPolymorphicRelId: (v: PolymorphicRelValue) => number | string | undefined;
|
|
14
|
+
//# sourceMappingURL=polymorphicRel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polymorphicRel.d.ts","sourceRoot":"","sources":["../../src/utilities/polymorphicRel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,MAAM,CAAA;CACjD,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,mBACkB,CAAA;AAE1E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,GAAG,mBAAmB,KAAG,MAAM,GAAG,MAAM,GAAG,SAS9E,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const isPolymorphicRelValue = (v)=>typeof v === 'object' && v !== null && 'relationTo' in v && 'value' in v;
|
|
2
|
+
/**
|
|
3
|
+
* Returns the id of a populated polymorphic relationship value, or `undefined`
|
|
4
|
+
* if the inner value is missing. Handles both depth=0 (`value` is the bare id)
|
|
5
|
+
* and depth>=1 (`value` is the populated doc).
|
|
6
|
+
*/ export const getPolymorphicRelId = (v)=>{
|
|
7
|
+
const inner = v.value;
|
|
8
|
+
if (inner == null) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
if (typeof inner === 'object') {
|
|
12
|
+
return inner.id;
|
|
13
|
+
}
|
|
14
|
+
return inner;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=polymorphicRel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/polymorphicRel.ts"],"sourcesContent":["export type PolymorphicRelValue = {\n relationTo: string\n value: { id: number | string } | number | string\n}\n\nexport const isPolymorphicRelValue = (v: unknown): v is PolymorphicRelValue =>\n typeof v === 'object' && v !== null && 'relationTo' in v && 'value' in v\n\n/**\n * Returns the id of a populated polymorphic relationship value, or `undefined`\n * if the inner value is missing. Handles both depth=0 (`value` is the bare id)\n * and depth>=1 (`value` is the populated doc).\n */\nexport const getPolymorphicRelId = (v: PolymorphicRelValue): number | string | undefined => {\n const inner = v.value\n if (inner == null) {\n return undefined\n }\n if (typeof inner === 'object') {\n return (inner as { id?: number | string }).id\n }\n return inner\n}\n"],"names":["isPolymorphicRelValue","v","getPolymorphicRelId","inner","value","undefined","id"],"mappings":"AAKA,OAAO,MAAMA,wBAAwB,CAACC,IACpC,OAAOA,MAAM,YAAYA,MAAM,QAAQ,gBAAgBA,KAAK,WAAWA,EAAC;AAE1E;;;;CAIC,GACD,OAAO,MAAMC,sBAAsB,CAACD;IAClC,MAAME,QAAQF,EAAEG,KAAK;IACrB,IAAID,SAAS,MAAM;QACjB,OAAOE;IACT;IACA,IAAI,OAAOF,UAAU,UAAU;QAC7B,OAAO,AAACA,MAAmCG,EAAE;IAC/C;IACA,OAAOH;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processRichTextField.d.ts","sourceRoot":"","sources":["../../src/utilities/processRichTextField.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"processRichTextField.d.ts","sourceRoot":"","sources":["../../src/utilities/processRichTextField.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,OA4CrD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/processRichTextField.ts"],"sourcesContent":["/**\n * Process rich text fields to ensure proper data types for Lexical editor.\n * Lexical expects certain properties to be numbers, not strings.\n */\nexport const processRichTextField = (value: unknown): unknown => {\n if (!value || typeof value !== 'object') {\n return value\n }\n\n // Properties that should be numbers in Lexical\n const numericProperties = [\n 'detail',\n 'format',\n 'indent',\n 'version',\n 'value',\n 'start',\n 'textFormat',\n 'textStyle',\n ]\n\n const processNode = (node:
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/processRichTextField.ts"],"sourcesContent":["/**\n * Process rich text fields to ensure proper data types for Lexical editor.\n * Lexical expects certain properties to be numbers, not strings.\n */\nexport const processRichTextField = (value: unknown): unknown => {\n if (!value || typeof value !== 'object') {\n return value\n }\n\n // Properties that should be numbers in Lexical\n const numericProperties = [\n 'detail',\n 'format',\n 'indent',\n 'version',\n 'value',\n 'start',\n 'textFormat',\n 'textStyle',\n ]\n\n const processNode = (node: unknown): unknown => {\n if (!node || typeof node !== 'object') {\n return node\n }\n\n // Process current node's properties\n const processed: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(node as Record<string, unknown>)) {\n if (numericProperties.includes(key) && typeof val === 'string') {\n // Convert string numbers to actual numbers\n const num = parseFloat(val)\n processed[key] = isNaN(num) ? val : num\n } else if (key === 'children' && Array.isArray(val)) {\n // Recursively process children\n processed[key] = val.map((child) => processNode(child))\n } else if (typeof val === 'object' && val !== null) {\n // Recursively process nested objects\n processed[key] = processNode(val)\n } else {\n processed[key] = val\n }\n }\n\n return processed\n }\n\n return processNode(value)\n}\n"],"names":["processRichTextField","value","numericProperties","processNode","node","processed","key","val","Object","entries","includes","num","parseFloat","isNaN","Array","isArray","map","child"],"mappings":"AAAA;;;CAGC,GACD,OAAO,MAAMA,uBAAuB,CAACC;IACnC,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU;QACvC,OAAOA;IACT;IAEA,+CAA+C;IAC/C,MAAMC,oBAAoB;QACxB;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD;IAED,MAAMC,cAAc,CAACC;QACnB,IAAI,CAACA,QAAQ,OAAOA,SAAS,UAAU;YACrC,OAAOA;QACT;QAEA,oCAAoC;QACpC,MAAMC,YAAqC,CAAC;QAC5C,KAAK,MAAM,CAACC,KAAKC,IAAI,IAAIC,OAAOC,OAAO,CAACL,MAAkC;YACxE,IAAIF,kBAAkBQ,QAAQ,CAACJ,QAAQ,OAAOC,QAAQ,UAAU;gBAC9D,2CAA2C;gBAC3C,MAAMI,MAAMC,WAAWL;gBACvBF,SAAS,CAACC,IAAI,GAAGO,MAAMF,OAAOJ,MAAMI;YACtC,OAAO,IAAIL,QAAQ,cAAcQ,MAAMC,OAAO,CAACR,MAAM;gBACnD,+BAA+B;gBAC/BF,SAAS,CAACC,IAAI,GAAGC,IAAIS,GAAG,CAAC,CAACC,QAAUd,YAAYc;YAClD,OAAO,IAAI,OAAOV,QAAQ,YAAYA,QAAQ,MAAM;gBAClD,qCAAqC;gBACrCF,SAAS,CAACC,IAAI,GAAGH,YAAYI;YAC/B,OAAO;gBACLF,SAAS,CAACC,IAAI,GAAGC;YACnB;QACF;QAEA,OAAOF;IACT;IAEA,OAAOF,YAAYF;AACrB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeDisabledFields.d.ts","sourceRoot":"","sources":["../../src/utilities/removeDisabledFields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"removeDisabledFields.d.ts","sourceRoot":"","sources":["../../src/utilities/removeDisabledFields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,oBAAoB,GAC/B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAU,MAAM,EAAO,KACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CA8DxB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/removeDisabledFields.ts"],"sourcesContent":["/**\n * Recursively removes fields from a deeply nested object based on dot-notation paths.\n *\n * This utility supports removing:\n * - Nested fields in plain objects (e.g., \"group.value\")\n * - Fields inside arrays of objects (e.g., \"group.array.field1\")\n *\n * It safely traverses both object and array structures and avoids mutating the original input.\n *\n * @param obj - The original object to clean.\n * @param disabled - An array of dot-separated paths indicating which fields to remove.\n * @returns A deep clone of the original object with specified fields removed.\n */\n\nexport const removeDisabledFields = (\n obj: Record<string, unknown>,\n disabled: string[] = [],\n): Record<string, unknown> => {\n if (!disabled.length) {\n return obj\n }\n\n const clone = structuredClone(obj)\n\n // Process each disabled path independently\n for (const path of disabled) {\n const parts = path.split('.')\n\n /**\n * Recursively walks the object tree according to the dot path,\n * and deletes the field once the full path is reached.\n *\n * @param target - The current object or array being traversed\n * @param i - The index of the current path part\n */\n const removeRecursively = (target:
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/removeDisabledFields.ts"],"sourcesContent":["/**\n * Recursively removes fields from a deeply nested object based on dot-notation paths.\n *\n * This utility supports removing:\n * - Nested fields in plain objects (e.g., \"group.value\")\n * - Fields inside arrays of objects (e.g., \"group.array.field1\")\n *\n * It safely traverses both object and array structures and avoids mutating the original input.\n *\n * @param obj - The original object to clean.\n * @param disabled - An array of dot-separated paths indicating which fields to remove.\n * @returns A deep clone of the original object with specified fields removed.\n */\n\nexport const removeDisabledFields = (\n obj: Record<string, unknown>,\n disabled: string[] = [],\n): Record<string, unknown> => {\n if (!disabled.length) {\n return obj\n }\n\n const clone = structuredClone(obj)\n\n // Process each disabled path independently\n for (const path of disabled) {\n const parts = path.split('.')\n\n /**\n * Recursively walks the object tree according to the dot path,\n * and deletes the field once the full path is reached.\n *\n * @param target - The current object or array being traversed\n * @param i - The index of the current path part\n */\n const removeRecursively = (target: unknown, i = 0): void => {\n if (target == null) {\n return\n }\n\n const key = parts[i]\n\n // If at the final part of the path, perform the deletion\n if (i === parts.length - 1) {\n // If the current level is an array, delete the key from each item\n if (Array.isArray(target)) {\n for (const item of target) {\n if (item && typeof item === 'object' && key !== undefined) {\n delete (item as Record<string, unknown>)[key]\n }\n }\n } else if (typeof target === 'object' && key !== undefined) {\n delete (target as Record<string, unknown>)[key]\n }\n return\n }\n\n if (key === undefined) {\n return\n }\n\n // Traverse to the next level in the path\n const next = (target as Record<string, unknown>)[key]\n\n if (Array.isArray(next)) {\n // If the next value is an array, recurse into each item\n for (const item of next) {\n removeRecursively(item, i + 1)\n }\n } else {\n // Otherwise, continue down the object path\n removeRecursively(next, i + 1)\n }\n }\n\n removeRecursively(clone)\n }\n\n return clone\n}\n"],"names":["removeDisabledFields","obj","disabled","length","clone","structuredClone","path","parts","split","removeRecursively","target","i","key","Array","isArray","item","undefined","next"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GAED,OAAO,MAAMA,uBAAuB,CAClCC,KACAC,WAAqB,EAAE;IAEvB,IAAI,CAACA,SAASC,MAAM,EAAE;QACpB,OAAOF;IACT;IAEA,MAAMG,QAAQC,gBAAgBJ;IAE9B,2CAA2C;IAC3C,KAAK,MAAMK,QAAQJ,SAAU;QAC3B,MAAMK,QAAQD,KAAKE,KAAK,CAAC;QAEzB;;;;;;KAMC,GACD,MAAMC,oBAAoB,CAACC,QAAiBC,IAAI,CAAC;YAC/C,IAAID,UAAU,MAAM;gBAClB;YACF;YAEA,MAAME,MAAML,KAAK,CAACI,EAAE;YAEpB,yDAAyD;YACzD,IAAIA,MAAMJ,MAAMJ,MAAM,GAAG,GAAG;gBAC1B,kEAAkE;gBAClE,IAAIU,MAAMC,OAAO,CAACJ,SAAS;oBACzB,KAAK,MAAMK,QAAQL,OAAQ;wBACzB,IAAIK,QAAQ,OAAOA,SAAS,YAAYH,QAAQI,WAAW;4BACzD,OAAO,AAACD,IAAgC,CAACH,IAAI;wBAC/C;oBACF;gBACF,OAAO,IAAI,OAAOF,WAAW,YAAYE,QAAQI,WAAW;oBAC1D,OAAO,AAACN,MAAkC,CAACE,IAAI;gBACjD;gBACA;YACF;YAEA,IAAIA,QAAQI,WAAW;gBACrB;YACF;YAEA,yCAAyC;YACzC,MAAMC,OAAO,AAACP,MAAkC,CAACE,IAAI;YAErD,IAAIC,MAAMC,OAAO,CAACG,OAAO;gBACvB,wDAAwD;gBACxD,KAAK,MAAMF,QAAQE,KAAM;oBACvBR,kBAAkBM,MAAMJ,IAAI;gBAC9B;YACF,OAAO;gBACL,2CAA2C;gBAC3CF,kBAAkBQ,MAAMN,IAAI;YAC9B;QACF;QAEAF,kBAAkBL;IACpB;IAEA,OAAOA;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setNestedValue.d.ts","sourceRoot":"","sources":["../../src/utilities/setNestedValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"setNestedValue.d.ts","sourceRoot":"","sources":["../../src/utilities/setNestedValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,cAAc,GACzB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,MAAM,EACZ,OAAO,OAAO,KACb,IA8CF,CAAA"}
|
|
@@ -27,26 +27,28 @@
|
|
|
27
27
|
if (!Array.isArray(current)) {
|
|
28
28
|
current = [];
|
|
29
29
|
}
|
|
30
|
+
const currentArray = current;
|
|
30
31
|
// Ensure the array slot is initialized
|
|
31
|
-
if (!
|
|
32
|
-
|
|
32
|
+
if (!currentArray[index]) {
|
|
33
|
+
currentArray[index] = {};
|
|
33
34
|
}
|
|
34
35
|
if (isLast) {
|
|
35
|
-
|
|
36
|
+
currentArray[index] = value;
|
|
36
37
|
} else {
|
|
37
|
-
current =
|
|
38
|
+
current = currentArray[index];
|
|
38
39
|
}
|
|
39
40
|
} else {
|
|
41
|
+
const currentObj = current;
|
|
40
42
|
// Ensure the object key exists
|
|
41
43
|
if (isLast) {
|
|
42
44
|
if (typeof part === 'string') {
|
|
43
|
-
|
|
45
|
+
currentObj[part] = value;
|
|
44
46
|
}
|
|
45
47
|
} else {
|
|
46
|
-
if (typeof
|
|
47
|
-
|
|
48
|
+
if (typeof currentObj[part] !== 'object' || currentObj[part] === null) {
|
|
49
|
+
currentObj[part] = {};
|
|
48
50
|
}
|
|
49
|
-
current =
|
|
51
|
+
current = currentObj[part];
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/setNestedValue.ts"],"sourcesContent":["/**\n * Sets a value deeply into a nested object or array, based on a dot-notation path.\n *\n * This function:\n * - Supports array indexing (e.g., \"array.0.field1\")\n * - Creates intermediate arrays/objects as needed\n * - Mutates the target object directly\n *\n * @example\n * const obj = {}\n * setNestedValue(obj, 'group.array.0.field1', 'hello')\n * // Result: { group: { array: [ { field1: 'hello' } ] } }\n *\n * @param obj - The target object to mutate.\n * @param path - A dot-separated string path indicating where to assign the value.\n * @param value - The value to set at the specified path.\n */\n\nexport const setNestedValue = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void => {\n const parts = path.split('.')\n let current:
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/setNestedValue.ts"],"sourcesContent":["/**\n * Sets a value deeply into a nested object or array, based on a dot-notation path.\n *\n * This function:\n * - Supports array indexing (e.g., \"array.0.field1\")\n * - Creates intermediate arrays/objects as needed\n * - Mutates the target object directly\n *\n * @example\n * const obj = {}\n * setNestedValue(obj, 'group.array.0.field1', 'hello')\n * // Result: { group: { array: [ { field1: 'hello' } ] } }\n *\n * @param obj - The target object to mutate.\n * @param path - A dot-separated string path indicating where to assign the value.\n * @param value - The value to set at the specified path.\n */\n\nexport const setNestedValue = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void => {\n const parts = path.split('.')\n let current: unknown = obj\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n const isLast = i === parts.length - 1\n const isIndex = !Number.isNaN(Number(part))\n\n if (isIndex) {\n const index = Number(part)\n\n // Ensure the current target is an array\n if (!Array.isArray(current)) {\n current = []\n }\n\n const currentArray = current as unknown[]\n\n // Ensure the array slot is initialized\n if (!currentArray[index]) {\n currentArray[index] = {}\n }\n\n if (isLast) {\n currentArray[index] = value\n } else {\n current = currentArray[index]\n }\n } else {\n const currentObj = current as Record<string, unknown>\n\n // Ensure the object key exists\n if (isLast) {\n if (typeof part === 'string') {\n currentObj[part] = value\n }\n } else {\n if (typeof currentObj[part as string] !== 'object' || currentObj[part as string] === null) {\n currentObj[part as string] = {}\n }\n\n current = currentObj[part as string]\n }\n }\n }\n}\n"],"names":["setNestedValue","obj","path","value","parts","split","current","i","length","part","isLast","isIndex","Number","isNaN","index","Array","isArray","currentArray","currentObj"],"mappings":"AAAA;;;;;;;;;;;;;;;;CAgBC,GAED,OAAO,MAAMA,iBAAiB,CAC5BC,KACAC,MACAC;IAEA,MAAMC,QAAQF,KAAKG,KAAK,CAAC;IACzB,IAAIC,UAAmBL;IAEvB,IAAK,IAAIM,IAAI,GAAGA,IAAIH,MAAMI,MAAM,EAAED,IAAK;QACrC,MAAME,OAAOL,KAAK,CAACG,EAAE;QACrB,MAAMG,SAASH,MAAMH,MAAMI,MAAM,GAAG;QACpC,MAAMG,UAAU,CAACC,OAAOC,KAAK,CAACD,OAAOH;QAErC,IAAIE,SAAS;YACX,MAAMG,QAAQF,OAAOH;YAErB,wCAAwC;YACxC,IAAI,CAACM,MAAMC,OAAO,CAACV,UAAU;gBAC3BA,UAAU,EAAE;YACd;YAEA,MAAMW,eAAeX;YAErB,uCAAuC;YACvC,IAAI,CAACW,YAAY,CAACH,MAAM,EAAE;gBACxBG,YAAY,CAACH,MAAM,GAAG,CAAC;YACzB;YAEA,IAAIJ,QAAQ;gBACVO,YAAY,CAACH,MAAM,GAAGX;YACxB,OAAO;gBACLG,UAAUW,YAAY,CAACH,MAAM;YAC/B;QACF,OAAO;YACL,MAAMI,aAAaZ;YAEnB,+BAA+B;YAC/B,IAAII,QAAQ;gBACV,IAAI,OAAOD,SAAS,UAAU;oBAC5BS,UAAU,CAACT,KAAK,GAAGN;gBACrB;YACF,OAAO;gBACL,IAAI,OAAOe,UAAU,CAACT,KAAe,KAAK,YAAYS,UAAU,CAACT,KAAe,KAAK,MAAM;oBACzFS,UAAU,CAACT,KAAe,GAAG,CAAC;gBAChC;gBAEAH,UAAUY,UAAU,CAACT,KAAe;YACtC;QACF;IACF;AACF,EAAC"}
|