@payloadcms/plugin-import-export 3.75.0 → 3.76.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js +30 -12
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/ExportPreview/index.scss +12 -0
- package/dist/components/ImportPreview/index.js +3 -15
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/export/createExport.d.ts +5 -0
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +36 -12
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +3 -0
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +21 -1
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +7 -3
- package/dist/export/getFields.js.map +1 -1
- package/dist/export/handleDownload.d.ts.map +1 -1
- package/dist/export/handleDownload.js +18 -1
- package/dist/export/handleDownload.js.map +1 -1
- package/dist/export/handlePreview.d.ts.map +1 -1
- package/dist/export/handlePreview.js +32 -10
- 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.js +50 -53
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/createImport.d.ts +6 -1
- package/dist/import/createImport.d.ts.map +1 -1
- package/dist/import/createImport.js +5 -1
- package/dist/import/createImport.js.map +1 -1
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
- package/dist/import/getCreateImportCollectionTask.js +3 -0
- package/dist/import/getCreateImportCollectionTask.js.map +1 -1
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +15 -0
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/import/handlePreview.d.ts.map +1 -1
- package/dist/import/handlePreview.js +11 -0
- package/dist/import/handlePreview.js.map +1 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +3 -0
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +3 -0
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +3 -0
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/bnBd.d.ts.map +1 -1
- package/dist/translations/languages/bnBd.js +22 -19
- package/dist/translations/languages/bnBd.js.map +1 -1
- package/dist/translations/languages/bnIn.d.ts.map +1 -1
- package/dist/translations/languages/bnIn.js +22 -19
- package/dist/translations/languages/bnIn.js.map +1 -1
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +3 -0
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +3 -0
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +3 -0
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +3 -0
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +3 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +3 -0
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +3 -0
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +3 -0
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +3 -0
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +3 -0
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +3 -0
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +3 -0
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +3 -0
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +3 -0
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/id.d.ts.map +1 -1
- package/dist/translations/languages/id.js +13 -10
- package/dist/translations/languages/id.js.map +1 -1
- package/dist/translations/languages/is.d.ts.map +1 -1
- package/dist/translations/languages/is.js +3 -0
- package/dist/translations/languages/is.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +3 -0
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +3 -0
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +3 -0
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +3 -0
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +16 -13
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +3 -0
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +3 -0
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +3 -0
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +3 -0
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +3 -0
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +3 -0
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +3 -0
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +3 -0
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +3 -0
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +3 -0
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +3 -0
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +3 -0
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/ta.d.ts.map +1 -1
- package/dist/translations/languages/ta.js +3 -0
- package/dist/translations/languages/ta.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +3 -0
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +3 -0
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +3 -0
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +3 -0
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +3 -0
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +3 -0
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/types.d.ts +44 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/buildDisabledFieldRegex.d.ts +11 -2
- package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
- package/dist/utilities/buildDisabledFieldRegex.js +33 -7
- package/dist/utilities/buildDisabledFieldRegex.js.map +1 -1
- package/dist/utilities/buildDisabledFieldRegex.spec.js +64 -0
- package/dist/utilities/buildDisabledFieldRegex.spec.js.map +1 -0
- package/dist/utilities/collectTimezoneCompanionFields.d.ts +24 -0
- package/dist/utilities/collectTimezoneCompanionFields.d.ts.map +1 -0
- package/dist/utilities/collectTimezoneCompanionFields.js +89 -0
- package/dist/utilities/collectTimezoneCompanionFields.js.map +1 -0
- package/dist/utilities/collectTimezoneCompanionFields.spec.js +319 -0
- package/dist/utilities/collectTimezoneCompanionFields.spec.js.map +1 -0
- package/dist/utilities/fieldToRegex.d.ts +14 -0
- package/dist/utilities/fieldToRegex.d.ts.map +1 -0
- package/dist/utilities/fieldToRegex.js +34 -0
- package/dist/utilities/fieldToRegex.js.map +1 -0
- package/dist/utilities/fieldToRegex.spec.js +151 -0
- package/dist/utilities/fieldToRegex.spec.js.map +1 -0
- package/dist/utilities/flattenObject.d.ts +7 -1
- package/dist/utilities/flattenObject.d.ts.map +1 -1
- package/dist/utilities/flattenObject.js +30 -18
- package/dist/utilities/flattenObject.js.map +1 -1
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getExportFieldFunctions.js +7 -0
- package/dist/utilities/getExportFieldFunctions.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getImportFieldFunctions.js +2 -16
- package/dist/utilities/getImportFieldFunctions.js.map +1 -1
- package/dist/utilities/getPluginCollections.d.ts +1 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -1
- package/dist/utilities/getPluginCollections.js +43 -10
- package/dist/utilities/getPluginCollections.js.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts +8 -2
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
- package/dist/utilities/getSchemaColumns.js +61 -27
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/parseCSV.d.ts.map +1 -1
- package/dist/utilities/parseCSV.js +4 -10
- package/dist/utilities/parseCSV.js.map +1 -1
- package/dist/utilities/resolveLimit.d.ts +15 -0
- package/dist/utilities/resolveLimit.d.ts.map +1 -0
- package/dist/utilities/resolveLimit.js +21 -0
- package/dist/utilities/resolveLimit.js.map +1 -0
- package/dist/utilities/unflattenObject.d.ts +13 -0
- package/dist/utilities/unflattenObject.d.ts.map +1 -1
- package/dist/utilities/unflattenObject.js +64 -65
- package/dist/utilities/unflattenObject.js.map +1 -1
- package/package.json +8 -8
- package/dist/utilities/getvalueAtPath.d.ts +0 -15
- package/dist/utilities/getvalueAtPath.d.ts.map +0 -1
- package/dist/utilities/getvalueAtPath.js +0 -49
- package/dist/utilities/getvalueAtPath.js.map +0 -1
|
@@ -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 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 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 })) 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 // 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","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, 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 })) 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCreateImportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/import/getCreateImportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAa,MAAM,SAAS,CAAA;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C,MAAM,MAAM,eAAe,GAAG;IAC5B,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,6BAA6B,WAChC,MAAM,KACb,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,EAAa,MAAM,SAAS,CAAA;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C,MAAM,MAAM,eAAe,GAAG;IAC5B,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,6BAA6B,WAChC,MAAM,KACb,UAAU,CAAC;IACZ,KAAK,EAAE,eAAe,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf,CAgGA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/import/getCreateImportCollectionTask.ts"],"sourcesContent":["import type { Config, TaskConfig, TypedUser } from 'payload'\n\nimport type { Import } from './createImport.js'\n\nimport { createImport } from './createImport.js'\nimport { getFields } from './getFields.js'\n\nexport type ImportTaskInput = {\n defaultVersionStatus?: 'draft' | 'published'\n importId?: string\n importsCollection?: string\n user?: string\n} & Import\n\nexport const getCreateCollectionImportTask = (\n config: Config,\n): TaskConfig<{\n input: ImportTaskInput\n output: object\n}> => {\n const inputSchema = getFields(config).concat(\n {\n name: 'user',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'importsCollection',\n type: 'text',\n },\n {\n name: 'file',\n type: 'group',\n fields: [\n {\n name: 'data',\n type: 'text',\n },\n {\n name: 'mimetype',\n type: 'text',\n },\n {\n name: 'name',\n type: 'text',\n },\n ],\n },\n {\n name: 'format',\n type: 'select',\n options: ['csv', 'json'],\n },\n {\n name: 'debug',\n type: 'checkbox',\n },\n )\n\n return {\n slug: 'createCollectionImport',\n handler: async ({ input, req }) => {\n // Convert file data back to Buffer if it was serialized\n if (input.file && typeof input.file.data === 'string') {\n input.file.data = Buffer.from(input.file.data, 'base64')\n }\n\n const result = await createImport({\n ...input,\n req,\n })\n\n // Update the import document with results if importId is provided\n if (input.importId) {\n await req.payload.update({\n id: input.importId,\n collection: input.importsCollection || 'imports',\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\n return {\n output: result,\n }\n },\n inputSchema,\n }\n}\n"],"names":["createImport","getFields","getCreateCollectionImportTask","config","inputSchema","concat","name","type","fields","options","slug","handler","input","req","file","data","Buffer","from","result","importId","payload","update","id","collection","importsCollection","status","errors","length","imported","updated","summary","issueDetails","map","e","doc","error","row","index","undefined","issues","total","output"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAChD,SAASC,SAAS,QAAQ,iBAAgB;AAS1C,OAAO,MAAMC,gCAAgC,CAC3CC;IAKA,MAAMC,cAAcH,UAAUE,QAAQE,MAAM,CAC1C;QACEC,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;QACNC,QAAQ;YACN;gBACEF,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;SACD;IACH,GACA;QACED,MAAM;QACNC,MAAM;QACNE,SAAS;YAAC;YAAO;SAAO;IAC1B,GACA;QACEH,MAAM;QACNC,MAAM;IACR;IAGF,OAAO;QACLG,MAAM;QACNC,SAAS,OAAO,EAAEC,KAAK,EAAEC,GAAG,EAAE;YAC5B,wDAAwD;YACxD,IAAID,MAAME,IAAI,IAAI,OAAOF,MAAME,IAAI,CAACC,IAAI,KAAK,UAAU;gBACrDH,MAAME,IAAI,CAACC,IAAI,GAAGC,OAAOC,IAAI,CAACL,MAAME,IAAI,CAACC,IAAI,EAAE;YACjD;YAEA,MAAMG,SAAS,MAAMlB,aAAa;gBAChC,GAAGY,KAAK;gBACRC;YACF;YAEA,kEAAkE;YAClE,IAAID,MAAMO,QAAQ,EAAE;gBAClB,MAAMN,IAAIO,OAAO,CAACC,MAAM,CAAC;oBACvBC,IAAIV,MAAMO,QAAQ;oBAClBI,YAAYX,MAAMY,iBAAiB,IAAI;oBACvCT,MAAM;wBACJU,QACEP,OAAOQ,MAAM,CAACC,MAAM,KAAK,IACrB,cACAT,OAAOU,QAAQ,GAAGV,OAAOW,OAAO,KAAK,IACnC,WACA;wBACRC,SAAS;4BACPF,UAAUV,OAAOU,QAAQ;4BACzBG,cACEb,OAAOQ,MAAM,CAACC,MAAM,GAAG,IACnBT,OAAOQ,MAAM,CAACM,GAAG,CAAC,CAACC,IAAO,CAAA;oCACxBlB,MAAMkB,EAAEC,GAAG;oCACXC,OAAOF,EAAEE,KAAK;oCACdC,KAAKH,EAAEI,KAAK,GAAG;gCACjB,CAAA,KACAC;4BACNC,QAAQrB,OAAOQ,MAAM,CAACC,MAAM;4BAC5Ba,OAAOtB,OAAOsB,KAAK;4BACnBX,SAASX,OAAOW,OAAO;wBACzB;oBACF;gBACF;YACF;YAEA,OAAO;gBACLY,QAAQvB;YACV;QACF;QACAd;IACF;AACF,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/import/getCreateImportCollectionTask.ts"],"sourcesContent":["import type { Config, TaskConfig, TypedUser } from 'payload'\n\nimport type { Import } from './createImport.js'\n\nimport { createImport } from './createImport.js'\nimport { getFields } from './getFields.js'\n\nexport type ImportTaskInput = {\n defaultVersionStatus?: 'draft' | 'published'\n importId?: string\n importsCollection?: string\n user?: string\n} & Import\n\nexport const getCreateCollectionImportTask = (\n config: Config,\n): TaskConfig<{\n input: ImportTaskInput\n output: object\n}> => {\n const inputSchema = getFields(config).concat(\n {\n name: 'user',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'importsCollection',\n type: 'text',\n },\n {\n name: 'file',\n type: 'group',\n fields: [\n {\n name: 'data',\n type: 'text',\n },\n {\n name: 'mimetype',\n type: 'text',\n },\n {\n name: 'name',\n type: 'text',\n },\n ],\n },\n {\n name: 'format',\n type: 'select',\n options: ['csv', 'json'],\n },\n {\n name: 'debug',\n type: 'checkbox',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n )\n\n return {\n slug: 'createCollectionImport',\n handler: async ({ input, req }) => {\n // Convert file data back to Buffer if it was serialized\n if (input.file && typeof input.file.data === 'string') {\n input.file.data = Buffer.from(input.file.data, 'base64')\n }\n\n const result = await createImport({\n ...input,\n req,\n })\n\n // Update the import document with results if importId is provided\n if (input.importId) {\n await req.payload.update({\n id: input.importId,\n collection: input.importsCollection || 'imports',\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\n return {\n output: result,\n }\n },\n inputSchema,\n }\n}\n"],"names":["createImport","getFields","getCreateCollectionImportTask","config","inputSchema","concat","name","type","fields","options","slug","handler","input","req","file","data","Buffer","from","result","importId","payload","update","id","collection","importsCollection","status","errors","length","imported","updated","summary","issueDetails","map","e","doc","error","row","index","undefined","issues","total","output"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAChD,SAASC,SAAS,QAAQ,iBAAgB;AAS1C,OAAO,MAAMC,gCAAgC,CAC3CC;IAKA,MAAMC,cAAcH,UAAUE,QAAQE,MAAM,CAC1C;QACEC,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;QACNC,QAAQ;YACN;gBACEF,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;SACD;IACH,GACA;QACED,MAAM;QACNC,MAAM;QACNE,SAAS;YAAC;YAAO;SAAO;IAC1B,GACA;QACEH,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR;IAGF,OAAO;QACLG,MAAM;QACNC,SAAS,OAAO,EAAEC,KAAK,EAAEC,GAAG,EAAE;YAC5B,wDAAwD;YACxD,IAAID,MAAME,IAAI,IAAI,OAAOF,MAAME,IAAI,CAACC,IAAI,KAAK,UAAU;gBACrDH,MAAME,IAAI,CAACC,IAAI,GAAGC,OAAOC,IAAI,CAACL,MAAME,IAAI,CAACC,IAAI,EAAE;YACjD;YAEA,MAAMG,SAAS,MAAMlB,aAAa;gBAChC,GAAGY,KAAK;gBACRC;YACF;YAEA,kEAAkE;YAClE,IAAID,MAAMO,QAAQ,EAAE;gBAClB,MAAMN,IAAIO,OAAO,CAACC,MAAM,CAAC;oBACvBC,IAAIV,MAAMO,QAAQ;oBAClBI,YAAYX,MAAMY,iBAAiB,IAAI;oBACvCT,MAAM;wBACJU,QACEP,OAAOQ,MAAM,CAACC,MAAM,KAAK,IACrB,cACAT,OAAOU,QAAQ,GAAGV,OAAOW,OAAO,KAAK,IACnC,WACA;wBACRC,SAAS;4BACPF,UAAUV,OAAOU,QAAQ;4BACzBG,cACEb,OAAOQ,MAAM,CAACC,MAAM,GAAG,IACnBT,OAAOQ,MAAM,CAACM,GAAG,CAAC,CAACC,IAAO,CAAA;oCACxBlB,MAAMkB,EAAEC,GAAG;oCACXC,OAAOF,EAAEE,KAAK;oCACdC,KAAKH,EAAEI,KAAK,GAAG;gCACjB,CAAA,KACAC;4BACNC,QAAQrB,OAAOQ,MAAM,CAACC,MAAM;4BAC5Ba,OAAOtB,OAAOsB,KAAK;4BACnBX,SAASX,OAAOW,OAAO;wBACzB;oBACF;gBACF;YACF;YAEA,OAAO;gBACLY,QAAQvB;YACV;QACF;QACAd;IACF;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getImportCollection.d.ts","sourceRoot":"","sources":["../../src/import/getImportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,MAAM,EACP,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"getImportCollection.d.ts","sourceRoot":"","sources":["../../src/import/getImportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,MAAM,EACP,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAS,MAAM,aAAa,CAAA;AAQhF,eAAO,MAAM,mBAAmB,4CAI7B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBA+RH,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
+
import { resolveLimit } from '../utilities/resolveLimit.js';
|
|
3
4
|
import { createImport } from './createImport.js';
|
|
4
5
|
import { getFields } from './getFields.js';
|
|
5
6
|
import { handlePreview } from './handlePreview.js';
|
|
@@ -82,6 +83,12 @@ export const getImportCollection = ({ config, importConfig, pluginConfig })=>{
|
|
|
82
83
|
fileData = await fs.promises.readFile(fullPath);
|
|
83
84
|
fileMimetype = doc.mimeType || 'text/csv';
|
|
84
85
|
}
|
|
86
|
+
const targetCollection = req.payload.collections[doc.collectionSlug];
|
|
87
|
+
const importLimitConfig = targetCollection?.config.custom?.['plugin-import-export']?.importLimit;
|
|
88
|
+
const maxLimit = await resolveLimit({
|
|
89
|
+
limit: importLimitConfig,
|
|
90
|
+
req
|
|
91
|
+
});
|
|
85
92
|
const result = await createImport({
|
|
86
93
|
id: doc.id,
|
|
87
94
|
name: doc.filename || 'import',
|
|
@@ -97,6 +104,7 @@ export const getImportCollection = ({ config, importConfig, pluginConfig })=>{
|
|
|
97
104
|
format: fileMimetype === 'text/csv' ? 'csv' : 'json',
|
|
98
105
|
importMode: doc.importMode || 'create',
|
|
99
106
|
matchField: doc.matchField,
|
|
107
|
+
maxLimit,
|
|
100
108
|
req,
|
|
101
109
|
userCollection: req?.user?.collection || req?.user?.user?.collection,
|
|
102
110
|
userID: req?.user?.id || req?.user?.user?.id
|
|
@@ -220,6 +228,12 @@ export const getImportCollection = ({ config, importConfig, pluginConfig })=>{
|
|
|
220
228
|
const fullPath = path.resolve(uploadDir, filePath);
|
|
221
229
|
fileData = await fs.promises.readFile(fullPath);
|
|
222
230
|
}
|
|
231
|
+
const targetCollection = req.payload.collections[doc.collectionSlug];
|
|
232
|
+
const importLimitConfig = targetCollection?.config.custom?.['plugin-import-export']?.importLimit;
|
|
233
|
+
const maxLimit = await resolveLimit({
|
|
234
|
+
limit: importLimitConfig,
|
|
235
|
+
req
|
|
236
|
+
});
|
|
223
237
|
const input = {
|
|
224
238
|
name: doc.filename,
|
|
225
239
|
batchSize,
|
|
@@ -237,6 +251,7 @@ export const getImportCollection = ({ config, importConfig, pluginConfig })=>{
|
|
|
237
251
|
importMode: doc.importMode || 'create',
|
|
238
252
|
importsCollection: collectionConfig.slug,
|
|
239
253
|
matchField: doc.matchField,
|
|
254
|
+
maxLimit,
|
|
240
255
|
userCollection: req.user?.collection || req?.user?.user?.collection,
|
|
241
256
|
userID: req?.user?.id || req?.user?.user?.id
|
|
242
257
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/import/getImportCollection.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionBeforeOperationHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport fs from 'fs'\nimport path from 'path'\n\nimport type { ImportConfig, ImportExportPluginConfig } from '../types.js'\nimport type { ImportTaskInput } from './getCreateImportCollectionTask.js'\n\nimport { createImport } from './createImport.js'\nimport { getFields } from './getFields.js'\nimport { handlePreview } from './handlePreview.js'\n\nexport const getImportCollection = ({\n config,\n importConfig,\n pluginConfig,\n}: {\n config: Config\n importConfig?: ImportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const beforeOperation: CollectionBeforeOperationHook[] = []\n const afterChange: CollectionAfterChangeHook[] = []\n\n // Extract import-specific settings\n const disableJobsQueue = importConfig?.disableJobsQueue ?? false\n const batchSize = importConfig?.batchSize ?? 100\n const defaultVersionStatus = importConfig?.defaultVersionStatus ?? 'published'\n\n // Get collection slugs for the dropdown\n const collectionSlugs = pluginConfig.collections?.map((c) => c.slug)\n\n const collection: CollectionConfig = {\n slug: 'imports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ImportSaveButton',\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'filename',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: handlePreview,\n method: 'post',\n path: '/preview-data',\n },\n ],\n fields: getFields(config, { collectionSlugs }),\n hooks: {\n afterChange,\n beforeOperation,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: true,\n hideFileInputOnCreate: false,\n hideRemoveFile: true,\n mimeTypes: ['text/csv', 'application/json'],\n },\n }\n\n if (disableJobsQueue) {\n // Process the import synchronously after the document (with file) has been created\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create' || doc.status !== 'pending') {\n return doc\n }\n\n const debug = pluginConfig.debug || false\n\n try {\n // Get file data from the uploaded document\n let fileData: Buffer\n let fileMimetype: string\n\n if (doc.url && doc.url.startsWith('http')) {\n // File has been uploaded to external storage (S3, etc.) - fetch it\n const response = await fetch(doc.url)\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${doc.url}`)\n }\n fileData = Buffer.from(await response.arrayBuffer())\n fileMimetype = doc.mimeType || 'text/csv'\n } else {\n // File is stored locally - read from filesystem\n const filePath = doc.filename\n // Get upload config from the actual sanitized collection config\n const uploadConfig =\n typeof collectionConfig?.upload === 'object' ? collectionConfig.upload : undefined\n const uploadDir = uploadConfig?.staticDir || './uploads'\n const fullPath = path.resolve(uploadDir, filePath)\n fileData = await fs.promises.readFile(fullPath)\n fileMimetype = doc.mimeType || 'text/csv'\n }\n\n const result = await createImport({\n id: doc.id,\n name: doc.filename || 'import',\n batchSize,\n collectionSlug: doc.collectionSlug,\n debug,\n defaultVersionStatus,\n file: {\n name: doc.filename,\n data: fileData,\n mimetype: fileMimetype,\n },\n format: fileMimetype === 'text/csv' ? 'csv' : 'json',\n importMode: doc.importMode || 'create',\n matchField: doc.matchField,\n req,\n userCollection: req?.user?.collection || req?.user?.user?.collection,\n userID: req?.user?.id || req?.user?.user?.id,\n })\n\n // Determine status\n let status: 'completed' | 'failed' | 'partial'\n if (result.errors.length === 0) {\n status = 'completed'\n } else if (result.imported + result.updated === 0) {\n status = 'failed'\n } else {\n status = 'partial'\n }\n\n const 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 // Try to update the document with results (may fail due to transaction timing)\n try {\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status,\n summary,\n },\n overrideAccess: true,\n req,\n })\n } catch (updateErr) {\n // Update may fail if document not yet committed, log but continue\n if (debug) {\n req.payload.logger.error({\n err: updateErr,\n msg: `Failed to update import document ${doc.id} with results`,\n })\n }\n }\n\n // Return updated doc for immediate response\n return {\n ...doc,\n status,\n summary,\n }\n } catch (err) {\n const summary = {\n imported: 0,\n issueDetails: [\n {\n data: {},\n error: err instanceof Error ? err.message : String(err),\n row: 0,\n },\n ],\n issues: 1,\n total: 0,\n updated: 0,\n }\n\n // Try to update document with error status\n try {\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status: 'failed',\n summary,\n },\n overrideAccess: true,\n req,\n })\n } catch (updateErr) {\n // Update may fail if document not yet committed, log but continue\n if (debug) {\n req.payload.logger.error({\n err: updateErr,\n msg: `Failed to update import document ${doc.id} with error status`,\n })\n }\n }\n\n if (debug) {\n req.payload.logger.error({\n err,\n msg: 'Import processing failed',\n })\n }\n\n // Return error status for immediate response\n return {\n ...doc,\n status: 'failed',\n summary,\n }\n }\n })\n } else {\n // When jobs queue is enabled, queue the import as a job\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n try {\n // Get file data for job - need to read from disk/URL since req.file is not available in afterChange\n let fileData: Buffer\n if (doc.url && doc.url.startsWith('http')) {\n const response = await fetch(doc.url)\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${doc.url}`)\n }\n fileData = Buffer.from(await response.arrayBuffer())\n } else {\n const filePath = doc.filename\n // Get upload config from the actual sanitized collection config\n const uploadConfig =\n typeof collectionConfig?.upload === 'object' ? collectionConfig.upload : undefined\n const uploadDir = uploadConfig?.staticDir || './uploads'\n const fullPath = path.resolve(uploadDir, filePath)\n fileData = await fs.promises.readFile(fullPath)\n }\n\n const input: ImportTaskInput = {\n name: doc.filename,\n batchSize,\n collectionSlug: doc.collectionSlug,\n debug: pluginConfig.debug,\n defaultVersionStatus,\n file: {\n name: doc.filename,\n // Convert to base64 for job serialization - will be converted back to Buffer in task handler\n data: fileData.toString('base64') as unknown as Buffer,\n mimetype: doc.mimeType || 'text/csv',\n },\n format: doc.mimeType === 'text/csv' ? 'csv' : 'json',\n importId: doc.id,\n importMode: doc.importMode || 'create',\n importsCollection: collectionConfig.slug,\n matchField: doc.matchField,\n userCollection: req.user?.collection || req?.user?.user?.collection,\n userID: req?.user?.id || req?.user?.user?.id,\n }\n\n await req.payload.jobs.queue({\n input,\n task: 'createCollectionImport',\n })\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to queue import job for document ${doc.id}`,\n })\n }\n })\n }\n\n return collection\n}\n"],"names":["fs","path","createImport","getFields","handlePreview","getImportCollection","config","importConfig","pluginConfig","beforeOperation","afterChange","disableJobsQueue","batchSize","defaultVersionStatus","collectionSlugs","collections","map","c","slug","collection","access","update","admin","components","edit","SaveButton","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","method","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","mimeTypes","push","collectionConfig","doc","operation","req","status","debug","fileData","fileMimetype","url","startsWith","response","fetch","ok","Error","Buffer","from","arrayBuffer","mimeType","filePath","filename","uploadConfig","undefined","uploadDir","staticDir","fullPath","resolve","promises","readFile","result","id","name","collectionSlug","file","data","mimetype","format","importMode","matchField","userCollection","user","userID","errors","length","imported","updated","summary","issueDetails","e","error","row","index","issues","total","payload","overrideAccess","updateErr","logger","err","msg","message","String","input","toString","importId","importsCollection","jobs","queue","task"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/import/getImportCollection.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionBeforeOperationHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport fs from 'fs'\nimport path from 'path'\n\nimport type { ImportConfig, ImportExportPluginConfig, Limit } from '../types.js'\nimport type { ImportTaskInput } from './getCreateImportCollectionTask.js'\n\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createImport } from './createImport.js'\nimport { getFields } from './getFields.js'\nimport { handlePreview } from './handlePreview.js'\n\nexport const getImportCollection = ({\n config,\n importConfig,\n pluginConfig,\n}: {\n config: Config\n importConfig?: ImportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const beforeOperation: CollectionBeforeOperationHook[] = []\n const afterChange: CollectionAfterChangeHook[] = []\n\n // Extract import-specific settings\n const disableJobsQueue = importConfig?.disableJobsQueue ?? false\n const batchSize = importConfig?.batchSize ?? 100\n const defaultVersionStatus = importConfig?.defaultVersionStatus ?? 'published'\n\n // Get collection slugs for the dropdown\n const collectionSlugs = pluginConfig.collections?.map((c) => c.slug)\n\n const collection: CollectionConfig = {\n slug: 'imports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ImportSaveButton',\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'filename',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: handlePreview,\n method: 'post',\n path: '/preview-data',\n },\n ],\n fields: getFields(config, { collectionSlugs }),\n hooks: {\n afterChange,\n beforeOperation,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: true,\n hideFileInputOnCreate: false,\n hideRemoveFile: true,\n mimeTypes: ['text/csv', 'application/json'],\n },\n }\n\n if (disableJobsQueue) {\n // Process the import synchronously after the document (with file) has been created\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create' || doc.status !== 'pending') {\n return doc\n }\n\n const debug = pluginConfig.debug || false\n\n try {\n // Get file data from the uploaded document\n let fileData: Buffer\n let fileMimetype: string\n\n if (doc.url && doc.url.startsWith('http')) {\n // File has been uploaded to external storage (S3, etc.) - fetch it\n const response = await fetch(doc.url)\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${doc.url}`)\n }\n fileData = Buffer.from(await response.arrayBuffer())\n fileMimetype = doc.mimeType || 'text/csv'\n } else {\n // File is stored locally - read from filesystem\n const filePath = doc.filename\n // Get upload config from the actual sanitized collection config\n const uploadConfig =\n typeof collectionConfig?.upload === 'object' ? collectionConfig.upload : undefined\n const uploadDir = uploadConfig?.staticDir || './uploads'\n const fullPath = path.resolve(uploadDir, filePath)\n fileData = await fs.promises.readFile(fullPath)\n fileMimetype = doc.mimeType || 'text/csv'\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const importLimitConfig: Limit | undefined =\n targetCollection?.config.custom?.['plugin-import-export']?.importLimit\n const maxLimit = await resolveLimit({\n limit: importLimitConfig,\n req,\n })\n\n const result = await createImport({\n id: doc.id,\n name: doc.filename || 'import',\n batchSize,\n collectionSlug: doc.collectionSlug,\n debug,\n defaultVersionStatus,\n file: {\n name: doc.filename,\n data: fileData,\n mimetype: fileMimetype,\n },\n format: fileMimetype === 'text/csv' ? 'csv' : 'json',\n importMode: doc.importMode || 'create',\n matchField: doc.matchField,\n maxLimit,\n req,\n userCollection: req?.user?.collection || req?.user?.user?.collection,\n userID: req?.user?.id || req?.user?.user?.id,\n })\n\n // Determine status\n let status: 'completed' | 'failed' | 'partial'\n if (result.errors.length === 0) {\n status = 'completed'\n } else if (result.imported + result.updated === 0) {\n status = 'failed'\n } else {\n status = 'partial'\n }\n\n const 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 // Try to update the document with results (may fail due to transaction timing)\n try {\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status,\n summary,\n },\n overrideAccess: true,\n req,\n })\n } catch (updateErr) {\n // Update may fail if document not yet committed, log but continue\n if (debug) {\n req.payload.logger.error({\n err: updateErr,\n msg: `Failed to update import document ${doc.id} with results`,\n })\n }\n }\n\n // Return updated doc for immediate response\n return {\n ...doc,\n status,\n summary,\n }\n } catch (err) {\n const summary = {\n imported: 0,\n issueDetails: [\n {\n data: {},\n error: err instanceof Error ? err.message : String(err),\n row: 0,\n },\n ],\n issues: 1,\n total: 0,\n updated: 0,\n }\n\n // Try to update document with error status\n try {\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status: 'failed',\n summary,\n },\n overrideAccess: true,\n req,\n })\n } catch (updateErr) {\n // Update may fail if document not yet committed, log but continue\n if (debug) {\n req.payload.logger.error({\n err: updateErr,\n msg: `Failed to update import document ${doc.id} with error status`,\n })\n }\n }\n\n if (debug) {\n req.payload.logger.error({\n err,\n msg: 'Import processing failed',\n })\n }\n\n // Return error status for immediate response\n return {\n ...doc,\n status: 'failed',\n summary,\n }\n }\n })\n } else {\n // When jobs queue is enabled, queue the import as a job\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n try {\n // Get file data for job - need to read from disk/URL since req.file is not available in afterChange\n let fileData: Buffer\n if (doc.url && doc.url.startsWith('http')) {\n const response = await fetch(doc.url)\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${doc.url}`)\n }\n fileData = Buffer.from(await response.arrayBuffer())\n } else {\n const filePath = doc.filename\n // Get upload config from the actual sanitized collection config\n const uploadConfig =\n typeof collectionConfig?.upload === 'object' ? collectionConfig.upload : undefined\n const uploadDir = uploadConfig?.staticDir || './uploads'\n const fullPath = path.resolve(uploadDir, filePath)\n fileData = await fs.promises.readFile(fullPath)\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const importLimitConfig: Limit | undefined =\n targetCollection?.config.custom?.['plugin-import-export']?.importLimit\n const maxLimit = await resolveLimit({\n limit: importLimitConfig,\n req,\n })\n\n const input: ImportTaskInput = {\n name: doc.filename,\n batchSize,\n collectionSlug: doc.collectionSlug,\n debug: pluginConfig.debug,\n defaultVersionStatus,\n file: {\n name: doc.filename,\n // Convert to base64 for job serialization - will be converted back to Buffer in task handler\n data: fileData.toString('base64') as unknown as Buffer,\n mimetype: doc.mimeType || 'text/csv',\n },\n format: doc.mimeType === 'text/csv' ? 'csv' : 'json',\n importId: doc.id,\n importMode: doc.importMode || 'create',\n importsCollection: collectionConfig.slug,\n matchField: doc.matchField,\n maxLimit,\n userCollection: req.user?.collection || req?.user?.user?.collection,\n userID: req?.user?.id || req?.user?.user?.id,\n }\n\n await req.payload.jobs.queue({\n input,\n task: 'createCollectionImport',\n })\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to queue import job for document ${doc.id}`,\n })\n }\n })\n }\n\n return collection\n}\n"],"names":["fs","path","resolveLimit","createImport","getFields","handlePreview","getImportCollection","config","importConfig","pluginConfig","beforeOperation","afterChange","disableJobsQueue","batchSize","defaultVersionStatus","collectionSlugs","collections","map","c","slug","collection","access","update","admin","components","edit","SaveButton","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","method","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","mimeTypes","push","collectionConfig","doc","operation","req","status","debug","fileData","fileMimetype","url","startsWith","response","fetch","ok","Error","Buffer","from","arrayBuffer","mimeType","filePath","filename","uploadConfig","undefined","uploadDir","staticDir","fullPath","resolve","promises","readFile","targetCollection","payload","collectionSlug","importLimitConfig","custom","importLimit","maxLimit","limit","result","id","name","file","data","mimetype","format","importMode","matchField","userCollection","user","userID","errors","length","imported","updated","summary","issueDetails","e","error","row","index","issues","total","overrideAccess","updateErr","logger","err","msg","message","String","input","toString","importId","importsCollection","jobs","queue","task"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/import/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/import/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAmB7C,eAAO,MAAM,aAAa,QAAe,cAAc,KAAG,OAAO,CAAC,QAAQ,CA2GzE,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js
|
|
|
4
4
|
import { parseCSV } from '../utilities/parseCSV.js';
|
|
5
5
|
import { parseJSON } from '../utilities/parseJSON.js';
|
|
6
6
|
import { removeDisabledFields } from '../utilities/removeDisabledFields.js';
|
|
7
|
+
import { resolveLimit } from '../utilities/resolveLimit.js';
|
|
7
8
|
import { unflattenObject } from '../utilities/unflattenObject.js';
|
|
8
9
|
export const handlePreview = async (req)=>{
|
|
9
10
|
await addDataAndFileToRequest(req);
|
|
@@ -19,6 +20,12 @@ export const handlePreview = async (req)=>{
|
|
|
19
20
|
status: 400
|
|
20
21
|
});
|
|
21
22
|
}
|
|
23
|
+
// Resolve max limit from the collection config
|
|
24
|
+
const pluginConfig = targetCollection.config.custom?.['plugin-import-export'];
|
|
25
|
+
const maxLimit = await resolveLimit({
|
|
26
|
+
limit: pluginConfig?.importLimit,
|
|
27
|
+
req
|
|
28
|
+
});
|
|
22
29
|
if (!fileData) {
|
|
23
30
|
return Response.json({
|
|
24
31
|
error: 'No file data provided'
|
|
@@ -68,11 +75,15 @@ export const handlePreview = async (req)=>{
|
|
|
68
75
|
const paginatedDocs = parsedData.slice(startIndex, endIndex);
|
|
69
76
|
const hasNextPage = previewPage < totalPages;
|
|
70
77
|
const hasPrevPage = previewPage > 1;
|
|
78
|
+
// Check if the file exceeds the max limit
|
|
79
|
+
const limitExceeded = typeof maxLimit === 'number' && maxLimit > 0 && totalDocs > maxLimit;
|
|
71
80
|
const response = {
|
|
72
81
|
docs: paginatedDocs,
|
|
73
82
|
hasNextPage,
|
|
74
83
|
hasPrevPage,
|
|
75
84
|
limit: previewLimit,
|
|
85
|
+
limitExceeded,
|
|
86
|
+
maxLimit,
|
|
76
87
|
page: previewPage,
|
|
77
88
|
totalDocs,
|
|
78
89
|
totalPages
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/import/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { ImportPreviewResponse } from '../types.js'\n\nimport {\n DEFAULT_PREVIEW_LIMIT,\n MAX_PREVIEW_LIMIT,\n MIN_PREVIEW_LIMIT,\n MIN_PREVIEW_PAGE,\n} from '../constants.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'\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n fileData,\n format,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n } = req.data as {\n collectionSlug: string\n fileData?: string\n format?: 'csv' | 'json'\n previewLimit?: number\n previewPage?: number\n }\n\n // Validate and clamp pagination values to safe bounds\n const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT))\n const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage)\n\n const targetCollection = req.payload.collections[collectionSlug]\n if (!targetCollection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n if (!fileData) {\n return Response.json({ error: 'No file data provided' }, { status: 400 })\n }\n\n try {\n // Parse the file data\n let parsedData: Record<string, unknown>[]\n const buffer = Buffer.from(fileData, 'base64')\n\n if (format === 'csv') {\n const rawData = await parseCSV({ data: buffer, req })\n\n // Get fromCSV functions for field transformations\n const fromCSVFunctions = getImportFieldFunctions({\n fields: targetCollection.config.flattenedFields || [],\n })\n\n // Unflatten CSV data\n parsedData = rawData\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: targetCollection.config.flattenedFields ?? [],\n fromCSVFunctions,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n } else {\n parsedData = parseJSON({ data: buffer, req })\n }\n\n // Remove disabled fields from the documents\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n if (disabledFields.length > 0) {\n parsedData = parsedData.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n // Calculate pagination\n const totalDocs = parsedData.length\n const totalPages = totalDocs === 0 ? 0 : Math.ceil(totalDocs / previewLimit)\n const startIndex = (previewPage - 1) * previewLimit\n const endIndex = startIndex + previewLimit\n const paginatedDocs = parsedData.slice(startIndex, endIndex)\n\n const hasNextPage = previewPage < totalPages\n const hasPrevPage = previewPage > 1\n\n const response: ImportPreviewResponse = {\n docs: paginatedDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n page: previewPage,\n totalDocs,\n totalPages,\n }\n\n return Response.json(response)\n } catch (error) {\n req.payload.logger.error({ err: error, msg: 'Error parsing import preview data' })\n return Response.json({ error: 'Failed to parse file data' }, { status: 500 })\n }\n}\n"],"names":["addDataAndFileToRequest","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","unflattenObject","handlePreview","req","collectionSlug","fileData","format","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","data","Math","max","min","targetCollection","payload","collections","Response","json","error","status","parsedData","buffer","Buffer","from","rawData","fromCSVFunctions","fields","
|
|
1
|
+
{"version":3,"sources":["../../src/import/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { ImportPreviewResponse } from '../types.js'\n\nimport {\n DEFAULT_PREVIEW_LIMIT,\n MAX_PREVIEW_LIMIT,\n MIN_PREVIEW_LIMIT,\n MIN_PREVIEW_PAGE,\n} from '../constants.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 { resolveLimit } from '../utilities/resolveLimit.js'\nimport { unflattenObject } from '../utilities/unflattenObject.js'\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n fileData,\n format,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n } = req.data as {\n collectionSlug: string\n fileData?: string\n format?: 'csv' | 'json'\n previewLimit?: number\n previewPage?: number\n }\n\n // Validate and clamp pagination values to safe bounds\n const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT))\n const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage)\n\n const targetCollection = req.payload.collections[collectionSlug]\n if (!targetCollection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n // Resolve max limit from the collection config\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.importLimit,\n req,\n })\n\n if (!fileData) {\n return Response.json({ error: 'No file data provided' }, { status: 400 })\n }\n\n try {\n // Parse the file data\n let parsedData: Record<string, unknown>[]\n const buffer = Buffer.from(fileData, 'base64')\n\n if (format === 'csv') {\n const rawData = await parseCSV({ data: buffer, req })\n\n // Get fromCSV functions for field transformations\n const fromCSVFunctions = getImportFieldFunctions({\n fields: targetCollection.config.flattenedFields || [],\n })\n\n // Unflatten CSV data\n parsedData = rawData\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: targetCollection.config.flattenedFields ?? [],\n fromCSVFunctions,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n } else {\n parsedData = parseJSON({ data: buffer, req })\n }\n\n // Remove disabled fields from the documents\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n if (disabledFields.length > 0) {\n parsedData = parsedData.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n // Calculate pagination\n const totalDocs = parsedData.length\n const totalPages = totalDocs === 0 ? 0 : Math.ceil(totalDocs / previewLimit)\n const startIndex = (previewPage - 1) * previewLimit\n const endIndex = startIndex + previewLimit\n const paginatedDocs = parsedData.slice(startIndex, endIndex)\n\n const hasNextPage = previewPage < totalPages\n const hasPrevPage = previewPage > 1\n\n // Check if the file exceeds the max limit\n const limitExceeded = typeof maxLimit === 'number' && maxLimit > 0 && totalDocs > maxLimit\n\n const response: ImportPreviewResponse = {\n docs: paginatedDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n limitExceeded,\n maxLimit,\n page: previewPage,\n totalDocs,\n totalPages,\n }\n\n return Response.json(response)\n } catch (error) {\n req.payload.logger.error({ err: error, msg: 'Error parsing import preview data' })\n return Response.json({ error: 'Failed to parse file data' }, { status: 500 })\n }\n}\n"],"names":["addDataAndFileToRequest","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","resolveLimit","unflattenObject","handlePreview","req","collectionSlug","fileData","format","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","data","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","limit","importLimit","parsedData","buffer","Buffer","from","rawData","fromCSVFunctions","fields","flattenedFields","map","doc","unflattened","filter","Object","keys","length","disabledFields","admin","totalDocs","totalPages","ceil","startIndex","endIndex","paginatedDocs","slice","hasNextPage","hasPrevPage","limitExceeded","response","docs","page","logger","err","msg"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Config } from 'payload';
|
|
2
|
-
import type { FromCSVFunction, ImportExportPluginConfig, ToCSVFunction } from './types.js';
|
|
2
|
+
import type { FromCSVFunction, ImportExportPluginConfig, Limit, ToCSVFunction } from './types.js';
|
|
3
3
|
export declare const importExportPlugin: (pluginConfig: ImportExportPluginConfig) => (config: Config) => Promise<Config>;
|
|
4
4
|
declare module 'payload' {
|
|
5
5
|
interface FieldCustom {
|
|
@@ -26,6 +26,27 @@ declare module 'payload' {
|
|
|
26
26
|
* These paths are collected from fields marked with `custom['plugin-import-export'].disabled = true`.
|
|
27
27
|
*/
|
|
28
28
|
disabledFields?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* When set, forces exports from this collection to use this format.
|
|
31
|
+
* This value is read from the plugin config's `export.format` option.
|
|
32
|
+
*/
|
|
33
|
+
exportFormat?: 'csv' | 'json';
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
interface CollectionCustom {
|
|
37
|
+
'plugin-import-export'?: {
|
|
38
|
+
/**
|
|
39
|
+
* Maximum number of documents that can be exported from this collection.
|
|
40
|
+
* Set to 0 for unlimited (default). Can be a number or function.
|
|
41
|
+
* Stored in collection.custom (server-only) since functions cannot be serialized to client.
|
|
42
|
+
*/
|
|
43
|
+
exportLimit?: Limit;
|
|
44
|
+
/**
|
|
45
|
+
* Maximum number of documents that can be imported to this collection.
|
|
46
|
+
* Set to 0 for unlimited (default). Can be a number or function.
|
|
47
|
+
* Stored in collection.custom (server-only) since functions cannot be serialized to client.
|
|
48
|
+
*/
|
|
49
|
+
importLimit?: Limit;
|
|
29
50
|
};
|
|
30
51
|
}
|
|
31
52
|
}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAKrC,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAKrC,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,EACxB,KAAK,EAEL,aAAa,EACd,MAAM,YAAY,CAAA;AAQnB,eAAO,MAAM,kBAAkB,iBACd,wBAAwB,cACxB,MAAM,KAAG,OAAO,CAAC,MAAM,CA2KrC,CAAA;AAEH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,WAAW;QAC1B,sBAAsB,CAAC,EAAE;YACvB;;;;;;eAMG;YACH,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB,OAAO,CAAC,EAAE,eAAe,CAAA;YACzB;;eAEG;YACH,KAAK,CAAC,EAAE,aAAa,CAAA;SACtB,CAAA;KACF;IAED,UAAiB,qBAAqB;QACpC,sBAAsB,CAAC,EAAE;YACvB;;;eAGG;YACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;YACzB;;;eAGG;YACH,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;SAC9B,CAAA;KACF;IAED,UAAiB,gBAAgB;QAC/B,sBAAsB,CAAC,EAAE;YACvB;;;;eAIG;YACH,WAAW,CAAC,EAAE,KAAK,CAAA;YACnB;;;;eAIG;YACH,WAAW,CAAC,EAAE,KAAK,CAAA;SACpB,CAAA;KACF;CACF"}
|
package/dist/index.js
CHANGED
|
@@ -91,14 +91,38 @@ export const importExportPlugin = (pluginConfig)=>async (config)=>{
|
|
|
91
91
|
}
|
|
92
92
|
// Find fields explicitly marked as disabled for import/export
|
|
93
93
|
const disabledFieldAccessors = collectDisabledFieldPaths(collection.fields);
|
|
94
|
-
|
|
94
|
+
const exportConfig = typeof collectionPluginConfig?.export === 'object' ? collectionPluginConfig.export : undefined;
|
|
95
|
+
const exportFormat = exportConfig?.format;
|
|
96
|
+
const importConfig = typeof collectionPluginConfig?.import === 'object' ? collectionPluginConfig.import : undefined;
|
|
97
|
+
const exportLimit = exportConfig?.limit ?? pluginConfig.exportLimit;
|
|
98
|
+
const importLimit = importConfig?.limit ?? pluginConfig.importLimit;
|
|
99
|
+
// Store disabled field accessors and export format in the admin config for use in the UI
|
|
100
|
+
// Note: limits are stored in collection.custom (server-only) because they can be functions
|
|
95
101
|
collection.admin.custom = {
|
|
96
102
|
...collection.admin.custom || {},
|
|
97
103
|
'plugin-import-export': {
|
|
98
104
|
...collection.admin.custom?.['plugin-import-export'] || {},
|
|
99
|
-
disabledFields: disabledFieldAccessors
|
|
105
|
+
disabledFields: disabledFieldAccessors,
|
|
106
|
+
...exportFormat !== undefined && {
|
|
107
|
+
exportFormat
|
|
108
|
+
}
|
|
100
109
|
}
|
|
101
110
|
};
|
|
111
|
+
// Store limits in collection.custom (server-only) since they can be functions
|
|
112
|
+
if (exportLimit !== undefined || importLimit !== undefined) {
|
|
113
|
+
collection.custom = {
|
|
114
|
+
...collection.custom || {},
|
|
115
|
+
'plugin-import-export': {
|
|
116
|
+
...collection.custom?.['plugin-import-export'] || {},
|
|
117
|
+
...exportLimit !== undefined && {
|
|
118
|
+
exportLimit
|
|
119
|
+
},
|
|
120
|
+
...importLimit !== undefined && {
|
|
121
|
+
importLimit
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
102
126
|
collection.admin.components = components;
|
|
103
127
|
}
|
|
104
128
|
if (!config.i18n) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMergeSimple } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type {\n FromCSVFunction,\n ImportExportPluginConfig,\n PluginCollectionConfig,\n ToCSVFunction,\n} from './types.js'\n\nimport { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js'\nimport { getCreateCollectionImportTask } from './import/getCreateImportCollectionTask.js'\nimport { translations } from './translations/index.js'\nimport { collectDisabledFieldPaths } from './utilities/collectDisabledFieldPaths.js'\nimport { getPluginCollections } from './utilities/getPluginCollections.js'\n\nexport const importExportPlugin =\n (pluginConfig: ImportExportPluginConfig) =>\n async (config: Config): Promise<Config> => {\n // Get all export/import collections and the mappings from target collections to custom collections\n const { customExportSlugMap, customImportSlugMap, exportCollections, importCollections } =\n await getPluginCollections({\n config,\n pluginConfig,\n })\n\n // Base collections are at index 0 (always present)\n const baseExportCollection = exportCollections[0]!\n const baseImportCollection = importCollections[0]!\n\n // Collect all export and import collection slugs for filtering\n const allExportSlugs = new Set(exportCollections.map((c) => c.slug))\n const allImportSlugs = new Set(importCollections.map((c) => c.slug))\n\n // Initialize collections array if needed\n if (!config.collections) {\n config.collections = []\n }\n\n // Push all export/import collections if their slugs don't already exist\n for (const collection of [...exportCollections, ...importCollections]) {\n const slugExists = config.collections.some((c) => c.slug === collection.slug)\n if (!slugExists) {\n config.collections.push(collection)\n }\n }\n\n // inject custom import export provider\n config.admin = config.admin || {}\n config.admin.components = config.admin.components || {}\n config.admin.components.providers = config.admin.components.providers || []\n config.admin.components.providers.push(\n '@payloadcms/plugin-import-export/rsc#ImportExportProvider',\n )\n\n // inject the createExport and createImport jobs into the config\n ;((config.jobs ??= {}).tasks ??= []).push(getCreateCollectionExportTask(config))\n config.jobs.tasks.push(getCreateCollectionImportTask(config))\n\n // Build a map of collection configs for quick lookup\n const collectionConfigMap = new Map<string, PluginCollectionConfig>()\n if (pluginConfig.collections) {\n for (const collectionConfig of pluginConfig.collections) {\n collectionConfigMap.set(collectionConfig.slug, collectionConfig)\n }\n }\n\n // Determine which collections to add import/export menu items to\n // Exclude all export and import collections\n const collectionsToUpdate = config.collections.filter(\n (c) => !allExportSlugs.has(c.slug) && !allImportSlugs.has(c.slug),\n )\n\n for (const collection of collectionsToUpdate) {\n // Get the plugin config for this collection (if specified)\n const collectionPluginConfig = collectionConfigMap.get(collection.slug)\n\n // If collections array is specified but this collection is not in it, skip\n if (\n pluginConfig.collections &&\n pluginConfig.collections.length > 0 &&\n !collectionPluginConfig\n ) {\n continue\n }\n\n // Determine which export/import collection to use for this collection\n const exportSlugForCollection =\n customExportSlugMap.get(collection.slug) || baseExportCollection.slug\n const importSlugForCollection =\n customImportSlugMap.get(collection.slug) || baseImportCollection.slug\n\n // Check if export/import are disabled for this collection\n const exportDisabled = collectionPluginConfig?.export === false\n const importDisabled = collectionPluginConfig?.import === false\n\n if (!collection.admin) {\n collection.admin = { components: { listMenuItems: [] } }\n }\n const components = collection.admin.components || {}\n if (!components.listMenuItems) {\n components.listMenuItems = []\n }\n\n // Add export menu item if not disabled\n if (!exportDisabled) {\n components.listMenuItems.push({\n clientProps: {\n exportCollectionSlug: exportSlugForCollection,\n },\n path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem',\n })\n }\n\n // Add import menu item if not disabled\n if (!importDisabled) {\n components.listMenuItems.push({\n clientProps: {\n importCollectionSlug: importSlugForCollection,\n },\n path: '@payloadcms/plugin-import-export/rsc#ImportListMenuItem',\n })\n }\n\n // Find fields explicitly marked as disabled for import/export\n const disabledFieldAccessors = collectDisabledFieldPaths(collection.fields)\n\n // Store disabled field accessors in the admin config for use in the UI\n collection.admin.custom = {\n ...(collection.admin.custom || {}),\n 'plugin-import-export': {\n ...(collection.admin.custom?.['plugin-import-export'] || {}),\n disabledFields: disabledFieldAccessors,\n },\n }\n\n collection.admin.components = components\n }\n\n if (!config.i18n) {\n config.i18n = {}\n }\n\n /**\n * Merge plugin translations\n */\n const simplifiedTranslations = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n acc[key] = value.translations\n return acc\n },\n {} as Record<string, PluginDefaultTranslationsObject>,\n )\n\n config.i18n = {\n ...config.i18n,\n translations: deepMergeSimple(simplifiedTranslations, config.i18n?.translations ?? {}),\n }\n\n return config\n }\n\ndeclare module 'payload' {\n export interface FieldCustom {\n 'plugin-import-export'?: {\n /**\n * When `true` the field is **completely excluded** from the import-export plugin:\n * - It will not appear in the \"Fields to export\" selector.\n * - It is hidden from the preview list when no specific fields are chosen.\n * - Its data is omitted from the final CSV / JSON export.\n * @default false\n */\n disabled?: boolean\n fromCSV?: FromCSVFunction\n /**\n * Custom function used to modify the outgoing csv data by manipulating the data, siblingData or by returning the desired value\n */\n toCSV?: ToCSVFunction\n }\n }\n\n export interface CollectionAdminCustom {\n 'plugin-import-export'?: {\n /**\n * Array of field paths that are disabled for import/export.\n * These paths are collected from fields marked with `custom['plugin-import-export'].disabled = true`.\n */\n disabledFields?: string[]\n }\n }\n}\n"],"names":["deepMergeSimple","getCreateCollectionExportTask","getCreateCollectionImportTask","translations","collectDisabledFieldPaths","getPluginCollections","importExportPlugin","pluginConfig","config","customExportSlugMap","customImportSlugMap","exportCollections","importCollections","baseExportCollection","baseImportCollection","allExportSlugs","Set","map","c","slug","allImportSlugs","collections","collection","slugExists","some","push","admin","components","providers","jobs","tasks","collectionConfigMap","Map","collectionConfig","set","collectionsToUpdate","filter","has","collectionPluginConfig","get","length","exportSlugForCollection","importSlugForCollection","exportDisabled","export","importDisabled","import","listMenuItems","clientProps","exportCollectionSlug","path","importCollectionSlug","disabledFieldAccessors","fields","custom","disabledFields","i18n","simplifiedTranslations","Object","entries","reduce","acc","key","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMergeSimple } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type {\n FromCSVFunction,\n ImportExportPluginConfig,\n Limit,\n PluginCollectionConfig,\n ToCSVFunction,\n} from './types.js'\n\nimport { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js'\nimport { getCreateCollectionImportTask } from './import/getCreateImportCollectionTask.js'\nimport { translations } from './translations/index.js'\nimport { collectDisabledFieldPaths } from './utilities/collectDisabledFieldPaths.js'\nimport { getPluginCollections } from './utilities/getPluginCollections.js'\n\nexport const importExportPlugin =\n (pluginConfig: ImportExportPluginConfig) =>\n async (config: Config): Promise<Config> => {\n // Get all export/import collections and the mappings from target collections to custom collections\n const { customExportSlugMap, customImportSlugMap, exportCollections, importCollections } =\n await getPluginCollections({\n config,\n pluginConfig,\n })\n\n // Base collections are at index 0 (always present)\n const baseExportCollection = exportCollections[0]!\n const baseImportCollection = importCollections[0]!\n\n // Collect all export and import collection slugs for filtering\n const allExportSlugs = new Set(exportCollections.map((c) => c.slug))\n const allImportSlugs = new Set(importCollections.map((c) => c.slug))\n\n // Initialize collections array if needed\n if (!config.collections) {\n config.collections = []\n }\n\n // Push all export/import collections if their slugs don't already exist\n for (const collection of [...exportCollections, ...importCollections]) {\n const slugExists = config.collections.some((c) => c.slug === collection.slug)\n if (!slugExists) {\n config.collections.push(collection)\n }\n }\n\n // inject custom import export provider\n config.admin = config.admin || {}\n config.admin.components = config.admin.components || {}\n config.admin.components.providers = config.admin.components.providers || []\n config.admin.components.providers.push(\n '@payloadcms/plugin-import-export/rsc#ImportExportProvider',\n )\n\n // inject the createExport and createImport jobs into the config\n ;((config.jobs ??= {}).tasks ??= []).push(getCreateCollectionExportTask(config))\n config.jobs.tasks.push(getCreateCollectionImportTask(config))\n\n // Build a map of collection configs for quick lookup\n const collectionConfigMap = new Map<string, PluginCollectionConfig>()\n if (pluginConfig.collections) {\n for (const collectionConfig of pluginConfig.collections) {\n collectionConfigMap.set(collectionConfig.slug, collectionConfig)\n }\n }\n\n // Determine which collections to add import/export menu items to\n // Exclude all export and import collections\n const collectionsToUpdate = config.collections.filter(\n (c) => !allExportSlugs.has(c.slug) && !allImportSlugs.has(c.slug),\n )\n\n for (const collection of collectionsToUpdate) {\n // Get the plugin config for this collection (if specified)\n const collectionPluginConfig = collectionConfigMap.get(collection.slug)\n\n // If collections array is specified but this collection is not in it, skip\n if (\n pluginConfig.collections &&\n pluginConfig.collections.length > 0 &&\n !collectionPluginConfig\n ) {\n continue\n }\n\n // Determine which export/import collection to use for this collection\n const exportSlugForCollection =\n customExportSlugMap.get(collection.slug) || baseExportCollection.slug\n const importSlugForCollection =\n customImportSlugMap.get(collection.slug) || baseImportCollection.slug\n\n // Check if export/import are disabled for this collection\n const exportDisabled = collectionPluginConfig?.export === false\n const importDisabled = collectionPluginConfig?.import === false\n\n if (!collection.admin) {\n collection.admin = { components: { listMenuItems: [] } }\n }\n const components = collection.admin.components || {}\n if (!components.listMenuItems) {\n components.listMenuItems = []\n }\n\n // Add export menu item if not disabled\n if (!exportDisabled) {\n components.listMenuItems.push({\n clientProps: {\n exportCollectionSlug: exportSlugForCollection,\n },\n path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem',\n })\n }\n\n // Add import menu item if not disabled\n if (!importDisabled) {\n components.listMenuItems.push({\n clientProps: {\n importCollectionSlug: importSlugForCollection,\n },\n path: '@payloadcms/plugin-import-export/rsc#ImportListMenuItem',\n })\n }\n\n // Find fields explicitly marked as disabled for import/export\n const disabledFieldAccessors = collectDisabledFieldPaths(collection.fields)\n\n const exportConfig =\n typeof collectionPluginConfig?.export === 'object'\n ? collectionPluginConfig.export\n : undefined\n const exportFormat = exportConfig?.format\n\n const importConfig =\n typeof collectionPluginConfig?.import === 'object'\n ? collectionPluginConfig.import\n : undefined\n\n const exportLimit = exportConfig?.limit ?? pluginConfig.exportLimit\n\n const importLimit = importConfig?.limit ?? pluginConfig.importLimit\n\n // Store disabled field accessors and export format in the admin config for use in the UI\n // Note: limits are stored in collection.custom (server-only) because they can be functions\n collection.admin.custom = {\n ...(collection.admin.custom || {}),\n 'plugin-import-export': {\n ...(collection.admin.custom?.['plugin-import-export'] || {}),\n disabledFields: disabledFieldAccessors,\n ...(exportFormat !== undefined && { exportFormat }),\n },\n }\n\n // Store limits in collection.custom (server-only) since they can be functions\n if (exportLimit !== undefined || importLimit !== undefined) {\n collection.custom = {\n ...(collection.custom || {}),\n 'plugin-import-export': {\n ...(collection.custom?.['plugin-import-export'] || {}),\n ...(exportLimit !== undefined && { exportLimit }),\n ...(importLimit !== undefined && { importLimit }),\n },\n }\n }\n\n collection.admin.components = components\n }\n\n if (!config.i18n) {\n config.i18n = {}\n }\n\n /**\n * Merge plugin translations\n */\n const simplifiedTranslations = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n acc[key] = value.translations\n return acc\n },\n {} as Record<string, PluginDefaultTranslationsObject>,\n )\n\n config.i18n = {\n ...config.i18n,\n translations: deepMergeSimple(simplifiedTranslations, config.i18n?.translations ?? {}),\n }\n\n return config\n }\n\ndeclare module 'payload' {\n export interface FieldCustom {\n 'plugin-import-export'?: {\n /**\n * When `true` the field is **completely excluded** from the import-export plugin:\n * - It will not appear in the \"Fields to export\" selector.\n * - It is hidden from the preview list when no specific fields are chosen.\n * - Its data is omitted from the final CSV / JSON export.\n * @default false\n */\n disabled?: boolean\n fromCSV?: FromCSVFunction\n /**\n * Custom function used to modify the outgoing csv data by manipulating the data, siblingData or by returning the desired value\n */\n toCSV?: ToCSVFunction\n }\n }\n\n export interface CollectionAdminCustom {\n 'plugin-import-export'?: {\n /**\n * Array of field paths that are disabled for import/export.\n * These paths are collected from fields marked with `custom['plugin-import-export'].disabled = true`.\n */\n disabledFields?: string[]\n /**\n * When set, forces exports from this collection to use this format.\n * This value is read from the plugin config's `export.format` option.\n */\n exportFormat?: 'csv' | 'json'\n }\n }\n\n export interface CollectionCustom {\n 'plugin-import-export'?: {\n /**\n * Maximum number of documents that can be exported from this collection.\n * Set to 0 for unlimited (default). Can be a number or function.\n * Stored in collection.custom (server-only) since functions cannot be serialized to client.\n */\n exportLimit?: Limit\n /**\n * Maximum number of documents that can be imported to this collection.\n * Set to 0 for unlimited (default). Can be a number or function.\n * Stored in collection.custom (server-only) since functions cannot be serialized to client.\n */\n importLimit?: Limit\n }\n }\n}\n"],"names":["deepMergeSimple","getCreateCollectionExportTask","getCreateCollectionImportTask","translations","collectDisabledFieldPaths","getPluginCollections","importExportPlugin","pluginConfig","config","customExportSlugMap","customImportSlugMap","exportCollections","importCollections","baseExportCollection","baseImportCollection","allExportSlugs","Set","map","c","slug","allImportSlugs","collections","collection","slugExists","some","push","admin","components","providers","jobs","tasks","collectionConfigMap","Map","collectionConfig","set","collectionsToUpdate","filter","has","collectionPluginConfig","get","length","exportSlugForCollection","importSlugForCollection","exportDisabled","export","importDisabled","import","listMenuItems","clientProps","exportCollectionSlug","path","importCollectionSlug","disabledFieldAccessors","fields","exportConfig","undefined","exportFormat","format","importConfig","exportLimit","limit","importLimit","custom","disabledFields","i18n","simplifiedTranslations","Object","entries","reduce","acc","key","value"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/ar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,+
|
|
1
|
+
{"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/ar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,+BA4C5B,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|
|
@@ -28,6 +28,9 @@ export const arTranslations = {
|
|
|
28
28
|
'field-summary-label': 'ملخص الاستيراد',
|
|
29
29
|
importDocumentLabel: 'استيراد {{label}}',
|
|
30
30
|
importResults: 'نتائج الاستيراد',
|
|
31
|
+
limitCapped: 'الحد الأقصى محدد بـ {{limit}}',
|
|
32
|
+
limitExceededExport: 'التصدير محدود إلى {{limit}} وثائق',
|
|
33
|
+
limitExceededImport: 'ملف الاستيراد يحتوي على {{count}} وثائق لكن الحد هو {{limit}}',
|
|
31
34
|
matchBy: 'مطابقة بواسطة',
|
|
32
35
|
mode: 'وضع',
|
|
33
36
|
noDataToPreview: 'لا يوجد بيانات لعرضها',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/translations/languages/ar.ts"],"sourcesContent":["import type { PluginDefaultTranslationsObject, PluginLanguage } from '../types.js'\n\nexport const arTranslations: PluginDefaultTranslationsObject = {\n 'plugin-import-export': {\n allLocales: 'جميع المواقع',\n collectionRequired: 'مطلوب مجموعة لعرض المعاينة',\n documentsToExport: '{{count}} مستند للتصدير',\n documentsToImport: '{{count}} مستند للاستيراد',\n exportDocumentLabel: 'تصدير {{label}}',\n exportOptions: 'خيارات التصدير',\n 'field-collectionSlug-label': 'مجموعة',\n 'field-depth-label': 'عمق',\n 'field-drafts-label': 'تضمن المسودات',\n 'field-fields-label': 'حقول',\n 'field-format-label': 'تنسيق التصدير',\n 'field-importMode-create-label': 'إنشاء وثائق جديدة',\n 'field-importMode-label': 'وضع الاستيراد',\n 'field-importMode-update-label': 'تحديث المستندات الموجودة',\n 'field-importMode-upsert-label': 'إنشاء أو تحديث المستندات',\n 'field-limit-label': 'حد',\n 'field-locale-label': 'موقع',\n 'field-matchField-description': 'الحقل المستخدم لمطابقة الوثائق الموجودة بالفعل',\n 'field-matchField-label': 'حقل المطابقة',\n 'field-name-label': 'اسم الملف',\n 'field-page-label': 'صفحة',\n 'field-selectionToUse-label': 'اختيار للاستخدام',\n 'field-sort-label': 'ترتيب حسب',\n 'field-sort-order-label': 'ترتيب',\n 'field-status-label': 'الحالة',\n 'field-summary-label': 'ملخص الاستيراد',\n importDocumentLabel: 'استيراد {{label}}',\n importResults: 'نتائج الاستيراد',\n matchBy: 'مطابقة بواسطة',\n mode: 'وضع',\n noDataToPreview: 'لا يوجد بيانات لعرضها',\n previewPageInfo: '{{start}}-{{end}} من {{total}}',\n 'selectionToUse-allDocuments': 'استخدم جميع الوثائق',\n 'selectionToUse-currentFilters': 'استخدم الفلاتر الحالية',\n 'selectionToUse-currentSelection': 'استخدم الاختيار الحالي',\n startImport: 'ابدأ الاستيراد',\n totalDocumentsCount: '{{count}} مستنداً إجمالياً',\n uploadFileToSeePreview: 'قم بتحميل ملف لرؤية المعاينة',\n },\n}\n\nexport const ar: PluginLanguage = {\n dateFNSKey: 'ar',\n translations: arTranslations,\n}\n"],"names":["arTranslations","allLocales","collectionRequired","documentsToExport","documentsToImport","exportDocumentLabel","exportOptions","importDocumentLabel","importResults","matchBy","mode","noDataToPreview","previewPageInfo","startImport","totalDocumentsCount","uploadFileToSeePreview","ar","dateFNSKey","translations"],"mappings":"AAEA,OAAO,MAAMA,iBAAkD;IAC7D,wBAAwB;QACtBC,YAAY;QACZC,oBAAoB;QACpBC,mBAAmB;QACnBC,mBAAmB;QACnBC,qBAAqB;QACrBC,eAAe;QACf,8BAA8B;QAC9B,qBAAqB;QACrB,sBAAsB;QACtB,sBAAsB;QACtB,sBAAsB;QACtB,iCAAiC;QACjC,0BAA0B;QAC1B,iCAAiC;QACjC,iCAAiC;QACjC,qBAAqB;QACrB,sBAAsB;QACtB,gCAAgC;QAChC,0BAA0B;QAC1B,oBAAoB;QACpB,oBAAoB;QACpB,8BAA8B;QAC9B,oBAAoB;QACpB,0BAA0B;QAC1B,sBAAsB;QACtB,uBAAuB;QACvBC,qBAAqB;QACrBC,eAAe;QACfC,SAAS;QACTC,MAAM;QACNC,iBAAiB;QACjBC,iBAAiB;QACjB,+BAA+B;QAC/B,iCAAiC;QACjC,mCAAmC;QACnCC,aAAa;QACbC,qBAAqB;QACrBC,wBAAwB;IAC1B;AACF,EAAC;AAED,OAAO,MAAMC,KAAqB;IAChCC,YAAY;IACZC,
|
|
1
|
+
{"version":3,"sources":["../../../src/translations/languages/ar.ts"],"sourcesContent":["import type { PluginDefaultTranslationsObject, PluginLanguage } from '../types.js'\n\nexport const arTranslations: PluginDefaultTranslationsObject = {\n 'plugin-import-export': {\n allLocales: 'جميع المواقع',\n collectionRequired: 'مطلوب مجموعة لعرض المعاينة',\n documentsToExport: '{{count}} مستند للتصدير',\n documentsToImport: '{{count}} مستند للاستيراد',\n exportDocumentLabel: 'تصدير {{label}}',\n exportOptions: 'خيارات التصدير',\n 'field-collectionSlug-label': 'مجموعة',\n 'field-depth-label': 'عمق',\n 'field-drafts-label': 'تضمن المسودات',\n 'field-fields-label': 'حقول',\n 'field-format-label': 'تنسيق التصدير',\n 'field-importMode-create-label': 'إنشاء وثائق جديدة',\n 'field-importMode-label': 'وضع الاستيراد',\n 'field-importMode-update-label': 'تحديث المستندات الموجودة',\n 'field-importMode-upsert-label': 'إنشاء أو تحديث المستندات',\n 'field-limit-label': 'حد',\n 'field-locale-label': 'موقع',\n 'field-matchField-description': 'الحقل المستخدم لمطابقة الوثائق الموجودة بالفعل',\n 'field-matchField-label': 'حقل المطابقة',\n 'field-name-label': 'اسم الملف',\n 'field-page-label': 'صفحة',\n 'field-selectionToUse-label': 'اختيار للاستخدام',\n 'field-sort-label': 'ترتيب حسب',\n 'field-sort-order-label': 'ترتيب',\n 'field-status-label': 'الحالة',\n 'field-summary-label': 'ملخص الاستيراد',\n importDocumentLabel: 'استيراد {{label}}',\n importResults: 'نتائج الاستيراد',\n limitCapped: 'الحد الأقصى محدد بـ {{limit}}',\n limitExceededExport: 'التصدير محدود إلى {{limit}} وثائق',\n limitExceededImport: 'ملف الاستيراد يحتوي على {{count}} وثائق لكن الحد هو {{limit}}',\n matchBy: 'مطابقة بواسطة',\n mode: 'وضع',\n noDataToPreview: 'لا يوجد بيانات لعرضها',\n previewPageInfo: '{{start}}-{{end}} من {{total}}',\n 'selectionToUse-allDocuments': 'استخدم جميع الوثائق',\n 'selectionToUse-currentFilters': 'استخدم الفلاتر الحالية',\n 'selectionToUse-currentSelection': 'استخدم الاختيار الحالي',\n startImport: 'ابدأ الاستيراد',\n totalDocumentsCount: '{{count}} مستنداً إجمالياً',\n uploadFileToSeePreview: 'قم بتحميل ملف لرؤية المعاينة',\n },\n}\n\nexport const ar: PluginLanguage = {\n dateFNSKey: 'ar',\n translations: arTranslations,\n}\n"],"names":["arTranslations","allLocales","collectionRequired","documentsToExport","documentsToImport","exportDocumentLabel","exportOptions","importDocumentLabel","importResults","limitCapped","limitExceededExport","limitExceededImport","matchBy","mode","noDataToPreview","previewPageInfo","startImport","totalDocumentsCount","uploadFileToSeePreview","ar","dateFNSKey","translations"],"mappings":"AAEA,OAAO,MAAMA,iBAAkD;IAC7D,wBAAwB;QACtBC,YAAY;QACZC,oBAAoB;QACpBC,mBAAmB;QACnBC,mBAAmB;QACnBC,qBAAqB;QACrBC,eAAe;QACf,8BAA8B;QAC9B,qBAAqB;QACrB,sBAAsB;QACtB,sBAAsB;QACtB,sBAAsB;QACtB,iCAAiC;QACjC,0BAA0B;QAC1B,iCAAiC;QACjC,iCAAiC;QACjC,qBAAqB;QACrB,sBAAsB;QACtB,gCAAgC;QAChC,0BAA0B;QAC1B,oBAAoB;QACpB,oBAAoB;QACpB,8BAA8B;QAC9B,oBAAoB;QACpB,0BAA0B;QAC1B,sBAAsB;QACtB,uBAAuB;QACvBC,qBAAqB;QACrBC,eAAe;QACfC,aAAa;QACbC,qBAAqB;QACrBC,qBAAqB;QACrBC,SAAS;QACTC,MAAM;QACNC,iBAAiB;QACjBC,iBAAiB;QACjB,+BAA+B;QAC/B,iCAAiC;QACjC,mCAAmC;QACnCC,aAAa;QACbC,qBAAqB;QACrBC,wBAAwB;IAC1B;AACF,EAAC;AAED,OAAO,MAAMC,KAAqB;IAChCC,YAAY;IACZC,cAAcrB;AAChB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"az.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/az.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,+
|
|
1
|
+
{"version":3,"file":"az.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/az.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,+BA4C5B,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|
|
@@ -28,6 +28,9 @@ export const azTranslations = {
|
|
|
28
28
|
'field-summary-label': 'İdxalın İcmalı',
|
|
29
29
|
importDocumentLabel: '{{label}} İmport et',
|
|
30
30
|
importResults: 'İdxal Nəticələri',
|
|
31
|
+
limitCapped: 'Limit maksimum {{limit}} ilə məhdudlaşdırıldı',
|
|
32
|
+
limitExceededExport: 'İxrac {{limit}} sənədə məhdudlaşdırılır',
|
|
33
|
+
limitExceededImport: 'İmport faylı {{count}} sənəd içərir, lakin limit {{limit}}dir',
|
|
31
34
|
matchBy: 'Üst-üstə düşməklə',
|
|
32
35
|
mode: 'Rejim',
|
|
33
36
|
noDataToPreview: 'Heç bir məlumatı öncədən baxmaq üçün yoxdur.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/translations/languages/az.ts"],"sourcesContent":["import type { PluginDefaultTranslationsObject, PluginLanguage } from '../types.js'\n\nexport const azTranslations: PluginDefaultTranslationsObject = {\n 'plugin-import-export': {\n allLocales: 'Bütün yerlər',\n collectionRequired: 'Preview göstərmək üçün Kolleksiya tələb olunur',\n documentsToExport: '{{count}} sənəd ixrac üçün',\n documentsToImport: '{{count}} sənəd idxal üçün',\n exportDocumentLabel: '{{label}} ixrac edin',\n exportOptions: 'İxrac Variantları',\n 'field-collectionSlug-label': 'Kolleksiya',\n 'field-depth-label': 'Dərinlik',\n 'field-drafts-label': 'Qaralamaları daxil etin',\n 'field-fields-label': 'Sahələr',\n 'field-format-label': 'İxrac Formatı',\n 'field-importMode-create-label': 'Yeni sənədlər yaratın',\n 'field-importMode-label': 'İdxal Rejimi',\n 'field-importMode-update-label': 'Mövcud sənədləri yeniləyin',\n 'field-importMode-upsert-label': 'Sənədləri yaradın və ya yeniləyin',\n 'field-limit-label': 'Hədd',\n 'field-locale-label': 'Yerli',\n 'field-matchField-description': 'Mövcud sənədlərlə uyğunlaşma üçün istifadə ediləcək sahə',\n 'field-matchField-label': 'Uyğun Sahə',\n 'field-name-label': 'Fayl adı',\n 'field-page-label': 'Səhifə',\n 'field-selectionToUse-label': 'İstifadə etmək üçün seçim',\n 'field-sort-label': 'Sırala',\n 'field-sort-order-label': 'Sıralama',\n 'field-status-label': 'Status',\n 'field-summary-label': 'İdxalın İcmalı',\n importDocumentLabel: '{{label}} İmport et',\n importResults: 'İdxal Nəticələri',\n matchBy: 'Üst-üstə düşməklə',\n mode: 'Rejim',\n noDataToPreview: 'Heç bir məlumatı öncədən baxmaq üçün yoxdur.',\n previewPageInfo: '{{start}}-{{end}} / {{total}}',\n 'selectionToUse-allDocuments': 'Bütün sənədlərdən istifadə edin',\n 'selectionToUse-currentFilters': 'Cari filtrlərdən istifadə edin',\n 'selectionToUse-currentSelection': 'Cari seçimi istifadə edin',\n startImport: 'İdxalı başlayın',\n totalDocumentsCount: '{{count}} ümumi sənəd',\n uploadFileToSeePreview: 'Faylı yükləyin ki, baxışınızı alın.',\n },\n}\n\nexport const az: PluginLanguage = {\n dateFNSKey: 'az',\n translations: azTranslations,\n}\n"],"names":["azTranslations","allLocales","collectionRequired","documentsToExport","documentsToImport","exportDocumentLabel","exportOptions","importDocumentLabel","importResults","matchBy","mode","noDataToPreview","previewPageInfo","startImport","totalDocumentsCount","uploadFileToSeePreview","az","dateFNSKey","translations"],"mappings":"AAEA,OAAO,MAAMA,iBAAkD;IAC7D,wBAAwB;QACtBC,YAAY;QACZC,oBAAoB;QACpBC,mBAAmB;QACnBC,mBAAmB;QACnBC,qBAAqB;QACrBC,eAAe;QACf,8BAA8B;QAC9B,qBAAqB;QACrB,sBAAsB;QACtB,sBAAsB;QACtB,sBAAsB;QACtB,iCAAiC;QACjC,0BAA0B;QAC1B,iCAAiC;QACjC,iCAAiC;QACjC,qBAAqB;QACrB,sBAAsB;QACtB,gCAAgC;QAChC,0BAA0B;QAC1B,oBAAoB;QACpB,oBAAoB;QACpB,8BAA8B;QAC9B,oBAAoB;QACpB,0BAA0B;QAC1B,sBAAsB;QACtB,uBAAuB;QACvBC,qBAAqB;QACrBC,eAAe;QACfC,SAAS;QACTC,MAAM;QACNC,iBAAiB;QACjBC,iBAAiB;QACjB,+BAA+B;QAC/B,iCAAiC;QACjC,mCAAmC;QACnCC,aAAa;QACbC,qBAAqB;QACrBC,wBAAwB;IAC1B;AACF,EAAC;AAED,OAAO,MAAMC,KAAqB;IAChCC,YAAY;IACZC,
|
|
1
|
+
{"version":3,"sources":["../../../src/translations/languages/az.ts"],"sourcesContent":["import type { PluginDefaultTranslationsObject, PluginLanguage } from '../types.js'\n\nexport const azTranslations: PluginDefaultTranslationsObject = {\n 'plugin-import-export': {\n allLocales: 'Bütün yerlər',\n collectionRequired: 'Preview göstərmək üçün Kolleksiya tələb olunur',\n documentsToExport: '{{count}} sənəd ixrac üçün',\n documentsToImport: '{{count}} sənəd idxal üçün',\n exportDocumentLabel: '{{label}} ixrac edin',\n exportOptions: 'İxrac Variantları',\n 'field-collectionSlug-label': 'Kolleksiya',\n 'field-depth-label': 'Dərinlik',\n 'field-drafts-label': 'Qaralamaları daxil etin',\n 'field-fields-label': 'Sahələr',\n 'field-format-label': 'İxrac Formatı',\n 'field-importMode-create-label': 'Yeni sənədlər yaratın',\n 'field-importMode-label': 'İdxal Rejimi',\n 'field-importMode-update-label': 'Mövcud sənədləri yeniləyin',\n 'field-importMode-upsert-label': 'Sənədləri yaradın və ya yeniləyin',\n 'field-limit-label': 'Hədd',\n 'field-locale-label': 'Yerli',\n 'field-matchField-description': 'Mövcud sənədlərlə uyğunlaşma üçün istifadə ediləcək sahə',\n 'field-matchField-label': 'Uyğun Sahə',\n 'field-name-label': 'Fayl adı',\n 'field-page-label': 'Səhifə',\n 'field-selectionToUse-label': 'İstifadə etmək üçün seçim',\n 'field-sort-label': 'Sırala',\n 'field-sort-order-label': 'Sıralama',\n 'field-status-label': 'Status',\n 'field-summary-label': 'İdxalın İcmalı',\n importDocumentLabel: '{{label}} İmport et',\n importResults: 'İdxal Nəticələri',\n limitCapped: 'Limit maksimum {{limit}} ilə məhdudlaşdırıldı',\n limitExceededExport: 'İxrac {{limit}} sənədə məhdudlaşdırılır',\n limitExceededImport: 'İmport faylı {{count}} sənəd içərir, lakin limit {{limit}}dir',\n matchBy: 'Üst-üstə düşməklə',\n mode: 'Rejim',\n noDataToPreview: 'Heç bir məlumatı öncədən baxmaq üçün yoxdur.',\n previewPageInfo: '{{start}}-{{end}} / {{total}}',\n 'selectionToUse-allDocuments': 'Bütün sənədlərdən istifadə edin',\n 'selectionToUse-currentFilters': 'Cari filtrlərdən istifadə edin',\n 'selectionToUse-currentSelection': 'Cari seçimi istifadə edin',\n startImport: 'İdxalı başlayın',\n totalDocumentsCount: '{{count}} ümumi sənəd',\n uploadFileToSeePreview: 'Faylı yükləyin ki, baxışınızı alın.',\n },\n}\n\nexport const az: PluginLanguage = {\n dateFNSKey: 'az',\n translations: azTranslations,\n}\n"],"names":["azTranslations","allLocales","collectionRequired","documentsToExport","documentsToImport","exportDocumentLabel","exportOptions","importDocumentLabel","importResults","limitCapped","limitExceededExport","limitExceededImport","matchBy","mode","noDataToPreview","previewPageInfo","startImport","totalDocumentsCount","uploadFileToSeePreview","az","dateFNSKey","translations"],"mappings":"AAEA,OAAO,MAAMA,iBAAkD;IAC7D,wBAAwB;QACtBC,YAAY;QACZC,oBAAoB;QACpBC,mBAAmB;QACnBC,mBAAmB;QACnBC,qBAAqB;QACrBC,eAAe;QACf,8BAA8B;QAC9B,qBAAqB;QACrB,sBAAsB;QACtB,sBAAsB;QACtB,sBAAsB;QACtB,iCAAiC;QACjC,0BAA0B;QAC1B,iCAAiC;QACjC,iCAAiC;QACjC,qBAAqB;QACrB,sBAAsB;QACtB,gCAAgC;QAChC,0BAA0B;QAC1B,oBAAoB;QACpB,oBAAoB;QACpB,8BAA8B;QAC9B,oBAAoB;QACpB,0BAA0B;QAC1B,sBAAsB;QACtB,uBAAuB;QACvBC,qBAAqB;QACrBC,eAAe;QACfC,aAAa;QACbC,qBAAqB;QACrBC,qBAAqB;QACrBC,SAAS;QACTC,MAAM;QACNC,iBAAiB;QACjBC,iBAAiB;QACjB,+BAA+B;QAC/B,iCAAiC;QACjC,mCAAmC;QACnCC,aAAa;QACbC,qBAAqB;QACrBC,wBAAwB;IAC1B;AACF,EAAC;AAED,OAAO,MAAMC,KAAqB;IAChCC,YAAY;IACZC,cAAcrB;AAChB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bg.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/bg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,+
|
|
1
|
+
{"version":3,"file":"bg.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/bg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,+BA6C5B,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|
|
@@ -28,6 +28,9 @@ export const bgTranslations = {
|
|
|
28
28
|
'field-summary-label': 'Обобщение за импортирането',
|
|
29
29
|
importDocumentLabel: 'Импортиране {{label}}',
|
|
30
30
|
importResults: 'Резултати от импортирането',
|
|
31
|
+
limitCapped: 'Лимитът е ограничен до максимум {{limit}}',
|
|
32
|
+
limitExceededExport: 'Експортирането е ограничено до {{limit}} документа',
|
|
33
|
+
limitExceededImport: 'Файлът за импортиране съдържа {{count}} документи, но лимитът е {{limit}}',
|
|
31
34
|
matchBy: 'Съвпадение по',
|
|
32
35
|
mode: 'Могощности',
|
|
33
36
|
noDataToPreview: 'Няма данни за преглед.',
|