@payloadcms/plugin-import-export 3.71.0-internal.e36f916 → 3.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js +8 -3
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/ExportListMenuItem/index.d.ts +0 -1
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +0 -1
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.d.ts +4 -0
- package/dist/components/ExportPreview/index.d.ts.map +1 -0
- package/dist/components/ExportPreview/index.js +252 -0
- package/dist/components/ExportPreview/index.js.map +1 -0
- package/dist/components/ExportPreview/index.scss +36 -0
- package/dist/components/ImportCollectionField/index.d.ts +3 -0
- package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
- package/dist/components/ImportCollectionField/index.js +17 -0
- package/dist/components/ImportCollectionField/index.js.map +1 -0
- package/dist/components/ImportListMenuItem/index.d.ts +6 -0
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
- package/dist/components/ImportListMenuItem/index.js +48 -0
- package/dist/components/ImportListMenuItem/index.js.map +1 -0
- package/dist/components/ImportPreview/index.d.ts +4 -0
- package/dist/components/ImportPreview/index.d.ts.map +1 -0
- package/dist/components/ImportPreview/index.js +624 -0
- package/dist/components/ImportPreview/index.js.map +1 -0
- package/dist/components/ImportPreview/index.scss +41 -0
- package/dist/components/ImportSaveButton/index.d.ts +2 -0
- package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
- package/dist/components/ImportSaveButton/index.js +18 -0
- package/dist/components/ImportSaveButton/index.js.map +1 -0
- package/dist/components/Page/index.scss +4 -2
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/export/batchProcessor.d.ts +107 -0
- package/dist/export/batchProcessor.d.ts.map +1 -0
- package/dist/export/batchProcessor.js +187 -0
- package/dist/export/batchProcessor.js.map +1 -0
- package/dist/export/createExport.d.ts +9 -4
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +163 -111
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts +1 -2
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +10 -18
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts +8 -0
- package/dist/export/getExportCollection.d.ts.map +1 -0
- package/dist/export/getExportCollection.js +100 -0
- package/dist/export/getExportCollection.js.map +1 -0
- package/dist/export/getFields.d.ts +8 -2
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +7 -9
- package/dist/export/getFields.js.map +1 -1
- package/dist/export/handleDownload.d.ts +3 -0
- package/dist/export/handleDownload.d.ts.map +1 -0
- package/dist/export/handleDownload.js +42 -0
- package/dist/export/handleDownload.js.map +1 -0
- package/dist/export/handlePreview.d.ts +3 -0
- package/dist/export/handlePreview.d.ts.map +1 -0
- package/dist/export/handlePreview.js +163 -0
- package/dist/export/handlePreview.js.map +1 -0
- package/dist/exports/rsc.d.ts +5 -1
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +5 -1
- package/dist/exports/rsc.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +46 -0
- package/dist/import/batchProcessor.d.ts.map +1 -0
- package/dist/import/batchProcessor.js +529 -0
- package/dist/import/batchProcessor.js.map +1 -0
- package/dist/import/createImport.d.ts +45 -0
- package/dist/import/createImport.d.ts.map +1 -0
- package/dist/import/createImport.js +175 -0
- package/dist/import/createImport.js.map +1 -0
- package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
- package/dist/import/getCreateImportCollectionTask.js +81 -0
- package/dist/import/getCreateImportCollectionTask.js.map +1 -0
- package/dist/import/getFields.d.ts +7 -0
- package/dist/import/getFields.d.ts.map +1 -0
- package/dist/import/getFields.js +150 -0
- package/dist/import/getFields.js.map +1 -0
- package/dist/import/getImportCollection.d.ts +8 -0
- package/dist/import/getImportCollection.d.ts.map +1 -0
- package/dist/import/getImportCollection.js +258 -0
- package/dist/import/getImportCollection.js.map +1 -0
- package/dist/import/handlePreview.d.ts +3 -0
- package/dist/import/handlePreview.d.ts.map +1 -0
- package/dist/import/handlePreview.js +94 -0
- package/dist/import/handlePreview.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -110
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +21 -1
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +21 -1
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +21 -1
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/bnBd.d.ts +4 -0
- package/dist/translations/languages/bnBd.d.ts.map +1 -0
- package/dist/translations/languages/bnBd.js +48 -0
- package/dist/translations/languages/bnBd.js.map +1 -0
- package/dist/translations/languages/bnIn.d.ts +4 -0
- package/dist/translations/languages/bnIn.d.ts.map +1 -0
- package/dist/translations/languages/bnIn.js +48 -0
- package/dist/translations/languages/bnIn.js.map +1 -0
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +21 -1
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +21 -1
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +21 -1
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +21 -1
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +20 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +21 -1
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +21 -1
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +21 -1
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +21 -1
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +21 -1
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +21 -1
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +21 -1
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +21 -1
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +21 -1
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/id.d.ts +4 -0
- package/dist/translations/languages/id.d.ts.map +1 -0
- package/dist/translations/languages/id.js +48 -0
- package/dist/translations/languages/id.js.map +1 -0
- package/dist/translations/languages/is.d.ts.map +1 -1
- package/dist/translations/languages/is.js +21 -1
- package/dist/translations/languages/is.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +21 -1
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +21 -1
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +21 -1
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +21 -1
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +26 -6
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +21 -1
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +21 -1
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +21 -1
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +21 -1
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +21 -1
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +21 -1
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +21 -1
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +21 -1
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +21 -1
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +21 -1
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +21 -1
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +21 -1
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/ta.d.ts.map +1 -1
- package/dist/translations/languages/ta.js +21 -1
- package/dist/translations/languages/ta.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +21 -1
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +21 -1
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +21 -1
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +21 -1
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +21 -1
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +21 -1
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/translations/types.d.ts +13 -0
- package/dist/translations/types.d.ts.map +1 -1
- package/dist/translations/types.js.map +1 -1
- package/dist/types.d.ts +166 -22
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/flattenObject.d.ts +11 -0
- package/dist/utilities/flattenObject.d.ts.map +1 -0
- package/dist/utilities/flattenObject.js +129 -0
- package/dist/utilities/flattenObject.js.map +1 -0
- package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getExportFieldFunctions.js +102 -0
- package/dist/utilities/getExportFieldFunctions.js.map +1 -0
- package/dist/utilities/getFilename.d.ts +6 -0
- package/dist/utilities/getFilename.d.ts.map +1 -0
- package/dist/utilities/getFilename.js +13 -0
- package/dist/utilities/getFilename.js.map +1 -0
- package/dist/utilities/getFlattenedFieldKeys.d.ts +12 -1
- package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.js +35 -10
- package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getImportFieldFunctions.js +130 -0
- package/dist/utilities/getImportFieldFunctions.js.map +1 -0
- package/dist/utilities/getPluginCollections.d.ts +39 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -0
- package/dist/utilities/getPluginCollections.js +102 -0
- package/dist/utilities/getPluginCollections.js.map +1 -0
- package/dist/utilities/getSchemaColumns.d.ts +43 -0
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
- package/dist/utilities/getSchemaColumns.js +163 -0
- package/dist/utilities/getSchemaColumns.js.map +1 -0
- package/dist/utilities/getSelect.d.ts +11 -0
- package/dist/utilities/getSelect.d.ts.map +1 -0
- package/dist/utilities/getSelect.js +27 -0
- package/dist/utilities/getSelect.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts +11 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -0
- package/dist/utilities/parseCSV.js +67 -0
- package/dist/utilities/parseCSV.js.map +1 -0
- package/dist/utilities/parseCSV.spec.js +169 -0
- package/dist/utilities/parseCSV.spec.js.map +1 -0
- package/dist/utilities/parseJSON.d.ts +11 -0
- package/dist/utilities/parseJSON.d.ts.map +1 -0
- package/dist/utilities/parseJSON.js +25 -0
- package/dist/utilities/parseJSON.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts +6 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -0
- package/dist/utilities/processRichTextField.js +45 -0
- package/dist/utilities/processRichTextField.js.map +1 -0
- package/dist/utilities/unflattenObject.d.ts +11 -0
- package/dist/utilities/unflattenObject.d.ts.map +1 -0
- package/dist/utilities/unflattenObject.js +431 -0
- package/dist/utilities/unflattenObject.js.map +1 -0
- package/dist/utilities/unflattenObject.spec.js +680 -0
- package/dist/utilities/unflattenObject.spec.js.map +1 -0
- package/dist/utilities/useBatchProcessor.d.ts +103 -0
- package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
- package/dist/utilities/useBatchProcessor.js +88 -0
- package/dist/utilities/useBatchProcessor.js.map +1 -0
- package/dist/utilities/validateLimitValue.d.ts +1 -1
- package/dist/utilities/validateLimitValue.d.ts.map +1 -1
- package/dist/utilities/validateLimitValue.js +1 -4
- package/dist/utilities/validateLimitValue.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getImportFieldFunctions.ts"],"sourcesContent":["import { type FlattenedField, traverseFields, type TraverseFieldsCallback } from 'payload'\n\nimport type { FromCSVFunction } from '../types.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Gets custom fromCSV field functions for import.\n * These functions transform field values when unflattening CSV data for import.\n */\nexport const getImportFieldFunctions = ({ fields }: Args): Record<string, FromCSVFunction> => {\n const result: Record<string, FromCSVFunction> = {}\n\n const buildCustomFunctions: TraverseFieldsCallback = ({ field, parentRef, ref }) => {\n // @ts-expect-error ref is untyped\n ref.prefix = parentRef.prefix || ''\n if (field.type === 'group' || field.type === 'tab') {\n // @ts-expect-error ref is untyped\n const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : ''\n // @ts-expect-error ref is untyped\n ref.prefix = `${parentPrefix}${field.name}_`\n }\n\n if (typeof field.custom?.['plugin-import-export']?.fromCSV === 'function') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.fromCSV\n } else if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic single relationship - simple ID to value conversion\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n // If it's already an object (from JSON import), return as-is\n if (typeof value === 'object' && value !== null) {\n return value\n }\n // Convert string/number ID to relationship value\n return value\n }\n } else {\n // polymorphic single relationship - needs special handling\n // The CSV has field_id and field_relationTo columns\n // We need to combine them back into { relationTo, value } format\n // This is handled in unflattenObject, so we don't need a fromCSV here\n }\n } else {\n if (!Array.isArray(field.relationTo)) {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n // If it's already an array (from JSON import), return as-is\n if (Array.isArray(value)) {\n return value\n }\n // For CSV, this is handled by array unflattening in unflattenObject\n return value\n }\n } else {\n // polymorphic many relationships\n // Similar to polymorphic single, handled in unflattenObject\n }\n }\n } else if (field.type === 'number') {\n // For hasMany number fields, preserve comma-separated strings for later processing\n if (field.hasMany) {\n // Don't convert - let unflattenObject handle comma-separated values\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => value\n } else {\n // Ensure single numbers are parsed correctly from CSV strings\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? 0 : parsed\n }\n return value\n }\n }\n } else if (field.type === 'checkbox') {\n // Convert string boolean values to actual booleans\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\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 } else if (field.type === 'date') {\n // Ensure dates are in proper format\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (!value) {\n return value\n }\n // If it's already a valid date string, return as-is\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\n return value\n }\n // Try to parse and format\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 } else if (field.type === 'json' || field.type === 'richText') {\n // Parse JSON strings back to objects (both json and richText fields)\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\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\n traverseFields({ callback: buildCustomFunctions, fields })\n\n return result\n}\n"],"names":["traverseFields","getImportFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","fromCSV","hasMany","Array","isArray","relationTo","value","parsed","parseFloat","isNaN","toLowerCase","Boolean","Date","parse","date","getTime","toISOString","JSON","callback"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { CollectionConfig, Config } from 'payload';
|
|
2
|
+
import type { ImportExportPluginConfig } from '../types.js';
|
|
3
|
+
export type PluginCollectionsResult = {
|
|
4
|
+
/**
|
|
5
|
+
* Map from target collection slug to the export collection slug to use for it.
|
|
6
|
+
* Only contains entries for collections with custom export collection overrides.
|
|
7
|
+
*/
|
|
8
|
+
customExportSlugMap: Map<string, string>;
|
|
9
|
+
/**
|
|
10
|
+
* Map from target collection slug to the import collection slug to use for it.
|
|
11
|
+
* Only contains entries for collections with custom import collection overrides.
|
|
12
|
+
*/
|
|
13
|
+
customImportSlugMap: Map<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* All export collections (base + any per-collection overrides)
|
|
16
|
+
*/
|
|
17
|
+
exportCollections: CollectionConfig[];
|
|
18
|
+
/**
|
|
19
|
+
* All import collections (base + any per-collection overrides)
|
|
20
|
+
*/
|
|
21
|
+
importCollections: CollectionConfig[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Processes the plugin config and returns export/import collections.
|
|
25
|
+
*
|
|
26
|
+
* - Creates the base export and import collections
|
|
27
|
+
* - Applies top-level overrideExportCollection/overrideImportCollection if provided
|
|
28
|
+
* - For each collection in `pluginConfig.collections` that has a function override
|
|
29
|
+
* for `export` or `import`, applies the override to create customized collections
|
|
30
|
+
*
|
|
31
|
+
* @param config - The Payload config
|
|
32
|
+
* @param pluginConfig - The import/export plugin config
|
|
33
|
+
* @returns Object containing arrays of export and import collections
|
|
34
|
+
*/
|
|
35
|
+
export declare const getPluginCollections: ({ config, pluginConfig, }: {
|
|
36
|
+
config: Config;
|
|
37
|
+
pluginConfig: ImportExportPluginConfig;
|
|
38
|
+
}) => Promise<PluginCollectionsResult>;
|
|
39
|
+
//# sourceMappingURL=getPluginCollections.d.ts.map
|
|
@@ -0,0 +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,EAA8B,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAKvF,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;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,8BAG9B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,OAAO,CAAC,uBAAuB,CA0GlC,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getExportCollection } from '../export/getExportCollection.js';
|
|
2
|
+
import { getImportCollection } from '../import/getImportCollection.js';
|
|
3
|
+
/**
|
|
4
|
+
* Processes the plugin config and returns export/import collections.
|
|
5
|
+
*
|
|
6
|
+
* - Creates the base export and import collections
|
|
7
|
+
* - Applies top-level overrideExportCollection/overrideImportCollection if provided
|
|
8
|
+
* - For each collection in `pluginConfig.collections` that has a function override
|
|
9
|
+
* for `export` or `import`, applies the override to create customized collections
|
|
10
|
+
*
|
|
11
|
+
* @param config - The Payload config
|
|
12
|
+
* @param pluginConfig - The import/export plugin config
|
|
13
|
+
* @returns Object containing arrays of export and import collections
|
|
14
|
+
*/ export const getPluginCollections = async ({ config, pluginConfig })=>{
|
|
15
|
+
// Get the base export and import collections with default configs (no per-collection settings)
|
|
16
|
+
let baseExportCollection = getExportCollection({
|
|
17
|
+
config,
|
|
18
|
+
pluginConfig
|
|
19
|
+
});
|
|
20
|
+
let baseImportCollection = getImportCollection({
|
|
21
|
+
config,
|
|
22
|
+
pluginConfig
|
|
23
|
+
});
|
|
24
|
+
// Apply top-level collection overrides if provided
|
|
25
|
+
if (pluginConfig.overrideExportCollection && typeof pluginConfig.overrideExportCollection === 'function') {
|
|
26
|
+
baseExportCollection = await pluginConfig.overrideExportCollection({
|
|
27
|
+
collection: baseExportCollection
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (pluginConfig.overrideImportCollection && typeof pluginConfig.overrideImportCollection === 'function') {
|
|
31
|
+
baseImportCollection = await pluginConfig.overrideImportCollection({
|
|
32
|
+
collection: baseImportCollection
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const exportCollections = [];
|
|
36
|
+
const importCollections = [];
|
|
37
|
+
// Maps from target collection slug to the export/import collection slug to use
|
|
38
|
+
const customExportSlugMap = new Map();
|
|
39
|
+
const customImportSlugMap = new Map();
|
|
40
|
+
// Process each collection config for custom collection overrides
|
|
41
|
+
if (pluginConfig.collections && pluginConfig.collections.length > 0) {
|
|
42
|
+
for (const collectionConfig of pluginConfig.collections){
|
|
43
|
+
// Handle export config - only process if overrideCollection is provided
|
|
44
|
+
// Settings like disableJobsQueue require a custom slug to work properly
|
|
45
|
+
const exportConfig = typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined;
|
|
46
|
+
if (exportConfig?.overrideCollection) {
|
|
47
|
+
// Generate a collection with this export config's settings (like disableJobsQueue)
|
|
48
|
+
const collectionWithSettings = getExportCollection({
|
|
49
|
+
config,
|
|
50
|
+
exportConfig,
|
|
51
|
+
pluginConfig
|
|
52
|
+
});
|
|
53
|
+
const customExport = await exportConfig.overrideCollection({
|
|
54
|
+
collection: collectionWithSettings
|
|
55
|
+
});
|
|
56
|
+
// If the slug changed, this is a separate collection; otherwise it modifies the base
|
|
57
|
+
if (customExport.slug !== baseExportCollection.slug) {
|
|
58
|
+
exportCollections.push(customExport);
|
|
59
|
+
// Map this target collection to its custom export collection
|
|
60
|
+
customExportSlugMap.set(collectionConfig.slug, customExport.slug);
|
|
61
|
+
} else {
|
|
62
|
+
// Full override - replace the base
|
|
63
|
+
baseExportCollection = customExport;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Handle import config - only process if overrideCollection is provided
|
|
67
|
+
// Settings like disableJobsQueue require a custom slug to work properly
|
|
68
|
+
const importConf = typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined;
|
|
69
|
+
if (importConf?.overrideCollection) {
|
|
70
|
+
// Generate a collection with this import config's settings (like disableJobsQueue)
|
|
71
|
+
const collectionWithSettings = getImportCollection({
|
|
72
|
+
config,
|
|
73
|
+
importConfig: importConf,
|
|
74
|
+
pluginConfig
|
|
75
|
+
});
|
|
76
|
+
const customImport = await importConf.overrideCollection({
|
|
77
|
+
collection: collectionWithSettings
|
|
78
|
+
});
|
|
79
|
+
// If the slug changed, this is a separate collection; otherwise it modifies the base
|
|
80
|
+
if (customImport.slug !== baseImportCollection.slug) {
|
|
81
|
+
importCollections.push(customImport);
|
|
82
|
+
// Map this target collection to its custom import collection
|
|
83
|
+
customImportSlugMap.set(collectionConfig.slug, customImport.slug);
|
|
84
|
+
} else {
|
|
85
|
+
// Full override - replace the base
|
|
86
|
+
baseImportCollection = customImport;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Add base collections to the front of the arrays
|
|
92
|
+
exportCollections.unshift(baseExportCollection);
|
|
93
|
+
importCollections.unshift(baseImportCollection);
|
|
94
|
+
return {
|
|
95
|
+
customExportSlugMap,
|
|
96
|
+
customImportSlugMap,
|
|
97
|
+
exportCollections,
|
|
98
|
+
importCollections
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=getPluginCollections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getPluginCollections.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { ExportConfig, ImportConfig, ImportExportPluginConfig } from '../types.js'\n\nimport { getExportCollection } from '../export/getExportCollection.js'\nimport { getImportCollection } from '../import/getImportCollection.js'\n\nexport type PluginCollectionsResult = {\n /**\n * Map from target collection slug to the export collection slug to use for it.\n * Only contains entries for collections with custom export collection overrides.\n */\n customExportSlugMap: Map<string, string>\n /**\n * Map from target collection slug to the import collection slug to use for it.\n * Only contains entries for collections with custom import collection overrides.\n */\n customImportSlugMap: Map<string, string>\n /**\n * All export collections (base + any per-collection overrides)\n */\n exportCollections: CollectionConfig[]\n /**\n * All import collections (base + any per-collection overrides)\n */\n importCollections: CollectionConfig[]\n}\n\n/**\n * Processes the plugin config and returns export/import collections.\n *\n * - Creates the base export and import collections\n * - Applies top-level overrideExportCollection/overrideImportCollection if provided\n * - For each collection in `pluginConfig.collections` that has a function override\n * for `export` or `import`, applies the override to create customized collections\n *\n * @param config - The Payload config\n * @param pluginConfig - The import/export plugin config\n * @returns Object containing arrays of export and import collections\n */\nexport const getPluginCollections = async ({\n config,\n pluginConfig,\n}: {\n config: Config\n pluginConfig: ImportExportPluginConfig\n}): Promise<PluginCollectionsResult> => {\n // Get the base export and import collections with default configs (no per-collection settings)\n let baseExportCollection = getExportCollection({\n config,\n pluginConfig,\n })\n let baseImportCollection = getImportCollection({\n config,\n pluginConfig,\n })\n\n // Apply top-level collection overrides if provided\n if (\n pluginConfig.overrideExportCollection &&\n typeof pluginConfig.overrideExportCollection === 'function'\n ) {\n baseExportCollection = await pluginConfig.overrideExportCollection({\n collection: baseExportCollection,\n })\n }\n\n if (\n pluginConfig.overrideImportCollection &&\n typeof pluginConfig.overrideImportCollection === 'function'\n ) {\n baseImportCollection = await pluginConfig.overrideImportCollection({\n collection: baseImportCollection,\n })\n }\n\n const exportCollections: CollectionConfig[] = []\n const importCollections: CollectionConfig[] = []\n\n // Maps from target collection slug to the export/import collection slug to use\n const customExportSlugMap = new Map<string, string>()\n const customImportSlugMap = new Map<string, string>()\n\n // Process each collection config for custom collection overrides\n if (pluginConfig.collections && pluginConfig.collections.length > 0) {\n for (const collectionConfig of pluginConfig.collections) {\n // Handle export config - only process if overrideCollection is provided\n // Settings like disableJobsQueue require a custom slug to work properly\n const exportConfig =\n typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined\n if (exportConfig?.overrideCollection) {\n // Generate a collection with this export config's settings (like disableJobsQueue)\n const collectionWithSettings = getExportCollection({\n config,\n exportConfig,\n pluginConfig,\n })\n\n const customExport = await exportConfig.overrideCollection({\n collection: collectionWithSettings,\n })\n\n // If the slug changed, this is a separate collection; otherwise it modifies the base\n if (customExport.slug !== baseExportCollection.slug) {\n exportCollections.push(customExport)\n // Map this target collection to its custom export collection\n customExportSlugMap.set(collectionConfig.slug, customExport.slug)\n } else {\n // Full override - replace the base\n baseExportCollection = customExport\n }\n }\n\n // Handle import config - only process if overrideCollection is provided\n // Settings like disableJobsQueue require a custom slug to work properly\n const importConf =\n typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined\n if (importConf?.overrideCollection) {\n // Generate a collection with this import config's settings (like disableJobsQueue)\n const collectionWithSettings = getImportCollection({\n config,\n importConfig: importConf,\n pluginConfig,\n })\n\n const customImport = await importConf.overrideCollection({\n collection: collectionWithSettings,\n })\n\n // If the slug changed, this is a separate collection; otherwise it modifies the base\n if (customImport.slug !== baseImportCollection.slug) {\n importCollections.push(customImport)\n // Map this target collection to its custom import collection\n customImportSlugMap.set(collectionConfig.slug, customImport.slug)\n } else {\n // Full override - replace the base\n baseImportCollection = customImport\n }\n }\n }\n }\n\n // Add base collections to the front of the arrays\n exportCollections.unshift(baseExportCollection)\n importCollections.unshift(baseImportCollection)\n\n return {\n customExportSlugMap,\n customImportSlugMap,\n exportCollections,\n importCollections,\n }\n}\n"],"names":["getExportCollection","getImportCollection","getPluginCollections","config","pluginConfig","baseExportCollection","baseImportCollection","overrideExportCollection","collection","overrideImportCollection","exportCollections","importCollections","customExportSlugMap","Map","customImportSlugMap","collections","length","collectionConfig","exportConfig","export","undefined","overrideCollection","collectionWithSettings","customExport","slug","push","set","importConf","import","importConfig","customImport","unshift"],"mappings":"AAIA,SAASA,mBAAmB,QAAQ,mCAAkC;AACtE,SAASC,mBAAmB,QAAQ,mCAAkC;AAuBtE;;;;;;;;;;;CAWC,GACD,OAAO,MAAMC,uBAAuB,OAAO,EACzCC,MAAM,EACNC,YAAY,EAIb;IACC,+FAA+F;IAC/F,IAAIC,uBAAuBL,oBAAoB;QAC7CG;QACAC;IACF;IACA,IAAIE,uBAAuBL,oBAAoB;QAC7CE;QACAC;IACF;IAEA,mDAAmD;IACnD,IACEA,aAAaG,wBAAwB,IACrC,OAAOH,aAAaG,wBAAwB,KAAK,YACjD;QACAF,uBAAuB,MAAMD,aAAaG,wBAAwB,CAAC;YACjEC,YAAYH;QACd;IACF;IAEA,IACED,aAAaK,wBAAwB,IACrC,OAAOL,aAAaK,wBAAwB,KAAK,YACjD;QACAH,uBAAuB,MAAMF,aAAaK,wBAAwB,CAAC;YACjED,YAAYF;QACd;IACF;IAEA,MAAMI,oBAAwC,EAAE;IAChD,MAAMC,oBAAwC,EAAE;IAEhD,+EAA+E;IAC/E,MAAMC,sBAAsB,IAAIC;IAChC,MAAMC,sBAAsB,IAAID;IAEhC,iEAAiE;IACjE,IAAIT,aAAaW,WAAW,IAAIX,aAAaW,WAAW,CAACC,MAAM,GAAG,GAAG;QACnE,KAAK,MAAMC,oBAAoBb,aAAaW,WAAW,CAAE;YACvD,wEAAwE;YACxE,wEAAwE;YACxE,MAAMG,eACJ,OAAOD,iBAAiBE,MAAM,KAAK,WAAWF,iBAAiBE,MAAM,GAAGC;YAC1E,IAAIF,cAAcG,oBAAoB;gBACpC,mFAAmF;gBACnF,MAAMC,yBAAyBtB,oBAAoB;oBACjDG;oBACAe;oBACAd;gBACF;gBAEA,MAAMmB,eAAe,MAAML,aAAaG,kBAAkB,CAAC;oBACzDb,YAAYc;gBACd;gBAEA,qFAAqF;gBACrF,IAAIC,aAAaC,IAAI,KAAKnB,qBAAqBmB,IAAI,EAAE;oBACnDd,kBAAkBe,IAAI,CAACF;oBACvB,6DAA6D;oBAC7DX,oBAAoBc,GAAG,CAACT,iBAAiBO,IAAI,EAAED,aAAaC,IAAI;gBAClE,OAAO;oBACL,mCAAmC;oBACnCnB,uBAAuBkB;gBACzB;YACF;YAEA,wEAAwE;YACxE,wEAAwE;YACxE,MAAMI,aACJ,OAAOV,iBAAiBW,MAAM,KAAK,WAAWX,iBAAiBW,MAAM,GAAGR;YAC1E,IAAIO,YAAYN,oBAAoB;gBAClC,mFAAmF;gBACnF,MAAMC,yBAAyBrB,oBAAoB;oBACjDE;oBACA0B,cAAcF;oBACdvB;gBACF;gBAEA,MAAM0B,eAAe,MAAMH,WAAWN,kBAAkB,CAAC;oBACvDb,YAAYc;gBACd;gBAEA,qFAAqF;gBACrF,IAAIQ,aAAaN,IAAI,KAAKlB,qBAAqBkB,IAAI,EAAE;oBACnDb,kBAAkBc,IAAI,CAACK;oBACvB,6DAA6D;oBAC7DhB,oBAAoBY,GAAG,CAACT,iBAAiBO,IAAI,EAAEM,aAAaN,IAAI;gBAClE,OAAO;oBACL,mCAAmC;oBACnClB,uBAAuBwB;gBACzB;YACF;QACF;IACF;IAEA,kDAAkD;IAClDpB,kBAAkBqB,OAAO,CAAC1B;IAC1BM,kBAAkBoB,OAAO,CAACzB;IAE1B,OAAO;QACLM;QACAE;QACAJ;QACAC;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { SanitizedCollectionConfig } from 'payload';
|
|
2
|
+
export type GetSchemaColumnsArgs = {
|
|
3
|
+
/**
|
|
4
|
+
* The collection configuration to derive columns from
|
|
5
|
+
*/
|
|
6
|
+
collectionConfig: SanitizedCollectionConfig;
|
|
7
|
+
/**
|
|
8
|
+
* Array of disabled field paths from plugin config
|
|
9
|
+
*/
|
|
10
|
+
disabledFields?: string[];
|
|
11
|
+
/**
|
|
12
|
+
* User-selected fields to export. If provided, only these fields (and their nested fields) will be included.
|
|
13
|
+
*/
|
|
14
|
+
fields?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* The locale to export. When 'all', localized fields are expanded to include all locale suffixes.
|
|
17
|
+
*/
|
|
18
|
+
locale?: null | string;
|
|
19
|
+
/**
|
|
20
|
+
* Available locale codes from config. Required when locale='all'.
|
|
21
|
+
*/
|
|
22
|
+
localeCodes?: string[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Derives CSV column names from the collection schema.
|
|
26
|
+
* This provides a base set of columns from field definitions.
|
|
27
|
+
*
|
|
28
|
+
* Note: For arrays/blocks with multiple items, the schema only generates index 0.
|
|
29
|
+
* Additional indices from actual data should be merged with these columns.
|
|
30
|
+
*
|
|
31
|
+
* Benefits:
|
|
32
|
+
* - Provides consistent base columns
|
|
33
|
+
* - Works for empty exports
|
|
34
|
+
* - Ensures proper column ordering
|
|
35
|
+
*/
|
|
36
|
+
export declare const getSchemaColumns: ({ collectionConfig, disabledFields, fields: selectedFields, locale, localeCodes, }: GetSchemaColumnsArgs) => string[];
|
|
37
|
+
/**
|
|
38
|
+
* Merges schema-derived columns with data-discovered columns.
|
|
39
|
+
* Schema columns provide the base ordering, data columns add any additional
|
|
40
|
+
* columns (e.g., array indices beyond 0, dynamic fields).
|
|
41
|
+
*/
|
|
42
|
+
export declare const mergeColumns: (schemaColumns: string[], dataColumns: string[]) => string[];
|
|
43
|
+
//# sourceMappingURL=getSchemaColumns.d.ts.map
|
|
@@ -0,0 +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,EA4E/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,kBAAmB,MAAM,EAAE,eAAe,MAAM,EAAE,KAAG,MAAM,EAoCnF,CAAA"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js';
|
|
2
|
+
/**
|
|
3
|
+
* Derives CSV column names from the collection schema.
|
|
4
|
+
* This provides a base set of columns from field definitions.
|
|
5
|
+
*
|
|
6
|
+
* Note: For arrays/blocks with multiple items, the schema only generates index 0.
|
|
7
|
+
* Additional indices from actual data should be merged with these columns.
|
|
8
|
+
*
|
|
9
|
+
* Benefits:
|
|
10
|
+
* - Provides consistent base columns
|
|
11
|
+
* - Works for empty exports
|
|
12
|
+
* - Ensures proper column ordering
|
|
13
|
+
*/ export const getSchemaColumns = ({ collectionConfig, disabledFields = [], fields: selectedFields, locale, localeCodes })=>{
|
|
14
|
+
const hasVersions = Boolean(collectionConfig.versions);
|
|
15
|
+
// Determine if we need locale expansion
|
|
16
|
+
const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0;
|
|
17
|
+
// Get all possible columns from schema (excludes system fields like id, createdAt, updatedAt)
|
|
18
|
+
let schemaColumns = getFlattenedFieldKeys(collectionConfig.flattenedFields, '', expandLocales ? {
|
|
19
|
+
localeCodes
|
|
20
|
+
} : {});
|
|
21
|
+
// Add system fields that aren't in flattenedFields
|
|
22
|
+
const systemFields = [
|
|
23
|
+
'id',
|
|
24
|
+
'createdAt',
|
|
25
|
+
'updatedAt'
|
|
26
|
+
];
|
|
27
|
+
schemaColumns = [
|
|
28
|
+
...systemFields,
|
|
29
|
+
...schemaColumns
|
|
30
|
+
];
|
|
31
|
+
// Filter to user-selected fields if specified
|
|
32
|
+
if (selectedFields && selectedFields.length > 0) {
|
|
33
|
+
schemaColumns = filterToSelectedFields(schemaColumns, selectedFields);
|
|
34
|
+
}
|
|
35
|
+
// Remove disabled fields
|
|
36
|
+
if (disabledFields.length > 0) {
|
|
37
|
+
const disabledSet = new Set();
|
|
38
|
+
for (const path of disabledFields){
|
|
39
|
+
// Convert dot notation to underscore and add to set
|
|
40
|
+
disabledSet.add(path.replace(/\./g, '_'));
|
|
41
|
+
}
|
|
42
|
+
schemaColumns = schemaColumns.filter((col)=>{
|
|
43
|
+
// Check if column matches any disabled path
|
|
44
|
+
for (const disabled of disabledSet){
|
|
45
|
+
if (col === disabled || col.startsWith(`${disabled}_`)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// When user has selected specific fields, preserve their ordering
|
|
53
|
+
// filterToSelectedFields() already returns columns in user's specified order
|
|
54
|
+
if (selectedFields && selectedFields.length > 0) {
|
|
55
|
+
return schemaColumns;
|
|
56
|
+
}
|
|
57
|
+
// No fields selected - apply default ordering (id first, timestamps last)
|
|
58
|
+
const orderedColumns = [];
|
|
59
|
+
// 1. ID always first
|
|
60
|
+
if (schemaColumns.includes('id')) {
|
|
61
|
+
orderedColumns.push('id');
|
|
62
|
+
}
|
|
63
|
+
// 2. Status field for versioned collections
|
|
64
|
+
if (hasVersions) {
|
|
65
|
+
orderedColumns.push('_status');
|
|
66
|
+
}
|
|
67
|
+
// 3. All other fields (excluding id, timestamps, status)
|
|
68
|
+
const excludeFromMiddle = new Set([
|
|
69
|
+
'_status',
|
|
70
|
+
'createdAt',
|
|
71
|
+
'id',
|
|
72
|
+
'updatedAt'
|
|
73
|
+
]);
|
|
74
|
+
for (const col of schemaColumns){
|
|
75
|
+
if (!excludeFromMiddle.has(col)) {
|
|
76
|
+
orderedColumns.push(col);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 4. Timestamps at the end
|
|
80
|
+
if (schemaColumns.includes('createdAt')) {
|
|
81
|
+
orderedColumns.push('createdAt');
|
|
82
|
+
}
|
|
83
|
+
if (schemaColumns.includes('updatedAt')) {
|
|
84
|
+
orderedColumns.push('updatedAt');
|
|
85
|
+
}
|
|
86
|
+
return orderedColumns;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Merges schema-derived columns with data-discovered columns.
|
|
90
|
+
* Schema columns provide the base ordering, data columns add any additional
|
|
91
|
+
* columns (e.g., array indices beyond 0, dynamic fields).
|
|
92
|
+
*/ export const mergeColumns = (schemaColumns, dataColumns)=>{
|
|
93
|
+
const result = [
|
|
94
|
+
...schemaColumns
|
|
95
|
+
];
|
|
96
|
+
const schemaSet = new Set(schemaColumns);
|
|
97
|
+
// Add any data columns not in schema (preserves schema ordering, appends new ones)
|
|
98
|
+
for (const col of dataColumns){
|
|
99
|
+
if (!schemaSet.has(col)) {
|
|
100
|
+
// Find the best position to insert this column
|
|
101
|
+
// For array indices (e.g., field_1_*), insert after field_0_*
|
|
102
|
+
const match = col.match(/^(.+?)_(\d+)(_.*)?$/);
|
|
103
|
+
if (match) {
|
|
104
|
+
const [, basePath, index, suffix] = match;
|
|
105
|
+
if (basePath && index) {
|
|
106
|
+
const prevIndex = parseInt(index, 10) - 1;
|
|
107
|
+
const prevCol = `${basePath}_${prevIndex}${suffix ?? ''}`;
|
|
108
|
+
const prevIdx = result.indexOf(prevCol);
|
|
109
|
+
if (prevIdx !== -1) {
|
|
110
|
+
// Insert after the previous index column
|
|
111
|
+
result.splice(prevIdx + 1, 0, col);
|
|
112
|
+
schemaSet.add(col);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Otherwise append at the end (before timestamps)
|
|
118
|
+
const createdAtIdx = result.indexOf('createdAt');
|
|
119
|
+
if (createdAtIdx !== -1) {
|
|
120
|
+
result.splice(createdAtIdx, 0, col);
|
|
121
|
+
} else {
|
|
122
|
+
result.push(col);
|
|
123
|
+
}
|
|
124
|
+
schemaSet.add(col);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Filters schema columns to only include those matching user-selected fields.
|
|
131
|
+
* Preserves the order specified by the user in selectedFields.
|
|
132
|
+
* Handles nested field selection (e.g., 'group.value' includes 'group_value' and 'group_value_*')
|
|
133
|
+
*/ function filterToSelectedFields(columns, selectedFields) {
|
|
134
|
+
const result = [];
|
|
135
|
+
const columnsSet = new Set(columns);
|
|
136
|
+
// Convert selected fields to underscore notation patterns
|
|
137
|
+
const patterns = selectedFields.map((field)=>{
|
|
138
|
+
const underscored = field.replace(/\./g, '_');
|
|
139
|
+
return {
|
|
140
|
+
exact: underscored,
|
|
141
|
+
original: field,
|
|
142
|
+
prefix: `${underscored}_`
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
// Iterate through user-specified fields in order to preserve their ordering
|
|
146
|
+
for (const pattern of patterns){
|
|
147
|
+
// First add the exact match if it exists
|
|
148
|
+
if (columnsSet.has(pattern.exact)) {
|
|
149
|
+
result.push(pattern.exact);
|
|
150
|
+
}
|
|
151
|
+
// Then add any columns with the prefix (nested fields)
|
|
152
|
+
for (const column of columns){
|
|
153
|
+
if (column !== pattern.exact && column.startsWith(pattern.prefix)) {
|
|
154
|
+
if (!result.includes(column)) {
|
|
155
|
+
result.push(column);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=getSchemaColumns.js.map
|
|
@@ -0,0 +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 hasVersions = Boolean(collectionConfig.versions)\n\n // Determine if we need locale expansion\n const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0\n\n // Get all possible columns from schema (excludes system fields like id, createdAt, updatedAt)\n let schemaColumns = getFlattenedFieldKeys(\n collectionConfig.flattenedFields,\n '',\n expandLocales ? { localeCodes } : {},\n )\n\n // Add system fields that aren't in flattenedFields\n const systemFields = ['id', 'createdAt', 'updatedAt']\n schemaColumns = [...systemFields, ...schemaColumns]\n\n // Filter to user-selected fields if specified\n if (selectedFields && selectedFields.length > 0) {\n schemaColumns = filterToSelectedFields(schemaColumns, selectedFields)\n }\n\n // Remove disabled fields\n if (disabledFields.length > 0) {\n const disabledSet = new Set<string>()\n for (const path of disabledFields) {\n // Convert dot notation to underscore and add to set\n disabledSet.add(path.replace(/\\./g, '_'))\n }\n schemaColumns = schemaColumns.filter((col) => {\n // Check if column matches any disabled path\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 // When user has selected specific fields, preserve their ordering\n // filterToSelectedFields() already returns columns in user's specified order\n if (selectedFields && selectedFields.length > 0) {\n return schemaColumns\n }\n\n // No fields selected - apply default ordering (id first, timestamps last)\n const orderedColumns: string[] = []\n\n // 1. ID always first\n if (schemaColumns.includes('id')) {\n orderedColumns.push('id')\n }\n\n // 2. Status field for versioned collections\n if (hasVersions) {\n orderedColumns.push('_status')\n }\n\n // 3. All other fields (excluding id, timestamps, status)\n const excludeFromMiddle = new Set(['_status', 'createdAt', 'id', 'updatedAt'])\n for (const col of schemaColumns) {\n if (!excludeFromMiddle.has(col)) {\n orderedColumns.push(col)\n }\n }\n\n // 4. Timestamps at the end\n if (schemaColumns.includes('createdAt')) {\n orderedColumns.push('createdAt')\n }\n if (schemaColumns.includes('updatedAt')) {\n orderedColumns.push('updatedAt')\n }\n\n return orderedColumns\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).\n */\nexport const mergeColumns = (schemaColumns: string[], dataColumns: string[]): string[] => {\n const result = [...schemaColumns]\n const schemaSet = new Set(schemaColumns)\n\n // Add any data columns not in schema (preserves schema ordering, appends new ones)\n for (const col of dataColumns) {\n if (!schemaSet.has(col)) {\n // Find the best position to insert this column\n // 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 // Otherwise append at the end (before timestamps)\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 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 * Handles nested field selection (e.g., 'group.value' includes 'group_value' and 'group_value_*')\n */\nfunction 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 // First add the exact match if it exists\n if (columnsSet.has(pattern.exact)) {\n result.push(pattern.exact)\n }\n\n // Then add any columns with the prefix (nested fields)\n for (const column of columns) {\n if (column !== pattern.exact && column.startsWith(pattern.prefix)) {\n if (!result.includes(column)) {\n result.push(column)\n }\n }\n }\n }\n\n return result\n}\n"],"names":["getFlattenedFieldKeys","getSchemaColumns","collectionConfig","disabledFields","fields","selectedFields","locale","localeCodes","hasVersions","Boolean","versions","expandLocales","length","schemaColumns","flattenedFields","systemFields","filterToSelectedFields","disabledSet","Set","path","add","replace","filter","col","disabled","startsWith","orderedColumns","includes","push","excludeFromMiddle","has","mergeColumns","dataColumns","result","schemaSet","match","basePath","index","suffix","prevIndex","parseInt","prevCol","prevIdx","indexOf","splice","createdAtIdx","columns","columnsSet","patterns","map","field","underscored","exact","original","prefix","pattern","column"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SelectIncludeType } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Takes an input of array of string paths in dot notation and returns a select object.
|
|
4
|
+
* Used for both export and import to build Payload's select query format.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])
|
|
8
|
+
* // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }
|
|
9
|
+
*/
|
|
10
|
+
export declare const getSelect: (fields: string[]) => SelectIncludeType;
|
|
11
|
+
//# sourceMappingURL=getSelect.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Takes an input of array of string paths in dot notation and returns a select object.
|
|
3
|
+
* Used for both export and import to build Payload's select query format.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])
|
|
7
|
+
* // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }
|
|
8
|
+
*/ export const getSelect = (fields)=>{
|
|
9
|
+
const select = {};
|
|
10
|
+
fields.forEach((field)=>{
|
|
11
|
+
const segments = field.split('.');
|
|
12
|
+
let selectRef = select;
|
|
13
|
+
segments.forEach((segment, i)=>{
|
|
14
|
+
if (i === segments.length - 1) {
|
|
15
|
+
selectRef[segment] = true;
|
|
16
|
+
} else {
|
|
17
|
+
if (!selectRef[segment]) {
|
|
18
|
+
selectRef[segment] = {};
|
|
19
|
+
}
|
|
20
|
+
selectRef = selectRef[segment];
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
return select;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=getSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSelect.ts"],"sourcesContent":["import type { SelectIncludeType } from 'payload'\n\n/**\n * Takes an input of array of string paths in dot notation and returns a select object.\n * Used for both export and import to build Payload's select query format.\n *\n * @example\n * getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])\n * // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }\n */\nexport const getSelect = (fields: string[]): SelectIncludeType => {\n const select: SelectIncludeType = {}\n\n fields.forEach((field) => {\n const segments = field.split('.')\n let selectRef = select\n\n segments.forEach((segment, i) => {\n if (i === segments.length - 1) {\n selectRef[segment] = true\n } else {\n if (!selectRef[segment]) {\n selectRef[segment] = {}\n }\n selectRef = selectRef[segment] as SelectIncludeType\n }\n })\n })\n\n return select\n}\n"],"names":["getSelect","fields","select","forEach","field","segments","split","selectRef","segment","i","length"],"mappings":"AAEA;;;;;;;CAOC,GACD,OAAO,MAAMA,YAAY,CAACC;IACxB,MAAMC,SAA4B,CAAC;IAEnCD,OAAOE,OAAO,CAAC,CAACC;QACd,MAAMC,WAAWD,MAAME,KAAK,CAAC;QAC7B,IAAIC,YAAYL;QAEhBG,SAASF,OAAO,CAAC,CAACK,SAASC;YACzB,IAAIA,MAAMJ,SAASK,MAAM,GAAG,GAAG;gBAC7BH,SAAS,CAACC,QAAQ,GAAG;YACvB,OAAO;gBACL,IAAI,CAACD,SAAS,CAACC,QAAQ,EAAE;oBACvBD,SAAS,CAACC,QAAQ,GAAG,CAAC;gBACxB;gBACAD,YAAYA,SAAS,CAACC,QAAQ;YAChC;QACF;IACF;IAEA,OAAON;AACT,EAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PayloadRequest } from 'payload';
|
|
2
|
+
export type ParseCSVArgs = {
|
|
3
|
+
data: Buffer | string;
|
|
4
|
+
req: PayloadRequest;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Parses CSV data into an array of record objects.
|
|
8
|
+
* Handles type coercion for booleans, numbers, and null values.
|
|
9
|
+
*/
|
|
10
|
+
export declare const parseCSV: ({ data, req }: ParseCSVArgs) => Promise<Record<string, unknown>[]>;
|
|
11
|
+
//# sourceMappingURL=parseCSV.d.ts.map
|
|
@@ -0,0 +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,CAmE7F,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { parse } from 'csv-parse';
|
|
2
|
+
/**
|
|
3
|
+
* Parses CSV data into an array of record objects.
|
|
4
|
+
* Handles type coercion for booleans, numbers, and null values.
|
|
5
|
+
*/ export const parseCSV = async ({ data, req })=>{
|
|
6
|
+
return new Promise((resolve, reject)=>{
|
|
7
|
+
const records = [];
|
|
8
|
+
const parser = parse({
|
|
9
|
+
cast: (value, _context)=>{
|
|
10
|
+
// Empty strings should be undefined (field not present in update)
|
|
11
|
+
// This preserves existing data instead of overwriting with null
|
|
12
|
+
if (value === '') {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
// Handle booleans
|
|
16
|
+
if (value === 'true') {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (value === 'false') {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// Handle explicit null - user must type "null" to set field to null
|
|
23
|
+
if (value === 'null' || value === 'NULL') {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
// Don't auto-convert to numbers if the value contains a comma
|
|
27
|
+
// This allows hasMany fields to use comma-separated values
|
|
28
|
+
if (value.includes(',')) {
|
|
29
|
+
return value // Keep as string for comma-separated values
|
|
30
|
+
;
|
|
31
|
+
}
|
|
32
|
+
// Handle numbers (only after checking for commas)
|
|
33
|
+
if (!isNaN(Number(value)) && value !== '') {
|
|
34
|
+
const num = Number(value);
|
|
35
|
+
if (String(num) === value || value.includes('.')) {
|
|
36
|
+
return num;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Return as string
|
|
40
|
+
return value;
|
|
41
|
+
},
|
|
42
|
+
columns: true,
|
|
43
|
+
skip_empty_lines: true,
|
|
44
|
+
trim: true
|
|
45
|
+
});
|
|
46
|
+
parser.on('readable', ()=>{
|
|
47
|
+
let record;
|
|
48
|
+
while((record = parser.read()) !== null){
|
|
49
|
+
records.push(record);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
parser.on('error', (err)=>{
|
|
53
|
+
req.payload.logger.error({
|
|
54
|
+
err,
|
|
55
|
+
msg: 'Error parsing CSV'
|
|
56
|
+
});
|
|
57
|
+
reject(err);
|
|
58
|
+
});
|
|
59
|
+
parser.on('end', ()=>{
|
|
60
|
+
resolve(records);
|
|
61
|
+
});
|
|
62
|
+
parser.write(data);
|
|
63
|
+
parser.end();
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=parseCSV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/parseCSV.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { parse } from 'csv-parse'\n\nexport type ParseCSVArgs = {\n data: Buffer | string\n req: PayloadRequest\n}\n\n/**\n * Parses CSV data into an array of record objects.\n * Handles type coercion for booleans, numbers, and null values.\n */\nexport const parseCSV = async ({ data, req }: ParseCSVArgs): Promise<Record<string, unknown>[]> => {\n return new Promise((resolve, reject) => {\n const records: Record<string, unknown>[] = []\n\n const parser = parse({\n cast: (value, _context) => {\n // Empty strings should be undefined (field not present in update)\n // This preserves existing data instead of overwriting with null\n if (value === '') {\n return undefined\n }\n\n // Handle booleans\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n\n // Handle explicit null - user must type \"null\" to set field to null\n if (value === 'null' || value === 'NULL') {\n return null\n }\n\n // Don't auto-convert to numbers if the value contains a comma\n // This allows hasMany fields to use comma-separated values\n if (value.includes(',')) {\n return value // Keep as string for comma-separated values\n }\n\n // Handle numbers (only after checking for commas)\n if (!isNaN(Number(value)) && value !== '') {\n const num = Number(value)\n\n if (String(num) === value || value.includes('.')) {\n return num\n }\n }\n\n // Return as string\n return value\n },\n columns: true,\n skip_empty_lines: true,\n trim: true,\n })\n\n parser.on('readable', () => {\n let record\n while ((record = parser.read()) !== null) {\n records.push(record)\n }\n })\n\n parser.on('error', (err) => {\n req.payload.logger.error({ err, msg: 'Error parsing CSV' })\n reject(err)\n })\n\n parser.on('end', () => {\n resolve(records)\n })\n\n parser.write(data)\n parser.end()\n })\n}\n"],"names":["parse","parseCSV","data","req","Promise","resolve","reject","records","parser","cast","value","_context","undefined","includes","isNaN","Number","num","String","columns","skip_empty_lines","trim","on","record","read","push","err","payload","logger","error","msg","write","end"],"mappings":"AAEA,SAASA,KAAK,QAAQ,YAAW;AAOjC;;;CAGC,GACD,OAAO,MAAMC,WAAW,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAgB;IACxD,OAAO,IAAIC,QAAQ,CAACC,SAASC;QAC3B,MAAMC,UAAqC,EAAE;QAE7C,MAAMC,SAASR,MAAM;YACnBS,MAAM,CAACC,OAAOC;gBACZ,kEAAkE;gBAClE,gEAAgE;gBAChE,IAAID,UAAU,IAAI;oBAChB,OAAOE;gBACT;gBAEA,kBAAkB;gBAClB,IAAIF,UAAU,QAAQ;oBACpB,OAAO;gBACT;gBACA,IAAIA,UAAU,SAAS;oBACrB,OAAO;gBACT;gBAEA,oEAAoE;gBACpE,IAAIA,UAAU,UAAUA,UAAU,QAAQ;oBACxC,OAAO;gBACT;gBAEA,8DAA8D;gBAC9D,2DAA2D;gBAC3D,IAAIA,MAAMG,QAAQ,CAAC,MAAM;oBACvB,OAAOH,MAAM,4CAA4C;;gBAC3D;gBAEA,kDAAkD;gBAClD,IAAI,CAACI,MAAMC,OAAOL,WAAWA,UAAU,IAAI;oBACzC,MAAMM,MAAMD,OAAOL;oBAEnB,IAAIO,OAAOD,SAASN,SAASA,MAAMG,QAAQ,CAAC,MAAM;wBAChD,OAAOG;oBACT;gBACF;gBAEA,mBAAmB;gBACnB,OAAON;YACT;YACAQ,SAAS;YACTC,kBAAkB;YAClBC,MAAM;QACR;QAEAZ,OAAOa,EAAE,CAAC,YAAY;YACpB,IAAIC;YACJ,MAAO,AAACA,CAAAA,SAASd,OAAOe,IAAI,EAAC,MAAO,KAAM;gBACxChB,QAAQiB,IAAI,CAACF;YACf;QACF;QAEAd,OAAOa,EAAE,CAAC,SAAS,CAACI;YAClBtB,IAAIuB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBAAEH;gBAAKI,KAAK;YAAoB;YACzDvB,OAAOmB;QACT;QAEAjB,OAAOa,EAAE,CAAC,OAAO;YACfhB,QAAQE;QACV;QAEAC,OAAOsB,KAAK,CAAC5B;QACbM,OAAOuB,GAAG;IACZ;AACF,EAAC"}
|