{"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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"}