@payloadcms/plugin-import-export 4.0.0-internal.5b1e7cd → 4.0.0-internal.5e065b3
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 +3 -2
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +14 -12
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.css +52 -0
- package/dist/components/ExportPreview/index.d.ts +1 -1
- package/dist/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js +12 -2
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/FieldsToExport/index.d.ts +3 -2
- package/dist/components/FieldsToExport/index.d.ts.map +1 -1
- package/dist/components/FieldsToExport/index.js +18 -15
- package/dist/components/FieldsToExport/index.js.map +1 -1
- package/dist/components/FieldsToExport/reduceFields.d.ts +6 -0
- package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
- package/dist/components/FieldsToExport/reduceFields.js +4 -0
- package/dist/components/FieldsToExport/reduceFields.js.map +1 -1
- package/dist/components/FormatField/index.d.ts +3 -2
- package/dist/components/FormatField/index.d.ts.map +1 -1
- package/dist/components/FormatField/index.js +6 -3
- package/dist/components/FormatField/index.js.map +1 -1
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ImportListMenuItem/index.js +14 -12
- package/dist/components/ImportListMenuItem/index.js.map +1 -1
- package/dist/components/ImportPreview/index.css +45 -0
- package/dist/components/ImportPreview/index.d.ts +1 -1
- package/dist/components/ImportPreview/index.d.ts.map +1 -1
- package/dist/components/ImportPreview/index.js +44 -11
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/components/LimitField/index.d.ts +3 -2
- package/dist/components/LimitField/index.d.ts.map +1 -1
- package/dist/components/LimitField/index.js.map +1 -1
- package/dist/components/LocaleField/index.d.ts +3 -2
- package/dist/components/LocaleField/index.d.ts.map +1 -1
- package/dist/components/LocaleField/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +4 -3
- package/dist/components/Page/index.d.ts.map +1 -1
- package/dist/components/Page/index.js +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts +7 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.js +3 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.js.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.d.ts +43 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.d.ts.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.js +109 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.js.map +1 -0
- package/dist/components/RelationshipCell/index.css +30 -0
- package/dist/components/RelationshipCell/index.d.ts +15 -0
- package/dist/components/RelationshipCell/index.d.ts.map +1 -0
- package/dist/components/RelationshipCell/index.js +57 -0
- package/dist/components/RelationshipCell/index.js.map +1 -0
- package/dist/components/SortBy/index.css +9 -0
- package/dist/components/SortBy/index.d.ts +4 -3
- package/dist/components/SortBy/index.d.ts.map +1 -1
- package/dist/components/SortBy/index.js +1 -2
- package/dist/components/SortBy/index.js.map +1 -1
- package/dist/components/SortOrder/index.css +9 -0
- package/dist/components/SortOrder/index.d.ts +4 -3
- package/dist/components/SortOrder/index.d.ts.map +1 -1
- package/dist/components/SortOrder/index.js +1 -2
- package/dist/components/SortOrder/index.js.map +1 -1
- package/dist/export/batchProcessor.d.ts +12 -3
- package/dist/export/batchProcessor.d.ts.map +1 -1
- package/dist/export/batchProcessor.js +61 -15
- package/dist/export/batchProcessor.js.map +1 -1
- package/dist/export/createExport.d.ts +4 -2
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +105 -22
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +11 -0
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +9 -4
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/handleDownload.d.ts.map +1 -1
- package/dist/export/handleDownload.js +7 -3
- package/dist/export/handleDownload.js.map +1 -1
- package/dist/export/handlePreview.d.ts.map +1 -1
- package/dist/export/handlePreview.js +60 -16
- package/dist/export/handlePreview.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +17 -4
- package/dist/import/batchProcessor.d.ts.map +1 -1
- package/dist/import/batchProcessor.js +63 -34
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/createImport.d.ts +3 -11
- package/dist/import/createImport.d.ts.map +1 -1
- package/dist/import/createImport.js +42 -54
- package/dist/import/createImport.js.map +1 -1
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
- package/dist/import/getCreateImportCollectionTask.js +5 -2
- package/dist/import/getCreateImportCollectionTask.js.map +1 -1
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +6 -4
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/import/handlePreview.d.ts.map +1 -1
- package/dist/import/handlePreview.js +37 -7
- package/dist/import/handlePreview.js.map +1 -1
- package/dist/index.d.ts +51 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -8
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/types.d.ts +205 -42
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/applyFieldHooks.d.ts +22 -0
- package/dist/utilities/applyFieldHooks.d.ts.map +1 -0
- package/dist/utilities/applyFieldHooks.js +117 -0
- package/dist/utilities/applyFieldHooks.js.map +1 -0
- package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -1
- package/dist/utilities/collectDisabledFieldPaths.js +1 -1
- package/dist/utilities/collectDisabledFieldPaths.js.map +1 -1
- package/dist/utilities/flattenObject.d.ts +8 -6
- package/dist/utilities/flattenObject.d.ts.map +1 -1
- package/dist/utilities/flattenObject.js +85 -75
- package/dist/utilities/flattenObject.js.map +1 -1
- package/dist/utilities/flattenedFields.d.ts +21 -0
- package/dist/utilities/flattenedFields.d.ts.map +1 -0
- package/dist/utilities/flattenedFields.js +37 -0
- package/dist/utilities/flattenedFields.js.map +1 -0
- package/dist/utilities/getExportFieldFunctions.d.ts +5 -5
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getExportFieldFunctions.js +122 -99
- package/dist/utilities/getExportFieldFunctions.js.map +1 -1
- package/dist/utilities/getFileFromDoc.js +3 -3
- package/dist/utilities/getFileFromDoc.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts +5 -5
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getImportFieldFunctions.js +95 -103
- package/dist/utilities/getImportFieldFunctions.js.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts +1 -1
- package/dist/utilities/getSchemaColumns.js +2 -2
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/getSelect.d.ts.map +1 -1
- package/dist/utilities/getSelect.js +11 -3
- package/dist/utilities/getSelect.js.map +1 -1
- package/dist/utilities/getSubmittedFormValues.d.ts +12 -0
- package/dist/utilities/getSubmittedFormValues.d.ts.map +1 -0
- package/dist/utilities/getSubmittedFormValues.js +24 -0
- package/dist/utilities/getSubmittedFormValues.js.map +1 -0
- package/dist/utilities/isPlainObject.d.ts +2 -0
- package/dist/utilities/isPlainObject.d.ts.map +1 -0
- package/dist/utilities/isPlainObject.js +3 -0
- package/dist/utilities/isPlainObject.js.map +1 -0
- package/dist/utilities/polymorphicRel.d.ts +14 -0
- package/dist/utilities/polymorphicRel.d.ts.map +1 -0
- package/dist/utilities/polymorphicRel.js +17 -0
- package/dist/utilities/polymorphicRel.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -1
- package/dist/utilities/processRichTextField.js +7 -0
- package/dist/utilities/processRichTextField.js.map +1 -1
- package/dist/utilities/removeDisabledFields.js.map +1 -1
- package/dist/utilities/setNestedValue.d.ts +2 -1
- package/dist/utilities/setNestedValue.d.ts.map +1 -1
- package/dist/utilities/setNestedValue.js +65 -32
- package/dist/utilities/setNestedValue.js.map +1 -1
- package/dist/utilities/sortHelpers.d.ts +1 -1
- package/dist/utilities/unflattenObject.d.ts +4 -3
- package/dist/utilities/unflattenObject.d.ts.map +1 -1
- package/dist/utilities/unflattenObject.js +69 -170
- package/dist/utilities/unflattenObject.js.map +1 -1
- package/dist/utilities/unflattenPostProcess.d.ts +11 -0
- package/dist/utilities/unflattenPostProcess.d.ts.map +1 -0
- package/dist/utilities/unflattenPostProcess.js +174 -0
- package/dist/utilities/unflattenPostProcess.js.map +1 -0
- package/license.md +1 -1
- package/package.json +9 -9
- package/dist/components/ExportPreview/index.scss +0 -48
- package/dist/components/FieldsToExport/index.scss +0 -0
- package/dist/components/FieldsToExport/reduceFields.spec.js +0 -239
- package/dist/components/FieldsToExport/reduceFields.spec.js.map +0 -1
- package/dist/components/ImportPreview/index.scss +0 -41
- package/dist/components/SortBy/index.scss +0 -3
- package/dist/components/SortOrder/index.scss +0 -3
- package/dist/utilities/buildDisabledFieldRegex.spec.js +0 -64
- package/dist/utilities/buildDisabledFieldRegex.spec.js.map +0 -1
- package/dist/utilities/fieldToRegex.spec.js +0 -151
- package/dist/utilities/fieldToRegex.spec.js.map +0 -1
- package/dist/utilities/filterToSelectedFields.spec.js +0 -204
- package/dist/utilities/filterToSelectedFields.spec.js.map +0 -1
- package/dist/utilities/getSchemaColumns.spec.js +0 -157
- package/dist/utilities/getSchemaColumns.spec.js.map +0 -1
- package/dist/utilities/parseCSV.spec.js +0 -195
- package/dist/utilities/parseCSV.spec.js.map +0 -1
- package/dist/utilities/unflattenObject.spec.js +0 -680
- package/dist/utilities/unflattenObject.spec.js.map +0 -1
- /package/dist/components/Page/{index.scss → index.css} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getExportFieldFunctions.ts"],"sourcesContent":["import {
|
|
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(({ format, siblingData, value }) => {\n // A shape this handler does not recognize is left untouched for JSON, which holds the\n // source value verbatim. CSV still clears it, since its id/relationTo would otherwise\n // land in sibling columns.\n if (!isPolymorphicRelValue(value)) {\n return format === 'json' ? undefined : null\n }\n\n // A recognized reference that resolves to no id is dangling, and a dangling reference\n // cannot be imported back — clear it for both formats.\n const id = getPolymorphicRelId(value)\n if (id === undefined) {\n return null\n }\n\n if (format === 'json') {\n return { relationTo: value.relationTo, value: id }\n }\n siblingData[`${fullKey}_id`] = id\n siblingData[`${fullKey}_relationTo`] = value.relationTo\n return null\n })\n return\n }\n\n if (!Array.isArray(field.relationTo)) {\n registerHandler(({ format, siblingData, value }) => {\n if (!Array.isArray(value)) {\n return undefined\n }\n const ids = value.map((val) =>\n typeof val === 'object' && val ? (val as { id: unknown }).id : val,\n )\n // Bare null entries fail relationship validation when the JSON is imported, so drop\n // references that could not be resolved. CSV keeps source indexes in its column names;\n // unflattening those columns collapses any gaps on import.\n if (format === 'json') {\n return ids.filter((id) => id !== null && id !== undefined)\n }\n ids.forEach((id, i) => {\n siblingData[`${fullKey}_${i}_id`] = id\n })\n return null\n })\n return\n }\n\n registerHandler(({ format, siblingData, value }) => {\n if (!Array.isArray(value)) {\n return undefined\n }\n // `index` is carried so CSV columns stay pinned to the source position: an entry\n // that cannot be resolved to an id leaves a gap rather than shifting its siblings.\n const rels = value.flatMap((val, index) => {\n if (!isPolymorphicRelValue(val)) {\n return []\n }\n const id = getPolymorphicRelId(val)\n return id === undefined ? [] : [{ id, index, relationTo: val.relationTo }]\n })\n\n if (format === 'json') {\n // Bare null entries fail relationship validation when the JSON is imported, so return\n // only references that resolved to an id.\n return rels.map(({ id, relationTo }) => ({ relationTo, value: id }))\n }\n rels.forEach(({ id, index, relationTo }) => {\n siblingData[`${fullKey}_${index}_id`] = id\n siblingData[`${fullKey}_${index}_relationTo`] = relationTo\n })\n return null\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","ids","map","val","filter","forEach","i","rels","flatMap","index"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FileRetrievalError, getFileByPath } from 'payload';
|
|
2
|
-
import {
|
|
2
|
+
import { downloadFileToBuffer } from 'payload/internal';
|
|
3
3
|
import { formatAdminURL } from 'payload/shared';
|
|
4
4
|
/**
|
|
5
5
|
* Retrieves file data from an uploaded document, handling both local storage
|
|
@@ -33,7 +33,7 @@ import { formatAdminURL } from 'payload/shared';
|
|
|
33
33
|
}
|
|
34
34
|
if (doc.filename && doc.url) {
|
|
35
35
|
// Cloud storage or external - fetch via Payload's file endpoint
|
|
36
|
-
//
|
|
36
|
+
// downloadFileToBuffer constructs full URL, includes cookies for auth, and
|
|
37
37
|
// the request goes through Payload's handler chain (including storage adapter)
|
|
38
38
|
// For relative URLs, construct a full URL using formatAdminURL which properly
|
|
39
39
|
// handles serverURL, basePath, and other config. This is important in job contexts
|
|
@@ -44,7 +44,7 @@ import { formatAdminURL } from 'payload/shared';
|
|
|
44
44
|
path: doc.url,
|
|
45
45
|
serverURL: serverURL || req.origin
|
|
46
46
|
});
|
|
47
|
-
const file = await
|
|
47
|
+
const file = await downloadFileToBuffer({
|
|
48
48
|
data: {
|
|
49
49
|
filename: doc.filename,
|
|
50
50
|
url: fileUrl
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getFileFromDoc.ts"],"sourcesContent":["import type { CollectionConfig, FileData, PayloadRequest, UploadConfig } from 'payload'\n\nimport { FileRetrievalError, getFileByPath } from 'payload'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getFileFromDoc.ts"],"sourcesContent":["import type { CollectionConfig, FileData, PayloadRequest, UploadConfig } from 'payload'\n\nimport { FileRetrievalError, getFileByPath } from 'payload'\nimport { downloadFileToBuffer } from 'payload/internal'\nimport { formatAdminURL } from 'payload/shared'\n\ntype Args = {\n collectionConfig: CollectionConfig\n doc: { filename: string; mimeType?: string; url?: string }\n req: PayloadRequest\n}\n\ntype Result = {\n data: Buffer\n mimetype: string\n}\n\n/**\n * Retrieves file data from an uploaded document, handling both local storage\n * and cloud storage (S3, Azure, GCS, etc.) scenarios correctly.\n *\n * This function uses the same pattern as Payload's internal file retrieval:\n * - For local storage: reads directly from disk (efficient, no HTTP roundtrip)\n * - For cloud storage: fetches via Payload's file endpoint, which triggers\n * the storage adapter's staticHandler to serve the file\n */\nexport const getFileFromDoc = async ({ collectionConfig, doc, req }: Args): Promise<Result> => {\n const uploadConfig: UploadConfig =\n typeof collectionConfig.upload === 'object' ? collectionConfig.upload : {}\n const disableLocalStorage = uploadConfig.disableLocalStorage ?? false\n const staticDir = uploadConfig.staticDir || collectionConfig.slug\n\n const serverURL = req.payload.config.serverURL\n const isLocalFile = (serverURL && doc.url?.startsWith(serverURL)) || doc.url?.startsWith('/')\n\n if (!disableLocalStorage && isLocalFile && doc.filename) {\n // Local storage enabled - read directly from disk (efficient, no HTTP roundtrip)\n const filePath = `${staticDir}/${doc.filename}`\n const file = await getFileByPath(filePath)\n\n if (!file) {\n throw new Error(`File not found at path: ${filePath}`)\n }\n\n const mimetype = file.mimetype || doc.mimeType\n\n if (!mimetype) {\n throw new FileRetrievalError(req.t, `Unable to determine mimetype for file: ${doc.filename}`)\n }\n\n return {\n data: file.data,\n mimetype,\n }\n }\n\n if (doc.filename && doc.url) {\n // Cloud storage or external - fetch via Payload's file endpoint\n // downloadFileToBuffer constructs full URL, includes cookies for auth, and\n // the request goes through Payload's handler chain (including storage adapter)\n\n // For relative URLs, construct a full URL using formatAdminURL which properly\n // handles serverURL, basePath, and other config. This is important in job contexts\n // where request headers may not be available for URL construction.\n // Use serverURL from config, falling back to req.origin for local/job requests.\n const fileUrl = doc.url.startsWith('http')\n ? doc.url\n : formatAdminURL({\n apiRoute: '',\n path: doc.url as `/${string}`,\n serverURL: serverURL || req.origin,\n })\n\n const file = await downloadFileToBuffer({\n data: { filename: doc.filename, url: fileUrl } as FileData,\n req,\n uploadConfig,\n })\n\n const mimetype = file.mimetype || doc.mimeType\n\n if (!mimetype) {\n throw new FileRetrievalError(req.t, `Unable to determine mimetype for file: ${doc.filename}`)\n }\n\n return {\n data: file.data,\n mimetype,\n }\n }\n\n throw new Error('Unable to retrieve file: missing filename or url')\n}\n"],"names":["FileRetrievalError","getFileByPath","downloadFileToBuffer","formatAdminURL","getFileFromDoc","collectionConfig","doc","req","uploadConfig","upload","disableLocalStorage","staticDir","slug","serverURL","payload","config","isLocalFile","url","startsWith","filename","filePath","file","Error","mimetype","mimeType","t","data","fileUrl","apiRoute","path","origin"],"mappings":"AAEA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,UAAS;AAC3D,SAASC,oBAAoB,QAAQ,mBAAkB;AACvD,SAASC,cAAc,QAAQ,iBAAgB;AAa/C;;;;;;;;CAQC,GACD,OAAO,MAAMC,iBAAiB,OAAO,EAAEC,gBAAgB,EAAEC,GAAG,EAAEC,GAAG,EAAQ;IACvE,MAAMC,eACJ,OAAOH,iBAAiBI,MAAM,KAAK,WAAWJ,iBAAiBI,MAAM,GAAG,CAAC;IAC3E,MAAMC,sBAAsBF,aAAaE,mBAAmB,IAAI;IAChE,MAAMC,YAAYH,aAAaG,SAAS,IAAIN,iBAAiBO,IAAI;IAEjE,MAAMC,YAAYN,IAAIO,OAAO,CAACC,MAAM,CAACF,SAAS;IAC9C,MAAMG,cAAc,AAACH,aAAaP,IAAIW,GAAG,EAAEC,WAAWL,cAAeP,IAAIW,GAAG,EAAEC,WAAW;IAEzF,IAAI,CAACR,uBAAuBM,eAAeV,IAAIa,QAAQ,EAAE;QACvD,iFAAiF;QACjF,MAAMC,WAAW,GAAGT,UAAU,CAAC,EAAEL,IAAIa,QAAQ,EAAE;QAC/C,MAAME,OAAO,MAAMpB,cAAcmB;QAEjC,IAAI,CAACC,MAAM;YACT,MAAM,IAAIC,MAAM,CAAC,wBAAwB,EAAEF,UAAU;QACvD;QAEA,MAAMG,WAAWF,KAAKE,QAAQ,IAAIjB,IAAIkB,QAAQ;QAE9C,IAAI,CAACD,UAAU;YACb,MAAM,IAAIvB,mBAAmBO,IAAIkB,CAAC,EAAE,CAAC,uCAAuC,EAAEnB,IAAIa,QAAQ,EAAE;QAC9F;QAEA,OAAO;YACLO,MAAML,KAAKK,IAAI;YACfH;QACF;IACF;IAEA,IAAIjB,IAAIa,QAAQ,IAAIb,IAAIW,GAAG,EAAE;QAC3B,gEAAgE;QAChE,2EAA2E;QAC3E,+EAA+E;QAE/E,8EAA8E;QAC9E,mFAAmF;QACnF,mEAAmE;QACnE,gFAAgF;QAChF,MAAMU,UAAUrB,IAAIW,GAAG,CAACC,UAAU,CAAC,UAC/BZ,IAAIW,GAAG,GACPd,eAAe;YACbyB,UAAU;YACVC,MAAMvB,IAAIW,GAAG;YACbJ,WAAWA,aAAaN,IAAIuB,MAAM;QACpC;QAEJ,MAAMT,OAAO,MAAMnB,qBAAqB;YACtCwB,MAAM;gBAAEP,UAAUb,IAAIa,QAAQ;gBAAEF,KAAKU;YAAQ;YAC7CpB;YACAC;QACF;QAEA,MAAMe,WAAWF,KAAKE,QAAQ,IAAIjB,IAAIkB,QAAQ;QAE9C,IAAI,CAACD,UAAU;YACb,MAAM,IAAIvB,mBAAmBO,IAAIkB,CAAC,EAAE,CAAC,uCAAuC,EAAEnB,IAAIa,QAAQ,EAAE;QAC9F;QAEA,OAAO;YACLO,MAAML,KAAKK,IAAI;YACfH;QACF;IACF;IAEA,MAAM,IAAID,MAAM;AAClB,EAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
1
|
+
import type { FlattenedField } from 'payload';
|
|
2
|
+
import type { ImportFieldHookEntry } from '../types.js';
|
|
3
3
|
type Args = {
|
|
4
4
|
fields: FlattenedField[];
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Builds a map from logical field path (e.g. `content_textBlock_body`) to
|
|
8
|
+
* the import hook entry. Paths include block slugs but never array indices.
|
|
9
9
|
*/
|
|
10
|
-
export declare const getImportFieldFunctions: ({ fields }: Args) => Record<string,
|
|
10
|
+
export declare const getImportFieldFunctions: ({ fields }: Args) => Record<string, ImportFieldHookEntry>;
|
|
11
11
|
export {};
|
|
12
12
|
//# sourceMappingURL=getImportFieldFunctions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getImportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getImportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,116 +1,108 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { registerFieldHooks } from './flattenedFields.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Builds a map from logical field path (e.g. `content_textBlock_body`) to
|
|
4
|
+
* the import hook entry. Paths include block slugs but never array indices.
|
|
5
5
|
*/ export const getImportFieldFunctions = ({ fields })=>{
|
|
6
6
|
const result = {};
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
registerFieldHooks(fields, '', result, registerImportHandler);
|
|
8
|
+
return result;
|
|
9
|
+
};
|
|
10
|
+
const registerImportHandler = (field, fullKey, result)=>{
|
|
11
|
+
const beforeImport = field.custom?.['plugin-import-export']?.hooks?.beforeImport;
|
|
12
|
+
if (typeof beforeImport === 'function') {
|
|
13
|
+
result[fullKey] = {
|
|
14
|
+
type: 'beforeImport',
|
|
15
|
+
fn: beforeImport
|
|
16
|
+
};
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const registerBeforeImport = (fn)=>{
|
|
20
|
+
result[fullKey] = {
|
|
21
|
+
type: 'beforeImport',
|
|
22
|
+
fn
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
if (field.type === 'relationship' || field.type === 'upload') {
|
|
26
|
+
if (field.hasMany !== true) {
|
|
27
|
+
if (!Array.isArray(field.relationTo)) {
|
|
28
|
+
registerBeforeImport(({ value })=>value);
|
|
29
|
+
}
|
|
30
|
+
} else if (!Array.isArray(field.relationTo)) {
|
|
31
|
+
registerBeforeImport(({ value })=>value);
|
|
15
32
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (typeof value === 'object' && value !== null) {
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
// Convert string/number ID to relationship value
|
|
30
|
-
return value;
|
|
31
|
-
};
|
|
32
|
-
} else {
|
|
33
|
-
// Polymorphic single: handled in unflattenObject via _id/_relationTo columns
|
|
34
|
-
}
|
|
35
|
-
} else {
|
|
36
|
-
if (!Array.isArray(field.relationTo)) {
|
|
37
|
-
// @ts-expect-error ref is untyped
|
|
38
|
-
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
39
|
-
if (Array.isArray(value)) {
|
|
40
|
-
return value;
|
|
41
|
-
}
|
|
42
|
-
return value;
|
|
43
|
-
};
|
|
44
|
-
} else {
|
|
45
|
-
// Polymorphic many: handled in unflattenObject
|
|
46
|
-
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (field.type === 'number') {
|
|
36
|
+
if (field.hasMany) {
|
|
37
|
+
registerBeforeImport(({ value })=>value);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
registerBeforeImport(({ value })=>{
|
|
41
|
+
if (isEmptyImportValue(value)) {
|
|
42
|
+
return undefined;
|
|
47
43
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
// @ts-expect-error ref is untyped
|
|
51
|
-
result[`${ref.prefix}${field.name}`] = ({ value })=>value;
|
|
52
|
-
} else {
|
|
53
|
-
// @ts-expect-error ref is untyped
|
|
54
|
-
result[`${ref.prefix}${field.name}`] = ({ value })=>{
|
|
55
|
-
if (typeof value === 'number') {
|
|
56
|
-
return value;
|
|
57
|
-
}
|
|
58
|
-
if (typeof value === 'string') {
|
|
59
|
-
const parsed = parseFloat(value);
|
|
60
|
-
return isNaN(parsed) ? 0 : parsed;
|
|
61
|
-
}
|
|
62
|
-
return value;
|
|
63
|
-
};
|
|
44
|
+
if (typeof value === 'number') {
|
|
45
|
+
return value;
|
|
64
46
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
47
|
+
if (typeof value === 'string') {
|
|
48
|
+
const parsed = parseFloat(value);
|
|
49
|
+
return isNaN(parsed) ? undefined : parsed;
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (field.type === 'checkbox') {
|
|
56
|
+
registerBeforeImport(({ value })=>{
|
|
57
|
+
if (isEmptyImportValue(value)) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
if (typeof value === 'boolean') {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
if (typeof value === 'string') {
|
|
64
|
+
return value.toLowerCase() === 'true' || value === '1';
|
|
65
|
+
}
|
|
66
|
+
return Boolean(value);
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (field.type === 'date') {
|
|
71
|
+
registerBeforeImport(({ value })=>{
|
|
72
|
+
if (isEmptyImportValue(value)) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if (typeof value === 'string' && !isNaN(Date.parse(value))) {
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const date = new Date(value);
|
|
80
|
+
return isNaN(date.getTime()) ? value : date.toISOString();
|
|
81
|
+
} catch {
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (field.type === 'json' || field.type === 'richText') {
|
|
88
|
+
registerBeforeImport(({ value })=>{
|
|
89
|
+
if (isEmptyImportValue(value)) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
if (typeof value === 'object') {
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
if (typeof value === 'string') {
|
|
85
96
|
try {
|
|
86
|
-
|
|
87
|
-
return isNaN(date.getTime()) ? value : date.toISOString();
|
|
97
|
+
return JSON.parse(value);
|
|
88
98
|
} catch {
|
|
89
99
|
return value;
|
|
90
100
|
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (typeof value === 'object') {
|
|
96
|
-
return value;
|
|
97
|
-
}
|
|
98
|
-
if (typeof value === 'string') {
|
|
99
|
-
try {
|
|
100
|
-
return JSON.parse(value);
|
|
101
|
-
} catch {
|
|
102
|
-
return value;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return value;
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
traverseFields({
|
|
110
|
-
callback: buildCustomFunctions,
|
|
111
|
-
fields
|
|
112
|
-
});
|
|
113
|
-
return result;
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
114
105
|
};
|
|
106
|
+
const isEmptyImportValue = (value)=>value === '' || value === null || value === undefined;
|
|
115
107
|
|
|
116
108
|
//# sourceMappingURL=getImportFieldFunctions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getImportFieldFunctions.ts"],"sourcesContent":["import {
|
|
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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"}
|
|
@@ -37,7 +37,7 @@ export declare const getSchemaColumns: ({ collectionConfig, disabledFields, fiel
|
|
|
37
37
|
/**
|
|
38
38
|
* Merges schema-derived columns with data-discovered columns.
|
|
39
39
|
* Schema columns provide the base ordering, data columns add any additional
|
|
40
|
-
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from
|
|
40
|
+
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from beforeExport hooks).
|
|
41
41
|
*/
|
|
42
42
|
export declare const mergeColumns: (schemaColumns: string[], dataColumns: string[]) => string[];
|
|
43
43
|
/**
|
|
@@ -45,7 +45,7 @@ import { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js';
|
|
|
45
45
|
/**
|
|
46
46
|
* Merges schema-derived columns with data-discovered columns.
|
|
47
47
|
* Schema columns provide the base ordering, data columns add any additional
|
|
48
|
-
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from
|
|
48
|
+
* columns (e.g., array indices beyond 0, dynamic fields, derived columns from beforeExport hooks).
|
|
49
49
|
*/ export const mergeColumns = (schemaColumns, dataColumns)=>{
|
|
50
50
|
const result = [
|
|
51
51
|
...schemaColumns
|
|
@@ -101,7 +101,7 @@ import { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js';
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
// Remove schema columns that were fully replaced by
|
|
104
|
+
// Remove schema columns that were fully replaced by beforeExport-derived columns (e.g. "user" → "user_id", "user_email")
|
|
105
105
|
for (const [schemaCol, derivedCols] of insertedDerived){
|
|
106
106
|
if (!dataColumns.includes(schemaCol) && derivedCols.length > 0) {
|
|
107
107
|
const idx = result.indexOf(schemaCol);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getSchemaColumns.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from 'payload'\n\nimport { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js'\n\nexport type GetSchemaColumnsArgs = {\n /**\n * The collection configuration to derive columns from\n */\n collectionConfig: SanitizedCollectionConfig\n /**\n * Array of disabled field paths from plugin config\n */\n disabledFields?: string[]\n /**\n * User-selected fields to export. If provided, only these fields (and their nested fields) will be included.\n */\n fields?: string[]\n /**\n * The locale to export. When 'all', localized fields are expanded to include all locale suffixes.\n */\n locale?: null | string\n /**\n * Available locale codes from config. Required when locale='all'.\n */\n localeCodes?: string[]\n}\n\n/**\n * Derives CSV column names from the collection schema.\n * This provides a base set of columns from field definitions.\n *\n * Note: For arrays/blocks with multiple items, the schema only generates index 0.\n * Additional indices from actual data should be merged with these columns.\n *\n * Benefits:\n * - Provides consistent base columns\n * - Works for empty exports\n * - Ensures proper column ordering\n */\nexport const getSchemaColumns = ({\n collectionConfig,\n disabledFields = [],\n fields: selectedFields,\n locale,\n localeCodes,\n}: GetSchemaColumnsArgs): string[] => {\n const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0\n\n let schemaColumns = getFlattenedFieldKeys(\n collectionConfig.flattenedFields,\n '',\n expandLocales ? { localeCodes } : {},\n )\n\n // Add id if not present in schema\n const hasIdField = schemaColumns.includes('id')\n if (!hasIdField) {\n schemaColumns = ['id', ...schemaColumns]\n }\n\n if (selectedFields && selectedFields.length > 0) {\n schemaColumns = filterToSelectedFields(schemaColumns, selectedFields)\n }\n\n if (disabledFields.length > 0) {\n const disabledSet = new Set<string>()\n for (const path of disabledFields) {\n disabledSet.add(path.replace(/\\./g, '_'))\n }\n schemaColumns = schemaColumns.filter((col) => {\n for (const disabled of disabledSet) {\n if (col === disabled || col.startsWith(`${disabled}_`)) {\n return false\n }\n }\n return true\n })\n }\n\n return schemaColumns\n}\n\n/**\n * Merges schema-derived columns with data-discovered columns.\n * Schema columns provide the base ordering, data columns add any additional\n * columns (e.g., array indices beyond 0, dynamic fields, derived columns from toCSV).\n */\nexport const mergeColumns = (schemaColumns: string[], dataColumns: string[]): string[] => {\n const result = [...schemaColumns]\n const schemaSet = new Set(schemaColumns)\n const insertedDerived = new Map<string, string[]>()\n\n for (const col of dataColumns) {\n if (!schemaSet.has(col)) {\n let inserted = false\n\n for (const schemaCol of schemaColumns) {\n if (col.startsWith(`${schemaCol}_`)) {\n const suffix = col.slice(schemaCol.length + 1)\n // Skip if suffix starts with a digit (array index pattern like field_0_*)\n if (!/^\\d/.test(suffix)) {\n const baseIdx = result.indexOf(schemaCol)\n if (baseIdx !== -1) {\n const derivedList = insertedDerived.get(schemaCol) || []\n const insertIdx = baseIdx + 1 + derivedList.length\n result.splice(insertIdx, 0, col)\n derivedList.push(col)\n insertedDerived.set(schemaCol, derivedList)\n schemaSet.add(col)\n inserted = true\n break\n }\n }\n }\n }\n\n if (!inserted) {\n // Check for array indices (e.g., field_1_*), insert after field_0_*\n const match = col.match(/^(.+?)_(\\d+)(_.*)?$/)\n if (match) {\n const [, basePath, index, suffix] = match\n if (basePath && index) {\n const prevIndex = parseInt(index, 10) - 1\n const prevCol = `${basePath}_${prevIndex}${suffix ?? ''}`\n const prevIdx = result.indexOf(prevCol)\n if (prevIdx !== -1) {\n // Insert after the previous index column\n result.splice(prevIdx + 1, 0, col)\n schemaSet.add(col)\n continue\n }\n }\n }\n\n const createdAtIdx = result.indexOf('createdAt')\n if (createdAtIdx !== -1) {\n result.splice(createdAtIdx, 0, col)\n } else {\n result.push(col)\n }\n schemaSet.add(col)\n }\n }\n }\n\n // Remove schema columns that were fully replaced by toCSV-derived columns (e.g. \"user\" → \"user_id\", \"user_email\")\n for (const [schemaCol, derivedCols] of insertedDerived) {\n if (!dataColumns.includes(schemaCol) && derivedCols.length > 0) {\n const idx = result.indexOf(schemaCol)\n if (idx !== -1) {\n result.splice(idx, 1)\n }\n }\n }\n\n return result\n}\n\n/**\n * Filters schema columns to only include those matching user-selected fields.\n * Preserves the order specified by the user in selectedFields.\n *\n * Container fields (groups, arrays, blocks) don't produce their own column, so we prefix-expand\n * to find their children (e.g., 'group' → 'group_name', 'group_age').\n * Leaf fields (date, text, select) produce an exact column, so we only match exactly to avoid\n * including siblings with similar prefixes (e.g., 'dateWithTimezone' won't pull 'dateWithTimezone_tz').\n */\nexport function filterToSelectedFields(columns: string[], selectedFields: string[]): string[] {\n const result: string[] = []\n const columnsSet = new Set(columns)\n\n // Convert selected fields to underscore notation patterns\n const patterns = selectedFields.map((field) => {\n const underscored = field.replace(/\\./g, '_')\n return {\n exact: underscored,\n original: field,\n prefix: `${underscored}_`,\n }\n })\n\n // Iterate through user-specified fields in order to preserve their ordering\n for (const pattern of patterns) {\n const hasExactColumn = columnsSet.has(pattern.exact)\n\n if (hasExactColumn && !result.includes(pattern.exact)) {\n result.push(pattern.exact)\n }\n\n // Only prefix-expand if no exact column match exists (containers need expansion, leaves don't)\n if (!hasExactColumn) {\n for (const column of columns) {\n if (column.startsWith(pattern.prefix)) {\n if (!result.includes(column)) {\n result.push(column)\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["getFlattenedFieldKeys","getSchemaColumns","collectionConfig","disabledFields","fields","selectedFields","locale","localeCodes","expandLocales","length","schemaColumns","flattenedFields","hasIdField","includes","filterToSelectedFields","disabledSet","Set","path","add","replace","filter","col","disabled","startsWith","mergeColumns","dataColumns","result","schemaSet","insertedDerived","Map","has","inserted","schemaCol","suffix","slice","test","baseIdx","indexOf","derivedList","get","insertIdx","splice","push","set","match","basePath","index","prevIndex","parseInt","prevCol","prevIdx","createdAtIdx","derivedCols","idx","columns","columnsSet","patterns","map","field","underscored","exact","original","prefix","pattern","hasExactColumn","column"],"mappings":"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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;
|
|
1
|
+
{"version":3,"file":"getSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAOhD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,WAAY,MAAM,EAAE,KAAG,iBAyB5C,CAAA"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { APIError } from 'payload';
|
|
2
|
+
import { hasUnsupportedFieldPathSegment } from 'payload/shared';
|
|
3
|
+
const createSelect = ()=>Object.create(null);
|
|
1
4
|
/**
|
|
2
5
|
* Takes an input of array of string paths in dot notation and returns a select object.
|
|
3
6
|
* Used for both export and import to build Payload's select query format.
|
|
@@ -6,16 +9,21 @@
|
|
|
6
9
|
* getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])
|
|
7
10
|
* // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }
|
|
8
11
|
*/ export const getSelect = (fields)=>{
|
|
9
|
-
const select =
|
|
12
|
+
const select = createSelect();
|
|
10
13
|
fields.forEach((field)=>{
|
|
11
14
|
const segments = field.split('.');
|
|
15
|
+
if (hasUnsupportedFieldPathSegment({
|
|
16
|
+
segments
|
|
17
|
+
})) {
|
|
18
|
+
throw new APIError('Invalid field path.', 400, null, true);
|
|
19
|
+
}
|
|
12
20
|
let selectRef = select;
|
|
13
21
|
segments.forEach((segment, i)=>{
|
|
14
22
|
if (i === segments.length - 1) {
|
|
15
23
|
selectRef[segment] = true;
|
|
16
24
|
} else {
|
|
17
|
-
if (!selectRef
|
|
18
|
-
selectRef[segment] =
|
|
25
|
+
if (!Object.prototype.hasOwnProperty.call(selectRef, segment)) {
|
|
26
|
+
selectRef[segment] = createSelect();
|
|
19
27
|
}
|
|
20
28
|
selectRef = selectRef[segment];
|
|
21
29
|
}
|
|
@@ -1 +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
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSelect.ts"],"sourcesContent":["import type { SelectIncludeType } from 'payload'\n\nimport { APIError } from 'payload'\nimport { hasUnsupportedFieldPathSegment } from 'payload/shared'\n\nconst createSelect = (): SelectIncludeType => Object.create(null) as SelectIncludeType\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 = createSelect()\n\n fields.forEach((field) => {\n const segments = field.split('.')\n\n if (hasUnsupportedFieldPathSegment({ segments })) {\n throw new APIError('Invalid field path.', 400, null, true)\n }\n\n let selectRef = select\n\n segments.forEach((segment, i) => {\n if (i === segments.length - 1) {\n selectRef[segment] = true\n } else {\n if (!Object.prototype.hasOwnProperty.call(selectRef, segment)) {\n selectRef[segment] = createSelect()\n }\n selectRef = selectRef[segment] as SelectIncludeType\n }\n })\n })\n\n return select\n}\n"],"names":["APIError","hasUnsupportedFieldPathSegment","createSelect","Object","create","getSelect","fields","select","forEach","field","segments","split","selectRef","segment","i","length","prototype","hasOwnProperty","call"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAClC,SAASC,8BAA8B,QAAQ,iBAAgB;AAE/D,MAAMC,eAAe,IAAyBC,OAAOC,MAAM,CAAC;AAE5D;;;;;;;CAOC,GACD,OAAO,MAAMC,YAAY,CAACC;IACxB,MAAMC,SAASL;IAEfI,OAAOE,OAAO,CAAC,CAACC;QACd,MAAMC,WAAWD,MAAME,KAAK,CAAC;QAE7B,IAAIV,+BAA+B;YAAES;QAAS,IAAI;YAChD,MAAM,IAAIV,SAAS,uBAAuB,KAAK,MAAM;QACvD;QAEA,IAAIY,YAAYL;QAEhBG,SAASF,OAAO,CAAC,CAACK,SAASC;YACzB,IAAIA,MAAMJ,SAASK,MAAM,GAAG,GAAG;gBAC7BH,SAAS,CAACC,QAAQ,GAAG;YACvB,OAAO;gBACL,IAAI,CAACV,OAAOa,SAAS,CAACC,cAAc,CAACC,IAAI,CAACN,WAAWC,UAAU;oBAC7DD,SAAS,CAACC,QAAQ,GAAGX;gBACvB;gBACAU,YAAYA,SAAS,CAACC,QAAQ;YAChC;QACF;IACF;IAEA,OAAON;AACT,EAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const getSubmittedFormValues: ({ formData, omit, }: {
|
|
2
|
+
formData: Record<string, unknown>;
|
|
3
|
+
omit?: string[];
|
|
4
|
+
}) => Record<string, unknown>;
|
|
5
|
+
/** Tracks value changes, including nested custom fields, without depending on field state identity. */
|
|
6
|
+
export declare const getFormStateSignature: ({ fields, omit, }: {
|
|
7
|
+
fields: Record<string, {
|
|
8
|
+
value?: unknown;
|
|
9
|
+
} | undefined>;
|
|
10
|
+
omit?: string[];
|
|
11
|
+
}) => string;
|
|
12
|
+
//# sourceMappingURL=getSubmittedFormValues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSubmittedFormValues.d.ts","sourceRoot":"","sources":["../../src/utilities/getSubmittedFormValues.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,wBAGhC;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAIzB,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,sBAG/B;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;IACvD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,KAAG,MAQH,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Unsaved form values must not appear to come from a saved document. */ const serverOwnedFormKeys = new Set([
|
|
2
|
+
'createdAt',
|
|
3
|
+
'id',
|
|
4
|
+
'updatedAt'
|
|
5
|
+
]);
|
|
6
|
+
export const getSubmittedFormValues = ({ formData, omit = [] })=>{
|
|
7
|
+
const omitKeys = new Set([
|
|
8
|
+
...omit,
|
|
9
|
+
...serverOwnedFormKeys
|
|
10
|
+
]);
|
|
11
|
+
return Object.fromEntries(Object.entries(formData).filter(([key])=>!omitKeys.has(key)));
|
|
12
|
+
};
|
|
13
|
+
/** Tracks value changes, including nested custom fields, without depending on field state identity. */ export const getFormStateSignature = ({ fields, omit = [] })=>{
|
|
14
|
+
const omitKeys = new Set([
|
|
15
|
+
...omit,
|
|
16
|
+
...serverOwnedFormKeys
|
|
17
|
+
]);
|
|
18
|
+
return JSON.stringify(Object.entries(fields).filter(([path])=>!omitKeys.has(path)).map(([path, field])=>[
|
|
19
|
+
path,
|
|
20
|
+
field?.value
|
|
21
|
+
]));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=getSubmittedFormValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSubmittedFormValues.ts"],"sourcesContent":["/** Unsaved form values must not appear to come from a saved document. */\nconst serverOwnedFormKeys = new Set(['createdAt', 'id', 'updatedAt'])\n\nexport const getSubmittedFormValues = ({\n formData,\n omit = [],\n}: {\n formData: Record<string, unknown>\n omit?: string[]\n}): Record<string, unknown> => {\n const omitKeys = new Set([...omit, ...serverOwnedFormKeys])\n\n return Object.fromEntries(Object.entries(formData).filter(([key]) => !omitKeys.has(key)))\n}\n\n/** Tracks value changes, including nested custom fields, without depending on field state identity. */\nexport const getFormStateSignature = ({\n fields,\n omit = [],\n}: {\n fields: Record<string, { value?: unknown } | undefined>\n omit?: string[]\n}): string => {\n const omitKeys = new Set([...omit, ...serverOwnedFormKeys])\n\n return JSON.stringify(\n Object.entries(fields)\n .filter(([path]) => !omitKeys.has(path))\n .map(([path, field]) => [path, field?.value]),\n )\n}\n"],"names":["serverOwnedFormKeys","Set","getSubmittedFormValues","formData","omit","omitKeys","Object","fromEntries","entries","filter","key","has","getFormStateSignature","fields","JSON","stringify","path","map","field","value"],"mappings":"AAAA,uEAAuE,GACvE,MAAMA,sBAAsB,IAAIC,IAAI;IAAC;IAAa;IAAM;CAAY;AAEpE,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,QAAQ,EACRC,OAAO,EAAE,EAIV;IACC,MAAMC,WAAW,IAAIJ,IAAI;WAAIG;WAASJ;KAAoB;IAE1D,OAAOM,OAAOC,WAAW,CAACD,OAAOE,OAAO,CAACL,UAAUM,MAAM,CAAC,CAAC,CAACC,IAAI,GAAK,CAACL,SAASM,GAAG,CAACD;AACrF,EAAC;AAED,qGAAqG,GACrG,OAAO,MAAME,wBAAwB,CAAC,EACpCC,MAAM,EACNT,OAAO,EAAE,EAIV;IACC,MAAMC,WAAW,IAAIJ,IAAI;WAAIG;WAASJ;KAAoB;IAE1D,OAAOc,KAAKC,SAAS,CACnBT,OAAOE,OAAO,CAACK,QACZJ,MAAM,CAAC,CAAC,CAACO,KAAK,GAAK,CAACX,SAASM,GAAG,CAACK,OACjCC,GAAG,CAAC,CAAC,CAACD,MAAME,MAAM,GAAK;YAACF;YAAME,OAAOC;SAAM;AAElD,EAAC"}
|