@payloadcms/plugin-import-export 4.0.0-internal.38b7f1d → 4.0.0-internal.3aa3d85

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 +9 -9
  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
@@ -1 +1 @@
1
- {"version":3,"file":"getExportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getExportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAyB,MAAM,aAAa,CAAA;AAK9E,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAI7F,CAAA"}
1
+ {"version":3,"file":"getExportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getExportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAyB,MAAM,aAAa,CAAA;AAK9E,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAI7F,CAAA"}
@@ -10,7 +10,6 @@ import { getPolymorphicRelId, isPolymorphicRelValue } from './polymorphicRel.js'
10
10
  };
11
11
  const registerExportHandler = (field, fullKey, result)=>{
12
12
  const beforeExport = field.custom?.['plugin-import-export']?.hooks?.beforeExport;
13
- const toCSV = field.custom?.['plugin-import-export']?.toCSV;
14
13
  if (typeof beforeExport === 'function') {
15
14
  result[fullKey] = {
16
15
  type: 'beforeExport',
@@ -18,13 +17,6 @@ const registerExportHandler = (field, fullKey, result)=>{
18
17
  };
19
18
  return;
20
19
  }
21
- if (typeof toCSV === 'function') {
22
- result[fullKey] = {
23
- type: 'toCSV',
24
- fn: toCSV
25
- };
26
- return;
27
- }
28
20
  const registerHandler = (handler)=>{
29
21
  result[fullKey] = {
30
22
  type: 'beforeExport',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getExportFieldFunctions.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport type { ExportFieldHookEntry, FieldBeforeExportHook } from '../types.js'\n\nimport { registerFieldHooks } from './flattenedFields.js'\nimport { getPolymorphicRelId, isPolymorphicRelValue } from './polymorphicRel.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Builds a map from logical field path (e.g. `content_textBlock_body`) to\n * the export hook entry. Paths include block slugs but never array indices.\n */\nexport const getExportFieldFunctions = ({ fields }: Args): Record<string, ExportFieldHookEntry> => {\n const result: Record<string, ExportFieldHookEntry> = {}\n registerFieldHooks(fields, '', result, registerExportHandler)\n return result\n}\n\nconst registerExportHandler = (\n field: FlattenedField,\n fullKey: string,\n result: Record<string, ExportFieldHookEntry>,\n): void => {\n const beforeExport = field.custom?.['plugin-import-export']?.hooks?.beforeExport\n\n const toCSV = field.custom?.['plugin-import-export']?.toCSV\n\n if (typeof beforeExport === 'function') {\n result[fullKey] = { type: 'beforeExport', fn: beforeExport }\n return\n }\n\n if (typeof toCSV === 'function') {\n result[fullKey] = { type: 'toCSV', fn: toCSV }\n return\n }\n\n const registerHandler = (handler: FieldBeforeExportHook) => {\n result[fullKey] = { type: 'beforeExport', fn: handler }\n }\n\n if (field.type === 'json' || field.type === 'richText') {\n registerHandler(({ format, value }) => {\n if (format === 'json') {\n return value\n }\n if (value === null || value === undefined) {\n return value\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return value\n })\n return\n }\n\n if (field.type === 'date') {\n registerHandler(({ value }) => value)\n return\n }\n\n if (field.type !== 'relationship' && field.type !== 'upload') {\n return\n }\n\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n registerHandler(({ value }) =>\n typeof value === 'object' && value && 'id' in value ? value.id : value,\n )\n return\n }\n\n registerHandler(({ siblingData, value }) => {\n if (isPolymorphicRelValue(value)) {\n const id = getPolymorphicRelId(value)\n if (id !== undefined) {\n siblingData[`${fullKey}_id`] = id\n siblingData[`${fullKey}_relationTo`] = value.relationTo\n }\n }\n return null\n })\n return\n }\n\n if (!Array.isArray(field.relationTo)) {\n registerHandler(({ siblingData, value }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n const id = typeof val === 'object' && val ? (val as { id: unknown }).id : val\n siblingData[`${fullKey}_${i}_id`] = id\n })\n return null\n }\n return undefined\n })\n return\n }\n\n registerHandler(({ siblingData, value }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n if (isPolymorphicRelValue(val)) {\n const id = getPolymorphicRelId(val)\n if (id !== undefined) {\n siblingData[`${fullKey}_${i}_id`] = id\n siblingData[`${fullKey}_${i}_relationTo`] = val.relationTo\n }\n }\n })\n return null\n }\n return undefined\n })\n}\n"],"names":["registerFieldHooks","getPolymorphicRelId","isPolymorphicRelValue","getExportFieldFunctions","fields","result","registerExportHandler","field","fullKey","beforeExport","custom","hooks","toCSV","type","fn","registerHandler","handler","format","value","undefined","JSON","stringify","hasMany","Array","isArray","relationTo","id","siblingData","forEach","val","i"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/getExportFieldFunctions.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport type { ExportFieldHookEntry, FieldBeforeExportHook } from '../types.js'\n\nimport { registerFieldHooks } from './flattenedFields.js'\nimport { getPolymorphicRelId, isPolymorphicRelValue } from './polymorphicRel.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Builds a map from logical field path (e.g. `content_textBlock_body`) to\n * the export hook entry. Paths include block slugs but never array indices.\n */\nexport const getExportFieldFunctions = ({ fields }: Args): Record<string, ExportFieldHookEntry> => {\n const result: Record<string, ExportFieldHookEntry> = {}\n registerFieldHooks(fields, '', result, registerExportHandler)\n return result\n}\n\nconst registerExportHandler = (\n field: FlattenedField,\n fullKey: string,\n result: Record<string, ExportFieldHookEntry>,\n): void => {\n const beforeExport = field.custom?.['plugin-import-export']?.hooks?.beforeExport\n\n if (typeof beforeExport === 'function') {\n result[fullKey] = { type: 'beforeExport', fn: beforeExport }\n return\n }\n\n const registerHandler = (handler: FieldBeforeExportHook) => {\n result[fullKey] = { type: 'beforeExport', fn: handler }\n }\n\n if (field.type === 'json' || field.type === 'richText') {\n registerHandler(({ format, value }) => {\n if (format === 'json') {\n return value\n }\n if (value === null || value === undefined) {\n return value\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return value\n })\n return\n }\n\n if (field.type === 'date') {\n registerHandler(({ value }) => value)\n return\n }\n\n if (field.type !== 'relationship' && field.type !== 'upload') {\n return\n }\n\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n registerHandler(({ value }) =>\n typeof value === 'object' && value && 'id' in value ? value.id : value,\n )\n return\n }\n\n registerHandler(({ siblingData, value }) => {\n if (isPolymorphicRelValue(value)) {\n const id = getPolymorphicRelId(value)\n if (id !== undefined) {\n siblingData[`${fullKey}_id`] = id\n siblingData[`${fullKey}_relationTo`] = value.relationTo\n }\n }\n return null\n })\n return\n }\n\n if (!Array.isArray(field.relationTo)) {\n registerHandler(({ siblingData, value }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n const id = typeof val === 'object' && val ? (val as { id: unknown }).id : val\n siblingData[`${fullKey}_${i}_id`] = id\n })\n return null\n }\n return undefined\n })\n return\n }\n\n registerHandler(({ siblingData, value }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n if (isPolymorphicRelValue(val)) {\n const id = getPolymorphicRelId(val)\n if (id !== undefined) {\n siblingData[`${fullKey}_${i}_id`] = id\n siblingData[`${fullKey}_${i}_relationTo`] = val.relationTo\n }\n }\n })\n return null\n }\n return undefined\n })\n}\n"],"names":["registerFieldHooks","getPolymorphicRelId","isPolymorphicRelValue","getExportFieldFunctions","fields","result","registerExportHandler","field","fullKey","beforeExport","custom","hooks","type","fn","registerHandler","handler","format","value","undefined","JSON","stringify","hasMany","Array","isArray","relationTo","id","siblingData","forEach","val","i"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFileFromDoc.d.ts","sourceRoot":"","sources":["../../src/utilities/getFileFromDoc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAY,cAAc,EAAgB,MAAM,SAAS,CAAA;AAMvF,KAAK,IAAI,GAAG;IACV,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,mCAA0C,IAAI,KAAG,OAAO,CAAC,MAAM,CAkEzF,CAAA"}
1
+ {"version":3,"file":"getFileFromDoc.d.ts","sourceRoot":"","sources":["../../src/utilities/getFileFromDoc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAY,cAAc,EAAgB,MAAM,SAAS,CAAA;AAMvF,KAAK,IAAI,GAAG;IACV,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAU,gCAAgC,IAAI,KAAG,OAAO,CAAC,MAAM,CAkEzF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFlattenedFieldKeys.d.ts","sourceRoot":"","sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,KAAK,uBAAuB,GACxB;IACE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;IACH,IAAI,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC,GACD,cAAc,CAAA;AAElB,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,WACxB,uBAAuB,EAAE,6BAExB,4BAA4B,KACpC,MAAM,EAuGR,CAAA"}
1
+ {"version":3,"file":"getFlattenedFieldKeys.d.ts","sourceRoot":"","sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,KAAK,uBAAuB,GACxB;IACE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;IACH,IAAI,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC,GACD,cAAc,CAAA;AAElB,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,uBAAuB,EAAE,EACjC,eAAW,EACX,UAAS,4BAAiC,KACzC,MAAM,EAuGR,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getImportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getImportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAyB,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAI9E,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAI7F,CAAA"}
1
+ {"version":3,"file":"getImportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getImportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAyB,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAI9E,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAI7F,CAAA"}
@@ -9,7 +9,6 @@ import { registerFieldHooks } from './flattenedFields.js';
9
9
  };
10
10
  const registerImportHandler = (field, fullKey, result)=>{
11
11
  const beforeImport = field.custom?.['plugin-import-export']?.hooks?.beforeImport;
12
- const fromCSV = field.custom?.['plugin-import-export']?.fromCSV;
13
12
  if (typeof beforeImport === 'function') {
14
13
  result[fullKey] = {
15
14
  type: 'beforeImport',
@@ -17,13 +16,6 @@ const registerImportHandler = (field, fullKey, result)=>{
17
16
  };
18
17
  return;
19
18
  }
20
- if (typeof fromCSV === 'function') {
21
- result[fullKey] = {
22
- type: 'fromCSV',
23
- fn: fromCSV
24
- };
25
- return;
26
- }
27
19
  const registerBeforeImport = (fn)=>{
28
20
  result[fullKey] = {
29
21
  type: 'beforeImport',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getImportFieldFunctions.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport type { FieldBeforeImportHook, ImportFieldHookEntry } from '../types.js'\n\nimport { registerFieldHooks } from './flattenedFields.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Builds a map from logical field path (e.g. `content_textBlock_body`) to\n * the import hook entry. Paths include block slugs but never array indices.\n */\nexport const getImportFieldFunctions = ({ fields }: Args): Record<string, ImportFieldHookEntry> => {\n const result: Record<string, ImportFieldHookEntry> = {}\n registerFieldHooks(fields, '', result, registerImportHandler)\n return result\n}\n\nconst registerImportHandler = (\n field: FlattenedField,\n fullKey: string,\n result: Record<string, ImportFieldHookEntry>,\n): void => {\n const beforeImport = field.custom?.['plugin-import-export']?.hooks?.beforeImport\n\n const fromCSV = field.custom?.['plugin-import-export']?.fromCSV\n\n if (typeof beforeImport === 'function') {\n result[fullKey] = { type: 'beforeImport', fn: beforeImport }\n return\n }\n\n if (typeof fromCSV === 'function') {\n result[fullKey] = { type: 'fromCSV', fn: fromCSV }\n return\n }\n\n const registerBeforeImport = (fn: FieldBeforeImportHook) => {\n result[fullKey] = { type: 'beforeImport', fn }\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n registerBeforeImport(({ value }) => value)\n }\n } else if (!Array.isArray(field.relationTo)) {\n registerBeforeImport(({ value }) => value)\n }\n return\n }\n\n if (field.type === 'number') {\n if (field.hasMany) {\n registerBeforeImport(({ value }) => value)\n return\n }\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? undefined : parsed\n }\n return value\n })\n return\n }\n\n if (field.type === 'checkbox') {\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'boolean') {\n return value\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true' || value === '1'\n }\n return Boolean(value)\n })\n return\n }\n\n if (field.type === 'date') {\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\n return value\n }\n try {\n const date = new Date(value as string)\n return isNaN(date.getTime()) ? value : date.toISOString()\n } catch {\n return value\n }\n })\n return\n }\n\n if (field.type === 'json' || field.type === 'richText') {\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'object') {\n return value\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n }\n return value\n })\n }\n}\n\nconst isEmptyImportValue = (value: unknown): boolean =>\n value === '' || value === null || value === undefined\n"],"names":["registerFieldHooks","getImportFieldFunctions","fields","result","registerImportHandler","field","fullKey","beforeImport","custom","hooks","fromCSV","type","fn","registerBeforeImport","hasMany","Array","isArray","relationTo","value","isEmptyImportValue","undefined","parsed","parseFloat","isNaN","toLowerCase","Boolean","Date","parse","date","getTime","toISOString","JSON"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/getImportFieldFunctions.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport type { FieldBeforeImportHook, ImportFieldHookEntry } from '../types.js'\n\nimport { registerFieldHooks } from './flattenedFields.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Builds a map from logical field path (e.g. `content_textBlock_body`) to\n * the import hook entry. Paths include block slugs but never array indices.\n */\nexport const getImportFieldFunctions = ({ fields }: Args): Record<string, ImportFieldHookEntry> => {\n const result: Record<string, ImportFieldHookEntry> = {}\n registerFieldHooks(fields, '', result, registerImportHandler)\n return result\n}\n\nconst registerImportHandler = (\n field: FlattenedField,\n fullKey: string,\n result: Record<string, ImportFieldHookEntry>,\n): void => {\n const beforeImport = field.custom?.['plugin-import-export']?.hooks?.beforeImport\n\n if (typeof beforeImport === 'function') {\n result[fullKey] = { type: 'beforeImport', fn: beforeImport }\n return\n }\n\n const registerBeforeImport = (fn: FieldBeforeImportHook) => {\n result[fullKey] = { type: 'beforeImport', fn }\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n registerBeforeImport(({ value }) => value)\n }\n } else if (!Array.isArray(field.relationTo)) {\n registerBeforeImport(({ value }) => value)\n }\n return\n }\n\n if (field.type === 'number') {\n if (field.hasMany) {\n registerBeforeImport(({ value }) => value)\n return\n }\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? undefined : parsed\n }\n return value\n })\n return\n }\n\n if (field.type === 'checkbox') {\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'boolean') {\n return value\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true' || value === '1'\n }\n return Boolean(value)\n })\n return\n }\n\n if (field.type === 'date') {\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\n return value\n }\n try {\n const date = new Date(value as string)\n return isNaN(date.getTime()) ? value : date.toISOString()\n } catch {\n return value\n }\n })\n return\n }\n\n if (field.type === 'json' || field.type === 'richText') {\n registerBeforeImport(({ value }) => {\n if (isEmptyImportValue(value)) {\n return undefined\n }\n if (typeof value === 'object') {\n return value\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n }\n return value\n })\n }\n}\n\nconst isEmptyImportValue = (value: unknown): boolean =>\n value === '' || value === null || value === undefined\n"],"names":["registerFieldHooks","getImportFieldFunctions","fields","result","registerImportHandler","field","fullKey","beforeImport","custom","hooks","type","fn","registerBeforeImport","hasMany","Array","isArray","relationTo","value","isEmptyImportValue","undefined","parsed","parseFloat","isNaN","toLowerCase","Boolean","Date","parse","date","getTime","toISOString","JSON"],"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,8BAG9B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,OAAO,CAAC,uBAAuB,CAyLlC,CAAA"}
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 toCSV).
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,uFAM1B,oBAAoB,KAAG,MAAM,EAmC/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,kBAAmB,MAAM,EAAE,eAAe,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"}
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 toCSV).
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 toCSV-derived columns (e.g. "user" → "user_id", "user_email")
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":"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"}
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,WAAY,MAAM,EAAE,KAAG,iBAoB5C,CAAA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"isPlainObject.d.ts","sourceRoot":"","sources":["../../src/utilities/isPlainObject.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACR,CAAA"}
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"}
@@ -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,kBAAyB,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA8D7F,CAAA"}
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,kBAAmB,aAAa,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAiB/E,CAAA"}
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"}
@@ -1 +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,MAAO,OAAO,KAAG,CAAC,IAAI,mBACkB,CAAA;AAE1E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,MAAO,mBAAmB,KAAG,MAAM,GAAG,MAAM,GAAG,SAS9E,CAAA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"processRichTextField.d.ts","sourceRoot":"","sources":["../../src/utilities/processRichTextField.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,UAAW,OAAO,KAAG,OA4CrD,CAAA"}
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,OAoDrD,CAAA"}
@@ -2,6 +2,13 @@
2
2
  * Process rich text fields to ensure proper data types for Lexical editor.
3
3
  * Lexical expects certain properties to be numbers, not strings.
4
4
  */ export const processRichTextField = (value)=>{
5
+ if (typeof value === 'string') {
6
+ try {
7
+ value = JSON.parse(value);
8
+ } catch {
9
+ return value;
10
+ }
11
+ }
5
12
  if (!value || typeof value !== 'object') {
6
13
  return value;
7
14
  }
@@ -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: 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
+ {"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 (typeof value === 'string') {\n try {\n value = JSON.parse(value)\n } catch {\n return value\n }\n }\n\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","JSON","parse","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,OAAOA,UAAU,UAAU;QAC7B,IAAI;YACFA,QAAQC,KAAKC,KAAK,CAACF;QACrB,EAAE,OAAM;YACN,OAAOA;QACT;IACF;IAEA,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU;QACvC,OAAOA;IACT;IAEA,+CAA+C;IAC/C,MAAMG,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,YAAYJ;AACrB,EAAC"}
@@ -0,0 +1,308 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { processRichTextField } from './processRichTextField.js';
3
+ // Minimal helpers to keep assertions readable
4
+ const asRecord = (v)=>v;
5
+ const asArray = (v)=>v;
6
+ // ─── Fixtures ────────────────────────────────────────────────────────────────
7
+ const textNode = (overrides = {})=>({
8
+ detail: 0,
9
+ format: 0,
10
+ mode: 'normal',
11
+ text: 'Hello',
12
+ type: 'text',
13
+ version: 1,
14
+ ...overrides
15
+ });
16
+ const paragraphNode = (children = [
17
+ textNode()
18
+ ])=>({
19
+ children,
20
+ direction: 'ltr',
21
+ format: '',
22
+ indent: 0,
23
+ type: 'paragraph',
24
+ version: 1
25
+ });
26
+ const lexicalDoc = (children = [
27
+ paragraphNode()
28
+ ])=>({
29
+ children,
30
+ direction: 'ltr',
31
+ format: '',
32
+ indent: 0,
33
+ type: 'root',
34
+ version: 1
35
+ });
36
+ // ─── Primitive pass-through ──────────────────────────────────────────────────
37
+ describe('processRichTextField — primitive pass-through', ()=>{
38
+ it('should return null unchanged', ()=>{
39
+ expect(processRichTextField(null)).toBeNull();
40
+ });
41
+ it('should return undefined unchanged', ()=>{
42
+ expect(processRichTextField(undefined)).toBeUndefined();
43
+ });
44
+ it('should return a number unchanged', ()=>{
45
+ expect(processRichTextField(42)).toBe(42);
46
+ });
47
+ it('should return false unchanged', ()=>{
48
+ expect(processRichTextField(false)).toBe(false);
49
+ });
50
+ });
51
+ // ─── String input (the recovered-from-missed-hook path) ─────────────────────
52
+ describe('processRichTextField — JSON string input', ()=>{
53
+ it('should parse a valid JSON string into an object', ()=>{
54
+ const doc = lexicalDoc();
55
+ expect(processRichTextField(JSON.stringify(doc))).toEqual(doc);
56
+ });
57
+ it('should return an unparseable string unchanged', ()=>{
58
+ expect(processRichTextField('not json')).toBe('not json');
59
+ });
60
+ it('should return an empty string unchanged', ()=>{
61
+ expect(processRichTextField('')).toBe('');
62
+ });
63
+ it('should parse a string and still convert numeric string properties', ()=>{
64
+ const node = {
65
+ type: 'text',
66
+ detail: '0',
67
+ format: '3',
68
+ indent: '0',
69
+ version: '1',
70
+ text: 'hi'
71
+ };
72
+ const result = asRecord(processRichTextField(JSON.stringify(node)));
73
+ expect(result.detail).toBe(0);
74
+ expect(result.format).toBe(3);
75
+ expect(result.indent).toBe(0);
76
+ expect(result.version).toBe(1);
77
+ });
78
+ });
79
+ // ─── Numeric property coercion ───────────────────────────────────────────────
80
+ describe('processRichTextField — numeric property coercion', ()=>{
81
+ it('should convert detail, format, indent, version from strings to numbers', ()=>{
82
+ const input = textNode({
83
+ detail: '0',
84
+ format: '0',
85
+ indent: '0',
86
+ version: '1'
87
+ });
88
+ const result = asRecord(processRichTextField(input));
89
+ expect(result.detail).toBe(0);
90
+ expect(result.format).toBe(0);
91
+ expect(result.indent).toBe(0);
92
+ expect(result.version).toBe(1);
93
+ });
94
+ it('should convert start and value from strings to numbers (list/listitem nodes)', ()=>{
95
+ const listItemNode = {
96
+ type: 'listitem',
97
+ start: '1',
98
+ value: '2',
99
+ version: '1'
100
+ };
101
+ const result = asRecord(processRichTextField(listItemNode));
102
+ expect(result.start).toBe(1);
103
+ expect(result.value).toBe(2);
104
+ });
105
+ it('should convert textFormat and textStyle from strings to numbers', ()=>{
106
+ const input = {
107
+ type: 'text',
108
+ textFormat: '4',
109
+ textStyle: '0',
110
+ version: '1',
111
+ text: 'x'
112
+ };
113
+ const result = asRecord(processRichTextField(input));
114
+ expect(result.textFormat).toBe(4);
115
+ expect(result.textStyle).toBe(0);
116
+ });
117
+ it('should leave a non-numeric string in a numeric-property slot unchanged', ()=>{
118
+ // Lexical paragraph format can be "" (empty) or alignment strings
119
+ const input = paragraphNode();
120
+ const result = asRecord(processRichTextField(input));
121
+ expect(result.format).toBe('');
122
+ });
123
+ it('should leave already-numeric values unchanged', ()=>{
124
+ const input = textNode({
125
+ detail: 0,
126
+ format: 3,
127
+ version: 1
128
+ });
129
+ const result = asRecord(processRichTextField(input));
130
+ expect(result.detail).toBe(0);
131
+ expect(result.format).toBe(3);
132
+ expect(result.version).toBe(1);
133
+ });
134
+ it('should not convert boolean values on numeric-property keys', ()=>{
135
+ const input = {
136
+ type: 'custom',
137
+ format: true,
138
+ version: '1'
139
+ };
140
+ const result = asRecord(processRichTextField(input));
141
+ expect(result.format).toBe(true);
142
+ expect(result.version).toBe(1);
143
+ });
144
+ });
145
+ // ─── Recursive children processing ──────────────────────────────────────────
146
+ describe('processRichTextField — recursive children', ()=>{
147
+ it('should recursively convert numeric strings inside children arrays', ()=>{
148
+ const input = paragraphNode([
149
+ textNode({
150
+ detail: '0',
151
+ format: '0',
152
+ version: '1'
153
+ })
154
+ ]);
155
+ const result = asRecord(processRichTextField(input));
156
+ const child = asRecord(asArray(result.children)[0]);
157
+ expect(child.detail).toBe(0);
158
+ expect(child.format).toBe(0);
159
+ expect(child.version).toBe(1);
160
+ });
161
+ it('should handle three levels of nesting (root → paragraph → text)', ()=>{
162
+ const input = lexicalDoc([
163
+ paragraphNode([
164
+ textNode({
165
+ version: '1',
166
+ format: '2'
167
+ })
168
+ ])
169
+ ]);
170
+ const result = asRecord(processRichTextField(input));
171
+ const paragraph = asRecord(asArray(result.children)[0]);
172
+ const text = asRecord(asArray(paragraph.children)[0]);
173
+ expect(text.version).toBe(1);
174
+ expect(text.format).toBe(2);
175
+ });
176
+ it('should handle multiple children at the same level', ()=>{
177
+ const input = lexicalDoc([
178
+ paragraphNode([
179
+ textNode({
180
+ text: 'Bold',
181
+ format: '1'
182
+ }),
183
+ textNode({
184
+ text: ' normal',
185
+ format: '0'
186
+ })
187
+ ]),
188
+ paragraphNode([
189
+ textNode({
190
+ text: 'Second para',
191
+ version: '1'
192
+ })
193
+ ])
194
+ ]);
195
+ const result = asRecord(processRichTextField(input));
196
+ const firstPara = asRecord(asArray(result.children)[0]);
197
+ const secondPara = asRecord(asArray(result.children)[1]);
198
+ const bold = asRecord(asArray(firstPara.children)[0]);
199
+ const normal = asRecord(asArray(firstPara.children)[1]);
200
+ const secondText = asRecord(asArray(secondPara.children)[0]);
201
+ expect(bold.format).toBe(1);
202
+ expect(normal.format).toBe(0);
203
+ expect(secondText.version).toBe(1);
204
+ });
205
+ it('should skip null and non-object entries in children without throwing', ()=>{
206
+ const input = {
207
+ type: 'root',
208
+ version: 1,
209
+ children: [
210
+ null,
211
+ undefined,
212
+ 'stray',
213
+ textNode()
214
+ ]
215
+ };
216
+ const result = asRecord(processRichTextField(input));
217
+ const children = asArray(result.children);
218
+ expect(children[0]).toBeNull();
219
+ expect(children[1]).toBeUndefined();
220
+ expect(children[2]).toBe('stray');
221
+ expect(asRecord(children[3]).type).toBe('text');
222
+ });
223
+ });
224
+ // ─── Nested non-children objects ─────────────────────────────────────────────
225
+ describe('processRichTextField — nested non-children objects', ()=>{
226
+ it('should recurse into plain nested objects (e.g. decorator node data)', ()=>{
227
+ const input = {
228
+ type: 'decorator',
229
+ version: '1',
230
+ data: {
231
+ detail: '2',
232
+ label: 'keep me'
233
+ }
234
+ };
235
+ const result = asRecord(processRichTextField(input));
236
+ const data = asRecord(result.data);
237
+ expect(result.version).toBe(1);
238
+ expect(data.detail).toBe(2);
239
+ expect(data.label).toBe('keep me');
240
+ });
241
+ });
242
+ // ─── Full Lexical document round-trips ───────────────────────────────────────
243
+ describe('processRichTextField — full document', ()=>{
244
+ it('should produce a stable result when called on an already-processed object', ()=>{
245
+ const doc = lexicalDoc();
246
+ const firstPass = processRichTextField(doc);
247
+ const secondPass = processRichTextField(firstPass);
248
+ expect(secondPass).toEqual(firstPass);
249
+ });
250
+ it('should fully round-trip a complex Lexical document serialised to JSON', ()=>{
251
+ const doc = lexicalDoc([
252
+ paragraphNode([
253
+ textNode({
254
+ text: 'Bold',
255
+ format: '1',
256
+ detail: '0',
257
+ indent: '0',
258
+ version: '1'
259
+ }),
260
+ textNode({
261
+ text: ' normal',
262
+ format: '0',
263
+ version: '1'
264
+ })
265
+ ]),
266
+ {
267
+ type: 'list',
268
+ listType: 'number',
269
+ start: '1',
270
+ version: '1',
271
+ indent: '0',
272
+ direction: 'ltr',
273
+ children: [
274
+ {
275
+ type: 'listitem',
276
+ value: '1',
277
+ detail: '0',
278
+ format: '0',
279
+ version: '1',
280
+ text: 'Item A'
281
+ },
282
+ {
283
+ type: 'listitem',
284
+ value: '2',
285
+ detail: '0',
286
+ format: '0',
287
+ version: '1',
288
+ text: 'Item B'
289
+ }
290
+ ]
291
+ }
292
+ ]);
293
+ const result = asRecord(processRichTextField(JSON.stringify(doc)));
294
+ const para = asRecord(asArray(result.children)[0]);
295
+ const boldText = asRecord(asArray(para.children)[0]);
296
+ expect(boldText.format).toBe(1);
297
+ expect(boldText.detail).toBe(0);
298
+ const list = asRecord(asArray(result.children)[1]);
299
+ expect(list.start).toBe(1);
300
+ expect(list.indent).toBe(0);
301
+ const itemA = asRecord(asArray(list.children)[0]);
302
+ const itemB = asRecord(asArray(list.children)[1]);
303
+ expect(itemA.value).toBe(1);
304
+ expect(itemB.value).toBe(2);
305
+ });
306
+ });
307
+
308
+ //# sourceMappingURL=processRichTextField.spec.js.map