@payloadcms/plugin-import-export 4.0.0-internal.d28e9fb → 4.0.0-internal.fa345ef

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/components/ExportPreview/index.css +55 -0
  2. package/dist/components/ExportPreview/index.d.ts +1 -1
  3. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  4. package/dist/components/ExportPreview/index.js +1 -1
  5. package/dist/components/ExportPreview/index.js.map +1 -1
  6. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
  7. package/dist/components/FormatField/index.d.ts.map +1 -1
  8. package/dist/components/FormatField/index.js +6 -3
  9. package/dist/components/FormatField/index.js.map +1 -1
  10. package/dist/components/ImportPreview/index.css +48 -0
  11. package/dist/components/ImportPreview/index.d.ts +1 -1
  12. package/dist/components/ImportPreview/index.d.ts.map +1 -1
  13. package/dist/components/ImportPreview/index.js +17 -3
  14. package/dist/components/ImportPreview/index.js.map +1 -1
  15. package/dist/components/Page/index.d.ts +1 -1
  16. package/dist/components/Page/index.d.ts.map +1 -1
  17. package/dist/components/Page/index.js +1 -1
  18. package/dist/components/Page/index.js.map +1 -1
  19. package/dist/components/SortBy/index.css +9 -0
  20. package/dist/components/SortBy/index.d.ts +1 -1
  21. package/dist/components/SortBy/index.d.ts.map +1 -1
  22. package/dist/components/SortBy/index.js +1 -2
  23. package/dist/components/SortBy/index.js.map +1 -1
  24. package/dist/components/SortOrder/index.css +9 -0
  25. package/dist/components/SortOrder/index.d.ts +1 -1
  26. package/dist/components/SortOrder/index.d.ts.map +1 -1
  27. package/dist/components/SortOrder/index.js +1 -2
  28. package/dist/components/SortOrder/index.js.map +1 -1
  29. package/dist/export/batchProcessor.d.ts +2 -2
  30. package/dist/export/batchProcessor.d.ts.map +1 -1
  31. package/dist/export/batchProcessor.js.map +1 -1
  32. package/dist/export/createExport.d.ts +2 -2
  33. package/dist/export/createExport.d.ts.map +1 -1
  34. package/dist/export/createExport.js +1 -1
  35. package/dist/export/createExport.js.map +1 -1
  36. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  37. package/dist/export/getExportCollection.d.ts.map +1 -1
  38. package/dist/export/getExportCollection.js +4 -4
  39. package/dist/export/getExportCollection.js.map +1 -1
  40. package/dist/export/getFields.d.ts.map +1 -1
  41. package/dist/export/handleDownload.d.ts.map +1 -1
  42. package/dist/export/handleDownload.js +2 -2
  43. package/dist/export/handleDownload.js.map +1 -1
  44. package/dist/export/handlePreview.d.ts.map +1 -1
  45. package/dist/export/handlePreview.js +1 -1
  46. package/dist/export/handlePreview.js.map +1 -1
  47. package/dist/exports/types.d.ts +1 -1
  48. package/dist/exports/types.d.ts.map +1 -1
  49. package/dist/exports/types.js.map +1 -1
  50. package/dist/import/batchProcessor.d.ts +2 -2
  51. package/dist/import/batchProcessor.d.ts.map +1 -1
  52. package/dist/import/batchProcessor.js.map +1 -1
  53. package/dist/import/createImport.d.ts.map +1 -1
  54. package/dist/import/createImport.js +1 -1
  55. package/dist/import/createImport.js.map +1 -1
  56. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  57. package/dist/import/getFields.d.ts.map +1 -1
  58. package/dist/import/getImportCollection.d.ts.map +1 -1
  59. package/dist/import/getImportCollection.js +4 -4
  60. package/dist/import/getImportCollection.js.map +1 -1
  61. package/dist/import/handlePreview.d.ts.map +1 -1
  62. package/dist/index.d.ts +2 -13
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +19 -8
  65. package/dist/index.js.map +1 -1
  66. package/dist/types.d.ts +0 -32
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/types.js.map +1 -1
  69. package/dist/utilities/applyFieldHooks.d.ts +1 -2
  70. package/dist/utilities/applyFieldHooks.d.ts.map +1 -1
  71. package/dist/utilities/applyFieldHooks.js +2 -3
  72. package/dist/utilities/applyFieldHooks.js.map +1 -1
  73. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
  74. package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -1
  75. package/dist/utilities/fieldToRegex.d.ts.map +1 -1
  76. package/dist/utilities/flattenObject.d.ts.map +1 -1
  77. package/dist/utilities/flattenObject.js +3 -13
  78. package/dist/utilities/flattenObject.js.map +1 -1
  79. package/dist/utilities/flattenedFields.d.ts.map +1 -1
  80. package/dist/utilities/flattenedFields.js +3 -0
  81. package/dist/utilities/flattenedFields.js.map +1 -1
  82. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
  83. package/dist/utilities/getExportFieldFunctions.js +0 -8
  84. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  85. package/dist/utilities/getFileFromDoc.d.ts.map +1 -1
  86. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  87. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
  88. package/dist/utilities/getImportFieldFunctions.js +0 -8
  89. package/dist/utilities/getImportFieldFunctions.js.map +1 -1
  90. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  91. package/dist/utilities/getSchemaColumns.d.ts +1 -1
  92. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  93. package/dist/utilities/getSchemaColumns.js +2 -2
  94. package/dist/utilities/getSchemaColumns.js.map +1 -1
  95. package/dist/utilities/getSelect.d.ts.map +1 -1
  96. package/dist/utilities/isPlainObject.d.ts.map +1 -1
  97. package/dist/utilities/parseCSV.d.ts.map +1 -1
  98. package/dist/utilities/parseJSON.d.ts.map +1 -1
  99. package/dist/utilities/polymorphicRel.d.ts.map +1 -1
  100. package/dist/utilities/processRichTextField.d.ts.map +1 -1
  101. package/dist/utilities/processRichTextField.js +7 -0
  102. package/dist/utilities/processRichTextField.js.map +1 -1
  103. package/dist/utilities/processRichTextField.spec.js +308 -0
  104. package/dist/utilities/processRichTextField.spec.js.map +1 -0
  105. package/dist/utilities/removeDisabledFields.d.ts.map +1 -1
  106. package/dist/utilities/setNestedValue.d.ts.map +1 -1
  107. package/dist/utilities/sortHelpers.d.ts.map +1 -1
  108. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  109. package/dist/utilities/unflattenObject.js +29 -18
  110. package/dist/utilities/unflattenObject.js.map +1 -1
  111. package/dist/utilities/unflattenObject.spec.js +106 -0
  112. package/dist/utilities/unflattenObject.spec.js.map +1 -1
  113. package/dist/utilities/unflattenPostProcess.d.ts.map +1 -1
  114. package/dist/utilities/unflattenPostProcess.js +39 -13
  115. package/dist/utilities/unflattenPostProcess.js.map +1 -1
  116. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  117. package/license.md +1 -1
  118. package/package.json +7 -7
  119. package/dist/components/ExportPreview/index.scss +0 -48
  120. package/dist/components/FieldsToExport/index.scss +0 -0
  121. package/dist/components/ImportPreview/index.scss +0 -41
  122. package/dist/components/SortBy/index.scss +0 -3
  123. package/dist/components/SortOrder/index.scss +0 -3
  124. package/dist/utilities/legacyHookDispatch.spec.js +0 -227
  125. package/dist/utilities/legacyHookDispatch.spec.js.map +0 -1
  126. /package/dist/components/Page/{index.scss → index.css} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/processRichTextField.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { processRichTextField } from './processRichTextField.js'\n\n// Minimal helpers to keep assertions readable\nconst asRecord = (v: unknown) => v as Record<string, unknown>\nconst asArray = (v: unknown) => v as unknown[]\n\n// ─── Fixtures ────────────────────────────────────────────────────────────────\n\nconst textNode = (overrides: Record<string, unknown> = {}) => ({\n detail: 0,\n format: 0,\n mode: 'normal',\n text: 'Hello',\n type: 'text',\n version: 1,\n ...overrides,\n})\n\nconst paragraphNode = (children: unknown[] = [textNode()]) => ({\n children,\n direction: 'ltr',\n format: '',\n indent: 0,\n type: 'paragraph',\n version: 1,\n})\n\nconst lexicalDoc = (children: unknown[] = [paragraphNode()]) => ({\n children,\n direction: 'ltr',\n format: '',\n indent: 0,\n type: 'root',\n version: 1,\n})\n\n// ─── Primitive pass-through ──────────────────────────────────────────────────\n\ndescribe('processRichTextField — primitive pass-through', () => {\n it('should return null unchanged', () => {\n expect(processRichTextField(null)).toBeNull()\n })\n\n it('should return undefined unchanged', () => {\n expect(processRichTextField(undefined)).toBeUndefined()\n })\n\n it('should return a number unchanged', () => {\n expect(processRichTextField(42)).toBe(42)\n })\n\n it('should return false unchanged', () => {\n expect(processRichTextField(false)).toBe(false)\n })\n})\n\n// ─── String input (the recovered-from-missed-hook path) ─────────────────────\n\ndescribe('processRichTextField — JSON string input', () => {\n it('should parse a valid JSON string into an object', () => {\n const doc = lexicalDoc()\n expect(processRichTextField(JSON.stringify(doc))).toEqual(doc)\n })\n\n it('should return an unparseable string unchanged', () => {\n expect(processRichTextField('not json')).toBe('not json')\n })\n\n it('should return an empty string unchanged', () => {\n expect(processRichTextField('')).toBe('')\n })\n\n it('should parse a string and still convert numeric string properties', () => {\n const node = { type: 'text', detail: '0', format: '3', indent: '0', version: '1', text: 'hi' }\n const result = asRecord(processRichTextField(JSON.stringify(node)))\n expect(result.detail).toBe(0)\n expect(result.format).toBe(3)\n expect(result.indent).toBe(0)\n expect(result.version).toBe(1)\n })\n})\n\n// ─── Numeric property coercion ───────────────────────────────────────────────\n\ndescribe('processRichTextField — numeric property coercion', () => {\n it('should convert detail, format, indent, version from strings to numbers', () => {\n const input = textNode({ detail: '0', format: '0', indent: '0', version: '1' })\n const result = asRecord(processRichTextField(input))\n expect(result.detail).toBe(0)\n expect(result.format).toBe(0)\n expect(result.indent).toBe(0)\n expect(result.version).toBe(1)\n })\n\n it('should convert start and value from strings to numbers (list/listitem nodes)', () => {\n const listItemNode = { type: 'listitem', start: '1', value: '2', version: '1' }\n const result = asRecord(processRichTextField(listItemNode))\n expect(result.start).toBe(1)\n expect(result.value).toBe(2)\n })\n\n it('should convert textFormat and textStyle from strings to numbers', () => {\n const input = { type: 'text', textFormat: '4', textStyle: '0', version: '1', text: 'x' }\n const result = asRecord(processRichTextField(input))\n expect(result.textFormat).toBe(4)\n expect(result.textStyle).toBe(0)\n })\n\n it('should leave a non-numeric string in a numeric-property slot unchanged', () => {\n // Lexical paragraph format can be \"\" (empty) or alignment strings\n const input = paragraphNode()\n const result = asRecord(processRichTextField(input))\n expect(result.format).toBe('')\n })\n\n it('should leave already-numeric values unchanged', () => {\n const input = textNode({ detail: 0, format: 3, version: 1 })\n const result = asRecord(processRichTextField(input))\n expect(result.detail).toBe(0)\n expect(result.format).toBe(3)\n expect(result.version).toBe(1)\n })\n\n it('should not convert boolean values on numeric-property keys', () => {\n const input = { type: 'custom', format: true, version: '1' }\n const result = asRecord(processRichTextField(input))\n expect(result.format).toBe(true)\n expect(result.version).toBe(1)\n })\n})\n\n// ─── Recursive children processing ──────────────────────────────────────────\n\ndescribe('processRichTextField — recursive children', () => {\n it('should recursively convert numeric strings inside children arrays', () => {\n const input = paragraphNode([textNode({ detail: '0', format: '0', version: '1' })])\n const result = asRecord(processRichTextField(input))\n const child = asRecord(asArray(result.children)[0])\n expect(child.detail).toBe(0)\n expect(child.format).toBe(0)\n expect(child.version).toBe(1)\n })\n\n it('should handle three levels of nesting (root → paragraph → text)', () => {\n const input = lexicalDoc([paragraphNode([textNode({ version: '1', format: '2' })])])\n const result = asRecord(processRichTextField(input))\n const paragraph = asRecord(asArray(result.children)[0])\n const text = asRecord(asArray(paragraph.children)[0])\n expect(text.version).toBe(1)\n expect(text.format).toBe(2)\n })\n\n it('should handle multiple children at the same level', () => {\n const input = lexicalDoc([\n paragraphNode([\n textNode({ text: 'Bold', format: '1' }),\n textNode({ text: ' normal', format: '0' }),\n ]),\n paragraphNode([textNode({ text: 'Second para', version: '1' })]),\n ])\n const result = asRecord(processRichTextField(input))\n const firstPara = asRecord(asArray(result.children)[0])\n const secondPara = asRecord(asArray(result.children)[1])\n const bold = asRecord(asArray(firstPara.children)[0])\n const normal = asRecord(asArray(firstPara.children)[1])\n const secondText = asRecord(asArray(secondPara.children)[0])\n expect(bold.format).toBe(1)\n expect(normal.format).toBe(0)\n expect(secondText.version).toBe(1)\n })\n\n it('should skip null and non-object entries in children without throwing', () => {\n const input = { type: 'root', version: 1, children: [null, undefined, 'stray', textNode()] }\n const result = asRecord(processRichTextField(input))\n const children = asArray(result.children)\n expect(children[0]).toBeNull()\n expect(children[1]).toBeUndefined()\n expect(children[2]).toBe('stray')\n expect(asRecord(children[3]).type).toBe('text')\n })\n})\n\n// ─── Nested non-children objects ─────────────────────────────────────────────\n\ndescribe('processRichTextField — nested non-children objects', () => {\n it('should recurse into plain nested objects (e.g. decorator node data)', () => {\n const input = {\n type: 'decorator',\n version: '1',\n data: { detail: '2', label: 'keep me' },\n }\n const result = asRecord(processRichTextField(input))\n const data = asRecord(result.data)\n expect(result.version).toBe(1)\n expect(data.detail).toBe(2)\n expect(data.label).toBe('keep me')\n })\n})\n\n// ─── Full Lexical document round-trips ───────────────────────────────────────\n\ndescribe('processRichTextField — full document', () => {\n it('should produce a stable result when called on an already-processed object', () => {\n const doc = lexicalDoc()\n const firstPass = processRichTextField(doc)\n const secondPass = processRichTextField(firstPass)\n expect(secondPass).toEqual(firstPass)\n })\n\n it('should fully round-trip a complex Lexical document serialised to JSON', () => {\n const doc = lexicalDoc([\n paragraphNode([\n textNode({ text: 'Bold', format: '1', detail: '0', indent: '0', version: '1' }),\n textNode({ text: ' normal', format: '0', version: '1' }),\n ]),\n {\n type: 'list',\n listType: 'number',\n start: '1',\n version: '1',\n indent: '0',\n direction: 'ltr',\n children: [\n { type: 'listitem', value: '1', detail: '0', format: '0', version: '1', text: 'Item A' },\n { type: 'listitem', value: '2', detail: '0', format: '0', version: '1', text: 'Item B' },\n ],\n },\n ])\n\n const result = asRecord(processRichTextField(JSON.stringify(doc)))\n\n const para = asRecord(asArray(result.children)[0])\n const boldText = asRecord(asArray(para.children)[0])\n expect(boldText.format).toBe(1)\n expect(boldText.detail).toBe(0)\n\n const list = asRecord(asArray(result.children)[1])\n expect(list.start).toBe(1)\n expect(list.indent).toBe(0)\n\n const itemA = asRecord(asArray(list.children)[0])\n const itemB = asRecord(asArray(list.children)[1])\n expect(itemA.value).toBe(1)\n expect(itemB.value).toBe(2)\n })\n})\n"],"names":["describe","expect","it","processRichTextField","asRecord","v","asArray","textNode","overrides","detail","format","mode","text","type","version","paragraphNode","children","direction","indent","lexicalDoc","toBeNull","undefined","toBeUndefined","toBe","doc","JSON","stringify","toEqual","node","result","input","listItemNode","start","value","textFormat","textStyle","child","paragraph","firstPara","secondPara","bold","normal","secondText","data","label","firstPass","secondPass","listType","para","boldText","list","itemA","itemB"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"removeDisabledFields.d.ts","sourceRoot":"","sources":["../../src/utilities/removeDisabledFields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,oBAAoB,QAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAClB,MAAM,EAAE,KACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CA8DxB,CAAA"}
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,"file":"setNestedValue.d.ts","sourceRoot":"","sources":["../../src/utilities/setNestedValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,cAAc,QACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,SACL,OAAO,KACb,IA8CF,CAAA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sortHelpers.d.ts","sourceRoot":"","sources":["../../src/utilities/sortHelpers.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,eAAO,MAAM,aAAa,OAAQ,IAAI,GAAG,MAAM,KAAG,MAAwC,CAAA;AAE1F,iEAAiE;AACjE,eAAO,MAAM,cAAc,UAAW,MAAM,SAAS,KAAK,GAAG,MAAM,KAAG,MAC9B,CAAA;AAGxC,eAAO,MAAM,mBAAmB,MAAO,OAAO,KAAG,MAAM,GAAG,SAQzD,CAAA"}
1
+ {"version":3,"file":"sortHelpers.d.ts","sourceRoot":"","sources":["../../src/utilities/sortHelpers.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,eAAO,MAAM,aAAa,GAAI,IAAI,IAAI,GAAG,MAAM,KAAG,MAAwC,CAAA;AAE1F,iEAAiE;AACjE,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,OAAO,KAAK,GAAG,MAAM,KAAG,MAC9B,CAAA;AAGxC,eAAO,MAAM,mBAAmB,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,SAQzD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"unflattenObject.d.ts","sourceRoot":"","sources":["../../src/utilities/unflattenObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKvD,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACvD,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAiCD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,qDAMzB,aAAa,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAkUxC,CAAA"}
1
+ {"version":3,"file":"unflattenObject.d.ts","sourceRoot":"","sources":["../../src/utilities/unflattenObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKvD,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACvD,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAuCD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAAI,kDAM7B,aAAa,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAyUxC,CAAA"}
@@ -1,4 +1,4 @@
1
- import { getNestedFlattenedFields } from './flattenedFields.js';
1
+ import { getBlockFlattenedFields, getNestedFlattenedFields } from './flattenedFields.js';
2
2
  import { postProcessDocument } from './unflattenPostProcess.js';
3
3
  const indexSegment = /^\d+$/;
4
4
  const collectArrayLikeNames = (fields, into)=>{
@@ -9,6 +9,11 @@ const collectArrayLikeNames = (fields, into)=>{
9
9
  if (field.type === 'array' || field.type === 'blocks') {
10
10
  into.add(field.name);
11
11
  }
12
+ if (field.type === 'blocks') {
13
+ for (const block of field.blocks ?? []){
14
+ collectArrayLikeNames(getBlockFlattenedFields(block), into);
15
+ }
16
+ }
12
17
  const nested = getNestedFlattenedFields(field);
13
18
  if (nested) {
14
19
  collectArrayLikeNames(nested, into);
@@ -103,22 +108,14 @@ const collectArrayLikeNames = (fields, into)=>{
103
108
  const importHookEntry = importFieldHooks[flatKey] ?? importFieldHooks[toLogicalKey(flatKey, arrayLikeNames)];
104
109
  if (importHookEntry) {
105
110
  try {
106
- if (importHookEntry.type === 'beforeImport') {
107
- value = importHookEntry.fn({
108
- columnName: flatKey,
109
- data,
110
- format,
111
- siblingData: data,
112
- siblingDoc: data,
113
- value
114
- });
115
- } else {
116
- value = importHookEntry.fn({
117
- columnName: flatKey,
118
- data,
119
- value
120
- });
121
- }
111
+ value = importHookEntry.fn({
112
+ columnName: flatKey,
113
+ data,
114
+ format,
115
+ siblingData: data,
116
+ siblingDoc: data,
117
+ value
118
+ });
122
119
  } catch (error) {
123
120
  req.payload.logger.error({
124
121
  err: error,
@@ -238,7 +235,9 @@ const collectArrayLikeNames = (fields, into)=>{
238
235
  blockObject[blockFieldName] = value;
239
236
  } else {
240
237
  if (!blockObject[blockFieldName] || typeof blockObject[blockFieldName] !== 'object') {
241
- blockObject[blockFieldName] = {};
238
+ const segmentAfterBlockField = pathSegments[i + 4];
239
+ const blockFieldIsArray = segmentAfterBlockField !== undefined && indexSegment.test(segmentAfterBlockField);
240
+ blockObject[blockFieldName] = blockFieldIsArray ? [] : {};
242
241
  }
243
242
  currentObject = blockObject[blockFieldName];
244
243
  i = i + 3;
@@ -262,6 +261,18 @@ const collectArrayLikeNames = (fields, into)=>{
262
261
  currentObject = arr[arrayIndex];
263
262
  i++;
264
263
  }
264
+ } else if (Array.isArray(currentObject) && indexSegment.test(segment)) {
265
+ // currentObject is an array we arrived at via block field traversal — treat the
266
+ // segment as a numeric index rather than a plain property name.
267
+ const idx = parseInt(segment, 10);
268
+ const arr = currentObject;
269
+ while(arr.length <= idx){
270
+ arr.push(null);
271
+ }
272
+ if (arr[idx] === null || arr[idx] === undefined) {
273
+ arr[idx] = {};
274
+ }
275
+ currentObject = arr[idx];
265
276
  } else {
266
277
  // Skip if already set to null (polymorphic relationship already processed)
267
278
  if (currentObject[segment] === null && isLast && segment === 'relationTo') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/unflattenObject.ts"],"sourcesContent":["import type { FlattenedField, PayloadRequest } from 'payload'\n\nimport type { ImportFieldHookEntry } from '../types.js'\n\nimport { getNestedFlattenedFields } from './flattenedFields.js'\nimport { postProcessDocument } from './unflattenPostProcess.js'\n\ntype UnflattenArgs = {\n data: Record<string, unknown>\n fields: FlattenedField[]\n format?: 'csv' | 'json' | ({} & string)\n importFieldHooks?: Record<string, ImportFieldHookEntry>\n req: PayloadRequest\n}\n\nconst indexSegment = /^\\d+$/\n\nconst collectArrayLikeNames = (fields: FlattenedField[], into: Set<string>): void => {\n for (const field of fields) {\n if (!('name' in field) || !field.name) {\n continue\n }\n if (field.type === 'array' || field.type === 'blocks') {\n into.add(field.name)\n }\n const nested = getNestedFlattenedFields(field)\n if (nested) {\n collectArrayLikeNames(nested, into)\n }\n }\n}\n\n/**\n * Drops numeric array-index segments from a flat key so a runtime key like\n * `items_0_note` matches the static, index-free key a user hook is registered\n * under. A digit-only segment is only stripped when the segment immediately\n * before it names an array or blocks field, so a literal field name like\n * `2024` is preserved.\n */\nconst toLogicalKey = (flatKey: string, arrayLikeNames: Set<string>): string => {\n const segments = flatKey.split('_')\n return segments\n .filter((seg, i) => !indexSegment.test(seg) || !arrayLikeNames.has(segments[i - 1] ?? ''))\n .join('_')\n}\n\n/**\n * Converts flattened CSV data back into a nested document structure.\n *\n * The algorithm:\n * 1. Sorts keys to ensure array indices are processed in order\n * 2. For each flattened key (e.g., \"blocks_0_hero_title\"), splits by underscore into path segments\n * 3. Traverses/builds the nested structure, handling:\n * - Arrays (numeric segments like \"0\", \"1\")\n * - Blocks (blockType detection from slug patterns)\n * - Polymorphic relationships (_relationTo and _id suffix pairs)\n * - Regular nested objects\n * 4. Post-processes to handle localized fields, hasMany conversions, and relationship transforms\n */\nexport const unflattenObject = ({\n data,\n fields,\n format = 'csv',\n importFieldHooks = {},\n req,\n}: UnflattenArgs): Record<string, unknown> => {\n if (!data || typeof data !== 'object') {\n return {}\n }\n\n const result: Record<string, unknown> = {}\n\n const arrayLikeNames = new Set<string>()\n collectArrayLikeNames(fields, arrayLikeNames)\n\n // Sort keys to ensure array indices are processed in order\n const sortedKeys = Object.keys(data).sort((a, b) => {\n // Extract array indices from flattened keys (e.g., \"field_0_subfield\" -> \"0\")\n const aMatch = a.match(/_(\\d+)(?:_|$)/)\n const bMatch = b.match(/_(\\d+)(?:_|$)/)\n\n if (aMatch && bMatch && aMatch.index !== undefined && bMatch.index !== undefined) {\n const aBase = a.substring(0, aMatch.index)\n const bBase = b.substring(0, bMatch.index)\n\n if (aBase === bBase) {\n return (parseInt(aMatch?.[1] ?? '0', 10) || 0) - (parseInt(bMatch?.[1] ?? '0', 10) || 0)\n }\n }\n\n return a.localeCompare(b)\n })\n\n for (const flatKey of sortedKeys) {\n let value = data[flatKey]\n\n // Skip undefined values but keep null for required field validation\n if (value === undefined) {\n continue\n }\n\n // Preserve system fields with underscore prefix (like _status) without splitting\n if (flatKey === '_status') {\n result[flatKey] = value\n continue\n }\n\n // Check if this is a _relationTo key for a polymorphic relationship\n if (flatKey.endsWith('_relationTo')) {\n const baseKey = flatKey.replace(/_relationTo$/, '')\n const idKey = `${baseKey}_id`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n if (baseKey in result) {\n continue\n }\n\n // If the corresponding _id key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(idKey in data) || data[idKey] === undefined) {\n continue\n }\n }\n }\n\n // Check if this is a _id key for a polymorphic relationship where _relationTo is undefined\n if (flatKey.endsWith('_id')) {\n const baseKey = flatKey.replace(/_id$/, '')\n const relationToKey = `${baseKey}_relationTo`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n // If the corresponding _relationTo key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(relationToKey in data) || data[relationToKey] === undefined) {\n continue\n }\n }\n }\n\n const importHookEntry =\n importFieldHooks[flatKey] ?? importFieldHooks[toLogicalKey(flatKey, arrayLikeNames)]\n if (importHookEntry) {\n try {\n if (importHookEntry.type === 'beforeImport') {\n value = importHookEntry.fn({\n columnName: flatKey,\n data,\n format,\n siblingData: data,\n siblingDoc: data,\n value,\n })\n } else {\n value = importHookEntry.fn({\n columnName: flatKey,\n data,\n value,\n })\n }\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `[plugin-import-export] Field-level beforeImport hook for \"${flatKey}\" threw — falling back to original value`,\n })\n // Keep the original value so the row is not dropped — downstream\n // validation will surface any deeper issue per-row.\n }\n }\n\n // Example: \"blocks_0_content_text\" -> [\"blocks\", \"0\", \"content\", \"text\"]\n const pathSegments = flatKey.split('_')\n let currentObject: Record<string, unknown> = result\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i]\n if (!segment) {\n continue\n } // Skip empty segments\n\n const nextSegment = pathSegments[i + 1]\n const isLast = i === pathSegments.length - 1\n\n // Check if next segment is a numeric array index (e.g., \"0\", \"1\", \"2\")\n const isArrayIndex = nextSegment !== undefined && /^\\d+$/.test(nextSegment)\n\n if (isLast) {\n // Special handling for blockType suffix in blocks\n if (segment === 'blockType' && i >= 3) {\n // Pattern: blocks_0_hero_blockType -> set blockType on the block\n const blockFieldName = pathSegments[0] // 'blocks'\n const isBlockField = fields.some(\n (field) => field.name === blockFieldName && field.type === 'blocks',\n )\n\n if (isBlockField && pathSegments[1]?.match(/^\\d+$/)) {\n const parent = getParentObject(result, pathSegments.slice(0, 2))\n if (parent && typeof parent === 'object') {\n parent.blockType = value\n }\n continue\n }\n }\n\n // Special handling for relationship fields with _id suffix\n if (segment === 'id' && i > 0) {\n const parentKey = pathSegments[i - 1]\n const isPreviousSegmentArrayIndex = parentKey ? /^\\d+$/.test(parentKey) : false\n\n if (!isPreviousSegmentArrayIndex) {\n // Check if this is a relationship field\n const isRelationship = fields.some(\n (field) => field.name === parentKey && field.type === 'relationship',\n )\n\n if (isRelationship) {\n // Check if this is a polymorphic relationship field\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic =\n field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n const relationToKey = pathSegments.slice(0, i).concat('relationTo').join('_')\n const relationToValue = data[relationToKey]\n\n const parent = getParentObject(result, pathSegments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n // Both fields must be defined to create/update the relationship\n // If either is undefined, skip the field entirely (preserve existing data)\n if (value !== undefined && relationToValue !== undefined) {\n // Check if both are explicitly null\n if (relationToValue === null && value === null) {\n // Only set to null if explicitly null (user typed \"null\" in CSV)\n parent[parentKey] = null\n } else if (relationToValue || value) {\n // At least one has a value, create the relationship\n parent[parentKey] = {\n relationTo: relationToValue,\n value, // This will be transformed to proper format in postProcess\n }\n }\n // If both are empty strings, don't set the field (handled by not meeting the above conditions)\n }\n // If either is undefined, don't set the field at all (preserve existing data)\n }\n continue\n } else if (!isPolymorphic) {\n const parent = getParentObject(result, pathSegments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n parent[parentKey] = value\n }\n continue\n }\n }\n }\n }\n\n // _relationTo suffix is handled when processing the _id field above\n if (segment === 'relationTo' && i > 0) {\n const parentKey = pathSegments[i - 1]\n if (parentKey && !parentKey.match(/^\\d+$/)) {\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic = field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n // For polymorphic relationships, this is handled when processing the _id field\n // Skip it entirely\n continue\n }\n }\n }\n\n currentObject[segment] = value\n } else if (isArrayIndex && nextSegment !== undefined) {\n if (!currentObject[segment] || !Array.isArray(currentObject[segment])) {\n currentObject[segment] = []\n }\n\n const arrayIndex = parseInt(nextSegment)\n const arr = currentObject[segment] as unknown[]\n\n // Ensure array has sufficient length\n while (arr.length <= arrayIndex) {\n arr.push(null)\n }\n\n // Handle array of objects\n if (arr[arrayIndex] === null || arr[arrayIndex] === undefined) {\n arr[arrayIndex] = {}\n }\n\n // Handle blocks field with block slug pattern (e.g., blocks_0_hero_title)\n const isBlocksField = fields.some((f) => f.name === segment && f.type === 'blocks')\n if (isBlocksField && i + 3 < pathSegments.length) {\n const blockSlug = pathSegments[i + 2]\n const blockFieldName = pathSegments[i + 3]\n\n if (blockSlug && blockFieldName) {\n const blockObject = arr[arrayIndex] as Record<string, unknown>\n blockObject.blockType = blockSlug\n\n if (i + 3 === pathSegments.length - 1) {\n blockObject[blockFieldName] = value\n } else {\n if (!blockObject[blockFieldName] || typeof blockObject[blockFieldName] !== 'object') {\n blockObject[blockFieldName] = {}\n }\n currentObject = blockObject[blockFieldName] as Record<string, unknown>\n i = i + 3\n continue\n }\n break\n }\n }\n\n if (i + 2 === pathSegments.length - 1) {\n const lastSegment = pathSegments[pathSegments.length - 1]\n if (lastSegment && arr[arrayIndex] && typeof arr[arrayIndex] === 'object') {\n ;(arr[arrayIndex] as Record<string, unknown>)[lastSegment] = value\n }\n break\n } else if (i + 1 === pathSegments.length - 1) {\n // Direct array value (e.g., tags_0 = \"value\")\n arr[arrayIndex] = value\n break\n } else {\n currentObject = arr[arrayIndex] as Record<string, unknown>\n i++\n }\n } else {\n // Skip if already set to null (polymorphic relationship already processed)\n if (currentObject[segment] === null && isLast && segment === 'relationTo') {\n continue\n }\n\n if (\n !currentObject[segment] ||\n typeof currentObject[segment] !== 'object' ||\n Array.isArray(currentObject[segment])\n ) {\n currentObject[segment] = {}\n }\n\n // Handle polymorphic relationship arrays\n if (segment === 'relationTo' && i > 0 && pathSegments[i - 1]?.match(/^\\d+$/)) {\n currentObject[segment] = value\n } else if (\n typeof currentObject[segment] === 'object' &&\n !Array.isArray(currentObject[segment]) &&\n currentObject[segment] !== null\n ) {\n currentObject = currentObject[segment] as Record<string, unknown>\n }\n }\n }\n }\n\n try {\n // Post-process to handle special structures\n postProcessDocument(result, fields)\n } catch (err) {\n // Log but don't throw - return partially processed result\n\n req.payload.logger.error({\n err,\n msg: '[plugin-import-export] Error in postProcessDocument',\n })\n }\n\n return result\n}\n\nconst getParentObject = (\n obj: Record<string, unknown>,\n segments: string[],\n): Record<string, unknown> | undefined => {\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n const nextSegment = segments[i + 1]\n\n if (!segment) {\n continue\n }\n\n if (nextSegment && /^\\d+$/.test(nextSegment)) {\n const arrayIndex = parseInt(nextSegment)\n const arr = current[segment] as unknown[]\n\n if (Array.isArray(arr) && arr[arrayIndex]) {\n current = arr[arrayIndex] as Record<string, unknown>\n i++ // Skip the index\n } else {\n return undefined\n }\n } else {\n const next = current[segment]\n if (typeof next === 'object' && next !== null && !Array.isArray(next)) {\n current = next as Record<string, unknown>\n } else {\n return undefined\n }\n }\n }\n\n return current\n}\n"],"names":["getNestedFlattenedFields","postProcessDocument","indexSegment","collectArrayLikeNames","fields","into","field","name","type","add","nested","toLogicalKey","flatKey","arrayLikeNames","segments","split","filter","seg","i","test","has","join","unflattenObject","data","format","importFieldHooks","req","result","Set","sortedKeys","Object","keys","sort","a","b","aMatch","match","bMatch","index","undefined","aBase","substring","bBase","parseInt","localeCompare","value","endsWith","baseKey","replace","idKey","isPolymorphic","some","Array","isArray","relationTo","relationToKey","importHookEntry","fn","columnName","siblingData","siblingDoc","error","payload","logger","err","msg","pathSegments","currentObject","length","segment","nextSegment","isLast","isArrayIndex","blockFieldName","isBlockField","parent","getParentObject","slice","blockType","parentKey","isPreviousSegmentArrayIndex","isRelationship","find","f","concat","relationToValue","arrayIndex","arr","push","isBlocksField","blockSlug","blockObject","lastSegment","obj","current","next"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/unflattenObject.ts"],"sourcesContent":["import type { FlattenedField, PayloadRequest } from 'payload'\n\nimport type { ImportFieldHookEntry } from '../types.js'\n\nimport { getBlockFlattenedFields, getNestedFlattenedFields } from './flattenedFields.js'\nimport { postProcessDocument } from './unflattenPostProcess.js'\n\ntype UnflattenArgs = {\n data: Record<string, unknown>\n fields: FlattenedField[]\n format?: 'csv' | 'json' | ({} & string)\n importFieldHooks?: Record<string, ImportFieldHookEntry>\n req: PayloadRequest\n}\n\nconst indexSegment = /^\\d+$/\n\nconst collectArrayLikeNames = (fields: FlattenedField[], into: Set<string>): void => {\n for (const field of fields) {\n if (!('name' in field) || !field.name) {\n continue\n }\n if (field.type === 'array' || field.type === 'blocks') {\n into.add(field.name)\n }\n if (field.type === 'blocks') {\n for (const block of (field as { blocks?: Array<{ flattenedFields?: FlattenedField[] }> })\n .blocks ?? []) {\n collectArrayLikeNames(getBlockFlattenedFields(block), into)\n }\n }\n const nested = getNestedFlattenedFields(field)\n if (nested) {\n collectArrayLikeNames(nested, into)\n }\n }\n}\n\n/**\n * Drops numeric array-index segments from a flat key so a runtime key like\n * `items_0_note` matches the static, index-free key a user hook is registered\n * under. A digit-only segment is only stripped when the segment immediately\n * before it names an array or blocks field, so a literal field name like\n * `2024` is preserved.\n */\nconst toLogicalKey = (flatKey: string, arrayLikeNames: Set<string>): string => {\n const segments = flatKey.split('_')\n return segments\n .filter((seg, i) => !indexSegment.test(seg) || !arrayLikeNames.has(segments[i - 1] ?? ''))\n .join('_')\n}\n\n/**\n * Converts flattened CSV data back into a nested document structure.\n *\n * The algorithm:\n * 1. Sorts keys to ensure array indices are processed in order\n * 2. For each flattened key (e.g., \"blocks_0_hero_title\"), splits by underscore into path segments\n * 3. Traverses/builds the nested structure, handling:\n * - Arrays (numeric segments like \"0\", \"1\")\n * - Blocks (blockType detection from slug patterns)\n * - Polymorphic relationships (_relationTo and _id suffix pairs)\n * - Regular nested objects\n * 4. Post-processes to handle localized fields, hasMany conversions, and relationship transforms\n */\nexport const unflattenObject = ({\n data,\n fields,\n format = 'csv',\n importFieldHooks = {},\n req,\n}: UnflattenArgs): Record<string, unknown> => {\n if (!data || typeof data !== 'object') {\n return {}\n }\n\n const result: Record<string, unknown> = {}\n\n const arrayLikeNames = new Set<string>()\n collectArrayLikeNames(fields, arrayLikeNames)\n\n // Sort keys to ensure array indices are processed in order\n const sortedKeys = Object.keys(data).sort((a, b) => {\n // Extract array indices from flattened keys (e.g., \"field_0_subfield\" -> \"0\")\n const aMatch = a.match(/_(\\d+)(?:_|$)/)\n const bMatch = b.match(/_(\\d+)(?:_|$)/)\n\n if (aMatch && bMatch && aMatch.index !== undefined && bMatch.index !== undefined) {\n const aBase = a.substring(0, aMatch.index)\n const bBase = b.substring(0, bMatch.index)\n\n if (aBase === bBase) {\n return (parseInt(aMatch?.[1] ?? '0', 10) || 0) - (parseInt(bMatch?.[1] ?? '0', 10) || 0)\n }\n }\n\n return a.localeCompare(b)\n })\n\n for (const flatKey of sortedKeys) {\n let value = data[flatKey]\n\n // Skip undefined values but keep null for required field validation\n if (value === undefined) {\n continue\n }\n\n // Preserve system fields with underscore prefix (like _status) without splitting\n if (flatKey === '_status') {\n result[flatKey] = value\n continue\n }\n\n // Check if this is a _relationTo key for a polymorphic relationship\n if (flatKey.endsWith('_relationTo')) {\n const baseKey = flatKey.replace(/_relationTo$/, '')\n const idKey = `${baseKey}_id`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n if (baseKey in result) {\n continue\n }\n\n // If the corresponding _id key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(idKey in data) || data[idKey] === undefined) {\n continue\n }\n }\n }\n\n // Check if this is a _id key for a polymorphic relationship where _relationTo is undefined\n if (flatKey.endsWith('_id')) {\n const baseKey = flatKey.replace(/_id$/, '')\n const relationToKey = `${baseKey}_relationTo`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n // If the corresponding _relationTo key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(relationToKey in data) || data[relationToKey] === undefined) {\n continue\n }\n }\n }\n\n const importHookEntry =\n importFieldHooks[flatKey] ?? importFieldHooks[toLogicalKey(flatKey, arrayLikeNames)]\n if (importHookEntry) {\n try {\n value = importHookEntry.fn({\n columnName: flatKey,\n data,\n format,\n siblingData: data,\n siblingDoc: data,\n value,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `[plugin-import-export] Field-level beforeImport hook for \"${flatKey}\" threw — falling back to original value`,\n })\n // Keep the original value so the row is not dropped — downstream\n // validation will surface any deeper issue per-row.\n }\n }\n\n // Example: \"blocks_0_content_text\" -> [\"blocks\", \"0\", \"content\", \"text\"]\n const pathSegments = flatKey.split('_')\n let currentObject: Record<string, unknown> = result\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i]\n if (!segment) {\n continue\n } // Skip empty segments\n\n const nextSegment = pathSegments[i + 1]\n const isLast = i === pathSegments.length - 1\n\n // Check if next segment is a numeric array index (e.g., \"0\", \"1\", \"2\")\n const isArrayIndex = nextSegment !== undefined && /^\\d+$/.test(nextSegment)\n\n if (isLast) {\n // Special handling for blockType suffix in blocks\n if (segment === 'blockType' && i >= 3) {\n // Pattern: blocks_0_hero_blockType -> set blockType on the block\n const blockFieldName = pathSegments[0] // 'blocks'\n const isBlockField = fields.some(\n (field) => field.name === blockFieldName && field.type === 'blocks',\n )\n\n if (isBlockField && pathSegments[1]?.match(/^\\d+$/)) {\n const parent = getParentObject(result, pathSegments.slice(0, 2))\n if (parent && typeof parent === 'object') {\n parent.blockType = value\n }\n continue\n }\n }\n\n // Special handling for relationship fields with _id suffix\n if (segment === 'id' && i > 0) {\n const parentKey = pathSegments[i - 1]\n const isPreviousSegmentArrayIndex = parentKey ? /^\\d+$/.test(parentKey) : false\n\n if (!isPreviousSegmentArrayIndex) {\n // Check if this is a relationship field\n const isRelationship = fields.some(\n (field) => field.name === parentKey && field.type === 'relationship',\n )\n\n if (isRelationship) {\n // Check if this is a polymorphic relationship field\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic =\n field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n const relationToKey = pathSegments.slice(0, i).concat('relationTo').join('_')\n const relationToValue = data[relationToKey]\n\n const parent = getParentObject(result, pathSegments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n // Both fields must be defined to create/update the relationship\n // If either is undefined, skip the field entirely (preserve existing data)\n if (value !== undefined && relationToValue !== undefined) {\n // Check if both are explicitly null\n if (relationToValue === null && value === null) {\n // Only set to null if explicitly null (user typed \"null\" in CSV)\n parent[parentKey] = null\n } else if (relationToValue || value) {\n // At least one has a value, create the relationship\n parent[parentKey] = {\n relationTo: relationToValue,\n value, // This will be transformed to proper format in postProcess\n }\n }\n // If both are empty strings, don't set the field (handled by not meeting the above conditions)\n }\n // If either is undefined, don't set the field at all (preserve existing data)\n }\n continue\n } else if (!isPolymorphic) {\n const parent = getParentObject(result, pathSegments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n parent[parentKey] = value\n }\n continue\n }\n }\n }\n }\n\n // _relationTo suffix is handled when processing the _id field above\n if (segment === 'relationTo' && i > 0) {\n const parentKey = pathSegments[i - 1]\n if (parentKey && !parentKey.match(/^\\d+$/)) {\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic = field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n // For polymorphic relationships, this is handled when processing the _id field\n // Skip it entirely\n continue\n }\n }\n }\n\n currentObject[segment] = value\n } else if (isArrayIndex && nextSegment !== undefined) {\n if (!currentObject[segment] || !Array.isArray(currentObject[segment])) {\n currentObject[segment] = []\n }\n\n const arrayIndex = parseInt(nextSegment)\n const arr = currentObject[segment] as unknown[]\n\n // Ensure array has sufficient length\n while (arr.length <= arrayIndex) {\n arr.push(null)\n }\n\n // Handle array of objects\n if (arr[arrayIndex] === null || arr[arrayIndex] === undefined) {\n arr[arrayIndex] = {}\n }\n\n // Handle blocks field with block slug pattern (e.g., blocks_0_hero_title)\n const isBlocksField = fields.some((f) => f.name === segment && f.type === 'blocks')\n if (isBlocksField && i + 3 < pathSegments.length) {\n const blockSlug = pathSegments[i + 2]\n const blockFieldName = pathSegments[i + 3]\n\n if (blockSlug && blockFieldName) {\n const blockObject = arr[arrayIndex] as Record<string, unknown>\n blockObject.blockType = blockSlug\n\n if (i + 3 === pathSegments.length - 1) {\n blockObject[blockFieldName] = value\n } else {\n if (!blockObject[blockFieldName] || typeof blockObject[blockFieldName] !== 'object') {\n const segmentAfterBlockField = pathSegments[i + 4]\n const blockFieldIsArray =\n segmentAfterBlockField !== undefined && indexSegment.test(segmentAfterBlockField)\n blockObject[blockFieldName] = blockFieldIsArray ? [] : {}\n }\n currentObject = blockObject[blockFieldName] as Record<string, unknown>\n i = i + 3\n continue\n }\n break\n }\n }\n\n if (i + 2 === pathSegments.length - 1) {\n const lastSegment = pathSegments[pathSegments.length - 1]\n if (lastSegment && arr[arrayIndex] && typeof arr[arrayIndex] === 'object') {\n ;(arr[arrayIndex] as Record<string, unknown>)[lastSegment] = value\n }\n break\n } else if (i + 1 === pathSegments.length - 1) {\n // Direct array value (e.g., tags_0 = \"value\")\n arr[arrayIndex] = value\n break\n } else {\n currentObject = arr[arrayIndex] as Record<string, unknown>\n i++\n }\n } else if (Array.isArray(currentObject) && indexSegment.test(segment)) {\n // currentObject is an array we arrived at via block field traversal — treat the\n // segment as a numeric index rather than a plain property name.\n const idx = parseInt(segment, 10)\n const arr = currentObject as unknown[]\n while (arr.length <= idx) {\n arr.push(null)\n }\n if (arr[idx] === null || arr[idx] === undefined) {\n arr[idx] = {}\n }\n currentObject = arr[idx] as Record<string, unknown>\n } else {\n // Skip if already set to null (polymorphic relationship already processed)\n if (currentObject[segment] === null && isLast && segment === 'relationTo') {\n continue\n }\n\n if (\n !currentObject[segment] ||\n typeof currentObject[segment] !== 'object' ||\n Array.isArray(currentObject[segment])\n ) {\n currentObject[segment] = {}\n }\n\n // Handle polymorphic relationship arrays\n if (segment === 'relationTo' && i > 0 && pathSegments[i - 1]?.match(/^\\d+$/)) {\n currentObject[segment] = value\n } else if (\n typeof currentObject[segment] === 'object' &&\n !Array.isArray(currentObject[segment]) &&\n currentObject[segment] !== null\n ) {\n currentObject = currentObject[segment] as Record<string, unknown>\n }\n }\n }\n }\n\n try {\n // Post-process to handle special structures\n postProcessDocument(result, fields)\n } catch (err) {\n // Log but don't throw - return partially processed result\n\n req.payload.logger.error({\n err,\n msg: '[plugin-import-export] Error in postProcessDocument',\n })\n }\n\n return result\n}\n\nconst getParentObject = (\n obj: Record<string, unknown>,\n segments: string[],\n): Record<string, unknown> | undefined => {\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n const nextSegment = segments[i + 1]\n\n if (!segment) {\n continue\n }\n\n if (nextSegment && /^\\d+$/.test(nextSegment)) {\n const arrayIndex = parseInt(nextSegment)\n const arr = current[segment] as unknown[]\n\n if (Array.isArray(arr) && arr[arrayIndex]) {\n current = arr[arrayIndex] as Record<string, unknown>\n i++ // Skip the index\n } else {\n return undefined\n }\n } else {\n const next = current[segment]\n if (typeof next === 'object' && next !== null && !Array.isArray(next)) {\n current = next as Record<string, unknown>\n } else {\n return undefined\n }\n }\n }\n\n return current\n}\n"],"names":["getBlockFlattenedFields","getNestedFlattenedFields","postProcessDocument","indexSegment","collectArrayLikeNames","fields","into","field","name","type","add","block","blocks","nested","toLogicalKey","flatKey","arrayLikeNames","segments","split","filter","seg","i","test","has","join","unflattenObject","data","format","importFieldHooks","req","result","Set","sortedKeys","Object","keys","sort","a","b","aMatch","match","bMatch","index","undefined","aBase","substring","bBase","parseInt","localeCompare","value","endsWith","baseKey","replace","idKey","isPolymorphic","some","Array","isArray","relationTo","relationToKey","importHookEntry","fn","columnName","siblingData","siblingDoc","error","payload","logger","err","msg","pathSegments","currentObject","length","segment","nextSegment","isLast","isArrayIndex","blockFieldName","isBlockField","parent","getParentObject","slice","blockType","parentKey","isPreviousSegmentArrayIndex","isRelationship","find","f","concat","relationToValue","arrayIndex","arr","push","isBlocksField","blockSlug","blockObject","segmentAfterBlockField","blockFieldIsArray","lastSegment","idx","obj","current","next"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { getImportFieldFunctions } from './getImportFieldFunctions.js';
1
2
  import { unflattenObject } from './unflattenObject.js';
2
3
  import { describe, it, expect, vi } from 'vitest';
3
4
  describe('unflattenObject', ()=>{
@@ -660,6 +661,111 @@ describe('unflattenObject', ()=>{
660
661
  expect(archives[0]['2024']).toBe('transformed-raw');
661
662
  });
662
663
  });
664
+ describe('blocks with nested arrays', ()=>{
665
+ const faqFields = [
666
+ {
667
+ name: 'faqContent',
668
+ type: 'blocks',
669
+ blocks: [
670
+ {
671
+ slug: 'faqSection',
672
+ flattenedFields: [
673
+ {
674
+ name: 'faqs',
675
+ type: 'array',
676
+ flattenedFields: [
677
+ {
678
+ name: 'id',
679
+ type: 'text'
680
+ },
681
+ {
682
+ name: 'question',
683
+ type: 'text'
684
+ },
685
+ {
686
+ name: 'answer',
687
+ type: 'richText'
688
+ }
689
+ ]
690
+ }
691
+ ]
692
+ }
693
+ ]
694
+ }
695
+ ];
696
+ it('should unflatten a nested array inside a block as an array, not an object with numeric keys', ()=>{
697
+ const data = {
698
+ faqContent_0_faqSection_id: '6a1714b81e5f4cdbb51f18b1',
699
+ faqContent_0_faqSection_faqs_0_id: '6a1714c01e5f4cdbb51f18b2',
700
+ faqContent_0_faqSection_faqs_0_question: 'ipsum',
701
+ faqContent_0_faqSection_blockType: 'faqSection'
702
+ };
703
+ const result = unflattenObject({
704
+ data,
705
+ fields: faqFields,
706
+ req: mockReq
707
+ });
708
+ const faqContent = result.faqContent;
709
+ expect(Array.isArray(faqContent)).toBe(true);
710
+ expect(faqContent).toHaveLength(1);
711
+ expect(faqContent[0].blockType).toBe('faqSection');
712
+ const faqs = faqContent[0].faqs;
713
+ expect(Array.isArray(faqs)).toBe(true);
714
+ const faqItems = faqs;
715
+ expect(faqItems[0].question).toBe('ipsum');
716
+ expect(faqItems[0].id).toBe('6a1714c01e5f4cdbb51f18b2');
717
+ });
718
+ it('should parse a richText JSON string inside a nested array within a block', ()=>{
719
+ const richTextValue = {
720
+ root: {
721
+ children: [
722
+ {
723
+ children: [
724
+ {
725
+ detail: 0,
726
+ format: 0,
727
+ mode: 'normal',
728
+ text: 'porksum',
729
+ type: 'text',
730
+ version: 1
731
+ }
732
+ ],
733
+ direction: null,
734
+ format: '',
735
+ indent: 0,
736
+ type: 'paragraph',
737
+ version: 1
738
+ }
739
+ ],
740
+ direction: null,
741
+ format: '',
742
+ indent: 0,
743
+ type: 'root',
744
+ version: 1
745
+ }
746
+ };
747
+ const data = {
748
+ faqContent_0_faqSection_id: '6a1714b81e5f4cdbb51f18b1',
749
+ faqContent_0_faqSection_faqs_0_id: '6a1714c01e5f4cdbb51f18b2',
750
+ faqContent_0_faqSection_faqs_0_question: 'ipsum',
751
+ faqContent_0_faqSection_faqs_0_answer: JSON.stringify(richTextValue),
752
+ faqContent_0_faqSection_blockType: 'faqSection'
753
+ };
754
+ const importFieldHooks = getImportFieldFunctions({
755
+ fields: faqFields
756
+ });
757
+ const result = unflattenObject({
758
+ data,
759
+ fields: faqFields,
760
+ importFieldHooks,
761
+ req: mockReq
762
+ });
763
+ const faqContent = result.faqContent;
764
+ const faqs = faqContent[0].faqs;
765
+ expect(typeof faqs[0].answer).not.toBe('string');
766
+ expect(faqs[0].answer).toEqual(richTextValue);
767
+ });
768
+ });
663
769
  describe('edge cases', ()=>{
664
770
  it('should handle empty data', ()=>{
665
771
  const result = unflattenObject({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/unflattenObject.spec.ts"],"sourcesContent":["import { FlattenedField, PayloadRequest } from 'payload'\n\nimport { unflattenObject } from './unflattenObject.js'\n\nimport { describe, it, expect, vi } from 'vitest'\n\ndescribe('unflattenObject', () => {\n const mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n } as unknown as PayloadRequest\n\n describe('hasMany number fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'hasManyNumber',\n type: 'number',\n hasMany: true,\n } as FlattenedField,\n ]\n\n it('should handle comma-separated number strings', () => {\n const data = {\n hasManyNumber: '1,2,3,5,8',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 2, 3, 5, 8],\n })\n })\n\n it('should handle comma-separated numbers with spaces', () => {\n const data = {\n hasManyNumber: ' 10 , 20 , 30 ',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [10, 20, 30],\n })\n })\n\n it('should filter out empty values in comma-separated strings', () => {\n const data = {\n hasManyNumber: '1,,3,,5',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 3, 5],\n })\n })\n\n it('should handle single number values', () => {\n const data = {\n hasManyNumber: 42,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [42],\n })\n })\n\n it('should handle single string number values', () => {\n const data = {\n hasManyNumber: '42',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [42],\n })\n })\n\n it('should handle indexed array format', () => {\n const data = {\n hasManyNumber_0: 1,\n hasManyNumber_1: 2,\n hasManyNumber_2: 3,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 2, 3],\n })\n })\n\n it('should filter out null and empty values from indexed arrays', () => {\n const data = {\n hasManyNumber_0: 1,\n hasManyNumber_1: null,\n hasManyNumber_2: '',\n hasManyNumber_3: 3,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 3],\n })\n })\n\n it('should handle empty, null, and undefined values', () => {\n // explicit null gets converted to empty array in postProcess for hasMany\n expect(unflattenObject({ data: { hasManyNumber: null }, fields, req: mockReq })).toEqual({\n hasManyNumber: [],\n })\n // undefined is skipped entirely (preserves existing data)\n expect(unflattenObject({ data: { hasManyNumber: undefined }, fields, req: mockReq })).toEqual(\n {},\n )\n })\n })\n\n describe('hasMany relationship fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'hasManyRelationship',\n type: 'relationship',\n hasMany: true,\n relationTo: 'posts',\n } as FlattenedField,\n ]\n\n it('should handle comma-separated ID strings', () => {\n const data = {\n hasManyRelationship: 'id1,id2,id3',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id2', 'id3'],\n })\n })\n\n it('should handle comma-separated IDs with spaces', () => {\n const data = {\n hasManyRelationship: ' id1 , id2 , id3 ',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id2', 'id3'],\n })\n })\n\n it('should filter out empty values in comma-separated IDs', () => {\n const data = {\n hasManyRelationship: 'id1,,id3,,id5',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id3', 'id5'],\n })\n })\n\n it('should handle single ID values', () => {\n const data = {\n hasManyRelationship: 'singleId',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['singleId'],\n })\n })\n\n it('should handle indexed array format', () => {\n const data = {\n hasManyRelationship_0: 'id1',\n hasManyRelationship_1: 'id2',\n hasManyRelationship_2: 'id3',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id2', 'id3'],\n })\n })\n\n it('should handle MongoDB ObjectIDs', () => {\n const data = {\n hasManyRelationship: '507f1f77bcf86cd799439011,507f191e810c19729de860ea',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['507f1f77bcf86cd799439011', '507f191e810c19729de860ea'],\n })\n })\n })\n\n describe('localized fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n } as FlattenedField,\n ]\n\n it('should transform locale-specific keys to nested structure', () => {\n const data = {\n title_en: 'English Title',\n title_es: 'Título en Español',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n title: {\n en: 'English Title',\n es: 'Título en Español',\n },\n })\n })\n\n it('should handle missing locales', () => {\n const data = {\n title_en: 'English Title',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n title: {\n en: 'English Title',\n },\n })\n })\n })\n\n describe('blocks fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'blocks',\n type: 'blocks',\n } as FlattenedField,\n ]\n\n it('should handle block fields with blockType', () => {\n const data = {\n blocks_0_hero_title: 'Hero Title',\n blocks_0_hero_subtitle: 'Hero Subtitle',\n blocks_0_hero_blockType: 'hero',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n blocks: [\n {\n blockType: 'hero',\n title: 'Hero Title',\n subtitle: 'Hero Subtitle',\n },\n ],\n })\n })\n\n it('should handle multiple blocks', () => {\n const data = {\n blocks_0_hero_title: 'Hero Title',\n blocks_0_hero_blockType: 'hero',\n blocks_1_text_content: 'Text Content',\n blocks_1_text_blockType: 'text',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n blocks: [\n {\n blockType: 'hero',\n title: 'Hero Title',\n },\n {\n blockType: 'text',\n content: 'Text Content',\n },\n ],\n })\n })\n })\n\n describe('array fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'items',\n type: 'array',\n } as FlattenedField,\n ]\n\n it('should handle indexed array objects', () => {\n const data = {\n items_0_name: 'Item 1',\n items_0_value: 10,\n items_1_name: 'Item 2',\n items_1_value: 20,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n items: [\n { name: 'Item 1', value: 10 },\n { name: 'Item 2', value: 20 },\n ],\n })\n })\n\n it('should handle sparse arrays', () => {\n const data = {\n items_0_name: 'Item 1',\n items_2_name: 'Item 3',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n items: [{ name: 'Item 1' }, null, { name: 'Item 3' }],\n })\n })\n })\n\n describe('group fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'group',\n type: 'group',\n } as FlattenedField,\n ]\n\n it('should handle nested group fields', () => {\n const data = {\n group_field1: 'Value 1',\n group_field2: 'Value 2',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n group: {\n field1: 'Value 1',\n field2: 'Value 2',\n },\n })\n })\n })\n\n describe('polymorphic relationships', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphic',\n type: 'relationship',\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n it('should handle polymorphic relationship with id and relationTo', () => {\n const data = {\n polymorphic_id: '123',\n polymorphic_relationTo: 'posts',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphic: {\n relationTo: 'posts',\n value: '123',\n },\n })\n })\n\n it('should handle explicitly null polymorphic relationships', () => {\n const data = {\n polymorphic_id: null,\n polymorphic_relationTo: null,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphic: null,\n })\n })\n\n it('should skip polymorphic relationships with undefined values', () => {\n const data = {\n polymorphic_id: undefined,\n polymorphic_relationTo: undefined,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n // Both undefined means field is not set (preserves existing data)\n expect(result).toEqual({})\n })\n\n it('should skip polymorphic relationship with undefined id', () => {\n const data = {\n polymorphic_id: undefined,\n polymorphic_relationTo: 'posts',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n // Undefined ID means don't update this field\n expect(result).toEqual({})\n })\n\n it('should skip polymorphic relationship with undefined relationTo', () => {\n const data = {\n polymorphic_id: '123',\n polymorphic_relationTo: undefined,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n // Undefined relationTo means don't update this field\n expect(result).toEqual({})\n })\n\n it('should handle polymorphic hasMany relationships', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphicMany',\n type: 'relationship',\n hasMany: true,\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n const data = {\n polymorphicMany_0_id: '123',\n polymorphicMany_0_relationTo: 'posts',\n polymorphicMany_1_id: '456',\n polymorphicMany_1_relationTo: 'pages',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphicMany: [\n {\n relationTo: 'posts',\n value: '123',\n },\n {\n relationTo: 'pages',\n value: '456',\n },\n ],\n })\n })\n\n it('should filter out empty polymorphic hasMany items', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphicMany',\n type: 'relationship',\n hasMany: true,\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n const data = {\n polymorphicMany_0_id: '123',\n polymorphicMany_0_relationTo: 'posts',\n polymorphicMany_1_id: null,\n polymorphicMany_1_relationTo: null,\n polymorphicMany_2_id: '456',\n polymorphicMany_2_relationTo: 'pages',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphicMany: [\n {\n relationTo: 'posts',\n value: '123',\n },\n {\n relationTo: 'pages',\n value: '456',\n },\n ],\n })\n })\n\n it('should handle all empty polymorphic hasMany items', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphicMany',\n type: 'relationship',\n hasMany: true,\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n const data = {\n polymorphicMany_0_id: null,\n polymorphicMany_0_relationTo: null,\n polymorphicMany_1_id: '',\n polymorphicMany_1_relationTo: '',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphicMany: [],\n })\n })\n })\n\n describe('field-hook key resolution', () => {\n it('should fire an import hook on a digit-only field name nested inside an array', () => {\n const fields: FlattenedField[] = [\n {\n name: 'archives',\n type: 'array',\n flattenedFields: [{ name: '2024', type: 'text' }],\n } as unknown as FlattenedField,\n ]\n\n const importFieldHooks = {\n archives_2024: {\n type: 'beforeImport' as const,\n fn: ({ value }: { value: unknown }) => `transformed-${value as string}`,\n },\n }\n\n const data = { archives_0_2024: 'raw' }\n\n const result = unflattenObject({\n data,\n fields,\n importFieldHooks,\n req: mockReq,\n })\n\n const archives = result.archives as Array<Record<string, unknown>>\n expect(archives[0]!['2024']).toBe('transformed-raw')\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty data', () => {\n const result = unflattenObject({ data: {}, fields: [], req: mockReq })\n expect(result).toEqual({})\n })\n\n it('should handle null data', () => {\n const result = unflattenObject({ data: null as any, fields: [], req: mockReq })\n expect(result).toEqual({})\n })\n\n it('should handle undefined values', () => {\n const data = {\n field1: undefined,\n field2: 'value',\n }\n\n const result = unflattenObject({ data, fields: [], req: mockReq })\n expect(result).toEqual({ field2: 'value' })\n })\n\n it('should preserve null values for validation', () => {\n const data = {\n field1: null,\n field2: 'value',\n }\n\n const result = unflattenObject({ data, fields: [], req: mockReq })\n // null values are preserved for validation\n expect(result).toEqual({ field1: null, field2: 'value' })\n })\n })\n})\n"],"names":["unflattenObject","describe","it","expect","vi","mockReq","payload","logger","error","fn","fields","name","type","hasMany","data","hasManyNumber","result","req","toEqual","hasManyNumber_0","hasManyNumber_1","hasManyNumber_2","hasManyNumber_3","undefined","relationTo","hasManyRelationship","hasManyRelationship_0","hasManyRelationship_1","hasManyRelationship_2","localized","title_en","title_es","title","en","es","blocks_0_hero_title","blocks_0_hero_subtitle","blocks_0_hero_blockType","blocks","blockType","subtitle","blocks_1_text_content","blocks_1_text_blockType","content","items_0_name","items_0_value","items_1_name","items_1_value","items","value","items_2_name","group_field1","group_field2","group","field1","field2","polymorphic_id","polymorphic_relationTo","polymorphic","polymorphicMany_0_id","polymorphicMany_0_relationTo","polymorphicMany_1_id","polymorphicMany_1_relationTo","polymorphicMany","polymorphicMany_2_id","polymorphicMany_2_relationTo","flattenedFields","importFieldHooks","archives_2024","archives_0_2024","archives","toBe"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/unflattenObject.spec.ts"],"sourcesContent":["import { FlattenedField, PayloadRequest } from 'payload'\n\nimport { getImportFieldFunctions } from './getImportFieldFunctions.js'\nimport { unflattenObject } from './unflattenObject.js'\n\nimport { describe, it, expect, vi } from 'vitest'\n\ndescribe('unflattenObject', () => {\n const mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n } as unknown as PayloadRequest\n\n describe('hasMany number fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'hasManyNumber',\n type: 'number',\n hasMany: true,\n } as FlattenedField,\n ]\n\n it('should handle comma-separated number strings', () => {\n const data = {\n hasManyNumber: '1,2,3,5,8',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 2, 3, 5, 8],\n })\n })\n\n it('should handle comma-separated numbers with spaces', () => {\n const data = {\n hasManyNumber: ' 10 , 20 , 30 ',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [10, 20, 30],\n })\n })\n\n it('should filter out empty values in comma-separated strings', () => {\n const data = {\n hasManyNumber: '1,,3,,5',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 3, 5],\n })\n })\n\n it('should handle single number values', () => {\n const data = {\n hasManyNumber: 42,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [42],\n })\n })\n\n it('should handle single string number values', () => {\n const data = {\n hasManyNumber: '42',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [42],\n })\n })\n\n it('should handle indexed array format', () => {\n const data = {\n hasManyNumber_0: 1,\n hasManyNumber_1: 2,\n hasManyNumber_2: 3,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 2, 3],\n })\n })\n\n it('should filter out null and empty values from indexed arrays', () => {\n const data = {\n hasManyNumber_0: 1,\n hasManyNumber_1: null,\n hasManyNumber_2: '',\n hasManyNumber_3: 3,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyNumber: [1, 3],\n })\n })\n\n it('should handle empty, null, and undefined values', () => {\n // explicit null gets converted to empty array in postProcess for hasMany\n expect(unflattenObject({ data: { hasManyNumber: null }, fields, req: mockReq })).toEqual({\n hasManyNumber: [],\n })\n // undefined is skipped entirely (preserves existing data)\n expect(unflattenObject({ data: { hasManyNumber: undefined }, fields, req: mockReq })).toEqual(\n {},\n )\n })\n })\n\n describe('hasMany relationship fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'hasManyRelationship',\n type: 'relationship',\n hasMany: true,\n relationTo: 'posts',\n } as FlattenedField,\n ]\n\n it('should handle comma-separated ID strings', () => {\n const data = {\n hasManyRelationship: 'id1,id2,id3',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id2', 'id3'],\n })\n })\n\n it('should handle comma-separated IDs with spaces', () => {\n const data = {\n hasManyRelationship: ' id1 , id2 , id3 ',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id2', 'id3'],\n })\n })\n\n it('should filter out empty values in comma-separated IDs', () => {\n const data = {\n hasManyRelationship: 'id1,,id3,,id5',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id3', 'id5'],\n })\n })\n\n it('should handle single ID values', () => {\n const data = {\n hasManyRelationship: 'singleId',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['singleId'],\n })\n })\n\n it('should handle indexed array format', () => {\n const data = {\n hasManyRelationship_0: 'id1',\n hasManyRelationship_1: 'id2',\n hasManyRelationship_2: 'id3',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['id1', 'id2', 'id3'],\n })\n })\n\n it('should handle MongoDB ObjectIDs', () => {\n const data = {\n hasManyRelationship: '507f1f77bcf86cd799439011,507f191e810c19729de860ea',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n hasManyRelationship: ['507f1f77bcf86cd799439011', '507f191e810c19729de860ea'],\n })\n })\n })\n\n describe('localized fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n } as FlattenedField,\n ]\n\n it('should transform locale-specific keys to nested structure', () => {\n const data = {\n title_en: 'English Title',\n title_es: 'Título en Español',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n title: {\n en: 'English Title',\n es: 'Título en Español',\n },\n })\n })\n\n it('should handle missing locales', () => {\n const data = {\n title_en: 'English Title',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n title: {\n en: 'English Title',\n },\n })\n })\n })\n\n describe('blocks fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'blocks',\n type: 'blocks',\n } as FlattenedField,\n ]\n\n it('should handle block fields with blockType', () => {\n const data = {\n blocks_0_hero_title: 'Hero Title',\n blocks_0_hero_subtitle: 'Hero Subtitle',\n blocks_0_hero_blockType: 'hero',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n blocks: [\n {\n blockType: 'hero',\n title: 'Hero Title',\n subtitle: 'Hero Subtitle',\n },\n ],\n })\n })\n\n it('should handle multiple blocks', () => {\n const data = {\n blocks_0_hero_title: 'Hero Title',\n blocks_0_hero_blockType: 'hero',\n blocks_1_text_content: 'Text Content',\n blocks_1_text_blockType: 'text',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n blocks: [\n {\n blockType: 'hero',\n title: 'Hero Title',\n },\n {\n blockType: 'text',\n content: 'Text Content',\n },\n ],\n })\n })\n })\n\n describe('array fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'items',\n type: 'array',\n } as FlattenedField,\n ]\n\n it('should handle indexed array objects', () => {\n const data = {\n items_0_name: 'Item 1',\n items_0_value: 10,\n items_1_name: 'Item 2',\n items_1_value: 20,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n items: [\n { name: 'Item 1', value: 10 },\n { name: 'Item 2', value: 20 },\n ],\n })\n })\n\n it('should handle sparse arrays', () => {\n const data = {\n items_0_name: 'Item 1',\n items_2_name: 'Item 3',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n items: [{ name: 'Item 1' }, null, { name: 'Item 3' }],\n })\n })\n })\n\n describe('group fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'group',\n type: 'group',\n } as FlattenedField,\n ]\n\n it('should handle nested group fields', () => {\n const data = {\n group_field1: 'Value 1',\n group_field2: 'Value 2',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n group: {\n field1: 'Value 1',\n field2: 'Value 2',\n },\n })\n })\n })\n\n describe('polymorphic relationships', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphic',\n type: 'relationship',\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n it('should handle polymorphic relationship with id and relationTo', () => {\n const data = {\n polymorphic_id: '123',\n polymorphic_relationTo: 'posts',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphic: {\n relationTo: 'posts',\n value: '123',\n },\n })\n })\n\n it('should handle explicitly null polymorphic relationships', () => {\n const data = {\n polymorphic_id: null,\n polymorphic_relationTo: null,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphic: null,\n })\n })\n\n it('should skip polymorphic relationships with undefined values', () => {\n const data = {\n polymorphic_id: undefined,\n polymorphic_relationTo: undefined,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n // Both undefined means field is not set (preserves existing data)\n expect(result).toEqual({})\n })\n\n it('should skip polymorphic relationship with undefined id', () => {\n const data = {\n polymorphic_id: undefined,\n polymorphic_relationTo: 'posts',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n // Undefined ID means don't update this field\n expect(result).toEqual({})\n })\n\n it('should skip polymorphic relationship with undefined relationTo', () => {\n const data = {\n polymorphic_id: '123',\n polymorphic_relationTo: undefined,\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n // Undefined relationTo means don't update this field\n expect(result).toEqual({})\n })\n\n it('should handle polymorphic hasMany relationships', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphicMany',\n type: 'relationship',\n hasMany: true,\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n const data = {\n polymorphicMany_0_id: '123',\n polymorphicMany_0_relationTo: 'posts',\n polymorphicMany_1_id: '456',\n polymorphicMany_1_relationTo: 'pages',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphicMany: [\n {\n relationTo: 'posts',\n value: '123',\n },\n {\n relationTo: 'pages',\n value: '456',\n },\n ],\n })\n })\n\n it('should filter out empty polymorphic hasMany items', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphicMany',\n type: 'relationship',\n hasMany: true,\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n const data = {\n polymorphicMany_0_id: '123',\n polymorphicMany_0_relationTo: 'posts',\n polymorphicMany_1_id: null,\n polymorphicMany_1_relationTo: null,\n polymorphicMany_2_id: '456',\n polymorphicMany_2_relationTo: 'pages',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphicMany: [\n {\n relationTo: 'posts',\n value: '123',\n },\n {\n relationTo: 'pages',\n value: '456',\n },\n ],\n })\n })\n\n it('should handle all empty polymorphic hasMany items', () => {\n const fields: FlattenedField[] = [\n {\n name: 'polymorphicMany',\n type: 'relationship',\n hasMany: true,\n relationTo: ['posts', 'pages'],\n } as FlattenedField,\n ]\n\n const data = {\n polymorphicMany_0_id: null,\n polymorphicMany_0_relationTo: null,\n polymorphicMany_1_id: '',\n polymorphicMany_1_relationTo: '',\n }\n\n const result = unflattenObject({ data, fields, req: mockReq })\n\n expect(result).toEqual({\n polymorphicMany: [],\n })\n })\n })\n\n describe('field-hook key resolution', () => {\n it('should fire an import hook on a digit-only field name nested inside an array', () => {\n const fields: FlattenedField[] = [\n {\n name: 'archives',\n type: 'array',\n flattenedFields: [{ name: '2024', type: 'text' }],\n } as unknown as FlattenedField,\n ]\n\n const importFieldHooks = {\n archives_2024: {\n type: 'beforeImport' as const,\n fn: ({ value }: { value: unknown }) => `transformed-${value as string}`,\n },\n }\n\n const data = { archives_0_2024: 'raw' }\n\n const result = unflattenObject({\n data,\n fields,\n importFieldHooks,\n req: mockReq,\n })\n\n const archives = result.archives as Array<Record<string, unknown>>\n expect(archives[0]!['2024']).toBe('transformed-raw')\n })\n })\n\n describe('blocks with nested arrays', () => {\n const faqFields: FlattenedField[] = [\n {\n name: 'faqContent',\n type: 'blocks',\n blocks: [\n {\n slug: 'faqSection',\n flattenedFields: [\n {\n name: 'faqs',\n type: 'array',\n flattenedFields: [\n { name: 'id', type: 'text' },\n { name: 'question', type: 'text' },\n { name: 'answer', type: 'richText' },\n ],\n },\n ],\n },\n ],\n },\n ] as unknown as FlattenedField[]\n\n it('should unflatten a nested array inside a block as an array, not an object with numeric keys', () => {\n const data = {\n faqContent_0_faqSection_id: '6a1714b81e5f4cdbb51f18b1',\n faqContent_0_faqSection_faqs_0_id: '6a1714c01e5f4cdbb51f18b2',\n faqContent_0_faqSection_faqs_0_question: 'ipsum',\n faqContent_0_faqSection_blockType: 'faqSection',\n }\n\n const result = unflattenObject({ data, fields: faqFields, req: mockReq })\n\n const faqContent = result.faqContent as Array<Record<string, unknown>>\n expect(Array.isArray(faqContent)).toBe(true)\n expect(faqContent).toHaveLength(1)\n expect(faqContent[0]!.blockType).toBe('faqSection')\n\n const faqs = faqContent[0]!.faqs\n expect(Array.isArray(faqs)).toBe(true)\n\n const faqItems = faqs as Array<Record<string, unknown>>\n expect(faqItems[0]!.question).toBe('ipsum')\n expect(faqItems[0]!.id).toBe('6a1714c01e5f4cdbb51f18b2')\n })\n\n it('should parse a richText JSON string inside a nested array within a block', () => {\n const richTextValue = {\n root: {\n children: [\n {\n children: [\n { detail: 0, format: 0, mode: 'normal', text: 'porksum', type: 'text', version: 1 },\n ],\n direction: null,\n format: '',\n indent: 0,\n type: 'paragraph',\n version: 1,\n },\n ],\n direction: null,\n format: '',\n indent: 0,\n type: 'root',\n version: 1,\n },\n }\n\n const data = {\n faqContent_0_faqSection_id: '6a1714b81e5f4cdbb51f18b1',\n faqContent_0_faqSection_faqs_0_id: '6a1714c01e5f4cdbb51f18b2',\n faqContent_0_faqSection_faqs_0_question: 'ipsum',\n faqContent_0_faqSection_faqs_0_answer: JSON.stringify(richTextValue),\n faqContent_0_faqSection_blockType: 'faqSection',\n }\n\n const importFieldHooks = getImportFieldFunctions({ fields: faqFields })\n const result = unflattenObject({ data, fields: faqFields, importFieldHooks, req: mockReq })\n\n const faqContent = result.faqContent as Array<Record<string, unknown>>\n const faqs = faqContent[0]!.faqs as Array<Record<string, unknown>>\n\n expect(typeof faqs[0]!.answer).not.toBe('string')\n expect(faqs[0]!.answer).toEqual(richTextValue)\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty data', () => {\n const result = unflattenObject({ data: {}, fields: [], req: mockReq })\n expect(result).toEqual({})\n })\n\n it('should handle null data', () => {\n const result = unflattenObject({ data: null as any, fields: [], req: mockReq })\n expect(result).toEqual({})\n })\n\n it('should handle undefined values', () => {\n const data = {\n field1: undefined,\n field2: 'value',\n }\n\n const result = unflattenObject({ data, fields: [], req: mockReq })\n expect(result).toEqual({ field2: 'value' })\n })\n\n it('should preserve null values for validation', () => {\n const data = {\n field1: null,\n field2: 'value',\n }\n\n const result = unflattenObject({ data, fields: [], req: mockReq })\n // null values are preserved for validation\n expect(result).toEqual({ field1: null, field2: 'value' })\n })\n })\n})\n"],"names":["getImportFieldFunctions","unflattenObject","describe","it","expect","vi","mockReq","payload","logger","error","fn","fields","name","type","hasMany","data","hasManyNumber","result","req","toEqual","hasManyNumber_0","hasManyNumber_1","hasManyNumber_2","hasManyNumber_3","undefined","relationTo","hasManyRelationship","hasManyRelationship_0","hasManyRelationship_1","hasManyRelationship_2","localized","title_en","title_es","title","en","es","blocks_0_hero_title","blocks_0_hero_subtitle","blocks_0_hero_blockType","blocks","blockType","subtitle","blocks_1_text_content","blocks_1_text_blockType","content","items_0_name","items_0_value","items_1_name","items_1_value","items","value","items_2_name","group_field1","group_field2","group","field1","field2","polymorphic_id","polymorphic_relationTo","polymorphic","polymorphicMany_0_id","polymorphicMany_0_relationTo","polymorphicMany_1_id","polymorphicMany_1_relationTo","polymorphicMany","polymorphicMany_2_id","polymorphicMany_2_relationTo","flattenedFields","importFieldHooks","archives_2024","archives_0_2024","archives","toBe","faqFields","slug","faqContent_0_faqSection_id","faqContent_0_faqSection_faqs_0_id","faqContent_0_faqSection_faqs_0_question","faqContent_0_faqSection_blockType","faqContent","Array","isArray","toHaveLength","faqs","faqItems","question","id","richTextValue","root","children","detail","format","mode","text","version","direction","indent","faqContent_0_faqSection_faqs_0_answer","JSON","stringify","answer","not"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"unflattenPostProcess.d.ts","sourceRoot":"","sources":["../../src/utilities/unflattenPostProcess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAuK7C;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UACpB,cAAc,EAAE,KACvB,IAMF,CAAA"}
1
+ {"version":3,"file":"unflattenPostProcess.d.ts","sourceRoot":"","sources":["../../src/utilities/unflattenPostProcess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAuM7C;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAC9B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,QAAQ,cAAc,EAAE,KACvB,IAMF,CAAA"}