@strapi/strapi 5.4.0 → 5.4.2

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/cli/commands/export/action.d.ts +1 -0
  2. package/dist/cli/commands/export/action.d.ts.map +1 -1
  3. package/dist/cli/commands/export/action.js +1 -1
  4. package/dist/cli/commands/export/action.js.map +1 -1
  5. package/dist/cli/commands/export/action.mjs +1 -1
  6. package/dist/cli/commands/export/action.mjs.map +1 -1
  7. package/dist/cli/commands/export/command.d.ts.map +1 -1
  8. package/dist/cli/commands/export/command.js +1 -1
  9. package/dist/cli/commands/export/command.js.map +1 -1
  10. package/dist/cli/commands/export/command.mjs +1 -1
  11. package/dist/cli/commands/export/command.mjs.map +1 -1
  12. package/dist/cli/commands/import/action.d.ts +1 -0
  13. package/dist/cli/commands/import/action.d.ts.map +1 -1
  14. package/dist/cli/commands/import/action.js +1 -1
  15. package/dist/cli/commands/import/action.js.map +1 -1
  16. package/dist/cli/commands/import/action.mjs +1 -1
  17. package/dist/cli/commands/import/action.mjs.map +1 -1
  18. package/dist/cli/commands/import/command.d.ts.map +1 -1
  19. package/dist/cli/commands/import/command.js +1 -1
  20. package/dist/cli/commands/import/command.js.map +1 -1
  21. package/dist/cli/commands/import/command.mjs +1 -1
  22. package/dist/cli/commands/import/command.mjs.map +1 -1
  23. package/dist/cli/commands/transfer/action.d.ts +1 -0
  24. package/dist/cli/commands/transfer/action.d.ts.map +1 -1
  25. package/dist/cli/commands/transfer/action.js +1 -1
  26. package/dist/cli/commands/transfer/action.js.map +1 -1
  27. package/dist/cli/commands/transfer/action.mjs +1 -1
  28. package/dist/cli/commands/transfer/action.mjs.map +1 -1
  29. package/dist/cli/commands/transfer/command.d.ts.map +1 -1
  30. package/dist/cli/commands/transfer/command.js +1 -1
  31. package/dist/cli/commands/transfer/command.js.map +1 -1
  32. package/dist/cli/commands/transfer/command.mjs +1 -1
  33. package/dist/cli/commands/transfer/command.mjs.map +1 -1
  34. package/dist/cli/utils/data-transfer.d.ts +1 -1
  35. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  36. package/dist/cli/utils/data-transfer.js +8 -5
  37. package/dist/cli/utils/data-transfer.js.map +1 -1
  38. package/dist/cli/utils/data-transfer.mjs +9 -6
  39. package/dist/cli/utils/data-transfer.mjs.map +1 -1
  40. package/package.json +22 -22
@@ -2,6 +2,7 @@ import { engine as engineDataTransfer } from '@strapi/data-transfer';
2
2
  interface CmdOptions {
3
3
  file?: string;
4
4
  encrypt?: boolean;
5
+ verbose?: boolean;
5
6
  key?: string;
6
7
  compress?: boolean;
7
8
  only?: (keyof engineDataTransfer.TransferGroupFilter)[];
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export/action.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,MAAM,IAAI,kBAAkB,EAG7B,MAAM,uBAAuB,CAAC;AAyB/B,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;+BACyB,UAAU;AAAtC,wBA6FE"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export/action.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,MAAM,IAAI,kBAAkB,EAG7B,MAAM,uBAAuB,CAAC;AAyB/B,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;+BACyB,UAAU;AAAtC,wBA6FE"}
@@ -47,7 +47,7 @@ const action = async (opts) => {
47
47
  ]
48
48
  }
49
49
  });
50
- engine.diagnostics.onDiagnostic(dataTransfer.formatDiagnostic("export"));
50
+ engine.diagnostics.onDiagnostic(dataTransfer.formatDiagnostic("export", opts.verbose));
51
51
  const progress = engine.progress.stream;
52
52
  const { updateLoader } = dataTransfer.loadersFactory();
53
53
  progress.on(`stage::start`, ({ stage, data }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sources":["../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import { isObject, isString, isFinite, toNumber } from 'lodash/fp';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n encrypt?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n const strapi = await createStrapiInstance();\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export'));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n const outFileExists = await fs.pathExists(outFile);\n if (!outFileExists) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","isObject","exitWith","createStrapiInstance","engineDataTransfer","DEFAULT_IGNORED_CONTENT_TYPES","formatDiagnostic","loadersFactory","getTransferTelemetryPayload","setSignalHandler","abortTransfer","fs","buildTransferTable","chalk","exitMessageText","isString","getDefaultExportName","isFinite","toNumber"],"mappings":"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"}
1
+ {"version":3,"file":"action.js","sources":["../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import { isObject, isString, isFinite, toNumber } from 'lodash/fp';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n encrypt?: boolean;\n verbose?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n const strapi = await createStrapiInstance();\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n const outFileExists = await fs.pathExists(outFile);\n if (!outFileExists) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","isObject","exitWith","createStrapiInstance","engineDataTransfer","DEFAULT_IGNORED_CONTENT_TYPES","formatDiagnostic","loadersFactory","getTransferTelemetryPayload","setSignalHandler","abortTransfer","fs","buildTransferTable","chalk","exitMessageText","isString","getDefaultExportName","isFinite","toNumber"],"mappings":"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"}
@@ -43,7 +43,7 @@ const action = async (opts) => {
43
43
  ]
44
44
  }
45
45
  });
46
- engine$1.diagnostics.onDiagnostic(formatDiagnostic("export"));
46
+ engine$1.diagnostics.onDiagnostic(formatDiagnostic("export", opts.verbose));
47
47
  const progress = engine$1.progress.stream;
48
48
  const { updateLoader } = loadersFactory();
49
49
  progress.on(`stage::start`, ({ stage, data }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"action.mjs","sources":["../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import { isObject, isString, isFinite, toNumber } from 'lodash/fp';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n encrypt?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n const strapi = await createStrapiInstance();\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export'));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n const outFileExists = await fs.pathExists(outFile);\n if (!outFileExists) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","strapi","engine","engineDataTransfer","fs","file"],"mappings":"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"}
1
+ {"version":3,"file":"action.mjs","sources":["../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import { isObject, isString, isFinite, toNumber } from 'lodash/fp';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n encrypt?: boolean;\n verbose?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n const strapi = await createStrapiInstance();\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n const outFileExists = await fs.pathExists(outFile);\n if (!outFileExists) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","strapi","engine","engineDataTransfer","fs","file"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export/command.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,QAAA,MAAM,OAAO,mCA2BZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export/command.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,QAAA,MAAM,OAAO,mCA4BZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -10,7 +10,7 @@ const command = () => {
10
10
  )
11
11
  ).addOption(
12
12
  new commander.Option("--no-compress", "Disables gzip compression of output file").default(true)
13
- ).addOption(
13
+ ).addOption(new commander.Option("--verbose", "Enable verbose logs")).addOption(
14
14
  new commander.Option(
15
15
  "-k, --key <string>",
16
16
  "Provide encryption key in command instead of using the prompt"
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../../../src/cli/commands/export/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\n\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { promptEncryptionKey } from '../../utils/commander';\nimport action from './action';\n\n/**\n * `$ strapi export`\n */\nconst command = () => {\n return createCommand('export')\n .description('Export data from Strapi to file')\n .allowExcessArguments(false)\n .addOption(\n new Option('--no-encrypt', `Disables 'aes-128-ecb' encryption of the output file`).default(\n true\n )\n )\n .addOption(\n new Option('--no-compress', 'Disables gzip compression of output file').default(true)\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(\n new Option('-f, --file <file>', 'name to use for exported file (without extensions)')\n )\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', promptEncryptionKey)\n .action(action);\n};\n\nexport default command;\n"],"names":["createCommand","Option","excludeOption","onlyOption","throttleOption","validateExcludeOnly","promptEncryptionKey"],"mappings":";;;;;AAcA,MAAM,UAAU,MAAM;AACb,SAAAA,UAAA,cAAc,QAAQ,EAC1B,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAIC,UAAA,OAAO,gBAAgB,sDAAsD,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAIA,UAAO,OAAA,iBAAiB,0CAA0C,EAAE,QAAQ,IAAI;AAAA,EAAA,EAErF;AAAA,IACC,IAAIA,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAIA,UAAO,OAAA,qBAAqB,oDAAoD;AAAA,EAAA,EAErF,UAAUC,aAAAA,aAAa,EACvB,UAAUC,aAAAA,UAAU,EACpB,UAAUC,aAAAA,cAAc,EACxB,KAAK,aAAaC,aAAAA,mBAAmB,EACrC,KAAK,aAAaC,YAAAA,mBAAmB,EACrC,OAAO,MAAM;AAClB;;"}
1
+ {"version":3,"file":"command.js","sources":["../../../../src/cli/commands/export/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\n\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { promptEncryptionKey } from '../../utils/commander';\nimport action from './action';\n\n/**\n * `$ strapi export`\n */\nconst command = () => {\n return createCommand('export')\n .description('Export data from Strapi to file')\n .allowExcessArguments(false)\n .addOption(\n new Option('--no-encrypt', `Disables 'aes-128-ecb' encryption of the output file`).default(\n true\n )\n )\n .addOption(\n new Option('--no-compress', 'Disables gzip compression of output file').default(true)\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(\n new Option('-f, --file <file>', 'name to use for exported file (without extensions)')\n )\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', promptEncryptionKey)\n .action(action);\n};\n\nexport default command;\n"],"names":["createCommand","Option","excludeOption","onlyOption","throttleOption","validateExcludeOnly","promptEncryptionKey"],"mappings":";;;;;AAcA,MAAM,UAAU,MAAM;AACb,SAAAA,UAAA,cAAc,QAAQ,EAC1B,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAIC,UAAA,OAAO,gBAAgB,sDAAsD,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAIA,UAAO,OAAA,iBAAiB,0CAA0C,EAAE,QAAQ,IAAI;AAAA,EAAA,EAErF,UAAU,IAAIA,iBAAO,aAAa,qBAAqB,CAAC,EACxD;AAAA,IACC,IAAIA,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAIA,UAAO,OAAA,qBAAqB,oDAAoD;AAAA,EAAA,EAErF,UAAUC,aAAAA,aAAa,EACvB,UAAUC,aAAAA,UAAU,EACpB,UAAUC,aAAAA,cAAc,EACxB,KAAK,aAAaC,aAAAA,mBAAmB,EACrC,KAAK,aAAaC,YAAAA,mBAAmB,EACrC,OAAO,MAAM;AAClB;;"}
@@ -9,7 +9,7 @@ const command = () => {
9
9
  )
10
10
  ).addOption(
11
11
  new Option("--no-compress", "Disables gzip compression of output file").default(true)
12
- ).addOption(
12
+ ).addOption(new Option("--verbose", "Enable verbose logs")).addOption(
13
13
  new Option(
14
14
  "-k, --key <string>",
15
15
  "Provide encryption key in command instead of using the prompt"
@@ -1 +1 @@
1
- {"version":3,"file":"command.mjs","sources":["../../../../src/cli/commands/export/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\n\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { promptEncryptionKey } from '../../utils/commander';\nimport action from './action';\n\n/**\n * `$ strapi export`\n */\nconst command = () => {\n return createCommand('export')\n .description('Export data from Strapi to file')\n .allowExcessArguments(false)\n .addOption(\n new Option('--no-encrypt', `Disables 'aes-128-ecb' encryption of the output file`).default(\n true\n )\n )\n .addOption(\n new Option('--no-compress', 'Disables gzip compression of output file').default(true)\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(\n new Option('-f, --file <file>', 'name to use for exported file (without extensions)')\n )\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', promptEncryptionKey)\n .action(action);\n};\n\nexport default command;\n"],"names":[],"mappings":";;;;AAcA,MAAM,UAAU,MAAM;AACb,SAAA,cAAc,QAAQ,EAC1B,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAI,OAAO,gBAAgB,sDAAsD,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAI,OAAO,iBAAiB,0CAA0C,EAAE,QAAQ,IAAI;AAAA,EAAA,EAErF;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAI,OAAO,qBAAqB,oDAAoD;AAAA,EAAA,EAErF,UAAU,aAAa,EACvB,UAAU,UAAU,EACpB,UAAU,cAAc,EACxB,KAAK,aAAa,mBAAmB,EACrC,KAAK,aAAa,mBAAmB,EACrC,OAAO,MAAM;AAClB;"}
1
+ {"version":3,"file":"command.mjs","sources":["../../../../src/cli/commands/export/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\n\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { promptEncryptionKey } from '../../utils/commander';\nimport action from './action';\n\n/**\n * `$ strapi export`\n */\nconst command = () => {\n return createCommand('export')\n .description('Export data from Strapi to file')\n .allowExcessArguments(false)\n .addOption(\n new Option('--no-encrypt', `Disables 'aes-128-ecb' encryption of the output file`).default(\n true\n )\n )\n .addOption(\n new Option('--no-compress', 'Disables gzip compression of output file').default(true)\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(\n new Option('-f, --file <file>', 'name to use for exported file (without extensions)')\n )\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', promptEncryptionKey)\n .action(action);\n};\n\nexport default command;\n"],"names":[],"mappings":";;;;AAcA,MAAM,UAAU,MAAM;AACb,SAAA,cAAc,QAAQ,EAC1B,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAI,OAAO,gBAAgB,sDAAsD,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAI,OAAO,iBAAiB,0CAA0C,EAAE,QAAQ,IAAI;AAAA,EAAA,EAErF,UAAU,IAAI,OAAO,aAAa,qBAAqB,CAAC,EACxD;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EAAA,EAED;AAAA,IACC,IAAI,OAAO,qBAAqB,oDAAoD;AAAA,EAAA,EAErF,UAAU,aAAa,EACvB,UAAU,UAAU,EACpB,UAAU,cAAc,EACxB,KAAK,aAAa,mBAAmB,EACrC,KAAK,aAAa,mBAAmB,EACrC,OAAO,MAAM;AAClB;"}
@@ -3,6 +3,7 @@ interface CmdOptions {
3
3
  file?: string;
4
4
  decompress?: boolean;
5
5
  decrypt?: boolean;
6
+ verbose?: boolean;
6
7
  key?: string;
7
8
  conflictStrategy?: 'restore';
8
9
  force?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/import/action.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,IAAI,kBAAkB,EAG7B,MAAM,uBAAuB,CAAC;AA4B/B,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;GAIG;+BACyB,UAAU;AAAtC,wBAkHE"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/import/action.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,IAAI,kBAAkB,EAG7B,MAAM,uBAAuB,CAAC;AA4B/B,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;GAIG;+BACyB,UAAU;AAAtC,wBAkHE"}
@@ -53,7 +53,7 @@ const action = async (opts) => {
53
53
  destination.onWarning = (message) => console.warn(`
54
54
  ${chalk__default.default.yellow("warn")}: ${message}`);
55
55
  const engine = createTransferEngine(source, destination, engineOptions);
56
- engine.diagnostics.onDiagnostic(dataTransfer.formatDiagnostic("import"));
56
+ engine.diagnostics.onDiagnostic(dataTransfer.formatDiagnostic("import", opts.verbose));
57
57
  const progress = engine.progress.stream;
58
58
  const { updateLoader } = dataTransfer.loadersFactory();
59
59
  engine.onSchemaDiff(dataTransfer.getDiffHandler(engine, { force: opts.force, action: "import" }));
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sources":["../../../../src/cli/commands/import/action.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { isObject } from 'lodash/fp';\nimport chalk from 'chalk';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileSourceProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiDestinationProvider, DEFAULT_CONFLICT_STRATEGY },\n} = strapiDataTransfer;\n\nconst { createTransferEngine, DEFAULT_VERSION_STRATEGY, DEFAULT_SCHEMA_STRATEGY } =\n engineDataTransfer;\n\ninterface CmdOptions {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n key?: string;\n conflictStrategy?: 'restore';\n force?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n}\n\ntype EngineOptions = Parameters<typeof createTransferEngine>[2];\n\n/**\n * Import command.\n *\n * It transfers data from a file to a local Strapi instance\n */\nexport default async (opts: CmdOptions) => {\n // validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse arguments');\n }\n\n /**\n * From strapi backup file\n */\n const sourceOptions = getLocalFileSourceOptions(opts);\n\n const source = createLocalFileSourceProvider(sourceOptions);\n\n /**\n * To local Strapi instance\n */\n const strapiInstance = await createStrapiInstance();\n\n /**\n * Configure and run the transfer engine\n */\n const engineOptions: EngineOptions = {\n versionStrategy: DEFAULT_VERSION_STRATEGY,\n schemaStrategy: DEFAULT_SCHEMA_STRATEGY,\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter: (entity) => !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type),\n },\n ],\n },\n };\n\n const destinationOptions = {\n async getStrapi() {\n return strapiInstance;\n },\n autoDestroy: false,\n strategy: opts.conflictStrategy || DEFAULT_CONFLICT_STRATEGY,\n restore: parseRestoreFromOptions(engineOptions),\n };\n\n const destination = createLocalStrapiDestinationProvider(destinationOptions);\n destination.onWarning = (message) => console.warn(`\\n${chalk.yellow('warn')}: ${message}`);\n\n const engine = createTransferEngine(source, destination, engineOptions);\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('import'));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'import' }));\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log('Starting import...');\n await strapiInstance.telemetry.send(\n 'didDEITSProcessStart',\n getTransferTelemetryPayload(engine)\n );\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n results = await engine.transfer();\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapiInstance.telemetry.send(\n 'didDEITSProcessFinish',\n getTransferTelemetryPayload(engine)\n );\n await strapiInstance.destroy();\n\n exitWith(0, exitMessageText('import'));\n } catch (e) {\n await strapiInstance.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('import', true));\n }\n};\n\n/**\n * Infer local file source provider options based on a given filename\n */\nconst getLocalFileSourceOptions = (opts: {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n key?: string;\n}) => {\n const options: fileDataTransfer.providers.ILocalFileSourceProviderOptions = {\n file: { path: opts.file ?? '' },\n compression: { enabled: !!opts.decompress },\n encryption: { enabled: !!opts.decrypt, key: opts.key },\n };\n\n return options;\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","engineDataTransfer","isObject","exitWith","createStrapiInstance","DEFAULT_IGNORED_CONTENT_TYPES","parseRestoreFromOptions","chalk","formatDiagnostic","loadersFactory","getDiffHandler","getTransferTelemetryPayload","setSignalHandler","abortTransfer","buildTransferTable","exitMessageText"],"mappings":"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"}
1
+ {"version":3,"file":"action.js","sources":["../../../../src/cli/commands/import/action.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { isObject } from 'lodash/fp';\nimport chalk from 'chalk';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileSourceProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiDestinationProvider, DEFAULT_CONFLICT_STRATEGY },\n} = strapiDataTransfer;\n\nconst { createTransferEngine, DEFAULT_VERSION_STRATEGY, DEFAULT_SCHEMA_STRATEGY } =\n engineDataTransfer;\n\ninterface CmdOptions {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n verbose?: boolean;\n key?: string;\n conflictStrategy?: 'restore';\n force?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n}\n\ntype EngineOptions = Parameters<typeof createTransferEngine>[2];\n\n/**\n * Import command.\n *\n * It transfers data from a file to a local Strapi instance\n */\nexport default async (opts: CmdOptions) => {\n // validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse arguments');\n }\n\n /**\n * From strapi backup file\n */\n const sourceOptions = getLocalFileSourceOptions(opts);\n\n const source = createLocalFileSourceProvider(sourceOptions);\n\n /**\n * To local Strapi instance\n */\n const strapiInstance = await createStrapiInstance();\n\n /**\n * Configure and run the transfer engine\n */\n const engineOptions: EngineOptions = {\n versionStrategy: DEFAULT_VERSION_STRATEGY,\n schemaStrategy: DEFAULT_SCHEMA_STRATEGY,\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter: (entity) => !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type),\n },\n ],\n },\n };\n\n const destinationOptions = {\n async getStrapi() {\n return strapiInstance;\n },\n autoDestroy: false,\n strategy: opts.conflictStrategy || DEFAULT_CONFLICT_STRATEGY,\n restore: parseRestoreFromOptions(engineOptions),\n };\n\n const destination = createLocalStrapiDestinationProvider(destinationOptions);\n destination.onWarning = (message) => console.warn(`\\n${chalk.yellow('warn')}: ${message}`);\n\n const engine = createTransferEngine(source, destination, engineOptions);\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('import', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'import' }));\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log('Starting import...');\n await strapiInstance.telemetry.send(\n 'didDEITSProcessStart',\n getTransferTelemetryPayload(engine)\n );\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n results = await engine.transfer();\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapiInstance.telemetry.send(\n 'didDEITSProcessFinish',\n getTransferTelemetryPayload(engine)\n );\n await strapiInstance.destroy();\n\n exitWith(0, exitMessageText('import'));\n } catch (e) {\n await strapiInstance.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('import', true));\n }\n};\n\n/**\n * Infer local file source provider options based on a given filename\n */\nconst getLocalFileSourceOptions = (opts: {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n key?: string;\n}) => {\n const options: fileDataTransfer.providers.ILocalFileSourceProviderOptions = {\n file: { path: opts.file ?? '' },\n compression: { enabled: !!opts.decompress },\n encryption: { enabled: !!opts.decrypt, key: opts.key },\n };\n\n return options;\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","engineDataTransfer","isObject","exitWith","createStrapiInstance","DEFAULT_IGNORED_CONTENT_TYPES","parseRestoreFromOptions","chalk","formatDiagnostic","loadersFactory","getDiffHandler","getTransferTelemetryPayload","setSignalHandler","abortTransfer","buildTransferTable","exitMessageText"],"mappings":";;;;;;;;AAyBA,MAAM;AAAA,EACJ,WAAW,EAAE,8BAA8B;AAC7C,IAAIA;AAEJ,MAAM;AAAA,EACJ,WAAW,EAAE,sCAAsC,0BAA0B;AAC/E,IAAIC;AAEJ,MAAM,EAAE,sBAAsB,0BAA0B,wBAAA,IACtDC,eAAAA;AAsBF,MAAe,SAAA,OAAO,SAAqB;AAErC,MAAA,CAACC,GAAAA,SAAS,IAAI,GAAG;AACnBC,qBAAS,GAAG,2BAA2B;AAAA,EACzC;AAKM,QAAA,gBAAgB,0BAA0B,IAAI;AAE9C,QAAA,SAAS,8BAA8B,aAAa;AAKpD,QAAA,iBAAiB,MAAMC,aAAAA;AAK7B,QAAM,gBAA+B;AAAA,IACnC,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,YAAY;AAAA,MACV,OAAO;AAAA,QACL;AAAA,UACE,OAAO,MAAM;AACX,mBACE,CAACC,aAAAA,8BAA8B,SAAS,KAAK,KAAK,IAAI,KACtD,CAACA,aAAAA,8BAA8B,SAAS,KAAK,MAAM,IAAI;AAAA,UAE3D;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,QAAQ,CAAC,WAAW,CAACA,aAA8B,8BAAA,SAAS,OAAO,IAAI;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAAA,EAAA;AAGF,QAAM,qBAAqB;AAAA,IACzB,MAAM,YAAY;AACT,aAAA;AAAA,IACT;AAAA,IACA,aAAa;AAAA,IACb,UAAU,KAAK,oBAAoB;AAAA,IACnC,SAASC,qCAAwB,aAAa;AAAA,EAAA;AAG1C,QAAA,cAAc,qCAAqC,kBAAkB;AAC3E,cAAY,YAAY,CAAC,YAAY,QAAQ,KAAK;AAAA,EAAKC,uBAAM,OAAO,MAAM,CAAC,KAAK,OAAO,EAAE;AAEzF,QAAM,SAAS,qBAAqB,QAAQ,aAAa,aAAa;AAEtE,SAAO,YAAY,aAAaC,aAAAA,iBAAiB,UAAU,KAAK,OAAO,CAAC;AAElE,QAAA,WAAW,OAAO,SAAS;AAE3B,QAAA,EAAE,iBAAiBC,aAAAA;AAElB,SAAA,aAAaC,4BAAe,QAAQ,EAAE,OAAO,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC;AAEnF,WAAS,GAAG,gBAAgB,CAAC,EAAE,OAAO,WAAW;AAClC,iBAAA,OAAO,IAAI,EAAE,MAAM;AAAA,EAAA,CACjC;AAED,WAAS,GAAG,iBAAiB,CAAC,EAAE,OAAO,WAAW;AACnC,iBAAA,OAAO,IAAI,EAAE,QAAQ;AAAA,EAAA,CACnC;AAED,WAAS,GAAG,mBAAmB,CAAC,EAAE,OAAO,WAAW;AAClD,iBAAa,OAAO,IAAI;AAAA,EAAA,CACzB;AAEQ,WAAA,GAAG,mBAAmB,YAAY;AACzC,YAAQ,IAAI,oBAAoB;AAChC,UAAM,eAAe,UAAU;AAAA,MAC7B;AAAA,MACAC,aAAAA,4BAA4B,MAAM;AAAA,IAAA;AAAA,EACpC,CACD;AAEG,MAAA;AACA,MAAA;AAEFC,iBAAA,iBAAiB,MAAMC,aAAAA,cAAc,EAAE,QAAQ,OAAA,CAA+B,CAAC;AAErE,cAAA,MAAM,OAAO;AAEnB,QAAA;AACI,YAAA,QAAQC,aAAAA,mBAAmB,QAAQ,MAAM;AACvC,cAAA,IAAI,OAAO,SAAU,CAAA;AAAA,aACtB,GAAG;AACV,cAAQ,MAAM,4DAA4D;AAAA,IAC5E;AAGA,UAAM,eAAe,UAAU;AAAA,MAC7B;AAAA,MACAH,aAAAA,4BAA4B,MAAM;AAAA,IAAA;AAEpC,UAAM,eAAe;AAEZR,YAAAA,SAAA,GAAGY,6BAAgB,QAAQ,CAAC;AAAA,WAC9B,GAAG;AACV,UAAM,eAAe,UAAU,KAAK,uBAAuBJ,aAAA,4BAA4B,MAAM,CAAC;AAC9FR,YAAAA,SAAS,GAAGY,aAAAA,gBAAgB,UAAU,IAAI,CAAC;AAAA,EAC7C;AACF;AAKA,MAAM,4BAA4B,CAAC,SAK7B;AACJ,QAAM,UAAsE;AAAA,IAC1E,MAAM,EAAE,MAAM,KAAK,QAAQ,GAAG;AAAA,IAC9B,aAAa,EAAE,SAAS,CAAC,CAAC,KAAK,WAAW;AAAA,IAC1C,YAAY,EAAE,SAAS,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,IAAI;AAAA,EAAA;AAGhD,SAAA;AACT;;"}
@@ -50,7 +50,7 @@ const action = async (opts) => {
50
50
  destination.onWarning = (message) => console.warn(`
51
51
  ${chalk.yellow("warn")}: ${message}`);
52
52
  const engine2 = createTransferEngine(source, destination, engineOptions);
53
- engine2.diagnostics.onDiagnostic(formatDiagnostic("import"));
53
+ engine2.diagnostics.onDiagnostic(formatDiagnostic("import", opts.verbose));
54
54
  const progress = engine2.progress.stream;
55
55
  const { updateLoader } = loadersFactory();
56
56
  engine2.onSchemaDiff(getDiffHandler(engine2, { force: opts.force, action: "import" }));
@@ -1 +1 @@
1
- {"version":3,"file":"action.mjs","sources":["../../../../src/cli/commands/import/action.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { isObject } from 'lodash/fp';\nimport chalk from 'chalk';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileSourceProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiDestinationProvider, DEFAULT_CONFLICT_STRATEGY },\n} = strapiDataTransfer;\n\nconst { createTransferEngine, DEFAULT_VERSION_STRATEGY, DEFAULT_SCHEMA_STRATEGY } =\n engineDataTransfer;\n\ninterface CmdOptions {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n key?: string;\n conflictStrategy?: 'restore';\n force?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n}\n\ntype EngineOptions = Parameters<typeof createTransferEngine>[2];\n\n/**\n * Import command.\n *\n * It transfers data from a file to a local Strapi instance\n */\nexport default async (opts: CmdOptions) => {\n // validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse arguments');\n }\n\n /**\n * From strapi backup file\n */\n const sourceOptions = getLocalFileSourceOptions(opts);\n\n const source = createLocalFileSourceProvider(sourceOptions);\n\n /**\n * To local Strapi instance\n */\n const strapiInstance = await createStrapiInstance();\n\n /**\n * Configure and run the transfer engine\n */\n const engineOptions: EngineOptions = {\n versionStrategy: DEFAULT_VERSION_STRATEGY,\n schemaStrategy: DEFAULT_SCHEMA_STRATEGY,\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter: (entity) => !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type),\n },\n ],\n },\n };\n\n const destinationOptions = {\n async getStrapi() {\n return strapiInstance;\n },\n autoDestroy: false,\n strategy: opts.conflictStrategy || DEFAULT_CONFLICT_STRATEGY,\n restore: parseRestoreFromOptions(engineOptions),\n };\n\n const destination = createLocalStrapiDestinationProvider(destinationOptions);\n destination.onWarning = (message) => console.warn(`\\n${chalk.yellow('warn')}: ${message}`);\n\n const engine = createTransferEngine(source, destination, engineOptions);\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('import'));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'import' }));\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log('Starting import...');\n await strapiInstance.telemetry.send(\n 'didDEITSProcessStart',\n getTransferTelemetryPayload(engine)\n );\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n results = await engine.transfer();\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapiInstance.telemetry.send(\n 'didDEITSProcessFinish',\n getTransferTelemetryPayload(engine)\n );\n await strapiInstance.destroy();\n\n exitWith(0, exitMessageText('import'));\n } catch (e) {\n await strapiInstance.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('import', true));\n }\n};\n\n/**\n * Infer local file source provider options based on a given filename\n */\nconst getLocalFileSourceOptions = (opts: {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n key?: string;\n}) => {\n const options: fileDataTransfer.providers.ILocalFileSourceProviderOptions = {\n file: { path: opts.file ?? '' },\n compression: { enabled: !!opts.decompress },\n encryption: { enabled: !!opts.decrypt, key: opts.key },\n };\n\n return options;\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","engineDataTransfer","engine"],"mappings":"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"}
1
+ {"version":3,"file":"action.mjs","sources":["../../../../src/cli/commands/import/action.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { isObject } from 'lodash/fp';\nimport chalk from 'chalk';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst {\n providers: { createLocalFileSourceProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiDestinationProvider, DEFAULT_CONFLICT_STRATEGY },\n} = strapiDataTransfer;\n\nconst { createTransferEngine, DEFAULT_VERSION_STRATEGY, DEFAULT_SCHEMA_STRATEGY } =\n engineDataTransfer;\n\ninterface CmdOptions {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n verbose?: boolean;\n key?: string;\n conflictStrategy?: 'restore';\n force?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n}\n\ntype EngineOptions = Parameters<typeof createTransferEngine>[2];\n\n/**\n * Import command.\n *\n * It transfers data from a file to a local Strapi instance\n */\nexport default async (opts: CmdOptions) => {\n // validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse arguments');\n }\n\n /**\n * From strapi backup file\n */\n const sourceOptions = getLocalFileSourceOptions(opts);\n\n const source = createLocalFileSourceProvider(sourceOptions);\n\n /**\n * To local Strapi instance\n */\n const strapiInstance = await createStrapiInstance();\n\n /**\n * Configure and run the transfer engine\n */\n const engineOptions: EngineOptions = {\n versionStrategy: DEFAULT_VERSION_STRATEGY,\n schemaStrategy: DEFAULT_SCHEMA_STRATEGY,\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter: (entity) => !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type),\n },\n ],\n },\n };\n\n const destinationOptions = {\n async getStrapi() {\n return strapiInstance;\n },\n autoDestroy: false,\n strategy: opts.conflictStrategy || DEFAULT_CONFLICT_STRATEGY,\n restore: parseRestoreFromOptions(engineOptions),\n };\n\n const destination = createLocalStrapiDestinationProvider(destinationOptions);\n destination.onWarning = (message) => console.warn(`\\n${chalk.yellow('warn')}: ${message}`);\n\n const engine = createTransferEngine(source, destination, engineOptions);\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('import', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'import' }));\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log('Starting import...');\n await strapiInstance.telemetry.send(\n 'didDEITSProcessStart',\n getTransferTelemetryPayload(engine)\n );\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n results = await engine.transfer();\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapiInstance.telemetry.send(\n 'didDEITSProcessFinish',\n getTransferTelemetryPayload(engine)\n );\n await strapiInstance.destroy();\n\n exitWith(0, exitMessageText('import'));\n } catch (e) {\n await strapiInstance.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('import', true));\n }\n};\n\n/**\n * Infer local file source provider options based on a given filename\n */\nconst getLocalFileSourceOptions = (opts: {\n file?: string;\n decompress?: boolean;\n decrypt?: boolean;\n key?: string;\n}) => {\n const options: fileDataTransfer.providers.ILocalFileSourceProviderOptions = {\n file: { path: opts.file ?? '' },\n compression: { enabled: !!opts.decompress },\n encryption: { enabled: !!opts.decrypt, key: opts.key },\n };\n\n return options;\n};\n"],"names":["fileDataTransfer","strapiDataTransfer","engineDataTransfer","engine"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/import/command.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,QAAA,MAAM,OAAO,mCA+EZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/import/command.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,QAAA,MAAM,OAAO,mCAgFZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -18,7 +18,7 @@ const command = () => {
18
18
  "-k, --key <string>",
19
19
  "Provide encryption key in command instead of using the prompt"
20
20
  )
21
- ).addOption(commander$1.forceOption).addOption(dataTransfer.excludeOption).addOption(dataTransfer.onlyOption).addOption(dataTransfer.throttleOption).hook("preAction", dataTransfer.validateExcludeOnly).hook("preAction", async (thisCommand) => {
21
+ ).addOption(new commander.Option("--verbose", "Enable verbose logs")).addOption(commander$1.forceOption).addOption(dataTransfer.excludeOption).addOption(dataTransfer.onlyOption).addOption(dataTransfer.throttleOption).hook("preAction", dataTransfer.validateExcludeOnly).hook("preAction", async (thisCommand) => {
22
22
  const opts = thisCommand.opts();
23
23
  const ext = path__default.default.extname(String(opts.file));
24
24
  if (ext === ".enc") {
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../../../src/cli/commands/import/command.ts"],"sourcesContent":["import path from 'path';\nimport { createCommand, Option } from 'commander';\nimport inquirer from 'inquirer';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { getCommanderConfirmMessage, forceOption } from '../../utils/commander';\nimport { exitWith } from '../../utils/helpers';\nimport action from './action';\n\n/**\n * `$ strapi import`\n */\nconst command = () => {\n return (\n createCommand('import')\n .description('Import data from file to Strapi')\n .allowExcessArguments(false)\n .requiredOption(\n '-f, --file <file>',\n 'path and filename for the Strapi export file you want to import'\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const ext = path.extname(String(opts.file));\n\n // check extension to guess if we should prompt for key\n if (ext === '.enc') {\n if (!opts.key) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your decryption key',\n name: 'key',\n },\n ]);\n if (!answers.key?.length) {\n exitWith(1, 'No key entered, aborting import.');\n }\n opts.key = answers.key;\n }\n }\n })\n // set decrypt and decompress options based on filename\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n\n const { extname, parse } = path;\n\n let file = opts.file;\n\n if (extname(file) === '.enc') {\n file = parse(file).name; // trim the .enc extension\n thisCommand.opts().decrypt = true;\n } else {\n thisCommand.opts().decrypt = false;\n }\n\n if (extname(file) === '.gz') {\n file = parse(file).name; // trim the .gz extension\n thisCommand.opts().decompress = true;\n } else {\n thisCommand.opts().decompress = false;\n }\n\n if (extname(file) !== '.tar') {\n exitWith(\n 1,\n `The file '${opts.file}' does not appear to be a valid Strapi data file. It must have an extension ending in .tar[.gz][.enc]`\n );\n }\n })\n .hook(\n 'preAction',\n getCommanderConfirmMessage(\n 'The import will delete your existing data! Are you sure you want to proceed?',\n { failMessage: 'Import process aborted' }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["createCommand","Option","forceOption","excludeOption","onlyOption","throttleOption","validateExcludeOnly","path","inquirer","exitWith","getCommanderConfirmMessage"],"mappings":";;;;;;;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAAA,UAAA,cAAc,QAAQ,EACnB,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC;AAAA,IACA;AAAA,EAAA,EAED;AAAA,IACC,IAAIC,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EAAA,EAED,UAAUC,YAAAA,WAAW,EACrB,UAAUC,aAAAA,aAAa,EACvB,UAAUC,aAAAA,UAAU,EACpB,UAAUC,aAAAA,cAAc,EACxB,KAAK,aAAaC,aAAAA,mBAAmB,EACrC,KAAK,aAAa,OAAO,gBAAgB;AAClC,UAAA,OAAO,YAAY;AACzB,UAAM,MAAMC,cAAAA,QAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAG1C,QAAI,QAAQ,QAAQ;AACd,UAAA,CAAC,KAAK,KAAK;AACP,cAAA,UAAU,MAAMC,kBAAA,QAAS,OAAO;AAAA,UACpC;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QAAA,CACD;AACG,YAAA,CAAC,QAAQ,KAAK,QAAQ;AACxBC,2BAAS,GAAG,kCAAkC;AAAA,QAChD;AACA,aAAK,MAAM,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACD,CAAA,EAEA,KAAK,aAAa,CAAC,gBAAgB;AAC5B,UAAA,OAAO,YAAY;AAEnB,UAAA,EAAE,SAAS,MAAU,IAAAF;AAE3B,QAAI,OAAO,KAAK;AAEZ,QAAA,QAAQ,IAAI,MAAM,QAAQ;AACrB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,UAAU;AAAA,IAAA,OACxB;AACO,kBAAA,KAAA,EAAO,UAAU;AAAA,IAC/B;AAEI,QAAA,QAAQ,IAAI,MAAM,OAAO;AACpB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,aAAa;AAAA,IAAA,OAC3B;AACO,kBAAA,KAAA,EAAO,aAAa;AAAA,IAClC;AAEI,QAAA,QAAQ,IAAI,MAAM,QAAQ;AAC5BE,cAAA;AAAA,QACE;AAAA,QACA,aAAa,KAAK,IAAI;AAAA,MAAA;AAAA,IAE1B;AAAA,EACD,CAAA,EACA;AAAA,IACC;AAAA,IACAC,YAAA;AAAA,MACE;AAAA,MACA,EAAE,aAAa,yBAAyB;AAAA,IAC1C;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;;"}
1
+ {"version":3,"file":"command.js","sources":["../../../../src/cli/commands/import/command.ts"],"sourcesContent":["import path from 'path';\nimport { createCommand, Option } from 'commander';\nimport inquirer from 'inquirer';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { getCommanderConfirmMessage, forceOption } from '../../utils/commander';\nimport { exitWith } from '../../utils/helpers';\nimport action from './action';\n\n/**\n * `$ strapi import`\n */\nconst command = () => {\n return (\n createCommand('import')\n .description('Import data from file to Strapi')\n .allowExcessArguments(false)\n .requiredOption(\n '-f, --file <file>',\n 'path and filename for the Strapi export file you want to import'\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const ext = path.extname(String(opts.file));\n\n // check extension to guess if we should prompt for key\n if (ext === '.enc') {\n if (!opts.key) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your decryption key',\n name: 'key',\n },\n ]);\n if (!answers.key?.length) {\n exitWith(1, 'No key entered, aborting import.');\n }\n opts.key = answers.key;\n }\n }\n })\n // set decrypt and decompress options based on filename\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n\n const { extname, parse } = path;\n\n let file = opts.file;\n\n if (extname(file) === '.enc') {\n file = parse(file).name; // trim the .enc extension\n thisCommand.opts().decrypt = true;\n } else {\n thisCommand.opts().decrypt = false;\n }\n\n if (extname(file) === '.gz') {\n file = parse(file).name; // trim the .gz extension\n thisCommand.opts().decompress = true;\n } else {\n thisCommand.opts().decompress = false;\n }\n\n if (extname(file) !== '.tar') {\n exitWith(\n 1,\n `The file '${opts.file}' does not appear to be a valid Strapi data file. It must have an extension ending in .tar[.gz][.enc]`\n );\n }\n })\n .hook(\n 'preAction',\n getCommanderConfirmMessage(\n 'The import will delete your existing data! Are you sure you want to proceed?',\n { failMessage: 'Import process aborted' }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["createCommand","Option","forceOption","excludeOption","onlyOption","throttleOption","validateExcludeOnly","path","inquirer","exitWith","getCommanderConfirmMessage"],"mappings":";;;;;;;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAAA,UAAA,cAAc,QAAQ,EACnB,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC;AAAA,IACA;AAAA,EAAA,EAED;AAAA,IACC,IAAIC,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF,EACC,UAAU,IAAIA,iBAAO,aAAa,qBAAqB,CAAC,EACxD,UAAUC,YAAW,WAAA,EACrB,UAAUC,0BAAa,EACvB,UAAUC,aAAAA,UAAU,EACpB,UAAUC,aAAc,cAAA,EACxB,KAAK,aAAaC,aAAAA,mBAAmB,EACrC,KAAK,aAAa,OAAO,gBAAgB;AAClC,UAAA,OAAO,YAAY;AACzB,UAAM,MAAMC,cAAAA,QAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAG1C,QAAI,QAAQ,QAAQ;AACd,UAAA,CAAC,KAAK,KAAK;AACP,cAAA,UAAU,MAAMC,kBAAA,QAAS,OAAO;AAAA,UACpC;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QAAA,CACD;AACG,YAAA,CAAC,QAAQ,KAAK,QAAQ;AACxBC,2BAAS,GAAG,kCAAkC;AAAA,QAChD;AACA,aAAK,MAAM,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACD,CAAA,EAEA,KAAK,aAAa,CAAC,gBAAgB;AAC5B,UAAA,OAAO,YAAY;AAEnB,UAAA,EAAE,SAAS,MAAU,IAAAF;AAE3B,QAAI,OAAO,KAAK;AAEZ,QAAA,QAAQ,IAAI,MAAM,QAAQ;AACrB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,UAAU;AAAA,IAAA,OACxB;AACO,kBAAA,KAAA,EAAO,UAAU;AAAA,IAC/B;AAEI,QAAA,QAAQ,IAAI,MAAM,OAAO;AACpB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,aAAa;AAAA,IAAA,OAC3B;AACO,kBAAA,KAAA,EAAO,aAAa;AAAA,IAClC;AAEI,QAAA,QAAQ,IAAI,MAAM,QAAQ;AAC5BE,cAAA;AAAA,QACE;AAAA,QACA,aAAa,KAAK,IAAI;AAAA,MAAA;AAAA,IAE1B;AAAA,EACD,CAAA,EACA;AAAA,IACC;AAAA,IACAC,YAAA;AAAA,MACE;AAAA,MACA,EAAE,aAAa,yBAAyB;AAAA,IAC1C;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;;"}
@@ -14,7 +14,7 @@ const command = () => {
14
14
  "-k, --key <string>",
15
15
  "Provide encryption key in command instead of using the prompt"
16
16
  )
17
- ).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(throttleOption).hook("preAction", validateExcludeOnly).hook("preAction", async (thisCommand) => {
17
+ ).addOption(new Option("--verbose", "Enable verbose logs")).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(throttleOption).hook("preAction", validateExcludeOnly).hook("preAction", async (thisCommand) => {
18
18
  const opts = thisCommand.opts();
19
19
  const ext = path.extname(String(opts.file));
20
20
  if (ext === ".enc") {
@@ -1 +1 @@
1
- {"version":3,"file":"command.mjs","sources":["../../../../src/cli/commands/import/command.ts"],"sourcesContent":["import path from 'path';\nimport { createCommand, Option } from 'commander';\nimport inquirer from 'inquirer';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { getCommanderConfirmMessage, forceOption } from '../../utils/commander';\nimport { exitWith } from '../../utils/helpers';\nimport action from './action';\n\n/**\n * `$ strapi import`\n */\nconst command = () => {\n return (\n createCommand('import')\n .description('Import data from file to Strapi')\n .allowExcessArguments(false)\n .requiredOption(\n '-f, --file <file>',\n 'path and filename for the Strapi export file you want to import'\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const ext = path.extname(String(opts.file));\n\n // check extension to guess if we should prompt for key\n if (ext === '.enc') {\n if (!opts.key) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your decryption key',\n name: 'key',\n },\n ]);\n if (!answers.key?.length) {\n exitWith(1, 'No key entered, aborting import.');\n }\n opts.key = answers.key;\n }\n }\n })\n // set decrypt and decompress options based on filename\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n\n const { extname, parse } = path;\n\n let file = opts.file;\n\n if (extname(file) === '.enc') {\n file = parse(file).name; // trim the .enc extension\n thisCommand.opts().decrypt = true;\n } else {\n thisCommand.opts().decrypt = false;\n }\n\n if (extname(file) === '.gz') {\n file = parse(file).name; // trim the .gz extension\n thisCommand.opts().decompress = true;\n } else {\n thisCommand.opts().decompress = false;\n }\n\n if (extname(file) !== '.tar') {\n exitWith(\n 1,\n `The file '${opts.file}' does not appear to be a valid Strapi data file. It must have an extension ending in .tar[.gz][.enc]`\n );\n }\n })\n .hook(\n 'preAction',\n getCommanderConfirmMessage(\n 'The import will delete your existing data! Are you sure you want to proceed?',\n { failMessage: 'Import process aborted' }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAA,cAAc,QAAQ,EACnB,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC;AAAA,IACA;AAAA,EAAA,EAED;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EAAA,EAED,UAAU,WAAW,EACrB,UAAU,aAAa,EACvB,UAAU,UAAU,EACpB,UAAU,cAAc,EACxB,KAAK,aAAa,mBAAmB,EACrC,KAAK,aAAa,OAAO,gBAAgB;AAClC,UAAA,OAAO,YAAY;AACzB,UAAM,MAAM,KAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAG1C,QAAI,QAAQ,QAAQ;AACd,UAAA,CAAC,KAAK,KAAK;AACP,cAAA,UAAU,MAAM,SAAS,OAAO;AAAA,UACpC;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QAAA,CACD;AACG,YAAA,CAAC,QAAQ,KAAK,QAAQ;AACxB,mBAAS,GAAG,kCAAkC;AAAA,QAChD;AACA,aAAK,MAAM,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACD,CAAA,EAEA,KAAK,aAAa,CAAC,gBAAgB;AAC5B,UAAA,OAAO,YAAY;AAEnB,UAAA,EAAE,SAAS,MAAU,IAAA;AAE3B,QAAI,OAAO,KAAK;AAEZ,QAAA,QAAQ,IAAI,MAAM,QAAQ;AACrB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,UAAU;AAAA,IAAA,OACxB;AACO,kBAAA,KAAA,EAAO,UAAU;AAAA,IAC/B;AAEI,QAAA,QAAQ,IAAI,MAAM,OAAO;AACpB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,aAAa;AAAA,IAAA,OAC3B;AACO,kBAAA,KAAA,EAAO,aAAa;AAAA,IAClC;AAEI,QAAA,QAAQ,IAAI,MAAM,QAAQ;AAC5B;AAAA,QACE;AAAA,QACA,aAAa,KAAK,IAAI;AAAA,MAAA;AAAA,IAE1B;AAAA,EACD,CAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACE;AAAA,MACA,EAAE,aAAa,yBAAyB;AAAA,IAC1C;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;"}
1
+ {"version":3,"file":"command.mjs","sources":["../../../../src/cli/commands/import/command.ts"],"sourcesContent":["import path from 'path';\nimport { createCommand, Option } from 'commander';\nimport inquirer from 'inquirer';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { getCommanderConfirmMessage, forceOption } from '../../utils/commander';\nimport { exitWith } from '../../utils/helpers';\nimport action from './action';\n\n/**\n * `$ strapi import`\n */\nconst command = () => {\n return (\n createCommand('import')\n .description('Import data from file to Strapi')\n .allowExcessArguments(false)\n .requiredOption(\n '-f, --file <file>',\n 'path and filename for the Strapi export file you want to import'\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const ext = path.extname(String(opts.file));\n\n // check extension to guess if we should prompt for key\n if (ext === '.enc') {\n if (!opts.key) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your decryption key',\n name: 'key',\n },\n ]);\n if (!answers.key?.length) {\n exitWith(1, 'No key entered, aborting import.');\n }\n opts.key = answers.key;\n }\n }\n })\n // set decrypt and decompress options based on filename\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n\n const { extname, parse } = path;\n\n let file = opts.file;\n\n if (extname(file) === '.enc') {\n file = parse(file).name; // trim the .enc extension\n thisCommand.opts().decrypt = true;\n } else {\n thisCommand.opts().decrypt = false;\n }\n\n if (extname(file) === '.gz') {\n file = parse(file).name; // trim the .gz extension\n thisCommand.opts().decompress = true;\n } else {\n thisCommand.opts().decompress = false;\n }\n\n if (extname(file) !== '.tar') {\n exitWith(\n 1,\n `The file '${opts.file}' does not appear to be a valid Strapi data file. It must have an extension ending in .tar[.gz][.enc]`\n );\n }\n })\n .hook(\n 'preAction',\n getCommanderConfirmMessage(\n 'The import will delete your existing data! Are you sure you want to proceed?',\n { failMessage: 'Import process aborted' }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAA,cAAc,QAAQ,EACnB,YAAY,iCAAiC,EAC7C,qBAAqB,KAAK,EAC1B;AAAA,IACC;AAAA,IACA;AAAA,EAAA,EAED;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF,EACC,UAAU,IAAI,OAAO,aAAa,qBAAqB,CAAC,EACxD,UAAU,WAAW,EACrB,UAAU,aAAa,EACvB,UAAU,UAAU,EACpB,UAAU,cAAc,EACxB,KAAK,aAAa,mBAAmB,EACrC,KAAK,aAAa,OAAO,gBAAgB;AAClC,UAAA,OAAO,YAAY;AACzB,UAAM,MAAM,KAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAG1C,QAAI,QAAQ,QAAQ;AACd,UAAA,CAAC,KAAK,KAAK;AACP,cAAA,UAAU,MAAM,SAAS,OAAO;AAAA,UACpC;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QAAA,CACD;AACG,YAAA,CAAC,QAAQ,KAAK,QAAQ;AACxB,mBAAS,GAAG,kCAAkC;AAAA,QAChD;AACA,aAAK,MAAM,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACD,CAAA,EAEA,KAAK,aAAa,CAAC,gBAAgB;AAC5B,UAAA,OAAO,YAAY;AAEnB,UAAA,EAAE,SAAS,MAAU,IAAA;AAE3B,QAAI,OAAO,KAAK;AAEZ,QAAA,QAAQ,IAAI,MAAM,QAAQ;AACrB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,UAAU;AAAA,IAAA,OACxB;AACO,kBAAA,KAAA,EAAO,UAAU;AAAA,IAC/B;AAEI,QAAA,QAAQ,IAAI,MAAM,OAAO;AACpB,aAAA,MAAM,IAAI,EAAE;AACP,kBAAA,KAAA,EAAO,aAAa;AAAA,IAAA,OAC3B;AACO,kBAAA,KAAA,EAAO,aAAa;AAAA,IAClC;AAEI,QAAA,QAAQ,IAAI,MAAM,QAAQ;AAC5B;AAAA,QACE;AAAA,QACA,aAAa,KAAK,IAAI;AAAA,MAAA;AAAA,IAE1B;AAAA,EACD,CAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACE;AAAA,MACA,EAAE,aAAa,yBAAyB;AAAA,IAC1C;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;"}
@@ -4,6 +4,7 @@ interface CmdOptions {
4
4
  fromToken: string;
5
5
  to: URL;
6
6
  toToken: string;
7
+ verbose?: boolean;
7
8
  only?: (keyof engineDataTransfer.TransferGroupFilter)[];
8
9
  exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];
9
10
  throttle?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/transfer/action.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,kBAAkB,EAAgC,MAAM,uBAAuB,CAAC;AA4BnG,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,GAAG,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD;;;;GAIG;+BACyB,UAAU;AAAtC,wBAqJE"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/transfer/action.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,kBAAkB,EAAgC,MAAM,uBAAuB,CAAC;AA4BnG,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,GAAG,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD;;;;GAIG;+BACyB,UAAU;AAAtC,wBAqJE"}
@@ -85,7 +85,7 @@ const action = async (opts) => {
85
85
  ]
86
86
  }
87
87
  });
88
- engine.diagnostics.onDiagnostic(dataTransfer.formatDiagnostic("transfer"));
88
+ engine.diagnostics.onDiagnostic(dataTransfer.formatDiagnostic("transfer", opts.verbose));
89
89
  const progress = engine.progress.stream;
90
90
  const { updateLoader } = dataTransfer.loadersFactory();
91
91
  engine.onSchemaDiff(dataTransfer.getDiffHandler(engine, { force: opts.force, action: "transfer" }));
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sources":["../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n DEFAULT_IGNORED_CONTENT_TYPES,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\ninterface CmdOptions {\n from?: URL;\n fromToken: string;\n to: URL;\n toToken: string;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n force?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n if (!(opts.from || opts.to) || (opts.from && opts.to)) {\n exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');\n }\n\n const strapi = await createStrapiInstance();\n let source;\n let destination;\n\n // if no URL provided, use local Strapi\n if (!opts.from) {\n source = createLocalStrapiSourceProvider({\n getStrapi: () => strapi,\n });\n }\n // if URL provided, set up a remote source provider\n else {\n if (!opts.fromToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n });\n }\n\n // if no URL provided, use local Strapi\n if (!opts.to) {\n destination = createLocalStrapiDestinationProvider({\n getStrapi: () => strapi,\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n // if URL provided, set up a remote destination provider\n else {\n if (!opts.toToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n destination = createRemoteStrapiDestinationProvider({\n url: opts.to,\n auth: {\n type: 'token',\n token: opts.toToken,\n },\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n\n if (!source || !destination) {\n exitWith(1, 'Could not create providers');\n }\n\n const engine = createTransferEngine(source, destination, {\n versionStrategy: 'exact',\n schemaStrategy: 'strict',\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('transfer'));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'transfer' }));\n\n engine.addErrorHandler(\n 'ASSETS_DIRECTORY_ERR',\n getAssetsBackupHandler(engine, { force: opts.force, action: 'transfer' })\n );\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting transfer...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: Awaited<ReturnType<typeof engine.transfer>>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n exitWith(0, exitMessageText('transfer'));\n } catch (e) {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('transfer', true));\n }\n};\n"],"names":["engineDataTransfer","strapiDataTransfer","isObject","exitWith","createStrapiInstance","parseRestoreFromOptions","DEFAULT_IGNORED_CONTENT_TYPES","formatDiagnostic","loadersFactory","getDiffHandler","getAssetsBackupHandler","getTransferTelemetryPayload","setSignalHandler","abortTransfer","buildTransferTable","exitMessageText"],"mappings":"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"}
1
+ {"version":3,"file":"action.js","sources":["../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n DEFAULT_IGNORED_CONTENT_TYPES,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\ninterface CmdOptions {\n from?: URL;\n fromToken: string;\n to: URL;\n toToken: string;\n verbose?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n force?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n if (!(opts.from || opts.to) || (opts.from && opts.to)) {\n exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');\n }\n\n const strapi = await createStrapiInstance();\n let source;\n let destination;\n\n // if no URL provided, use local Strapi\n if (!opts.from) {\n source = createLocalStrapiSourceProvider({\n getStrapi: () => strapi,\n });\n }\n // if URL provided, set up a remote source provider\n else {\n if (!opts.fromToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n });\n }\n\n // if no URL provided, use local Strapi\n if (!opts.to) {\n destination = createLocalStrapiDestinationProvider({\n getStrapi: () => strapi,\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n // if URL provided, set up a remote destination provider\n else {\n if (!opts.toToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n destination = createRemoteStrapiDestinationProvider({\n url: opts.to,\n auth: {\n type: 'token',\n token: opts.toToken,\n },\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n\n if (!source || !destination) {\n exitWith(1, 'Could not create providers');\n }\n\n const engine = createTransferEngine(source, destination, {\n versionStrategy: 'exact',\n schemaStrategy: 'strict',\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'transfer' }));\n\n engine.addErrorHandler(\n 'ASSETS_DIRECTORY_ERR',\n getAssetsBackupHandler(engine, { force: opts.force, action: 'transfer' })\n );\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting transfer...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: Awaited<ReturnType<typeof engine.transfer>>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n exitWith(0, exitMessageText('transfer'));\n } catch (e) {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('transfer', true));\n }\n};\n"],"names":["engineDataTransfer","strapiDataTransfer","isObject","exitWith","createStrapiInstance","parseRestoreFromOptions","DEFAULT_IGNORED_CONTENT_TYPES","formatDiagnostic","loadersFactory","getDiffHandler","getAssetsBackupHandler","getTransferTelemetryPayload","setSignalHandler","abortTransfer","buildTransferTable","exitMessageText"],"mappings":"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"}
@@ -84,7 +84,7 @@ const action = async (opts) => {
84
84
  ]
85
85
  }
86
86
  });
87
- engine2.diagnostics.onDiagnostic(formatDiagnostic("transfer"));
87
+ engine2.diagnostics.onDiagnostic(formatDiagnostic("transfer", opts.verbose));
88
88
  const progress = engine2.progress.stream;
89
89
  const { updateLoader } = loadersFactory();
90
90
  engine2.onSchemaDiff(getDiffHandler(engine2, { force: opts.force, action: "transfer" }));
@@ -1 +1 @@
1
- {"version":3,"file":"action.mjs","sources":["../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n DEFAULT_IGNORED_CONTENT_TYPES,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\ninterface CmdOptions {\n from?: URL;\n fromToken: string;\n to: URL;\n toToken: string;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n force?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n if (!(opts.from || opts.to) || (opts.from && opts.to)) {\n exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');\n }\n\n const strapi = await createStrapiInstance();\n let source;\n let destination;\n\n // if no URL provided, use local Strapi\n if (!opts.from) {\n source = createLocalStrapiSourceProvider({\n getStrapi: () => strapi,\n });\n }\n // if URL provided, set up a remote source provider\n else {\n if (!opts.fromToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n });\n }\n\n // if no URL provided, use local Strapi\n if (!opts.to) {\n destination = createLocalStrapiDestinationProvider({\n getStrapi: () => strapi,\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n // if URL provided, set up a remote destination provider\n else {\n if (!opts.toToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n destination = createRemoteStrapiDestinationProvider({\n url: opts.to,\n auth: {\n type: 'token',\n token: opts.toToken,\n },\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n\n if (!source || !destination) {\n exitWith(1, 'Could not create providers');\n }\n\n const engine = createTransferEngine(source, destination, {\n versionStrategy: 'exact',\n schemaStrategy: 'strict',\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('transfer'));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'transfer' }));\n\n engine.addErrorHandler(\n 'ASSETS_DIRECTORY_ERR',\n getAssetsBackupHandler(engine, { force: opts.force, action: 'transfer' })\n );\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting transfer...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: Awaited<ReturnType<typeof engine.transfer>>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n exitWith(0, exitMessageText('transfer'));\n } catch (e) {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('transfer', true));\n }\n};\n"],"names":["engineDataTransfer","strapiDataTransfer","strapi","engine"],"mappings":"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"}
1
+ {"version":3,"file":"action.mjs","sources":["../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n DEFAULT_IGNORED_CONTENT_TYPES,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\ninterface CmdOptions {\n from?: URL;\n fromToken: string;\n to: URL;\n toToken: string;\n verbose?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n force?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n if (!(opts.from || opts.to) || (opts.from && opts.to)) {\n exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');\n }\n\n const strapi = await createStrapiInstance();\n let source;\n let destination;\n\n // if no URL provided, use local Strapi\n if (!opts.from) {\n source = createLocalStrapiSourceProvider({\n getStrapi: () => strapi,\n });\n }\n // if URL provided, set up a remote source provider\n else {\n if (!opts.fromToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n });\n }\n\n // if no URL provided, use local Strapi\n if (!opts.to) {\n destination = createLocalStrapiDestinationProvider({\n getStrapi: () => strapi,\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n // if URL provided, set up a remote destination provider\n else {\n if (!opts.toToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n destination = createRemoteStrapiDestinationProvider({\n url: opts.to,\n auth: {\n type: 'token',\n token: opts.toToken,\n },\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n\n if (!source || !destination) {\n exitWith(1, 'Could not create providers');\n }\n\n const engine = createTransferEngine(source, destination, {\n versionStrategy: 'exact',\n schemaStrategy: 'strict',\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'transfer' }));\n\n engine.addErrorHandler(\n 'ASSETS_DIRECTORY_ERR',\n getAssetsBackupHandler(engine, { force: opts.force, action: 'transfer' })\n );\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting transfer...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: Awaited<ReturnType<typeof engine.transfer>>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n exitWith(0, exitMessageText('transfer'));\n } catch (e) {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('transfer', true));\n }\n};\n"],"names":["engineDataTransfer","strapiDataTransfer","strapi","engine"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/transfer/command.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,QAAA,MAAM,OAAO,mCA+FZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/transfer/command.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,QAAA,MAAM,OAAO,mCAiGZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -20,7 +20,7 @@ const command = () => {
20
20
  ).argParser(commander$1.parseURL)
21
21
  ).addOption(
22
22
  new commander.Option("--to-token <token>", `Transfer token for the remote Strapi destination`)
23
- ).addOption(commander$1.forceOption).addOption(dataTransfer.excludeOption).addOption(dataTransfer.onlyOption).addOption(dataTransfer.throttleOption).hook("preAction", dataTransfer.validateExcludeOnly).hook(
23
+ ).addOption(new commander.Option("--verbose", "Enable verbose logs")).addOption(commander$1.forceOption).addOption(dataTransfer.excludeOption).addOption(dataTransfer.onlyOption).addOption(dataTransfer.throttleOption).hook("preAction", dataTransfer.validateExcludeOnly).hook(
24
24
  "preAction",
25
25
  helpers.ifOptions(
26
26
  (opts) => !(opts.from || opts.to) || opts.from && opts.to,
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook(\n 'preAction',\n ifOptions(\n (opts) => !(opts.from || opts.to) || (opts.from && opts.to),\n async () =>\n exitWith(\n 1,\n 'Exactly one remote source (from) or destination (to) option must be provided'\n )\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["createCommand","Option","parseURL","forceOption","excludeOption","onlyOption","throttleOption","validateExcludeOnly","ifOptions","exitWith","assertUrlHasProtocol","inquirer","getCommanderConfirmMessage"],"mappings":";;;;;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAAA,UAAA,cAAc,UAAU,EACrB,YAAY,0CAA0C,EACtD,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAIC,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAUC,YAAAA,QAAQ;AAAA,EAAA,EAErB,UAAU,IAAID,iBAAO,wBAAwB,6CAA6C,CAAC,EAC3F;AAAA,IACC,IAAIA,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAUC,YAAAA,QAAQ;AAAA,EAAA,EAErB;AAAA,IACC,IAAID,iBAAO,sBAAsB,kDAAkD;AAAA,EAAA,EAEpF,UAAUE,YAAAA,WAAW,EACrB,UAAUC,aAAa,aAAA,EACvB,UAAUC,aAAAA,UAAU,EACpB,UAAUC,aAAc,cAAA,EACxB,KAAK,aAAaC,aAAAA,mBAAmB,EACrC;AAAA,IACC;AAAA,IACAC,QAAA;AAAA,MACE,CAAC,SAAS,EAAE,KAAK,QAAQ,KAAK,OAAQ,KAAK,QAAQ,KAAK;AAAA,MACxD,YACEC,QAAA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACJ;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACAD,QAAA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrBE,gBAAA,qBAAqB,YAAY,KAAK,EAAE,MAAM,CAAC,UAAU,OAAO,CAAC;AACjE,YAAI,CAAC,YAAY,KAAK,EAAE,WAAW;AAC3B,gBAAA,UAAU,MAAMC,kBAAA,QAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,WAAW,QAAQ;AAC9BF,6BAAS,GAAG,yDAAyD;AAAA,UACvE;AACY,sBAAA,KAAO,EAAA,YAAY,QAAQ;AAAA,QACzC;AAEM,cAAAG,YAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACAJ,QAAA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrBE,gBAAA,qBAAqB,YAAY,KAAK,EAAE,IAAI,CAAC,UAAU,OAAO,CAAC;AAC/D,YAAI,CAAC,YAAY,KAAK,EAAE,SAAS;AACzB,gBAAA,UAAU,MAAMC,kBAAA,QAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,SAAS,QAAQ;AAC5BF,6BAAS,GAAG,8DAA8D;AAAA,UAC5E;AACY,sBAAA,KAAO,EAAA,UAAU,QAAQ;AAAA,QACvC;AAEM,cAAAG,YAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;;"}
1
+ {"version":3,"file":"command.js","sources":["../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook(\n 'preAction',\n ifOptions(\n (opts) => !(opts.from || opts.to) || (opts.from && opts.to),\n async () =>\n exitWith(\n 1,\n 'Exactly one remote source (from) or destination (to) option must be provided'\n )\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["createCommand","Option","parseURL","forceOption","excludeOption","onlyOption","throttleOption","validateExcludeOnly","ifOptions","exitWith","assertUrlHasProtocol","inquirer","getCommanderConfirmMessage"],"mappings":";;;;;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAAA,UAAA,cAAc,UAAU,EACrB,YAAY,0CAA0C,EACtD,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAIC,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAUC,YAAAA,QAAQ;AAAA,EAAA,EAErB,UAAU,IAAID,iBAAO,wBAAwB,6CAA6C,CAAC,EAC3F;AAAA,IACC,IAAIA,UAAA;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAUC,YAAAA,QAAQ;AAAA,EAAA,EAGrB;AAAA,IACC,IAAID,iBAAO,sBAAsB,kDAAkD;AAAA,EAAA,EAEpF,UAAU,IAAIA,UAAAA,OAAO,aAAa,qBAAqB,CAAC,EACxD,UAAUE,YAAW,WAAA,EACrB,UAAUC,aAAa,aAAA,EACvB,UAAUC,uBAAU,EACpB,UAAUC,aAAAA,cAAc,EACxB,KAAK,aAAaC,aAAmB,mBAAA,EACrC;AAAA,IACC;AAAA,IACAC,QAAA;AAAA,MACE,CAAC,SAAS,EAAE,KAAK,QAAQ,KAAK,OAAQ,KAAK,QAAQ,KAAK;AAAA,MACxD,YACEC,QAAA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACJ;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACAD,QAAA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrBE,gBAAA,qBAAqB,YAAY,KAAK,EAAE,MAAM,CAAC,UAAU,OAAO,CAAC;AACjE,YAAI,CAAC,YAAY,KAAK,EAAE,WAAW;AAC3B,gBAAA,UAAU,MAAMC,kBAAA,QAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,WAAW,QAAQ;AAC9BF,6BAAS,GAAG,yDAAyD;AAAA,UACvE;AACY,sBAAA,KAAO,EAAA,YAAY,QAAQ;AAAA,QACzC;AAEM,cAAAG,YAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACAJ,QAAA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrBE,gBAAA,qBAAqB,YAAY,KAAK,EAAE,IAAI,CAAC,UAAU,OAAO,CAAC;AAC/D,YAAI,CAAC,YAAY,KAAK,EAAE,SAAS;AACzB,gBAAA,UAAU,MAAMC,kBAAA,QAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,SAAS,QAAQ;AAC5BF,6BAAS,GAAG,8DAA8D;AAAA,UAC5E;AACY,sBAAA,KAAO,EAAA,UAAU,QAAQ;AAAA,QACvC;AAEM,cAAAG,YAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;;"}
@@ -17,7 +17,7 @@ const command = () => {
17
17
  ).argParser(parseURL)
18
18
  ).addOption(
19
19
  new Option("--to-token <token>", `Transfer token for the remote Strapi destination`)
20
- ).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(throttleOption).hook("preAction", validateExcludeOnly).hook(
20
+ ).addOption(new Option("--verbose", "Enable verbose logs")).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(throttleOption).hook("preAction", validateExcludeOnly).hook(
21
21
  "preAction",
22
22
  ifOptions(
23
23
  (opts) => !(opts.from || opts.to) || opts.from && opts.to,
@@ -1 +1 @@
1
- {"version":3,"file":"command.mjs","sources":["../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook(\n 'preAction',\n ifOptions(\n (opts) => !(opts.from || opts.to) || (opts.from && opts.to),\n async () =>\n exitWith(\n 1,\n 'Exactly one remote source (from) or destination (to) option must be provided'\n )\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":[],"mappings":";;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAA,cAAc,UAAU,EACrB,YAAY,0CAA0C,EACtD,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAU,QAAQ;AAAA,EAAA,EAErB,UAAU,IAAI,OAAO,wBAAwB,6CAA6C,CAAC,EAC3F;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAU,QAAQ;AAAA,EAAA,EAErB;AAAA,IACC,IAAI,OAAO,sBAAsB,kDAAkD;AAAA,EAAA,EAEpF,UAAU,WAAW,EACrB,UAAU,aAAa,EACvB,UAAU,UAAU,EACpB,UAAU,cAAc,EACxB,KAAK,aAAa,mBAAmB,EACrC;AAAA,IACC;AAAA,IACA;AAAA,MACE,CAAC,SAAS,EAAE,KAAK,QAAQ,KAAK,OAAQ,KAAK,QAAQ,KAAK;AAAA,MACxD,YACE;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACJ;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrB,6BAAqB,YAAY,KAAK,EAAE,MAAM,CAAC,UAAU,OAAO,CAAC;AACjE,YAAI,CAAC,YAAY,KAAK,EAAE,WAAW;AAC3B,gBAAA,UAAU,MAAM,SAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,WAAW,QAAQ;AAC9B,qBAAS,GAAG,yDAAyD;AAAA,UACvE;AACY,sBAAA,KAAO,EAAA,YAAY,QAAQ;AAAA,QACzC;AAEM,cAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrB,6BAAqB,YAAY,KAAK,EAAE,IAAI,CAAC,UAAU,OAAO,CAAC;AAC/D,YAAI,CAAC,YAAY,KAAK,EAAE,SAAS;AACzB,gBAAA,UAAU,MAAM,SAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,SAAS,QAAQ;AAC5B,qBAAS,GAAG,8DAA8D;AAAA,UAC5E;AACY,sBAAA,KAAO,EAAA,UAAU,QAAQ;AAAA,QACvC;AAEM,cAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;"}
1
+ {"version":3,"file":"command.mjs","sources":["../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook(\n 'preAction',\n ifOptions(\n (opts) => !(opts.from || opts.to) || (opts.from && opts.to),\n async () =>\n exitWith(\n 1,\n 'Exactly one remote source (from) or destination (to) option must be provided'\n )\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":[],"mappings":";;;;;;AAgBA,MAAM,UAAU,MAAM;AAElB,SAAA,cAAc,UAAU,EACrB,YAAY,0CAA0C,EACtD,qBAAqB,KAAK,EAC1B;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAU,QAAQ;AAAA,EAAA,EAErB,UAAU,IAAI,OAAO,wBAAwB,6CAA6C,CAAC,EAC3F;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,UAAU,QAAQ;AAAA,EAAA,EAGrB;AAAA,IACC,IAAI,OAAO,sBAAsB,kDAAkD;AAAA,EAAA,EAEpF,UAAU,IAAI,OAAO,aAAa,qBAAqB,CAAC,EACxD,UAAU,WAAW,EACrB,UAAU,aAAa,EACvB,UAAU,UAAU,EACpB,UAAU,cAAc,EACxB,KAAK,aAAa,mBAAmB,EACrC;AAAA,IACC;AAAA,IACA;AAAA,MACE,CAAC,SAAS,EAAE,KAAK,QAAQ,KAAK,OAAQ,KAAK,QAAQ,KAAK;AAAA,MACxD,YACE;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACJ;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrB,6BAAqB,YAAY,KAAK,EAAE,MAAM,CAAC,UAAU,OAAO,CAAC;AACjE,YAAI,CAAC,YAAY,KAAK,EAAE,WAAW;AAC3B,gBAAA,UAAU,MAAM,SAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,WAAW,QAAQ;AAC9B,qBAAS,GAAG,yDAAyD;AAAA,UACvE;AACY,sBAAA,KAAO,EAAA,YAAY,QAAQ;AAAA,QACzC;AAEM,cAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAGD;AAAA,IACC;AAAA,IACA;AAAA,MACE,CAAC,SAAS,KAAK;AAAA,MACf,OAAO,gBAAgB;AACrB,6BAAqB,YAAY,KAAK,EAAE,IAAI,CAAC,UAAU,OAAO,CAAC;AAC/D,YAAI,CAAC,YAAY,KAAK,EAAE,SAAS;AACzB,gBAAA,UAAU,MAAM,SAAS,OAAO;AAAA,YACpC;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UAAA,CACD;AACG,cAAA,CAAC,QAAQ,SAAS,QAAQ;AAC5B,qBAAS,GAAG,8DAA8D;AAAA,UAC5E;AACY,sBAAA,KAAO,EAAA,UAAU,QAAQ;AAAA,QACvC;AAEM,cAAA;AAAA,UACJ;AAAA,UACA,EAAE,aAAa,2BAA2B;AAAA,UAC1C,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EAAA,EAED,OAAO,MAAM;AAEpB;"}
@@ -20,7 +20,7 @@ declare const throttleOption: Option;
20
20
  declare const excludeOption: Option;
21
21
  declare const onlyOption: Option;
22
22
  declare const validateExcludeOnly: (command: Command) => void;
23
- declare const formatDiagnostic: (operation: string) => Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0];
23
+ declare const formatDiagnostic: (operation: string, info?: boolean) => Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0];
24
24
  type Loaders = {
25
25
  [key in engineDataTransfer.TransferStage]: ora.Ora;
26
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"data-transfer.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/data-transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-transfer.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/data-transfer.ts"],"names":[],"mappings":"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"}
@@ -156,12 +156,15 @@ const errorColors = {
156
156
  error: chalk__default.default.red,
157
157
  silly: chalk__default.default.yellow
158
158
  };
159
- const formatDiagnostic = (operation) => {
159
+ const formatDiagnostic = (operation, info) => {
160
160
  let logger$1;
161
161
  const getLogger = () => {
162
162
  if (!logger$1) {
163
163
  logger$1 = logger.createLogger(
164
- logger.configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, { level: "info" })
164
+ logger.configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, {
165
+ level: "info",
166
+ format: logger.formats?.detailedLogs
167
+ })
165
168
  );
166
169
  }
167
170
  return logger$1;
@@ -174,9 +177,9 @@ const formatDiagnostic = (operation) => {
174
177
  const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);
175
178
  getLogger().error(errorMessage);
176
179
  }
177
- if (kind === "info") {
178
- const { message, params } = details;
179
- const msg = `${message}
180
+ if (kind === "info" && info) {
181
+ const { message, params, source } = details;
182
+ const msg = `[${source}] ${message}
180
183
  ${params ? JSON.stringify(params, null, 2) : ""}`;
181
184
  getLogger().info(msg);
182
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-transfer.js","sources":["../../../src/cli/utils/data-transfer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { Command, Option } from 'commander';\nimport { configs, createLogger, type winston } from '@strapi/logger';\nimport { createStrapi, compileStrapi } from '@strapi/core';\nimport ora from 'ora';\nimport { merge } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport { readableBytes, exitWith } from './helpers';\nimport { getParseListWithChoices, parseInteger, confirmMessage } from './commander';\n\nconst {\n errors: { TransferEngineInitializationError },\n} = engineDataTransfer;\n\nconst exitMessageText = (process: string, error = false) => {\n const processCapitalized = process[0].toUpperCase() + process.slice(1);\n\n if (!error) {\n return chalk.bold(\n chalk.green(`${processCapitalized} process has been completed successfully!`)\n );\n }\n\n return chalk.bold(chalk.red(`${processCapitalized} process failed.`));\n};\n\nconst pad = (n: number) => {\n return (n < 10 ? '0' : '') + String(n);\n};\n\nconst yyyymmddHHMMSS = () => {\n const date = new Date();\n\n return (\n date.getFullYear() +\n pad(date.getMonth() + 1) +\n pad(date.getDate()) +\n pad(date.getHours()) +\n pad(date.getMinutes()) +\n pad(date.getSeconds())\n );\n};\n\nconst getDefaultExportName = () => {\n return `export_${yyyymmddHHMMSS()}`;\n};\n\ntype ResultData = engineDataTransfer.ITransferResults<\n engineDataTransfer.ISourceProvider,\n engineDataTransfer.IDestinationProvider\n>['engine'];\n\nconst buildTransferTable = (resultData: ResultData) => {\n if (!resultData) {\n return;\n }\n\n // Build pretty table\n const table = new Table({\n head: ['Type', 'Count', 'Size'].map((text) => chalk.bold.blue(text)),\n });\n\n let totalBytes = 0;\n let totalItems = 0;\n (Object.keys(resultData) as engineDataTransfer.TransferStage[]).forEach((stage) => {\n const item = resultData[stage];\n\n if (!item) {\n return;\n }\n\n table.push([\n { hAlign: 'left', content: chalk.bold(stage) },\n { hAlign: 'right', content: item.count },\n { hAlign: 'right', content: `${readableBytes(item.bytes, 1, 11)} ` },\n ]);\n totalBytes += item.bytes;\n totalItems += item.count;\n\n if (item.aggregates) {\n (Object.keys(item.aggregates) as (keyof typeof item.aggregates)[])\n .sort()\n .forEach((subkey) => {\n if (!item.aggregates) {\n return;\n }\n\n const subitem = item.aggregates[subkey];\n\n table.push([\n { hAlign: 'left', content: `-- ${chalk.bold.grey(subkey)}` },\n { hAlign: 'right', content: chalk.grey(subitem.count) },\n { hAlign: 'right', content: chalk.grey(`(${readableBytes(subitem.bytes, 1, 11)})`) },\n ]);\n });\n }\n });\n table.push([\n { hAlign: 'left', content: chalk.bold.green('Total') },\n { hAlign: 'right', content: chalk.bold.green(totalItems) },\n { hAlign: 'right', content: `${chalk.bold.green(readableBytes(totalBytes, 1, 11))} ` },\n ]);\n\n return table;\n};\n\nconst DEFAULT_IGNORED_CONTENT_TYPES = [\n 'admin::permission',\n 'admin::user',\n 'admin::role',\n 'admin::api-token',\n 'admin::api-token-permission',\n 'admin::transfer-token',\n 'admin::transfer-token-permission',\n 'admin::audit-log',\n 'plugin::content-releases.release',\n 'plugin::content-releases.release-action',\n];\n\nconst abortTransfer = async ({\n engine,\n strapi,\n}: {\n engine: engineDataTransfer.TransferEngine;\n strapi: Core.Strapi;\n}) => {\n try {\n await engine.abortTransfer();\n await strapi.destroy();\n } catch (e) {\n // ignore because there's not much else we can do\n return false;\n }\n return true;\n};\n\nconst setSignalHandler = async (\n handler: (...args: unknown[]) => void,\n signals = ['SIGINT', 'SIGTERM', 'SIGQUIT']\n) => {\n signals.forEach((signal) => {\n // We specifically remove ALL listeners because we have to clear the one added in Strapi bootstrap that has a process.exit\n // TODO: Ideally Strapi bootstrap would not add that listener, and then this could be more flexible and add/remove only what it needs to\n process.removeAllListeners(signal);\n process.on(signal, handler);\n });\n};\n\nconst createStrapiInstance = async (opts: { logLevel?: string } = {}): Promise<Core.Strapi> => {\n try {\n const appContext = await compileStrapi();\n const app = createStrapi({ ...opts, ...appContext });\n\n app.log.level = opts.logLevel || 'error';\n return await app.load();\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ECONNREFUSED') {\n throw new Error('Process failed. Check the database connection with your Strapi project.');\n }\n\n throw error;\n }\n};\n\nconst transferDataTypes = Object.keys(engineDataTransfer.TransferGroupPresets);\n\nconst throttleOption = new Option(\n '--throttle <delay after each entity>',\n `Add a delay in milliseconds between each transferred entity`\n)\n .argParser(parseInteger)\n .hideHelp(); // This option is not publicly documented\n\nconst excludeOption = new Option(\n '--exclude <comma-separated data types>',\n `Exclude data using comma-separated types. Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"exclude\"'));\n\nconst onlyOption = new Option(\n '--only <command-separated data types>',\n `Include only these types of data (plus schemas). Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"only\"'));\n\nconst validateExcludeOnly = (command: Command) => {\n const { exclude, only } = command.opts();\n if (!only || !exclude) {\n return;\n }\n\n const choicesInBoth = only.filter((n: string) => {\n return exclude.indexOf(n) !== -1;\n });\n if (choicesInBoth.length > 0) {\n exitWith(\n 1,\n `Data types may not be used in both \"exclude\" and \"only\" in the same command. Found in both: ${choicesInBoth.join(\n ','\n )}`\n );\n }\n};\n\nconst errorColors = {\n fatal: chalk.red,\n error: chalk.red,\n silly: chalk.yellow,\n} as const;\n\nconst formatDiagnostic = (\n operation: string\n): Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0] => {\n // Create log file for all incoming diagnostics\n let logger: undefined | winston.Logger;\n const getLogger = () => {\n if (!logger) {\n logger = createLogger(\n configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, { level: 'info' })\n );\n }\n return logger;\n };\n\n // We don't want to write a log file until there is something to be logged\n\n return ({ details, kind }) => {\n try {\n if (kind === 'error') {\n const { message, severity = 'fatal' } = details;\n\n const colorizeError = errorColors[severity];\n const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);\n\n getLogger().error(errorMessage);\n }\n if (kind === 'info') {\n const { message, params } = details;\n\n const msg = `${message}\\n${params ? JSON.stringify(params, null, 2) : ''}`;\n\n getLogger().info(msg);\n }\n if (kind === 'warning') {\n const { origin, message } = details;\n\n getLogger().warn(`(${origin ?? 'transfer'}) ${message}`);\n }\n } catch (err) {\n getLogger().error(err);\n }\n };\n};\n\ntype Loaders = {\n [key in engineDataTransfer.TransferStage]: ora.Ora;\n};\n\ntype Data = {\n [key in engineDataTransfer.TransferStage]?: {\n startTime?: number;\n endTime?: number;\n bytes?: number;\n count?: number;\n };\n};\n\nconst loadersFactory = (defaultLoaders: Loaders = {} as Loaders) => {\n const loaders = defaultLoaders;\n const updateLoader = (stage: engineDataTransfer.TransferStage, data: Data) => {\n if (!(stage in loaders)) {\n createLoader(stage);\n }\n\n const stageData = data[stage];\n const elapsedTime = stageData?.startTime\n ? (stageData?.endTime || Date.now()) - stageData.startTime\n : 0;\n const size = `size: ${readableBytes(stageData?.bytes ?? 0)}`;\n const elapsed = `elapsed: ${elapsedTime} ms`;\n const speed =\n elapsedTime > 0 ? `(${readableBytes(((stageData?.bytes ?? 0) * 1000) / elapsedTime)}/s)` : '';\n\n loaders[stage].text = `${stage}: ${stageData?.count ?? 0} transfered (${size}) (${elapsed}) ${\n !stageData?.endTime ? speed : ''\n }`;\n\n return loaders[stage];\n };\n\n const createLoader = (stage: engineDataTransfer.TransferStage) => {\n Object.assign(loaders, { [stage]: ora() });\n return loaders[stage];\n };\n\n const getLoader = (stage: engineDataTransfer.TransferStage) => {\n return loaders[stage];\n };\n\n return {\n updateLoader,\n createLoader,\n getLoader,\n };\n};\n\n/**\n * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object\n */\nconst getTransferTelemetryPayload = (engine: engineDataTransfer.TransferEngine) => {\n return {\n eventProperties: {\n source: engine?.sourceProvider?.name,\n destination: engine?.destinationProvider?.name,\n },\n };\n};\n\n/**\n * Get a transfer engine schema diff handler that confirms with the user before bypassing a schema check\n */\nconst getDiffHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.SchemaDiffHandlerContext,\n next: (ctx: engineDataTransfer.SchemaDiffHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n let workflowsStatus;\n const source = 'Schema Integrity';\n\n Object.entries(context.diffs).forEach(([uid, diffs]) => {\n for (const diff of diffs) {\n const path = [uid].concat(diff.path).join('.');\n const endPath = diff.path[diff.path.length - 1];\n\n // Catch known features\n if (\n uid === 'plugin::review-workflows.workflow' ||\n uid === 'plugin::review-workflows.workflow-stage' ||\n endPath?.startsWith('strapi_stage') ||\n endPath?.startsWith('strapi_assignee')\n ) {\n workflowsStatus = diff.kind;\n }\n // handle generic cases\n else if (diff.kind === 'added') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} does not exist on source`), source);\n } else if (diff.kind === 'deleted') {\n engine.reportWarning(\n chalk.red(`${chalk.bold(path)} does not exist on destination`),\n source\n );\n } else if (diff.kind === 'modified') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} has a different data type`), source);\n }\n }\n });\n\n // output the known feature warnings\n if (workflowsStatus === 'added') {\n engine.reportWarning(chalk.red(`Review workflows feature does not exist on source`), source);\n } else if (workflowsStatus === 'deleted') {\n engine.reportWarning(\n chalk.red(`Review workflows feature does not exist on destination`),\n source\n );\n } else if (workflowsStatus === 'modified') {\n engine.panic(\n new TransferEngineInitializationError('Unresolved differences in schema [review workflows]')\n );\n }\n\n const confirmed = await confirmMessage(\n 'There are differences in schema between the source and destination, and the data listed above will be lost. Are you sure you want to continue?',\n {\n force,\n }\n );\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n if (confirmed) {\n context.ignoredDiffs = merge(context.diffs, context.ignoredDiffs);\n }\n\n return next(context);\n };\n};\n\nconst getAssetsBackupHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.ErrorHandlerContext,\n next: (ctx: engineDataTransfer.ErrorHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n console.warn(\n 'The backup for the assets could not be created inside the public directory. Ensure Strapi has write permissions on the public directory.'\n );\n const confirmed = await confirmMessage(\n 'Do you want to continue without backing up your public/uploads files?',\n {\n force,\n }\n );\n\n if (confirmed) {\n context.ignore = true;\n }\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n return next(context);\n };\n};\n\nconst shouldSkipStage = (\n opts: Partial<engineDataTransfer.ITransferEngineOptions>,\n dataKind: engineDataTransfer.TransferFilterPreset\n) => {\n if (opts.exclude?.includes(dataKind)) {\n return true;\n }\n if (opts.only) {\n return !opts.only.includes(dataKind);\n }\n\n return false;\n};\n\ntype RestoreConfig = NonNullable<\n strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore']\n>;\n\n// Based on exclude/only from options, create the restore object to match\nconst parseRestoreFromOptions = (opts: Partial<engineDataTransfer.ITransferEngineOptions>) => {\n const entitiesOptions: RestoreConfig['entities'] = {\n exclude: DEFAULT_IGNORED_CONTENT_TYPES,\n include: undefined,\n };\n\n // if content is not included, send an empty array for include\n if ((opts.only && !opts.only.includes('content')) || opts.exclude?.includes('content')) {\n entitiesOptions.include = [];\n }\n\n const restoreConfig: strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore'] =\n {\n entities: entitiesOptions,\n assets: !shouldSkipStage(opts, 'files'),\n configuration: {\n webhook: !shouldSkipStage(opts, 'config'),\n coreStore: !shouldSkipStage(opts, 'config'),\n },\n };\n\n return restoreConfig;\n};\n\nexport {\n loadersFactory,\n buildTransferTable,\n getDefaultExportName,\n getTransferTelemetryPayload,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n excludeOption,\n exitMessageText,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n formatDiagnostic,\n abortTransfer,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n shouldSkipStage,\n parseRestoreFromOptions,\n};\n"],"names":["engineDataTransfer","process","chalk","Table","readableBytes","strapi","compileStrapi","createStrapi","Option","parseInteger","getParseListWithChoices","exitWith","logger","createLogger","configs","ora","confirmMessage","merge"],"mappings":"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"}
1
+ {"version":3,"file":"data-transfer.js","sources":["../../../src/cli/utils/data-transfer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { Command, Option } from 'commander';\nimport { configs, createLogger, type winston, formats } from '@strapi/logger';\nimport { createStrapi, compileStrapi } from '@strapi/core';\nimport ora from 'ora';\nimport { merge } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport { readableBytes, exitWith } from './helpers';\nimport { getParseListWithChoices, parseInteger, confirmMessage } from './commander';\n\nconst {\n errors: { TransferEngineInitializationError },\n} = engineDataTransfer;\n\nconst exitMessageText = (process: string, error = false) => {\n const processCapitalized = process[0].toUpperCase() + process.slice(1);\n\n if (!error) {\n return chalk.bold(\n chalk.green(`${processCapitalized} process has been completed successfully!`)\n );\n }\n\n return chalk.bold(chalk.red(`${processCapitalized} process failed.`));\n};\n\nconst pad = (n: number) => {\n return (n < 10 ? '0' : '') + String(n);\n};\n\nconst yyyymmddHHMMSS = () => {\n const date = new Date();\n\n return (\n date.getFullYear() +\n pad(date.getMonth() + 1) +\n pad(date.getDate()) +\n pad(date.getHours()) +\n pad(date.getMinutes()) +\n pad(date.getSeconds())\n );\n};\n\nconst getDefaultExportName = () => {\n return `export_${yyyymmddHHMMSS()}`;\n};\n\ntype ResultData = engineDataTransfer.ITransferResults<\n engineDataTransfer.ISourceProvider,\n engineDataTransfer.IDestinationProvider\n>['engine'];\n\nconst buildTransferTable = (resultData: ResultData) => {\n if (!resultData) {\n return;\n }\n\n // Build pretty table\n const table = new Table({\n head: ['Type', 'Count', 'Size'].map((text) => chalk.bold.blue(text)),\n });\n\n let totalBytes = 0;\n let totalItems = 0;\n (Object.keys(resultData) as engineDataTransfer.TransferStage[]).forEach((stage) => {\n const item = resultData[stage];\n\n if (!item) {\n return;\n }\n\n table.push([\n { hAlign: 'left', content: chalk.bold(stage) },\n { hAlign: 'right', content: item.count },\n { hAlign: 'right', content: `${readableBytes(item.bytes, 1, 11)} ` },\n ]);\n totalBytes += item.bytes;\n totalItems += item.count;\n\n if (item.aggregates) {\n (Object.keys(item.aggregates) as (keyof typeof item.aggregates)[])\n .sort()\n .forEach((subkey) => {\n if (!item.aggregates) {\n return;\n }\n\n const subitem = item.aggregates[subkey];\n\n table.push([\n { hAlign: 'left', content: `-- ${chalk.bold.grey(subkey)}` },\n { hAlign: 'right', content: chalk.grey(subitem.count) },\n { hAlign: 'right', content: chalk.grey(`(${readableBytes(subitem.bytes, 1, 11)})`) },\n ]);\n });\n }\n });\n table.push([\n { hAlign: 'left', content: chalk.bold.green('Total') },\n { hAlign: 'right', content: chalk.bold.green(totalItems) },\n { hAlign: 'right', content: `${chalk.bold.green(readableBytes(totalBytes, 1, 11))} ` },\n ]);\n\n return table;\n};\n\nconst DEFAULT_IGNORED_CONTENT_TYPES = [\n 'admin::permission',\n 'admin::user',\n 'admin::role',\n 'admin::api-token',\n 'admin::api-token-permission',\n 'admin::transfer-token',\n 'admin::transfer-token-permission',\n 'admin::audit-log',\n 'plugin::content-releases.release',\n 'plugin::content-releases.release-action',\n];\n\nconst abortTransfer = async ({\n engine,\n strapi,\n}: {\n engine: engineDataTransfer.TransferEngine;\n strapi: Core.Strapi;\n}) => {\n try {\n await engine.abortTransfer();\n await strapi.destroy();\n } catch (e) {\n // ignore because there's not much else we can do\n return false;\n }\n return true;\n};\n\nconst setSignalHandler = async (\n handler: (...args: unknown[]) => void,\n signals = ['SIGINT', 'SIGTERM', 'SIGQUIT']\n) => {\n signals.forEach((signal) => {\n // We specifically remove ALL listeners because we have to clear the one added in Strapi bootstrap that has a process.exit\n // TODO: Ideally Strapi bootstrap would not add that listener, and then this could be more flexible and add/remove only what it needs to\n process.removeAllListeners(signal);\n process.on(signal, handler);\n });\n};\n\nconst createStrapiInstance = async (opts: { logLevel?: string } = {}): Promise<Core.Strapi> => {\n try {\n const appContext = await compileStrapi();\n const app = createStrapi({ ...opts, ...appContext });\n\n app.log.level = opts.logLevel || 'error';\n return await app.load();\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ECONNREFUSED') {\n throw new Error('Process failed. Check the database connection with your Strapi project.');\n }\n\n throw error;\n }\n};\n\nconst transferDataTypes = Object.keys(engineDataTransfer.TransferGroupPresets);\n\nconst throttleOption = new Option(\n '--throttle <delay after each entity>',\n `Add a delay in milliseconds between each transferred entity`\n)\n .argParser(parseInteger)\n .hideHelp(); // This option is not publicly documented\n\nconst excludeOption = new Option(\n '--exclude <comma-separated data types>',\n `Exclude data using comma-separated types. Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"exclude\"'));\n\nconst onlyOption = new Option(\n '--only <command-separated data types>',\n `Include only these types of data (plus schemas). Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"only\"'));\n\nconst validateExcludeOnly = (command: Command) => {\n const { exclude, only } = command.opts();\n if (!only || !exclude) {\n return;\n }\n\n const choicesInBoth = only.filter((n: string) => {\n return exclude.indexOf(n) !== -1;\n });\n if (choicesInBoth.length > 0) {\n exitWith(\n 1,\n `Data types may not be used in both \"exclude\" and \"only\" in the same command. Found in both: ${choicesInBoth.join(\n ','\n )}`\n );\n }\n};\n\nconst errorColors = {\n fatal: chalk.red,\n error: chalk.red,\n silly: chalk.yellow,\n} as const;\n\nconst formatDiagnostic = (\n operation: string,\n info?: boolean\n): Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0] => {\n // Create log file for all incoming diagnostics\n let logger: undefined | winston.Logger;\n const getLogger = () => {\n if (!logger) {\n logger = createLogger(\n configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, {\n level: 'info',\n format: formats?.detailedLogs,\n })\n );\n }\n return logger;\n };\n\n // We don't want to write a log file until there is something to be logged\n\n return ({ details, kind }) => {\n try {\n if (kind === 'error') {\n const { message, severity = 'fatal' } = details;\n\n const colorizeError = errorColors[severity];\n const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);\n\n getLogger().error(errorMessage);\n }\n if (kind === 'info' && info) {\n const { message, params, source } = details;\n\n const msg = `[${source}] ${message}\\n${params ? JSON.stringify(params, null, 2) : ''}`;\n\n getLogger().info(msg);\n }\n if (kind === 'warning') {\n const { origin, message } = details;\n\n getLogger().warn(`(${origin ?? 'transfer'}) ${message}`);\n }\n } catch (err) {\n getLogger().error(err);\n }\n };\n};\n\ntype Loaders = {\n [key in engineDataTransfer.TransferStage]: ora.Ora;\n};\n\ntype Data = {\n [key in engineDataTransfer.TransferStage]?: {\n startTime?: number;\n endTime?: number;\n bytes?: number;\n count?: number;\n };\n};\n\nconst loadersFactory = (defaultLoaders: Loaders = {} as Loaders) => {\n const loaders = defaultLoaders;\n const updateLoader = (stage: engineDataTransfer.TransferStage, data: Data) => {\n if (!(stage in loaders)) {\n createLoader(stage);\n }\n\n const stageData = data[stage];\n const elapsedTime = stageData?.startTime\n ? (stageData?.endTime || Date.now()) - stageData.startTime\n : 0;\n const size = `size: ${readableBytes(stageData?.bytes ?? 0)}`;\n const elapsed = `elapsed: ${elapsedTime} ms`;\n const speed =\n elapsedTime > 0 ? `(${readableBytes(((stageData?.bytes ?? 0) * 1000) / elapsedTime)}/s)` : '';\n\n loaders[stage].text = `${stage}: ${stageData?.count ?? 0} transfered (${size}) (${elapsed}) ${\n !stageData?.endTime ? speed : ''\n }`;\n\n return loaders[stage];\n };\n\n const createLoader = (stage: engineDataTransfer.TransferStage) => {\n Object.assign(loaders, { [stage]: ora() });\n return loaders[stage];\n };\n\n const getLoader = (stage: engineDataTransfer.TransferStage) => {\n return loaders[stage];\n };\n\n return {\n updateLoader,\n createLoader,\n getLoader,\n };\n};\n\n/**\n * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object\n */\nconst getTransferTelemetryPayload = (engine: engineDataTransfer.TransferEngine) => {\n return {\n eventProperties: {\n source: engine?.sourceProvider?.name,\n destination: engine?.destinationProvider?.name,\n },\n };\n};\n\n/**\n * Get a transfer engine schema diff handler that confirms with the user before bypassing a schema check\n */\nconst getDiffHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.SchemaDiffHandlerContext,\n next: (ctx: engineDataTransfer.SchemaDiffHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n let workflowsStatus;\n const source = 'Schema Integrity';\n\n Object.entries(context.diffs).forEach(([uid, diffs]) => {\n for (const diff of diffs) {\n const path = [uid].concat(diff.path).join('.');\n const endPath = diff.path[diff.path.length - 1];\n\n // Catch known features\n if (\n uid === 'plugin::review-workflows.workflow' ||\n uid === 'plugin::review-workflows.workflow-stage' ||\n endPath?.startsWith('strapi_stage') ||\n endPath?.startsWith('strapi_assignee')\n ) {\n workflowsStatus = diff.kind;\n }\n // handle generic cases\n else if (diff.kind === 'added') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} does not exist on source`), source);\n } else if (diff.kind === 'deleted') {\n engine.reportWarning(\n chalk.red(`${chalk.bold(path)} does not exist on destination`),\n source\n );\n } else if (diff.kind === 'modified') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} has a different data type`), source);\n }\n }\n });\n\n // output the known feature warnings\n if (workflowsStatus === 'added') {\n engine.reportWarning(chalk.red(`Review workflows feature does not exist on source`), source);\n } else if (workflowsStatus === 'deleted') {\n engine.reportWarning(\n chalk.red(`Review workflows feature does not exist on destination`),\n source\n );\n } else if (workflowsStatus === 'modified') {\n engine.panic(\n new TransferEngineInitializationError('Unresolved differences in schema [review workflows]')\n );\n }\n\n const confirmed = await confirmMessage(\n 'There are differences in schema between the source and destination, and the data listed above will be lost. Are you sure you want to continue?',\n {\n force,\n }\n );\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n if (confirmed) {\n context.ignoredDiffs = merge(context.diffs, context.ignoredDiffs);\n }\n\n return next(context);\n };\n};\n\nconst getAssetsBackupHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.ErrorHandlerContext,\n next: (ctx: engineDataTransfer.ErrorHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n console.warn(\n 'The backup for the assets could not be created inside the public directory. Ensure Strapi has write permissions on the public directory.'\n );\n const confirmed = await confirmMessage(\n 'Do you want to continue without backing up your public/uploads files?',\n {\n force,\n }\n );\n\n if (confirmed) {\n context.ignore = true;\n }\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n return next(context);\n };\n};\n\nconst shouldSkipStage = (\n opts: Partial<engineDataTransfer.ITransferEngineOptions>,\n dataKind: engineDataTransfer.TransferFilterPreset\n) => {\n if (opts.exclude?.includes(dataKind)) {\n return true;\n }\n if (opts.only) {\n return !opts.only.includes(dataKind);\n }\n\n return false;\n};\n\ntype RestoreConfig = NonNullable<\n strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore']\n>;\n\n// Based on exclude/only from options, create the restore object to match\nconst parseRestoreFromOptions = (opts: Partial<engineDataTransfer.ITransferEngineOptions>) => {\n const entitiesOptions: RestoreConfig['entities'] = {\n exclude: DEFAULT_IGNORED_CONTENT_TYPES,\n include: undefined,\n };\n\n // if content is not included, send an empty array for include\n if ((opts.only && !opts.only.includes('content')) || opts.exclude?.includes('content')) {\n entitiesOptions.include = [];\n }\n\n const restoreConfig: strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore'] =\n {\n entities: entitiesOptions,\n assets: !shouldSkipStage(opts, 'files'),\n configuration: {\n webhook: !shouldSkipStage(opts, 'config'),\n coreStore: !shouldSkipStage(opts, 'config'),\n },\n };\n\n return restoreConfig;\n};\n\nexport {\n loadersFactory,\n buildTransferTable,\n getDefaultExportName,\n getTransferTelemetryPayload,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n excludeOption,\n exitMessageText,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n formatDiagnostic,\n abortTransfer,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n shouldSkipStage,\n parseRestoreFromOptions,\n};\n"],"names":["engineDataTransfer","process","chalk","Table","readableBytes","strapi","compileStrapi","createStrapi","Option","parseInteger","getParseListWithChoices","exitWith","logger","createLogger","configs","formats","ora","confirmMessage","merge"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import chalk from "chalk";
2
2
  import CLITable from "cli-table3";
3
3
  import { Option } from "commander";
4
- import { createLogger, configs } from "@strapi/logger";
4
+ import { createLogger, configs, formats } from "@strapi/logger";
5
5
  import { compileStrapi, createStrapi } from "@strapi/core";
6
6
  import ora from "ora";
7
7
  import { merge } from "lodash/fp";
@@ -150,12 +150,15 @@ const errorColors = {
150
150
  error: chalk.red,
151
151
  silly: chalk.yellow
152
152
  };
153
- const formatDiagnostic = (operation) => {
153
+ const formatDiagnostic = (operation, info) => {
154
154
  let logger;
155
155
  const getLogger = () => {
156
156
  if (!logger) {
157
157
  logger = createLogger(
158
- configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, { level: "info" })
158
+ configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, {
159
+ level: "info",
160
+ format: formats?.detailedLogs
161
+ })
159
162
  );
160
163
  }
161
164
  return logger;
@@ -168,9 +171,9 @@ const formatDiagnostic = (operation) => {
168
171
  const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);
169
172
  getLogger().error(errorMessage);
170
173
  }
171
- if (kind === "info") {
172
- const { message, params } = details;
173
- const msg = `${message}
174
+ if (kind === "info" && info) {
175
+ const { message, params, source } = details;
176
+ const msg = `[${source}] ${message}
174
177
  ${params ? JSON.stringify(params, null, 2) : ""}`;
175
178
  getLogger().info(msg);
176
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-transfer.mjs","sources":["../../../src/cli/utils/data-transfer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { Command, Option } from 'commander';\nimport { configs, createLogger, type winston } from '@strapi/logger';\nimport { createStrapi, compileStrapi } from '@strapi/core';\nimport ora from 'ora';\nimport { merge } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport { readableBytes, exitWith } from './helpers';\nimport { getParseListWithChoices, parseInteger, confirmMessage } from './commander';\n\nconst {\n errors: { TransferEngineInitializationError },\n} = engineDataTransfer;\n\nconst exitMessageText = (process: string, error = false) => {\n const processCapitalized = process[0].toUpperCase() + process.slice(1);\n\n if (!error) {\n return chalk.bold(\n chalk.green(`${processCapitalized} process has been completed successfully!`)\n );\n }\n\n return chalk.bold(chalk.red(`${processCapitalized} process failed.`));\n};\n\nconst pad = (n: number) => {\n return (n < 10 ? '0' : '') + String(n);\n};\n\nconst yyyymmddHHMMSS = () => {\n const date = new Date();\n\n return (\n date.getFullYear() +\n pad(date.getMonth() + 1) +\n pad(date.getDate()) +\n pad(date.getHours()) +\n pad(date.getMinutes()) +\n pad(date.getSeconds())\n );\n};\n\nconst getDefaultExportName = () => {\n return `export_${yyyymmddHHMMSS()}`;\n};\n\ntype ResultData = engineDataTransfer.ITransferResults<\n engineDataTransfer.ISourceProvider,\n engineDataTransfer.IDestinationProvider\n>['engine'];\n\nconst buildTransferTable = (resultData: ResultData) => {\n if (!resultData) {\n return;\n }\n\n // Build pretty table\n const table = new Table({\n head: ['Type', 'Count', 'Size'].map((text) => chalk.bold.blue(text)),\n });\n\n let totalBytes = 0;\n let totalItems = 0;\n (Object.keys(resultData) as engineDataTransfer.TransferStage[]).forEach((stage) => {\n const item = resultData[stage];\n\n if (!item) {\n return;\n }\n\n table.push([\n { hAlign: 'left', content: chalk.bold(stage) },\n { hAlign: 'right', content: item.count },\n { hAlign: 'right', content: `${readableBytes(item.bytes, 1, 11)} ` },\n ]);\n totalBytes += item.bytes;\n totalItems += item.count;\n\n if (item.aggregates) {\n (Object.keys(item.aggregates) as (keyof typeof item.aggregates)[])\n .sort()\n .forEach((subkey) => {\n if (!item.aggregates) {\n return;\n }\n\n const subitem = item.aggregates[subkey];\n\n table.push([\n { hAlign: 'left', content: `-- ${chalk.bold.grey(subkey)}` },\n { hAlign: 'right', content: chalk.grey(subitem.count) },\n { hAlign: 'right', content: chalk.grey(`(${readableBytes(subitem.bytes, 1, 11)})`) },\n ]);\n });\n }\n });\n table.push([\n { hAlign: 'left', content: chalk.bold.green('Total') },\n { hAlign: 'right', content: chalk.bold.green(totalItems) },\n { hAlign: 'right', content: `${chalk.bold.green(readableBytes(totalBytes, 1, 11))} ` },\n ]);\n\n return table;\n};\n\nconst DEFAULT_IGNORED_CONTENT_TYPES = [\n 'admin::permission',\n 'admin::user',\n 'admin::role',\n 'admin::api-token',\n 'admin::api-token-permission',\n 'admin::transfer-token',\n 'admin::transfer-token-permission',\n 'admin::audit-log',\n 'plugin::content-releases.release',\n 'plugin::content-releases.release-action',\n];\n\nconst abortTransfer = async ({\n engine,\n strapi,\n}: {\n engine: engineDataTransfer.TransferEngine;\n strapi: Core.Strapi;\n}) => {\n try {\n await engine.abortTransfer();\n await strapi.destroy();\n } catch (e) {\n // ignore because there's not much else we can do\n return false;\n }\n return true;\n};\n\nconst setSignalHandler = async (\n handler: (...args: unknown[]) => void,\n signals = ['SIGINT', 'SIGTERM', 'SIGQUIT']\n) => {\n signals.forEach((signal) => {\n // We specifically remove ALL listeners because we have to clear the one added in Strapi bootstrap that has a process.exit\n // TODO: Ideally Strapi bootstrap would not add that listener, and then this could be more flexible and add/remove only what it needs to\n process.removeAllListeners(signal);\n process.on(signal, handler);\n });\n};\n\nconst createStrapiInstance = async (opts: { logLevel?: string } = {}): Promise<Core.Strapi> => {\n try {\n const appContext = await compileStrapi();\n const app = createStrapi({ ...opts, ...appContext });\n\n app.log.level = opts.logLevel || 'error';\n return await app.load();\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ECONNREFUSED') {\n throw new Error('Process failed. Check the database connection with your Strapi project.');\n }\n\n throw error;\n }\n};\n\nconst transferDataTypes = Object.keys(engineDataTransfer.TransferGroupPresets);\n\nconst throttleOption = new Option(\n '--throttle <delay after each entity>',\n `Add a delay in milliseconds between each transferred entity`\n)\n .argParser(parseInteger)\n .hideHelp(); // This option is not publicly documented\n\nconst excludeOption = new Option(\n '--exclude <comma-separated data types>',\n `Exclude data using comma-separated types. Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"exclude\"'));\n\nconst onlyOption = new Option(\n '--only <command-separated data types>',\n `Include only these types of data (plus schemas). Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"only\"'));\n\nconst validateExcludeOnly = (command: Command) => {\n const { exclude, only } = command.opts();\n if (!only || !exclude) {\n return;\n }\n\n const choicesInBoth = only.filter((n: string) => {\n return exclude.indexOf(n) !== -1;\n });\n if (choicesInBoth.length > 0) {\n exitWith(\n 1,\n `Data types may not be used in both \"exclude\" and \"only\" in the same command. Found in both: ${choicesInBoth.join(\n ','\n )}`\n );\n }\n};\n\nconst errorColors = {\n fatal: chalk.red,\n error: chalk.red,\n silly: chalk.yellow,\n} as const;\n\nconst formatDiagnostic = (\n operation: string\n): Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0] => {\n // Create log file for all incoming diagnostics\n let logger: undefined | winston.Logger;\n const getLogger = () => {\n if (!logger) {\n logger = createLogger(\n configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, { level: 'info' })\n );\n }\n return logger;\n };\n\n // We don't want to write a log file until there is something to be logged\n\n return ({ details, kind }) => {\n try {\n if (kind === 'error') {\n const { message, severity = 'fatal' } = details;\n\n const colorizeError = errorColors[severity];\n const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);\n\n getLogger().error(errorMessage);\n }\n if (kind === 'info') {\n const { message, params } = details;\n\n const msg = `${message}\\n${params ? JSON.stringify(params, null, 2) : ''}`;\n\n getLogger().info(msg);\n }\n if (kind === 'warning') {\n const { origin, message } = details;\n\n getLogger().warn(`(${origin ?? 'transfer'}) ${message}`);\n }\n } catch (err) {\n getLogger().error(err);\n }\n };\n};\n\ntype Loaders = {\n [key in engineDataTransfer.TransferStage]: ora.Ora;\n};\n\ntype Data = {\n [key in engineDataTransfer.TransferStage]?: {\n startTime?: number;\n endTime?: number;\n bytes?: number;\n count?: number;\n };\n};\n\nconst loadersFactory = (defaultLoaders: Loaders = {} as Loaders) => {\n const loaders = defaultLoaders;\n const updateLoader = (stage: engineDataTransfer.TransferStage, data: Data) => {\n if (!(stage in loaders)) {\n createLoader(stage);\n }\n\n const stageData = data[stage];\n const elapsedTime = stageData?.startTime\n ? (stageData?.endTime || Date.now()) - stageData.startTime\n : 0;\n const size = `size: ${readableBytes(stageData?.bytes ?? 0)}`;\n const elapsed = `elapsed: ${elapsedTime} ms`;\n const speed =\n elapsedTime > 0 ? `(${readableBytes(((stageData?.bytes ?? 0) * 1000) / elapsedTime)}/s)` : '';\n\n loaders[stage].text = `${stage}: ${stageData?.count ?? 0} transfered (${size}) (${elapsed}) ${\n !stageData?.endTime ? speed : ''\n }`;\n\n return loaders[stage];\n };\n\n const createLoader = (stage: engineDataTransfer.TransferStage) => {\n Object.assign(loaders, { [stage]: ora() });\n return loaders[stage];\n };\n\n const getLoader = (stage: engineDataTransfer.TransferStage) => {\n return loaders[stage];\n };\n\n return {\n updateLoader,\n createLoader,\n getLoader,\n };\n};\n\n/**\n * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object\n */\nconst getTransferTelemetryPayload = (engine: engineDataTransfer.TransferEngine) => {\n return {\n eventProperties: {\n source: engine?.sourceProvider?.name,\n destination: engine?.destinationProvider?.name,\n },\n };\n};\n\n/**\n * Get a transfer engine schema diff handler that confirms with the user before bypassing a schema check\n */\nconst getDiffHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.SchemaDiffHandlerContext,\n next: (ctx: engineDataTransfer.SchemaDiffHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n let workflowsStatus;\n const source = 'Schema Integrity';\n\n Object.entries(context.diffs).forEach(([uid, diffs]) => {\n for (const diff of diffs) {\n const path = [uid].concat(diff.path).join('.');\n const endPath = diff.path[diff.path.length - 1];\n\n // Catch known features\n if (\n uid === 'plugin::review-workflows.workflow' ||\n uid === 'plugin::review-workflows.workflow-stage' ||\n endPath?.startsWith('strapi_stage') ||\n endPath?.startsWith('strapi_assignee')\n ) {\n workflowsStatus = diff.kind;\n }\n // handle generic cases\n else if (diff.kind === 'added') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} does not exist on source`), source);\n } else if (diff.kind === 'deleted') {\n engine.reportWarning(\n chalk.red(`${chalk.bold(path)} does not exist on destination`),\n source\n );\n } else if (diff.kind === 'modified') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} has a different data type`), source);\n }\n }\n });\n\n // output the known feature warnings\n if (workflowsStatus === 'added') {\n engine.reportWarning(chalk.red(`Review workflows feature does not exist on source`), source);\n } else if (workflowsStatus === 'deleted') {\n engine.reportWarning(\n chalk.red(`Review workflows feature does not exist on destination`),\n source\n );\n } else if (workflowsStatus === 'modified') {\n engine.panic(\n new TransferEngineInitializationError('Unresolved differences in schema [review workflows]')\n );\n }\n\n const confirmed = await confirmMessage(\n 'There are differences in schema between the source and destination, and the data listed above will be lost. Are you sure you want to continue?',\n {\n force,\n }\n );\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n if (confirmed) {\n context.ignoredDiffs = merge(context.diffs, context.ignoredDiffs);\n }\n\n return next(context);\n };\n};\n\nconst getAssetsBackupHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.ErrorHandlerContext,\n next: (ctx: engineDataTransfer.ErrorHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n console.warn(\n 'The backup for the assets could not be created inside the public directory. Ensure Strapi has write permissions on the public directory.'\n );\n const confirmed = await confirmMessage(\n 'Do you want to continue without backing up your public/uploads files?',\n {\n force,\n }\n );\n\n if (confirmed) {\n context.ignore = true;\n }\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n return next(context);\n };\n};\n\nconst shouldSkipStage = (\n opts: Partial<engineDataTransfer.ITransferEngineOptions>,\n dataKind: engineDataTransfer.TransferFilterPreset\n) => {\n if (opts.exclude?.includes(dataKind)) {\n return true;\n }\n if (opts.only) {\n return !opts.only.includes(dataKind);\n }\n\n return false;\n};\n\ntype RestoreConfig = NonNullable<\n strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore']\n>;\n\n// Based on exclude/only from options, create the restore object to match\nconst parseRestoreFromOptions = (opts: Partial<engineDataTransfer.ITransferEngineOptions>) => {\n const entitiesOptions: RestoreConfig['entities'] = {\n exclude: DEFAULT_IGNORED_CONTENT_TYPES,\n include: undefined,\n };\n\n // if content is not included, send an empty array for include\n if ((opts.only && !opts.only.includes('content')) || opts.exclude?.includes('content')) {\n entitiesOptions.include = [];\n }\n\n const restoreConfig: strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore'] =\n {\n entities: entitiesOptions,\n assets: !shouldSkipStage(opts, 'files'),\n configuration: {\n webhook: !shouldSkipStage(opts, 'config'),\n coreStore: !shouldSkipStage(opts, 'config'),\n },\n };\n\n return restoreConfig;\n};\n\nexport {\n loadersFactory,\n buildTransferTable,\n getDefaultExportName,\n getTransferTelemetryPayload,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n excludeOption,\n exitMessageText,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n formatDiagnostic,\n abortTransfer,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n shouldSkipStage,\n parseRestoreFromOptions,\n};\n"],"names":["engineDataTransfer","process","Table","engine","strapi"],"mappings":"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"}
1
+ {"version":3,"file":"data-transfer.mjs","sources":["../../../src/cli/utils/data-transfer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { Command, Option } from 'commander';\nimport { configs, createLogger, type winston, formats } from '@strapi/logger';\nimport { createStrapi, compileStrapi } from '@strapi/core';\nimport ora from 'ora';\nimport { merge } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport { readableBytes, exitWith } from './helpers';\nimport { getParseListWithChoices, parseInteger, confirmMessage } from './commander';\n\nconst {\n errors: { TransferEngineInitializationError },\n} = engineDataTransfer;\n\nconst exitMessageText = (process: string, error = false) => {\n const processCapitalized = process[0].toUpperCase() + process.slice(1);\n\n if (!error) {\n return chalk.bold(\n chalk.green(`${processCapitalized} process has been completed successfully!`)\n );\n }\n\n return chalk.bold(chalk.red(`${processCapitalized} process failed.`));\n};\n\nconst pad = (n: number) => {\n return (n < 10 ? '0' : '') + String(n);\n};\n\nconst yyyymmddHHMMSS = () => {\n const date = new Date();\n\n return (\n date.getFullYear() +\n pad(date.getMonth() + 1) +\n pad(date.getDate()) +\n pad(date.getHours()) +\n pad(date.getMinutes()) +\n pad(date.getSeconds())\n );\n};\n\nconst getDefaultExportName = () => {\n return `export_${yyyymmddHHMMSS()}`;\n};\n\ntype ResultData = engineDataTransfer.ITransferResults<\n engineDataTransfer.ISourceProvider,\n engineDataTransfer.IDestinationProvider\n>['engine'];\n\nconst buildTransferTable = (resultData: ResultData) => {\n if (!resultData) {\n return;\n }\n\n // Build pretty table\n const table = new Table({\n head: ['Type', 'Count', 'Size'].map((text) => chalk.bold.blue(text)),\n });\n\n let totalBytes = 0;\n let totalItems = 0;\n (Object.keys(resultData) as engineDataTransfer.TransferStage[]).forEach((stage) => {\n const item = resultData[stage];\n\n if (!item) {\n return;\n }\n\n table.push([\n { hAlign: 'left', content: chalk.bold(stage) },\n { hAlign: 'right', content: item.count },\n { hAlign: 'right', content: `${readableBytes(item.bytes, 1, 11)} ` },\n ]);\n totalBytes += item.bytes;\n totalItems += item.count;\n\n if (item.aggregates) {\n (Object.keys(item.aggregates) as (keyof typeof item.aggregates)[])\n .sort()\n .forEach((subkey) => {\n if (!item.aggregates) {\n return;\n }\n\n const subitem = item.aggregates[subkey];\n\n table.push([\n { hAlign: 'left', content: `-- ${chalk.bold.grey(subkey)}` },\n { hAlign: 'right', content: chalk.grey(subitem.count) },\n { hAlign: 'right', content: chalk.grey(`(${readableBytes(subitem.bytes, 1, 11)})`) },\n ]);\n });\n }\n });\n table.push([\n { hAlign: 'left', content: chalk.bold.green('Total') },\n { hAlign: 'right', content: chalk.bold.green(totalItems) },\n { hAlign: 'right', content: `${chalk.bold.green(readableBytes(totalBytes, 1, 11))} ` },\n ]);\n\n return table;\n};\n\nconst DEFAULT_IGNORED_CONTENT_TYPES = [\n 'admin::permission',\n 'admin::user',\n 'admin::role',\n 'admin::api-token',\n 'admin::api-token-permission',\n 'admin::transfer-token',\n 'admin::transfer-token-permission',\n 'admin::audit-log',\n 'plugin::content-releases.release',\n 'plugin::content-releases.release-action',\n];\n\nconst abortTransfer = async ({\n engine,\n strapi,\n}: {\n engine: engineDataTransfer.TransferEngine;\n strapi: Core.Strapi;\n}) => {\n try {\n await engine.abortTransfer();\n await strapi.destroy();\n } catch (e) {\n // ignore because there's not much else we can do\n return false;\n }\n return true;\n};\n\nconst setSignalHandler = async (\n handler: (...args: unknown[]) => void,\n signals = ['SIGINT', 'SIGTERM', 'SIGQUIT']\n) => {\n signals.forEach((signal) => {\n // We specifically remove ALL listeners because we have to clear the one added in Strapi bootstrap that has a process.exit\n // TODO: Ideally Strapi bootstrap would not add that listener, and then this could be more flexible and add/remove only what it needs to\n process.removeAllListeners(signal);\n process.on(signal, handler);\n });\n};\n\nconst createStrapiInstance = async (opts: { logLevel?: string } = {}): Promise<Core.Strapi> => {\n try {\n const appContext = await compileStrapi();\n const app = createStrapi({ ...opts, ...appContext });\n\n app.log.level = opts.logLevel || 'error';\n return await app.load();\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ECONNREFUSED') {\n throw new Error('Process failed. Check the database connection with your Strapi project.');\n }\n\n throw error;\n }\n};\n\nconst transferDataTypes = Object.keys(engineDataTransfer.TransferGroupPresets);\n\nconst throttleOption = new Option(\n '--throttle <delay after each entity>',\n `Add a delay in milliseconds between each transferred entity`\n)\n .argParser(parseInteger)\n .hideHelp(); // This option is not publicly documented\n\nconst excludeOption = new Option(\n '--exclude <comma-separated data types>',\n `Exclude data using comma-separated types. Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"exclude\"'));\n\nconst onlyOption = new Option(\n '--only <command-separated data types>',\n `Include only these types of data (plus schemas). Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"only\"'));\n\nconst validateExcludeOnly = (command: Command) => {\n const { exclude, only } = command.opts();\n if (!only || !exclude) {\n return;\n }\n\n const choicesInBoth = only.filter((n: string) => {\n return exclude.indexOf(n) !== -1;\n });\n if (choicesInBoth.length > 0) {\n exitWith(\n 1,\n `Data types may not be used in both \"exclude\" and \"only\" in the same command. Found in both: ${choicesInBoth.join(\n ','\n )}`\n );\n }\n};\n\nconst errorColors = {\n fatal: chalk.red,\n error: chalk.red,\n silly: chalk.yellow,\n} as const;\n\nconst formatDiagnostic = (\n operation: string,\n info?: boolean\n): Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0] => {\n // Create log file for all incoming diagnostics\n let logger: undefined | winston.Logger;\n const getLogger = () => {\n if (!logger) {\n logger = createLogger(\n configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, {\n level: 'info',\n format: formats?.detailedLogs,\n })\n );\n }\n return logger;\n };\n\n // We don't want to write a log file until there is something to be logged\n\n return ({ details, kind }) => {\n try {\n if (kind === 'error') {\n const { message, severity = 'fatal' } = details;\n\n const colorizeError = errorColors[severity];\n const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);\n\n getLogger().error(errorMessage);\n }\n if (kind === 'info' && info) {\n const { message, params, source } = details;\n\n const msg = `[${source}] ${message}\\n${params ? JSON.stringify(params, null, 2) : ''}`;\n\n getLogger().info(msg);\n }\n if (kind === 'warning') {\n const { origin, message } = details;\n\n getLogger().warn(`(${origin ?? 'transfer'}) ${message}`);\n }\n } catch (err) {\n getLogger().error(err);\n }\n };\n};\n\ntype Loaders = {\n [key in engineDataTransfer.TransferStage]: ora.Ora;\n};\n\ntype Data = {\n [key in engineDataTransfer.TransferStage]?: {\n startTime?: number;\n endTime?: number;\n bytes?: number;\n count?: number;\n };\n};\n\nconst loadersFactory = (defaultLoaders: Loaders = {} as Loaders) => {\n const loaders = defaultLoaders;\n const updateLoader = (stage: engineDataTransfer.TransferStage, data: Data) => {\n if (!(stage in loaders)) {\n createLoader(stage);\n }\n\n const stageData = data[stage];\n const elapsedTime = stageData?.startTime\n ? (stageData?.endTime || Date.now()) - stageData.startTime\n : 0;\n const size = `size: ${readableBytes(stageData?.bytes ?? 0)}`;\n const elapsed = `elapsed: ${elapsedTime} ms`;\n const speed =\n elapsedTime > 0 ? `(${readableBytes(((stageData?.bytes ?? 0) * 1000) / elapsedTime)}/s)` : '';\n\n loaders[stage].text = `${stage}: ${stageData?.count ?? 0} transfered (${size}) (${elapsed}) ${\n !stageData?.endTime ? speed : ''\n }`;\n\n return loaders[stage];\n };\n\n const createLoader = (stage: engineDataTransfer.TransferStage) => {\n Object.assign(loaders, { [stage]: ora() });\n return loaders[stage];\n };\n\n const getLoader = (stage: engineDataTransfer.TransferStage) => {\n return loaders[stage];\n };\n\n return {\n updateLoader,\n createLoader,\n getLoader,\n };\n};\n\n/**\n * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object\n */\nconst getTransferTelemetryPayload = (engine: engineDataTransfer.TransferEngine) => {\n return {\n eventProperties: {\n source: engine?.sourceProvider?.name,\n destination: engine?.destinationProvider?.name,\n },\n };\n};\n\n/**\n * Get a transfer engine schema diff handler that confirms with the user before bypassing a schema check\n */\nconst getDiffHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.SchemaDiffHandlerContext,\n next: (ctx: engineDataTransfer.SchemaDiffHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n let workflowsStatus;\n const source = 'Schema Integrity';\n\n Object.entries(context.diffs).forEach(([uid, diffs]) => {\n for (const diff of diffs) {\n const path = [uid].concat(diff.path).join('.');\n const endPath = diff.path[diff.path.length - 1];\n\n // Catch known features\n if (\n uid === 'plugin::review-workflows.workflow' ||\n uid === 'plugin::review-workflows.workflow-stage' ||\n endPath?.startsWith('strapi_stage') ||\n endPath?.startsWith('strapi_assignee')\n ) {\n workflowsStatus = diff.kind;\n }\n // handle generic cases\n else if (diff.kind === 'added') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} does not exist on source`), source);\n } else if (diff.kind === 'deleted') {\n engine.reportWarning(\n chalk.red(`${chalk.bold(path)} does not exist on destination`),\n source\n );\n } else if (diff.kind === 'modified') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} has a different data type`), source);\n }\n }\n });\n\n // output the known feature warnings\n if (workflowsStatus === 'added') {\n engine.reportWarning(chalk.red(`Review workflows feature does not exist on source`), source);\n } else if (workflowsStatus === 'deleted') {\n engine.reportWarning(\n chalk.red(`Review workflows feature does not exist on destination`),\n source\n );\n } else if (workflowsStatus === 'modified') {\n engine.panic(\n new TransferEngineInitializationError('Unresolved differences in schema [review workflows]')\n );\n }\n\n const confirmed = await confirmMessage(\n 'There are differences in schema between the source and destination, and the data listed above will be lost. Are you sure you want to continue?',\n {\n force,\n }\n );\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n if (confirmed) {\n context.ignoredDiffs = merge(context.diffs, context.ignoredDiffs);\n }\n\n return next(context);\n };\n};\n\nconst getAssetsBackupHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.ErrorHandlerContext,\n next: (ctx: engineDataTransfer.ErrorHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n console.warn(\n 'The backup for the assets could not be created inside the public directory. Ensure Strapi has write permissions on the public directory.'\n );\n const confirmed = await confirmMessage(\n 'Do you want to continue without backing up your public/uploads files?',\n {\n force,\n }\n );\n\n if (confirmed) {\n context.ignore = true;\n }\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n return next(context);\n };\n};\n\nconst shouldSkipStage = (\n opts: Partial<engineDataTransfer.ITransferEngineOptions>,\n dataKind: engineDataTransfer.TransferFilterPreset\n) => {\n if (opts.exclude?.includes(dataKind)) {\n return true;\n }\n if (opts.only) {\n return !opts.only.includes(dataKind);\n }\n\n return false;\n};\n\ntype RestoreConfig = NonNullable<\n strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore']\n>;\n\n// Based on exclude/only from options, create the restore object to match\nconst parseRestoreFromOptions = (opts: Partial<engineDataTransfer.ITransferEngineOptions>) => {\n const entitiesOptions: RestoreConfig['entities'] = {\n exclude: DEFAULT_IGNORED_CONTENT_TYPES,\n include: undefined,\n };\n\n // if content is not included, send an empty array for include\n if ((opts.only && !opts.only.includes('content')) || opts.exclude?.includes('content')) {\n entitiesOptions.include = [];\n }\n\n const restoreConfig: strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore'] =\n {\n entities: entitiesOptions,\n assets: !shouldSkipStage(opts, 'files'),\n configuration: {\n webhook: !shouldSkipStage(opts, 'config'),\n coreStore: !shouldSkipStage(opts, 'config'),\n },\n };\n\n return restoreConfig;\n};\n\nexport {\n loadersFactory,\n buildTransferTable,\n getDefaultExportName,\n getTransferTelemetryPayload,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n excludeOption,\n exitMessageText,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n formatDiagnostic,\n abortTransfer,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n shouldSkipStage,\n parseRestoreFromOptions,\n};\n"],"names":["engineDataTransfer","process","Table","engine","strapi"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/strapi",
3
- "version": "5.4.0",
3
+ "version": "5.4.2",
4
4
  "description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite",
5
5
  "keywords": [
6
6
  "strapi",
@@ -109,25 +109,25 @@
109
109
  },
110
110
  "dependencies": {
111
111
  "@pmmmwh/react-refresh-webpack-plugin": "0.5.15",
112
- "@strapi/admin": "5.4.0",
113
- "@strapi/cloud-cli": "5.4.0",
114
- "@strapi/content-manager": "5.4.0",
115
- "@strapi/content-releases": "5.4.0",
116
- "@strapi/content-type-builder": "5.4.0",
117
- "@strapi/core": "5.4.0",
118
- "@strapi/data-transfer": "5.4.0",
119
- "@strapi/database": "5.4.0",
120
- "@strapi/email": "5.4.0",
121
- "@strapi/generators": "5.4.0",
122
- "@strapi/i18n": "5.4.0",
123
- "@strapi/logger": "5.4.0",
112
+ "@strapi/admin": "5.4.2",
113
+ "@strapi/cloud-cli": "5.4.2",
114
+ "@strapi/content-manager": "5.4.2",
115
+ "@strapi/content-releases": "5.4.2",
116
+ "@strapi/content-type-builder": "5.4.2",
117
+ "@strapi/core": "5.4.2",
118
+ "@strapi/data-transfer": "5.4.2",
119
+ "@strapi/database": "5.4.2",
120
+ "@strapi/email": "5.4.2",
121
+ "@strapi/generators": "5.4.2",
122
+ "@strapi/i18n": "5.4.2",
123
+ "@strapi/logger": "5.4.2",
124
124
  "@strapi/pack-up": "5.0.0",
125
- "@strapi/permissions": "5.4.0",
126
- "@strapi/review-workflows": "5.4.0",
127
- "@strapi/types": "5.4.0",
128
- "@strapi/typescript-utils": "5.4.0",
129
- "@strapi/upload": "5.4.0",
130
- "@strapi/utils": "5.4.0",
125
+ "@strapi/permissions": "5.4.2",
126
+ "@strapi/review-workflows": "5.4.2",
127
+ "@strapi/types": "5.4.2",
128
+ "@strapi/typescript-utils": "5.4.2",
129
+ "@strapi/upload": "5.4.2",
130
+ "@strapi/utils": "5.4.2",
131
131
  "@types/nodemon": "1.19.6",
132
132
  "@vitejs/plugin-react-swc": "3.6.0",
133
133
  "boxen": "5.1.2",
@@ -182,11 +182,11 @@
182
182
  "@types/node": "18.19.24",
183
183
  "@types/webpack-bundle-analyzer": "4.7.0",
184
184
  "@types/webpack-hot-middleware": "2.25.9",
185
- "eslint-config-custom": "5.4.0",
185
+ "eslint-config-custom": "5.4.2",
186
186
  "jest": "29.6.0",
187
187
  "react": "18.3.1",
188
188
  "react-dom": "18.3.1",
189
- "tsconfig": "5.4.0"
189
+ "tsconfig": "5.4.2"
190
190
  },
191
191
  "peerDependencies": {
192
192
  "react": "^17.0.0 || ^18.0.0",
@@ -198,5 +198,5 @@
198
198
  "node": ">=18.0.0 <=22.x.x",
199
199
  "npm": ">=6.0.0"
200
200
  },
201
- "gitHead": "186981dd710bedbe48a84bd819f95f9764da61e1"
201
+ "gitHead": "6b5242714b3612e0bd49ddc4f14205d6505eb5b9"
202
202
  }