@strapi/data-transfer 5.51.2 → 5.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/strapi/providers/local-destination/strategies/restore/index.js +1 -0
  2. package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
  3. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +1 -0
  4. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
  5. package/dist/strapi/providers/local-destination/strategies/restore/links.d.ts +1 -0
  6. package/dist/strapi/providers/local-destination/strategies/restore/links.d.ts.map +1 -1
  7. package/dist/strapi/providers/local-destination/strategies/restore/links.js +57 -4
  8. package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -1
  9. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +57 -5
  10. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -1
  11. package/dist/strapi/providers/local-source/index.d.ts.map +1 -1
  12. package/dist/strapi/providers/local-source/index.js +6 -1
  13. package/dist/strapi/providers/local-source/index.js.map +1 -1
  14. package/dist/strapi/providers/local-source/index.mjs +6 -1
  15. package/dist/strapi/providers/local-source/index.mjs.map +1 -1
  16. package/dist/strapi/providers/local-source/links.d.ts +4 -1
  17. package/dist/strapi/providers/local-source/links.d.ts.map +1 -1
  18. package/dist/strapi/providers/local-source/links.js +16 -2
  19. package/dist/strapi/providers/local-source/links.js.map +1 -1
  20. package/dist/strapi/providers/local-source/links.mjs +16 -3
  21. package/dist/strapi/providers/local-source/links.mjs.map +1 -1
  22. package/dist/strapi/queries/link.d.ts +4 -1
  23. package/dist/strapi/queries/link.d.ts.map +1 -1
  24. package/dist/strapi/queries/link.js +271 -64
  25. package/dist/strapi/queries/link.js.map +1 -1
  26. package/dist/strapi/queries/link.mjs +271 -64
  27. package/dist/strapi/queries/link.mjs.map +1 -1
  28. package/dist/utils/capped-warnings.d.ts +9 -0
  29. package/dist/utils/capped-warnings.d.ts.map +1 -0
  30. package/dist/utils/capped-warnings.js +28 -0
  31. package/dist/utils/capped-warnings.js.map +1 -0
  32. package/dist/utils/capped-warnings.mjs +25 -0
  33. package/dist/utils/capped-warnings.mjs.map +1 -0
  34. package/dist/utils/index.d.ts +1 -0
  35. package/dist/utils/index.d.ts.map +1 -1
  36. package/dist/utils/index.js +3 -0
  37. package/dist/utils/index.js.map +1 -1
  38. package/dist/utils/index.mjs +1 -0
  39. package/dist/utils/index.mjs.map +1 -1
  40. package/package.json +7 -7
@@ -7,6 +7,7 @@ require('stream');
7
7
  require('lodash');
8
8
  require('@strapi/utils');
9
9
  var configuration = require('./configuration.js');
10
+ require('crypto');
10
11
 
11
12
  const deleteRecords = async (strapi, options)=>{
12
13
  const entities = await deleteEntitiesRecords(strapi, options);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType = entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType = entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
@@ -5,6 +5,7 @@ import 'stream';
5
5
  import 'lodash';
6
6
  import '@strapi/utils';
7
7
  export { createConfigurationWriteStream, restoreConfigs } from './configuration.mjs';
8
+ import 'crypto';
8
9
 
9
10
  const deleteRecords = async (strapi, options)=>{
10
11
  const entities = await deleteEntitiesRecords(strapi, options);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType = entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType = entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Writable } from 'stream';
2
2
  import type { Core } from '@strapi/types';
3
3
  import { Transaction } from '../../../../../types';
4
+ export declare const formatSkippedLinksRestoreSummary: (unmapped: number, foreignKey: number) => string | null;
4
5
  export declare const createLinksWriteStream: (mapID: (uid: string, id: number) => number | undefined, strapi: Core.Strapi, transaction?: Transaction, onWarning?: (message: string) => void) => Writable;
5
6
  //# sourceMappingURL=links.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAS,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAwB1D,eAAO,MAAM,sBAAsB,GACjC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EACtD,QAAQ,IAAI,CAAC,MAAM,EACnB,cAAc,WAAW,EACzB,YAAY,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,aA6DtC,CAAC"}
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAS,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA8C1D,eAAO,MAAM,gCAAgC,GAAI,UAAU,MAAM,EAAE,YAAY,MAAM,kBAkBpF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EACtD,QAAQ,IAAI,CAAC,MAAM,EACnB,cAAc,WAAW,EACzB,YAAY,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,aAoFtC,CAAC"}
@@ -1,7 +1,9 @@
1
1
  'use strict';
2
2
 
3
+ var crypto = require('crypto');
3
4
  var stream = require('stream');
4
5
  var providers = require('../../../../../errors/providers.js');
6
+ var cappedWarnings = require('../../../../../utils/capped-warnings.js');
5
7
  var link = require('../../../../queries/link.js');
6
8
  var resolveLinkRef = require('./resolve-link-ref.js');
7
9
 
@@ -27,7 +29,44 @@ const isForeignKeyConstraintError = (e)=>{
27
29
  }
28
30
  return e.message.toLowerCase().includes('foreign key constraint');
29
31
  };
32
+ const isAbortedTransactionError = (e)=>{
33
+ return isErrorWithCode(e) && e.code === '25P02';
34
+ };
35
+ const isPostgresDialect = (strapi)=>strapi.db?.dialect?.client === 'postgres';
36
+ const withSavepoint = async (trx, fn)=>{
37
+ const savepoint = `sp_${crypto.randomUUID().replace(/-/g, '')}`;
38
+ await trx.raw(`SAVEPOINT ${savepoint}`);
39
+ try {
40
+ const result = await fn();
41
+ await trx.raw(`RELEASE SAVEPOINT ${savepoint}`);
42
+ return result;
43
+ } catch (error) {
44
+ await trx.raw(`ROLLBACK TO SAVEPOINT ${savepoint}`);
45
+ throw error;
46
+ }
47
+ };
48
+ const formatSkippedLinksRestoreSummary = (unmapped, foreignKey)=>{
49
+ const total = unmapped + foreignKey;
50
+ if (total === 0) {
51
+ return null;
52
+ }
53
+ const parts = [];
54
+ if (unmapped > 0) {
55
+ parts.push(`${unmapped} unmapped`);
56
+ }
57
+ if (foreignKey > 0) {
58
+ parts.push(`${foreignKey} foreign key`);
59
+ }
60
+ return `Links restore skipped ${total} relation(s) (${parts.join(', ')}). Verify relations in the admin after transfer.`;
61
+ };
30
62
  const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
63
+ let skippedUnmapped = 0;
64
+ let skippedForeignKey = 0;
65
+ const warnings = cappedWarnings.createCappedWarningReporter(onWarning);
66
+ // Only PostgreSQL aborts the surrounding transaction on a statement error
67
+ // (25P02). MySQL and SQLite keep the transaction usable after an FK failure,
68
+ // so per-link savepoints are unnecessary there.
69
+ const useSavepoints = isPostgresDialect(strapi);
31
70
  return new stream.Writable({
32
71
  objectMode: true,
33
72
  async write (link$1, _encoding, callback) {
@@ -53,17 +92,23 @@ const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
53
92
  `${right.type}:${originalRightRef}`
54
93
  ] : []
55
94
  ].join(' and ');
56
- onWarning?.(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`);
95
+ warnings.warn(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`);
96
+ skippedUnmapped += 1;
57
97
  return callback(null);
58
98
  }
59
99
  left.ref = mappedLeftRef;
60
100
  right.ref = mappedRightRef;
61
101
  try {
62
- await query().insert(link$1);
102
+ if (trx && useSavepoints) {
103
+ await withSavepoint(trx, ()=>query().insert(link$1));
104
+ } else {
105
+ await query().insert(link$1);
106
+ }
63
107
  } catch (e) {
64
108
  if (e instanceof Error) {
65
- if (isForeignKeyConstraintError(e)) {
66
- onWarning?.(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`);
109
+ if (isForeignKeyConstraintError(e) || isAbortedTransactionError(e)) {
110
+ warnings.warn(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`);
111
+ skippedForeignKey += 1;
67
112
  return callback(null);
68
113
  }
69
114
  return callback(e);
@@ -72,9 +117,17 @@ const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
72
117
  }
73
118
  callback(null);
74
119
  });
120
+ },
121
+ final (callback) {
122
+ const summary = formatSkippedLinksRestoreSummary(skippedUnmapped, skippedForeignKey);
123
+ if (summary) {
124
+ onWarning?.(summary);
125
+ }
126
+ callback();
75
127
  }
76
128
  });
77
129
  };
78
130
 
79
131
  exports.createLinksWriteStream = createLinksWriteStream;
132
+ exports.formatSkippedLinksRestoreSummary = formatSkippedLinksRestoreSummary;
80
133
  //# sourceMappingURL=links.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../types';\nimport { createLinkQuery } from '../../../../queries/link';\nimport { resolveLinkRef } from './resolve-link-ref';\n\ninterface ErrorWithCode extends Error {\n code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n const POSTGRES_FK_ERROR_CODE = '23503';\n const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n if (isErrorWithCode(e) && e.code) {\n return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n }\n\n return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nexport const createLinksWriteStream = (\n mapID: (uid: string, id: number) => number | undefined,\n strapi: Core.Strapi,\n transaction?: Transaction,\n onWarning?: (message: string) => void\n) => {\n return new Writable({\n objectMode: true,\n async write(link: ILink, _encoding, callback) {\n await transaction?.attach(async (trx) => {\n const { left, right } = link;\n const query = createLinkQuery(strapi, trx);\n\n const originalLeftRef = left.ref;\n const originalRightRef = right.ref;\n\n const mappedLeftRef = resolveLinkRef(strapi, link, 'left', mapID);\n const mappedRightRef = resolveLinkRef(strapi, link, 'right', mapID);\n\n // A missing mapping means the referenced row was never transferred\n // during the entities stage (e.g. an orphaned component or a dangling\n // reference in the source database). Falling back to the original ID\n // would either violate a foreign key constraint — which aborts the\n // whole transaction on PostgreSQL — or silently attach the link to an\n // unrelated row, so the link is skipped instead.\n if (mappedLeftRef === undefined || mappedRightRef === undefined) {\n const missingRefs = [\n ...(mappedLeftRef === undefined ? [`${left.type}:${originalLeftRef}`] : []),\n ...(mappedRightRef === undefined ? [`${right.type}:${originalRightRef}`] : []),\n ].join(' and ');\n\n onWarning?.(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`\n );\n\n return callback(null);\n }\n\n left.ref = mappedLeftRef;\n right.ref = mappedRightRef;\n\n try {\n await query().insert(link);\n } catch (e) {\n if (e instanceof Error) {\n if (isForeignKeyConstraintError(e)) {\n onWarning?.(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n );\n return callback(null);\n }\n return callback(e);\n }\n\n return callback(\n new ProviderTransferError(\n `An error happened while trying to import a ${left.type} link.`\n )\n );\n }\n\n callback(null);\n });\n },\n });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","createLinksWriteStream","mapID","strapi","transaction","onWarning","Writable","objectMode","write","link","_encoding","callback","attach","trx","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","mappedLeftRef","resolveLinkRef","mappedRightRef","undefined","missingRefs","type","join","insert","Error","ProviderTransferError"],"mappings":"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"}
1
+ {"version":3,"file":"links.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport type { Knex } from 'knex';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../types';\nimport { createCappedWarningReporter } from '../../../../../utils/capped-warnings';\nimport { createLinkQuery } from '../../../../queries/link';\nimport { resolveLinkRef } from './resolve-link-ref';\n\ninterface ErrorWithCode extends Error {\n code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n const POSTGRES_FK_ERROR_CODE = '23503';\n const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n if (isErrorWithCode(e) && e.code) {\n return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n }\n\n return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nconst isAbortedTransactionError = (e: Error) => {\n return isErrorWithCode(e) && e.code === '25P02';\n};\n\nconst isPostgresDialect = (strapi: Core.Strapi) => strapi.db?.dialect?.client === 'postgres';\n\nconst withSavepoint = async <T>(trx: Knex.Transaction, fn: () => Promise<T>) => {\n const savepoint = `sp_${randomUUID().replace(/-/g, '')}`;\n\n await trx.raw(`SAVEPOINT ${savepoint}`);\n\n try {\n const result = await fn();\n await trx.raw(`RELEASE SAVEPOINT ${savepoint}`);\n return result;\n } catch (error) {\n await trx.raw(`ROLLBACK TO SAVEPOINT ${savepoint}`);\n throw error;\n }\n};\n\nexport const formatSkippedLinksRestoreSummary = (unmapped: number, foreignKey: number) => {\n const total = unmapped + foreignKey;\n\n if (total === 0) {\n return null;\n }\n\n const parts = [];\n\n if (unmapped > 0) {\n parts.push(`${unmapped} unmapped`);\n }\n\n if (foreignKey > 0) {\n parts.push(`${foreignKey} foreign key`);\n }\n\n return `Links restore skipped ${total} relation(s) (${parts.join(', ')}). Verify relations in the admin after transfer.`;\n};\n\nexport const createLinksWriteStream = (\n mapID: (uid: string, id: number) => number | undefined,\n strapi: Core.Strapi,\n transaction?: Transaction,\n onWarning?: (message: string) => void\n) => {\n let skippedUnmapped = 0;\n let skippedForeignKey = 0;\n const warnings = createCappedWarningReporter(onWarning);\n // Only PostgreSQL aborts the surrounding transaction on a statement error\n // (25P02). MySQL and SQLite keep the transaction usable after an FK failure,\n // so per-link savepoints are unnecessary there.\n const useSavepoints = isPostgresDialect(strapi);\n\n return new Writable({\n objectMode: true,\n async write(link: ILink, _encoding, callback) {\n await transaction?.attach(async (trx) => {\n const { left, right } = link;\n const query = createLinkQuery(strapi, trx);\n\n const originalLeftRef = left.ref;\n const originalRightRef = right.ref;\n\n const mappedLeftRef = resolveLinkRef(strapi, link, 'left', mapID);\n const mappedRightRef = resolveLinkRef(strapi, link, 'right', mapID);\n\n // A missing mapping means the referenced row was never transferred\n // during the entities stage (e.g. an orphaned component or a dangling\n // reference in the source database). Falling back to the original ID\n // would either violate a foreign key constraint — which aborts the\n // whole transaction on PostgreSQL — or silently attach the link to an\n // unrelated row, so the link is skipped instead.\n if (mappedLeftRef === undefined || mappedRightRef === undefined) {\n const missingRefs = [\n ...(mappedLeftRef === undefined ? [`${left.type}:${originalLeftRef}`] : []),\n ...(mappedRightRef === undefined ? [`${right.type}:${originalRightRef}`] : []),\n ].join(' and ');\n\n warnings.warn(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`\n );\n\n skippedUnmapped += 1;\n return callback(null);\n }\n\n left.ref = mappedLeftRef;\n right.ref = mappedRightRef;\n\n try {\n if (trx && useSavepoints) {\n await withSavepoint(trx, () => query().insert(link));\n } else {\n await query().insert(link);\n }\n } catch (e) {\n if (e instanceof Error) {\n if (isForeignKeyConstraintError(e) || isAbortedTransactionError(e)) {\n warnings.warn(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n );\n skippedForeignKey += 1;\n return callback(null);\n }\n return callback(e);\n }\n\n return callback(\n new ProviderTransferError(\n `An error happened while trying to import a ${left.type} link.`\n )\n );\n }\n\n callback(null);\n });\n },\n final(callback) {\n const summary = formatSkippedLinksRestoreSummary(skippedUnmapped, skippedForeignKey);\n\n if (summary) {\n onWarning?.(summary);\n }\n\n callback();\n },\n });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","isAbortedTransactionError","isPostgresDialect","strapi","db","dialect","client","withSavepoint","trx","fn","savepoint","randomUUID","replace","raw","result","formatSkippedLinksRestoreSummary","unmapped","foreignKey","total","parts","push","join","createLinksWriteStream","mapID","transaction","onWarning","skippedUnmapped","skippedForeignKey","warnings","createCappedWarningReporter","useSavepoints","Writable","objectMode","write","link","_encoding","callback","attach","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","mappedLeftRef","resolveLinkRef","mappedRightRef","undefined","missingRefs","type","warn","insert","Error","ProviderTransferError","final","summary"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
+ import { randomUUID } from 'crypto';
1
2
  import { Writable } from 'stream';
2
3
  import { ProviderTransferError } from '../../../../../errors/providers.mjs';
4
+ import { createCappedWarningReporter } from '../../../../../utils/capped-warnings.mjs';
3
5
  import { createLinkQuery } from '../../../../queries/link.mjs';
4
6
  import { resolveLinkRef } from './resolve-link-ref.mjs';
5
7
 
@@ -25,7 +27,44 @@ const isForeignKeyConstraintError = (e)=>{
25
27
  }
26
28
  return e.message.toLowerCase().includes('foreign key constraint');
27
29
  };
30
+ const isAbortedTransactionError = (e)=>{
31
+ return isErrorWithCode(e) && e.code === '25P02';
32
+ };
33
+ const isPostgresDialect = (strapi)=>strapi.db?.dialect?.client === 'postgres';
34
+ const withSavepoint = async (trx, fn)=>{
35
+ const savepoint = `sp_${randomUUID().replace(/-/g, '')}`;
36
+ await trx.raw(`SAVEPOINT ${savepoint}`);
37
+ try {
38
+ const result = await fn();
39
+ await trx.raw(`RELEASE SAVEPOINT ${savepoint}`);
40
+ return result;
41
+ } catch (error) {
42
+ await trx.raw(`ROLLBACK TO SAVEPOINT ${savepoint}`);
43
+ throw error;
44
+ }
45
+ };
46
+ const formatSkippedLinksRestoreSummary = (unmapped, foreignKey)=>{
47
+ const total = unmapped + foreignKey;
48
+ if (total === 0) {
49
+ return null;
50
+ }
51
+ const parts = [];
52
+ if (unmapped > 0) {
53
+ parts.push(`${unmapped} unmapped`);
54
+ }
55
+ if (foreignKey > 0) {
56
+ parts.push(`${foreignKey} foreign key`);
57
+ }
58
+ return `Links restore skipped ${total} relation(s) (${parts.join(', ')}). Verify relations in the admin after transfer.`;
59
+ };
28
60
  const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
61
+ let skippedUnmapped = 0;
62
+ let skippedForeignKey = 0;
63
+ const warnings = createCappedWarningReporter(onWarning);
64
+ // Only PostgreSQL aborts the surrounding transaction on a statement error
65
+ // (25P02). MySQL and SQLite keep the transaction usable after an FK failure,
66
+ // so per-link savepoints are unnecessary there.
67
+ const useSavepoints = isPostgresDialect(strapi);
29
68
  return new Writable({
30
69
  objectMode: true,
31
70
  async write (link, _encoding, callback) {
@@ -51,17 +90,23 @@ const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
51
90
  `${right.type}:${originalRightRef}`
52
91
  ] : []
53
92
  ].join(' and ');
54
- onWarning?.(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`);
93
+ warnings.warn(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`);
94
+ skippedUnmapped += 1;
55
95
  return callback(null);
56
96
  }
57
97
  left.ref = mappedLeftRef;
58
98
  right.ref = mappedRightRef;
59
99
  try {
60
- await query().insert(link);
100
+ if (trx && useSavepoints) {
101
+ await withSavepoint(trx, ()=>query().insert(link));
102
+ } else {
103
+ await query().insert(link);
104
+ }
61
105
  } catch (e) {
62
106
  if (e instanceof Error) {
63
- if (isForeignKeyConstraintError(e)) {
64
- onWarning?.(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`);
107
+ if (isForeignKeyConstraintError(e) || isAbortedTransactionError(e)) {
108
+ warnings.warn(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`);
109
+ skippedForeignKey += 1;
65
110
  return callback(null);
66
111
  }
67
112
  return callback(e);
@@ -70,9 +115,16 @@ const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
70
115
  }
71
116
  callback(null);
72
117
  });
118
+ },
119
+ final (callback) {
120
+ const summary = formatSkippedLinksRestoreSummary(skippedUnmapped, skippedForeignKey);
121
+ if (summary) {
122
+ onWarning?.(summary);
123
+ }
124
+ callback();
73
125
  }
74
126
  });
75
127
  };
76
128
 
77
- export { createLinksWriteStream };
129
+ export { createLinksWriteStream, formatSkippedLinksRestoreSummary };
78
130
  //# sourceMappingURL=links.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../types';\nimport { createLinkQuery } from '../../../../queries/link';\nimport { resolveLinkRef } from './resolve-link-ref';\n\ninterface ErrorWithCode extends Error {\n code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n const POSTGRES_FK_ERROR_CODE = '23503';\n const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n if (isErrorWithCode(e) && e.code) {\n return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n }\n\n return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nexport const createLinksWriteStream = (\n mapID: (uid: string, id: number) => number | undefined,\n strapi: Core.Strapi,\n transaction?: Transaction,\n onWarning?: (message: string) => void\n) => {\n return new Writable({\n objectMode: true,\n async write(link: ILink, _encoding, callback) {\n await transaction?.attach(async (trx) => {\n const { left, right } = link;\n const query = createLinkQuery(strapi, trx);\n\n const originalLeftRef = left.ref;\n const originalRightRef = right.ref;\n\n const mappedLeftRef = resolveLinkRef(strapi, link, 'left', mapID);\n const mappedRightRef = resolveLinkRef(strapi, link, 'right', mapID);\n\n // A missing mapping means the referenced row was never transferred\n // during the entities stage (e.g. an orphaned component or a dangling\n // reference in the source database). Falling back to the original ID\n // would either violate a foreign key constraint — which aborts the\n // whole transaction on PostgreSQL — or silently attach the link to an\n // unrelated row, so the link is skipped instead.\n if (mappedLeftRef === undefined || mappedRightRef === undefined) {\n const missingRefs = [\n ...(mappedLeftRef === undefined ? [`${left.type}:${originalLeftRef}`] : []),\n ...(mappedRightRef === undefined ? [`${right.type}:${originalRightRef}`] : []),\n ].join(' and ');\n\n onWarning?.(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`\n );\n\n return callback(null);\n }\n\n left.ref = mappedLeftRef;\n right.ref = mappedRightRef;\n\n try {\n await query().insert(link);\n } catch (e) {\n if (e instanceof Error) {\n if (isForeignKeyConstraintError(e)) {\n onWarning?.(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n );\n return callback(null);\n }\n return callback(e);\n }\n\n return callback(\n new ProviderTransferError(\n `An error happened while trying to import a ${left.type} link.`\n )\n );\n }\n\n callback(null);\n });\n },\n });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","createLinksWriteStream","mapID","strapi","transaction","onWarning","Writable","objectMode","write","link","_encoding","callback","attach","trx","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","mappedLeftRef","resolveLinkRef","mappedRightRef","undefined","missingRefs","type","join","insert","Error","ProviderTransferError"],"mappings":"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"}
1
+ {"version":3,"file":"links.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport type { Knex } from 'knex';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../types';\nimport { createCappedWarningReporter } from '../../../../../utils/capped-warnings';\nimport { createLinkQuery } from '../../../../queries/link';\nimport { resolveLinkRef } from './resolve-link-ref';\n\ninterface ErrorWithCode extends Error {\n code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n const POSTGRES_FK_ERROR_CODE = '23503';\n const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n if (isErrorWithCode(e) && e.code) {\n return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n }\n\n return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nconst isAbortedTransactionError = (e: Error) => {\n return isErrorWithCode(e) && e.code === '25P02';\n};\n\nconst isPostgresDialect = (strapi: Core.Strapi) => strapi.db?.dialect?.client === 'postgres';\n\nconst withSavepoint = async <T>(trx: Knex.Transaction, fn: () => Promise<T>) => {\n const savepoint = `sp_${randomUUID().replace(/-/g, '')}`;\n\n await trx.raw(`SAVEPOINT ${savepoint}`);\n\n try {\n const result = await fn();\n await trx.raw(`RELEASE SAVEPOINT ${savepoint}`);\n return result;\n } catch (error) {\n await trx.raw(`ROLLBACK TO SAVEPOINT ${savepoint}`);\n throw error;\n }\n};\n\nexport const formatSkippedLinksRestoreSummary = (unmapped: number, foreignKey: number) => {\n const total = unmapped + foreignKey;\n\n if (total === 0) {\n return null;\n }\n\n const parts = [];\n\n if (unmapped > 0) {\n parts.push(`${unmapped} unmapped`);\n }\n\n if (foreignKey > 0) {\n parts.push(`${foreignKey} foreign key`);\n }\n\n return `Links restore skipped ${total} relation(s) (${parts.join(', ')}). Verify relations in the admin after transfer.`;\n};\n\nexport const createLinksWriteStream = (\n mapID: (uid: string, id: number) => number | undefined,\n strapi: Core.Strapi,\n transaction?: Transaction,\n onWarning?: (message: string) => void\n) => {\n let skippedUnmapped = 0;\n let skippedForeignKey = 0;\n const warnings = createCappedWarningReporter(onWarning);\n // Only PostgreSQL aborts the surrounding transaction on a statement error\n // (25P02). MySQL and SQLite keep the transaction usable after an FK failure,\n // so per-link savepoints are unnecessary there.\n const useSavepoints = isPostgresDialect(strapi);\n\n return new Writable({\n objectMode: true,\n async write(link: ILink, _encoding, callback) {\n await transaction?.attach(async (trx) => {\n const { left, right } = link;\n const query = createLinkQuery(strapi, trx);\n\n const originalLeftRef = left.ref;\n const originalRightRef = right.ref;\n\n const mappedLeftRef = resolveLinkRef(strapi, link, 'left', mapID);\n const mappedRightRef = resolveLinkRef(strapi, link, 'right', mapID);\n\n // A missing mapping means the referenced row was never transferred\n // during the entities stage (e.g. an orphaned component or a dangling\n // reference in the source database). Falling back to the original ID\n // would either violate a foreign key constraint — which aborts the\n // whole transaction on PostgreSQL — or silently attach the link to an\n // unrelated row, so the link is skipped instead.\n if (mappedLeftRef === undefined || mappedRightRef === undefined) {\n const missingRefs = [\n ...(mappedLeftRef === undefined ? [`${left.type}:${originalLeftRef}`] : []),\n ...(mappedRightRef === undefined ? [`${right.type}:${originalRightRef}`] : []),\n ].join(' and ');\n\n warnings.warn(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`\n );\n\n skippedUnmapped += 1;\n return callback(null);\n }\n\n left.ref = mappedLeftRef;\n right.ref = mappedRightRef;\n\n try {\n if (trx && useSavepoints) {\n await withSavepoint(trx, () => query().insert(link));\n } else {\n await query().insert(link);\n }\n } catch (e) {\n if (e instanceof Error) {\n if (isForeignKeyConstraintError(e) || isAbortedTransactionError(e)) {\n warnings.warn(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n );\n skippedForeignKey += 1;\n return callback(null);\n }\n return callback(e);\n }\n\n return callback(\n new ProviderTransferError(\n `An error happened while trying to import a ${left.type} link.`\n )\n );\n }\n\n callback(null);\n });\n },\n final(callback) {\n const summary = formatSkippedLinksRestoreSummary(skippedUnmapped, skippedForeignKey);\n\n if (summary) {\n onWarning?.(summary);\n }\n\n callback();\n },\n });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","isAbortedTransactionError","isPostgresDialect","strapi","db","dialect","client","withSavepoint","trx","fn","savepoint","randomUUID","replace","raw","result","formatSkippedLinksRestoreSummary","unmapped","foreignKey","total","parts","push","join","createLinksWriteStream","mapID","transaction","onWarning","skippedUnmapped","skippedForeignKey","warnings","createCappedWarningReporter","useSavepoints","Writable","objectMode","write","link","_encoding","callback","attach","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","mappedLeftRef","resolveLinkRef","mappedRightRef","undefined","missingRefs","type","warn","insert","Error","ProviderTransferError","final","summary"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/local-source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AASrE,MAAM,WAAW,iCAAiC;IAChD,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,+BAA+B,GAAI,SAAS,iCAAiC,8BAEzF,CAAC;AAEF,cAAM,yBAA0B,YAAW,eAAe;;IACxD,IAAI,SAA0B;IAE9B,IAAI,EAAE,YAAY,CAAY;IAE9B,OAAO,EAAE,iCAAiC,CAAC;IAE3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;gBAIT,OAAO,EAAE,iCAAiC;IAIhD,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4D3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,WAAW,IAAI,SAAS;IAclB,wBAAwB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAiBnD,qBAAqB,IAAI,QAAQ;IAOjC,6BAA6B,IAAI,QAAQ;IAMzC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAW3C,uBAAuB,IAAI,QAAQ;IAInC,sBAAsB,IAAI,QAAQ;IAc5B,cAAc,CAAC,KAAK,EAAE,aAAa;CAO1C;AAED,MAAM,MAAM,0BAA0B,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/local-source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AASrE,MAAM,WAAW,iCAAiC;IAChD,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,+BAA+B,GAAI,SAAS,iCAAiC,8BAEzF,CAAC;AAEF,cAAM,yBAA0B,YAAW,eAAe;;IACxD,IAAI,SAA0B;IAE9B,IAAI,EAAE,YAAY,CAAY;IAE9B,OAAO,EAAE,iCAAiC,CAAC;IAE3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;gBAIT,OAAO,EAAE,iCAAiC;IAIhD,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4D3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,WAAW,IAAI,SAAS;IAclB,wBAAwB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAiBnD,qBAAqB,IAAI,QAAQ;IAYjC,6BAA6B,IAAI,QAAQ;IAMzC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAW3C,uBAAuB,IAAI,QAAQ;IAInC,sBAAsB,IAAI,QAAQ;IAc5B,cAAc,CAAC,KAAK,EAAE,aAAa;CAO1C;AAED,MAAM,MAAM,0BAA0B,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -78,7 +78,12 @@ class LocalStrapiSourceProvider {
78
78
  createLinksReadStream() {
79
79
  providers.assertValidStrapi(this.strapi, 'Not able to stream links');
80
80
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links read stream');
81
- return links.createLinksStream(this.strapi);
81
+ return links.createLinksStream(this.strapi, {
82
+ onWarning: (message)=>{
83
+ this.strapi?.log.warn(message);
84
+ _class_private_field_loose_base(this, _reportWarning)[_reportWarning](message);
85
+ }
86
+ });
82
87
  }
83
88
  createConfigurationReadStream() {
84
89
  providers.assertValidStrapi(this.strapi, 'Not able to stream configuration');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport { estimateAssetTotals } from './estimate-asset-totals';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'warning',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi);\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi, {\n onWarning: (message) => {\n this.strapi?.log.warn(message);\n this.#reportWarning(message);\n },\n }),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi);\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi, {\n onWarning: (message) => this.#reportWarning(message),\n });\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n\n async getStageTotals(stage: TransferStage) {\n if (stage !== 'assets') {\n return null;\n }\n assertValidStrapi(this.strapi, 'Not able to estimate asset totals');\n return estimateAssetTotals(this.strapi);\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n\nexport { estimateAssetTotals } from './estimate-asset-totals';\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","onWarning","message","log","warn","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","on","err","getStageTotals","stage","estimateAssetTotals","name","type","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport { estimateAssetTotals } from './estimate-asset-totals';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'warning',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi);\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi, {\n onWarning: (message) => {\n this.strapi?.log.warn(message);\n this.#reportWarning(message);\n },\n }),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi, {\n onWarning: (message) => {\n this.strapi?.log.warn(message);\n this.#reportWarning(message);\n },\n });\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi, {\n onWarning: (message) => this.#reportWarning(message),\n });\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n\n async getStageTotals(stage: TransferStage) {\n if (stage !== 'assets') {\n return null;\n }\n assertValidStrapi(this.strapi, 'Not able to estimate asset totals');\n return estimateAssetTotals(this.strapi);\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n\nexport { estimateAssetTotals } from './estimate-asset-totals';\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","onWarning","message","log","warn","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","on","err","getStageTotals","stage","estimateAssetTotals","name","type","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,MAAMA,kCAAkC,CAACC,OAAAA,GAAAA;AAC9C,IAAA,OAAO,IAAIC,yBAAAA,CAA0BD,OAAAA,CAAAA;AACvC;AAWE,IAAA,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAYA,2EAWA,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA;;AAaC,MACD,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA;;MAgBA,kBAAA,iBAAA,8BAAA,CAAA,oBAAA,CAAA;AA9DF,MAAMC,yBAAAA,CAAAA;IAeJ,MAAMC,SAAAA,CAAUC,WAAiC,EAAiB;QAChE,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeA,WAAAA;QACpB,IAAI,CAACC,MAAM,GAAG,MAAM,IAAI,CAACJ,OAAO,CAACK,SAAS,EAAA;AAC1C,QAAA,IAAI,CAACD,MAAM,CAACE,EAAE,CAACC,UAAU,CAACC,OAAO,EAAA;AACnC,IAAA;AAwDA,IAAA,MAAMC,KAAAA,GAAuB;AAC3B,QAAA,MAAM,EAAEC,WAAW,EAAE,GAAG,IAAI,CAACV,OAAO;QACpCW,2BAAAA,CAAkB,IAAI,CAACP,MAAM,CAAA;AAC7B,QAAA,IAAI,CAACA,MAAM,CAACE,EAAE,CAACC,UAAU,CAACK,MAAM,EAAA;;QAEhC,IAAIF,WAAAA,KAAgBG,SAAAA,IAAaH,WAAAA,KAAgB,IAAA,EAAM;YACrD,MAAM,IAAI,CAACN,MAAM,EAAEU,OAAAA,EAAAA;AACrB,QAAA;AACF,IAAA;IAEAC,WAAAA,GAAyB;QACvB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,kBAAA,CAAA;QACjBJ,2BAAAA,CAAkB,IAAI,CAACP,MAAM,CAAA;QAC7B,MAAMY,aAAAA,GAAgB,IAAI,CAACZ,MAAM,CAACa,MAAM,CAACC,GAAG,CAAS,aAAA,CAAA;QACrD,MAAMC,SAAAA,GAAY,IAAIC,IAAAA,EAAAA,CAAOC,WAAW,EAAA;QAExC,OAAO;AACLF,YAAAA,SAAAA;YACAf,MAAAA,EAAQ;gBACNkB,OAAAA,EAASN;AACX;AACF,SAAA;AACF,IAAA;AAEA,IAAA,MAAMO,wBAAAA,GAA8C;QAClDZ,2BAAAA,CAAkB,IAAI,CAACP,MAAM,EAAE,6BAAA,CAAA;QAC/B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,+BAAA,CAAA;AACjB,QAAA,OAAOoB,iBAAAA,CAAM;;YAEXC,6BAAAA,CAAqB,IAAI,CAACrB,MAAM,EAAE;AAChCsB,gBAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAAA;AACV,oBAAA,IAAI,CAACvB,MAAM,EAAEwB,GAAAA,CAAIC,IAAAA,CAAKF,OAAAA,CAAAA;oBACtB,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CAAeA,OAAAA,CAAAA;AACtB,gBAAA;AACF,aAAA,CAAA;;AAGAG,YAAAA,sCAAAA;AACD,SAAA,CAAA;AACH,IAAA;IAEAC,qBAAAA,GAAkC;QAChCpB,2BAAAA,CAAkB,IAAI,CAACP,MAAM,EAAE,0BAAA,CAAA;QAC/B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,4BAAA,CAAA;AAEjB,QAAA,OAAO4B,uBAAAA,CAAkB,IAAI,CAAC5B,MAAM,EAAE;AACpCsB,YAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAAA;AACV,gBAAA,IAAI,CAACvB,MAAM,EAAEwB,GAAAA,CAAIC,IAAAA,CAAKF,OAAAA,CAAAA;gBACtB,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CAAeA,OAAAA,CAAAA;AACtB,YAAA;AACF,SAAA,CAAA;AACF,IAAA;IAEAM,6BAAAA,GAA0C;QACxCtB,2BAAAA,CAAkB,IAAI,CAACP,MAAM,EAAE,kCAAA,CAAA;QAC/B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,oCAAA,CAAA;QACjB,OAAO8B,uCAAAA,CAA0B,IAAI,CAAC9B,MAAM,CAAA;AAC9C,IAAA;IAEA+B,UAAAA,GAA4C;QAC1CxB,2BAAAA,CAAkB,IAAI,CAACP,MAAM,EAAE,yBAAA,CAAA;QAC/B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,iBAAA,CAAA;AACjB,QAAA,MAAMgC,OAAAA,GAAUC,yBAA+B,CAAC;AAC9C,YAAA,GAAG,IAAI,CAACjC,MAAM,CAACkC,YAAY;AAC3B,YAAA,GAAG,IAAI,CAAClC,MAAM,CAACmC;AACjB,SAAA,CAAA;AAEA,QAAA,OAAOF,uBAA6B,CAACD,OAAAA,CAAAA;AACvC,IAAA;IAEAI,uBAAAA,GAAoC;QAClC,OAAOC,eAAAA,CAASC,IAAI,CAACC,MAAAA,CAAOC,MAAM,CAAC,IAAI,CAACT,UAAU,EAAA,CAAA,CAAA;AACpD,IAAA;IAEAU,sBAAAA,GAAmC;QACjClC,2BAAAA,CAAkB,IAAI,CAACP,MAAM,EAAE,2BAAA,CAAA;QAC/B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,6BAAA,CAAA;AAEjB,QAAA,MAAM0C,MAAAA,GAASC,yBAAAA,CAAmB,IAAI,CAAC3C,MAAM,EAAE;AAC7CsB,YAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAY,+BAAA,CAAA,IAAI,EAAC,gBAAA,cAAA,CAAA,CAAeA,OAAAA;AAC9C,SAAA,CAAA;QACAmB,MAAAA,CAAOE,EAAE,CAAC,OAAA,EAAS,CAACC,GAAAA,GAAAA;AAClB,YAAA,+BAAA,CAAA,IAAI,EAAC,kBAAA,CAAA,CAAA,kBAAA,CAAA,CAAmB,QAAA,EAAUA,GAAAA,CAAAA;AACpC,QAAA,CAAA,CAAA;QAEA,OAAOH,MAAAA;AACT,IAAA;IAEA,MAAMI,cAAAA,CAAeC,KAAoB,EAAE;AACzC,QAAA,IAAIA,UAAU,QAAA,EAAU;YACtB,OAAO,IAAA;AACT,QAAA;QACAxC,2BAAAA,CAAkB,IAAI,CAACP,MAAM,EAAE,mCAAA,CAAA;QAC/B,OAAOgD,uCAAAA,CAAoB,IAAI,CAAChD,MAAM,CAAA;AACxC,IAAA;AA9JA,IAAA,WAAA,CAAYJ,OAA0C,CAAE;QAUxD,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAWA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAcA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAgBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,kBAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QArDA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;aARAqD,IAAAA,GAAO,sBAAA;aAEPC,IAAAA,GAAqB,QAAA;QASnB,IAAI,CAACtD,OAAO,GAAGA,OAAAA;AACjB,IAAA;AA6JF;AArJE,SAAA,WAAY2B,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAc4B,MAAAA,CAAO;QACxBC,OAAAA,EAAS;AACPrC,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfO,YAAAA,OAAAA;YACA8B,MAAAA,EAAQ;AACV,SAAA;QACAC,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAEA,SAAA,cAAe/B,OAAe,EAAA;AAC5B,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAc4B,MAAAA,CAAO;QACxBC,OAAAA,EAAS;AACPrC,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfO,YAAAA,OAAAA;YACA8B,MAAAA,EAAQ;AACV,SAAA;QACAC,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAKA,SAAA,WAAA,CAAa/B,OAAe,EAAEgC,KAAY,EAAA;AACxC,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcJ,MAAAA,CAAO;QACxBC,OAAAA,EAAS;AACPrC,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfO,YAAAA,OAAAA;AACAgC,YAAAA,KAAAA;YACAC,QAAAA,EAAU,OAAA;AACVP,YAAAA,IAAAA,EAAMM,MAAMN;AACd,SAAA;QACAK,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAKA,SAAA,iBAAA,CAAmBG,UAAkB,EAAEZ,GAAU,EAAA;AAC/C,IAAA,MAAM,EAAEtB,OAAO,EAAEmC,KAAK,EAAE,GAAGb,GAAAA;AAC3B,IAAA,MAAMc,eAAe,CAAC,yBAAyB,EAAEF,UAAAA,CAAW,cAAc,EAAElC,OAAAA,CAAAA,CAAS;AACrF,IAAA,MAAMqC,cAAAA,GAAiB;QACrBrC,OAAAA,EAASoC,YAAAA;AACTD,QAAAA,KAAAA;QACAG,SAAAA,EAAW,IAAI7C,OAAOC,WAAW;AACnC,KAAA;AAEA,IAAA,IAAI,CAACjB,MAAM,EAAEwB,GAAAA,CAAI+B,KAAAA,CAAMK,cAAAA,CAAAA;AACvB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaA,cAAAA,CAAerC,OAAO,EAAEsB,GAAAA,CAAAA;AAC5C;;;;;"}
@@ -76,7 +76,12 @@ class LocalStrapiSourceProvider {
76
76
  createLinksReadStream() {
77
77
  assertValidStrapi(this.strapi, 'Not able to stream links');
78
78
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links read stream');
79
- return createLinksStream(this.strapi);
79
+ return createLinksStream(this.strapi, {
80
+ onWarning: (message)=>{
81
+ this.strapi?.log.warn(message);
82
+ _class_private_field_loose_base(this, _reportWarning)[_reportWarning](message);
83
+ }
84
+ });
80
85
  }
81
86
  createConfigurationReadStream() {
82
87
  assertValidStrapi(this.strapi, 'Not able to stream configuration');
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport { estimateAssetTotals } from './estimate-asset-totals';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'warning',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi);\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi, {\n onWarning: (message) => {\n this.strapi?.log.warn(message);\n this.#reportWarning(message);\n },\n }),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi);\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi, {\n onWarning: (message) => this.#reportWarning(message),\n });\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n\n async getStageTotals(stage: TransferStage) {\n if (stage !== 'assets') {\n return null;\n }\n assertValidStrapi(this.strapi, 'Not able to estimate asset totals');\n return estimateAssetTotals(this.strapi);\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n\nexport { estimateAssetTotals } from './estimate-asset-totals';\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","onWarning","message","log","warn","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","on","err","getStageTotals","stage","estimateAssetTotals","name","type","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport { estimateAssetTotals } from './estimate-asset-totals';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'warning',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi);\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi, {\n onWarning: (message) => {\n this.strapi?.log.warn(message);\n this.#reportWarning(message);\n },\n }),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi, {\n onWarning: (message) => {\n this.strapi?.log.warn(message);\n this.#reportWarning(message);\n },\n });\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi, {\n onWarning: (message) => this.#reportWarning(message),\n });\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n\n async getStageTotals(stage: TransferStage) {\n if (stage !== 'assets') {\n return null;\n }\n assertValidStrapi(this.strapi, 'Not able to estimate asset totals');\n return estimateAssetTotals(this.strapi);\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n\nexport { estimateAssetTotals } from './estimate-asset-totals';\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","onWarning","message","log","warn","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","on","err","getStageTotals","stage","estimateAssetTotals","name","type","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp"],"mappings":"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"}