@strapi/strapi 5.41.0 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/admin/create-user.d.ts.map +1 -1
- package/dist/cli/commands/admin/reset-user-password.d.ts.map +1 -1
- package/dist/cli/commands/export/action.d.ts +2 -0
- package/dist/cli/commands/export/action.d.ts.map +1 -1
- package/dist/cli/commands/export/command.d.ts.map +1 -1
- package/dist/cli/commands/export/validate-dir-format.d.ts +18 -0
- package/dist/cli/commands/export/validate-dir-format.d.ts.map +1 -0
- package/dist/cli/commands/import/action.d.ts +1 -1
- package/dist/cli/commands/import/action.d.ts.map +1 -1
- package/dist/cli/commands/import/command.d.ts.map +1 -1
- package/dist/cli/commands/transfer/command.d.ts.map +1 -1
- package/dist/cli/utils/commander.d.ts.map +1 -1
- package/dist/cli/utils/get-inquirer.d.ts +5 -0
- package/dist/cli/utils/get-inquirer.d.ts.map +1 -0
- package/dist/cli/utils/helpers.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/admin/create-user.js +2 -1
- package/dist/src/cli/commands/admin/create-user.js.map +1 -1
- package/dist/src/cli/commands/admin/create-user.mjs +2 -1
- package/dist/src/cli/commands/admin/create-user.mjs.map +1 -1
- package/dist/src/cli/commands/admin/reset-user-password.js +2 -1
- package/dist/src/cli/commands/admin/reset-user-password.js.map +1 -1
- package/dist/src/cli/commands/admin/reset-user-password.mjs +2 -1
- package/dist/src/cli/commands/admin/reset-user-password.mjs.map +1 -1
- package/dist/src/cli/commands/export/action.js +23 -4
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +24 -5
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/export/command.js +5 -1
- package/dist/src/cli/commands/export/command.js.map +1 -1
- package/dist/src/cli/commands/export/command.mjs +5 -1
- package/dist/src/cli/commands/export/command.mjs.map +1 -1
- package/dist/src/cli/commands/export/validate-dir-format.js +48 -0
- package/dist/src/cli/commands/export/validate-dir-format.js.map +1 -0
- package/dist/src/cli/commands/export/validate-dir-format.mjs +43 -0
- package/dist/src/cli/commands/export/validate-dir-format.mjs.map +1 -0
- package/dist/src/cli/commands/import/action.js +9 -5
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +10 -6
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/command.js +19 -5
- package/dist/src/cli/commands/import/command.js.map +1 -1
- package/dist/src/cli/commands/import/command.mjs +19 -5
- package/dist/src/cli/commands/import/command.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/command.js +6 -1
- package/dist/src/cli/commands/transfer/command.js.map +1 -1
- package/dist/src/cli/commands/transfer/command.mjs +6 -1
- package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
- package/dist/src/cli/utils/commander.js +3 -1
- package/dist/src/cli/utils/commander.js.map +1 -1
- package/dist/src/cli/utils/commander.mjs +3 -1
- package/dist/src/cli/utils/commander.mjs.map +1 -1
- package/dist/src/cli/utils/get-inquirer.js +10 -0
- package/dist/src/cli/utils/get-inquirer.js.map +1 -0
- package/dist/src/cli/utils/get-inquirer.mjs +8 -0
- package/dist/src/cli/utils/get-inquirer.mjs.map +1 -0
- package/dist/src/cli/utils/helpers.js +0 -1
- package/dist/src/cli/utils/helpers.js.map +1 -1
- package/dist/src/cli/utils/helpers.mjs +0 -1
- package/dist/src/cli/utils/helpers.mjs.map +1 -1
- package/package.json +22 -22
|
@@ -1,20 +1,22 @@
|
|
|
1
|
+
import { statSync } from 'fs';
|
|
1
2
|
import path from 'path';
|
|
2
3
|
import { createCommand, Option } from 'commander';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
4
|
import { excludeOption, onlyOption, throttleOption, validateExcludeOnly } from '../../utils/data-transfer.mjs';
|
|
5
5
|
import { forceOption, getCommanderConfirmMessage } from '../../utils/commander.mjs';
|
|
6
6
|
import { exitWith } from '../../utils/helpers.mjs';
|
|
7
|
+
import { getInquirer } from '../../utils/get-inquirer.mjs';
|
|
7
8
|
import action from './action.mjs';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* `$ strapi import`
|
|
11
12
|
*/ const command = ()=>{
|
|
12
|
-
return createCommand('import').description('Import data from file to Strapi').allowExcessArguments(false).requiredOption('-f, --file <file>', 'path
|
|
13
|
+
return createCommand('import').description('Import data from file to Strapi').allowExcessArguments(false).requiredOption('-f, --file <file>', 'path to a Strapi export (.tar[.gz][.enc]) or to an unpacked export directory').addOption(new Option('-k, --key <string>', 'Provide encryption key in command instead of using the prompt')).addOption(new Option('--verbose', 'Enable verbose logs')).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(throttleOption).hook('preAction', validateExcludeOnly).hook('preAction', async (thisCommand)=>{
|
|
13
14
|
const opts = thisCommand.opts();
|
|
14
15
|
const ext = path.extname(String(opts.file));
|
|
15
16
|
// check extension to guess if we should prompt for key
|
|
16
17
|
if (ext === '.enc') {
|
|
17
18
|
if (!opts.key) {
|
|
19
|
+
const inquirer = await getInquirer();
|
|
18
20
|
const answers = await inquirer.prompt([
|
|
19
21
|
{
|
|
20
22
|
type: 'password',
|
|
@@ -28,11 +30,23 @@ import action from './action.mjs';
|
|
|
28
30
|
opts.key = answers.key;
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
|
-
})// set decrypt and decompress options based on filename
|
|
33
|
+
})// set decrypt and decompress options based on filename (archive only)
|
|
32
34
|
.hook('preAction', (thisCommand)=>{
|
|
33
35
|
const opts = thisCommand.opts();
|
|
36
|
+
const filePath = String(opts.file);
|
|
37
|
+
let isDirectory = false;
|
|
38
|
+
try {
|
|
39
|
+
isDirectory = statSync(filePath).isDirectory();
|
|
40
|
+
} catch {
|
|
41
|
+
// missing path or unreadable — let the transfer fail later with a clear error
|
|
42
|
+
}
|
|
43
|
+
if (isDirectory) {
|
|
44
|
+
thisCommand.opts().decrypt = false;
|
|
45
|
+
thisCommand.opts().decompress = false;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
34
48
|
const { extname, parse } = path;
|
|
35
|
-
let file =
|
|
49
|
+
let file = filePath;
|
|
36
50
|
if (extname(file) === '.enc') {
|
|
37
51
|
file = parse(file).name; // trim the .enc extension
|
|
38
52
|
thisCommand.opts().decrypt = true;
|
|
@@ -46,7 +60,7 @@ import action from './action.mjs';
|
|
|
46
60
|
thisCommand.opts().decompress = false;
|
|
47
61
|
}
|
|
48
62
|
if (extname(file) !== '.tar') {
|
|
49
|
-
exitWith(1, `The file '${opts.file}' does not appear to be a valid Strapi data file.
|
|
63
|
+
exitWith(1, `The file '${opts.file}' does not appear to be a valid Strapi data file. Use a path ending in .tar[.gz][.enc], or an existing directory that contains an unpacked export (e.g. metadata.json).`);
|
|
50
64
|
}
|
|
51
65
|
}).hook('preAction', getCommanderConfirmMessage('The import will delete your existing data! Are you sure you want to proceed?', {
|
|
52
66
|
failMessage: 'Import process aborted'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.mjs","sources":["../../../../../src/cli/commands/import/command.ts"],"sourcesContent":["import path from 'path';\nimport { createCommand, Option } from 'commander';\nimport
|
|
1
|
+
{"version":3,"file":"command.mjs","sources":["../../../../../src/cli/commands/import/command.ts"],"sourcesContent":["import { statSync } from 'fs';\nimport path from 'path';\nimport { createCommand, Option } from 'commander';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\nimport { getCommanderConfirmMessage, forceOption } from '../../utils/commander';\nimport { exitWith } from '../../utils/helpers';\nimport { getInquirer } from '../../utils/get-inquirer';\nimport action from './action';\n\n/**\n * `$ strapi import`\n */\nconst command = () => {\n return (\n createCommand('import')\n .description('Import data from file to Strapi')\n .allowExcessArguments(false)\n .requiredOption(\n '-f, --file <file>',\n 'path to a Strapi export (.tar[.gz][.enc]) or to an unpacked export directory'\n )\n .addOption(\n new Option(\n '-k, --key <string>',\n 'Provide encryption key in command instead of using the prompt'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts();\n const ext = path.extname(String(opts.file));\n\n // check extension to guess if we should prompt for key\n if (ext === '.enc') {\n if (!opts.key) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your decryption key',\n name: 'key',\n },\n ]);\n if (!answers.key?.length) {\n exitWith(1, 'No key entered, aborting import.');\n }\n opts.key = answers.key;\n }\n }\n })\n // set decrypt and decompress options based on filename (archive only)\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n const filePath = String(opts.file);\n\n let isDirectory = false;\n try {\n isDirectory = statSync(filePath).isDirectory();\n } catch {\n // missing path or unreadable — let the transfer fail later with a clear error\n }\n\n if (isDirectory) {\n thisCommand.opts().decrypt = false;\n thisCommand.opts().decompress = false;\n return;\n }\n\n const { extname, parse } = path;\n\n let file = filePath;\n\n if (extname(file) === '.enc') {\n file = parse(file).name; // trim the .enc extension\n thisCommand.opts().decrypt = true;\n } else {\n thisCommand.opts().decrypt = false;\n }\n\n if (extname(file) === '.gz') {\n file = parse(file).name; // trim the .gz extension\n thisCommand.opts().decompress = true;\n } else {\n thisCommand.opts().decompress = false;\n }\n\n if (extname(file) !== '.tar') {\n exitWith(\n 1,\n `The file '${opts.file}' does not appear to be a valid Strapi data file. Use a path ending in .tar[.gz][.enc], or an existing directory that contains an unpacked export (e.g. metadata.json).`\n );\n }\n })\n .hook(\n 'preAction',\n getCommanderConfirmMessage(\n 'The import will delete your existing data! Are you sure you want to proceed?',\n { failMessage: 'Import process aborted' }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["command","createCommand","description","allowExcessArguments","requiredOption","addOption","Option","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","thisCommand","opts","ext","path","extname","String","file","key","inquirer","getInquirer","answers","prompt","type","message","name","length","exitWith","filePath","isDirectory","statSync","decrypt","decompress","parse","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var inquirer = require('inquirer');
|
|
4
3
|
var commander = require('commander');
|
|
5
4
|
var commander$1 = require('../../utils/commander.js');
|
|
5
|
+
var getInquirer = require('../../utils/get-inquirer.js');
|
|
6
6
|
var helpers = require('../../utils/helpers.js');
|
|
7
7
|
var dataTransfer = require('../../utils/data-transfer.js');
|
|
8
8
|
var action = require('./action.js');
|
|
@@ -45,6 +45,7 @@ var action = require('./action.js');
|
|
|
45
45
|
if (opts.to) {
|
|
46
46
|
return 'to';
|
|
47
47
|
}
|
|
48
|
+
const inquirer = await getInquirer.getInquirer();
|
|
48
49
|
const { dir } = await inquirer.prompt([
|
|
49
50
|
{
|
|
50
51
|
type: 'list',
|
|
@@ -71,6 +72,7 @@ var action = require('./action.js');
|
|
|
71
72
|
if (process.env.STRAPI_TRANSFER_URL) {
|
|
72
73
|
return new URL(process.env.STRAPI_TRANSFER_URL);
|
|
73
74
|
}
|
|
75
|
+
const inquirer = await getInquirer.getInquirer();
|
|
74
76
|
const answer = await inquirer.prompt([
|
|
75
77
|
{
|
|
76
78
|
type: 'input',
|
|
@@ -102,6 +104,7 @@ var action = require('./action.js');
|
|
|
102
104
|
if (process.env.STRAPI_TRANSFER_TOKEN) {
|
|
103
105
|
return process.env.STRAPI_TRANSFER_TOKEN;
|
|
104
106
|
}
|
|
107
|
+
const inquirer = await getInquirer.getInquirer();
|
|
105
108
|
const answer = await inquirer.prompt([
|
|
106
109
|
{
|
|
107
110
|
type: 'password',
|
|
@@ -128,6 +131,7 @@ var action = require('./action.js');
|
|
|
128
131
|
'http:'
|
|
129
132
|
]);
|
|
130
133
|
if (!thisCommand.opts().fromToken) {
|
|
134
|
+
const inquirer = await getInquirer.getInquirer();
|
|
131
135
|
const answers = await inquirer.prompt([
|
|
132
136
|
{
|
|
133
137
|
type: 'password',
|
|
@@ -150,6 +154,7 @@ var action = require('./action.js');
|
|
|
150
154
|
'http:'
|
|
151
155
|
]);
|
|
152
156
|
if (!thisCommand.opts().toToken) {
|
|
157
|
+
const inquirer = await getInquirer.getInquirer();
|
|
153
158
|
const answers = await inquirer.prompt([
|
|
154
159
|
{
|
|
155
160
|
type: 'password',
|
|
@@ -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 async (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(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n 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 'from';\n }\n if (opts.to) {\n return '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 )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (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 async (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 { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { getInquirer } from '../../utils/get-inquirer';\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 async (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(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n 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 'from';\n }\n if (opts.to) {\n return 'to';\n }\n\n const inquirer = await getInquirer();\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 inquirer = await getInquirer();\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 inquirer = await getInquirer();\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 )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const inquirer = await getInquirer();\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 async (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const inquirer = await getInquirer();\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","inquirer","getInquirer","dir","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":";;;;;;;;;AAaA;;AAEC,UACKA,OAAAA,GAAU,IAAA;IACd,OACEC,uBAAAA,CAAc,YACXC,WAAW,CAAC,4CACZC,oBAAoB,CAAC,KAAA,CAAA,CACrBC,SAAS,CACR,IAAIC,iBACF,oBAAA,EACA,CAAC,kDAAkD,CAAC,CAAA,CACpDC,SAAS,CAACC,oBAAAA,CAAAA,CAAAA,CAEbH,SAAS,CAAC,IAAIC,gBAAAA,CAAO,sBAAA,EAAwB,CAAC,2CAA2C,CAAC,GAC1FD,SAAS,CACR,IAAIC,gBAAAA,CACF,uBAAA,EACA,CAAC,iDAAiD,CAAC,CAAA,CACnDC,SAAS,CAACC,oBAAAA,CAAAA,CAAAA,CAGbH,SAAS,CACR,IAAIC,gBAAAA,CAAO,sBAAsB,CAAC,gDAAgD,CAAC,CAAA,CAAA,CAEpFD,SAAS,CAAC,IAAIC,gBAAAA,CAAO,WAAA,EAAa,wBAClCD,SAAS,CAACI,yBACVJ,SAAS,CAACK,0BAAAA,CAAAA,CACVL,SAAS,CAACM,uBAAAA,CAAAA,CACVN,SAAS,CAACO,2BAAAA,CAAAA,CACVC,IAAI,CAAC,WAAA,EAAaC,gCAAAA,CAAAA,CAClBD,IAAI,CACH,WAAA,EACAE,iBAAAA,CACE,OAAOC,IAAAA,GACJA,KAAKC,IAAI,IAAID,IAAAA,CAAKE,EAAE,IAAMF,IAAAA,CAAKC,IAAI,IAAID,IAAAA,CAAKG,OAAO,IAAMH,IAAAA,CAAKE,EAAE,IAAIF,IAAAA,CAAKI,SAAS,EACrF,UACEC,gBAAAA,CAAS,CAAA,EAAG,8EAGjBR,IAAI,CACH,WAAA,EACAE,iBAAAA;IAEE,OAAOC,IAAAA,GAAS,CAACA,IAAAA,CAAKC,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EACtC,OAAOI,WAAAA,GAAAA;QACL,MAAMN,IAAAA,GAAOM,YAAYN,IAAI,EAAA;AAC7B,QAAA,MAAMO,SAAAA,GAAYC,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACjD,QAAA,MAAMC,WAAAA,GAAcH,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAErD,QAAA,MAAMC,gBAAAA,GAAmB,IAAA;AACvBC,YAAAA,OAAAA,CAAQC,IAAI,CACV,2FAAA,CAAA;AAEJ,QAAA,CAAA;AAEA,QAAA,MAAMC,uBAAAA,GAA0B,IAAA;YAC9B,IAAI,CAACT,SAAAA,IAAa,CAACI,WAAAA,EAAa;AAC9BG,gBAAAA,OAAAA,CAAQC,IAAI,CAAC,8DAAA,CAAA;AACbD,gBAAAA,OAAAA,CAAQC,IAAI,CACV,kIAAA,CAAA;AAEF,gBAAA;AACF,YAAA;AAEAD,YAAAA,OAAAA,CAAQC,IAAI,CAAC,uDAAA,CAAA;AAEb,YAAA,IAAIR,SAAAA,EAAW;AACbO,gBAAAA,OAAAA,CAAQC,IAAI,CACV,CAAC,sCAAsC,EAAER,SAAAA,CAAU,kCAAkC,CAAC,CAAA;AAE1F,YAAA;AAEA,YAAA,IAAII,WAAAA,EAAa;AACfG,gBAAAA,OAAAA,CAAQC,IAAI,CACV,iFAAA,CAAA;AAEJ,YAAA;YAEAD,OAAAA,CAAQC,IAAI;AACd,QAAA,CAAA;AAEA,QAAA,MAAME,kBAAAA,GAAqB,UAAA;;AAEzB,YAAA,IAAI,CAACjB,IAAAA,CAAKC,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EAAE;AAC1BW,gBAAAA,gBAAAA,EAAAA;AACF,YAAA;AAEAG,YAAAA,uBAAAA,EAAAA;YAEA,IAAIhB,IAAAA,CAAKC,IAAI,EAAE;gBACb,OAAO,MAAA;AACT,YAAA;YACA,IAAID,IAAAA,CAAKE,EAAE,EAAE;gBACX,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMgB,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAMF,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,MAAA;oBACNC,IAAAA,EAAM,KAAA;oBACNC,OAAAA,EAAS,4BAAA;oBACTC,OAAAA,EAAS;AACP,wBAAA;4BAAEF,IAAAA,EAAM,uCAAA;4BAAyCG,KAAAA,EAAO;AAAO,yBAAA;AAC/D,wBAAA;4BAAEH,IAAAA,EAAM,kCAAA;4BAAoCG,KAAAA,EAAO;AAAK;AACzD;AACH;AACD,aAAA,CAAA;YAED,OAAON,GAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMO,eAAe,OAAOC,SAAAA,GAAAA;YAC1B,IAAI5B,IAAI,CAAC4B,SAAAA,CAAU,EAAE;AACnB,gBAAA,OAAO,IAAIC,GAAAA,CAAI7B,IAAI,CAAC4B,SAAAA,CAAU,CAAA;AAChC,YAAA;AAEA,YAAA,IAAIpB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB,EAAE;AACnC,gBAAA,OAAO,IAAImB,GAAAA,CAAIrB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB,CAAA;AAChD,YAAA;AAEA,YAAA,MAAMQ,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMW,MAAAA,GAAS,MAAMZ,QAAAA,CAASG,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAAA,EAAM,OAAA;oBACNC,IAAAA,EAAM,WAAA;oBACNC,OAAAA,EAAS,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,eAAA,GAAkB,cAAA,CAAe,CAAC,CAAC;oBACrHG,OAAAA,EAASvB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACxCsB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI;4BACF,MAAMC,GAAAA,GAAM,IAAIL,GAAAA,CAAII,KAAAA,CAAAA;AACpB,4BAAA,IAAI,CAAC;AAAC,gCAAA,OAAA;AAAS,gCAAA;AAAS,6BAAA,CAACE,QAAQ,CAACD,GAAAA,CAAIE,QAAQ,CAAA,EAAG;gCAC/C,OAAO,uCAAA;AACT,4BAAA;4BACA,OAAO,IAAA;AACT,wBAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;4BACd,OAAO,2FAAA;AACT,wBAAA;AACF,oBAAA;AACF;AACD,aAAA,CAAA;YAED,OAAO,IAAIR,GAAAA,CAAIC,MAAAA,CAAOQ,SAAS,CAAA;AACjC,QAAA,CAAA;AAEA,QAAA,MAAMC,iBAAiB,OAAOX,SAAAA,GAAAA;AAC5B,YAAA,IAAI5B,IAAI,CAAC,CAAA,EAAG4B,UAAU,KAAK,CAAC,CAAC,EAAE;AAC7B,gBAAA,OAAO5B,IAAI,CAAC,CAAA,EAAG4B,SAAAA,CAAU,KAAK,CAAC,CAAC;AAClC,YAAA;AAEA,YAAA,IAAIpB,OAAAA,CAAQC,GAAG,CAACG,qBAAqB,EAAE;gBACrC,OAAOJ,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1C,YAAA;AAEA,YAAA,MAAMM,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMW,MAAAA,GAAS,MAAMZ,QAAAA,CAASG,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNC,IAAAA,EAAM,OAAA;oBACNC,OAAAA,EAAS,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,QAAA,GAAW,aAAA,CAAc,CAAC,CAAC;oBAC7GG,OAAAA,EAASvB,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1CoB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI,CAACA,OAAOO,MAAAA,EAAQ;4BAClB,OAAO,4BAAA;AACT,wBAAA;wBACA,OAAO,IAAA;AACT,oBAAA;AACF;AACD,aAAA,CAAA;AAED,YAAA,OAAOV,OAAOW,KAAK;AACrB,QAAA,CAAA;AAEA,QAAA,MAAMb,YAAY,MAAMX,kBAAAA,EAAAA;AACxBjB,QAAAA,IAAI,CAAC4B,SAAAA,CAAU,GAAG,MAAMD,YAAAA,CAAaC,SAAAA,CAAAA;QACrC5B,IAAI,CAAC,GAAG4B,SAAAA,CAAU,KAAK,CAAC,CAAC,GAAG,MAAMW,cAAAA,CAAeX,SAAAA,CAAAA;AACnD,IAAA,CAAA,CAAA,CAGJ;KACC/B,IAAI,CACH,aACAE,iBAAAA,CACE,OAAOC,OAASA,IAAAA,CAAKC,IAAI,EACzB,OAAOK,WAAAA,GAAAA;AACLoC,QAAAA,4BAAAA,CAAqBpC,WAAAA,CAAYN,IAAI,EAAA,CAAGC,IAAI,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AACjE,QAAA,IAAI,CAACK,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,EAAE;AACjC,YAAA,MAAMc,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMwB,OAAAA,GAAU,MAAMzB,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNE,OAAAA,EAAS,+DAAA;oBACTD,IAAAA,EAAM;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQvC,SAAS,EAAEoC,MAAAA,EAAQ;AAC9BnC,gBAAAA,gBAAAA,CAAS,CAAA,EAAG,yDAAA,CAAA;AACd,YAAA;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,GAAGuC,QAAQvC,SAAS;AAClD,QAAA;AAEA,QAAA,MAAMwC,uCACJ,0GAAA,EACA;YAAEC,WAAAA,EAAa;SAA2B,CAAA,CAC1CvC,WAAAA,CAAAA;AACJ,IAAA,CAAA,CAAA,CAGJ;KACCT,IAAI,CACH,aACAE,iBAAAA,CACE,OAAOC,OAASA,IAAAA,CAAKE,EAAE,EACvB,OAAOI,WAAAA,GAAAA;AACLoC,QAAAA,4BAAAA,CAAqBpC,WAAAA,CAAYN,IAAI,EAAA,CAAGE,EAAE,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AAC/D,QAAA,IAAI,CAACI,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,EAAE;AAC/B,YAAA,MAAMe,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMwB,OAAAA,GAAU,MAAMzB,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNE,OAAAA,EAAS,oEAAA;oBACTD,IAAAA,EAAM;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQxC,OAAO,EAAEqC,MAAAA,EAAQ;AAC5BnC,gBAAAA,gBAAAA,CAAS,CAAA,EAAG,8DAAA,CAAA;AACd,YAAA;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,GAAGwC,QAAQxC,OAAO;AAC9C,QAAA;AAEA,QAAA,MAAMyC,uCACJ,kGAAA,EACA;YAAEC,WAAAA,EAAa;SAA2B,CAAA,CAC1CvC,WAAAA,CAAAA;AACJ,IAAA,CAAA,CAAA,CAAA,CAGHwC,MAAM,CAACA,MAAAA,CAAAA;AAEd;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import inquirer from 'inquirer';
|
|
2
1
|
import { createCommand, Option } from 'commander';
|
|
3
2
|
import { parseURL, forceOption, getCommanderConfirmMessage } from '../../utils/commander.mjs';
|
|
3
|
+
import { getInquirer } from '../../utils/get-inquirer.mjs';
|
|
4
4
|
import { ifOptions, exitWith, assertUrlHasProtocol } from '../../utils/helpers.mjs';
|
|
5
5
|
import { excludeOption, onlyOption, throttleOption, validateExcludeOnly } from '../../utils/data-transfer.mjs';
|
|
6
6
|
import action from './action.mjs';
|
|
@@ -43,6 +43,7 @@ import action from './action.mjs';
|
|
|
43
43
|
if (opts.to) {
|
|
44
44
|
return 'to';
|
|
45
45
|
}
|
|
46
|
+
const inquirer = await getInquirer();
|
|
46
47
|
const { dir } = await inquirer.prompt([
|
|
47
48
|
{
|
|
48
49
|
type: 'list',
|
|
@@ -69,6 +70,7 @@ import action from './action.mjs';
|
|
|
69
70
|
if (process.env.STRAPI_TRANSFER_URL) {
|
|
70
71
|
return new URL(process.env.STRAPI_TRANSFER_URL);
|
|
71
72
|
}
|
|
73
|
+
const inquirer = await getInquirer();
|
|
72
74
|
const answer = await inquirer.prompt([
|
|
73
75
|
{
|
|
74
76
|
type: 'input',
|
|
@@ -100,6 +102,7 @@ import action from './action.mjs';
|
|
|
100
102
|
if (process.env.STRAPI_TRANSFER_TOKEN) {
|
|
101
103
|
return process.env.STRAPI_TRANSFER_TOKEN;
|
|
102
104
|
}
|
|
105
|
+
const inquirer = await getInquirer();
|
|
103
106
|
const answer = await inquirer.prompt([
|
|
104
107
|
{
|
|
105
108
|
type: 'password',
|
|
@@ -126,6 +129,7 @@ import action from './action.mjs';
|
|
|
126
129
|
'http:'
|
|
127
130
|
]);
|
|
128
131
|
if (!thisCommand.opts().fromToken) {
|
|
132
|
+
const inquirer = await getInquirer();
|
|
129
133
|
const answers = await inquirer.prompt([
|
|
130
134
|
{
|
|
131
135
|
type: 'password',
|
|
@@ -148,6 +152,7 @@ import action from './action.mjs';
|
|
|
148
152
|
'http:'
|
|
149
153
|
]);
|
|
150
154
|
if (!thisCommand.opts().toToken) {
|
|
155
|
+
const inquirer = await getInquirer();
|
|
151
156
|
const answers = await inquirer.prompt([
|
|
152
157
|
{
|
|
153
158
|
type: 'password',
|
|
@@ -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 async (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(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n 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 'from';\n }\n if (opts.to) {\n return '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 )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (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 async (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 { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { getInquirer } from '../../utils/get-inquirer';\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 async (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(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n 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 'from';\n }\n if (opts.to) {\n return 'to';\n }\n\n const inquirer = await getInquirer();\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 inquirer = await getInquirer();\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 inquirer = await getInquirer();\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 )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const inquirer = await getInquirer();\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 async (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const inquirer = await getInquirer();\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","inquirer","getInquirer","dir","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,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var inquirer = require('inquirer');
|
|
4
3
|
var commander = require('commander');
|
|
5
4
|
var chalk = require('chalk');
|
|
6
5
|
var fp = require('lodash/fp');
|
|
7
6
|
var helpers = require('./helpers.js');
|
|
7
|
+
var getInquirer = require('./get-inquirer.js');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* argParser: Parse a comma-delimited string as an array
|
|
@@ -63,6 +63,7 @@ var helpers = require('./helpers.js');
|
|
|
63
63
|
// if encrypt==true but we have no key, prompt for it
|
|
64
64
|
if (opts.encrypt && !(opts.key && opts.key.length > 0)) {
|
|
65
65
|
try {
|
|
66
|
+
const inquirer = await getInquirer.getInquirer();
|
|
66
67
|
const answers = await inquirer.prompt([
|
|
67
68
|
{
|
|
68
69
|
type: 'password',
|
|
@@ -102,6 +103,7 @@ const confirmMessage = async (message, { force } = {})=>{
|
|
|
102
103
|
console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);
|
|
103
104
|
return true;
|
|
104
105
|
}
|
|
106
|
+
const inquirer = await getInquirer.getInquirer();
|
|
105
107
|
const answers = await inquirer.prompt([
|
|
106
108
|
{
|
|
107
109
|
type: 'confirm',
|
|
@@ -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
|
|
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 { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\nimport { getInquirer } from './get-inquirer';\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 inquirer = await getInquirer();\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 inquirer = await getInquirer();\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","inquirer","getInquirer","answers","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,8 +1,8 @@
|
|
|
1
|
-
import inquirer from 'inquirer';
|
|
2
1
|
import { Option, InvalidOptionArgumentError } from 'commander';
|
|
3
2
|
import chalk from 'chalk';
|
|
4
3
|
import { isNaN } from 'lodash/fp';
|
|
5
4
|
import { exitWith } from './helpers.mjs';
|
|
5
|
+
import { getInquirer } from './get-inquirer.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* argParser: Parse a comma-delimited string as an array
|
|
@@ -61,6 +61,7 @@ import { exitWith } from './helpers.mjs';
|
|
|
61
61
|
// if encrypt==true but we have no key, prompt for it
|
|
62
62
|
if (opts.encrypt && !(opts.key && opts.key.length > 0)) {
|
|
63
63
|
try {
|
|
64
|
+
const inquirer = await getInquirer();
|
|
64
65
|
const answers = await inquirer.prompt([
|
|
65
66
|
{
|
|
66
67
|
type: 'password',
|
|
@@ -100,6 +101,7 @@ const confirmMessage = async (message, { force } = {})=>{
|
|
|
100
101
|
console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);
|
|
101
102
|
return true;
|
|
102
103
|
}
|
|
104
|
+
const inquirer = await getInquirer();
|
|
103
105
|
const answers = await inquirer.prompt([
|
|
104
106
|
{
|
|
105
107
|
type: 'confirm',
|
|
@@ -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
|
|
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 { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\nimport { getInquirer } from './get-inquirer';\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 inquirer = await getInquirer();\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 inquirer = await getInquirer();\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","inquirer","getInquirer","answers","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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
let cached;
|
|
4
|
+
/** Loads Inquirer v9 via dynamic import (CJS-safe) and caches the default export. */ async function getInquirer() {
|
|
5
|
+
cached ?? (cached = import('inquirer').then((m)=>m.default));
|
|
6
|
+
return cached;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
exports.getInquirer = getInquirer;
|
|
10
|
+
//# sourceMappingURL=get-inquirer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-inquirer.js","sources":["../../../../src/cli/utils/get-inquirer.ts"],"sourcesContent":["type InquirerAPI = typeof import('inquirer').default;\n\nlet cached: Promise<InquirerAPI> | undefined;\n\n/** Loads Inquirer v9 via dynamic import (CJS-safe) and caches the default export. */\nexport async function getInquirer(): Promise<InquirerAPI> {\n cached ??= import('inquirer').then((m) => m.default);\n return cached;\n}\n"],"names":["cached","getInquirer","then","m","default"],"mappings":";;AAEA,IAAIA,MAAAA;AAEJ,sFACO,eAAeC,WAAAA,GAAAA;IACpBD,MAAAA,KAAAA,MAAAA,GAAW,OAAO,UAAA,CAAA,CAAYE,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,OAAO,CAAA,CAAA;IACnD,OAAOJ,MAAAA;AACT;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
let cached;
|
|
2
|
+
/** Loads Inquirer v9 via dynamic import (CJS-safe) and caches the default export. */ async function getInquirer() {
|
|
3
|
+
cached ?? (cached = import('inquirer').then((m)=>m.default));
|
|
4
|
+
return cached;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export { getInquirer };
|
|
8
|
+
//# sourceMappingURL=get-inquirer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-inquirer.mjs","sources":["../../../../src/cli/utils/get-inquirer.ts"],"sourcesContent":["type InquirerAPI = typeof import('inquirer').default;\n\nlet cached: Promise<InquirerAPI> | undefined;\n\n/** Loads Inquirer v9 via dynamic import (CJS-safe) and caches the default export. */\nexport async function getInquirer(): Promise<InquirerAPI> {\n cached ??= import('inquirer').then((m) => m.default);\n return cached;\n}\n"],"names":["cached","getInquirer","then","m","default"],"mappings":"AAEA,IAAIA,MAAAA;AAEJ,sFACO,eAAeC,WAAAA,GAAAA;IACpBD,MAAAA,KAAAA,MAAAA,GAAW,OAAO,UAAA,CAAA,CAAYE,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,OAAO,CAAA,CAAA;IACnD,OAAOJ,MAAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\nimport { getInquirer } from './get-inquirer';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${parseFloat((bytes / bytesPerKb ** i).toFixed(decimals))} ${sizes[i].padStart(\n 2\n )}`;\n\n return result.padStart(padStart);\n};\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const inquirer = await getInquirer();\n const { confirmed } = await inquirer.prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["bytesPerKb","sizes","readableBytes","bytes","decimals","padStart","i","Math","floor","log","result","parseFloat","toFixed","exitWith","code","message","options","logger","console","prc","process","chalk","green","error","red","isString","isArray","forEach","msg","exit","assertUrlHasProtocol","url","protocol","toString","some","join","ifOptions","conditionCallback","isMetCallback","isNotMetCallback","command","opts","assertCwdContainsStrapiProject","name","logErrorAndExit","yellow","pkgJSON","require","cwd","has","err","runAction","action","args","Promise","resolve","then","catch"],"mappings":"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"}
|