@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/import/batchProcessor.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\nimport { isolateObjectProperty } from 'payload'\n\nimport type { ImportMode, ImportResult } from './createImport.js'\n\nimport {\n type BatchError,\n categorizeError,\n createBatches,\n extractErrorMessage,\n} from '../utilities/useBatchProcessor.js'\n\n/**\n * Import-specific batch processor options\n */\nexport interface ImportBatchProcessorOptions {\n batchSize?: number\n defaultVersionStatus?: 'draft' | 'published'\n}\n\n/**\n * Import-specific error type extending the generic BatchError\n */\nexport interface ImportError extends BatchError<Record<string, unknown>> {\n documentData: Record<string, unknown>\n field?: string\n fieldLabel?: string\n rowNumber: number // 1-indexed for user clarity\n}\n\n/**\n * Result from processing a single import batch\n */\nexport interface ImportBatchResult {\n failed: Array<ImportError>\n successful: Array<{\n document: Record<string, unknown>\n index: number\n operation?: 'created' | 'updated'\n result: Record<string, unknown>\n }>\n}\n\n/**\n * Options for processing an import operation\n */\nexport interface ImportProcessOptions {\n collectionSlug: string\n documents: Record<string, unknown>[]\n importMode: ImportMode\n matchField?: string\n req: PayloadRequest\n user?: TypedUser\n}\n\n/**\n * Separates multi-locale data from a document for sequential locale updates.\n *\n * When a field has locale-keyed values (e.g., { title: { en: 'Hello', es: 'Hola' } }),\n * this extracts the default locale's data for initial create/update, and stores\n * remaining locales for subsequent update calls.\n *\n * @returns\n * - flatData: Document with default locale values extracted (for initial operation)\n * - hasMultiLocale: Whether any multi-locale fields were found\n * - localeUpdates: Map of locale -> field data for follow-up updates\n */\nfunction extractMultiLocaleData(\n data: Record<string, unknown>,\n configuredLocales?: string[],\n defaultLocale?: string,\n): {\n flatData: Record<string, unknown>\n hasMultiLocale: boolean\n localeUpdates: Record<string, Record<string, unknown>>\n} {\n const flatData: Record<string, unknown> = {}\n const localeUpdates: Record<string, Record<string, unknown>> = {}\n let hasMultiLocale = false\n\n if (!configuredLocales || configuredLocales.length === 0) {\n return { flatData: { ...data }, hasMultiLocale: false, localeUpdates: {} }\n }\n\n const localeSet = new Set(configuredLocales)\n\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueObj = value as Record<string, unknown>\n const localeKeys = Object.keys(valueObj).filter((k) => localeSet.has(k))\n\n if (localeKeys.length > 0) {\n hasMultiLocale = true\n const baseLocale =\n defaultLocale && localeKeys.includes(defaultLocale) ? defaultLocale : localeKeys[0]\n if (baseLocale) {\n flatData[key] = valueObj[baseLocale]\n for (const locale of localeKeys) {\n if (locale !== baseLocale) {\n if (!localeUpdates[locale]) {\n localeUpdates[locale] = {}\n }\n localeUpdates[locale][key] = valueObj[locale]\n }\n }\n }\n } else {\n flatData[key] = value\n }\n } else {\n flatData[key] = value\n }\n }\n\n return { flatData, hasMultiLocale, localeUpdates }\n}\n\ntype ProcessImportBatchOptions = {\n batch: Record<string, unknown>[]\n batchIndex: number\n collectionSlug: string\n importMode: ImportMode\n matchField: string | undefined\n options: { batchSize: number; defaultVersionStatus: 'draft' | 'published' }\n req: PayloadRequest\n user?: TypedUser\n}\n\n/**\n * Processes a batch of documents for import based on the import mode.\n *\n * For each document in the batch:\n * - create: Creates a new document (removes any existing ID)\n * - update: Finds existing document by matchField and updates it\n * - upsert: Updates if found, creates if not found\n *\n * Handles versioned collections, multi-locale data, and MongoDB ObjectID validation.\n * Continues processing remaining documents even if individual imports fail.\n */\nasync function processImportBatch({\n batch,\n batchIndex,\n collectionSlug,\n importMode,\n matchField,\n options,\n req: reqFromArgs,\n user,\n}: ProcessImportBatchOptions): Promise<ImportBatchResult> {\n const result: ImportBatchResult = {\n failed: [],\n successful: [],\n }\n // Create a request proxy that isolates the transactionID property, then clear it.\n // This is critical because if a nested operation fails (e.g., Forbidden due to access control),\n // Payload's error handling calls killTransaction(req), which would kill the parent's transaction\n // if we shared the same transaction. By isolating and clearing transactionID, each nested\n // operation either uses no transaction or starts its own, independent of the parent.\n const req = isolateObjectProperty(reqFromArgs, 'transactionID')\n req.transactionID = undefined\n\n const collectionEntry = req.payload.collections[collectionSlug]\n\n const collectionConfig = collectionEntry?.config\n const collectionHasVersions = Boolean(collectionConfig?.versions)\n const hasCustomIdField = Boolean(collectionEntry?.customIDType)\n\n const configuredLocales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n const defaultLocale = req.payload.config.localization\n ? req.payload.config.localization.defaultLocale\n : undefined\n\n const startingRowNumber = batchIndex * options.batchSize\n\n for (let i = 0; i < batch.length; i++) {\n const document = batch[i]\n if (!document) {\n continue\n }\n const rowNumber = startingRowNumber + i + 1\n\n try {\n let savedDocument: Record<string, unknown> | undefined\n let existingDocResult: { docs: Array<Record<string, unknown>> } | undefined\n\n if (importMode === 'create') {\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n _status: createData._status,\n isPublished,\n msg: 'Status handling in create',\n willSetDraft: draftOption,\n })\n }\n }\n\n if (req.payload.config.debug && 'title' in createData) {\n req.payload.logger.info({\n msg: 'Creating document',\n title: createData.title,\n titleIsNull: createData.title === null,\n titleType: typeof createData.title,\n })\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n // Update for other locales\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n const localeReq = { ...req, locale }\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: localeReq,\n user,\n })\n } catch (error) {\n // Log but don't fail the entire import if a locale update fails\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else if (importMode === 'update' || importMode === 'upsert') {\n const matchValue = document[matchField || 'id']\n if (!matchValue) {\n throw new Error(`Match field \"${matchField || 'id'}\" not found in document`)\n }\n\n // Special handling for ID field with MongoDB\n // If matching by 'id' and it's not a valid ObjectID format, handle specially\n const isMatchingById = (matchField || 'id') === 'id'\n\n // Check if it's a valid MongoDB ObjectID format (24 hex chars)\n // Note: matchValue could be string, number, or ObjectID object\n let matchValueStr: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueStr = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueStr = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueStr = matchValue.toString()\n } else {\n // For other types, use JSON.stringify\n matchValueStr = JSON.stringify(matchValue)\n }\n const isValidObjectIdFormat = /^[0-9a-f]{24}$/i.test(matchValueStr)\n\n try {\n existingDocResult = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n user,\n where: {\n [matchField || 'id']: {\n equals: matchValue,\n },\n },\n })\n } catch (error) {\n // MongoDB may throw for invalid ObjectID format - handle gracefully for upsert\n if (isMatchingById && importMode === 'upsert' && !isValidObjectIdFormat) {\n existingDocResult = { docs: [] }\n } else if (isMatchingById && importMode === 'update' && !isValidObjectIdFormat) {\n throw new Error(`Invalid ID format for update: ${matchValueStr}`)\n } else {\n throw error\n }\n }\n\n if (existingDocResult.docs.length > 0) {\n const existingDoc = existingDocResult.docs[0]\n if (!existingDoc) {\n throw new Error(`Document not found`)\n }\n\n // Debug: log what we found\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingStatus: existingDoc._status,\n existingTitle: existingDoc.title,\n incomingDocument: document,\n mode: importMode,\n msg: 'Found existing document for update',\n })\n }\n\n const updateData = { ...document }\n // Remove ID and internal fields from update data\n delete updateData.id\n delete updateData._id\n delete updateData.createdAt\n delete updateData.updatedAt\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n updateData,\n configuredLocales,\n defaultLocale,\n )\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n hasMultiLocale,\n mode: importMode,\n msg: 'Updating document in upsert/update mode',\n updateData: Object.keys(hasMultiLocale ? flatData : updateData).reduce(\n (acc, key) => {\n const val = (hasMultiLocale ? flatData : updateData)[key]\n acc[key] =\n typeof val === 'string' && val.length > 50 ? val.substring(0, 50) + '...' : val\n return acc\n },\n {} as Record<string, unknown>,\n ),\n })\n }\n\n if (hasMultiLocale) {\n // Update with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: flatData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n // Update for other locales\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n // Clone the request with the specific locale\n const localeReq = { ...req, locale }\n await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req: localeReq,\n user,\n })\n } catch (error) {\n // Log but don't fail the entire import if a locale update fails\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(existingDoc.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, update normally\n try {\n // Extra debug: log before update\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingTitle: existingDoc.title,\n msg: 'About to update document',\n newData: updateData,\n })\n }\n\n // Update the document - don't specify draft to let Payload handle versions properly\n // This will create a new draft version for collections with versions enabled\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: updateData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req,\n user,\n })\n\n if (req.payload.config.debug && savedDocument) {\n req.payload.logger.info({\n id: savedDocument.id,\n msg: 'Update completed',\n status: savedDocument._status,\n title: savedDocument.title,\n })\n }\n } catch (updateError) {\n req.payload.logger.error({\n id: existingDoc.id,\n err: updateError,\n msg: 'Update failed',\n })\n throw updateError\n }\n }\n } else if (importMode === 'upsert') {\n // Create new in upsert mode\n if (req.payload.config.debug) {\n req.payload.logger.info({\n document,\n matchField: matchField || 'id',\n matchValue: document[matchField || 'id'],\n msg: 'No existing document found, creating new in upsert mode',\n })\n }\n\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n // Only handle _status for versioned collections\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n // Use defaultVersionStatus from config if _status not provided\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n // Update for other locales\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n // Clone the request with the specific locale\n const localeReq = { ...req, locale }\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: localeReq,\n })\n } catch (error) {\n // Log but don't fail the entire import if a locale update fails\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else {\n // Update mode but document not found\n let matchValueDisplay: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueDisplay = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueDisplay = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueDisplay = matchValue.toString()\n } else {\n // For other types, use JSON.stringify to avoid [object Object]\n matchValueDisplay = JSON.stringify(matchValue)\n }\n throw new Error(`Document with ${matchField || 'id'}=\"${matchValueDisplay}\" not found`)\n }\n } else {\n throw new Error(`Unknown import mode: ${String(importMode)}`)\n }\n\n if (savedDocument) {\n // Determine operation type for proper counting\n let operation: 'created' | 'updated' | undefined\n if (importMode === 'create') {\n operation = 'created'\n } else if (importMode === 'update') {\n operation = 'updated'\n } else if (importMode === 'upsert') {\n if (existingDocResult && existingDocResult.docs.length > 0) {\n operation = 'updated'\n } else {\n operation = 'created'\n }\n }\n\n result.successful.push({\n document,\n index: rowNumber - 1, // Store as 0-indexed\n operation,\n result: savedDocument,\n })\n }\n } catch (error) {\n const importError: ImportError = {\n type: categorizeError(error),\n documentData: document || {},\n error: extractErrorMessage(error),\n item: document || {},\n itemIndex: rowNumber - 1,\n rowNumber,\n }\n\n // Try to extract field information from validation errors\n if (error && typeof error === 'object' && 'data' in error) {\n const errorData = error as { data?: { errors?: Array<{ path?: string }> } }\n if (errorData.data?.errors && Array.isArray(errorData.data.errors)) {\n const firstError = errorData.data.errors[0]\n if (firstError?.path) {\n importError.field = firstError.path\n }\n }\n }\n\n result.failed.push(importError)\n // Always continue processing all rows\n }\n }\n\n return result\n}\n\nexport function createImportBatchProcessor(options: ImportBatchProcessorOptions = {}) {\n const processorOptions = {\n batchSize: options.batchSize ?? 100,\n defaultVersionStatus: options.defaultVersionStatus ?? 'published',\n }\n\n const processImport = async (processOptions: ImportProcessOptions): Promise<ImportResult> => {\n const { collectionSlug, documents, importMode, matchField, req, user } = processOptions\n const batches = createBatches(documents, processorOptions.batchSize)\n\n const result: ImportResult = {\n errors: [],\n imported: 0,\n total: documents.length,\n updated: 0,\n }\n\n for (let i = 0; i < batches.length; i++) {\n const currentBatch = batches[i]\n if (!currentBatch) {\n continue\n }\n\n const batchResult = await processImportBatch({\n batch: currentBatch,\n batchIndex: i,\n collectionSlug,\n importMode,\n matchField,\n options: processorOptions,\n req,\n user,\n })\n\n // Update results\n for (const success of batchResult.successful) {\n if (success.operation === 'created') {\n result.imported++\n } else if (success.operation === 'updated') {\n result.updated++\n } else {\n // Fallback\n if (importMode === 'create') {\n result.imported++\n } else {\n result.updated++\n }\n }\n }\n\n for (const error of batchResult.failed) {\n result.errors.push({\n doc: error.documentData,\n error: error.error,\n index: error.rowNumber - 1, // Convert back to 0-indexed\n })\n }\n }\n\n return result\n }\n\n return {\n processImport,\n }\n}\n"],"names":["isolateObjectProperty","categorizeError","createBatches","extractErrorMessage","extractMultiLocaleData","data","configuredLocales","defaultLocale","flatData","localeUpdates","hasMultiLocale","length","localeSet","Set","key","value","Object","entries","Array","isArray","valueObj","localeKeys","keys","filter","k","has","baseLocale","includes","locale","processImportBatch","batch","batchIndex","collectionSlug","importMode","matchField","options","req","reqFromArgs","user","result","failed","successful","transactionID","undefined","collectionEntry","payload","collections","collectionConfig","config","collectionHasVersions","Boolean","versions","hasCustomIdField","customIDType","localization","localeCodes","startingRowNumber","batchSize","i","document","rowNumber","savedDocument","existingDocResult","createData","id","draftOption","statusValue","_status","defaultVersionStatus","isPublished","debug","logger","info","msg","willSetDraft","title","titleIsNull","titleType","defaultLocaleReq","create","collection","draft","overrideAccess","localeData","localeReq","update","error","err","String","matchValue","Error","isMatchingById","matchValueStr","JSON","stringify","toString","isValidObjectIdFormat","test","find","depth","limit","where","equals","docs","existingDoc","existingId","existingStatus","existingTitle","incomingDocument","mode","updateData","_id","createdAt","updatedAt","reduce","acc","val","substring","newData","status","updateError","matchValueDisplay","operation","push","index","importError","type","documentData","item","itemIndex","errorData","errors","firstError","path","field","createImportBatchProcessor","processorOptions","processImport","processOptions","documents","batches","imported","total","updated","currentBatch","batchResult","success","doc"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,UAAS;AAI/C,SAEEC,eAAe,EACfC,aAAa,EACbC,mBAAmB,QACd,oCAAmC;AA6C1C;;;;;;;;;;;CAWC,GACD,SAASC,uBACPC,IAA6B,EAC7BC,iBAA4B,EAC5BC,aAAsB;IAMtB,MAAMC,WAAoC,CAAC;IAC3C,MAAMC,gBAAyD,CAAC;IAChE,IAAIC,iBAAiB;IAErB,IAAI,CAACJ,qBAAqBA,kBAAkBK,MAAM,KAAK,GAAG;QACxD,OAAO;YAAEH,UAAU;gBAAE,GAAGH,IAAI;YAAC;YAAGK,gBAAgB;YAAOD,eAAe,CAAC;QAAE;IAC3E;IAEA,MAAMG,YAAY,IAAIC,IAAIP;IAE1B,KAAK,MAAM,CAACQ,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACZ,MAAO;QAC/C,IAAIU,SAAS,OAAOA,UAAU,YAAY,CAACG,MAAMC,OAAO,CAACJ,QAAQ;YAC/D,MAAMK,WAAWL;YACjB,MAAMM,aAAaL,OAAOM,IAAI,CAACF,UAAUG,MAAM,CAAC,CAACC,IAAMZ,UAAUa,GAAG,CAACD;YAErE,IAAIH,WAAWV,MAAM,GAAG,GAAG;gBACzBD,iBAAiB;gBACjB,MAAMgB,aACJnB,iBAAiBc,WAAWM,QAAQ,CAACpB,iBAAiBA,gBAAgBc,UAAU,CAAC,EAAE;gBACrF,IAAIK,YAAY;oBACdlB,QAAQ,CAACM,IAAI,GAAGM,QAAQ,CAACM,WAAW;oBACpC,KAAK,MAAME,UAAUP,WAAY;wBAC/B,IAAIO,WAAWF,YAAY;4BACzB,IAAI,CAACjB,aAAa,CAACmB,OAAO,EAAE;gCAC1BnB,aAAa,CAACmB,OAAO,GAAG,CAAC;4BAC3B;4BACAnB,aAAa,CAACmB,OAAO,CAACd,IAAI,GAAGM,QAAQ,CAACQ,OAAO;wBAC/C;oBACF;gBACF;YACF,OAAO;gBACLpB,QAAQ,CAACM,IAAI,GAAGC;YAClB;QACF,OAAO;YACLP,QAAQ,CAACM,IAAI,GAAGC;QAClB;IACF;IAEA,OAAO;QAAEP;QAAUE;QAAgBD;IAAc;AACnD;AAaA;;;;;;;;;;CAUC,GACD,eAAeoB,mBAAmB,EAChCC,KAAK,EACLC,UAAU,EACVC,cAAc,EACdC,UAAU,EACVC,UAAU,EACVC,OAAO,EACPC,KAAKC,WAAW,EAChBC,IAAI,EACsB;IAC1B,MAAMC,SAA4B;QAChCC,QAAQ,EAAE;QACVC,YAAY,EAAE;IAChB;IACA,kFAAkF;IAClF,gGAAgG;IAChG,iGAAiG;IACjG,0FAA0F;IAC1F,qFAAqF;IACrF,MAAML,MAAMpC,sBAAsBqC,aAAa;IAC/CD,IAAIM,aAAa,GAAGC;IAEpB,MAAMC,kBAAkBR,IAAIS,OAAO,CAACC,WAAW,CAACd,eAAe;IAE/D,MAAMe,mBAAmBH,iBAAiBI;IAC1C,MAAMC,wBAAwBC,QAAQH,kBAAkBI;IACxD,MAAMC,mBAAmBF,QAAQN,iBAAiBS;IAElD,MAAM/C,oBAAoB8B,IAAIS,OAAO,CAACG,MAAM,CAACM,YAAY,GACrDlB,IAAIS,OAAO,CAACG,MAAM,CAACM,YAAY,CAACC,WAAW,GAC3CZ;IAEJ,MAAMpC,gBAAgB6B,IAAIS,OAAO,CAACG,MAAM,CAACM,YAAY,GACjDlB,IAAIS,OAAO,CAACG,MAAM,CAACM,YAAY,CAAC/C,aAAa,GAC7CoC;IAEJ,MAAMa,oBAAoBzB,aAAaI,QAAQsB,SAAS;IAExD,IAAK,IAAIC,IAAI,GAAGA,IAAI5B,MAAMnB,MAAM,EAAE+C,IAAK;QACrC,MAAMC,WAAW7B,KAAK,CAAC4B,EAAE;QACzB,IAAI,CAACC,UAAU;YACb;QACF;QACA,MAAMC,YAAYJ,oBAAoBE,IAAI;QAE1C,IAAI;YACF,IAAIG;YACJ,IAAIC;YAEJ,IAAI7B,eAAe,UAAU;gBAC3B,MAAM8B,aAAa;oBAAE,GAAGJ,QAAQ;gBAAC;gBACjC,IAAI,CAACP,kBAAkB;oBACrB,OAAOW,WAAWC,EAAE;gBACtB;gBAEA,IAAIC;gBACJ,IAAIhB,uBAAuB;oBACzB,MAAMiB,cAAcH,WAAWI,OAAO,IAAIhC,QAAQiC,oBAAoB;oBACtE,MAAMC,cAAcH,gBAAgB;oBACpCD,cAAc,CAACI;oBACfN,WAAWI,OAAO,GAAGD;oBAErB,IAAI9B,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,EAAE;wBAC5BlC,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;4BACtBL,SAASJ,WAAWI,OAAO;4BAC3BE;4BACAI,KAAK;4BACLC,cAAcT;wBAChB;oBACF;gBACF;gBAEA,IAAI7B,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,IAAI,WAAWP,YAAY;oBACrD3B,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;wBACtBC,KAAK;wBACLE,OAAOZ,WAAWY,KAAK;wBACvBC,aAAab,WAAWY,KAAK,KAAK;wBAClCE,WAAW,OAAOd,WAAWY,KAAK;oBACpC;gBACF;gBAEA,oDAAoD;gBACpD,MAAM,EAAEnE,QAAQ,EAAEE,cAAc,EAAED,aAAa,EAAE,GAAGL,uBAClD2D,YACAzD,mBACAC;gBAGF,IAAIG,gBAAgB;oBAClB,kCAAkC;oBAClC,MAAMoE,mBAAmBvE,gBAAgB;wBAAE,GAAG6B,GAAG;wBAAER,QAAQrB;oBAAc,IAAI6B;oBAC7EyB,gBAAgB,MAAMzB,IAAIS,OAAO,CAACkC,MAAM,CAAC;wBACvCC,YAAYhD;wBACZ3B,MAAMG;wBACNyE,OAAOhB;wBACPiB,gBAAgB;wBAChB9C,KAAK0C;wBACLxC;oBACF;oBAEA,2BAA2B;oBAC3B,IAAIuB,iBAAiB7C,OAAOM,IAAI,CAACb,eAAeE,MAAM,GAAG,GAAG;wBAC1D,KAAK,MAAM,CAACiB,QAAQuD,WAAW,IAAInE,OAAOC,OAAO,CAACR,eAAgB;4BAChE,IAAI;gCACF,MAAM2E,YAAY;oCAAE,GAAGhD,GAAG;oCAAER;gCAAO;gCACnC,MAAMQ,IAAIS,OAAO,CAACwC,MAAM,CAAC;oCACvBrB,IAAIH,cAAcG,EAAE;oCACpBgB,YAAYhD;oCACZ3B,MAAM8E;oCACNF,OAAOhC,wBAAwB,QAAQN;oCACvCuC,gBAAgB;oCAChB9C,KAAKgD;oCACL9C;gCACF;4BACF,EAAE,OAAOgD,OAAO;gCACd,gEAAgE;gCAChElD,IAAIS,OAAO,CAAC0B,MAAM,CAACe,KAAK,CAAC;oCACvBC,KAAKD;oCACLb,KAAK,CAAC,wBAAwB,EAAE7C,OAAO,cAAc,EAAE4D,OAAO3B,cAAcG,EAAE,GAAG;gCACnF;4BACF;wBACF;oBACF;gBACF,OAAO;oBACL,wCAAwC;oBACxCH,gBAAgB,MAAMzB,IAAIS,OAAO,CAACkC,MAAM,CAAC;wBACvCC,YAAYhD;wBACZ3B,MAAM0D;wBACNkB,OAAOhB;wBACPiB,gBAAgB;wBAChB9C;wBACAE;oBACF;gBACF;YACF,OAAO,IAAIL,eAAe,YAAYA,eAAe,UAAU;gBAC7D,MAAMwD,aAAa9B,QAAQ,CAACzB,cAAc,KAAK;gBAC/C,IAAI,CAACuD,YAAY;oBACf,MAAM,IAAIC,MAAM,CAAC,aAAa,EAAExD,cAAc,KAAK,uBAAuB,CAAC;gBAC7E;gBAEA,6CAA6C;gBAC7C,6EAA6E;gBAC7E,MAAMyD,iBAAiB,AAACzD,CAAAA,cAAc,IAAG,MAAO;gBAEhD,+DAA+D;gBAC/D,+DAA+D;gBAC/D,IAAI0D;gBACJ,IAAI,OAAOH,eAAe,YAAYA,eAAe,MAAM;oBACzDG,gBAAgBC,KAAKC,SAAS,CAACL;gBACjC,OAAO,IAAI,OAAOA,eAAe,UAAU;oBACzCG,gBAAgBH;gBAClB,OAAO,IAAI,OAAOA,eAAe,UAAU;oBACzCG,gBAAgBH,WAAWM,QAAQ;gBACrC,OAAO;oBACL,sCAAsC;oBACtCH,gBAAgBC,KAAKC,SAAS,CAACL;gBACjC;gBACA,MAAMO,wBAAwB,kBAAkBC,IAAI,CAACL;gBAErD,IAAI;oBACF9B,oBAAoB,MAAM1B,IAAIS,OAAO,CAACqD,IAAI,CAAC;wBACzClB,YAAYhD;wBACZmE,OAAO;wBACPC,OAAO;wBACPlB,gBAAgB;wBAChB9C;wBACAE;wBACA+D,OAAO;4BACL,CAACnE,cAAc,KAAK,EAAE;gCACpBoE,QAAQb;4BACV;wBACF;oBACF;gBACF,EAAE,OAAOH,OAAO;oBACd,+EAA+E;oBAC/E,IAAIK,kBAAkB1D,eAAe,YAAY,CAAC+D,uBAAuB;wBACvElC,oBAAoB;4BAAEyC,MAAM,EAAE;wBAAC;oBACjC,OAAO,IAAIZ,kBAAkB1D,eAAe,YAAY,CAAC+D,uBAAuB;wBAC9E,MAAM,IAAIN,MAAM,CAAC,8BAA8B,EAAEE,eAAe;oBAClE,OAAO;wBACL,MAAMN;oBACR;gBACF;gBAEA,IAAIxB,kBAAkByC,IAAI,CAAC5F,MAAM,GAAG,GAAG;oBACrC,MAAM6F,cAAc1C,kBAAkByC,IAAI,CAAC,EAAE;oBAC7C,IAAI,CAACC,aAAa;wBAChB,MAAM,IAAId,MAAM,CAAC,kBAAkB,CAAC;oBACtC;oBAEA,2BAA2B;oBAC3B,IAAItD,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,EAAE;wBAC5BlC,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;4BACtBiC,YAAYD,YAAYxC,EAAE;4BAC1B0C,gBAAgBF,YAAYrC,OAAO;4BACnCwC,eAAeH,YAAY7B,KAAK;4BAChCiC,kBAAkBjD;4BAClBkD,MAAM5E;4BACNwC,KAAK;wBACP;oBACF;oBAEA,MAAMqC,aAAa;wBAAE,GAAGnD,QAAQ;oBAAC;oBACjC,iDAAiD;oBACjD,OAAOmD,WAAW9C,EAAE;oBACpB,OAAO8C,WAAWC,GAAG;oBACrB,OAAOD,WAAWE,SAAS;oBAC3B,OAAOF,WAAWG,SAAS;oBAE3B,oDAAoD;oBACpD,MAAM,EAAEzG,QAAQ,EAAEE,cAAc,EAAED,aAAa,EAAE,GAAGL,uBAClD0G,YACAxG,mBACAC;oBAGF,IAAI6B,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,EAAE;wBAC5BlC,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;4BACtBiC,YAAYD,YAAYxC,EAAE;4BAC1BtD;4BACAmG,MAAM5E;4BACNwC,KAAK;4BACLqC,YAAY9F,OAAOM,IAAI,CAACZ,iBAAiBF,WAAWsG,YAAYI,MAAM,CACpE,CAACC,KAAKrG;gCACJ,MAAMsG,MAAM,AAAC1G,CAAAA,iBAAiBF,WAAWsG,UAAS,CAAE,CAAChG,IAAI;gCACzDqG,GAAG,CAACrG,IAAI,GACN,OAAOsG,QAAQ,YAAYA,IAAIzG,MAAM,GAAG,KAAKyG,IAAIC,SAAS,CAAC,GAAG,MAAM,QAAQD;gCAC9E,OAAOD;4BACT,GACA,CAAC;wBAEL;oBACF;oBAEA,IAAIzG,gBAAgB;wBAClB,kCAAkC;wBAClC,MAAMoE,mBAAmBvE,gBAAgB;4BAAE,GAAG6B,GAAG;4BAAER,QAAQrB;wBAAc,IAAI6B;wBAC7EyB,gBAAgB,MAAMzB,IAAIS,OAAO,CAACwC,MAAM,CAAC;4BACvCrB,IAAIwC,YAAYxC,EAAE;4BAClBgB,YAAYhD;4BACZ3B,MAAMG;4BACN2F,OAAO;4BACP,2EAA2E;4BAC3EjB,gBAAgB;4BAChB9C,KAAK0C;4BACLxC;wBACF;wBAEA,2BAA2B;wBAC3B,IAAIuB,iBAAiB7C,OAAOM,IAAI,CAACb,eAAeE,MAAM,GAAG,GAAG;4BAC1D,KAAK,MAAM,CAACiB,QAAQuD,WAAW,IAAInE,OAAOC,OAAO,CAACR,eAAgB;gCAChE,IAAI;oCACF,6CAA6C;oCAC7C,MAAM2E,YAAY;wCAAE,GAAGhD,GAAG;wCAAER;oCAAO;oCACnC,MAAMQ,IAAIS,OAAO,CAACwC,MAAM,CAAC;wCACvBrB,IAAIwC,YAAYxC,EAAE;wCAClBgB,YAAYhD;wCACZ3B,MAAM8E;wCACNgB,OAAO;wCACP,2EAA2E;wCAC3EjB,gBAAgB;wCAChB9C,KAAKgD;wCACL9C;oCACF;gCACF,EAAE,OAAOgD,OAAO;oCACd,gEAAgE;oCAChElD,IAAIS,OAAO,CAAC0B,MAAM,CAACe,KAAK,CAAC;wCACvBC,KAAKD;wCACLb,KAAK,CAAC,wBAAwB,EAAE7C,OAAO,cAAc,EAAE4D,OAAOgB,YAAYxC,EAAE,GAAG;oCACjF;gCACF;4BACF;wBACF;oBACF,OAAO;wBACL,wCAAwC;wBACxC,IAAI;4BACF,iCAAiC;4BACjC,IAAI5B,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,EAAE;gCAC5BlC,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;oCACtBiC,YAAYD,YAAYxC,EAAE;oCAC1B2C,eAAeH,YAAY7B,KAAK;oCAChCF,KAAK;oCACL6C,SAASR;gCACX;4BACF;4BAEA,oFAAoF;4BACpF,6EAA6E;4BAC7EjD,gBAAgB,MAAMzB,IAAIS,OAAO,CAACwC,MAAM,CAAC;gCACvCrB,IAAIwC,YAAYxC,EAAE;gCAClBgB,YAAYhD;gCACZ3B,MAAMyG;gCACNX,OAAO;gCACP,2EAA2E;gCAC3EjB,gBAAgB;gCAChB9C;gCACAE;4BACF;4BAEA,IAAIF,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,IAAIT,eAAe;gCAC7CzB,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;oCACtBR,IAAIH,cAAcG,EAAE;oCACpBS,KAAK;oCACL8C,QAAQ1D,cAAcM,OAAO;oCAC7BQ,OAAOd,cAAcc,KAAK;gCAC5B;4BACF;wBACF,EAAE,OAAO6C,aAAa;4BACpBpF,IAAIS,OAAO,CAAC0B,MAAM,CAACe,KAAK,CAAC;gCACvBtB,IAAIwC,YAAYxC,EAAE;gCAClBuB,KAAKiC;gCACL/C,KAAK;4BACP;4BACA,MAAM+C;wBACR;oBACF;gBACF,OAAO,IAAIvF,eAAe,UAAU;oBAClC,4BAA4B;oBAC5B,IAAIG,IAAIS,OAAO,CAACG,MAAM,CAACsB,KAAK,EAAE;wBAC5BlC,IAAIS,OAAO,CAAC0B,MAAM,CAACC,IAAI,CAAC;4BACtBb;4BACAzB,YAAYA,cAAc;4BAC1BuD,YAAY9B,QAAQ,CAACzB,cAAc,KAAK;4BACxCuC,KAAK;wBACP;oBACF;oBAEA,MAAMV,aAAa;wBAAE,GAAGJ,QAAQ;oBAAC;oBACjC,IAAI,CAACP,kBAAkB;wBACrB,OAAOW,WAAWC,EAAE;oBACtB;oBAEA,gDAAgD;oBAChD,IAAIC;oBACJ,IAAIhB,uBAAuB;wBACzB,+DAA+D;wBAC/D,MAAMiB,cAAcH,WAAWI,OAAO,IAAIhC,QAAQiC,oBAAoB;wBACtE,MAAMC,cAAcH,gBAAgB;wBACpCD,cAAc,CAACI;wBACfN,WAAWI,OAAO,GAAGD;oBACvB;oBAEA,oDAAoD;oBACpD,MAAM,EAAE1D,QAAQ,EAAEE,cAAc,EAAED,aAAa,EAAE,GAAGL,uBAClD2D,YACAzD,mBACAC;oBAGF,IAAIG,gBAAgB;wBAClB,kCAAkC;wBAClC,MAAMoE,mBAAmBvE,gBAAgB;4BAAE,GAAG6B,GAAG;4BAAER,QAAQrB;wBAAc,IAAI6B;wBAC7EyB,gBAAgB,MAAMzB,IAAIS,OAAO,CAACkC,MAAM,CAAC;4BACvCC,YAAYhD;4BACZ3B,MAAMG;4BACNyE,OAAOhB;4BACPiB,gBAAgB;4BAChB9C,KAAK0C;4BACLxC;wBACF;wBAEA,2BAA2B;wBAC3B,IAAIuB,iBAAiB7C,OAAOM,IAAI,CAACb,eAAeE,MAAM,GAAG,GAAG;4BAC1D,KAAK,MAAM,CAACiB,QAAQuD,WAAW,IAAInE,OAAOC,OAAO,CAACR,eAAgB;gCAChE,IAAI;oCACF,6CAA6C;oCAC7C,MAAM2E,YAAY;wCAAE,GAAGhD,GAAG;wCAAER;oCAAO;oCACnC,MAAMQ,IAAIS,OAAO,CAACwC,MAAM,CAAC;wCACvBrB,IAAIH,cAAcG,EAAE;wCACpBgB,YAAYhD;wCACZ3B,MAAM8E;wCACNF,OAAOhC,wBAAwB,QAAQN;wCACvCuC,gBAAgB;wCAChB9C,KAAKgD;oCACP;gCACF,EAAE,OAAOE,OAAO;oCACd,gEAAgE;oCAChElD,IAAIS,OAAO,CAAC0B,MAAM,CAACe,KAAK,CAAC;wCACvBC,KAAKD;wCACLb,KAAK,CAAC,wBAAwB,EAAE7C,OAAO,cAAc,EAAE4D,OAAO3B,cAAcG,EAAE,GAAG;oCACnF;gCACF;4BACF;wBACF;oBACF,OAAO;wBACL,wCAAwC;wBACxCH,gBAAgB,MAAMzB,IAAIS,OAAO,CAACkC,MAAM,CAAC;4BACvCC,YAAYhD;4BACZ3B,MAAM0D;4BACNkB,OAAOhB;4BACPiB,gBAAgB;4BAChB9C;4BACAE;wBACF;oBACF;gBACF,OAAO;oBACL,qCAAqC;oBACrC,IAAImF;oBACJ,IAAI,OAAOhC,eAAe,YAAYA,eAAe,MAAM;wBACzDgC,oBAAoB5B,KAAKC,SAAS,CAACL;oBACrC,OAAO,IAAI,OAAOA,eAAe,UAAU;wBACzCgC,oBAAoBhC;oBACtB,OAAO,IAAI,OAAOA,eAAe,UAAU;wBACzCgC,oBAAoBhC,WAAWM,QAAQ;oBACzC,OAAO;wBACL,+DAA+D;wBAC/D0B,oBAAoB5B,KAAKC,SAAS,CAACL;oBACrC;oBACA,MAAM,IAAIC,MAAM,CAAC,cAAc,EAAExD,cAAc,KAAK,EAAE,EAAEuF,kBAAkB,WAAW,CAAC;gBACxF;YACF,OAAO;gBACL,MAAM,IAAI/B,MAAM,CAAC,qBAAqB,EAAEF,OAAOvD,aAAa;YAC9D;YAEA,IAAI4B,eAAe;gBACjB,+CAA+C;gBAC/C,IAAI6D;gBACJ,IAAIzF,eAAe,UAAU;oBAC3ByF,YAAY;gBACd,OAAO,IAAIzF,eAAe,UAAU;oBAClCyF,YAAY;gBACd,OAAO,IAAIzF,eAAe,UAAU;oBAClC,IAAI6B,qBAAqBA,kBAAkByC,IAAI,CAAC5F,MAAM,GAAG,GAAG;wBAC1D+G,YAAY;oBACd,OAAO;wBACLA,YAAY;oBACd;gBACF;gBAEAnF,OAAOE,UAAU,CAACkF,IAAI,CAAC;oBACrBhE;oBACAiE,OAAOhE,YAAY;oBACnB8D;oBACAnF,QAAQsB;gBACV;YACF;QACF,EAAE,OAAOyB,OAAO;YACd,MAAMuC,cAA2B;gBAC/BC,MAAM7H,gBAAgBqF;gBACtByC,cAAcpE,YAAY,CAAC;gBAC3B2B,OAAOnF,oBAAoBmF;gBAC3B0C,MAAMrE,YAAY,CAAC;gBACnBsE,WAAWrE,YAAY;gBACvBA;YACF;YAEA,0DAA0D;YAC1D,IAAI0B,SAAS,OAAOA,UAAU,YAAY,UAAUA,OAAO;gBACzD,MAAM4C,YAAY5C;gBAClB,IAAI4C,UAAU7H,IAAI,EAAE8H,UAAUjH,MAAMC,OAAO,CAAC+G,UAAU7H,IAAI,CAAC8H,MAAM,GAAG;oBAClE,MAAMC,aAAaF,UAAU7H,IAAI,CAAC8H,MAAM,CAAC,EAAE;oBAC3C,IAAIC,YAAYC,MAAM;wBACpBR,YAAYS,KAAK,GAAGF,WAAWC,IAAI;oBACrC;gBACF;YACF;YAEA9F,OAAOC,MAAM,CAACmF,IAAI,CAACE;QACnB,sCAAsC;QACxC;IACF;IAEA,OAAOtF;AACT;AAEA,OAAO,SAASgG,2BAA2BpG,UAAuC,CAAC,CAAC;IAClF,MAAMqG,mBAAmB;QACvB/E,WAAWtB,QAAQsB,SAAS,IAAI;QAChCW,sBAAsBjC,QAAQiC,oBAAoB,IAAI;IACxD;IAEA,MAAMqE,gBAAgB,OAAOC;QAC3B,MAAM,EAAE1G,cAAc,EAAE2G,SAAS,EAAE1G,UAAU,EAAEC,UAAU,EAAEE,GAAG,EAAEE,IAAI,EAAE,GAAGoG;QACzE,MAAME,UAAU1I,cAAcyI,WAAWH,iBAAiB/E,SAAS;QAEnE,MAAMlB,SAAuB;YAC3B4F,QAAQ,EAAE;YACVU,UAAU;YACVC,OAAOH,UAAUhI,MAAM;YACvBoI,SAAS;QACX;QAEA,IAAK,IAAIrF,IAAI,GAAGA,IAAIkF,QAAQjI,MAAM,EAAE+C,IAAK;YACvC,MAAMsF,eAAeJ,OAAO,CAAClF,EAAE;YAC/B,IAAI,CAACsF,cAAc;gBACjB;YACF;YAEA,MAAMC,cAAc,MAAMpH,mBAAmB;gBAC3CC,OAAOkH;gBACPjH,YAAY2B;gBACZ1B;gBACAC;gBACAC;gBACAC,SAASqG;gBACTpG;gBACAE;YACF;YAEA,iBAAiB;YACjB,KAAK,MAAM4G,WAAWD,YAAYxG,UAAU,CAAE;gBAC5C,IAAIyG,QAAQxB,SAAS,KAAK,WAAW;oBACnCnF,OAAOsG,QAAQ;gBACjB,OAAO,IAAIK,QAAQxB,SAAS,KAAK,WAAW;oBAC1CnF,OAAOwG,OAAO;gBAChB,OAAO;oBACL,WAAW;oBACX,IAAI9G,eAAe,UAAU;wBAC3BM,OAAOsG,QAAQ;oBACjB,OAAO;wBACLtG,OAAOwG,OAAO;oBAChB;gBACF;YACF;YAEA,KAAK,MAAMzD,SAAS2D,YAAYzG,MAAM,CAAE;gBACtCD,OAAO4F,MAAM,CAACR,IAAI,CAAC;oBACjBwB,KAAK7D,MAAMyC,YAAY;oBACvBzC,OAAOA,MAAMA,KAAK;oBAClBsC,OAAOtC,MAAM1B,SAAS,GAAG;gBAC3B;YACF;QACF;QAEA,OAAOrB;IACT;IAEA,OAAO;QACLkG;IACF;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../src/import/batchProcessor.ts"],"sourcesContent":["import type { PayloadRequest, User } from 'payload'\n\nimport { getDataLoader, isolateObjectProperty } from 'payload'\n\nimport type { ImportAfterHook, ImportBeforeHook, ImportDoc, ImportResult } from '../types.js'\nimport type { ImportMode } from './createImport.js'\n\nimport {\n type BatchError,\n categorizeError,\n createBatches,\n extractErrorMessage,\n} from '../utilities/useBatchProcessor.js'\n\n/**\n * Import-specific batch processor options\n */\nexport interface ImportBatchProcessorOptions {\n batchSize?: number\n defaultVersionStatus?: 'draft' | 'published'\n}\n\n/**\n * Import-specific error type extending the generic BatchError\n */\nexport interface ImportError extends BatchError<Record<string, unknown>> {\n documentData: Record<string, unknown>\n field?: string\n fieldLabel?: string\n rowNumber: number // 1-indexed for user clarity\n}\n\n/**\n * Result from processing a single import batch\n */\nexport interface ImportBatchResult {\n failed: Array<ImportError>\n successful: Array<{\n document: Record<string, unknown>\n index: number\n operation?: 'created' | 'updated'\n result: Record<string, unknown>\n }>\n}\n\n/**\n * Options for processing an import operation\n */\nexport interface ImportProcessOptions {\n collectionSlug: string\n docs: Record<string, unknown>[]\n /** Export format — passed through to hook args */\n format?: 'csv' | 'json'\n /** Lifecycle hooks for this import operation */\n hooks?: {\n after?: ImportAfterHook\n before?: ImportBeforeHook\n }\n importDoc: ImportDoc\n importMode: ImportMode\n matchField?: string\n /** Raw parsed rows before unflattening — used as originalData in hooks */\n originalDocs?: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches (pre-computed for hook args) */\n totalBatches?: number\n user?: User\n}\n\n/**\n * Separates multi-locale data from a document for sequential locale updates.\n *\n * When a field has locale-keyed values (e.g., { title: { en: 'Hello', es: 'Hola' } }),\n * this extracts the default locale's data for initial create/update, and stores\n * remaining locales for subsequent update calls.\n *\n * @returns\n * - flatData: Document with default locale values extracted (for initial operation)\n * - hasMultiLocale: Whether any multi-locale fields were found\n * - localeUpdates: Map of locale -> field data for follow-up updates\n */\nfunction extractMultiLocaleData(\n data: Record<string, unknown>,\n configuredLocales?: string[],\n defaultLocale?: string,\n): {\n flatData: Record<string, unknown>\n hasMultiLocale: boolean\n localeUpdates: Record<string, Record<string, unknown>>\n} {\n const flatData: Record<string, unknown> = {}\n const localeUpdates: Record<string, Record<string, unknown>> = {}\n let hasMultiLocale = false\n\n if (!configuredLocales || configuredLocales.length === 0) {\n return { flatData: { ...data }, hasMultiLocale: false, localeUpdates: {} }\n }\n\n const localeSet = new Set(configuredLocales)\n\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueObj = value as Record<string, unknown>\n const localeKeys = Object.keys(valueObj).filter((k) => localeSet.has(k))\n\n if (localeKeys.length > 0) {\n hasMultiLocale = true\n const baseLocale =\n defaultLocale && localeKeys.includes(defaultLocale) ? defaultLocale : localeKeys[0]\n if (baseLocale) {\n flatData[key] = valueObj[baseLocale]\n for (const locale of localeKeys) {\n if (locale !== baseLocale) {\n if (!localeUpdates[locale]) {\n localeUpdates[locale] = {}\n }\n localeUpdates[locale][key] = valueObj[locale]\n }\n }\n }\n } else {\n flatData[key] = value\n }\n } else {\n flatData[key] = value\n }\n }\n\n return { flatData, hasMultiLocale, localeUpdates }\n}\n\ntype ProcessImportBatchOptions = {\n batch: Record<string, unknown>[]\n batchIndex: number\n collectionSlug: string\n importMode: ImportMode\n matchField: string | undefined\n options: { batchSize: number; defaultVersionStatus: 'draft' | 'published' }\n req: PayloadRequest\n user?: User\n}\n\n/**\n * Processes a batch of documents for import based on the import mode.\n *\n * For each document in the batch:\n * - create: Creates a new document (removes any existing ID)\n * - update: Finds existing document by matchField and updates it\n * - upsert: Updates if found, creates if not found\n *\n * Handles versioned collections, multi-locale data, and MongoDB ObjectID validation.\n * Continues processing remaining documents even if individual imports fail.\n */\nasync function processImportBatch({\n batch,\n batchIndex,\n collectionSlug,\n importMode,\n matchField,\n options,\n req: reqFromArgs,\n user,\n}: ProcessImportBatchOptions): Promise<ImportBatchResult> {\n const result: ImportBatchResult = {\n failed: [],\n successful: [],\n }\n // Isolate + clear `transactionID` so a failing nested op (e.g. Forbidden) kills its own\n // transaction, not the parent's, on `killTransaction`.\n // Also isolate `payloadDataLoader`: the shared loader mutates the parent's `req.transactionID`\n // while batching relationship population (`batchAndLoadDocs`), so populating a nested doc's\n // relationship (e.g. authorship `createdBy`/`updatedBy`) would leak the nested transaction onto\n // the parent. A fresh loader keeps each request's transaction isolated.\n const req = isolateObjectProperty(reqFromArgs, ['payloadDataLoader', 'transactionID'])\n req.transactionID = undefined\n req.payloadDataLoader = getDataLoader(req)\n\n const collectionEntry = req.payload.collections[collectionSlug]\n\n const collectionConfig = collectionEntry?.config\n const collectionHasVersions = Boolean(collectionConfig?.versions)\n const hasCustomIdField = Boolean(collectionEntry?.customIDType)\n\n const configuredLocales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n const defaultLocale = req.payload.config.localization\n ? req.payload.config.localization.defaultLocale\n : undefined\n\n const startingRowNumber = batchIndex * options.batchSize\n\n for (let i = 0; i < batch.length; i++) {\n const document = batch[i]\n if (!document) {\n continue\n }\n const rowNumber = startingRowNumber + i + 1\n\n try {\n let savedDocument: Record<string, unknown> | undefined\n let existingDocResult: { docs: Array<Record<string, unknown>> } | undefined\n\n if (importMode === 'create') {\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n _status: createData._status,\n isPublished,\n msg: 'Status handling in create',\n willSetDraft: draftOption,\n })\n }\n }\n\n if (req.payload.config.debug && 'title' in createData) {\n req.payload.logger.info({\n msg: 'Creating document',\n title: createData.title,\n titleIsNull: createData.title === null,\n titleType: typeof createData.title,\n })\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else if (importMode === 'update' || importMode === 'upsert') {\n const matchValue = document[matchField || 'id']\n if (!matchValue) {\n throw new Error(`Match field \"${matchField || 'id'}\" not found in document`)\n }\n\n // Special handling for ID field with MongoDB\n // If matching by 'id' and it's not a valid ObjectID format, handle specially\n const isMatchingById = (matchField || 'id') === 'id'\n\n // Check if it's a valid MongoDB ObjectID format (24 hex chars)\n // Note: matchValue could be string, number, or ObjectID object\n let matchValueStr: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueStr = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueStr = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueStr = matchValue.toString()\n } else {\n // For other types, use JSON.stringify\n matchValueStr = JSON.stringify(matchValue)\n }\n const isValidObjectIdFormat = /^[0-9a-f]{24}$/i.test(matchValueStr)\n\n try {\n existingDocResult = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n user,\n where: {\n [matchField || 'id']: {\n equals: matchValue,\n },\n },\n })\n } catch (error) {\n // MongoDB may throw for invalid ObjectID format - handle gracefully for upsert\n if (isMatchingById && importMode === 'upsert' && !isValidObjectIdFormat) {\n existingDocResult = { docs: [] }\n } else if (isMatchingById && importMode === 'update' && !isValidObjectIdFormat) {\n throw new Error(`Invalid ID format for update: ${matchValueStr}`)\n } else {\n throw error\n }\n }\n\n if (existingDocResult.docs.length > 0) {\n const existingDoc = existingDocResult.docs[0]\n if (!existingDoc) {\n throw new Error(`Document not found`)\n }\n\n // Debug: log what we found\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingStatus: existingDoc._status,\n existingTitle: existingDoc.title,\n incomingDocument: document,\n mode: importMode,\n msg: 'Found existing document for update',\n })\n }\n\n const updateData = { ...document }\n // Remove ID and internal fields from update data\n delete updateData.id\n delete updateData._id\n delete updateData.createdAt\n delete updateData.updatedAt\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n updateData,\n configuredLocales,\n defaultLocale,\n )\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n hasMultiLocale,\n mode: importMode,\n msg: 'Updating document in upsert/update mode',\n updateData: Object.keys(hasMultiLocale ? flatData : updateData).reduce(\n (acc, key) => {\n const val = (hasMultiLocale ? flatData : updateData)[key]\n acc[key] =\n typeof val === 'string' && val.length > 50 ? val.substring(0, 50) + '...' : val\n return acc\n },\n {} as Record<string, unknown>,\n ),\n })\n }\n\n if (hasMultiLocale) {\n // Update with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: flatData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n depth: 0,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(existingDoc.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, update normally\n try {\n // Extra debug: log before update\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingTitle: existingDoc.title,\n msg: 'About to update document',\n newData: updateData,\n })\n }\n\n // Update the document - don't specify draft to let Payload handle versions properly\n // This will create a new draft version for collections with versions enabled\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: updateData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req,\n user,\n })\n\n if (req.payload.config.debug && savedDocument) {\n req.payload.logger.info({\n id: savedDocument.id,\n msg: 'Update completed',\n status: savedDocument._status,\n title: savedDocument.title,\n })\n }\n } catch (updateError) {\n req.payload.logger.error({\n id: existingDoc.id,\n err: updateError,\n msg: 'Update failed',\n })\n throw updateError\n }\n }\n } else if (importMode === 'upsert') {\n // Create new in upsert mode\n if (req.payload.config.debug) {\n req.payload.logger.info({\n document,\n matchField: matchField || 'id',\n matchValue: document[matchField || 'id'],\n msg: 'No existing document found, creating new in upsert mode',\n })\n }\n\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n // Only handle _status for versioned collections\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n // Use defaultVersionStatus from config if _status not provided\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else {\n // Update mode but document not found\n let matchValueDisplay: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueDisplay = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueDisplay = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueDisplay = matchValue.toString()\n } else {\n // For other types, use JSON.stringify to avoid [object Object]\n matchValueDisplay = JSON.stringify(matchValue)\n }\n throw new Error(`Document with ${matchField || 'id'}=\"${matchValueDisplay}\" not found`)\n }\n } else {\n throw new Error(`Unknown import mode: ${String(importMode)}`)\n }\n\n if (savedDocument) {\n // Determine operation type for proper counting\n let operation: 'created' | 'updated' | undefined\n if (importMode === 'create') {\n operation = 'created'\n } else if (importMode === 'update') {\n operation = 'updated'\n } else if (importMode === 'upsert') {\n if (existingDocResult && existingDocResult.docs.length > 0) {\n operation = 'updated'\n } else {\n operation = 'created'\n }\n }\n\n result.successful.push({\n document,\n index: rowNumber - 1, // Store as 0-indexed\n operation,\n result: savedDocument,\n })\n }\n } catch (error) {\n const importError: ImportError = {\n type: categorizeError(error),\n documentData: document || {},\n error: extractErrorMessage(error),\n item: document || {},\n itemIndex: rowNumber - 1,\n rowNumber,\n }\n\n // Try to extract field information from validation errors\n if (error && typeof error === 'object' && 'data' in error) {\n const errorData = error as { data?: { errors?: Array<{ path?: string }> } }\n if (errorData.data?.errors && Array.isArray(errorData.data.errors)) {\n const firstError = errorData.data.errors[0]\n if (firstError?.path) {\n importError.field = firstError.path\n }\n }\n }\n\n result.failed.push(importError)\n // Always continue processing all rows\n }\n }\n\n return result\n}\n\nexport function createImportBatchProcessor(options: ImportBatchProcessorOptions = {}) {\n const processorOptions = {\n batchSize: options.batchSize ?? 100,\n defaultVersionStatus: options.defaultVersionStatus ?? 'published',\n }\n\n const processImport = async (processOptions: ImportProcessOptions): Promise<ImportResult> => {\n const {\n collectionSlug,\n docs: documents,\n format = 'csv',\n hooks,\n importDoc,\n importMode,\n matchField,\n originalDocs: originalDocs,\n req,\n totalBatches: totalBatchesFromOptions,\n user,\n } = processOptions\n const batches = createBatches(documents, processorOptions.batchSize)\n const totalBatches = totalBatchesFromOptions ?? batches.length\n\n const result: ImportResult = {\n errors: [],\n imported: 0,\n total: documents.length,\n updated: 0,\n }\n\n for (let i = 0; i < batches.length; i++) {\n const currentBatch = batches[i]\n if (!currentBatch) {\n continue\n }\n\n const batchNumber = i + 1\n const batchStart = i * processorOptions.batchSize\n const originalBatch = originalDocs\n ? originalDocs.slice(batchStart, batchStart + currentBatch.length)\n : currentBatch\n\n const batchToProcess: Record<string, unknown>[] =\n hooks?.before && currentBatch.length > 0\n ? ((await hooks.before({\n batchNumber,\n data: currentBatch as Parameters<ImportBeforeHook>[0]['data'],\n format,\n importDoc,\n originalData: originalBatch,\n req,\n totalBatches,\n })) as Record<string, unknown>[])\n : currentBatch\n\n const batchResult = await processImportBatch({\n batch: batchToProcess,\n batchIndex: i,\n collectionSlug,\n importMode,\n matchField,\n options: processorOptions,\n req,\n user,\n })\n\n let batchImported = 0\n let batchUpdated = 0\n for (const success of batchResult.successful) {\n if (success.operation === 'created') {\n result.imported++\n batchImported++\n } else if (success.operation === 'updated') {\n result.updated++\n batchUpdated++\n } else {\n // Fallback\n if (importMode === 'create') {\n result.imported++\n batchImported++\n } else {\n result.updated++\n batchUpdated++\n }\n }\n }\n\n for (const error of batchResult.failed) {\n result.errors.push({\n doc: error.documentData,\n error: error.error,\n index: error.rowNumber - 1, // Convert back to 0-indexed\n })\n }\n\n if (hooks?.after) {\n const batchHookResult: ImportResult = {\n errors:\n batchResult.failed.length > 0 ? result.errors.slice(-batchResult.failed.length) : [],\n imported: batchImported,\n total: batchToProcess.length,\n updated: batchUpdated,\n }\n await hooks.after({\n batchNumber,\n format,\n importDoc,\n originalData: originalBatch,\n req,\n result: batchHookResult,\n totalBatches,\n })\n }\n }\n\n return result\n }\n\n return {\n processImport,\n }\n}\n"],"names":["getDataLoader","isolateObjectProperty","categorizeError","createBatches","extractErrorMessage","extractMultiLocaleData","data","configuredLocales","defaultLocale","flatData","localeUpdates","hasMultiLocale","length","localeSet","Set","key","value","Object","entries","Array","isArray","valueObj","localeKeys","keys","filter","k","has","baseLocale","includes","locale","processImportBatch","batch","batchIndex","collectionSlug","importMode","matchField","options","req","reqFromArgs","user","result","failed","successful","transactionID","undefined","payloadDataLoader","collectionEntry","payload","collections","collectionConfig","config","collectionHasVersions","Boolean","versions","hasCustomIdField","customIDType","localization","localeCodes","startingRowNumber","batchSize","i","document","rowNumber","savedDocument","existingDocResult","createData","id","draftOption","statusValue","_status","defaultVersionStatus","isPublished","debug","logger","info","msg","willSetDraft","title","titleIsNull","titleType","defaultLocaleReq","create","collection","draft","overrideAccess","localeData","update","error","err","String","matchValue","Error","isMatchingById","matchValueStr","JSON","stringify","toString","isValidObjectIdFormat","test","find","depth","limit","where","equals","docs","existingDoc","existingId","existingStatus","existingTitle","incomingDocument","mode","updateData","_id","createdAt","updatedAt","reduce","acc","val","substring","newData","status","updateError","matchValueDisplay","operation","push","index","importError","type","documentData","item","itemIndex","errorData","errors","firstError","path","field","createImportBatchProcessor","processorOptions","processImport","processOptions","documents","format","hooks","importDoc","originalDocs","totalBatches","totalBatchesFromOptions","batches","imported","total","updated","currentBatch","batchNumber","batchStart","originalBatch","slice","batchToProcess","before","originalData","batchResult","batchImported","batchUpdated","success","doc","after","batchHookResult"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PayloadRequest } from 'payload';
|
|
2
|
+
import type { ImportDoc, ImportResult } from '../types.js';
|
|
2
3
|
export type ImportMode = 'create' | 'update' | 'upsert';
|
|
3
4
|
export type Import = {
|
|
4
5
|
/**
|
|
@@ -34,17 +35,8 @@ export type Import = {
|
|
|
34
35
|
};
|
|
35
36
|
export type CreateImportArgs = {
|
|
36
37
|
defaultVersionStatus?: 'draft' | 'published';
|
|
38
|
+
importDoc: ImportDoc;
|
|
37
39
|
req: PayloadRequest;
|
|
38
40
|
} & Import;
|
|
39
|
-
export
|
|
40
|
-
errors: Array<{
|
|
41
|
-
doc: Record<string, unknown>;
|
|
42
|
-
error: string;
|
|
43
|
-
index: number;
|
|
44
|
-
}>;
|
|
45
|
-
imported: number;
|
|
46
|
-
total: number;
|
|
47
|
-
updated: number;
|
|
48
|
-
};
|
|
49
|
-
export declare const createImport: ({ batchSize, collectionSlug, debug, defaultVersionStatus, file, format, importMode, matchField, maxLimit, req, userCollection, userID, }: CreateImportArgs) => Promise<ImportResult>;
|
|
41
|
+
export declare const createImport: ({ batchSize, collectionSlug, debug, defaultVersionStatus, file, format, importDoc, importMode, matchField, maxLimit, req, userCollection, userID, }: CreateImportArgs) => Promise<ImportResult>;
|
|
50
42
|
//# sourceMappingURL=createImport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createImport.d.ts","sourceRoot":"","sources":["../../src/import/createImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"createImport.d.ts","sourceRoot":"","sources":["../../src/import/createImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAQ,MAAM,SAAS,CAAA;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU1D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEvD,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,SAAS,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,YAAY,wJActB,gBAAgB,KAAG,OAAO,CAAC,YAAY,CA+LzC,CAAA"}
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import { APIError } from 'payload';
|
|
2
|
+
import { applyFieldHooks } from '../utilities/applyFieldHooks.js';
|
|
2
3
|
import { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js';
|
|
3
4
|
import { parseCSV } from '../utilities/parseCSV.js';
|
|
4
5
|
import { parseJSON } from '../utilities/parseJSON.js';
|
|
5
6
|
import { removeDisabledFields } from '../utilities/removeDisabledFields.js';
|
|
6
7
|
import { unflattenObject } from '../utilities/unflattenObject.js';
|
|
7
8
|
import { createImportBatchProcessor } from './batchProcessor.js';
|
|
8
|
-
export const createImport = async ({ batchSize = 100, collectionSlug, debug = false, defaultVersionStatus = 'published', file, format, importMode = 'create', matchField = 'id', maxLimit, req, userCollection, userID })=>{
|
|
9
|
+
export const createImport = async ({ batchSize = 100, collectionSlug, debug = false, defaultVersionStatus = 'published', file, format, importDoc, importMode = 'create', matchField = 'id', maxLimit, req, userCollection, userID })=>{
|
|
9
10
|
let user;
|
|
10
11
|
if (userCollection && userID) {
|
|
11
12
|
user = await req.payload.findByID({
|
|
12
13
|
id: userID,
|
|
13
14
|
collection: userCollection,
|
|
15
|
+
overrideAccess: true,
|
|
14
16
|
req
|
|
15
17
|
});
|
|
18
|
+
if (user) {
|
|
19
|
+
// `findByID` omits the runtime `collection` property; restore it so downstream
|
|
20
|
+
// writes (e.g. authorship tracking) know which auth collection the user belongs to.
|
|
21
|
+
user.collection = userCollection;
|
|
22
|
+
}
|
|
16
23
|
}
|
|
17
24
|
if (!user) {
|
|
18
25
|
throw new APIError('User is required for import operations', 401, null, true);
|
|
@@ -23,7 +30,7 @@ export const createImport = async ({ batchSize = 100, collectionSlug, debug = fa
|
|
|
23
30
|
format,
|
|
24
31
|
importMode,
|
|
25
32
|
matchField,
|
|
26
|
-
|
|
33
|
+
msg: 'Starting import process with args:',
|
|
27
34
|
transactionID: req.transactionID
|
|
28
35
|
});
|
|
29
36
|
}
|
|
@@ -37,8 +44,8 @@ export const createImport = async ({ batchSize = 100, collectionSlug, debug = fa
|
|
|
37
44
|
req.payload.logger.debug({
|
|
38
45
|
fileName: file.name,
|
|
39
46
|
fileSize: file.data.length,
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
mimeType: file.mimetype,
|
|
48
|
+
msg: 'File info'
|
|
42
49
|
});
|
|
43
50
|
}
|
|
44
51
|
const collectionConfig = req.payload.config.collections.find(({ slug })=>slug === collectionSlug);
|
|
@@ -50,89 +57,64 @@ export const createImport = async ({ batchSize = 100, collectionSlug, debug = fa
|
|
|
50
57
|
}
|
|
51
58
|
// Get disabled fields configuration
|
|
52
59
|
const disabledFields = collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? [];
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
const importHooks = collectionConfig.custom?.['plugin-import-export']?.importHooks;
|
|
61
|
+
// Get beforeImport functions for field transformations
|
|
62
|
+
const importFieldHooks = getImportFieldFunctions({
|
|
55
63
|
fields: collectionConfig.flattenedFields || []
|
|
56
64
|
});
|
|
57
65
|
// Parse the file data
|
|
66
|
+
let originalDocs;
|
|
58
67
|
let documents;
|
|
59
68
|
if (format === 'csv') {
|
|
60
69
|
const rawData = await parseCSV({
|
|
61
70
|
data: file.data,
|
|
62
71
|
req
|
|
63
72
|
});
|
|
64
|
-
|
|
65
|
-
if (debug && rawData.length > 0) {
|
|
66
|
-
req.payload.logger.info({
|
|
67
|
-
firstRow: rawData[0],
|
|
68
|
-
msg: 'Parsed CSV data - FULL'
|
|
69
|
-
});
|
|
70
|
-
req.payload.logger.info({
|
|
71
|
-
msg: 'Parsed CSV data',
|
|
72
|
-
rows: rawData.map((row, i)=>({
|
|
73
|
-
excerpt: row.excerpt,
|
|
74
|
-
hasManyNumber: row.hasManyNumber,
|
|
75
|
-
hasOnePolymorphic_id: row.hasOnePolymorphic_id,
|
|
76
|
-
hasOnePolymorphic_relationTo: row.hasOnePolymorphic_relationTo,
|
|
77
|
-
index: i,
|
|
78
|
-
title: row.title
|
|
79
|
-
}))
|
|
80
|
-
});
|
|
81
|
-
}
|
|
73
|
+
originalDocs = rawData;
|
|
82
74
|
documents = rawData;
|
|
83
75
|
// Unflatten CSV data
|
|
84
76
|
documents = documents.map((doc)=>{
|
|
85
77
|
const unflattened = unflattenObject({
|
|
86
78
|
data: doc,
|
|
87
79
|
fields: collectionConfig.flattenedFields ?? [],
|
|
88
|
-
|
|
80
|
+
format,
|
|
81
|
+
importFieldHooks,
|
|
89
82
|
req
|
|
90
83
|
});
|
|
91
84
|
return unflattened ?? {};
|
|
92
85
|
}).filter((doc)=>doc && Object.keys(doc).length > 0);
|
|
93
|
-
// Debug after unflatten
|
|
94
|
-
if (debug && documents.length > 0) {
|
|
95
|
-
req.payload.logger.info({
|
|
96
|
-
msg: 'After unflatten',
|
|
97
|
-
rows: documents.map((row, i)=>({
|
|
98
|
-
hasManyNumber: row.hasManyNumber,
|
|
99
|
-
hasManyPolymorphic: row.hasManyPolymorphic,
|
|
100
|
-
hasOnePolymorphic: row.hasOnePolymorphic,
|
|
101
|
-
hasTitle: 'title' in row,
|
|
102
|
-
index: i,
|
|
103
|
-
title: row.title
|
|
104
|
-
}))
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
86
|
if (debug) {
|
|
108
87
|
req.payload.logger.debug({
|
|
109
88
|
documentCount: documents.length,
|
|
110
|
-
|
|
89
|
+
msg: 'After unflattening CSV',
|
|
111
90
|
rawDataCount: rawData.length
|
|
112
91
|
});
|
|
113
|
-
// Debug: show a sample of raw vs unflattened
|
|
114
|
-
if (rawData.length > 0 && documents.length > 0) {
|
|
115
|
-
req.payload.logger.debug({
|
|
116
|
-
message: 'Sample data transformation',
|
|
117
|
-
raw: Object.keys(rawData[0] || {}).filter((k)=>k.includes('localized')),
|
|
118
|
-
unflattened: JSON.stringify(documents[0], null, 2)
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
92
|
}
|
|
122
93
|
} else {
|
|
123
|
-
|
|
94
|
+
const parsedDocs = parseJSON({
|
|
124
95
|
data: file.data,
|
|
125
96
|
req
|
|
126
97
|
});
|
|
98
|
+
originalDocs = parsedDocs;
|
|
99
|
+
// Apply field-level import hooks for JSON format
|
|
100
|
+
documents = parsedDocs.map((doc)=>applyFieldHooks({
|
|
101
|
+
type: 'beforeImport',
|
|
102
|
+
data: doc,
|
|
103
|
+
fieldHooks: importFieldHooks,
|
|
104
|
+
fields: collectionConfig.flattenedFields ?? [],
|
|
105
|
+
format,
|
|
106
|
+
operation: 'import',
|
|
107
|
+
req
|
|
108
|
+
}));
|
|
127
109
|
}
|
|
128
110
|
if (debug) {
|
|
129
111
|
req.payload.logger.debug({
|
|
130
|
-
|
|
112
|
+
msg: `Parsed ${documents.length} documents from ${format} file`
|
|
131
113
|
});
|
|
132
114
|
if (documents.length > 0) {
|
|
133
115
|
req.payload.logger.debug({
|
|
134
116
|
doc: documents[0],
|
|
135
|
-
|
|
117
|
+
msg: 'First document sample:'
|
|
136
118
|
});
|
|
137
119
|
}
|
|
138
120
|
}
|
|
@@ -148,7 +130,7 @@ export const createImport = async ({ batchSize = 100, collectionSlug, debug = fa
|
|
|
148
130
|
req.payload.logger.debug({
|
|
149
131
|
batchSize,
|
|
150
132
|
documentCount: documents.length,
|
|
151
|
-
|
|
133
|
+
msg: 'Processing import in batches'
|
|
152
134
|
});
|
|
153
135
|
}
|
|
154
136
|
// Create batch processor
|
|
@@ -156,20 +138,26 @@ export const createImport = async ({ batchSize = 100, collectionSlug, debug = fa
|
|
|
156
138
|
batchSize,
|
|
157
139
|
defaultVersionStatus
|
|
158
140
|
});
|
|
141
|
+
const totalBatches = documents.length > 0 ? Math.ceil(documents.length / batchSize) : 1;
|
|
159
142
|
// Process import with batch processor
|
|
160
143
|
const result = await processor.processImport({
|
|
161
144
|
collectionSlug,
|
|
162
|
-
documents,
|
|
145
|
+
docs: documents,
|
|
146
|
+
format,
|
|
147
|
+
hooks: importHooks,
|
|
148
|
+
importDoc,
|
|
163
149
|
importMode,
|
|
164
150
|
matchField,
|
|
151
|
+
originalDocs,
|
|
165
152
|
req,
|
|
153
|
+
totalBatches,
|
|
166
154
|
user
|
|
167
155
|
});
|
|
168
156
|
if (debug) {
|
|
169
157
|
req.payload.logger.info({
|
|
170
158
|
errors: result.errors.length,
|
|
171
159
|
imported: result.imported,
|
|
172
|
-
|
|
160
|
+
msg: 'Import completed',
|
|
173
161
|
total: result.total,
|
|
174
162
|
updated: result.updated
|
|
175
163
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/import/createImport.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js'\nimport { parseCSV } from '../utilities/parseCSV.js'\nimport { parseJSON } from '../utilities/parseJSON.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { unflattenObject } from '../utilities/unflattenObject.js'\nimport { createImportBatchProcessor } from './batchProcessor.js'\n\nexport type ImportMode = 'create' | 'update' | 'upsert'\n\nexport type Import = {\n /**\n * Number of documents to process in each batch during import\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enabled debug logging\n */\n debug?: boolean\n file?: {\n data: Buffer\n mimetype: string\n name: string\n }\n format: 'csv' | 'json'\n id?: number | string\n /**\n * Import mode: create, update or upset\n */\n importMode: ImportMode\n matchField?: string\n /**\n * Maximum number of documents that can be imported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n userCollection?: string\n userID?: number | string\n}\n\nexport type CreateImportArgs = {\n defaultVersionStatus?: 'draft' | 'published'\n req: PayloadRequest\n} & Import\n\nexport type ImportResult = {\n errors: Array<{\n doc: Record<string, unknown>\n error: string\n index: number\n }>\n imported: number\n total: number\n updated: number\n}\n\nexport const createImport = async ({\n batchSize = 100,\n collectionSlug,\n debug = false,\n defaultVersionStatus = 'published',\n file,\n format,\n importMode = 'create',\n matchField = 'id',\n maxLimit,\n req,\n userCollection,\n userID,\n}: CreateImportArgs): Promise<ImportResult> => {\n let user: TypedUser | undefined\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n req,\n })) as TypedUser\n }\n\n if (!user) {\n throw new APIError('User is required for import operations', 401, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n collectionSlug,\n format,\n importMode,\n matchField,\n message: 'Starting import process with args:',\n transactionID: req.transactionID, // Log transaction ID to verify we're in same transaction\n })\n }\n\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n\n if (!file || !file?.data) {\n throw new APIError('No file data provided for import', 400, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n fileName: file.name,\n fileSize: file.data.length,\n message: 'File info',\n mimeType: file.mimetype,\n })\n }\n\n const collectionConfig = req.payload.config.collections.find(\n ({ slug }) => slug === collectionSlug,\n )\n\n if (!collectionConfig) {\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n throw new APIError(`Collection with slug ${collectionSlug} not found`, 400, null, true)\n }\n\n // Get disabled fields configuration\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n // Get fromCSV functions for field transformations\n const fromCSVFunctions = getImportFieldFunctions({\n fields: collectionConfig.flattenedFields || [],\n })\n\n // Parse the file data\n let documents: Record<string, unknown>[]\n if (format === 'csv') {\n const rawData = await parseCSV({\n data: file.data,\n req,\n })\n\n // Debug logging\n if (debug && rawData.length > 0) {\n req.payload.logger.info({\n firstRow: rawData[0], // Show the complete first row\n msg: 'Parsed CSV data - FULL',\n })\n req.payload.logger.info({\n msg: 'Parsed CSV data',\n rows: rawData.map((row, i) => ({\n excerpt: row.excerpt,\n hasManyNumber: row.hasManyNumber, // Add this to see what we get from CSV\n hasOnePolymorphic_id: row.hasOnePolymorphic_id,\n hasOnePolymorphic_relationTo: row.hasOnePolymorphic_relationTo,\n index: i,\n title: row.title,\n })),\n })\n }\n\n documents = rawData\n\n // Unflatten CSV data\n documents = documents\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: collectionConfig.flattenedFields ?? [],\n fromCSVFunctions,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n\n // Debug after unflatten\n if (debug && documents.length > 0) {\n req.payload.logger.info({\n msg: 'After unflatten',\n rows: documents.map((row, i) => ({\n hasManyNumber: row.hasManyNumber, // Add this to see the actual value\n hasManyPolymorphic: row.hasManyPolymorphic,\n hasOnePolymorphic: row.hasOnePolymorphic,\n hasTitle: 'title' in row,\n index: i,\n title: row.title,\n })),\n })\n }\n\n if (debug) {\n req.payload.logger.debug({\n documentCount: documents.length,\n message: 'After unflattening CSV',\n rawDataCount: rawData.length,\n })\n\n // Debug: show a sample of raw vs unflattened\n if (rawData.length > 0 && documents.length > 0) {\n req.payload.logger.debug({\n message: 'Sample data transformation',\n raw: Object.keys(rawData[0] || {}).filter((k) => k.includes('localized')),\n unflattened: JSON.stringify(documents[0], null, 2),\n })\n }\n }\n } else {\n documents = parseJSON({ data: file.data, req })\n }\n\n if (debug) {\n req.payload.logger.debug({\n message: `Parsed ${documents.length} documents from ${format} file`,\n })\n if (documents.length > 0) {\n req.payload.logger.debug({\n doc: documents[0],\n message: 'First document sample:',\n })\n }\n }\n\n // Enforce maxLimit before processing to save memory/time\n if (typeof maxLimit === 'number' && maxLimit > 0 && documents.length > maxLimit) {\n throw new APIError(\n `Import file contains ${documents.length} documents but limit is ${maxLimit}`,\n 400,\n null,\n true,\n )\n }\n\n // Remove disabled fields from all documents\n if (disabledFields.length > 0) {\n documents = documents.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n if (debug) {\n req.payload.logger.debug({\n batchSize,\n documentCount: documents.length,\n message: 'Processing import in batches',\n })\n }\n\n // Create batch processor\n const processor = createImportBatchProcessor({\n batchSize,\n defaultVersionStatus,\n })\n\n // Process import with batch processor\n const result = await processor.processImport({\n collectionSlug,\n documents,\n importMode,\n matchField,\n req,\n user,\n })\n\n if (debug) {\n req.payload.logger.info({\n errors: result.errors.length,\n imported: result.imported,\n message: 'Import completed',\n total: result.total,\n updated: result.updated,\n })\n }\n\n return result\n}\n"],"names":["APIError","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","unflattenObject","createImportBatchProcessor","createImport","batchSize","collectionSlug","debug","defaultVersionStatus","file","format","importMode","matchField","maxLimit","req","userCollection","userID","user","payload","findByID","id","collection","logger","message","transactionID","data","fileName","name","fileSize","length","mimeType","mimetype","collectionConfig","config","collections","find","slug","disabledFields","admin","custom","fromCSVFunctions","fields","flattenedFields","documents","rawData","info","firstRow","msg","rows","map","row","i","excerpt","hasManyNumber","hasOnePolymorphic_id","hasOnePolymorphic_relationTo","index","title","doc","unflattened","filter","Object","keys","hasManyPolymorphic","hasOnePolymorphic","hasTitle","documentCount","rawDataCount","raw","k","includes","JSON","stringify","processor","result","processImport","errors","imported","total","updated"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/import/createImport.ts"],"sourcesContent":["import type { PayloadRequest, User } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { ImportDoc, ImportResult } from '../types.js'\n\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js'\nimport { parseCSV } from '../utilities/parseCSV.js'\nimport { parseJSON } from '../utilities/parseJSON.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { unflattenObject } from '../utilities/unflattenObject.js'\nimport { createImportBatchProcessor } from './batchProcessor.js'\n\nexport type ImportMode = 'create' | 'update' | 'upsert'\n\nexport type Import = {\n /**\n * Number of documents to process in each batch during import\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enabled debug logging\n */\n debug?: boolean\n file?: {\n data: Buffer\n mimetype: string\n name: string\n }\n format: 'csv' | 'json'\n id?: number | string\n /**\n * Import mode: create, update or upset\n */\n importMode: ImportMode\n matchField?: string\n /**\n * Maximum number of documents that can be imported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n userCollection?: string\n userID?: number | string\n}\n\nexport type CreateImportArgs = {\n defaultVersionStatus?: 'draft' | 'published'\n importDoc: ImportDoc\n req: PayloadRequest\n} & Import\n\nexport const createImport = async ({\n batchSize = 100,\n collectionSlug,\n debug = false,\n defaultVersionStatus = 'published',\n file,\n format,\n importDoc,\n importMode = 'create',\n matchField = 'id',\n maxLimit,\n req,\n userCollection,\n userID,\n}: CreateImportArgs): Promise<ImportResult> => {\n let user: undefined | User\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n req,\n })) as User\n\n if (user) {\n // `findByID` omits the runtime `collection` property; restore it so downstream\n // writes (e.g. authorship tracking) know which auth collection the user belongs to.\n user.collection = userCollection\n }\n }\n\n if (!user) {\n throw new APIError('User is required for import operations', 401, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n collectionSlug,\n format,\n importMode,\n matchField,\n msg: 'Starting import process with args:',\n transactionID: req.transactionID, // Log transaction ID to verify we're in same transaction\n })\n }\n\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n\n if (!file || !file?.data) {\n throw new APIError('No file data provided for import', 400, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n fileName: file.name,\n fileSize: file.data.length,\n mimeType: file.mimetype,\n msg: 'File info',\n })\n }\n\n const collectionConfig = req.payload.config.collections.find(\n ({ slug }) => slug === collectionSlug,\n )\n\n if (!collectionConfig) {\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n throw new APIError(`Collection with slug ${collectionSlug} not found`, 400, null, true)\n }\n\n // Get disabled fields configuration\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const importHooks = collectionConfig.custom?.['plugin-import-export']?.importHooks\n\n // Get beforeImport functions for field transformations\n const importFieldHooks = getImportFieldFunctions({\n fields: collectionConfig.flattenedFields || [],\n })\n\n // Parse the file data\n let originalDocs: Record<string, unknown>[] | undefined\n let documents: Record<string, unknown>[]\n if (format === 'csv') {\n const rawData = await parseCSV({\n data: file.data,\n req,\n })\n\n originalDocs = rawData\n documents = rawData\n\n // Unflatten CSV data\n documents = documents\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: collectionConfig.flattenedFields ?? [],\n format,\n importFieldHooks,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n\n if (debug) {\n req.payload.logger.debug({\n documentCount: documents.length,\n msg: 'After unflattening CSV',\n rawDataCount: rawData.length,\n })\n }\n } else {\n const parsedDocs = parseJSON({ data: file.data, req })\n originalDocs = parsedDocs\n // Apply field-level import hooks for JSON format\n documents = parsedDocs.map((doc) =>\n applyFieldHooks({\n type: 'beforeImport',\n data: doc,\n fieldHooks: importFieldHooks,\n fields: collectionConfig.flattenedFields ?? [],\n format,\n operation: 'import',\n req,\n }),\n )\n }\n\n if (debug) {\n req.payload.logger.debug({\n msg: `Parsed ${documents.length} documents from ${format} file`,\n })\n if (documents.length > 0) {\n req.payload.logger.debug({\n doc: documents[0],\n msg: 'First document sample:',\n })\n }\n }\n\n // Enforce maxLimit before processing to save memory/time\n if (typeof maxLimit === 'number' && maxLimit > 0 && documents.length > maxLimit) {\n throw new APIError(\n `Import file contains ${documents.length} documents but limit is ${maxLimit}`,\n 400,\n null,\n true,\n )\n }\n\n // Remove disabled fields from all documents\n if (disabledFields.length > 0) {\n documents = documents.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n if (debug) {\n req.payload.logger.debug({\n batchSize,\n documentCount: documents.length,\n msg: 'Processing import in batches',\n })\n }\n\n // Create batch processor\n const processor = createImportBatchProcessor({\n batchSize,\n defaultVersionStatus,\n })\n\n const totalBatches = documents.length > 0 ? Math.ceil(documents.length / batchSize) : 1\n\n // Process import with batch processor\n const result = await processor.processImport({\n collectionSlug,\n docs: documents,\n format,\n hooks: importHooks,\n importDoc,\n importMode,\n matchField,\n originalDocs,\n req,\n totalBatches,\n user,\n })\n\n if (debug) {\n req.payload.logger.info({\n errors: result.errors.length,\n imported: result.imported,\n msg: 'Import completed',\n total: result.total,\n updated: result.updated,\n })\n }\n\n return result\n}\n"],"names":["APIError","applyFieldHooks","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","unflattenObject","createImportBatchProcessor","createImport","batchSize","collectionSlug","debug","defaultVersionStatus","file","format","importDoc","importMode","matchField","maxLimit","req","userCollection","userID","user","payload","findByID","id","collection","overrideAccess","logger","msg","transactionID","data","fileName","name","fileSize","length","mimeType","mimetype","collectionConfig","config","collections","find","slug","disabledFields","admin","custom","importHooks","importFieldHooks","fields","flattenedFields","originalDocs","documents","rawData","map","doc","unflattened","filter","Object","keys","documentCount","rawDataCount","parsedDocs","type","fieldHooks","operation","processor","totalBatches","Math","ceil","result","processImport","docs","hooks","info","errors","imported","total","updated"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCreateImportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/import/getCreateImportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAOjD,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,6BAA6B,YAC/B,MAAM,KACd,UAAU,CAAC;IACZ,KAAK,EAAE,eAAe,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf,
|
|
1
|
+
{"version":3,"file":"getCreateImportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/import/getCreateImportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAOjD,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,6BAA6B,YAC/B,MAAM,KACd,UAAU,CAAC;IACZ,KAAK,EAAE,eAAe,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf,CAmJA,CAAA"}
|
|
@@ -9,7 +9,8 @@ export const getCreateCollectionImportTask = (_config)=>{
|
|
|
9
9
|
// Fetch the import document to get all necessary data
|
|
10
10
|
const importDoc = await req.payload.findByID({
|
|
11
11
|
id: importId,
|
|
12
|
-
collection: importCollection
|
|
12
|
+
collection: importCollection,
|
|
13
|
+
overrideAccess: true
|
|
13
14
|
});
|
|
14
15
|
if (!importDoc) {
|
|
15
16
|
throw new Error(`Import document not found: ${importId}`);
|
|
@@ -45,6 +46,7 @@ export const getCreateCollectionImportTask = (_config)=>{
|
|
|
45
46
|
mimetype: fileMimetype
|
|
46
47
|
},
|
|
47
48
|
format: fileMimetype === 'text/csv' ? 'csv' : 'json',
|
|
49
|
+
importDoc,
|
|
48
50
|
importMode: importDoc.importMode || 'create',
|
|
49
51
|
matchField: importDoc.matchField,
|
|
50
52
|
maxLimit,
|
|
@@ -69,7 +71,8 @@ export const getCreateCollectionImportTask = (_config)=>{
|
|
|
69
71
|
total: result.total,
|
|
70
72
|
updated: result.updated
|
|
71
73
|
}
|
|
72
|
-
}
|
|
74
|
+
},
|
|
75
|
+
overrideAccess: true
|
|
73
76
|
});
|
|
74
77
|
return {
|
|
75
78
|
output: result
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/import/getCreateImportCollectionTask.ts"],"sourcesContent":["import type { Config, TaskConfig } from 'payload'\n\nimport { FileRetrievalError } from 'payload'\n\nimport { getFileFromDoc } from '../utilities/getFileFromDoc.js'\nimport { createImport } from './createImport.js'\n\nexport type ImportTaskInput = {\n batchSize?: number\n debug?: boolean\n defaultVersionStatus?: 'draft' | 'published'\n importCollection: string\n importId: string\n maxLimit?: number\n userCollection?: string\n userID?: number | string\n}\n\nexport const getCreateCollectionImportTask = (\n _config: Config,\n): TaskConfig<{\n input: ImportTaskInput\n output: object\n}> => {\n return {\n slug: 'createCollectionImport',\n handler: async ({ input, req }) => {\n const {\n batchSize,\n debug,\n defaultVersionStatus,\n importCollection,\n importId,\n maxLimit,\n userCollection,\n userID,\n } = input\n\n // Fetch the import document to get all necessary data\n const importDoc = await req.payload.findByID({\n id: importId,\n collection: importCollection,\n })\n\n if (!importDoc) {\n throw new Error(`Import document not found: ${importId}`)\n }\n\n // Get the collection config for the imports collection\n const collectionConfig = req.payload.config.collections.find(\n (c) => c.slug === importCollection,\n )\n\n if (!collectionConfig) {\n throw new Error(`Collection config not found for: ${importCollection}`)\n }\n\n // Retrieve the file using getFileFromDoc (handles both local and cloud storage)\n const file = await getFileFromDoc({\n collectionConfig,\n doc: {\n filename: importDoc.filename as string,\n mimeType: importDoc.mimeType as string | undefined,\n url: importDoc.url as string | undefined,\n },\n req,\n })\n\n const fileMimetype = file.mimetype || (importDoc.mimeType as string)\n\n if (!fileMimetype) {\n throw new FileRetrievalError(\n req.t,\n `Unable to determine mimetype for file: ${importDoc.filename}`,\n )\n }\n\n const result = await createImport({\n name: (importDoc.filename as string) || 'import',\n batchSize,\n collectionSlug: importDoc.collectionSlug as string,\n debug,\n defaultVersionStatus,\n file: {\n name: importDoc.filename as string,\n data: file.data,\n mimetype: fileMimetype,\n },\n format: fileMimetype === 'text/csv' ? 'csv' : 'json',\n importMode: (importDoc.importMode as 'create' | 'update' | 'upsert') || 'create',\n matchField: importDoc.matchField as string | undefined,\n maxLimit,\n req,\n userCollection,\n userID,\n })\n\n // Update the import document with results\n await req.payload.update({\n id: importId,\n collection: importCollection,\n data: {\n status:\n result.errors.length === 0\n ? 'completed'\n : result.imported + result.updated === 0\n ? 'failed'\n : 'partial',\n summary: {\n imported: result.imported,\n issueDetails:\n result.errors.length > 0\n ? result.errors.map((e) => ({\n data: e.doc,\n error: e.error,\n row: e.index + 1,\n }))\n : undefined,\n issues: result.errors.length,\n total: result.total,\n updated: result.updated,\n },\n },\n })\n\n return {\n output: result,\n }\n },\n inputSchema: [\n {\n name: 'importId',\n type: 'text',\n required: true,\n },\n {\n name: 'importCollection',\n type: 'text',\n required: true,\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'debug',\n type: 'checkbox',\n },\n {\n name: 'defaultVersionStatus',\n type: 'select',\n options: ['draft', 'published'],\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n ],\n }\n}\n"],"names":["FileRetrievalError","getFileFromDoc","createImport","getCreateCollectionImportTask","_config","slug","handler","input","req","batchSize","debug","defaultVersionStatus","importCollection","importId","maxLimit","userCollection","userID","importDoc","payload","findByID","id","collection","Error","collectionConfig","config","collections","find","c","file","doc","filename","mimeType","url","fileMimetype","mimetype","t","result","name","collectionSlug","data","format","importMode","matchField","update","status","errors","length","imported","updated","summary","issueDetails","map","e","error","row","index","undefined","issues","total","output","inputSchema","type","required","options"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,UAAS;AAE5C,SAASC,cAAc,QAAQ,iCAAgC;AAC/D,SAASC,YAAY,QAAQ,oBAAmB;AAahD,OAAO,MAAMC,gCAAgC,CAC3CC;IAKA,OAAO;QACLC,MAAM;QACNC,SAAS,OAAO,EAAEC,KAAK,EAAEC,GAAG,EAAE;YAC5B,MAAM,EACJC,SAAS,EACTC,KAAK,EACLC,oBAAoB,EACpBC,gBAAgB,EAChBC,QAAQ,EACRC,QAAQ,EACRC,cAAc,EACdC,MAAM,EACP,GAAGT;YAEJ,sDAAsD;YACtD,MAAMU,YAAY,MAAMT,IAAIU,OAAO,CAACC,QAAQ,CAAC;gBAC3CC,IAAIP;gBACJQ,YAAYT;
|
|
1
|
+
{"version":3,"sources":["../../src/import/getCreateImportCollectionTask.ts"],"sourcesContent":["import type { Config, TaskConfig } from 'payload'\n\nimport { FileRetrievalError } from 'payload'\n\nimport { getFileFromDoc } from '../utilities/getFileFromDoc.js'\nimport { createImport } from './createImport.js'\n\nexport type ImportTaskInput = {\n batchSize?: number\n debug?: boolean\n defaultVersionStatus?: 'draft' | 'published'\n importCollection: string\n importId: string\n maxLimit?: number\n userCollection?: string\n userID?: number | string\n}\n\nexport const getCreateCollectionImportTask = (\n _config: Config,\n): TaskConfig<{\n input: ImportTaskInput\n output: object\n}> => {\n return {\n slug: 'createCollectionImport',\n handler: async ({ input, req }) => {\n const {\n batchSize,\n debug,\n defaultVersionStatus,\n importCollection,\n importId,\n maxLimit,\n userCollection,\n userID,\n } = input\n\n // Fetch the import document to get all necessary data\n const importDoc = await req.payload.findByID({\n id: importId,\n collection: importCollection,\n overrideAccess: true,\n })\n\n if (!importDoc) {\n throw new Error(`Import document not found: ${importId}`)\n }\n\n // Get the collection config for the imports collection\n const collectionConfig = req.payload.config.collections.find(\n (c) => c.slug === importCollection,\n )\n\n if (!collectionConfig) {\n throw new Error(`Collection config not found for: ${importCollection}`)\n }\n\n // Retrieve the file using getFileFromDoc (handles both local and cloud storage)\n const file = await getFileFromDoc({\n collectionConfig,\n doc: {\n filename: importDoc.filename as string,\n mimeType: importDoc.mimeType as string | undefined,\n url: importDoc.url as string | undefined,\n },\n req,\n })\n\n const fileMimetype = file.mimetype || (importDoc.mimeType as string)\n\n if (!fileMimetype) {\n throw new FileRetrievalError(\n req.t,\n `Unable to determine mimetype for file: ${importDoc.filename}`,\n )\n }\n\n const result = await createImport({\n name: (importDoc.filename as string) || 'import',\n batchSize,\n collectionSlug: importDoc.collectionSlug as string,\n debug,\n defaultVersionStatus,\n file: {\n name: importDoc.filename as string,\n data: file.data,\n mimetype: fileMimetype,\n },\n format: fileMimetype === 'text/csv' ? 'csv' : 'json',\n importDoc,\n importMode: (importDoc.importMode as 'create' | 'update' | 'upsert') || 'create',\n matchField: importDoc.matchField as string | undefined,\n maxLimit,\n req,\n userCollection,\n userID,\n })\n\n // Update the import document with results\n await req.payload.update({\n id: importId,\n collection: importCollection,\n data: {\n status:\n result.errors.length === 0\n ? 'completed'\n : result.imported + result.updated === 0\n ? 'failed'\n : 'partial',\n summary: {\n imported: result.imported,\n issueDetails:\n result.errors.length > 0\n ? result.errors.map((e) => ({\n data: e.doc,\n error: e.error,\n row: e.index + 1,\n }))\n : undefined,\n issues: result.errors.length,\n total: result.total,\n updated: result.updated,\n },\n },\n overrideAccess: true,\n })\n\n return {\n output: result,\n }\n },\n inputSchema: [\n {\n name: 'importId',\n type: 'text',\n required: true,\n },\n {\n name: 'importCollection',\n type: 'text',\n required: true,\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'debug',\n type: 'checkbox',\n },\n {\n name: 'defaultVersionStatus',\n type: 'select',\n options: ['draft', 'published'],\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n ],\n }\n}\n"],"names":["FileRetrievalError","getFileFromDoc","createImport","getCreateCollectionImportTask","_config","slug","handler","input","req","batchSize","debug","defaultVersionStatus","importCollection","importId","maxLimit","userCollection","userID","importDoc","payload","findByID","id","collection","overrideAccess","Error","collectionConfig","config","collections","find","c","file","doc","filename","mimeType","url","fileMimetype","mimetype","t","result","name","collectionSlug","data","format","importMode","matchField","update","status","errors","length","imported","updated","summary","issueDetails","map","e","error","row","index","undefined","issues","total","output","inputSchema","type","required","options"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getImportCollection.d.ts","sourceRoot":"","sources":["../../src/import/getImportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI1E,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAYzE,eAAO,MAAM,mBAAmB,qDAI7B;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,
|
|
1
|
+
{"version":3,"file":"getImportCollection.d.ts","sourceRoot":"","sources":["../../src/import/getImportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI1E,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAYzE,eAAO,MAAM,mBAAmB,qDAI7B;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAsVH,CAAA"}
|
|
@@ -117,12 +117,13 @@ export const getImportCollection = ({ collectionSlugs, importConfig, pluginConfi
|
|
|
117
117
|
mimetype: fileMimetype
|
|
118
118
|
},
|
|
119
119
|
format: fileMimetype === 'text/csv' ? 'csv' : 'json',
|
|
120
|
+
importDoc: doc,
|
|
120
121
|
importMode: doc.importMode || 'create',
|
|
121
122
|
matchField: doc.matchField,
|
|
122
123
|
maxLimit,
|
|
123
124
|
req,
|
|
124
|
-
userCollection: req?.user?.collection
|
|
125
|
-
userID: req?.user?.id
|
|
125
|
+
userCollection: req?.user?.collection,
|
|
126
|
+
userID: req?.user?.id
|
|
126
127
|
});
|
|
127
128
|
// Determine status
|
|
128
129
|
let status;
|
|
@@ -283,11 +284,12 @@ export const getImportCollection = ({ collectionSlugs, importConfig, pluginConfi
|
|
|
283
284
|
importCollection: collectionConfig.slug,
|
|
284
285
|
importId: doc.id,
|
|
285
286
|
maxLimit,
|
|
286
|
-
userCollection: req.user?.collection
|
|
287
|
-
userID: req?.user?.id
|
|
287
|
+
userCollection: req.user?.collection,
|
|
288
|
+
userID: req?.user?.id
|
|
288
289
|
};
|
|
289
290
|
await req.payload.jobs.queue({
|
|
290
291
|
input,
|
|
292
|
+
overrideAccess: true,
|
|
291
293
|
task: 'createCollectionImport'
|
|
292
294
|
});
|
|
293
295
|
} catch (err) {
|