@strapi/strapi 5.29.0 → 5.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/configuration/restore.js.map +1 -1
- package/dist/src/cli/commands/configuration/restore.mjs.map +1 -1
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/openapi/generate.js.map +1 -1
- package/dist/src/cli/commands/openapi/generate.mjs.map +1 -1
- package/dist/src/cli/commands/report.js.map +1 -1
- package/dist/src/cli/commands/report.mjs.map +1 -1
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/cli/commands/start.mjs.map +1 -1
- package/dist/src/cli/commands/telemetry/disable.js.map +1 -1
- package/dist/src/cli/commands/telemetry/disable.mjs.map +1 -1
- package/dist/src/cli/commands/telemetry/enable.js.map +1 -1
- package/dist/src/cli/commands/telemetry/enable.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/command.js.map +1 -1
- package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
- package/dist/src/cli/commands/version.js.map +1 -1
- package/dist/src/cli/commands/version.mjs.map +1 -1
- package/dist/src/cli/utils/commander.js.map +1 -1
- package/dist/src/cli/utils/commander.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/cli/utils/helpers.js.map +1 -1
- package/dist/src/cli/utils/helpers.mjs.map +1 -1
- package/dist/src/cli/utils/logger.js.map +1 -1
- package/dist/src/cli/utils/logger.mjs.map +1 -1
- package/dist/src/cli/utils/telemetry.js.map +1 -1
- package/dist/src/cli/utils/telemetry.mjs.map +1 -1
- package/dist/src/node/core/dependencies.js.map +1 -1
- package/dist/src/node/core/dependencies.mjs.map +1 -1
- package/dist/src/node/core/errors.js.map +1 -1
- package/dist/src/node/core/errors.mjs.map +1 -1
- package/dist/src/node/core/plugins.js.map +1 -1
- package/dist/src/node/core/plugins.mjs.map +1 -1
- package/dist/src/node/core/timer.js.map +1 -1
- package/dist/src/node/core/timer.mjs.map +1 -1
- package/dist/src/node/create-build-context.js.map +1 -1
- package/dist/src/node/create-build-context.mjs.map +1 -1
- package/dist/src/node/develop.js.map +1 -1
- package/dist/src/node/develop.mjs.map +1 -1
- package/dist/src/node/staticFiles.js.map +1 -1
- package/dist/src/node/staticFiles.mjs.map +1 -1
- package/dist/src/node/vite/watch.js.map +1 -1
- package/dist/src/node/vite/watch.mjs.map +1 -1
- package/dist/src/node/webpack/config.js.map +1 -1
- package/dist/src/node/webpack/config.mjs.map +1 -1
- package/dist/src/node/webpack/watch.js.map +1 -1
- package/dist/src/node/webpack/watch.mjs.map +1 -1
- package/package.json +22 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enable.js","sources":["../../../../../src/cli/commands/telemetry/enable.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { randomUUID } from 'crypto';\nimport fse from 'fs-extra';\nimport chalk from 'chalk';\nimport { createCommand } from 'commander';\n\nimport type { StrapiCommand } from '../../types';\nimport { runAction } from '../../utils/helpers';\nimport { sendEvent } from '../../utils/telemetry';\n\ntype PackageJson = {\n strapi?: {\n uuid?: string;\n installId?: string;\n telemetryDisabled?: boolean;\n };\n};\n\nconst readPackageJSON = async (path: string) => {\n try {\n const packageObj = await fse.readJson(path);\n return packageObj;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n } else {\n throw err;\n }\n }\n};\n\nconst writePackageJSON = async (path: string, file: object, spacing: number) => {\n try {\n await fse.writeJson(path, file, { spaces: spacing });\n return true;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n console.log(\n `${chalk.yellow(\n 'Warning'\n )}: There has been an error, please set \"telemetryDisabled\": false in the \"strapi\" object of your package.json manually.`\n );\n\n return false;\n }\n\n throw err;\n }\n};\n\nconst generateNewPackageJSON = (packageObj: PackageJson) => {\n if (!packageObj.strapi) {\n return {\n ...packageObj,\n strapi: {\n uuid: randomUUID(),\n telemetryDisabled: false,\n },\n };\n }\n return {\n ...packageObj,\n strapi: {\n ...packageObj.strapi,\n uuid: packageObj.strapi.uuid ? packageObj.strapi.uuid : randomUUID(),\n telemetryDisabled: false,\n },\n };\n};\n\nconst action = async () => {\n const packageJSONPath = resolve(process.cwd(), 'package.json');\n const exists = await fse.pathExists(packageJSONPath);\n\n if (!exists) {\n console.log(`${chalk.yellow('Warning')}: could not find package.json`);\n process.exit(0);\n }\n\n const packageObj = await readPackageJSON(packageJSONPath);\n\n if (packageObj.strapi && packageObj.strapi.uuid) {\n if (packageObj.strapi.telemetryDisabled === false) {\n console.log(`${chalk.yellow('Warning:')} telemetry is already enabled`);\n process.exit(0);\n }\n }\n\n const updatedPackageJSON = generateNewPackageJSON(packageObj);\n\n const write = await writePackageJSON(packageJSONPath, updatedPackageJSON, 2);\n\n if (!write) {\n process.exit(0);\n }\n\n await sendEvent(\n 'didOptInTelemetry',\n updatedPackageJSON.strapi.uuid,\n updatedPackageJSON.strapi?.installId\n );\n console.log(`${chalk.green('Successfully opted into and enabled Strapi telemetry')}`);\n process.exit(0);\n};\n\n/**\n * `$ strapi telemetry:enable`\n */\nconst command: StrapiCommand = () => {\n return createCommand('telemetry:enable')\n .description('Enable anonymous telemetry and metadata sending to Strapi analytics')\n .action(runAction('telemetry:enable', action));\n};\n\nexport { action, command };\n"],"names":["readPackageJSON","path","packageObj","fse","readJson","err","Error","console","error","chalk","red","message","writePackageJSON","file","spacing","writeJson","spaces","log","yellow","generateNewPackageJSON","strapi","uuid","randomUUID","telemetryDisabled","action","packageJSONPath","resolve","process","cwd","exists","pathExists","exit","updatedPackageJSON","write","sendEvent","installId","green","command","createCommand","description","runAction"],"mappings":";;;;;;;;;;AAkBA,MAAMA,kBAAkB,OAAOC,IAAAA,GAAAA;IAC7B,IAAI;AACF,QAAA,MAAMC,UAAa,GAAA,MAAMC,GAAIC,CAAAA,QAAQ,CAACH,IAAAA,CAAAA;QACtC,OAAOC,UAAAA;AACT,KAAA,CAAE,OAAOG,GAAK,EAAA;AACZ,QAAA,IAAIA,eAAeC,KAAO,EAAA;
|
|
1
|
+
{"version":3,"file":"enable.js","sources":["../../../../../src/cli/commands/telemetry/enable.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { randomUUID } from 'crypto';\nimport fse from 'fs-extra';\nimport chalk from 'chalk';\nimport { createCommand } from 'commander';\n\nimport type { StrapiCommand } from '../../types';\nimport { runAction } from '../../utils/helpers';\nimport { sendEvent } from '../../utils/telemetry';\n\ntype PackageJson = {\n strapi?: {\n uuid?: string;\n installId?: string;\n telemetryDisabled?: boolean;\n };\n};\n\nconst readPackageJSON = async (path: string) => {\n try {\n const packageObj = await fse.readJson(path);\n return packageObj;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n } else {\n throw err;\n }\n }\n};\n\nconst writePackageJSON = async (path: string, file: object, spacing: number) => {\n try {\n await fse.writeJson(path, file, { spaces: spacing });\n return true;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n console.log(\n `${chalk.yellow(\n 'Warning'\n )}: There has been an error, please set \"telemetryDisabled\": false in the \"strapi\" object of your package.json manually.`\n );\n\n return false;\n }\n\n throw err;\n }\n};\n\nconst generateNewPackageJSON = (packageObj: PackageJson) => {\n if (!packageObj.strapi) {\n return {\n ...packageObj,\n strapi: {\n uuid: randomUUID(),\n telemetryDisabled: false,\n },\n };\n }\n return {\n ...packageObj,\n strapi: {\n ...packageObj.strapi,\n uuid: packageObj.strapi.uuid ? packageObj.strapi.uuid : randomUUID(),\n telemetryDisabled: false,\n },\n };\n};\n\nconst action = async () => {\n const packageJSONPath = resolve(process.cwd(), 'package.json');\n const exists = await fse.pathExists(packageJSONPath);\n\n if (!exists) {\n console.log(`${chalk.yellow('Warning')}: could not find package.json`);\n process.exit(0);\n }\n\n const packageObj = await readPackageJSON(packageJSONPath);\n\n if (packageObj.strapi && packageObj.strapi.uuid) {\n if (packageObj.strapi.telemetryDisabled === false) {\n console.log(`${chalk.yellow('Warning:')} telemetry is already enabled`);\n process.exit(0);\n }\n }\n\n const updatedPackageJSON = generateNewPackageJSON(packageObj);\n\n const write = await writePackageJSON(packageJSONPath, updatedPackageJSON, 2);\n\n if (!write) {\n process.exit(0);\n }\n\n await sendEvent(\n 'didOptInTelemetry',\n updatedPackageJSON.strapi.uuid,\n updatedPackageJSON.strapi?.installId\n );\n console.log(`${chalk.green('Successfully opted into and enabled Strapi telemetry')}`);\n process.exit(0);\n};\n\n/**\n * `$ strapi telemetry:enable`\n */\nconst command: StrapiCommand = () => {\n return createCommand('telemetry:enable')\n .description('Enable anonymous telemetry and metadata sending to Strapi analytics')\n .action(runAction('telemetry:enable', action));\n};\n\nexport { action, command };\n"],"names":["readPackageJSON","path","packageObj","fse","readJson","err","Error","console","error","chalk","red","message","writePackageJSON","file","spacing","writeJson","spaces","log","yellow","generateNewPackageJSON","strapi","uuid","randomUUID","telemetryDisabled","action","packageJSONPath","resolve","process","cwd","exists","pathExists","exit","updatedPackageJSON","write","sendEvent","installId","green","command","createCommand","description","runAction"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enable.mjs","sources":["../../../../../src/cli/commands/telemetry/enable.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { randomUUID } from 'crypto';\nimport fse from 'fs-extra';\nimport chalk from 'chalk';\nimport { createCommand } from 'commander';\n\nimport type { StrapiCommand } from '../../types';\nimport { runAction } from '../../utils/helpers';\nimport { sendEvent } from '../../utils/telemetry';\n\ntype PackageJson = {\n strapi?: {\n uuid?: string;\n installId?: string;\n telemetryDisabled?: boolean;\n };\n};\n\nconst readPackageJSON = async (path: string) => {\n try {\n const packageObj = await fse.readJson(path);\n return packageObj;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n } else {\n throw err;\n }\n }\n};\n\nconst writePackageJSON = async (path: string, file: object, spacing: number) => {\n try {\n await fse.writeJson(path, file, { spaces: spacing });\n return true;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n console.log(\n `${chalk.yellow(\n 'Warning'\n )}: There has been an error, please set \"telemetryDisabled\": false in the \"strapi\" object of your package.json manually.`\n );\n\n return false;\n }\n\n throw err;\n }\n};\n\nconst generateNewPackageJSON = (packageObj: PackageJson) => {\n if (!packageObj.strapi) {\n return {\n ...packageObj,\n strapi: {\n uuid: randomUUID(),\n telemetryDisabled: false,\n },\n };\n }\n return {\n ...packageObj,\n strapi: {\n ...packageObj.strapi,\n uuid: packageObj.strapi.uuid ? packageObj.strapi.uuid : randomUUID(),\n telemetryDisabled: false,\n },\n };\n};\n\nconst action = async () => {\n const packageJSONPath = resolve(process.cwd(), 'package.json');\n const exists = await fse.pathExists(packageJSONPath);\n\n if (!exists) {\n console.log(`${chalk.yellow('Warning')}: could not find package.json`);\n process.exit(0);\n }\n\n const packageObj = await readPackageJSON(packageJSONPath);\n\n if (packageObj.strapi && packageObj.strapi.uuid) {\n if (packageObj.strapi.telemetryDisabled === false) {\n console.log(`${chalk.yellow('Warning:')} telemetry is already enabled`);\n process.exit(0);\n }\n }\n\n const updatedPackageJSON = generateNewPackageJSON(packageObj);\n\n const write = await writePackageJSON(packageJSONPath, updatedPackageJSON, 2);\n\n if (!write) {\n process.exit(0);\n }\n\n await sendEvent(\n 'didOptInTelemetry',\n updatedPackageJSON.strapi.uuid,\n updatedPackageJSON.strapi?.installId\n );\n console.log(`${chalk.green('Successfully opted into and enabled Strapi telemetry')}`);\n process.exit(0);\n};\n\n/**\n * `$ strapi telemetry:enable`\n */\nconst command: StrapiCommand = () => {\n return createCommand('telemetry:enable')\n .description('Enable anonymous telemetry and metadata sending to Strapi analytics')\n .action(runAction('telemetry:enable', action));\n};\n\nexport { action, command };\n"],"names":["readPackageJSON","path","packageObj","fse","readJson","err","Error","console","error","chalk","red","message","writePackageJSON","file","spacing","writeJson","spaces","log","yellow","generateNewPackageJSON","strapi","uuid","randomUUID","telemetryDisabled","action","packageJSONPath","resolve","process","cwd","exists","pathExists","exit","updatedPackageJSON","write","sendEvent","installId","green","command","createCommand","description","runAction"],"mappings":";;;;;;;;AAkBA,MAAMA,kBAAkB,OAAOC,IAAAA,GAAAA;IAC7B,IAAI;AACF,QAAA,MAAMC,UAAa,GAAA,MAAMC,GAAIC,CAAAA,QAAQ,CAACH,IAAAA,CAAAA;QACtC,OAAOC,UAAAA;AACT,KAAA,CAAE,OAAOG,GAAK,EAAA;AACZ,QAAA,IAAIA,eAAeC,KAAO,EAAA;
|
|
1
|
+
{"version":3,"file":"enable.mjs","sources":["../../../../../src/cli/commands/telemetry/enable.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { randomUUID } from 'crypto';\nimport fse from 'fs-extra';\nimport chalk from 'chalk';\nimport { createCommand } from 'commander';\n\nimport type { StrapiCommand } from '../../types';\nimport { runAction } from '../../utils/helpers';\nimport { sendEvent } from '../../utils/telemetry';\n\ntype PackageJson = {\n strapi?: {\n uuid?: string;\n installId?: string;\n telemetryDisabled?: boolean;\n };\n};\n\nconst readPackageJSON = async (path: string) => {\n try {\n const packageObj = await fse.readJson(path);\n return packageObj;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n } else {\n throw err;\n }\n }\n};\n\nconst writePackageJSON = async (path: string, file: object, spacing: number) => {\n try {\n await fse.writeJson(path, file, { spaces: spacing });\n return true;\n } catch (err) {\n if (err instanceof Error) {\n console.error(`${chalk.red('Error')}: ${err.message}`);\n console.log(\n `${chalk.yellow(\n 'Warning'\n )}: There has been an error, please set \"telemetryDisabled\": false in the \"strapi\" object of your package.json manually.`\n );\n\n return false;\n }\n\n throw err;\n }\n};\n\nconst generateNewPackageJSON = (packageObj: PackageJson) => {\n if (!packageObj.strapi) {\n return {\n ...packageObj,\n strapi: {\n uuid: randomUUID(),\n telemetryDisabled: false,\n },\n };\n }\n return {\n ...packageObj,\n strapi: {\n ...packageObj.strapi,\n uuid: packageObj.strapi.uuid ? packageObj.strapi.uuid : randomUUID(),\n telemetryDisabled: false,\n },\n };\n};\n\nconst action = async () => {\n const packageJSONPath = resolve(process.cwd(), 'package.json');\n const exists = await fse.pathExists(packageJSONPath);\n\n if (!exists) {\n console.log(`${chalk.yellow('Warning')}: could not find package.json`);\n process.exit(0);\n }\n\n const packageObj = await readPackageJSON(packageJSONPath);\n\n if (packageObj.strapi && packageObj.strapi.uuid) {\n if (packageObj.strapi.telemetryDisabled === false) {\n console.log(`${chalk.yellow('Warning:')} telemetry is already enabled`);\n process.exit(0);\n }\n }\n\n const updatedPackageJSON = generateNewPackageJSON(packageObj);\n\n const write = await writePackageJSON(packageJSONPath, updatedPackageJSON, 2);\n\n if (!write) {\n process.exit(0);\n }\n\n await sendEvent(\n 'didOptInTelemetry',\n updatedPackageJSON.strapi.uuid,\n updatedPackageJSON.strapi?.installId\n );\n console.log(`${chalk.green('Successfully opted into and enabled Strapi telemetry')}`);\n process.exit(0);\n};\n\n/**\n * `$ strapi telemetry:enable`\n */\nconst command: StrapiCommand = () => {\n return createCommand('telemetry:enable')\n .description('Enable anonymous telemetry and metadata sending to Strapi analytics')\n .action(runAction('telemetry:enable', action));\n};\n\nexport { action, command };\n"],"names":["readPackageJSON","path","packageObj","fse","readJson","err","Error","console","error","chalk","red","message","writePackageJSON","file","spacing","writeJson","spaces","log","yellow","generateNewPackageJSON","strapi","uuid","randomUUID","telemetryDisabled","action","packageJSONPath","resolve","process","cwd","exists","pathExists","exit","updatedPackageJSON","write","sendEvent","installId","green","command","createCommand","description","runAction"],"mappings":"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"}
|
|
@@ -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\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) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return opts.from;\n }\n if (opts.to) {\n return opts.to;\n }\n\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\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":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","dir","inquirer","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
|
|
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) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return opts.from;\n }\n if (opts.to) {\n return opts.to;\n }\n\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\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":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","dir","inquirer","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
|
|
@@ -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\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) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return opts.from;\n }\n if (opts.to) {\n return opts.to;\n }\n\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\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":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","dir","inquirer","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
|
|
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) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return opts.from;\n }\n if (opts.to) {\n return opts.to;\n }\n\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\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":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","dir","inquirer","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sources":["../../../../src/cli/commands/version.ts"],"sourcesContent":["import { createCommand } from 'commander';\nimport type { StrapiCommand } from '../types';\nimport { version } from '../../../package.json';\n\n/**\n * `$ strapi version`\n */\n\nconst command: StrapiCommand = () => {\n // load the Strapi package.json to get version and other information\n return createCommand('version')\n .description('Output the version of Strapi')\n .action(() => {\n process.stdout.write(`${version}\\n`);\n process.exit(0);\n });\n};\n\nexport { command };\n"],"names":["command","createCommand","description","action","process","stdout","write","version","exit"],"mappings":";;;;;AAIA;;AAEC,UAEKA,OAAyB,GAAA,IAAA;;AAE7B,IAAA,OAAOC,wBAAc,SAClBC,CAAAA,CAAAA,WAAW,CAAC,8BAAA,CAAA,CACZC,MAAM,CAAC,IAAA;
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../../../../src/cli/commands/version.ts"],"sourcesContent":["import { createCommand } from 'commander';\nimport type { StrapiCommand } from '../types';\nimport { version } from '../../../package.json';\n\n/**\n * `$ strapi version`\n */\n\nconst command: StrapiCommand = () => {\n // load the Strapi package.json to get version and other information\n return createCommand('version')\n .description('Output the version of Strapi')\n .action(() => {\n process.stdout.write(`${version}\\n`);\n process.exit(0);\n });\n};\n\nexport { command };\n"],"names":["command","createCommand","description","action","process","stdout","write","version","exit"],"mappings":";;;;;AAIA;;AAEC,UAEKA,OAAyB,GAAA,IAAA;;AAE7B,IAAA,OAAOC,wBAAc,SAClBC,CAAAA,CAAAA,WAAW,CAAC,8BAAA,CAAA,CACZC,MAAM,CAAC,IAAA;AACNC,QAAAA,OAAAA,CAAQC,MAAM,CAACC,KAAK,CAAC,CAAGC,EAAAA,gBAAAA,CAAQ,EAAE,CAAC,CAAA;AACnCH,QAAAA,OAAAA,CAAQI,IAAI,CAAC,CAAA,CAAA;AACf,KAAA,CAAA;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.mjs","sources":["../../../../src/cli/commands/version.ts"],"sourcesContent":["import { createCommand } from 'commander';\nimport type { StrapiCommand } from '../types';\nimport { version } from '../../../package.json';\n\n/**\n * `$ strapi version`\n */\n\nconst command: StrapiCommand = () => {\n // load the Strapi package.json to get version and other information\n return createCommand('version')\n .description('Output the version of Strapi')\n .action(() => {\n process.stdout.write(`${version}\\n`);\n process.exit(0);\n });\n};\n\nexport { command };\n"],"names":["command","createCommand","description","action","process","stdout","write","version","exit"],"mappings":";;;AAIA;;AAEC,UAEKA,OAAyB,GAAA,IAAA;;AAE7B,IAAA,OAAOC,cAAc,SAClBC,CAAAA,CAAAA,WAAW,CAAC,8BAAA,CAAA,CACZC,MAAM,CAAC,IAAA;
|
|
1
|
+
{"version":3,"file":"version.mjs","sources":["../../../../src/cli/commands/version.ts"],"sourcesContent":["import { createCommand } from 'commander';\nimport type { StrapiCommand } from '../types';\nimport { version } from '../../../package.json';\n\n/**\n * `$ strapi version`\n */\n\nconst command: StrapiCommand = () => {\n // load the Strapi package.json to get version and other information\n return createCommand('version')\n .description('Output the version of Strapi')\n .action(() => {\n process.stdout.write(`${version}\\n`);\n process.exit(0);\n });\n};\n\nexport { command };\n"],"names":["command","createCommand","description","action","process","stdout","write","version","exit"],"mappings":";;;AAIA;;AAEC,UAEKA,OAAyB,GAAA,IAAA;;AAE7B,IAAA,OAAOC,cAAc,SAClBC,CAAAA,CAAAA,WAAW,CAAC,8BAAA,CAAA,CACZC,MAAM,CAAC,IAAA;AACNC,QAAAA,OAAAA,CAAQC,MAAM,CAACC,KAAK,CAAC,CAAGC,EAAAA,OAAAA,CAAQ,EAAE,CAAC,CAAA;AACnCH,QAAAA,OAAAA,CAAQI,IAAI,CAAC,CAAA,CAAA;AACf,KAAA,CAAA;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commander.js","sources":["../../../../src/cli/utils/commander.ts"],"sourcesContent":["/**\n * This file includes hooks to use for commander.hook and argParsers for commander.argParser\n */\n\nimport inquirer from 'inquirer';\nimport { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\n\n/**\n * argParser: Parse a comma-delimited string as an array\n */\nconst parseList = (value: string) => {\n try {\n return value.split(',').map((item) => item.trim()); // trim shouldn't be necessary but might help catch unexpected whitespace characters\n } catch (e) {\n exitWith(1, `Unrecognized input: ${value}`);\n }\n\n return [];\n};\n\n/**\n * Returns an argParser that returns a list\n */\nconst getParseListWithChoices = (choices: string[], errorMessage = 'Invalid options:') => {\n return (value: string) => {\n const list = parseList(value);\n const invalid = list.filter((item) => {\n return !choices.includes(item);\n });\n\n if (invalid.length > 0) {\n exitWith(1, `${errorMessage}: ${invalid.join(',')}`);\n }\n\n return list;\n };\n};\n\n/**\n * argParser: Parse a string as an integer\n */\nconst parseInteger = (value: string) => {\n // parseInt takes a string and a radix\n const parsedValue = parseInt(value, 10);\n if (isNaN(parsedValue)) {\n throw new InvalidOptionArgumentError(`Not an integer: ${value}`);\n }\n return parsedValue;\n};\n\n/**\n * argParser: Parse a string as a URL object\n */\nconst parseURL = (value: string) => {\n try {\n const url = new URL(value);\n if (!url.host) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n\n return url;\n } catch (e) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n};\n\n/**\n * hook: if encrypt==true and key not provided, prompt for it\n */\nconst promptEncryptionKey = async (thisCommand: Command) => {\n const opts = thisCommand.opts();\n\n if (!opts.encrypt && opts.key) {\n return exitWith(1, 'Key may not be present unless encryption is used');\n }\n\n // if encrypt==true but we have no key, prompt for it\n if (opts.encrypt && !(opts.key && opts.key.length > 0)) {\n try {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter an encryption key',\n name: 'key',\n validate(key) {\n if (key.length > 0) return true;\n\n return 'Key must be present when using the encrypt option';\n },\n },\n ]);\n opts.key = answers.key;\n } catch (e) {\n return exitWith(1, 'Failed to get encryption key');\n }\n if (!opts.key) {\n return exitWith(1, 'Failed to get encryption key');\n }\n }\n};\n\n/**\n * hook: require a confirmation message to be accepted unless forceOption (-f,--force) is used\n */\nconst getCommanderConfirmMessage = (\n message: string,\n { failMessage }: { failMessage?: string } = {}\n) => {\n return async (command: Command) => {\n const confirmed = await confirmMessage(message, { force: command.opts().force });\n if (!confirmed) {\n exitWith(1, failMessage);\n }\n };\n};\n\nconst confirmMessage = async (message: string, { force }: { force?: boolean } = {}) => {\n // if we have a force option, respond yes\n if (force === true) {\n // attempt to mimic the inquirer prompt exactly\n console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);\n return true;\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n message,\n name: `confirm`,\n default: false,\n },\n ]);\n\n return answers.confirm;\n};\n\nconst forceOption = new Option(\n '--force',\n `Automatically answer \"yes\" to all prompts, including potentially destructive requests, and run non-interactively.`\n);\n\nexport {\n getParseListWithChoices,\n parseList,\n parseURL,\n parseInteger,\n promptEncryptionKey,\n getCommanderConfirmMessage,\n confirmMessage,\n forceOption,\n};\n"],"names":["parseList","value","split","map","item","trim","e","exitWith","getParseListWithChoices","choices","errorMessage","list","invalid","filter","includes","length","join","parseInteger","parsedValue","parseInt","isNaN","InvalidOptionArgumentError","parseURL","url","URL","host","promptEncryptionKey","thisCommand","opts","encrypt","key","answers","inquirer","prompt","type","message","name","validate","getCommanderConfirmMessage","failMessage","command","confirmed","confirmMessage","force","console","log","chalk","green","bold","cyan","default","confirm","forceOption","Option"],"mappings":";;;;;;;;AAUA;;IAGA,MAAMA,YAAY,CAACC,KAAAA,GAAAA;IACjB,IAAI;QACF,OAAOA,KAAAA,CAAMC,KAAK,CAAC,GAAKC,CAAAA,CAAAA,GAAG,CAAC,CAACC,IAASA,GAAAA,IAAAA,CAAKC,IAAI,EAAA,CAAA,CAAA;AACjD,KAAA,CAAE,OAAOC,CAAG,EAAA;AACVC,QAAAA,gBAAAA,CAAS,CAAG,EAAA,CAAC,oBAAoB,EAAEN,
|
|
1
|
+
{"version":3,"file":"commander.js","sources":["../../../../src/cli/utils/commander.ts"],"sourcesContent":["/**\n * This file includes hooks to use for commander.hook and argParsers for commander.argParser\n */\n\nimport inquirer from 'inquirer';\nimport { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\n\n/**\n * argParser: Parse a comma-delimited string as an array\n */\nconst parseList = (value: string) => {\n try {\n return value.split(',').map((item) => item.trim()); // trim shouldn't be necessary but might help catch unexpected whitespace characters\n } catch (e) {\n exitWith(1, `Unrecognized input: ${value}`);\n }\n\n return [];\n};\n\n/**\n * Returns an argParser that returns a list\n */\nconst getParseListWithChoices = (choices: string[], errorMessage = 'Invalid options:') => {\n return (value: string) => {\n const list = parseList(value);\n const invalid = list.filter((item) => {\n return !choices.includes(item);\n });\n\n if (invalid.length > 0) {\n exitWith(1, `${errorMessage}: ${invalid.join(',')}`);\n }\n\n return list;\n };\n};\n\n/**\n * argParser: Parse a string as an integer\n */\nconst parseInteger = (value: string) => {\n // parseInt takes a string and a radix\n const parsedValue = parseInt(value, 10);\n if (isNaN(parsedValue)) {\n throw new InvalidOptionArgumentError(`Not an integer: ${value}`);\n }\n return parsedValue;\n};\n\n/**\n * argParser: Parse a string as a URL object\n */\nconst parseURL = (value: string) => {\n try {\n const url = new URL(value);\n if (!url.host) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n\n return url;\n } catch (e) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n};\n\n/**\n * hook: if encrypt==true and key not provided, prompt for it\n */\nconst promptEncryptionKey = async (thisCommand: Command) => {\n const opts = thisCommand.opts();\n\n if (!opts.encrypt && opts.key) {\n return exitWith(1, 'Key may not be present unless encryption is used');\n }\n\n // if encrypt==true but we have no key, prompt for it\n if (opts.encrypt && !(opts.key && opts.key.length > 0)) {\n try {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter an encryption key',\n name: 'key',\n validate(key) {\n if (key.length > 0) return true;\n\n return 'Key must be present when using the encrypt option';\n },\n },\n ]);\n opts.key = answers.key;\n } catch (e) {\n return exitWith(1, 'Failed to get encryption key');\n }\n if (!opts.key) {\n return exitWith(1, 'Failed to get encryption key');\n }\n }\n};\n\n/**\n * hook: require a confirmation message to be accepted unless forceOption (-f,--force) is used\n */\nconst getCommanderConfirmMessage = (\n message: string,\n { failMessage }: { failMessage?: string } = {}\n) => {\n return async (command: Command) => {\n const confirmed = await confirmMessage(message, { force: command.opts().force });\n if (!confirmed) {\n exitWith(1, failMessage);\n }\n };\n};\n\nconst confirmMessage = async (message: string, { force }: { force?: boolean } = {}) => {\n // if we have a force option, respond yes\n if (force === true) {\n // attempt to mimic the inquirer prompt exactly\n console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);\n return true;\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n message,\n name: `confirm`,\n default: false,\n },\n ]);\n\n return answers.confirm;\n};\n\nconst forceOption = new Option(\n '--force',\n `Automatically answer \"yes\" to all prompts, including potentially destructive requests, and run non-interactively.`\n);\n\nexport {\n getParseListWithChoices,\n parseList,\n parseURL,\n parseInteger,\n promptEncryptionKey,\n getCommanderConfirmMessage,\n confirmMessage,\n forceOption,\n};\n"],"names":["parseList","value","split","map","item","trim","e","exitWith","getParseListWithChoices","choices","errorMessage","list","invalid","filter","includes","length","join","parseInteger","parsedValue","parseInt","isNaN","InvalidOptionArgumentError","parseURL","url","URL","host","promptEncryptionKey","thisCommand","opts","encrypt","key","answers","inquirer","prompt","type","message","name","validate","getCommanderConfirmMessage","failMessage","command","confirmed","confirmMessage","force","console","log","chalk","green","bold","cyan","default","confirm","forceOption","Option"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commander.mjs","sources":["../../../../src/cli/utils/commander.ts"],"sourcesContent":["/**\n * This file includes hooks to use for commander.hook and argParsers for commander.argParser\n */\n\nimport inquirer from 'inquirer';\nimport { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\n\n/**\n * argParser: Parse a comma-delimited string as an array\n */\nconst parseList = (value: string) => {\n try {\n return value.split(',').map((item) => item.trim()); // trim shouldn't be necessary but might help catch unexpected whitespace characters\n } catch (e) {\n exitWith(1, `Unrecognized input: ${value}`);\n }\n\n return [];\n};\n\n/**\n * Returns an argParser that returns a list\n */\nconst getParseListWithChoices = (choices: string[], errorMessage = 'Invalid options:') => {\n return (value: string) => {\n const list = parseList(value);\n const invalid = list.filter((item) => {\n return !choices.includes(item);\n });\n\n if (invalid.length > 0) {\n exitWith(1, `${errorMessage}: ${invalid.join(',')}`);\n }\n\n return list;\n };\n};\n\n/**\n * argParser: Parse a string as an integer\n */\nconst parseInteger = (value: string) => {\n // parseInt takes a string and a radix\n const parsedValue = parseInt(value, 10);\n if (isNaN(parsedValue)) {\n throw new InvalidOptionArgumentError(`Not an integer: ${value}`);\n }\n return parsedValue;\n};\n\n/**\n * argParser: Parse a string as a URL object\n */\nconst parseURL = (value: string) => {\n try {\n const url = new URL(value);\n if (!url.host) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n\n return url;\n } catch (e) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n};\n\n/**\n * hook: if encrypt==true and key not provided, prompt for it\n */\nconst promptEncryptionKey = async (thisCommand: Command) => {\n const opts = thisCommand.opts();\n\n if (!opts.encrypt && opts.key) {\n return exitWith(1, 'Key may not be present unless encryption is used');\n }\n\n // if encrypt==true but we have no key, prompt for it\n if (opts.encrypt && !(opts.key && opts.key.length > 0)) {\n try {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter an encryption key',\n name: 'key',\n validate(key) {\n if (key.length > 0) return true;\n\n return 'Key must be present when using the encrypt option';\n },\n },\n ]);\n opts.key = answers.key;\n } catch (e) {\n return exitWith(1, 'Failed to get encryption key');\n }\n if (!opts.key) {\n return exitWith(1, 'Failed to get encryption key');\n }\n }\n};\n\n/**\n * hook: require a confirmation message to be accepted unless forceOption (-f,--force) is used\n */\nconst getCommanderConfirmMessage = (\n message: string,\n { failMessage }: { failMessage?: string } = {}\n) => {\n return async (command: Command) => {\n const confirmed = await confirmMessage(message, { force: command.opts().force });\n if (!confirmed) {\n exitWith(1, failMessage);\n }\n };\n};\n\nconst confirmMessage = async (message: string, { force }: { force?: boolean } = {}) => {\n // if we have a force option, respond yes\n if (force === true) {\n // attempt to mimic the inquirer prompt exactly\n console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);\n return true;\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n message,\n name: `confirm`,\n default: false,\n },\n ]);\n\n return answers.confirm;\n};\n\nconst forceOption = new Option(\n '--force',\n `Automatically answer \"yes\" to all prompts, including potentially destructive requests, and run non-interactively.`\n);\n\nexport {\n getParseListWithChoices,\n parseList,\n parseURL,\n parseInteger,\n promptEncryptionKey,\n getCommanderConfirmMessage,\n confirmMessage,\n forceOption,\n};\n"],"names":["parseList","value","split","map","item","trim","e","exitWith","getParseListWithChoices","choices","errorMessage","list","invalid","filter","includes","length","join","parseInteger","parsedValue","parseInt","isNaN","InvalidOptionArgumentError","parseURL","url","URL","host","promptEncryptionKey","thisCommand","opts","encrypt","key","answers","inquirer","prompt","type","message","name","validate","getCommanderConfirmMessage","failMessage","command","confirmed","confirmMessage","force","console","log","chalk","green","bold","cyan","default","confirm","forceOption","Option"],"mappings":";;;;;;AAUA;;IAGA,MAAMA,YAAY,CAACC,KAAAA,GAAAA;IACjB,IAAI;QACF,OAAOA,KAAAA,CAAMC,KAAK,CAAC,GAAKC,CAAAA,CAAAA,GAAG,CAAC,CAACC,IAASA,GAAAA,IAAAA,CAAKC,IAAI,EAAA,CAAA,CAAA;AACjD,KAAA,CAAE,OAAOC,CAAG,EAAA;AACVC,QAAAA,QAAAA,CAAS,CAAG,EAAA,CAAC,oBAAoB,EAAEN,
|
|
1
|
+
{"version":3,"file":"commander.mjs","sources":["../../../../src/cli/utils/commander.ts"],"sourcesContent":["/**\n * This file includes hooks to use for commander.hook and argParsers for commander.argParser\n */\n\nimport inquirer from 'inquirer';\nimport { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\n\n/**\n * argParser: Parse a comma-delimited string as an array\n */\nconst parseList = (value: string) => {\n try {\n return value.split(',').map((item) => item.trim()); // trim shouldn't be necessary but might help catch unexpected whitespace characters\n } catch (e) {\n exitWith(1, `Unrecognized input: ${value}`);\n }\n\n return [];\n};\n\n/**\n * Returns an argParser that returns a list\n */\nconst getParseListWithChoices = (choices: string[], errorMessage = 'Invalid options:') => {\n return (value: string) => {\n const list = parseList(value);\n const invalid = list.filter((item) => {\n return !choices.includes(item);\n });\n\n if (invalid.length > 0) {\n exitWith(1, `${errorMessage}: ${invalid.join(',')}`);\n }\n\n return list;\n };\n};\n\n/**\n * argParser: Parse a string as an integer\n */\nconst parseInteger = (value: string) => {\n // parseInt takes a string and a radix\n const parsedValue = parseInt(value, 10);\n if (isNaN(parsedValue)) {\n throw new InvalidOptionArgumentError(`Not an integer: ${value}`);\n }\n return parsedValue;\n};\n\n/**\n * argParser: Parse a string as a URL object\n */\nconst parseURL = (value: string) => {\n try {\n const url = new URL(value);\n if (!url.host) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n\n return url;\n } catch (e) {\n throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n }\n};\n\n/**\n * hook: if encrypt==true and key not provided, prompt for it\n */\nconst promptEncryptionKey = async (thisCommand: Command) => {\n const opts = thisCommand.opts();\n\n if (!opts.encrypt && opts.key) {\n return exitWith(1, 'Key may not be present unless encryption is used');\n }\n\n // if encrypt==true but we have no key, prompt for it\n if (opts.encrypt && !(opts.key && opts.key.length > 0)) {\n try {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter an encryption key',\n name: 'key',\n validate(key) {\n if (key.length > 0) return true;\n\n return 'Key must be present when using the encrypt option';\n },\n },\n ]);\n opts.key = answers.key;\n } catch (e) {\n return exitWith(1, 'Failed to get encryption key');\n }\n if (!opts.key) {\n return exitWith(1, 'Failed to get encryption key');\n }\n }\n};\n\n/**\n * hook: require a confirmation message to be accepted unless forceOption (-f,--force) is used\n */\nconst getCommanderConfirmMessage = (\n message: string,\n { failMessage }: { failMessage?: string } = {}\n) => {\n return async (command: Command) => {\n const confirmed = await confirmMessage(message, { force: command.opts().force });\n if (!confirmed) {\n exitWith(1, failMessage);\n }\n };\n};\n\nconst confirmMessage = async (message: string, { force }: { force?: boolean } = {}) => {\n // if we have a force option, respond yes\n if (force === true) {\n // attempt to mimic the inquirer prompt exactly\n console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);\n return true;\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n message,\n name: `confirm`,\n default: false,\n },\n ]);\n\n return answers.confirm;\n};\n\nconst forceOption = new Option(\n '--force',\n `Automatically answer \"yes\" to all prompts, including potentially destructive requests, and run non-interactively.`\n);\n\nexport {\n getParseListWithChoices,\n parseList,\n parseURL,\n parseInteger,\n promptEncryptionKey,\n getCommanderConfirmMessage,\n confirmMessage,\n forceOption,\n};\n"],"names":["parseList","value","split","map","item","trim","e","exitWith","getParseListWithChoices","choices","errorMessage","list","invalid","filter","includes","length","join","parseInteger","parsedValue","parseInt","isNaN","InvalidOptionArgumentError","parseURL","url","URL","host","promptEncryptionKey","thisCommand","opts","encrypt","key","answers","inquirer","prompt","type","message","name","validate","getCommanderConfirmMessage","failMessage","command","confirmed","confirmMessage","force","console","log","chalk","green","bold","cyan","default","confirm","forceOption","Option"],"mappings":"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"}
|
|
@@ -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 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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"}
|