@strapi/upgrade 5.30.0 → 5.31.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/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/codemods.js.map +1 -1
- package/dist/src/cli/commands/codemods.mjs.map +1 -1
- package/dist/src/cli/options.js +0 -1
- package/dist/src/cli/options.js.map +1 -1
- package/dist/src/cli/options.mjs +0 -1
- package/dist/src/cli/options.mjs.map +1 -1
- package/dist/src/modules/codemod/codemod.js.map +1 -1
- package/dist/src/modules/codemod/codemod.mjs.map +1 -1
- package/dist/src/modules/codemod-repository/repository.js +0 -1
- package/dist/src/modules/codemod-repository/repository.js.map +1 -1
- package/dist/src/modules/codemod-repository/repository.mjs +0 -1
- package/dist/src/modules/codemod-repository/repository.mjs.map +1 -1
- package/dist/src/modules/codemod-runner/codemod-runner.js +0 -1
- package/dist/src/modules/codemod-runner/codemod-runner.js.map +1 -1
- package/dist/src/modules/codemod-runner/codemod-runner.mjs +0 -1
- package/dist/src/modules/codemod-runner/codemod-runner.mjs.map +1 -1
- package/dist/src/modules/error/utils.js.map +1 -1
- package/dist/src/modules/error/utils.mjs.map +1 -1
- package/dist/src/modules/file-scanner/scanner.js.map +1 -1
- package/dist/src/modules/file-scanner/scanner.mjs.map +1 -1
- package/dist/src/modules/format/formats.js.map +1 -1
- package/dist/src/modules/format/formats.mjs.map +1 -1
- package/dist/src/modules/json/file.js.map +1 -1
- package/dist/src/modules/json/file.mjs.map +1 -1
- package/dist/src/modules/json/transform-api.js.map +1 -1
- package/dist/src/modules/json/transform-api.mjs.map +1 -1
- package/dist/src/modules/logger/logger.js.map +1 -1
- package/dist/src/modules/logger/logger.mjs.map +1 -1
- package/dist/src/modules/npm/package.js +0 -1
- package/dist/src/modules/npm/package.js.map +1 -1
- package/dist/src/modules/npm/package.mjs +0 -1
- package/dist/src/modules/npm/package.mjs.map +1 -1
- package/dist/src/modules/project/constants.js.map +1 -1
- package/dist/src/modules/project/constants.mjs.map +1 -1
- package/dist/src/modules/project/project.js +2 -5
- package/dist/src/modules/project/project.js.map +1 -1
- package/dist/src/modules/project/project.mjs +2 -5
- package/dist/src/modules/project/project.mjs.map +1 -1
- package/dist/src/modules/requirement/requirement.js.map +1 -1
- package/dist/src/modules/requirement/requirement.mjs.map +1 -1
- package/dist/src/modules/runner/code/code.js +1 -2
- package/dist/src/modules/runner/code/code.js.map +1 -1
- package/dist/src/modules/runner/code/code.mjs +1 -2
- package/dist/src/modules/runner/code/code.mjs.map +1 -1
- package/dist/src/modules/runner/json/json.js +1 -2
- package/dist/src/modules/runner/json/json.js.map +1 -1
- package/dist/src/modules/runner/json/json.mjs +1 -2
- package/dist/src/modules/runner/json/json.mjs.map +1 -1
- package/dist/src/modules/runner/json/transform.js.map +1 -1
- package/dist/src/modules/runner/json/transform.mjs.map +1 -1
- package/dist/src/modules/runner/runner.js.map +1 -1
- package/dist/src/modules/runner/runner.mjs.map +1 -1
- package/dist/src/modules/timer/timer.js.map +1 -1
- package/dist/src/modules/timer/timer.mjs.map +1 -1
- package/dist/src/modules/upgrader/upgrader.js +0 -1
- package/dist/src/modules/upgrader/upgrader.js.map +1 -1
- package/dist/src/modules/upgrader/upgrader.mjs +0 -1
- package/dist/src/modules/upgrader/upgrader.mjs.map +1 -1
- package/dist/src/modules/version/range.js.map +1 -1
- package/dist/src/modules/version/range.mjs.map +1 -1
- package/dist/src/modules/version/types.js +5 -3
- package/dist/src/modules/version/types.js.map +1 -1
- package/dist/src/modules/version/types.mjs +3 -3
- package/dist/src/modules/version/types.mjs.map +1 -1
- package/dist/src/tasks/codemods/list-codemods.js.map +1 -1
- package/dist/src/tasks/codemods/list-codemods.mjs.map +1 -1
- package/dist/src/tasks/codemods/run-codemods.js.map +1 -1
- package/dist/src/tasks/codemods/run-codemods.mjs.map +1 -1
- package/dist/src/tasks/codemods/utils.js.map +1 -1
- package/dist/src/tasks/codemods/utils.mjs.map +1 -1
- package/dist/src/tasks/index.js +0 -1
- package/dist/src/tasks/index.js.map +1 -1
- package/dist/src/tasks/index.mjs +0 -1
- package/dist/src/tasks/index.mjs.map +1 -1
- package/dist/src/tasks/upgrade/prompts/latest.js.map +1 -1
- package/dist/src/tasks/upgrade/prompts/latest.mjs.map +1 -1
- package/dist/src/tasks/upgrade/requirements/major.js +0 -1
- package/dist/src/tasks/upgrade/requirements/major.js.map +1 -1
- package/dist/src/tasks/upgrade/requirements/major.mjs +0 -1
- package/dist/src/tasks/upgrade/requirements/major.mjs.map +1 -1
- package/dist/src/tasks/upgrade/upgrade.js.map +1 -1
- package/dist/src/tasks/upgrade/upgrade.mjs.map +1 -1
- package/package.json +5 -5
package/dist/package.json.js
CHANGED
package/dist/package.json.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemods.js","sources":["../../../../src/cli/commands/codemods.ts"],"sourcesContent":["import prompts from 'prompts';\n\nimport type { Command } from 'commander';\nimport { loggerFactory } from '../../modules/logger';\nimport { Version } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport { debugOption, dryOption, projectPathOption, rangeOption, silentOption } from '../options';\n\nimport type {\n CLIListCodemodsOptions,\n CLIRunCodemodsOptions,\n ListCodemodsCommand,\n RunCodemodsCommand,\n} from '../types';\nimport type { Codemod } from '../../modules/codemod';\n\nconst DEFAULT_TARGET = Version.ReleaseType.Major;\n\nexport const runCodemods: RunCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before running the codemods\"\n );\n\n const confirm = async (message: string) => {\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n const selectCodemods = async (codemods: Codemod.VersionedCollection[]) => {\n const selectableCodemods = codemods\n .map(({ version, codemods }) =>\n codemods.map((codemod) => ({\n title: `(${version}) ${codemod.format()}`,\n value: codemod,\n selected: true,\n }))\n )\n .flat();\n\n if (selectableCodemods.length === 0) {\n logger.info('No codemods to run');\n return [];\n }\n\n const { selectedCodemods }: { selectedCodemods: Codemod.Codemod[] } = await prompts({\n type: 'autocompleteMultiselect',\n name: 'selectedCodemods',\n message: 'Choose the codemods you would like to run:',\n choices: selectableCodemods,\n });\n\n if (!selectedCodemods || selectedCodemods.length === 0) {\n logger.info('No codemods selected');\n return [];\n }\n\n return selectedCodemods.map<Codemod.VersionedCollection>((codemod) => ({\n version: codemod.version,\n codemods: [codemod],\n }));\n };\n\n return tasks\n .runCodemods({\n logger,\n confirm,\n selectCodemods,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n uid: options.uid,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\nexport const listCodemods: ListCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n return tasks\n .listCodemods({\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n logger,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\n/**\n * Registers codemods related commands.\n */\nexport const register = (program: Command) => {\n const codemodsCommand = program.command('codemods');\n\n // upgrade codemods run [options] [uid]\n codemodsCommand\n .command('run [uid]')\n .description(\n `\nExecutes a set of codemods on the current project.\n\nIf the optional UID argument is provided, the command specifically runs the codemod associated with that UID.\nWithout the UID, the command produces a list of all available codemods for your project.\n\nBy default, when executed on a Strapi application project, it offers codemods matching the current major version of the app.\nWhen executed on a Strapi plugin project, it shows every codemods.\n`\n )\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (uid: string | undefined, options: CLIRunCodemodsOptions) => {\n return runCodemods({ ...options, uid });\n });\n\n // upgrade codemods ls [options]\n codemodsCommand\n .command('ls')\n .description(`List available codemods`)\n .addOption(projectPathOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (options: CLIListCodemodsOptions) => {\n return listCodemods(options);\n });\n};\n"],"names":["DEFAULT_TARGET","Version","Major","runCodemods","options","silent","debug","logger","loggerFactory","warn","confirm","message","prompts","name","type","selectCodemods","codemods","selectableCodemods","map","version","codemod","title","format","value","selected","flat","length","info","selectedCodemods","choices","tasks","dry","cwd","projectPath","target","range","uid","catch","err","handleError","listCodemods","register","program","codemodsCommand","command","description","addOption","projectPathOption","dryOption","debugOption","silentOption","rangeOption","action"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAMA,cAAiBC,GAAAA,iBAAmB,CAACC,KAAK;AAEzC,MAAMC,cAAkC,OAAOC,OAAAA,GAAAA;AACpD,IAAA,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGF,OAAAA;AAC1B,IAAA,MAAMG,WAASC,oBAAc,CAAA;AAAEH,QAAAA,MAAAA;AAAQC,QAAAA;AAAM,KAAA,CAAA;AAE7CC,IAAAA,QAAAA,CAAOE,IAAI,CACT,iGAAA,CAAA;AAGF,IAAA,MAAMC,UAAU,OAAOC,OAAAA,GAAAA;AACrB,QAAA,MAAM,EAAED,OAAO,EAAE,GAAG,MAAME,OAAQ,CAAA;YAChCC,IAAM,EAAA,SAAA;YACNC,IAAM,EAAA,SAAA;AACNH,YAAAA;AACF,SAAA,CAAA;;AAGA,QAAA,OAAOD,OAAW,IAAA,KAAA;AACpB,KAAA;AAEA,IAAA,MAAMK,iBAAiB,OAAOC,QAAAA,GAAAA;AAC5B,QAAA,MAAMC,qBAAqBD,QACxBE,CAAAA,GAAG,CAAC,CAAC,EAAEC,OAAO,EAAEH,QAAQ,EAAE,GACzBA,QAASE,CAAAA,GAAG,CAAC,CAACE,WAAa;oBACzBC,KAAO,EAAA,CAAC,CAAC,EAAEF,OAAAA,CAAQ,EAAE,EAAEC,OAAAA,CAAQE,MAAM,
|
|
1
|
+
{"version":3,"file":"codemods.js","sources":["../../../../src/cli/commands/codemods.ts"],"sourcesContent":["import prompts from 'prompts';\n\nimport type { Command } from 'commander';\nimport { loggerFactory } from '../../modules/logger';\nimport { Version } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport { debugOption, dryOption, projectPathOption, rangeOption, silentOption } from '../options';\n\nimport type {\n CLIListCodemodsOptions,\n CLIRunCodemodsOptions,\n ListCodemodsCommand,\n RunCodemodsCommand,\n} from '../types';\nimport type { Codemod } from '../../modules/codemod';\n\nconst DEFAULT_TARGET = Version.ReleaseType.Major;\n\nexport const runCodemods: RunCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before running the codemods\"\n );\n\n const confirm = async (message: string) => {\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n const selectCodemods = async (codemods: Codemod.VersionedCollection[]) => {\n const selectableCodemods = codemods\n .map(({ version, codemods }) =>\n codemods.map((codemod) => ({\n title: `(${version}) ${codemod.format()}`,\n value: codemod,\n selected: true,\n }))\n )\n .flat();\n\n if (selectableCodemods.length === 0) {\n logger.info('No codemods to run');\n return [];\n }\n\n const { selectedCodemods }: { selectedCodemods: Codemod.Codemod[] } = await prompts({\n type: 'autocompleteMultiselect',\n name: 'selectedCodemods',\n message: 'Choose the codemods you would like to run:',\n choices: selectableCodemods,\n });\n\n if (!selectedCodemods || selectedCodemods.length === 0) {\n logger.info('No codemods selected');\n return [];\n }\n\n return selectedCodemods.map<Codemod.VersionedCollection>((codemod) => ({\n version: codemod.version,\n codemods: [codemod],\n }));\n };\n\n return tasks\n .runCodemods({\n logger,\n confirm,\n selectCodemods,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n uid: options.uid,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\nexport const listCodemods: ListCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n return tasks\n .listCodemods({\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n logger,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\n/**\n * Registers codemods related commands.\n */\nexport const register = (program: Command) => {\n const codemodsCommand = program.command('codemods');\n\n // upgrade codemods run [options] [uid]\n codemodsCommand\n .command('run [uid]')\n .description(\n `\nExecutes a set of codemods on the current project.\n\nIf the optional UID argument is provided, the command specifically runs the codemod associated with that UID.\nWithout the UID, the command produces a list of all available codemods for your project.\n\nBy default, when executed on a Strapi application project, it offers codemods matching the current major version of the app.\nWhen executed on a Strapi plugin project, it shows every codemods.\n`\n )\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (uid: string | undefined, options: CLIRunCodemodsOptions) => {\n return runCodemods({ ...options, uid });\n });\n\n // upgrade codemods ls [options]\n codemodsCommand\n .command('ls')\n .description(`List available codemods`)\n .addOption(projectPathOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (options: CLIListCodemodsOptions) => {\n return listCodemods(options);\n });\n};\n"],"names":["DEFAULT_TARGET","Version","Major","runCodemods","options","silent","debug","logger","loggerFactory","warn","confirm","message","prompts","name","type","selectCodemods","codemods","selectableCodemods","map","version","codemod","title","format","value","selected","flat","length","info","selectedCodemods","choices","tasks","dry","cwd","projectPath","target","range","uid","catch","err","handleError","listCodemods","register","program","codemodsCommand","command","description","addOption","projectPathOption","dryOption","debugOption","silentOption","rangeOption","action"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemods.mjs","sources":["../../../../src/cli/commands/codemods.ts"],"sourcesContent":["import prompts from 'prompts';\n\nimport type { Command } from 'commander';\nimport { loggerFactory } from '../../modules/logger';\nimport { Version } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport { debugOption, dryOption, projectPathOption, rangeOption, silentOption } from '../options';\n\nimport type {\n CLIListCodemodsOptions,\n CLIRunCodemodsOptions,\n ListCodemodsCommand,\n RunCodemodsCommand,\n} from '../types';\nimport type { Codemod } from '../../modules/codemod';\n\nconst DEFAULT_TARGET = Version.ReleaseType.Major;\n\nexport const runCodemods: RunCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before running the codemods\"\n );\n\n const confirm = async (message: string) => {\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n const selectCodemods = async (codemods: Codemod.VersionedCollection[]) => {\n const selectableCodemods = codemods\n .map(({ version, codemods }) =>\n codemods.map((codemod) => ({\n title: `(${version}) ${codemod.format()}`,\n value: codemod,\n selected: true,\n }))\n )\n .flat();\n\n if (selectableCodemods.length === 0) {\n logger.info('No codemods to run');\n return [];\n }\n\n const { selectedCodemods }: { selectedCodemods: Codemod.Codemod[] } = await prompts({\n type: 'autocompleteMultiselect',\n name: 'selectedCodemods',\n message: 'Choose the codemods you would like to run:',\n choices: selectableCodemods,\n });\n\n if (!selectedCodemods || selectedCodemods.length === 0) {\n logger.info('No codemods selected');\n return [];\n }\n\n return selectedCodemods.map<Codemod.VersionedCollection>((codemod) => ({\n version: codemod.version,\n codemods: [codemod],\n }));\n };\n\n return tasks\n .runCodemods({\n logger,\n confirm,\n selectCodemods,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n uid: options.uid,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\nexport const listCodemods: ListCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n return tasks\n .listCodemods({\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n logger,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\n/**\n * Registers codemods related commands.\n */\nexport const register = (program: Command) => {\n const codemodsCommand = program.command('codemods');\n\n // upgrade codemods run [options] [uid]\n codemodsCommand\n .command('run [uid]')\n .description(\n `\nExecutes a set of codemods on the current project.\n\nIf the optional UID argument is provided, the command specifically runs the codemod associated with that UID.\nWithout the UID, the command produces a list of all available codemods for your project.\n\nBy default, when executed on a Strapi application project, it offers codemods matching the current major version of the app.\nWhen executed on a Strapi plugin project, it shows every codemods.\n`\n )\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (uid: string | undefined, options: CLIRunCodemodsOptions) => {\n return runCodemods({ ...options, uid });\n });\n\n // upgrade codemods ls [options]\n codemodsCommand\n .command('ls')\n .description(`List available codemods`)\n .addOption(projectPathOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (options: CLIListCodemodsOptions) => {\n return listCodemods(options);\n });\n};\n"],"names":["DEFAULT_TARGET","Version","Major","runCodemods","options","silent","debug","logger","loggerFactory","warn","confirm","message","prompts","name","type","selectCodemods","codemods","selectableCodemods","map","version","codemod","title","format","value","selected","flat","length","info","selectedCodemods","choices","tasks","dry","cwd","projectPath","target","range","uid","catch","err","handleError","listCodemods","register","program","codemodsCommand","command","description","addOption","projectPathOption","dryOption","debugOption","silentOption","rangeOption","action"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAMA,cAAiBC,GAAAA,WAAmB,CAACC,KAAK;AAEzC,MAAMC,cAAkC,OAAOC,OAAAA,GAAAA;AACpD,IAAA,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGF,OAAAA;AAC1B,IAAA,MAAMG,SAASC,aAAc,CAAA;AAAEH,QAAAA,MAAAA;AAAQC,QAAAA;AAAM,KAAA,CAAA;AAE7CC,IAAAA,MAAAA,CAAOE,IAAI,CACT,iGAAA,CAAA;AAGF,IAAA,MAAMC,UAAU,OAAOC,OAAAA,GAAAA;AACrB,QAAA,MAAM,EAAED,OAAO,EAAE,GAAG,MAAME,OAAQ,CAAA;YAChCC,IAAM,EAAA,SAAA;YACNC,IAAM,EAAA,SAAA;AACNH,YAAAA;AACF,SAAA,CAAA;;AAGA,QAAA,OAAOD,OAAW,IAAA,KAAA;AACpB,KAAA;AAEA,IAAA,MAAMK,iBAAiB,OAAOC,QAAAA,GAAAA;AAC5B,QAAA,MAAMC,qBAAqBD,QACxBE,CAAAA,GAAG,CAAC,CAAC,EAAEC,OAAO,EAAEH,QAAQ,EAAE,GACzBA,QAASE,CAAAA,GAAG,CAAC,CAACE,WAAa;oBACzBC,KAAO,EAAA,CAAC,CAAC,EAAEF,OAAAA,CAAQ,EAAE,EAAEC,OAAAA,CAAQE,MAAM,
|
|
1
|
+
{"version":3,"file":"codemods.mjs","sources":["../../../../src/cli/commands/codemods.ts"],"sourcesContent":["import prompts from 'prompts';\n\nimport type { Command } from 'commander';\nimport { loggerFactory } from '../../modules/logger';\nimport { Version } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport { debugOption, dryOption, projectPathOption, rangeOption, silentOption } from '../options';\n\nimport type {\n CLIListCodemodsOptions,\n CLIRunCodemodsOptions,\n ListCodemodsCommand,\n RunCodemodsCommand,\n} from '../types';\nimport type { Codemod } from '../../modules/codemod';\n\nconst DEFAULT_TARGET = Version.ReleaseType.Major;\n\nexport const runCodemods: RunCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before running the codemods\"\n );\n\n const confirm = async (message: string) => {\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n const selectCodemods = async (codemods: Codemod.VersionedCollection[]) => {\n const selectableCodemods = codemods\n .map(({ version, codemods }) =>\n codemods.map((codemod) => ({\n title: `(${version}) ${codemod.format()}`,\n value: codemod,\n selected: true,\n }))\n )\n .flat();\n\n if (selectableCodemods.length === 0) {\n logger.info('No codemods to run');\n return [];\n }\n\n const { selectedCodemods }: { selectedCodemods: Codemod.Codemod[] } = await prompts({\n type: 'autocompleteMultiselect',\n name: 'selectedCodemods',\n message: 'Choose the codemods you would like to run:',\n choices: selectableCodemods,\n });\n\n if (!selectedCodemods || selectedCodemods.length === 0) {\n logger.info('No codemods selected');\n return [];\n }\n\n return selectedCodemods.map<Codemod.VersionedCollection>((codemod) => ({\n version: codemod.version,\n codemods: [codemod],\n }));\n };\n\n return tasks\n .runCodemods({\n logger,\n confirm,\n selectCodemods,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n uid: options.uid,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\nexport const listCodemods: ListCodemodsCommand = async (options) => {\n const { silent, debug } = options;\n const logger = loggerFactory({ silent, debug });\n\n return tasks\n .listCodemods({\n cwd: options.projectPath,\n target: options.range ?? DEFAULT_TARGET,\n logger,\n })\n .catch((err) => handleError(err, options.silent));\n};\n\n/**\n * Registers codemods related commands.\n */\nexport const register = (program: Command) => {\n const codemodsCommand = program.command('codemods');\n\n // upgrade codemods run [options] [uid]\n codemodsCommand\n .command('run [uid]')\n .description(\n `\nExecutes a set of codemods on the current project.\n\nIf the optional UID argument is provided, the command specifically runs the codemod associated with that UID.\nWithout the UID, the command produces a list of all available codemods for your project.\n\nBy default, when executed on a Strapi application project, it offers codemods matching the current major version of the app.\nWhen executed on a Strapi plugin project, it shows every codemods.\n`\n )\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (uid: string | undefined, options: CLIRunCodemodsOptions) => {\n return runCodemods({ ...options, uid });\n });\n\n // upgrade codemods ls [options]\n codemodsCommand\n .command('ls')\n .description(`List available codemods`)\n .addOption(projectPathOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(rangeOption)\n .action(async (options: CLIListCodemodsOptions) => {\n return listCodemods(options);\n });\n};\n"],"names":["DEFAULT_TARGET","Version","Major","runCodemods","options","silent","debug","logger","loggerFactory","warn","confirm","message","prompts","name","type","selectCodemods","codemods","selectableCodemods","map","version","codemod","title","format","value","selected","flat","length","info","selectedCodemods","choices","tasks","dry","cwd","projectPath","target","range","uid","catch","err","handleError","listCodemods","register","program","codemodsCommand","command","description","addOption","projectPathOption","dryOption","debugOption","silentOption","rangeOption","action"],"mappings":"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"}
|
package/dist/src/cli/options.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var commander = require('commander');
|
|
4
4
|
require('semver');
|
|
5
|
-
require('../modules/version/types.js');
|
|
6
5
|
var range = require('../modules/version/range.js');
|
|
7
6
|
|
|
8
7
|
const projectPathOption = new commander.Option('-p, --project-path <project-path>', 'Root path to the Strapi application or plugin');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sources":["../../../src/cli/options.ts"],"sourcesContent":["import { InvalidArgumentError, Option } from 'commander';\nimport { isValidStringifiedRange, rangeFactory } from '../modules/version';\n\nexport const projectPathOption = new Option(\n '-p, --project-path <project-path>',\n 'Root path to the Strapi application or plugin'\n);\n\nexport const dryOption = new Option(\n '-n, --dry',\n 'Simulate the upgrade without updating any files'\n).default(false);\n\nexport const debugOption = new Option('-d, --debug', 'Get more logs in debug mode').default(false);\n\nexport const silentOption = new Option('-s, --silent', \"Don't log anything\").default(false);\n\nexport const autoConfirmOption = new Option(\n '-y, --yes',\n 'Automatically answer \"yes\" to any prompts that the CLI might print on the command line.'\n).default(false);\n\nexport const rangeOption = new Option(\n '-r, --range <range>',\n 'Use a custom semver range for the codemods execution.'\n).argParser((range) => {\n if (!isValidStringifiedRange(range)) {\n throw new InvalidArgumentError('Expected a valid semver range');\n }\n\n return rangeFactory(range);\n});\n"],"names":["projectPathOption","Option","dryOption","default","debugOption","silentOption","autoConfirmOption","rangeOption","argParser","range","isValidStringifiedRange","InvalidArgumentError","rangeFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"options.js","sources":["../../../src/cli/options.ts"],"sourcesContent":["import { InvalidArgumentError, Option } from 'commander';\nimport { isValidStringifiedRange, rangeFactory } from '../modules/version';\n\nexport const projectPathOption = new Option(\n '-p, --project-path <project-path>',\n 'Root path to the Strapi application or plugin'\n);\n\nexport const dryOption = new Option(\n '-n, --dry',\n 'Simulate the upgrade without updating any files'\n).default(false);\n\nexport const debugOption = new Option('-d, --debug', 'Get more logs in debug mode').default(false);\n\nexport const silentOption = new Option('-s, --silent', \"Don't log anything\").default(false);\n\nexport const autoConfirmOption = new Option(\n '-y, --yes',\n 'Automatically answer \"yes\" to any prompts that the CLI might print on the command line.'\n).default(false);\n\nexport const rangeOption = new Option(\n '-r, --range <range>',\n 'Use a custom semver range for the codemods execution.'\n).argParser((range) => {\n if (!isValidStringifiedRange(range)) {\n throw new InvalidArgumentError('Expected a valid semver range');\n }\n\n return rangeFactory(range);\n});\n"],"names":["projectPathOption","Option","dryOption","default","debugOption","silentOption","autoConfirmOption","rangeOption","argParser","range","isValidStringifiedRange","InvalidArgumentError","rangeFactory"],"mappings":";;;;;;AAGaA,MAAAA,iBAAAA,GAAoB,IAAIC,gBAAAA,CACnC,qCACA,+CACA;AAEK,MAAMC,YAAY,IAAID,gBAAAA,CAC3B,aACA,iDACAE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAEV,MAAMC,cAAc,IAAIH,gBAAAA,CAAO,eAAe,6BAA+BE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAE5F,MAAME,eAAe,IAAIJ,gBAAAA,CAAO,gBAAgB,oBAAsBE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAErF,MAAMG,oBAAoB,IAAIL,gBAAAA,CACnC,aACA,yFACAE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAEV,MAAMI,cAAc,IAAIN,gBAAAA,CAC7B,uBACA,uDACAO,CAAAA,CAAAA,SAAS,CAAC,CAACC,OAAAA,GAAAA;IACX,IAAI,CAACC,8BAAwBD,OAAQ,CAAA,EAAA;AACnC,QAAA,MAAM,IAAIE,8BAAqB,CAAA,+BAAA,CAAA;AACjC;AAEA,IAAA,OAAOC,kBAAaH,CAAAA,OAAAA,CAAAA;AACtB,CAAG;;;;;;;;;"}
|
package/dist/src/cli/options.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Option, InvalidArgumentError } from 'commander';
|
|
2
2
|
import 'semver';
|
|
3
|
-
import '../modules/version/types.mjs';
|
|
4
3
|
import { isValidStringifiedRange, rangeFactory } from '../modules/version/range.mjs';
|
|
5
4
|
|
|
6
5
|
const projectPathOption = new Option('-p, --project-path <project-path>', 'Root path to the Strapi application or plugin');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.mjs","sources":["../../../src/cli/options.ts"],"sourcesContent":["import { InvalidArgumentError, Option } from 'commander';\nimport { isValidStringifiedRange, rangeFactory } from '../modules/version';\n\nexport const projectPathOption = new Option(\n '-p, --project-path <project-path>',\n 'Root path to the Strapi application or plugin'\n);\n\nexport const dryOption = new Option(\n '-n, --dry',\n 'Simulate the upgrade without updating any files'\n).default(false);\n\nexport const debugOption = new Option('-d, --debug', 'Get more logs in debug mode').default(false);\n\nexport const silentOption = new Option('-s, --silent', \"Don't log anything\").default(false);\n\nexport const autoConfirmOption = new Option(\n '-y, --yes',\n 'Automatically answer \"yes\" to any prompts that the CLI might print on the command line.'\n).default(false);\n\nexport const rangeOption = new Option(\n '-r, --range <range>',\n 'Use a custom semver range for the codemods execution.'\n).argParser((range) => {\n if (!isValidStringifiedRange(range)) {\n throw new InvalidArgumentError('Expected a valid semver range');\n }\n\n return rangeFactory(range);\n});\n"],"names":["projectPathOption","Option","dryOption","default","debugOption","silentOption","autoConfirmOption","rangeOption","argParser","range","isValidStringifiedRange","InvalidArgumentError","rangeFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"options.mjs","sources":["../../../src/cli/options.ts"],"sourcesContent":["import { InvalidArgumentError, Option } from 'commander';\nimport { isValidStringifiedRange, rangeFactory } from '../modules/version';\n\nexport const projectPathOption = new Option(\n '-p, --project-path <project-path>',\n 'Root path to the Strapi application or plugin'\n);\n\nexport const dryOption = new Option(\n '-n, --dry',\n 'Simulate the upgrade without updating any files'\n).default(false);\n\nexport const debugOption = new Option('-d, --debug', 'Get more logs in debug mode').default(false);\n\nexport const silentOption = new Option('-s, --silent', \"Don't log anything\").default(false);\n\nexport const autoConfirmOption = new Option(\n '-y, --yes',\n 'Automatically answer \"yes\" to any prompts that the CLI might print on the command line.'\n).default(false);\n\nexport const rangeOption = new Option(\n '-r, --range <range>',\n 'Use a custom semver range for the codemods execution.'\n).argParser((range) => {\n if (!isValidStringifiedRange(range)) {\n throw new InvalidArgumentError('Expected a valid semver range');\n }\n\n return rangeFactory(range);\n});\n"],"names":["projectPathOption","Option","dryOption","default","debugOption","silentOption","autoConfirmOption","rangeOption","argParser","range","isValidStringifiedRange","InvalidArgumentError","rangeFactory"],"mappings":";;;;AAGaA,MAAAA,iBAAAA,GAAoB,IAAIC,MAAAA,CACnC,qCACA,+CACA;AAEK,MAAMC,YAAY,IAAID,MAAAA,CAC3B,aACA,iDACAE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAEV,MAAMC,cAAc,IAAIH,MAAAA,CAAO,eAAe,6BAA+BE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAE5F,MAAME,eAAe,IAAIJ,MAAAA,CAAO,gBAAgB,oBAAsBE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAErF,MAAMG,oBAAoB,IAAIL,MAAAA,CACnC,aACA,yFACAE,CAAAA,CAAAA,OAAO,CAAC,KAAO;AAEV,MAAMI,cAAc,IAAIN,MAAAA,CAC7B,uBACA,uDACAO,CAAAA,CAAAA,SAAS,CAAC,CAACC,KAAAA,GAAAA;IACX,IAAI,CAACC,wBAAwBD,KAAQ,CAAA,EAAA;AACnC,QAAA,MAAM,IAAIE,oBAAqB,CAAA,+BAAA,CAAA;AACjC;AAEA,IAAA,OAAOC,YAAaH,CAAAA,KAAAA,CAAAA;AACtB,CAAG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemod.js","sources":["../../../../src/modules/codemod/codemod.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, FormatOptions, Kind, UID } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n uid: UID;\n\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n this.uid = this.createUID();\n }\n\n private createUID(): UID {\n const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });\n const kind = this.kind;\n const version = this.version.raw as Version.LiteralSemVer;\n\n return `${version}-${name}-${kind}`;\n }\n\n format(options?: FormatOptions) {\n const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};\n\n let formatted = this.filename;\n\n if (stripExtension) {\n formatted = formatted.replace(new RegExp(`\\\\.${constants.CODEMOD_EXTENSION}$`, 'i'), '');\n }\n\n if (stripKind) {\n formatted = formatted\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}`, '');\n }\n\n if (stripHyphens) {\n formatted = formatted.replaceAll('-', ' ');\n }\n\n return formatted;\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n"],"names":["Codemod","createUID","name","format","stripExtension","stripKind","stripHyphens","kind","version","raw","options","formatted","filename","replace","RegExp","constants","replaceAll","
|
|
1
|
+
{"version":3,"file":"codemod.js","sources":["../../../../src/modules/codemod/codemod.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, FormatOptions, Kind, UID } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n uid: UID;\n\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n this.uid = this.createUID();\n }\n\n private createUID(): UID {\n const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });\n const kind = this.kind;\n const version = this.version.raw as Version.LiteralSemVer;\n\n return `${version}-${name}-${kind}`;\n }\n\n format(options?: FormatOptions) {\n const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};\n\n let formatted = this.filename;\n\n if (stripExtension) {\n formatted = formatted.replace(new RegExp(`\\\\.${constants.CODEMOD_EXTENSION}$`, 'i'), '');\n }\n\n if (stripKind) {\n formatted = formatted\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}`, '');\n }\n\n if (stripHyphens) {\n formatted = formatted.replaceAll('-', ' ');\n }\n\n return formatted;\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n"],"names":["Codemod","createUID","name","format","stripExtension","stripKind","stripHyphens","kind","version","raw","options","formatted","filename","replace","RegExp","constants","replaceAll","baseDirectory","path","join","uid","codemodFactory"],"mappings":";;;;;AAYO,MAAMA,OAAAA,CAAAA;IAuBHC,SAAiB,GAAA;AACvB,QAAA,MAAMC,IAAO,GAAA,IAAI,CAACC,MAAM,CAAC;YAAEC,cAAgB,EAAA,IAAA;YAAMC,SAAW,EAAA,IAAA;YAAMC,YAAc,EAAA;AAAM,SAAA,CAAA;QACtF,MAAMC,IAAAA,GAAO,IAAI,CAACA,IAAI;AACtB,QAAA,MAAMC,OAAU,GAAA,IAAI,CAACA,OAAO,CAACC,GAAG;AAEhC,QAAA,OAAO,GAAGD,OAAQ,CAAA,CAAC,EAAEN,IAAK,CAAA,CAAC,EAAEK,IAAM,CAAA,CAAA;AACrC;AAEAJ,IAAAA,MAAAA,CAAOO,OAAuB,EAAE;AAC9B,QAAA,MAAM,EAAEN,cAAAA,GAAiB,IAAI,EAAEC,SAAY,GAAA,IAAI,EAAEC,YAAAA,GAAe,IAAI,EAAE,GAAGI,OAAAA,IAAW,EAAC;QAErF,IAAIC,SAAAA,GAAY,IAAI,CAACC,QAAQ;AAE7B,QAAA,IAAIR,cAAgB,EAAA;AAClBO,YAAAA,SAAAA,GAAYA,SAAUE,CAAAA,OAAO,CAAC,IAAIC,OAAO,CAAC,GAAG,EAAEC,2BAA2B,CAAC,CAAC,CAAC,EAAE,GAAM,CAAA,EAAA,EAAA,CAAA;AACvF;AAEA,QAAA,IAAIV,SAAW,EAAA;AACbM,YAAAA,SAAAA,GAAYA,UACTE,OAAO,CAAC,CAAC,CAAC,EAAEE,6BAA6B,CAAA,CAAE,EAAE,EAC7CF,CAAAA,CAAAA,OAAO,CAAC,CAAC,CAAC,EAAEE,6BAA6B,EAAE,EAAE,EAAA,CAAA;AAClD;AAEA,QAAA,IAAIT,YAAc,EAAA;YAChBK,SAAYA,GAAAA,SAAAA,CAAUK,UAAU,CAAC,GAAK,EAAA,GAAA,CAAA;AACxC;QAEA,OAAOL,SAAAA;AACT;AAtCA,IAAA,WAAA,CAAYD,OAA6B,CAAE;AACzC,QAAA,IAAI,CAACH,IAAI,GAAGG,OAAAA,CAAQH,IAAI;AACxB,QAAA,IAAI,CAACC,OAAO,GAAGE,OAAAA,CAAQF,OAAO;AAC9B,QAAA,IAAI,CAACS,aAAa,GAAGP,OAAAA,CAAQO,aAAa;AAC1C,QAAA,IAAI,CAACL,QAAQ,GAAGF,OAAAA,CAAQE,QAAQ;AAEhC,QAAA,IAAI,CAACM,IAAI,GAAGA,KAAKC,IAAI,CAAC,IAAI,CAACF,aAAa,EAAE,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,IAAI,CAACG,QAAQ,CAAA;AACzE,QAAA,IAAI,CAACQ,GAAG,GAAG,IAAI,CAACnB,SAAS,EAAA;AAC3B;AA+BF;MAEaoB,cAAiB,GAAA,CAACX,OAAkC,GAAA,IAAIV,QAAQU,OAAS;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemod.mjs","sources":["../../../../src/modules/codemod/codemod.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, FormatOptions, Kind, UID } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n uid: UID;\n\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n this.uid = this.createUID();\n }\n\n private createUID(): UID {\n const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });\n const kind = this.kind;\n const version = this.version.raw as Version.LiteralSemVer;\n\n return `${version}-${name}-${kind}`;\n }\n\n format(options?: FormatOptions) {\n const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};\n\n let formatted = this.filename;\n\n if (stripExtension) {\n formatted = formatted.replace(new RegExp(`\\\\.${constants.CODEMOD_EXTENSION}$`, 'i'), '');\n }\n\n if (stripKind) {\n formatted = formatted\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}`, '');\n }\n\n if (stripHyphens) {\n formatted = formatted.replaceAll('-', ' ');\n }\n\n return formatted;\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n"],"names":["Codemod","createUID","name","format","stripExtension","stripKind","stripHyphens","kind","version","raw","options","formatted","filename","replace","RegExp","constants","replaceAll","
|
|
1
|
+
{"version":3,"file":"codemod.mjs","sources":["../../../../src/modules/codemod/codemod.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, FormatOptions, Kind, UID } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n uid: UID;\n\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n this.uid = this.createUID();\n }\n\n private createUID(): UID {\n const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });\n const kind = this.kind;\n const version = this.version.raw as Version.LiteralSemVer;\n\n return `${version}-${name}-${kind}`;\n }\n\n format(options?: FormatOptions) {\n const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};\n\n let formatted = this.filename;\n\n if (stripExtension) {\n formatted = formatted.replace(new RegExp(`\\\\.${constants.CODEMOD_EXTENSION}$`, 'i'), '');\n }\n\n if (stripKind) {\n formatted = formatted\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}`, '');\n }\n\n if (stripHyphens) {\n formatted = formatted.replaceAll('-', ' ');\n }\n\n return formatted;\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n"],"names":["Codemod","createUID","name","format","stripExtension","stripKind","stripHyphens","kind","version","raw","options","formatted","filename","replace","RegExp","constants","replaceAll","baseDirectory","path","join","uid","codemodFactory"],"mappings":";;;AAYO,MAAMA,OAAAA,CAAAA;IAuBHC,SAAiB,GAAA;AACvB,QAAA,MAAMC,IAAO,GAAA,IAAI,CAACC,MAAM,CAAC;YAAEC,cAAgB,EAAA,IAAA;YAAMC,SAAW,EAAA,IAAA;YAAMC,YAAc,EAAA;AAAM,SAAA,CAAA;QACtF,MAAMC,IAAAA,GAAO,IAAI,CAACA,IAAI;AACtB,QAAA,MAAMC,OAAU,GAAA,IAAI,CAACA,OAAO,CAACC,GAAG;AAEhC,QAAA,OAAO,GAAGD,OAAQ,CAAA,CAAC,EAAEN,IAAK,CAAA,CAAC,EAAEK,IAAM,CAAA,CAAA;AACrC;AAEAJ,IAAAA,MAAAA,CAAOO,OAAuB,EAAE;AAC9B,QAAA,MAAM,EAAEN,cAAAA,GAAiB,IAAI,EAAEC,SAAY,GAAA,IAAI,EAAEC,YAAAA,GAAe,IAAI,EAAE,GAAGI,OAAAA,IAAW,EAAC;QAErF,IAAIC,SAAAA,GAAY,IAAI,CAACC,QAAQ;AAE7B,QAAA,IAAIR,cAAgB,EAAA;AAClBO,YAAAA,SAAAA,GAAYA,SAAUE,CAAAA,OAAO,CAAC,IAAIC,OAAO,CAAC,GAAG,EAAEC,iBAA2B,CAAC,CAAC,CAAC,EAAE,GAAM,CAAA,EAAA,EAAA,CAAA;AACvF;AAEA,QAAA,IAAIV,SAAW,EAAA;AACbM,YAAAA,SAAAA,GAAYA,UACTE,OAAO,CAAC,CAAC,CAAC,EAAEE,mBAA6B,CAAA,CAAE,EAAE,EAC7CF,CAAAA,CAAAA,OAAO,CAAC,CAAC,CAAC,EAAEE,mBAA6B,EAAE,EAAE,EAAA,CAAA;AAClD;AAEA,QAAA,IAAIT,YAAc,EAAA;YAChBK,SAAYA,GAAAA,SAAAA,CAAUK,UAAU,CAAC,GAAK,EAAA,GAAA,CAAA;AACxC;QAEA,OAAOL,SAAAA;AACT;AAtCA,IAAA,WAAA,CAAYD,OAA6B,CAAE;AACzC,QAAA,IAAI,CAACH,IAAI,GAAGG,OAAAA,CAAQH,IAAI;AACxB,QAAA,IAAI,CAACC,OAAO,GAAGE,OAAAA,CAAQF,OAAO;AAC9B,QAAA,IAAI,CAACS,aAAa,GAAGP,OAAAA,CAAQO,aAAa;AAC1C,QAAA,IAAI,CAACL,QAAQ,GAAGF,OAAAA,CAAQE,QAAQ;AAEhC,QAAA,IAAI,CAACM,IAAI,GAAGA,KAAKC,IAAI,CAAC,IAAI,CAACF,aAAa,EAAE,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,IAAI,CAACG,QAAQ,CAAA;AACzE,QAAA,IAAI,CAACQ,GAAG,GAAG,IAAI,CAACnB,SAAS,EAAA;AAC3B;AA+BF;MAEaoB,cAAiB,GAAA,CAACX,OAAkC,GAAA,IAAIV,QAAQU,OAAS;;;;"}
|
|
@@ -8,7 +8,6 @@ var codemod = require('../codemod/codemod.js');
|
|
|
8
8
|
var constants$1 = require('../codemod/constants.js');
|
|
9
9
|
var semver = require('../version/semver.js');
|
|
10
10
|
var range = require('../version/range.js');
|
|
11
|
-
require('../version/types.js');
|
|
12
11
|
var constants = require('./constants.js');
|
|
13
12
|
|
|
14
13
|
class CodemodRepository {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sources":["../../../../src/modules/codemod-repository/repository.ts"],"sourcesContent":["import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { isRangeInstance, semVerFactory } from '../version';\n\nimport { INTERNAL_CODEMODS_DIRECTORY } from './constants';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface, FindQuery } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n versionExists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n has(uid: string) {\n const result = this.find({ uids: [uid] });\n\n if (result.length !== 1) {\n return false;\n }\n\n const { codemods } = result[0];\n\n return codemods.length === 1 && codemods[0].uid === uid;\n }\n\n find(q: FindQuery) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return (\n entries\n // Filter by range if provided in the query\n .filter(maybeFilterByRange)\n // Transform version/codemods tuples into regular objects\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n // Filter by UID if provided in the query\n codemods: codemods.filter(maybeFilterByUIDs),\n }))\n // Only return groups with at least 1 codemod\n .filter(({ codemods }) => codemods.length > 0)\n );\n\n function maybeFilterByRange([version]: [Version.LiteralSemVer, Codemod.List]) {\n if (!isRangeInstance(q.range)) {\n return true;\n }\n\n return q.range.test(version);\n }\n\n function maybeFilterByUIDs(codemod: Codemod.Codemod) {\n if (q.uids === undefined) {\n return true;\n }\n\n return q.uids.includes(codemod.uid);\n }\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n findAll() {\n const entries = Object.entries(this.groups);\n\n return entries.map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string = INTERNAL_CODEMODS_DIRECTORY) => {\n return new CodemodRepository(cwd);\n};\n"],"names":["CodemodRepository","refresh","refreshAvailableVersions","refreshAvailableFiles","count","version","findByVersion","length","versionExists","raw","groups","has","uid","result","find","uids","codemods","q","entries","Object","filter","maybeFilterByRange","map","semVerFactory","maybeFilterByUIDs","isRangeInstance","range","test","codemod","undefined","includes","literalVersion","findAll","versions","fse","readdirSync","cwd","filename","statSync","path","join","isDirectory","semver","valid","sort","compare","refreshAvailableFilesForVersion","versionDirectory","existsSync","isFile","constants","kind","parseCodemodKindFromFilename","baseDirectory","codemodFactory","
|
|
1
|
+
{"version":3,"file":"repository.js","sources":["../../../../src/modules/codemod-repository/repository.ts"],"sourcesContent":["import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { isRangeInstance, semVerFactory } from '../version';\n\nimport { INTERNAL_CODEMODS_DIRECTORY } from './constants';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface, FindQuery } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n versionExists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n has(uid: string) {\n const result = this.find({ uids: [uid] });\n\n if (result.length !== 1) {\n return false;\n }\n\n const { codemods } = result[0];\n\n return codemods.length === 1 && codemods[0].uid === uid;\n }\n\n find(q: FindQuery) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return (\n entries\n // Filter by range if provided in the query\n .filter(maybeFilterByRange)\n // Transform version/codemods tuples into regular objects\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n // Filter by UID if provided in the query\n codemods: codemods.filter(maybeFilterByUIDs),\n }))\n // Only return groups with at least 1 codemod\n .filter(({ codemods }) => codemods.length > 0)\n );\n\n function maybeFilterByRange([version]: [Version.LiteralSemVer, Codemod.List]) {\n if (!isRangeInstance(q.range)) {\n return true;\n }\n\n return q.range.test(version);\n }\n\n function maybeFilterByUIDs(codemod: Codemod.Codemod) {\n if (q.uids === undefined) {\n return true;\n }\n\n return q.uids.includes(codemod.uid);\n }\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n findAll() {\n const entries = Object.entries(this.groups);\n\n return entries.map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string = INTERNAL_CODEMODS_DIRECTORY) => {\n return new CodemodRepository(cwd);\n};\n"],"names":["CodemodRepository","refresh","refreshAvailableVersions","refreshAvailableFiles","count","version","findByVersion","length","versionExists","raw","groups","has","uid","result","find","uids","codemods","q","entries","Object","filter","maybeFilterByRange","map","semVerFactory","maybeFilterByUIDs","isRangeInstance","range","test","codemod","undefined","includes","literalVersion","findAll","versions","fse","readdirSync","cwd","filename","statSync","path","join","isDirectory","semver","valid","sort","compare","refreshAvailableFilesForVersion","versionDirectory","existsSync","isFile","constants","kind","parseCodemodKindFromFilename","baseDirectory","codemodFactory","assert","split","at","codemodRepositoryFactory","INTERNAL_CODEMODS_DIRECTORY"],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@ import { codemodFactory } from '../codemod/codemod.mjs';
|
|
|
6
6
|
import { CODEMOD_FILE_REGEXP, CODEMOD_ALLOWED_SUFFIXES } from '../codemod/constants.mjs';
|
|
7
7
|
import { semVerFactory } from '../version/semver.mjs';
|
|
8
8
|
import { isRangeInstance } from '../version/range.mjs';
|
|
9
|
-
import '../version/types.mjs';
|
|
10
9
|
import { INTERNAL_CODEMODS_DIRECTORY } from './constants.mjs';
|
|
11
10
|
|
|
12
11
|
class CodemodRepository {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","sources":["../../../../src/modules/codemod-repository/repository.ts"],"sourcesContent":["import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { isRangeInstance, semVerFactory } from '../version';\n\nimport { INTERNAL_CODEMODS_DIRECTORY } from './constants';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface, FindQuery } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n versionExists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n has(uid: string) {\n const result = this.find({ uids: [uid] });\n\n if (result.length !== 1) {\n return false;\n }\n\n const { codemods } = result[0];\n\n return codemods.length === 1 && codemods[0].uid === uid;\n }\n\n find(q: FindQuery) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return (\n entries\n // Filter by range if provided in the query\n .filter(maybeFilterByRange)\n // Transform version/codemods tuples into regular objects\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n // Filter by UID if provided in the query\n codemods: codemods.filter(maybeFilterByUIDs),\n }))\n // Only return groups with at least 1 codemod\n .filter(({ codemods }) => codemods.length > 0)\n );\n\n function maybeFilterByRange([version]: [Version.LiteralSemVer, Codemod.List]) {\n if (!isRangeInstance(q.range)) {\n return true;\n }\n\n return q.range.test(version);\n }\n\n function maybeFilterByUIDs(codemod: Codemod.Codemod) {\n if (q.uids === undefined) {\n return true;\n }\n\n return q.uids.includes(codemod.uid);\n }\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n findAll() {\n const entries = Object.entries(this.groups);\n\n return entries.map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string = INTERNAL_CODEMODS_DIRECTORY) => {\n return new CodemodRepository(cwd);\n};\n"],"names":["CodemodRepository","refresh","refreshAvailableVersions","refreshAvailableFiles","count","version","findByVersion","length","versionExists","raw","groups","has","uid","result","find","uids","codemods","q","entries","Object","filter","maybeFilterByRange","map","semVerFactory","maybeFilterByUIDs","isRangeInstance","range","test","codemod","undefined","includes","literalVersion","findAll","versions","fse","readdirSync","cwd","filename","statSync","path","join","isDirectory","semver","valid","sort","compare","refreshAvailableFilesForVersion","versionDirectory","existsSync","isFile","constants","kind","parseCodemodKindFromFilename","baseDirectory","codemodFactory","
|
|
1
|
+
{"version":3,"file":"repository.mjs","sources":["../../../../src/modules/codemod-repository/repository.ts"],"sourcesContent":["import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { isRangeInstance, semVerFactory } from '../version';\n\nimport { INTERNAL_CODEMODS_DIRECTORY } from './constants';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface, FindQuery } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n versionExists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n has(uid: string) {\n const result = this.find({ uids: [uid] });\n\n if (result.length !== 1) {\n return false;\n }\n\n const { codemods } = result[0];\n\n return codemods.length === 1 && codemods[0].uid === uid;\n }\n\n find(q: FindQuery) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return (\n entries\n // Filter by range if provided in the query\n .filter(maybeFilterByRange)\n // Transform version/codemods tuples into regular objects\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n // Filter by UID if provided in the query\n codemods: codemods.filter(maybeFilterByUIDs),\n }))\n // Only return groups with at least 1 codemod\n .filter(({ codemods }) => codemods.length > 0)\n );\n\n function maybeFilterByRange([version]: [Version.LiteralSemVer, Codemod.List]) {\n if (!isRangeInstance(q.range)) {\n return true;\n }\n\n return q.range.test(version);\n }\n\n function maybeFilterByUIDs(codemod: Codemod.Codemod) {\n if (q.uids === undefined) {\n return true;\n }\n\n return q.uids.includes(codemod.uid);\n }\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n findAll() {\n const entries = Object.entries(this.groups);\n\n return entries.map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string = INTERNAL_CODEMODS_DIRECTORY) => {\n return new CodemodRepository(cwd);\n};\n"],"names":["CodemodRepository","refresh","refreshAvailableVersions","refreshAvailableFiles","count","version","findByVersion","length","versionExists","raw","groups","has","uid","result","find","uids","codemods","q","entries","Object","filter","maybeFilterByRange","map","semVerFactory","maybeFilterByUIDs","isRangeInstance","range","test","codemod","undefined","includes","literalVersion","findAll","versions","fse","readdirSync","cwd","filename","statSync","path","join","isDirectory","semver","valid","sort","compare","refreshAvailableFilesForVersion","versionDirectory","existsSync","isFile","constants","kind","parseCodemodKindFromFilename","baseDirectory","codemodFactory","assert","split","at","codemodRepositoryFactory","INTERNAL_CODEMODS_DIRECTORY"],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@ var constants = require('../codemod-repository/constants.js');
|
|
|
6
6
|
var utils = require('../error/utils.js');
|
|
7
7
|
var semver = require('../version/semver.js');
|
|
8
8
|
require('semver');
|
|
9
|
-
require('../version/types.js');
|
|
10
9
|
var formats = require('../format/formats.js');
|
|
11
10
|
|
|
12
11
|
class CodemodRunner {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemod-runner.js","sources":["../../../../src/modules/codemod-runner/codemod-runner.ts"],"sourcesContent":["import { groupBy, size } from 'lodash/fp';\n\nimport {\n codemodRepositoryFactory,\n constants as codemodRepositoryConstants,\n} from '../codemod-repository';\nimport { unknownToError } from '../error';\nimport { semVerFactory } from '../version';\nimport * as f from '../format';\n\nimport type { Codemod } from '../codemod';\nimport type { Logger } from '../logger';\nimport type { Project } from '../project';\nimport type { UpgradeReport } from '../upgrader';\nimport type { CodemodRunnerInterface, CodemodRunnerReport, SelectCodemodsCallback } from './types';\nimport type { Version } from '../version';\n\nexport class CodemodRunner implements CodemodRunnerInterface {\n private readonly project: Project;\n\n private range: Version.Range;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private selectCodemodsCallback: SelectCodemodsCallback | null;\n\n constructor(project: Project, range: Version.Range) {\n this.project = project;\n this.range = range;\n\n this.isDry = false;\n\n this.logger = null;\n this.selectCodemodsCallback = null;\n }\n\n setRange(range: Version.Range) {\n this.range = range;\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onSelectCodemods(callback: SelectCodemodsCallback | null) {\n this.selectCodemodsCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n private createRepository(codemodsDirectory?: string) {\n const repository = codemodRepositoryFactory(\n codemodsDirectory ?? codemodRepositoryConstants.INTERNAL_CODEMODS_DIRECTORY\n );\n\n // Make sure we have access to the latest snapshots of codemods on the system\n repository.refresh();\n\n return repository;\n }\n\n private async safeRunAndReport(codemods: Codemod.List) {\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the codemods in dry mode. No files will be modified during the process.'\n );\n }\n\n try {\n const reports = await this.project.runCodemods(codemods, { dry: this.isDry });\n\n this.logger?.raw?.(f.reports(reports));\n\n if (!this.isDry) {\n const nbAffectedTotal = reports\n .flatMap((report) => report.report.ok)\n .reduce((acc, nb) => acc + nb, 0);\n\n this.logger?.debug?.(\n `Successfully ran ${f.highlight(codemods.length)} codemod(s), ${f.highlight(nbAffectedTotal)} change(s) have been detected`\n );\n }\n\n return successReport();\n } catch (e: unknown) {\n return erroredReport(unknownToError(e));\n }\n }\n\n async runByUID(uid: string, codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n if (!repository.has(uid)) {\n throw new Error(`Unknown codemod UID provided: ${uid}`);\n }\n\n // Note: Ignore the range when running with a UID\n const codemods = repository.find({ uids: [uid] }).flatMap(({ codemods }) => codemods);\n\n return this.safeRunAndReport(codemods);\n }\n\n async run(codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n // Find codemods matching the given range\n const codemodsInRange = repository.find({ range: this.range });\n\n // If a selection callback is set, use it, else keep every codemods found\n const selectedCodemods = this.selectCodemodsCallback\n ? await this.selectCodemodsCallback(codemodsInRange)\n : codemodsInRange;\n\n // If no codemods have been selected (either manually or automatically)\n // Then ignore and return a successful report\n if (selectedCodemods.length === 0) {\n this.logger?.debug?.(`Found no codemods to run for ${f.versionRange(this.range)}`);\n return successReport();\n }\n\n // Flatten the collection to a single list of codemods, the original list should already be sorted by version\n const codemods = selectedCodemods.flatMap(({ codemods }) => codemods);\n\n // Log (debug) the codemods by version\n const codemodsByVersion = groupBy('version', codemods);\n const fRange = f.versionRange(this.range);\n\n this.logger?.debug?.(\n `Found ${f.highlight(codemods.length)} codemods for ${f.highlight(size(codemodsByVersion))} version(s) using ${fRange}`\n );\n\n for (const [version, codemods] of Object.entries(codemodsByVersion)) {\n this.logger?.debug?.(`- ${f.version(semVerFactory(version))} (${codemods.length})`);\n }\n\n return this.safeRunAndReport(codemods);\n }\n}\n\nexport const codemodRunnerFactory = (project: Project, range: Version.Range) => {\n return new CodemodRunner(project, range);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["CodemodRunner","setRange","range","setLogger","logger","onSelectCodemods","callback","selectCodemodsCallback","dry","enabled","isDry","createRepository","codemodsDirectory","repository","codemodRepositoryFactory","codemodRepositoryConstants","refresh","safeRunAndReport","codemods","warn","reports","project","runCodemods","raw","f","nbAffectedTotal","flatMap","report","ok","reduce","acc","nb","debug","length","successReport","e","erroredReport","unknownToError","runByUID","uid","has","Error","find","uids","run","codemodsInRange","selectedCodemods","codemodsByVersion","groupBy","fRange","size","version","Object","entries","semVerFactory","
|
|
1
|
+
{"version":3,"file":"codemod-runner.js","sources":["../../../../src/modules/codemod-runner/codemod-runner.ts"],"sourcesContent":["import { groupBy, size } from 'lodash/fp';\n\nimport {\n codemodRepositoryFactory,\n constants as codemodRepositoryConstants,\n} from '../codemod-repository';\nimport { unknownToError } from '../error';\nimport { semVerFactory } from '../version';\nimport * as f from '../format';\n\nimport type { Codemod } from '../codemod';\nimport type { Logger } from '../logger';\nimport type { Project } from '../project';\nimport type { UpgradeReport } from '../upgrader';\nimport type { CodemodRunnerInterface, CodemodRunnerReport, SelectCodemodsCallback } from './types';\nimport type { Version } from '../version';\n\nexport class CodemodRunner implements CodemodRunnerInterface {\n private readonly project: Project;\n\n private range: Version.Range;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private selectCodemodsCallback: SelectCodemodsCallback | null;\n\n constructor(project: Project, range: Version.Range) {\n this.project = project;\n this.range = range;\n\n this.isDry = false;\n\n this.logger = null;\n this.selectCodemodsCallback = null;\n }\n\n setRange(range: Version.Range) {\n this.range = range;\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onSelectCodemods(callback: SelectCodemodsCallback | null) {\n this.selectCodemodsCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n private createRepository(codemodsDirectory?: string) {\n const repository = codemodRepositoryFactory(\n codemodsDirectory ?? codemodRepositoryConstants.INTERNAL_CODEMODS_DIRECTORY\n );\n\n // Make sure we have access to the latest snapshots of codemods on the system\n repository.refresh();\n\n return repository;\n }\n\n private async safeRunAndReport(codemods: Codemod.List) {\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the codemods in dry mode. No files will be modified during the process.'\n );\n }\n\n try {\n const reports = await this.project.runCodemods(codemods, { dry: this.isDry });\n\n this.logger?.raw?.(f.reports(reports));\n\n if (!this.isDry) {\n const nbAffectedTotal = reports\n .flatMap((report) => report.report.ok)\n .reduce((acc, nb) => acc + nb, 0);\n\n this.logger?.debug?.(\n `Successfully ran ${f.highlight(codemods.length)} codemod(s), ${f.highlight(nbAffectedTotal)} change(s) have been detected`\n );\n }\n\n return successReport();\n } catch (e: unknown) {\n return erroredReport(unknownToError(e));\n }\n }\n\n async runByUID(uid: string, codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n if (!repository.has(uid)) {\n throw new Error(`Unknown codemod UID provided: ${uid}`);\n }\n\n // Note: Ignore the range when running with a UID\n const codemods = repository.find({ uids: [uid] }).flatMap(({ codemods }) => codemods);\n\n return this.safeRunAndReport(codemods);\n }\n\n async run(codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n // Find codemods matching the given range\n const codemodsInRange = repository.find({ range: this.range });\n\n // If a selection callback is set, use it, else keep every codemods found\n const selectedCodemods = this.selectCodemodsCallback\n ? await this.selectCodemodsCallback(codemodsInRange)\n : codemodsInRange;\n\n // If no codemods have been selected (either manually or automatically)\n // Then ignore and return a successful report\n if (selectedCodemods.length === 0) {\n this.logger?.debug?.(`Found no codemods to run for ${f.versionRange(this.range)}`);\n return successReport();\n }\n\n // Flatten the collection to a single list of codemods, the original list should already be sorted by version\n const codemods = selectedCodemods.flatMap(({ codemods }) => codemods);\n\n // Log (debug) the codemods by version\n const codemodsByVersion = groupBy('version', codemods);\n const fRange = f.versionRange(this.range);\n\n this.logger?.debug?.(\n `Found ${f.highlight(codemods.length)} codemods for ${f.highlight(size(codemodsByVersion))} version(s) using ${fRange}`\n );\n\n for (const [version, codemods] of Object.entries(codemodsByVersion)) {\n this.logger?.debug?.(`- ${f.version(semVerFactory(version))} (${codemods.length})`);\n }\n\n return this.safeRunAndReport(codemods);\n }\n}\n\nexport const codemodRunnerFactory = (project: Project, range: Version.Range) => {\n return new CodemodRunner(project, range);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["CodemodRunner","setRange","range","setLogger","logger","onSelectCodemods","callback","selectCodemodsCallback","dry","enabled","isDry","createRepository","codemodsDirectory","repository","codemodRepositoryFactory","codemodRepositoryConstants","refresh","safeRunAndReport","codemods","warn","reports","project","runCodemods","raw","f","nbAffectedTotal","flatMap","report","ok","reduce","acc","nb","debug","length","successReport","e","erroredReport","unknownToError","runByUID","uid","has","Error","find","uids","run","codemodsInRange","selectedCodemods","codemodsByVersion","groupBy","fRange","size","version","Object","entries","semVerFactory","codemodRunnerFactory","success","error"],"mappings":";;;;;;;;;;AAiBO,MAAMA,aAAAA,CAAAA;AAqBXC,IAAAA,QAAAA,CAASC,KAAoB,EAAE;QAC7B,IAAI,CAACA,KAAK,GAAGA,KAAAA;AACb,QAAA,OAAO,IAAI;AACb;AAEAC,IAAAA,SAAAA,CAAUC,MAAc,EAAE;QACxB,IAAI,CAACA,MAAM,GAAGA,MAAAA;AACd,QAAA,OAAO,IAAI;AACb;AAEAC,IAAAA,gBAAAA,CAAiBC,QAAuC,EAAE;QACxD,IAAI,CAACC,sBAAsB,GAAGD,QAAAA;AAC9B,QAAA,OAAO,IAAI;AACb;IAEAE,GAAIC,CAAAA,OAAAA,GAAmB,IAAI,EAAE;QAC3B,IAAI,CAACC,KAAK,GAAGD,OAAAA;AACb,QAAA,OAAO,IAAI;AACb;AAEQE,IAAAA,gBAAAA,CAAiBC,iBAA0B,EAAE;AACnD,QAAA,MAAMC,YAAaC,GAAAA,mCAAAA,CACjBF,iBAAqBG,IAAAA,qCAAsD,CAAA;;AAI7EF,QAAAA,YAAAA,CAAWG,OAAO,EAAA;QAElB,OAAOH,YAAAA;AACT;IAEA,MAAcI,gBAAAA,CAAiBC,QAAsB,EAAE;QACrD,IAAI,IAAI,CAACR,KAAK,EAAE;YACd,IAAI,CAACN,MAAM,EAAEe,IACX,GAAA,iFAAA,CAAA;AAEJ;QAEA,IAAI;YACF,MAAMC,OAAAA,GAAU,MAAM,IAAI,CAACC,OAAO,CAACC,WAAW,CAACJ,QAAU,EAAA;gBAAEV,GAAK,EAAA,IAAI,CAACE;AAAM,aAAA,CAAA;AAE3E,YAAA,IAAI,CAACN,MAAM,EAAEmB,GAAMC,GAAAA,eAAS,CAACJ,OAAAA,CAAAA,CAAAA;AAE7B,YAAA,IAAI,CAAC,IAAI,CAACV,KAAK,EAAE;AACf,gBAAA,MAAMe,kBAAkBL,OACrBM,CAAAA,OAAO,CAAC,CAACC,SAAWA,MAAOA,CAAAA,MAAM,CAACC,EAAE,EACpCC,MAAM,CAAC,CAACC,GAAKC,EAAAA,EAAAA,GAAOD,MAAMC,EAAI,EAAA,CAAA,CAAA;gBAEjC,IAAI,CAAC3B,MAAM,EAAE4B,KAAAA,GACX,CAAC,iBAAiB,EAAER,iBAAW,CAACN,SAASe,MAAM,CAAA,CAAE,aAAa,EAAET,iBAAW,CAACC,eAAAA,CAAAA,CAAiB,6BAA6B,CAAC,CAAA;AAE/H;YAEA,OAAOS,aAAAA,EAAAA;AACT,SAAA,CAAE,OAAOC,CAAY,EAAA;AACnB,YAAA,OAAOC,cAAcC,oBAAeF,CAAAA,CAAAA,CAAAA,CAAAA;AACtC;AACF;AAEA,IAAA,MAAMG,QAASC,CAAAA,GAAW,EAAE3B,iBAA0B,EAAgC;AACpF,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACF,gBAAgB,CAACC,iBAAAA,CAAAA;AAEzC,QAAA,IAAI,CAACC,UAAAA,CAAW2B,GAAG,CAACD,GAAM,CAAA,EAAA;AACxB,YAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,8BAA8B,EAAEF,GAAK,CAAA,CAAA,CAAA;AACxD;;QAGA,MAAMrB,QAAAA,GAAWL,UAAW6B,CAAAA,IAAI,CAAC;YAAEC,IAAM,EAAA;AAACJ,gBAAAA;AAAI;AAAC,SAAA,CAAA,CAAGb,OAAO,CAAC,CAAC,EAAER,QAAQ,EAAE,GAAKA,QAAAA,CAAAA;QAE5E,OAAO,IAAI,CAACD,gBAAgB,CAACC,QAAAA,CAAAA;AAC/B;IAEA,MAAM0B,GAAAA,CAAIhC,iBAA0B,EAAgC;AAClE,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACF,gBAAgB,CAACC,iBAAAA,CAAAA;;QAGzC,MAAMiC,eAAAA,GAAkBhC,UAAW6B,CAAAA,IAAI,CAAC;YAAExC,KAAO,EAAA,IAAI,CAACA;AAAM,SAAA,CAAA;;QAG5D,MAAM4C,gBAAAA,GAAmB,IAAI,CAACvC,sBAAsB,GAChD,MAAM,IAAI,CAACA,sBAAsB,CAACsC,eAClCA,CAAAA,GAAAA,eAAAA;;;QAIJ,IAAIC,gBAAAA,CAAiBb,MAAM,KAAK,CAAG,EAAA;AACjC,YAAA,IAAI,CAAC7B,MAAM,EAAE4B,KAAAA,GAAQ,CAAC,6BAA6B,EAAER,oBAAc,CAAC,IAAI,CAACtB,KAAK,CAAG,CAAA,CAAA,CAAA;YACjF,OAAOgC,aAAAA,EAAAA;AACT;;QAGA,MAAMhB,QAAAA,GAAW4B,iBAAiBpB,OAAO,CAAC,CAAC,EAAER,QAAQ,EAAE,GAAKA,QAAAA,CAAAA;;QAG5D,MAAM6B,iBAAAA,GAAoBC,WAAQ,SAAW9B,EAAAA,QAAAA,CAAAA;AAC7C,QAAA,MAAM+B,SAASzB,oBAAc,CAAC,IAAI,CAACtB,KAAK,CAAA;QAExC,IAAI,CAACE,MAAM,EAAE4B,KAAAA,GACX,CAAC,MAAM,EAAER,iBAAW,CAACN,QAAAA,CAASe,MAAM,CAAE,CAAA,cAAc,EAAET,iBAAW,CAAC0B,OAAKH,CAAAA,iBAAAA,CAAAA,CAAAA,CAAoB,kBAAkB,EAAEE,MAAQ,CAAA,CAAA,CAAA;QAGzH,KAAK,MAAM,CAACE,OAASjC,EAAAA,QAAAA,CAAS,IAAIkC,MAAOC,CAAAA,OAAO,CAACN,iBAAoB,CAAA,CAAA;AACnE,YAAA,IAAI,CAAC3C,MAAM,EAAE4B,QAAQ,CAAC,EAAE,EAAER,eAAS,CAAC8B,oBAAAA,CAAcH,UAAU,EAAE,EAAEjC,SAASe,MAAM,CAAC,CAAC,CAAC,CAAA;AACpF;QAEA,OAAO,IAAI,CAAChB,gBAAgB,CAACC,QAAAA,CAAAA;AAC/B;IApHA,WAAYG,CAAAA,OAAgB,EAAEnB,KAAoB,CAAE;QAClD,IAAI,CAACmB,OAAO,GAAGA,OAAAA;QACf,IAAI,CAACnB,KAAK,GAAGA,KAAAA;QAEb,IAAI,CAACQ,KAAK,GAAG,KAAA;QAEb,IAAI,CAACN,MAAM,GAAG,IAAA;QACd,IAAI,CAACG,sBAAsB,GAAG,IAAA;AAChC;AA6GF;AAEO,MAAMgD,oBAAuB,GAAA,CAAClC,OAAkBnB,EAAAA,KAAAA,GAAAA;IACrD,OAAO,IAAIF,cAAcqB,OAASnB,EAAAA,KAAAA,CAAAA;AACpC;AAEA,MAAMgC,aAAAA,GAAgB,KAAsB;QAAEsB,OAAS,EAAA,IAAA;QAAMC,KAAO,EAAA;KAAK,CAAA;AACzE,MAAMrB,aAAAA,GAAgB,CAACqB,KAAAA,IAAiC;QAAED,OAAS,EAAA,KAAA;AAAOC,QAAAA;KAAM,CAAA;;;;;"}
|
|
@@ -4,7 +4,6 @@ import { INTERNAL_CODEMODS_DIRECTORY } from '../codemod-repository/constants.mjs
|
|
|
4
4
|
import { unknownToError } from '../error/utils.mjs';
|
|
5
5
|
import { semVerFactory } from '../version/semver.mjs';
|
|
6
6
|
import 'semver';
|
|
7
|
-
import '../version/types.mjs';
|
|
8
7
|
import { reports, highlight, versionRange, version } from '../format/formats.mjs';
|
|
9
8
|
|
|
10
9
|
class CodemodRunner {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemod-runner.mjs","sources":["../../../../src/modules/codemod-runner/codemod-runner.ts"],"sourcesContent":["import { groupBy, size } from 'lodash/fp';\n\nimport {\n codemodRepositoryFactory,\n constants as codemodRepositoryConstants,\n} from '../codemod-repository';\nimport { unknownToError } from '../error';\nimport { semVerFactory } from '../version';\nimport * as f from '../format';\n\nimport type { Codemod } from '../codemod';\nimport type { Logger } from '../logger';\nimport type { Project } from '../project';\nimport type { UpgradeReport } from '../upgrader';\nimport type { CodemodRunnerInterface, CodemodRunnerReport, SelectCodemodsCallback } from './types';\nimport type { Version } from '../version';\n\nexport class CodemodRunner implements CodemodRunnerInterface {\n private readonly project: Project;\n\n private range: Version.Range;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private selectCodemodsCallback: SelectCodemodsCallback | null;\n\n constructor(project: Project, range: Version.Range) {\n this.project = project;\n this.range = range;\n\n this.isDry = false;\n\n this.logger = null;\n this.selectCodemodsCallback = null;\n }\n\n setRange(range: Version.Range) {\n this.range = range;\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onSelectCodemods(callback: SelectCodemodsCallback | null) {\n this.selectCodemodsCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n private createRepository(codemodsDirectory?: string) {\n const repository = codemodRepositoryFactory(\n codemodsDirectory ?? codemodRepositoryConstants.INTERNAL_CODEMODS_DIRECTORY\n );\n\n // Make sure we have access to the latest snapshots of codemods on the system\n repository.refresh();\n\n return repository;\n }\n\n private async safeRunAndReport(codemods: Codemod.List) {\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the codemods in dry mode. No files will be modified during the process.'\n );\n }\n\n try {\n const reports = await this.project.runCodemods(codemods, { dry: this.isDry });\n\n this.logger?.raw?.(f.reports(reports));\n\n if (!this.isDry) {\n const nbAffectedTotal = reports\n .flatMap((report) => report.report.ok)\n .reduce((acc, nb) => acc + nb, 0);\n\n this.logger?.debug?.(\n `Successfully ran ${f.highlight(codemods.length)} codemod(s), ${f.highlight(nbAffectedTotal)} change(s) have been detected`\n );\n }\n\n return successReport();\n } catch (e: unknown) {\n return erroredReport(unknownToError(e));\n }\n }\n\n async runByUID(uid: string, codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n if (!repository.has(uid)) {\n throw new Error(`Unknown codemod UID provided: ${uid}`);\n }\n\n // Note: Ignore the range when running with a UID\n const codemods = repository.find({ uids: [uid] }).flatMap(({ codemods }) => codemods);\n\n return this.safeRunAndReport(codemods);\n }\n\n async run(codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n // Find codemods matching the given range\n const codemodsInRange = repository.find({ range: this.range });\n\n // If a selection callback is set, use it, else keep every codemods found\n const selectedCodemods = this.selectCodemodsCallback\n ? await this.selectCodemodsCallback(codemodsInRange)\n : codemodsInRange;\n\n // If no codemods have been selected (either manually or automatically)\n // Then ignore and return a successful report\n if (selectedCodemods.length === 0) {\n this.logger?.debug?.(`Found no codemods to run for ${f.versionRange(this.range)}`);\n return successReport();\n }\n\n // Flatten the collection to a single list of codemods, the original list should already be sorted by version\n const codemods = selectedCodemods.flatMap(({ codemods }) => codemods);\n\n // Log (debug) the codemods by version\n const codemodsByVersion = groupBy('version', codemods);\n const fRange = f.versionRange(this.range);\n\n this.logger?.debug?.(\n `Found ${f.highlight(codemods.length)} codemods for ${f.highlight(size(codemodsByVersion))} version(s) using ${fRange}`\n );\n\n for (const [version, codemods] of Object.entries(codemodsByVersion)) {\n this.logger?.debug?.(`- ${f.version(semVerFactory(version))} (${codemods.length})`);\n }\n\n return this.safeRunAndReport(codemods);\n }\n}\n\nexport const codemodRunnerFactory = (project: Project, range: Version.Range) => {\n return new CodemodRunner(project, range);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["CodemodRunner","setRange","range","setLogger","logger","onSelectCodemods","callback","selectCodemodsCallback","dry","enabled","isDry","createRepository","codemodsDirectory","repository","codemodRepositoryFactory","codemodRepositoryConstants","refresh","safeRunAndReport","codemods","warn","reports","project","runCodemods","raw","f","nbAffectedTotal","flatMap","report","ok","reduce","acc","nb","debug","length","successReport","e","erroredReport","unknownToError","runByUID","uid","has","Error","find","uids","run","codemodsInRange","selectedCodemods","codemodsByVersion","groupBy","fRange","size","version","Object","entries","semVerFactory","
|
|
1
|
+
{"version":3,"file":"codemod-runner.mjs","sources":["../../../../src/modules/codemod-runner/codemod-runner.ts"],"sourcesContent":["import { groupBy, size } from 'lodash/fp';\n\nimport {\n codemodRepositoryFactory,\n constants as codemodRepositoryConstants,\n} from '../codemod-repository';\nimport { unknownToError } from '../error';\nimport { semVerFactory } from '../version';\nimport * as f from '../format';\n\nimport type { Codemod } from '../codemod';\nimport type { Logger } from '../logger';\nimport type { Project } from '../project';\nimport type { UpgradeReport } from '../upgrader';\nimport type { CodemodRunnerInterface, CodemodRunnerReport, SelectCodemodsCallback } from './types';\nimport type { Version } from '../version';\n\nexport class CodemodRunner implements CodemodRunnerInterface {\n private readonly project: Project;\n\n private range: Version.Range;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private selectCodemodsCallback: SelectCodemodsCallback | null;\n\n constructor(project: Project, range: Version.Range) {\n this.project = project;\n this.range = range;\n\n this.isDry = false;\n\n this.logger = null;\n this.selectCodemodsCallback = null;\n }\n\n setRange(range: Version.Range) {\n this.range = range;\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onSelectCodemods(callback: SelectCodemodsCallback | null) {\n this.selectCodemodsCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n private createRepository(codemodsDirectory?: string) {\n const repository = codemodRepositoryFactory(\n codemodsDirectory ?? codemodRepositoryConstants.INTERNAL_CODEMODS_DIRECTORY\n );\n\n // Make sure we have access to the latest snapshots of codemods on the system\n repository.refresh();\n\n return repository;\n }\n\n private async safeRunAndReport(codemods: Codemod.List) {\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the codemods in dry mode. No files will be modified during the process.'\n );\n }\n\n try {\n const reports = await this.project.runCodemods(codemods, { dry: this.isDry });\n\n this.logger?.raw?.(f.reports(reports));\n\n if (!this.isDry) {\n const nbAffectedTotal = reports\n .flatMap((report) => report.report.ok)\n .reduce((acc, nb) => acc + nb, 0);\n\n this.logger?.debug?.(\n `Successfully ran ${f.highlight(codemods.length)} codemod(s), ${f.highlight(nbAffectedTotal)} change(s) have been detected`\n );\n }\n\n return successReport();\n } catch (e: unknown) {\n return erroredReport(unknownToError(e));\n }\n }\n\n async runByUID(uid: string, codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n if (!repository.has(uid)) {\n throw new Error(`Unknown codemod UID provided: ${uid}`);\n }\n\n // Note: Ignore the range when running with a UID\n const codemods = repository.find({ uids: [uid] }).flatMap(({ codemods }) => codemods);\n\n return this.safeRunAndReport(codemods);\n }\n\n async run(codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = this.createRepository(codemodsDirectory);\n\n // Find codemods matching the given range\n const codemodsInRange = repository.find({ range: this.range });\n\n // If a selection callback is set, use it, else keep every codemods found\n const selectedCodemods = this.selectCodemodsCallback\n ? await this.selectCodemodsCallback(codemodsInRange)\n : codemodsInRange;\n\n // If no codemods have been selected (either manually or automatically)\n // Then ignore and return a successful report\n if (selectedCodemods.length === 0) {\n this.logger?.debug?.(`Found no codemods to run for ${f.versionRange(this.range)}`);\n return successReport();\n }\n\n // Flatten the collection to a single list of codemods, the original list should already be sorted by version\n const codemods = selectedCodemods.flatMap(({ codemods }) => codemods);\n\n // Log (debug) the codemods by version\n const codemodsByVersion = groupBy('version', codemods);\n const fRange = f.versionRange(this.range);\n\n this.logger?.debug?.(\n `Found ${f.highlight(codemods.length)} codemods for ${f.highlight(size(codemodsByVersion))} version(s) using ${fRange}`\n );\n\n for (const [version, codemods] of Object.entries(codemodsByVersion)) {\n this.logger?.debug?.(`- ${f.version(semVerFactory(version))} (${codemods.length})`);\n }\n\n return this.safeRunAndReport(codemods);\n }\n}\n\nexport const codemodRunnerFactory = (project: Project, range: Version.Range) => {\n return new CodemodRunner(project, range);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["CodemodRunner","setRange","range","setLogger","logger","onSelectCodemods","callback","selectCodemodsCallback","dry","enabled","isDry","createRepository","codemodsDirectory","repository","codemodRepositoryFactory","codemodRepositoryConstants","refresh","safeRunAndReport","codemods","warn","reports","project","runCodemods","raw","f","nbAffectedTotal","flatMap","report","ok","reduce","acc","nb","debug","length","successReport","e","erroredReport","unknownToError","runByUID","uid","has","Error","find","uids","run","codemodsInRange","selectedCodemods","codemodsByVersion","groupBy","fRange","size","version","Object","entries","semVerFactory","codemodRunnerFactory","success","error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/modules/error/utils.ts"],"sourcesContent":["import type { Version } from '../version';\n\nexport class UnexpectedError extends Error {\n constructor() {\n super('Unexpected Error');\n }\n}\n\nexport class NPMCandidateNotFoundError extends Error {\n target: Version.SemVer | Version.Range | Version.ReleaseType;\n\n constructor(\n target: Version.SemVer | Version.Range | Version.ReleaseType,\n message: string = `Couldn't find a valid NPM candidate for \"${target}\"`\n ) {\n super(message);\n\n this.target = target;\n }\n}\n\nexport class AbortedError extends Error {\n constructor(message: string = 'Upgrade aborted') {\n super(message);\n }\n}\n\nexport const unknownToError = (e: unknown): Error => {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new Error(e);\n }\n\n return new UnexpectedError();\n};\n"],"names":["UnexpectedError","Error","
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/modules/error/utils.ts"],"sourcesContent":["import type { Version } from '../version';\n\nexport class UnexpectedError extends Error {\n constructor() {\n super('Unexpected Error');\n }\n}\n\nexport class NPMCandidateNotFoundError extends Error {\n target: Version.SemVer | Version.Range | Version.ReleaseType;\n\n constructor(\n target: Version.SemVer | Version.Range | Version.ReleaseType,\n message: string = `Couldn't find a valid NPM candidate for \"${target}\"`\n ) {\n super(message);\n\n this.target = target;\n }\n}\n\nexport class AbortedError extends Error {\n constructor(message: string = 'Upgrade aborted') {\n super(message);\n }\n}\n\nexport const unknownToError = (e: unknown): Error => {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new Error(e);\n }\n\n return new UnexpectedError();\n};\n"],"names":["UnexpectedError","Error","NPMCandidateNotFoundError","target","message","AbortedError","unknownToError","e"],"mappings":";;AAEO,MAAMA,eAAwBC,SAAAA,KAAAA,CAAAA;IACnC,WAAc,EAAA;AACZ,QAAA,KAAK,CAAC,kBAAA,CAAA;AACR;AACF;AAEO,MAAMC,yBAAkCD,SAAAA,KAAAA,CAAAA;IAG7C,WACEE,CAAAA,MAA4D,EAC5DC,OAAkB,GAAA,CAAC,yCAAyC,EAAED,MAAAA,CAAO,CAAC,CAAC,CACvE;AACA,QAAA,KAAK,CAACC,OAAAA,CAAAA;QAEN,IAAI,CAACD,MAAM,GAAGA,MAAAA;AAChB;AACF;AAEO,MAAME,YAAqBJ,SAAAA,KAAAA,CAAAA;IAChC,WAAYG,CAAAA,OAAAA,GAAkB,iBAAiB,CAAE;AAC/C,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;AACF;AAEO,MAAME,iBAAiB,CAACC,CAAAA,GAAAA;AAC7B,IAAA,IAAIA,aAAaN,KAAO,EAAA;QACtB,OAAOM,CAAAA;AACT;IAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;AACzB,QAAA,OAAO,IAAIN,KAAMM,CAAAA,CAAAA,CAAAA;AACnB;AAEA,IAAA,OAAO,IAAIP,eAAAA,EAAAA;AACb;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../../../src/modules/error/utils.ts"],"sourcesContent":["import type { Version } from '../version';\n\nexport class UnexpectedError extends Error {\n constructor() {\n super('Unexpected Error');\n }\n}\n\nexport class NPMCandidateNotFoundError extends Error {\n target: Version.SemVer | Version.Range | Version.ReleaseType;\n\n constructor(\n target: Version.SemVer | Version.Range | Version.ReleaseType,\n message: string = `Couldn't find a valid NPM candidate for \"${target}\"`\n ) {\n super(message);\n\n this.target = target;\n }\n}\n\nexport class AbortedError extends Error {\n constructor(message: string = 'Upgrade aborted') {\n super(message);\n }\n}\n\nexport const unknownToError = (e: unknown): Error => {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new Error(e);\n }\n\n return new UnexpectedError();\n};\n"],"names":["UnexpectedError","Error","
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../../src/modules/error/utils.ts"],"sourcesContent":["import type { Version } from '../version';\n\nexport class UnexpectedError extends Error {\n constructor() {\n super('Unexpected Error');\n }\n}\n\nexport class NPMCandidateNotFoundError extends Error {\n target: Version.SemVer | Version.Range | Version.ReleaseType;\n\n constructor(\n target: Version.SemVer | Version.Range | Version.ReleaseType,\n message: string = `Couldn't find a valid NPM candidate for \"${target}\"`\n ) {\n super(message);\n\n this.target = target;\n }\n}\n\nexport class AbortedError extends Error {\n constructor(message: string = 'Upgrade aborted') {\n super(message);\n }\n}\n\nexport const unknownToError = (e: unknown): Error => {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new Error(e);\n }\n\n return new UnexpectedError();\n};\n"],"names":["UnexpectedError","Error","NPMCandidateNotFoundError","target","message","AbortedError","unknownToError","e"],"mappings":"AAEO,MAAMA,eAAwBC,SAAAA,KAAAA,CAAAA;IACnC,WAAc,EAAA;AACZ,QAAA,KAAK,CAAC,kBAAA,CAAA;AACR;AACF;AAEO,MAAMC,yBAAkCD,SAAAA,KAAAA,CAAAA;IAG7C,WACEE,CAAAA,MAA4D,EAC5DC,OAAkB,GAAA,CAAC,yCAAyC,EAAED,MAAAA,CAAO,CAAC,CAAC,CACvE;AACA,QAAA,KAAK,CAACC,OAAAA,CAAAA;QAEN,IAAI,CAACD,MAAM,GAAGA,MAAAA;AAChB;AACF;AAEO,MAAME,YAAqBJ,SAAAA,KAAAA,CAAAA;IAChC,WAAYG,CAAAA,OAAAA,GAAkB,iBAAiB,CAAE;AAC/C,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;AACF;AAEO,MAAME,iBAAiB,CAACC,CAAAA,GAAAA;AAC7B,IAAA,IAAIA,aAAaN,KAAO,EAAA;QACtB,OAAOM,CAAAA;AACT;IAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;AACzB,QAAA,OAAO,IAAIN,KAAMM,CAAAA,CAAAA,CAAAA;AACnB;AAEA,IAAA,OAAO,IAAIP,eAAAA,EAAAA;AACb;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sources":["../../../../src/modules/file-scanner/scanner.ts"],"sourcesContent":["import path from 'node:path';\nimport fastglob from 'fast-glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n // we use fastglob instead of glob because it supports negation patterns\n const filenames = fastglob.sync(patterns, {\n cwd: this.cwd,\n });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n"],"names":["FileScanner","scan","patterns","filenames","fastglob","sync","cwd","map","filename","path","join","
|
|
1
|
+
{"version":3,"file":"scanner.js","sources":["../../../../src/modules/file-scanner/scanner.ts"],"sourcesContent":["import path from 'node:path';\nimport fastglob from 'fast-glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n // we use fastglob instead of glob because it supports negation patterns\n const filenames = fastglob.sync(patterns, {\n cwd: this.cwd,\n });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n"],"names":["FileScanner","scan","patterns","filenames","fastglob","sync","cwd","map","filename","path","join","fileScannerFactory"],"mappings":";;;;;AAKO,MAAMA,WAAAA,CAAAA;AAOXC,IAAAA,IAAAA,CAAKC,QAAkB,EAAE;;AAEvB,QAAA,MAAMC,SAAYC,GAAAA,QAAAA,CAASC,IAAI,CAACH,QAAU,EAAA;YACxCI,GAAK,EAAA,IAAI,CAACA;AACZ,SAAA,CAAA;;QAGA,OAAOH,SAAAA,CAAUI,GAAG,CAAC,CAACC,QAAAA,GAAaC,IAAKC,CAAAA,IAAI,CAAC,IAAI,CAACJ,GAAG,EAAEE,QAAAA,CAAAA,CAAAA;AACzD;AAZA,IAAA,WAAA,CAAYF,GAAW,CAAE;QACvB,IAAI,CAACA,GAAG,GAAGA,GAAAA;AACb;AAWF;MAEaK,kBAAqB,GAAA,CAACL,GAAgB,GAAA,IAAIN,YAAYM,GAAK;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.mjs","sources":["../../../../src/modules/file-scanner/scanner.ts"],"sourcesContent":["import path from 'node:path';\nimport fastglob from 'fast-glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n // we use fastglob instead of glob because it supports negation patterns\n const filenames = fastglob.sync(patterns, {\n cwd: this.cwd,\n });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n"],"names":["FileScanner","scan","patterns","filenames","fastglob","sync","cwd","map","filename","path","join","
|
|
1
|
+
{"version":3,"file":"scanner.mjs","sources":["../../../../src/modules/file-scanner/scanner.ts"],"sourcesContent":["import path from 'node:path';\nimport fastglob from 'fast-glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n // we use fastglob instead of glob because it supports negation patterns\n const filenames = fastglob.sync(patterns, {\n cwd: this.cwd,\n });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n"],"names":["FileScanner","scan","patterns","filenames","fastglob","sync","cwd","map","filename","path","join","fileScannerFactory"],"mappings":";;;AAKO,MAAMA,WAAAA,CAAAA;AAOXC,IAAAA,IAAAA,CAAKC,QAAkB,EAAE;;AAEvB,QAAA,MAAMC,SAAYC,GAAAA,QAAAA,CAASC,IAAI,CAACH,QAAU,EAAA;YACxCI,GAAK,EAAA,IAAI,CAACA;AACZ,SAAA,CAAA;;QAGA,OAAOH,SAAAA,CAAUI,GAAG,CAAC,CAACC,QAAAA,GAAaC,IAAKC,CAAAA,IAAI,CAAC,IAAI,CAACJ,GAAG,EAAEE,QAAAA,CAAAA,CAAAA;AACzD;AAZA,IAAA,WAAA,CAAYF,GAAW,CAAE;QACvB,IAAI,CAACA,GAAG,GAAGA,GAAAA;AACb;AAWF;MAEaK,kBAAqB,GAAA,CAACL,GAAgB,GAAA,IAAIN,YAAYM,GAAK;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formats.js","sources":["../../../../src/modules/format/formats.ts"],"sourcesContent":["import CliTable3 from 'cli-table3';\nimport chalk from 'chalk';\n\nimport { constants as timerConstants } from '../timer';\n\nimport type { AppProject, PluginProject, ProjectType } from '../project';\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\nimport type { Report } from '../report';\n\nexport const path = (path: string) => chalk.blue(path);\n\nexport const version = (version: Version.LiteralVersion | Version.SemVer) => {\n return chalk.italic.yellow(`v${version}`);\n};\n\nexport const codemodUID = (uid: string) => {\n return chalk.bold.cyan(uid);\n};\n\nexport const projectDetails = (project: AppProject | PluginProject) => {\n return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;\n};\n\nexport const projectType = (type: ProjectType) => chalk.cyan(type);\n\nexport const versionRange = (range: Version.Range) => chalk.italic.yellow(range.raw);\n\nexport const transform = (transformFilePath: string) => chalk.cyan(transformFilePath);\n\nexport const highlight = (arg: unknown) => chalk.bold.underline(arg);\n\nexport const upgradeStep = (text: string, step: [current: number, total: number]) => {\n return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);\n};\n\nexport const reports = (reports: Report.CodemodReport[]) => {\n const rows = reports.map(({ codemod, report }, i) => {\n const fIndex = chalk.grey(i);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fFormattedTransformPath = chalk.cyan(codemod.format());\n const fTimeElapsed =\n i === 0\n ? `${report.timeElapsed}s ${chalk.dim.italic('(cold start)')}`\n : `${report.timeElapsed}s`;\n const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);\n const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);\n\n return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.cyan('Name'),\n chalk.bold.green('Affected'),\n chalk.bold.red('Unchanged'),\n chalk.bold.blue('Duration'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const codemodList = (codemods: Codemod.List) => {\n type Row = [index: string, version: string, kind: string, name: string, uid: string];\n\n const rows = codemods.map<Row>((codemod, index) => {\n const fIndex = chalk.grey(index);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fName = chalk.blue(codemod.format());\n const fUID = codemodUID(codemod.uid);\n\n return [fIndex, fVersion, fKind, fName, fUID] satisfies Row;\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.blue('Name'),\n chalk.bold.cyan('UID'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const durationMs = (elapsedMs: number) => {\n const elapsedSeconds = (elapsedMs / timerConstants.ONE_SECOND_MS).toFixed(3);\n\n return `${elapsedSeconds}s`;\n};\n"],"names":["path","chalk","blue","version","italic","yellow","codemodUID","uid","bold","cyan","projectDetails","project","projectType","type","cwd","paths","map","versionRange","range","raw","transform","transformFilePath","highlight","arg","underline","upgradeStep","text","step","reports","rows","codemod","report","i","fIndex","grey","fVersion","magenta","fKind","kind","fFormattedTransformPath","format","fTimeElapsed","timeElapsed","dim","fAffected","ok","green","fUnchanged","red","nochange","table","CliTable3","style","compact","head","push","toString","codemodList","codemods","index","fName","fUID","durationMs","elapsedMs","elapsedSeconds","timerConstants","toFixed"],"mappings":";;;;;;MAUaA,IAAO,GAAA,CAACA,OAAiBC,KAAMC,CAAAA,IAAI,CAACF,IAAM;AAEhD,MAAMG,UAAU,CAACA,OAAAA,GAAAA;IACtB,OAAOF,KAAAA,CAAMG,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEF,
|
|
1
|
+
{"version":3,"file":"formats.js","sources":["../../../../src/modules/format/formats.ts"],"sourcesContent":["import CliTable3 from 'cli-table3';\nimport chalk from 'chalk';\n\nimport { constants as timerConstants } from '../timer';\n\nimport type { AppProject, PluginProject, ProjectType } from '../project';\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\nimport type { Report } from '../report';\n\nexport const path = (path: string) => chalk.blue(path);\n\nexport const version = (version: Version.LiteralVersion | Version.SemVer) => {\n return chalk.italic.yellow(`v${version}`);\n};\n\nexport const codemodUID = (uid: string) => {\n return chalk.bold.cyan(uid);\n};\n\nexport const projectDetails = (project: AppProject | PluginProject) => {\n return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;\n};\n\nexport const projectType = (type: ProjectType) => chalk.cyan(type);\n\nexport const versionRange = (range: Version.Range) => chalk.italic.yellow(range.raw);\n\nexport const transform = (transformFilePath: string) => chalk.cyan(transformFilePath);\n\nexport const highlight = (arg: unknown) => chalk.bold.underline(arg);\n\nexport const upgradeStep = (text: string, step: [current: number, total: number]) => {\n return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);\n};\n\nexport const reports = (reports: Report.CodemodReport[]) => {\n const rows = reports.map(({ codemod, report }, i) => {\n const fIndex = chalk.grey(i);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fFormattedTransformPath = chalk.cyan(codemod.format());\n const fTimeElapsed =\n i === 0\n ? `${report.timeElapsed}s ${chalk.dim.italic('(cold start)')}`\n : `${report.timeElapsed}s`;\n const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);\n const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);\n\n return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.cyan('Name'),\n chalk.bold.green('Affected'),\n chalk.bold.red('Unchanged'),\n chalk.bold.blue('Duration'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const codemodList = (codemods: Codemod.List) => {\n type Row = [index: string, version: string, kind: string, name: string, uid: string];\n\n const rows = codemods.map<Row>((codemod, index) => {\n const fIndex = chalk.grey(index);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fName = chalk.blue(codemod.format());\n const fUID = codemodUID(codemod.uid);\n\n return [fIndex, fVersion, fKind, fName, fUID] satisfies Row;\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.blue('Name'),\n chalk.bold.cyan('UID'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const durationMs = (elapsedMs: number) => {\n const elapsedSeconds = (elapsedMs / timerConstants.ONE_SECOND_MS).toFixed(3);\n\n return `${elapsedSeconds}s`;\n};\n"],"names":["path","chalk","blue","version","italic","yellow","codemodUID","uid","bold","cyan","projectDetails","project","projectType","type","cwd","paths","map","versionRange","range","raw","transform","transformFilePath","highlight","arg","underline","upgradeStep","text","step","reports","rows","codemod","report","i","fIndex","grey","fVersion","magenta","fKind","kind","fFormattedTransformPath","format","fTimeElapsed","timeElapsed","dim","fAffected","ok","green","fUnchanged","red","nochange","table","CliTable3","style","compact","head","push","toString","codemodList","codemods","index","fName","fUID","durationMs","elapsedMs","elapsedSeconds","timerConstants","toFixed"],"mappings":"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"}
|