@strapi/strapi
Version:
An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite
1 lines • 14.9 kB
Source Map (JSON)
{"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":";;;;;;;AAaA;;AAEC,UACKA,OAAU,GAAA,IAAA;IACd,OACEC,aAAAA,CAAc,YACXC,WAAW,CAAC,4CACZC,oBAAoB,CAAC,KACrBC,CAAAA,CAAAA,SAAS,CACR,IAAIC,OACF,oBACA,EAAA,CAAC,kDAAkD,CAAC,CACpDC,CAAAA,SAAS,CAACC,QAEbH,CAAAA,CAAAA,CAAAA,SAAS,CAAC,IAAIC,MAAO,CAAA,sBAAA,EAAwB,CAAC,2CAA2C,CAAC,GAC1FD,SAAS,CACR,IAAIC,MACF,CAAA,uBAAA,EACA,CAAC,iDAAiD,CAAC,CAAA,CACnDC,SAAS,CAACC,QAAAA,CAAAA,CAAAA,CAGbH,SAAS,CACR,IAAIC,MAAAA,CAAO,sBAAsB,CAAC,gDAAgD,CAAC,CAAA,CAAA,CAEpFD,SAAS,CAAC,IAAIC,MAAO,CAAA,WAAA,EAAa,wBAClCD,SAAS,CAACI,aACVJ,SAAS,CAACK,aACVL,CAAAA,CAAAA,SAAS,CAACM,UAAAA,CAAAA,CACVN,SAAS,CAACO,cAAAA,CAAAA,CACVC,IAAI,CAAC,WAAaC,EAAAA,mBAAAA,CAAAA,CAClBD,IAAI,CACH,WAAA,EACAE,SACE,CAAA,CAACC,IACC,GAACA,KAAKC,IAAI,IAAID,KAAKE,EAAE,IAAMF,KAAKC,IAAI,IAAID,IAAKG,CAAAA,OAAO,IAAMH,IAAAA,CAAKE,EAAE,IAAIF,IAAAA,CAAKI,SAAS,EACrF,UACEC,QAAAA,CAAS,GAAG,0EAGjBR,CAAAA,CAAAA,CAAAA,CAAAA,IAAI,CAAC,WAAA,EAAa,OAAOS,WAAAA,GAAAA;QACxB,MAAMN,IAAAA,GAAOM,YAAYN,IAAI,EAAA;AAC7B,QAAA,MAAMO,SAAYC,GAAAA,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACjD,QAAA,MAAMC,WAAcH,GAAAA,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAErD,QAAA,MAAMC,gBAAmB,GAAA,IAAA;AACvBC,YAAAA,OAAAA,CAAQC,IAAI,CACV,2FAAA,CAAA;AAEJ,SAAA;AAEA,QAAA,MAAMC,uBAA0B,GAAA,IAAA;YAC9B,IAAI,CAACT,SAAa,IAAA,CAACI,WAAa,EAAA;AAC9BG,gBAAAA,OAAAA,CAAQC,IAAI,CAAC,8DAAA,CAAA;AACbD,gBAAAA,OAAAA,CAAQC,IAAI,CACV,kIAAA,CAAA;AAEF,gBAAA;AACF;AAEAD,YAAAA,OAAAA,CAAQC,IAAI,CAAC,uDAAA,CAAA;AAEb,YAAA,IAAIR,SAAW,EAAA;AACbO,gBAAAA,OAAAA,CAAQC,IAAI,CACV,CAAC,sCAAsC,EAAER,SAAAA,CAAU,kCAAkC,CAAC,CAAA;AAE1F;AAEA,YAAA,IAAII,WAAa,EAAA;AACfG,gBAAAA,OAAAA,CAAQC,IAAI,CACV,iFAAA,CAAA;AAEJ;YAEAD,OAAQC,CAAAA,IAAI;AACd,SAAA;AAEA,QAAA,MAAME,kBAAqB,GAAA,UAAA;;AAEzB,YAAA,IAAI,CAACjB,IAAKC,CAAAA,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EAAE;AAC1BW,gBAAAA,gBAAAA,EAAAA;AACF;AAEAG,YAAAA,uBAAAA,EAAAA;YAEA,IAAIhB,IAAAA,CAAKC,IAAI,EAAE;AACb,gBAAA,OAAOD,KAAKC,IAAI;AAClB;YACA,IAAID,IAAAA,CAAKE,EAAE,EAAE;AACX,gBAAA,OAAOF,KAAKE,EAAE;AAChB;AAEA,YAAA,MAAM,EAAEgB,GAAG,EAAE,GAAG,MAAMC,QAAAA,CAASC,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAM,EAAA,MAAA;oBACNC,IAAM,EAAA,KAAA;oBACNC,OAAS,EAAA,4BAAA;oBACTC,OAAS,EAAA;AACP,wBAAA;4BAAEF,IAAM,EAAA,uCAAA;4BAAyCG,KAAO,EAAA;AAAO,yBAAA;AAC/D,wBAAA;4BAAEH,IAAM,EAAA,kCAAA;4BAAoCG,KAAO,EAAA;AAAK;AACzD;AACH;AACD,aAAA,CAAA;YAED,OAAOP,GAAAA;AACT,SAAA;AAEA,QAAA,MAAMQ,eAAe,OAAOC,SAAAA,GAAAA;YAC1B,IAAI3B,IAAI,CAAC2B,SAAAA,CAAU,EAAE;AACnB,gBAAA,OAAO,IAAIC,GAAAA,CAAI5B,IAAI,CAAC2B,SAAU,CAAA,CAAA;AAChC;AAEA,YAAA,IAAInB,OAAQC,CAAAA,GAAG,CAACC,mBAAmB,EAAE;AACnC,gBAAA,OAAO,IAAIkB,GAAAA,CAAIpB,OAAQC,CAAAA,GAAG,CAACC,mBAAmB,CAAA;AAChD;AAEA,YAAA,MAAMmB,MAAS,GAAA,MAAMV,QAASC,CAAAA,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAM,EAAA,OAAA;oBACNC,IAAM,EAAA,WAAA;oBACNC,OAAS,EAAA,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,eAAkB,GAAA,cAAA,CAAe,CAAC,CAAC;oBACrHG,OAAStB,EAAAA,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACxCqB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI;4BACF,MAAMC,GAAAA,GAAM,IAAIL,GAAII,CAAAA,KAAAA,CAAAA;AACpB,4BAAA,IAAI,CAAC;AAAC,gCAAA,OAAA;AAAS,gCAAA;AAAS,6BAAA,CAACE,QAAQ,CAACD,GAAIE,CAAAA,QAAQ,CAAG,EAAA;gCAC/C,OAAO,uCAAA;AACT;4BACA,OAAO,IAAA;AACT,yBAAA,CAAE,OAAOC,KAAO,EAAA;4BACd,OAAO,2FAAA;AACT;AACF;AACF;AACD,aAAA,CAAA;YAED,OAAO,IAAIR,GAAIC,CAAAA,MAAAA,CAAOQ,SAAS,CAAA;AACjC,SAAA;AAEA,QAAA,MAAMC,iBAAiB,OAAOX,SAAAA,GAAAA;YAC5B,IAAI3B,IAAI,CAAC,CAAC,EAAE2B,UAAU,KAAK,CAAC,CAAC,EAAE;AAC7B,gBAAA,OAAO3B,IAAI,CAAC,CAAC,EAAE2B,SAAU,CAAA,KAAK,CAAC,CAAC;AAClC;AAEA,YAAA,IAAInB,OAAQC,CAAAA,GAAG,CAACG,qBAAqB,EAAE;gBACrC,OAAOJ,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1C;AAEA,YAAA,MAAMiB,MAAS,GAAA,MAAMV,QAASC,CAAAA,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAM,EAAA,UAAA;oBACNC,IAAM,EAAA,OAAA;oBACNC,OAAS,EAAA,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,QAAW,GAAA,aAAA,CAAc,CAAC,CAAC;oBAC7GG,OAAStB,EAAAA,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1CmB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI,CAACA,OAAOO,MAAQ,EAAA;4BAClB,OAAO,4BAAA;AACT;wBACA,OAAO,IAAA;AACT;AACF;AACD,aAAA,CAAA;AAED,YAAA,OAAOV,OAAOW,KAAK;AACrB,SAAA;AAEA,QAAA,MAAMb,YAAY,MAAMV,kBAAAA,EAAAA;AACxBjB,QAAAA,IAAI,CAAC2B,SAAAA,CAAU,GAAG,MAAMD,YAAaC,CAAAA,SAAAA,CAAAA;QACrC3B,IAAI,CAAC,CAAC,EAAE2B,SAAAA,CAAU,KAAK,CAAC,CAAC,GAAG,MAAMW,cAAeX,CAAAA,SAAAA,CAAAA;AACnD,KAAA,CACA;KACC9B,IAAI,CACH,aACAE,SACE,CAAA,CAACC,OAASA,IAAKC,CAAAA,IAAI,EACnB,OAAOK,WAAAA,GAAAA;AACLmC,QAAAA,oBAAAA,CAAqBnC,WAAYN,CAAAA,IAAI,EAAGC,CAAAA,IAAI,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AACjE,QAAA,IAAI,CAACK,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,EAAE;AACjC,YAAA,MAAMsC,OAAU,GAAA,MAAMvB,QAASC,CAAAA,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAM,EAAA,UAAA;oBACNE,OAAS,EAAA,+DAAA;oBACTD,IAAM,EAAA;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQtC,SAAS,EAAEmC,MAAQ,EAAA;AAC9BlC,gBAAAA,QAAAA,CAAS,CAAG,EAAA,yDAAA,CAAA;AACd;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,GAAGsC,QAAQtC,SAAS;AAClD;AAEA,QAAA,MAAMuC,2BACJ,0GACA,EAAA;YAAEC,WAAa,EAAA;SACftC,CAAAA,CAAAA,WAAAA,CAAAA;AACJ,KAAA,CAAA,CAGJ;KACCT,IAAI,CACH,aACAE,SACE,CAAA,CAACC,OAASA,IAAKE,CAAAA,EAAE,EACjB,OAAOI,WAAAA,GAAAA;AACLmC,QAAAA,oBAAAA,CAAqBnC,WAAYN,CAAAA,IAAI,EAAGE,CAAAA,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,MAAMuC,OAAU,GAAA,MAAMvB,QAASC,CAAAA,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAM,EAAA,UAAA;oBACNE,OAAS,EAAA,oEAAA;oBACTD,IAAM,EAAA;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQvC,OAAO,EAAEoC,MAAQ,EAAA;AAC5BlC,gBAAAA,QAAAA,CAAS,CAAG,EAAA,8DAAA,CAAA;AACd;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,GAAGuC,QAAQvC,OAAO;AAC9C;AAEA,QAAA,MAAMwC,2BACJ,kGACA,EAAA;YAAEC,WAAa,EAAA;SACftC,CAAAA,CAAAA,WAAAA,CAAAA;AACJ,KAAA,CAAA,CAAA,CAGHuC,MAAM,CAACA,MAAAA,CAAAA;AAEd;;;;"}