@strapi/strapi 5.42.1 → 5.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/admin/active-user.d.ts +15 -0
- package/dist/cli/commands/admin/active-user.d.ts.map +1 -0
- package/dist/cli/commands/admin/block-user.d.ts +15 -0
- package/dist/cli/commands/admin/block-user.d.ts.map +1 -0
- package/dist/cli/commands/admin/delete-user.d.ts +14 -0
- package/dist/cli/commands/admin/delete-user.d.ts.map +1 -0
- package/dist/cli/commands/admin/list-users.d.ts +11 -0
- package/dist/cli/commands/admin/list-users.d.ts.map +1 -0
- package/dist/cli/commands/export/action.d.ts.map +1 -1
- package/dist/cli/commands/import/action.d.ts.map +1 -1
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/transfer/action.d.ts +1 -0
- package/dist/cli/commands/transfer/action.d.ts.map +1 -1
- package/dist/cli/commands/transfer/command.d.ts.map +1 -1
- package/dist/cli/utils/data-transfer.d.ts +6 -4
- package/dist/cli/utils/data-transfer.d.ts.map +1 -1
- package/dist/cli/utils/helpers.d.ts +15 -1
- package/dist/cli/utils/helpers.d.ts.map +1 -1
- package/dist/node/build.d.ts.map +1 -1
- package/dist/node/develop.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/admin/active-user.js +73 -0
- package/dist/src/cli/commands/admin/active-user.js.map +1 -0
- package/dist/src/cli/commands/admin/active-user.mjs +70 -0
- package/dist/src/cli/commands/admin/active-user.mjs.map +1 -0
- package/dist/src/cli/commands/admin/block-user.js +73 -0
- package/dist/src/cli/commands/admin/block-user.js.map +1 -0
- package/dist/src/cli/commands/admin/block-user.mjs +70 -0
- package/dist/src/cli/commands/admin/block-user.mjs.map +1 -0
- package/dist/src/cli/commands/admin/delete-user.js +88 -0
- package/dist/src/cli/commands/admin/delete-user.js.map +1 -0
- package/dist/src/cli/commands/admin/delete-user.mjs +85 -0
- package/dist/src/cli/commands/admin/delete-user.mjs.map +1 -0
- package/dist/src/cli/commands/admin/list-users.js +62 -0
- package/dist/src/cli/commands/admin/list-users.js.map +1 -0
- package/dist/src/cli/commands/admin/list-users.mjs +59 -0
- package/dist/src/cli/commands/admin/list-users.mjs.map +1 -0
- package/dist/src/cli/commands/export/action.js +2 -2
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +3 -3
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js +3 -3
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +4 -4
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/index.js +8 -0
- package/dist/src/cli/commands/index.js.map +1 -1
- package/dist/src/cli/commands/index.mjs +34 -26
- package/dist/src/cli/commands/index.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/action.js +105 -6
- package/dist/src/cli/commands/transfer/action.js.map +1 -1
- package/dist/src/cli/commands/transfer/action.mjs +107 -8
- package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/command.js +1 -1
- package/dist/src/cli/commands/transfer/command.js.map +1 -1
- package/dist/src/cli/commands/transfer/command.mjs +1 -1
- package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js +69 -21
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs +70 -22
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/cli/utils/helpers.js +36 -1
- package/dist/src/cli/utils/helpers.js.map +1 -1
- package/dist/src/cli/utils/helpers.mjs +34 -2
- package/dist/src/cli/utils/helpers.mjs.map +1 -1
- package/dist/src/node/build.js +10 -5
- package/dist/src/node/build.js.map +1 -1
- package/dist/src/node/build.mjs +10 -5
- package/dist/src/node/build.mjs.map +1 -1
- package/dist/src/node/develop.js +194 -148
- package/dist/src/node/develop.js.map +1 -1
- package/dist/src/node/develop.mjs +194 -148
- package/dist/src/node/develop.mjs.map +1 -1
- package/dist/src/node/webpack/config.js +2 -2
- package/dist/src/node/webpack/config.js.map +1 -1
- package/dist/src/node/webpack/config.mjs +2 -2
- package/dist/src/node/webpack/config.mjs.map +1 -1
- package/package.json +22 -22
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
|
+
var path = require('node:path');
|
|
4
5
|
var CLITable = require('cli-table3');
|
|
5
6
|
var commander = require('commander');
|
|
6
7
|
var logger = require('@strapi/logger');
|
|
@@ -103,18 +104,14 @@ const buildTransferTable = (resultData)=>{
|
|
|
103
104
|
]);
|
|
104
105
|
return table;
|
|
105
106
|
};
|
|
106
|
-
const
|
|
107
|
-
'admin::
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
'admin::api-token',
|
|
111
|
-
'admin::api-token-permission',
|
|
112
|
-
'admin::transfer-token',
|
|
113
|
-
'admin::transfer-token-permission',
|
|
114
|
-
'admin::audit-log',
|
|
107
|
+
const IGNORED_CONTENT_TYPE_PREFIXES = [
|
|
108
|
+
'admin::'
|
|
109
|
+
];
|
|
110
|
+
const IGNORED_CONTENT_TYPES = [
|
|
115
111
|
'plugin::content-releases.release',
|
|
116
112
|
'plugin::content-releases.release-action'
|
|
117
113
|
];
|
|
114
|
+
const isIgnoredContentType = (type)=>IGNORED_CONTENT_TYPE_PREFIXES.some((prefix)=>type.startsWith(prefix)) || IGNORED_CONTENT_TYPES.includes(type);
|
|
118
115
|
const abortTransfer = async ({ engine, strapi: strapi1 })=>{
|
|
119
116
|
try {
|
|
120
117
|
await engine.abortTransfer();
|
|
@@ -174,19 +171,23 @@ const errorColors = {
|
|
|
174
171
|
error: chalk.red,
|
|
175
172
|
silly: chalk.yellow
|
|
176
173
|
};
|
|
177
|
-
const formatDiagnostic = (operation,
|
|
178
|
-
// Create log file for all incoming diagnostics
|
|
174
|
+
const formatDiagnostic = (operation, verbose)=>{
|
|
179
175
|
let logger$1;
|
|
176
|
+
let logFileBasename;
|
|
180
177
|
const getLogger = ()=>{
|
|
181
178
|
if (!logger$1) {
|
|
182
|
-
|
|
179
|
+
logFileBasename = `${operation}_${Date.now()}.log`;
|
|
180
|
+
const absoluteLogPath = path.resolve(process.cwd(), logFileBasename);
|
|
181
|
+
logger$1 = logger.createLogger(logger.configs.createOutputFileConfiguration(logFileBasename, {
|
|
183
182
|
level: 'info',
|
|
184
183
|
format: logger.formats?.detailedLogs
|
|
184
|
+
}, {
|
|
185
|
+
consoleLevel: verbose ? 'info' : 'warn'
|
|
185
186
|
}));
|
|
187
|
+
logger$1.info(`[${operation}] Diagnostic log file: ${absoluteLogPath} (info-level messages are written here even without --verbose)`);
|
|
186
188
|
}
|
|
187
189
|
return logger$1;
|
|
188
190
|
};
|
|
189
|
-
// We don't want to write a log file until there is something to be logged
|
|
190
191
|
return ({ details, kind })=>{
|
|
191
192
|
try {
|
|
192
193
|
if (kind === 'error') {
|
|
@@ -195,7 +196,7 @@ const formatDiagnostic = (operation, info)=>{
|
|
|
195
196
|
const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);
|
|
196
197
|
getLogger().error(errorMessage);
|
|
197
198
|
}
|
|
198
|
-
if (kind === 'info'
|
|
199
|
+
if (kind === 'info') {
|
|
199
200
|
const { message, params, origin } = details;
|
|
200
201
|
const msg = `[${origin ?? 'transfer'}] ${message}\n${params ? JSON.stringify(params, null, 2) : ''}`;
|
|
201
202
|
getLogger().info(msg);
|
|
@@ -209,6 +210,26 @@ const formatDiagnostic = (operation, info)=>{
|
|
|
209
210
|
}
|
|
210
211
|
};
|
|
211
212
|
};
|
|
213
|
+
/** Stages where throughput is dominated by DB work; items/s is more meaningful than JSON byte rate. */ const STAGES_WITH_ITEM_THROUGHPUT = new Set([
|
|
214
|
+
'entities',
|
|
215
|
+
'links'
|
|
216
|
+
]);
|
|
217
|
+
const MAX_ETA_MS = 86400000;
|
|
218
|
+
/**
|
|
219
|
+
* Linear ETA from completed amount vs total, using average rate so far (done / elapsedMs).
|
|
220
|
+
* Returns null when progress or totals are not usable yet.
|
|
221
|
+
*/ const estimateEtaMs = (elapsedMs, done, total)=>{
|
|
222
|
+
if (elapsedMs < 500 || done <= 0 || total <= 0 || done >= total) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const ratePerMs = done / elapsedMs;
|
|
226
|
+
const remaining = total - done;
|
|
227
|
+
const etaMs = remaining / ratePerMs;
|
|
228
|
+
if (!Number.isFinite(etaMs) || etaMs <= 0 || etaMs >= MAX_ETA_MS) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return etaMs;
|
|
232
|
+
};
|
|
212
233
|
const loadersFactory = (defaultLoaders = {})=>{
|
|
213
234
|
const loaders = defaultLoaders;
|
|
214
235
|
const updateLoader = (stage, data)=>{
|
|
@@ -217,10 +238,34 @@ const loadersFactory = (defaultLoaders = {})=>{
|
|
|
217
238
|
}
|
|
218
239
|
const stageData = data[stage];
|
|
219
240
|
const elapsedTime = stageData?.startTime ? (stageData?.endTime || Date.now()) - stageData.startTime : 0;
|
|
220
|
-
const
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
|
|
241
|
+
const bytes = stageData?.bytes ?? 0;
|
|
242
|
+
const count = stageData?.count ?? 0;
|
|
243
|
+
const totalBytes = stageData?.totalBytes;
|
|
244
|
+
const totalCount = stageData?.totalCount;
|
|
245
|
+
const countLabel = totalCount != null && totalCount > 0 ? `${count} / ${totalCount}` : String(count);
|
|
246
|
+
const sizeCompact = totalBytes != null && totalBytes > 0 ? `${helpers.readableBytes(bytes)} / ${helpers.readableBytes(totalBytes)}` : helpers.readableBytes(bytes);
|
|
247
|
+
const parts = [
|
|
248
|
+
`${stage}: ${countLabel} transferred`,
|
|
249
|
+
sizeCompact
|
|
250
|
+
];
|
|
251
|
+
if (elapsedTime > 0 && !stageData?.endTime) {
|
|
252
|
+
if (STAGES_WITH_ITEM_THROUGHPUT.has(stage)) {
|
|
253
|
+
const itemsPerSec = count * 1000 / elapsedTime;
|
|
254
|
+
parts.push(`${itemsPerSec.toFixed(1)} items/s`);
|
|
255
|
+
} else {
|
|
256
|
+
parts.push(`${helpers.readableBytes(bytes * 1000 / elapsedTime)}/s`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
let etaMs = null;
|
|
260
|
+
if (!stageData?.endTime) {
|
|
261
|
+
if (STAGES_WITH_ITEM_THROUGHPUT.has(stage) && totalCount != null) {
|
|
262
|
+
etaMs = estimateEtaMs(elapsedTime, count, totalCount);
|
|
263
|
+
} else if (totalBytes != null) {
|
|
264
|
+
etaMs = estimateEtaMs(elapsedTime, bytes, totalBytes);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
parts.push(helpers.formatElapsedAndMaybeRemainingLabel(elapsedTime ?? 0, etaMs));
|
|
268
|
+
loaders[stage].text = parts.join(helpers.TRANSFER_PROGRESS_FIELD_SEP);
|
|
224
269
|
return loaders[stage];
|
|
225
270
|
};
|
|
226
271
|
const createLoader = (stage)=>{
|
|
@@ -337,9 +382,12 @@ const shouldSkipStage = (opts, dataKind)=>{
|
|
|
337
382
|
return false;
|
|
338
383
|
};
|
|
339
384
|
// Based on exclude/only from options, create the restore object to match
|
|
340
|
-
const parseRestoreFromOptions = (opts)=>{
|
|
385
|
+
const parseRestoreFromOptions = (opts, strapi1)=>{
|
|
341
386
|
const entitiesOptions = {
|
|
342
|
-
exclude:
|
|
387
|
+
exclude: [
|
|
388
|
+
...Object.keys(strapi1.contentTypes).filter(isIgnoredContentType),
|
|
389
|
+
...IGNORED_CONTENT_TYPES
|
|
390
|
+
],
|
|
343
391
|
include: undefined
|
|
344
392
|
};
|
|
345
393
|
// if content is not included, send an empty array for include
|
|
@@ -357,7 +405,6 @@ const parseRestoreFromOptions = (opts)=>{
|
|
|
357
405
|
return restoreConfig;
|
|
358
406
|
};
|
|
359
407
|
|
|
360
|
-
exports.DEFAULT_IGNORED_CONTENT_TYPES = DEFAULT_IGNORED_CONTENT_TYPES;
|
|
361
408
|
exports.abortTransfer = abortTransfer;
|
|
362
409
|
exports.buildTransferTable = buildTransferTable;
|
|
363
410
|
exports.createStrapiInstance = createStrapiInstance;
|
|
@@ -368,6 +415,7 @@ exports.getAssetsBackupHandler = getAssetsBackupHandler;
|
|
|
368
415
|
exports.getDefaultExportName = getDefaultExportName;
|
|
369
416
|
exports.getDiffHandler = getDiffHandler;
|
|
370
417
|
exports.getTransferTelemetryPayload = getTransferTelemetryPayload;
|
|
418
|
+
exports.isIgnoredContentType = isIgnoredContentType;
|
|
371
419
|
exports.loadersFactory = loadersFactory;
|
|
372
420
|
exports.onlyOption = onlyOption;
|
|
373
421
|
exports.parseRestoreFromOptions = parseRestoreFromOptions;
|
|
@@ -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, 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, origin } = details;\n\n const msg = `[${origin ?? 'transfer'}] ${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} transferred (${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":["errors","TransferEngineInitializationError","engineDataTransfer","exitMessageText","process","error","processCapitalized","toUpperCase","slice","chalk","bold","green","red","pad","n","String","yyyymmddHHMMSS","date","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getDefaultExportName","buildTransferTable","resultData","table","Table","head","map","text","blue","totalBytes","totalItems","Object","keys","forEach","stage","item","push","hAlign","content","count","readableBytes","bytes","aggregates","sort","subkey","subitem","grey","DEFAULT_IGNORED_CONTENT_TYPES","abortTransfer","engine","strapi","destroy","e","setSignalHandler","handler","signals","signal","removeAllListeners","on","createStrapiInstance","opts","appContext","compileStrapi","app","createStrapi","log","level","logLevel","load","Error","code","transferDataTypes","TransferGroupPresets","throttleOption","Option","argParser","parseInteger","hideHelp","excludeOption","join","getParseListWithChoices","onlyOption","validateExcludeOnly","command","exclude","only","choicesInBoth","filter","indexOf","length","exitWith","errorColors","fatal","silly","yellow","formatDiagnostic","operation","info","logger","getLogger","createLogger","configs","createOutputFileConfiguration","now","format","formats","detailedLogs","details","kind","message","severity","colorizeError","errorMessage","params","origin","msg","JSON","stringify","warn","err","loadersFactory","defaultLoaders","loaders","updateLoader","data","createLoader","stageData","elapsedTime","startTime","endTime","size","elapsed","speed","assign","ora","getLoader","getTransferTelemetryPayload","eventProperties","source","sourceProvider","name","destination","destinationProvider","getDiffHandler","force","action","context","next","workflowsStatus","entries","diffs","uid","diff","path","concat","endPath","startsWith","reportWarning","panic","confirmed","confirmMessage","ignoredDiffs","merge","getAssetsBackupHandler","console","ignore","shouldSkipStage","dataKind","includes","parseRestoreFromOptions","entitiesOptions","include","undefined","restoreConfig","entities","assets","configuration","webhook","coreStore"],"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 path from 'node:path';\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 {\n readableBytes,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n exitWith,\n} 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 IGNORED_CONTENT_TYPE_PREFIXES = ['admin::'];\n\nconst IGNORED_CONTENT_TYPES = [\n 'plugin::content-releases.release',\n 'plugin::content-releases.release-action',\n];\n\nconst isIgnoredContentType = (type: string) =>\n IGNORED_CONTENT_TYPE_PREFIXES.some((prefix) => type.startsWith(prefix)) ||\n IGNORED_CONTENT_TYPES.includes(type);\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 verbose?: boolean\n): Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0] => {\n let logger: undefined | winston.Logger;\n let logFileBasename: string | undefined;\n\n const getLogger = () => {\n if (!logger) {\n logFileBasename = `${operation}_${Date.now()}.log`;\n const absoluteLogPath = path.resolve(process.cwd(), logFileBasename);\n\n logger = createLogger(\n configs.createOutputFileConfiguration(\n logFileBasename,\n {\n level: 'info',\n format: formats?.detailedLogs,\n },\n {\n consoleLevel: verbose ? 'info' : 'warn',\n }\n )\n );\n\n logger.info(\n `[${operation}] Diagnostic log file: ${absoluteLogPath} (info-level messages are written here even without --verbose)`\n );\n }\n return logger;\n };\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, origin } = details;\n\n const msg = `[${origin ?? 'transfer'}] ${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 totalBytes?: number;\n totalCount?: number;\n };\n};\n\n/** Stages where throughput is dominated by DB work; items/s is more meaningful than JSON byte rate. */\nconst STAGES_WITH_ITEM_THROUGHPUT = new Set<engineDataTransfer.TransferStage>([\n 'entities',\n 'links',\n]);\n\nconst MAX_ETA_MS = 86_400_000;\n\n/**\n * Linear ETA from completed amount vs total, using average rate so far (done / elapsedMs).\n * Returns null when progress or totals are not usable yet.\n */\nconst estimateEtaMs = (elapsedMs: number, done: number, total: number): number | null => {\n if (elapsedMs < 500 || done <= 0 || total <= 0 || done >= total) {\n return null;\n }\n const ratePerMs = done / elapsedMs;\n const remaining = total - done;\n const etaMs = remaining / ratePerMs;\n if (!Number.isFinite(etaMs) || etaMs <= 0 || etaMs >= MAX_ETA_MS) {\n return null;\n }\n return etaMs;\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 bytes = stageData?.bytes ?? 0;\n const count = stageData?.count ?? 0;\n const totalBytes = stageData?.totalBytes;\n const totalCount = stageData?.totalCount;\n\n const countLabel =\n totalCount != null && totalCount > 0 ? `${count} / ${totalCount}` : String(count);\n const sizeCompact =\n totalBytes != null && totalBytes > 0\n ? `${readableBytes(bytes)} / ${readableBytes(totalBytes)}`\n : readableBytes(bytes);\n\n const parts: string[] = [`${stage}: ${countLabel} transferred`, sizeCompact];\n\n if (elapsedTime > 0 && !stageData?.endTime) {\n if (STAGES_WITH_ITEM_THROUGHPUT.has(stage)) {\n const itemsPerSec = (count * 1000) / elapsedTime;\n parts.push(`${itemsPerSec.toFixed(1)} items/s`);\n } else {\n parts.push(`${readableBytes((bytes * 1000) / elapsedTime)}/s`);\n }\n }\n\n let etaMs: number | null = null;\n if (!stageData?.endTime) {\n if (STAGES_WITH_ITEM_THROUGHPUT.has(stage) && totalCount != null) {\n etaMs = estimateEtaMs(elapsedTime, count, totalCount);\n } else if (totalBytes != null) {\n etaMs = estimateEtaMs(elapsedTime, bytes, totalBytes);\n }\n }\n parts.push(formatElapsedAndMaybeRemainingLabel(elapsedTime ?? 0, etaMs));\n\n loaders[stage].text = parts.join(TRANSFER_PROGRESS_FIELD_SEP);\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 = (\n opts: Partial<engineDataTransfer.ITransferEngineOptions>,\n strapi: Core.Strapi\n) => {\n const entitiesOptions: RestoreConfig['entities'] = {\n exclude: [\n ...Object.keys(strapi.contentTypes).filter(isIgnoredContentType),\n ...IGNORED_CONTENT_TYPES,\n ],\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 isIgnoredContentType,\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":["errors","TransferEngineInitializationError","engineDataTransfer","exitMessageText","process","error","processCapitalized","toUpperCase","slice","chalk","bold","green","red","pad","n","String","yyyymmddHHMMSS","date","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getDefaultExportName","buildTransferTable","resultData","table","Table","head","map","text","blue","totalBytes","totalItems","Object","keys","forEach","stage","item","push","hAlign","content","count","readableBytes","bytes","aggregates","sort","subkey","subitem","grey","IGNORED_CONTENT_TYPE_PREFIXES","IGNORED_CONTENT_TYPES","isIgnoredContentType","type","some","prefix","startsWith","includes","abortTransfer","engine","strapi","destroy","e","setSignalHandler","handler","signals","signal","removeAllListeners","on","createStrapiInstance","opts","appContext","compileStrapi","app","createStrapi","log","level","logLevel","load","Error","code","transferDataTypes","TransferGroupPresets","throttleOption","Option","argParser","parseInteger","hideHelp","excludeOption","join","getParseListWithChoices","onlyOption","validateExcludeOnly","command","exclude","only","choicesInBoth","filter","indexOf","length","exitWith","errorColors","fatal","silly","yellow","formatDiagnostic","operation","verbose","logger","logFileBasename","getLogger","now","absoluteLogPath","path","resolve","cwd","createLogger","configs","createOutputFileConfiguration","format","formats","detailedLogs","consoleLevel","info","details","kind","message","severity","colorizeError","errorMessage","params","origin","msg","JSON","stringify","warn","err","STAGES_WITH_ITEM_THROUGHPUT","Set","MAX_ETA_MS","estimateEtaMs","elapsedMs","done","total","ratePerMs","remaining","etaMs","Number","isFinite","loadersFactory","defaultLoaders","loaders","updateLoader","data","createLoader","stageData","elapsedTime","startTime","endTime","totalCount","countLabel","sizeCompact","parts","has","itemsPerSec","toFixed","formatElapsedAndMaybeRemainingLabel","TRANSFER_PROGRESS_FIELD_SEP","assign","ora","getLoader","getTransferTelemetryPayload","eventProperties","source","sourceProvider","name","destination","destinationProvider","getDiffHandler","force","action","context","next","workflowsStatus","entries","diffs","uid","diff","concat","endPath","reportWarning","panic","confirmed","confirmMessage","ignoredDiffs","merge","getAssetsBackupHandler","console","ignore","shouldSkipStage","dataKind","parseRestoreFromOptions","entitiesOptions","contentTypes","include","undefined","restoreConfig","entities","assets","configuration","webhook","coreStore"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
import CLITable from 'cli-table3';
|
|
3
4
|
import { Option } from 'commander';
|
|
4
5
|
import { createLogger, configs, formats } from '@strapi/logger';
|
|
@@ -6,7 +7,7 @@ import { compileStrapi, createStrapi } from '@strapi/core';
|
|
|
6
7
|
import ora from 'ora';
|
|
7
8
|
import { merge } from 'lodash/fp';
|
|
8
9
|
import { engine } from '@strapi/data-transfer';
|
|
9
|
-
import { exitWith, readableBytes } from './helpers.mjs';
|
|
10
|
+
import { exitWith, readableBytes, formatElapsedAndMaybeRemainingLabel, TRANSFER_PROGRESS_FIELD_SEP } from './helpers.mjs';
|
|
10
11
|
import { parseInteger, getParseListWithChoices, confirmMessage } from './commander.mjs';
|
|
11
12
|
|
|
12
13
|
const { errors: { TransferEngineInitializationError } } = engine;
|
|
@@ -101,18 +102,14 @@ const buildTransferTable = (resultData)=>{
|
|
|
101
102
|
]);
|
|
102
103
|
return table;
|
|
103
104
|
};
|
|
104
|
-
const
|
|
105
|
-
'admin::
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
'admin::api-token',
|
|
109
|
-
'admin::api-token-permission',
|
|
110
|
-
'admin::transfer-token',
|
|
111
|
-
'admin::transfer-token-permission',
|
|
112
|
-
'admin::audit-log',
|
|
105
|
+
const IGNORED_CONTENT_TYPE_PREFIXES = [
|
|
106
|
+
'admin::'
|
|
107
|
+
];
|
|
108
|
+
const IGNORED_CONTENT_TYPES = [
|
|
113
109
|
'plugin::content-releases.release',
|
|
114
110
|
'plugin::content-releases.release-action'
|
|
115
111
|
];
|
|
112
|
+
const isIgnoredContentType = (type)=>IGNORED_CONTENT_TYPE_PREFIXES.some((prefix)=>type.startsWith(prefix)) || IGNORED_CONTENT_TYPES.includes(type);
|
|
116
113
|
const abortTransfer = async ({ engine, strapi: strapi1 })=>{
|
|
117
114
|
try {
|
|
118
115
|
await engine.abortTransfer();
|
|
@@ -172,19 +169,23 @@ const errorColors = {
|
|
|
172
169
|
error: chalk.red,
|
|
173
170
|
silly: chalk.yellow
|
|
174
171
|
};
|
|
175
|
-
const formatDiagnostic = (operation,
|
|
176
|
-
// Create log file for all incoming diagnostics
|
|
172
|
+
const formatDiagnostic = (operation, verbose)=>{
|
|
177
173
|
let logger;
|
|
174
|
+
let logFileBasename;
|
|
178
175
|
const getLogger = ()=>{
|
|
179
176
|
if (!logger) {
|
|
180
|
-
|
|
177
|
+
logFileBasename = `${operation}_${Date.now()}.log`;
|
|
178
|
+
const absoluteLogPath = path.resolve(process.cwd(), logFileBasename);
|
|
179
|
+
logger = createLogger(configs.createOutputFileConfiguration(logFileBasename, {
|
|
181
180
|
level: 'info',
|
|
182
181
|
format: formats?.detailedLogs
|
|
182
|
+
}, {
|
|
183
|
+
consoleLevel: verbose ? 'info' : 'warn'
|
|
183
184
|
}));
|
|
185
|
+
logger.info(`[${operation}] Diagnostic log file: ${absoluteLogPath} (info-level messages are written here even without --verbose)`);
|
|
184
186
|
}
|
|
185
187
|
return logger;
|
|
186
188
|
};
|
|
187
|
-
// We don't want to write a log file until there is something to be logged
|
|
188
189
|
return ({ details, kind })=>{
|
|
189
190
|
try {
|
|
190
191
|
if (kind === 'error') {
|
|
@@ -193,7 +194,7 @@ const formatDiagnostic = (operation, info)=>{
|
|
|
193
194
|
const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);
|
|
194
195
|
getLogger().error(errorMessage);
|
|
195
196
|
}
|
|
196
|
-
if (kind === 'info'
|
|
197
|
+
if (kind === 'info') {
|
|
197
198
|
const { message, params, origin } = details;
|
|
198
199
|
const msg = `[${origin ?? 'transfer'}] ${message}\n${params ? JSON.stringify(params, null, 2) : ''}`;
|
|
199
200
|
getLogger().info(msg);
|
|
@@ -207,6 +208,26 @@ const formatDiagnostic = (operation, info)=>{
|
|
|
207
208
|
}
|
|
208
209
|
};
|
|
209
210
|
};
|
|
211
|
+
/** Stages where throughput is dominated by DB work; items/s is more meaningful than JSON byte rate. */ const STAGES_WITH_ITEM_THROUGHPUT = new Set([
|
|
212
|
+
'entities',
|
|
213
|
+
'links'
|
|
214
|
+
]);
|
|
215
|
+
const MAX_ETA_MS = 86400000;
|
|
216
|
+
/**
|
|
217
|
+
* Linear ETA from completed amount vs total, using average rate so far (done / elapsedMs).
|
|
218
|
+
* Returns null when progress or totals are not usable yet.
|
|
219
|
+
*/ const estimateEtaMs = (elapsedMs, done, total)=>{
|
|
220
|
+
if (elapsedMs < 500 || done <= 0 || total <= 0 || done >= total) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const ratePerMs = done / elapsedMs;
|
|
224
|
+
const remaining = total - done;
|
|
225
|
+
const etaMs = remaining / ratePerMs;
|
|
226
|
+
if (!Number.isFinite(etaMs) || etaMs <= 0 || etaMs >= MAX_ETA_MS) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
return etaMs;
|
|
230
|
+
};
|
|
210
231
|
const loadersFactory = (defaultLoaders = {})=>{
|
|
211
232
|
const loaders = defaultLoaders;
|
|
212
233
|
const updateLoader = (stage, data)=>{
|
|
@@ -215,10 +236,34 @@ const loadersFactory = (defaultLoaders = {})=>{
|
|
|
215
236
|
}
|
|
216
237
|
const stageData = data[stage];
|
|
217
238
|
const elapsedTime = stageData?.startTime ? (stageData?.endTime || Date.now()) - stageData.startTime : 0;
|
|
218
|
-
const
|
|
219
|
-
const
|
|
220
|
-
const
|
|
221
|
-
|
|
239
|
+
const bytes = stageData?.bytes ?? 0;
|
|
240
|
+
const count = stageData?.count ?? 0;
|
|
241
|
+
const totalBytes = stageData?.totalBytes;
|
|
242
|
+
const totalCount = stageData?.totalCount;
|
|
243
|
+
const countLabel = totalCount != null && totalCount > 0 ? `${count} / ${totalCount}` : String(count);
|
|
244
|
+
const sizeCompact = totalBytes != null && totalBytes > 0 ? `${readableBytes(bytes)} / ${readableBytes(totalBytes)}` : readableBytes(bytes);
|
|
245
|
+
const parts = [
|
|
246
|
+
`${stage}: ${countLabel} transferred`,
|
|
247
|
+
sizeCompact
|
|
248
|
+
];
|
|
249
|
+
if (elapsedTime > 0 && !stageData?.endTime) {
|
|
250
|
+
if (STAGES_WITH_ITEM_THROUGHPUT.has(stage)) {
|
|
251
|
+
const itemsPerSec = count * 1000 / elapsedTime;
|
|
252
|
+
parts.push(`${itemsPerSec.toFixed(1)} items/s`);
|
|
253
|
+
} else {
|
|
254
|
+
parts.push(`${readableBytes(bytes * 1000 / elapsedTime)}/s`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
let etaMs = null;
|
|
258
|
+
if (!stageData?.endTime) {
|
|
259
|
+
if (STAGES_WITH_ITEM_THROUGHPUT.has(stage) && totalCount != null) {
|
|
260
|
+
etaMs = estimateEtaMs(elapsedTime, count, totalCount);
|
|
261
|
+
} else if (totalBytes != null) {
|
|
262
|
+
etaMs = estimateEtaMs(elapsedTime, bytes, totalBytes);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
parts.push(formatElapsedAndMaybeRemainingLabel(elapsedTime ?? 0, etaMs));
|
|
266
|
+
loaders[stage].text = parts.join(TRANSFER_PROGRESS_FIELD_SEP);
|
|
222
267
|
return loaders[stage];
|
|
223
268
|
};
|
|
224
269
|
const createLoader = (stage)=>{
|
|
@@ -335,9 +380,12 @@ const shouldSkipStage = (opts, dataKind)=>{
|
|
|
335
380
|
return false;
|
|
336
381
|
};
|
|
337
382
|
// Based on exclude/only from options, create the restore object to match
|
|
338
|
-
const parseRestoreFromOptions = (opts)=>{
|
|
383
|
+
const parseRestoreFromOptions = (opts, strapi1)=>{
|
|
339
384
|
const entitiesOptions = {
|
|
340
|
-
exclude:
|
|
385
|
+
exclude: [
|
|
386
|
+
...Object.keys(strapi1.contentTypes).filter(isIgnoredContentType),
|
|
387
|
+
...IGNORED_CONTENT_TYPES
|
|
388
|
+
],
|
|
341
389
|
include: undefined
|
|
342
390
|
};
|
|
343
391
|
// if content is not included, send an empty array for include
|
|
@@ -355,5 +403,5 @@ const parseRestoreFromOptions = (opts)=>{
|
|
|
355
403
|
return restoreConfig;
|
|
356
404
|
};
|
|
357
405
|
|
|
358
|
-
export {
|
|
406
|
+
export { abortTransfer, buildTransferTable, createStrapiInstance, excludeOption, exitMessageText, formatDiagnostic, getAssetsBackupHandler, getDefaultExportName, getDiffHandler, getTransferTelemetryPayload, isIgnoredContentType, loadersFactory, onlyOption, parseRestoreFromOptions, setSignalHandler, shouldSkipStage, throttleOption, validateExcludeOnly };
|
|
359
407
|
//# sourceMappingURL=data-transfer.mjs.map
|