@strapi/upgrade 0.0.0-next.f0bfcece1007e5aa527570187635aefc86db536e → 0.0.0-next.f0f36e3df4b18f167036dcbca529dcb933bf4e1d

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.
Files changed (89) hide show
  1. package/dist/modules/npm/package.d.ts +7 -3
  2. package/dist/modules/npm/package.d.ts.map +1 -1
  3. package/dist/package.json.js +1 -1
  4. package/dist/package.json.mjs +1 -1
  5. package/dist/src/cli/commands/codemods.js.map +1 -1
  6. package/dist/src/cli/commands/codemods.mjs.map +1 -1
  7. package/dist/src/cli/options.js +0 -1
  8. package/dist/src/cli/options.js.map +1 -1
  9. package/dist/src/cli/options.mjs +0 -1
  10. package/dist/src/cli/options.mjs.map +1 -1
  11. package/dist/src/modules/codemod/codemod.js.map +1 -1
  12. package/dist/src/modules/codemod/codemod.mjs.map +1 -1
  13. package/dist/src/modules/codemod-repository/repository.js +0 -1
  14. package/dist/src/modules/codemod-repository/repository.js.map +1 -1
  15. package/dist/src/modules/codemod-repository/repository.mjs +0 -1
  16. package/dist/src/modules/codemod-repository/repository.mjs.map +1 -1
  17. package/dist/src/modules/codemod-runner/codemod-runner.js +0 -1
  18. package/dist/src/modules/codemod-runner/codemod-runner.js.map +1 -1
  19. package/dist/src/modules/codemod-runner/codemod-runner.mjs +0 -1
  20. package/dist/src/modules/codemod-runner/codemod-runner.mjs.map +1 -1
  21. package/dist/src/modules/error/utils.js.map +1 -1
  22. package/dist/src/modules/error/utils.mjs.map +1 -1
  23. package/dist/src/modules/file-scanner/scanner.js.map +1 -1
  24. package/dist/src/modules/file-scanner/scanner.mjs.map +1 -1
  25. package/dist/src/modules/format/formats.js.map +1 -1
  26. package/dist/src/modules/format/formats.mjs.map +1 -1
  27. package/dist/src/modules/json/file.js.map +1 -1
  28. package/dist/src/modules/json/file.mjs.map +1 -1
  29. package/dist/src/modules/json/transform-api.js.map +1 -1
  30. package/dist/src/modules/json/transform-api.mjs.map +1 -1
  31. package/dist/src/modules/logger/logger.js.map +1 -1
  32. package/dist/src/modules/logger/logger.mjs.map +1 -1
  33. package/dist/src/modules/npm/package.js +52 -6
  34. package/dist/src/modules/npm/package.js.map +1 -1
  35. package/dist/src/modules/npm/package.mjs +52 -6
  36. package/dist/src/modules/npm/package.mjs.map +1 -1
  37. package/dist/src/modules/project/constants.js.map +1 -1
  38. package/dist/src/modules/project/constants.mjs.map +1 -1
  39. package/dist/src/modules/project/project.js +2 -5
  40. package/dist/src/modules/project/project.js.map +1 -1
  41. package/dist/src/modules/project/project.mjs +2 -5
  42. package/dist/src/modules/project/project.mjs.map +1 -1
  43. package/dist/src/modules/requirement/requirement.js.map +1 -1
  44. package/dist/src/modules/requirement/requirement.mjs.map +1 -1
  45. package/dist/src/modules/runner/code/code.js +1 -2
  46. package/dist/src/modules/runner/code/code.js.map +1 -1
  47. package/dist/src/modules/runner/code/code.mjs +1 -2
  48. package/dist/src/modules/runner/code/code.mjs.map +1 -1
  49. package/dist/src/modules/runner/json/json.js +1 -2
  50. package/dist/src/modules/runner/json/json.js.map +1 -1
  51. package/dist/src/modules/runner/json/json.mjs +1 -2
  52. package/dist/src/modules/runner/json/json.mjs.map +1 -1
  53. package/dist/src/modules/runner/json/transform.js.map +1 -1
  54. package/dist/src/modules/runner/json/transform.mjs.map +1 -1
  55. package/dist/src/modules/runner/runner.js.map +1 -1
  56. package/dist/src/modules/runner/runner.mjs.map +1 -1
  57. package/dist/src/modules/timer/timer.js.map +1 -1
  58. package/dist/src/modules/timer/timer.mjs.map +1 -1
  59. package/dist/src/modules/upgrader/upgrader.js +0 -1
  60. package/dist/src/modules/upgrader/upgrader.js.map +1 -1
  61. package/dist/src/modules/upgrader/upgrader.mjs +0 -1
  62. package/dist/src/modules/upgrader/upgrader.mjs.map +1 -1
  63. package/dist/src/modules/version/range.js.map +1 -1
  64. package/dist/src/modules/version/range.mjs.map +1 -1
  65. package/dist/src/modules/version/types.js +5 -3
  66. package/dist/src/modules/version/types.js.map +1 -1
  67. package/dist/src/modules/version/types.mjs +3 -3
  68. package/dist/src/modules/version/types.mjs.map +1 -1
  69. package/dist/src/tasks/codemods/list-codemods.js.map +1 -1
  70. package/dist/src/tasks/codemods/list-codemods.mjs.map +1 -1
  71. package/dist/src/tasks/codemods/run-codemods.js.map +1 -1
  72. package/dist/src/tasks/codemods/run-codemods.mjs.map +1 -1
  73. package/dist/src/tasks/codemods/utils.js.map +1 -1
  74. package/dist/src/tasks/codemods/utils.mjs.map +1 -1
  75. package/dist/src/tasks/index.js +0 -1
  76. package/dist/src/tasks/index.js.map +1 -1
  77. package/dist/src/tasks/index.mjs +0 -1
  78. package/dist/src/tasks/index.mjs.map +1 -1
  79. package/dist/src/tasks/upgrade/prompts/latest.js.map +1 -1
  80. package/dist/src/tasks/upgrade/prompts/latest.mjs.map +1 -1
  81. package/dist/src/tasks/upgrade/requirements/major.js +0 -1
  82. package/dist/src/tasks/upgrade/requirements/major.js.map +1 -1
  83. package/dist/src/tasks/upgrade/requirements/major.mjs +0 -1
  84. package/dist/src/tasks/upgrade/requirements/major.mjs.map +1 -1
  85. package/dist/src/tasks/upgrade/upgrade.js +1 -1
  86. package/dist/src/tasks/upgrade/upgrade.js.map +1 -1
  87. package/dist/src/tasks/upgrade/upgrade.mjs +1 -1
  88. package/dist/src/tasks/upgrade/upgrade.mjs.map +1 -1
  89. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"file":"project.mjs","sources":["../../../../src/modules/project/project.ts"],"sourcesContent":["import path from 'node:path';\nimport assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\n\nimport { semVerFactory, isLiteralSemVer, isValidSemVer } from '../version';\nimport { fileScannerFactory } from '../file-scanner';\nimport { codeRunnerFactory } from '../runner/code';\nimport { jsonRunnerFactory } from '../runner/json';\nimport * as constants from './constants';\n\nimport type { Version } from '../version';\nimport type { Codemod } from '../codemod';\nimport type { Report } from '../report';\nimport type {\n FileExtension,\n MinimalPackageJSON,\n ProjectConfig,\n ProjectType,\n RunCodemodsOptions,\n} from './types';\n\nexport class Project {\n public cwd: string;\n\n // The following properties are assigned during the .refresh() call in the constructor.\n\n public files!: string[];\n\n public packageJSONPath!: string;\n\n public packageJSON!: MinimalPackageJSON;\n\n public readonly paths: string[];\n\n constructor(cwd: string, config: ProjectConfig) {\n if (!fse.pathExistsSync(cwd)) {\n throw new Error(`ENOENT: no such file or directory, access '${cwd}'`);\n }\n\n this.cwd = cwd;\n this.paths = config.paths;\n\n this.refresh();\n }\n\n getFilesByExtensions(extensions: FileExtension[]) {\n return this.files.filter((filePath) => {\n const fileExtension = path.extname(filePath) as FileExtension;\n\n return extensions.includes(fileExtension);\n });\n }\n\n refresh() {\n this.refreshPackageJSON();\n this.refreshProjectFiles();\n\n return this;\n }\n\n async runCodemods(codemods: Codemod.List, options: RunCodemodsOptions) {\n const runners = this.createProjectCodemodsRunners(options.dry);\n const reports: Report.CodemodReport[] = [];\n\n for (const codemod of codemods) {\n for (const runner of runners) {\n if (runner.valid(codemod)) {\n const report = await runner.run(codemod);\n reports.push({ codemod, report });\n }\n }\n }\n\n return reports;\n }\n\n private createProjectCodemodsRunners(dry: boolean = false) {\n const jsonExtensions = constants.PROJECT_JSON_EXTENSIONS.map<FileExtension>((ext) => `.${ext}`);\n const codeExtensions = constants.PROJECT_CODE_EXTENSIONS.map<FileExtension>((ext) => `.${ext}`);\n\n const jsonFiles = this.getFilesByExtensions(jsonExtensions);\n const codeFiles = this.getFilesByExtensions(codeExtensions);\n\n const codeRunner = codeRunnerFactory(codeFiles, {\n dry,\n parser: 'ts',\n runInBand: true,\n babel: true,\n extensions: constants.PROJECT_CODE_EXTENSIONS.join(','),\n // Don't output any log coming from the runner\n print: false,\n silent: true,\n verbose: 0,\n });\n\n const jsonRunner = jsonRunnerFactory(jsonFiles, { dry, cwd: this.cwd });\n\n return [codeRunner, jsonRunner] as const;\n }\n\n private refreshPackageJSON(): void {\n const packageJSONPath = path.join(this.cwd, constants.PROJECT_PACKAGE_JSON);\n\n try {\n fse.accessSync(packageJSONPath);\n } catch {\n throw new Error(`Could not find a ${constants.PROJECT_PACKAGE_JSON} file in ${this.cwd}`);\n }\n\n const packageJSONBuffer = fse.readFileSync(packageJSONPath);\n\n this.packageJSONPath = packageJSONPath;\n this.packageJSON = JSON.parse(packageJSONBuffer.toString());\n }\n\n private refreshProjectFiles(): void {\n const scanner = fileScannerFactory(this.cwd);\n\n this.files = scanner.scan(this.paths);\n }\n}\n\nexport class AppProject extends Project {\n public strapiVersion!: Version.SemVer;\n\n readonly type = 'application' as const satisfies ProjectType;\n\n /**\n * Returns an array of allowed file paths for a Strapi application\n *\n * The resulting paths include app default files and the root package.json file.\n */\n private static get paths() {\n const allowedRootPaths = formatGlobCollectionPattern(constants.PROJECT_APP_ALLOWED_ROOT_PATHS);\n const allowedExtensions = formatGlobCollectionPattern(constants.PROJECT_ALLOWED_EXTENSIONS);\n\n return [\n // App default files\n `./${allowedRootPaths}/**/*.${allowedExtensions}`,\n `!./**/node_modules/**/*`,\n `!./**/dist/**/*`,\n // Root package.json file\n constants.PROJECT_PACKAGE_JSON,\n ];\n }\n\n constructor(cwd: string) {\n super(cwd, { paths: AppProject.paths });\n this.refreshStrapiVersion();\n }\n\n refresh() {\n super.refresh();\n this.refreshStrapiVersion();\n return this;\n }\n\n private refreshStrapiVersion(): void {\n this.strapiVersion =\n // First try to get the strapi version from the package.json dependencies\n this.findStrapiVersionFromProjectPackageJSON() ??\n // If the version found is not a valid SemVer, get the Strapi version from the installed package\n this.findLocallyInstalledStrapiVersion();\n }\n\n private findStrapiVersionFromProjectPackageJSON(): Version.SemVer | undefined {\n const projectName = this.packageJSON.name;\n const version = this.packageJSON.dependencies?.[constants.STRAPI_DEPENDENCY_NAME];\n\n if (version === undefined) {\n throw new Error(\n `No version of ${constants.STRAPI_DEPENDENCY_NAME} was found in ${projectName}. Are you in a valid Strapi project?`\n );\n }\n\n const isValidSemVer = isLiteralSemVer(version) && semver.valid(version) === version;\n\n // We return undefined only if a strapi/strapi version is found, but it's not semver compliant\n return isValidSemVer ? semVerFactory(version) : undefined;\n }\n\n private findLocallyInstalledStrapiVersion(): Version.SemVer {\n const packageSearchText = `${constants.STRAPI_DEPENDENCY_NAME}/package.json`;\n\n let strapiPackageJSONPath: string;\n let strapiPackageJSON: MinimalPackageJSON;\n\n try {\n strapiPackageJSONPath = require.resolve(packageSearchText, { paths: [this.cwd] });\n strapiPackageJSON = require(strapiPackageJSONPath);\n\n assert(typeof strapiPackageJSON === 'object');\n } catch {\n throw new Error(\n `Cannot resolve module \"${constants.STRAPI_DEPENDENCY_NAME}\" from paths [${this.cwd}]`\n );\n }\n\n const strapiVersion = strapiPackageJSON.version;\n\n if (!isValidSemVer(strapiVersion)) {\n throw new Error(\n `Invalid ${constants.STRAPI_DEPENDENCY_NAME} version found in ${strapiPackageJSONPath} (${strapiVersion})`\n );\n }\n\n return semVerFactory(strapiVersion);\n }\n}\n\nconst formatGlobCollectionPattern = (collection: string[]): string => {\n assert(\n collection.length > 0,\n 'Invalid pattern provided, the given collection needs at least 1 element'\n );\n\n return collection.length === 1 ? collection[0] : `{${collection}}`;\n};\n\nexport class PluginProject extends Project {\n readonly type = 'plugin' as const satisfies ProjectType;\n\n /**\n * Returns an array of allowed file paths for a Strapi plugin\n *\n * The resulting paths include plugin default files, the root package.json file, and plugin-specific files.\n */\n private static get paths() {\n const allowedRootPaths = formatGlobCollectionPattern(\n constants.PROJECT_PLUGIN_ALLOWED_ROOT_PATHS\n );\n const allowedExtensions = formatGlobCollectionPattern(constants.PROJECT_ALLOWED_EXTENSIONS);\n\n return [\n // Plugin default files\n `./${allowedRootPaths}/**/*.${allowedExtensions}`,\n `!./**/node_modules/**/*`,\n `!./**/dist/**/*`,\n // Root package.json file\n constants.PROJECT_PACKAGE_JSON,\n // Plugin root files\n ...constants.PROJECT_PLUGIN_ROOT_FILES,\n ];\n }\n\n constructor(cwd: string) {\n super(cwd, { paths: PluginProject.paths });\n }\n}\n\nconst isPlugin = (cwd: string) => {\n const packageJSONPath = path.join(cwd, constants.PROJECT_PACKAGE_JSON);\n\n try {\n fse.accessSync(packageJSONPath);\n } catch {\n throw new Error(`Could not find a ${constants.PROJECT_PACKAGE_JSON} file in ${cwd}`);\n }\n\n const packageJSONBuffer = fse.readFileSync(packageJSONPath);\n\n const packageJSON = JSON.parse(packageJSONBuffer.toString());\n\n return packageJSON?.strapi?.kind === 'plugin';\n};\n\n// TODO: make this async so we can use async file methods\nexport const projectFactory = (cwd: string) => {\n fse.accessSync(cwd);\n\n return isPlugin(cwd) ? new PluginProject(cwd) : new AppProject(cwd);\n};\n"],"names":["Project","getFilesByExtensions","extensions","files","filter","filePath","fileExtension","path","extname","includes","refresh","refreshPackageJSON","refreshProjectFiles","runCodemods","codemods","options","runners","createProjectCodemodsRunners","dry","reports","codemod","runner","valid","report","run","push","jsonExtensions","constants","map","ext","codeExtensions","jsonFiles","codeFiles","codeRunner","codeRunnerFactory","parser","runInBand","babel","join","print","silent","verbose","jsonRunner","jsonRunnerFactory","cwd","packageJSONPath","fse","accessSync","Error","packageJSONBuffer","readFileSync","packageJSON","JSON","parse","toString","scanner","fileScannerFactory","scan","paths","constructor","config","pathExistsSync","AppProject","allowedRootPaths","formatGlobCollectionPattern","allowedExtensions","refreshStrapiVersion","strapiVersion","findStrapiVersionFromProjectPackageJSON","findLocallyInstalledStrapiVersion","projectName","name","version","dependencies","undefined","isValidSemVer","isLiteralSemVer","semver","semVerFactory","packageSearchText","strapiPackageJSONPath","strapiPackageJSON","require","resolve","assert","type","collection","length","PluginProject","isPlugin","strapi","kind","projectFactory"],"mappings":"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"}
1
+ {"version":3,"file":"project.mjs","sources":["../../../../src/modules/project/project.ts"],"sourcesContent":["import path from 'node:path';\nimport assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\n\nimport { semVerFactory, isLiteralSemVer, isValidSemVer } from '../version';\nimport { fileScannerFactory } from '../file-scanner';\nimport { codeRunnerFactory } from '../runner/code';\nimport { jsonRunnerFactory } from '../runner/json';\nimport * as constants from './constants';\n\nimport type { Version } from '../version';\nimport type { Codemod } from '../codemod';\nimport type { Report } from '../report';\nimport type {\n FileExtension,\n MinimalPackageJSON,\n ProjectConfig,\n ProjectType,\n RunCodemodsOptions,\n} from './types';\n\nexport class Project {\n public cwd: string;\n\n // The following properties are assigned during the .refresh() call in the constructor.\n\n public files!: string[];\n\n public packageJSONPath!: string;\n\n public packageJSON!: MinimalPackageJSON;\n\n public readonly paths: string[];\n\n constructor(cwd: string, config: ProjectConfig) {\n if (!fse.pathExistsSync(cwd)) {\n throw new Error(`ENOENT: no such file or directory, access '${cwd}'`);\n }\n\n this.cwd = cwd;\n this.paths = config.paths;\n\n this.refresh();\n }\n\n getFilesByExtensions(extensions: FileExtension[]) {\n return this.files.filter((filePath) => {\n const fileExtension = path.extname(filePath) as FileExtension;\n\n return extensions.includes(fileExtension);\n });\n }\n\n refresh() {\n this.refreshPackageJSON();\n this.refreshProjectFiles();\n\n return this;\n }\n\n async runCodemods(codemods: Codemod.List, options: RunCodemodsOptions) {\n const runners = this.createProjectCodemodsRunners(options.dry);\n const reports: Report.CodemodReport[] = [];\n\n for (const codemod of codemods) {\n for (const runner of runners) {\n if (runner.valid(codemod)) {\n const report = await runner.run(codemod);\n reports.push({ codemod, report });\n }\n }\n }\n\n return reports;\n }\n\n private createProjectCodemodsRunners(dry: boolean = false) {\n const jsonExtensions = constants.PROJECT_JSON_EXTENSIONS.map<FileExtension>((ext) => `.${ext}`);\n const codeExtensions = constants.PROJECT_CODE_EXTENSIONS.map<FileExtension>((ext) => `.${ext}`);\n\n const jsonFiles = this.getFilesByExtensions(jsonExtensions);\n const codeFiles = this.getFilesByExtensions(codeExtensions);\n\n const codeRunner = codeRunnerFactory(codeFiles, {\n dry,\n parser: 'ts',\n runInBand: true,\n babel: true,\n extensions: constants.PROJECT_CODE_EXTENSIONS.join(','),\n // Don't output any log coming from the runner\n print: false,\n silent: true,\n verbose: 0,\n });\n\n const jsonRunner = jsonRunnerFactory(jsonFiles, { dry, cwd: this.cwd });\n\n return [codeRunner, jsonRunner] as const;\n }\n\n private refreshPackageJSON(): void {\n const packageJSONPath = path.join(this.cwd, constants.PROJECT_PACKAGE_JSON);\n\n try {\n fse.accessSync(packageJSONPath);\n } catch {\n throw new Error(`Could not find a ${constants.PROJECT_PACKAGE_JSON} file in ${this.cwd}`);\n }\n\n const packageJSONBuffer = fse.readFileSync(packageJSONPath);\n\n this.packageJSONPath = packageJSONPath;\n this.packageJSON = JSON.parse(packageJSONBuffer.toString());\n }\n\n private refreshProjectFiles(): void {\n const scanner = fileScannerFactory(this.cwd);\n\n this.files = scanner.scan(this.paths);\n }\n}\n\nexport class AppProject extends Project {\n public strapiVersion!: Version.SemVer;\n\n readonly type = 'application' as const satisfies ProjectType;\n\n /**\n * Returns an array of allowed file paths for a Strapi application\n *\n * The resulting paths include app default files and the root package.json file.\n */\n private static get paths() {\n const allowedRootPaths = formatGlobCollectionPattern(constants.PROJECT_APP_ALLOWED_ROOT_PATHS);\n const allowedExtensions = formatGlobCollectionPattern(constants.PROJECT_ALLOWED_EXTENSIONS);\n\n return [\n // App default files\n `./${allowedRootPaths}/**/*.${allowedExtensions}`,\n `!./**/node_modules/**/*`,\n `!./**/dist/**/*`,\n // Root package.json file\n constants.PROJECT_PACKAGE_JSON,\n ];\n }\n\n constructor(cwd: string) {\n super(cwd, { paths: AppProject.paths });\n this.refreshStrapiVersion();\n }\n\n refresh() {\n super.refresh();\n this.refreshStrapiVersion();\n return this;\n }\n\n private refreshStrapiVersion(): void {\n this.strapiVersion =\n // First try to get the strapi version from the package.json dependencies\n this.findStrapiVersionFromProjectPackageJSON() ??\n // If the version found is not a valid SemVer, get the Strapi version from the installed package\n this.findLocallyInstalledStrapiVersion();\n }\n\n private findStrapiVersionFromProjectPackageJSON(): Version.SemVer | undefined {\n const projectName = this.packageJSON.name;\n const version = this.packageJSON.dependencies?.[constants.STRAPI_DEPENDENCY_NAME];\n\n if (version === undefined) {\n throw new Error(\n `No version of ${constants.STRAPI_DEPENDENCY_NAME} was found in ${projectName}. Are you in a valid Strapi project?`\n );\n }\n\n const isValidSemVer = isLiteralSemVer(version) && semver.valid(version) === version;\n\n // We return undefined only if a strapi/strapi version is found, but it's not semver compliant\n return isValidSemVer ? semVerFactory(version) : undefined;\n }\n\n private findLocallyInstalledStrapiVersion(): Version.SemVer {\n const packageSearchText = `${constants.STRAPI_DEPENDENCY_NAME}/package.json`;\n\n let strapiPackageJSONPath: string;\n let strapiPackageJSON: MinimalPackageJSON;\n\n try {\n strapiPackageJSONPath = require.resolve(packageSearchText, { paths: [this.cwd] });\n strapiPackageJSON = require(strapiPackageJSONPath);\n\n assert(typeof strapiPackageJSON === 'object');\n } catch {\n throw new Error(\n `Cannot resolve module \"${constants.STRAPI_DEPENDENCY_NAME}\" from paths [${this.cwd}]`\n );\n }\n\n const strapiVersion = strapiPackageJSON.version;\n\n if (!isValidSemVer(strapiVersion)) {\n throw new Error(\n `Invalid ${constants.STRAPI_DEPENDENCY_NAME} version found in ${strapiPackageJSONPath} (${strapiVersion})`\n );\n }\n\n return semVerFactory(strapiVersion);\n }\n}\n\nconst formatGlobCollectionPattern = (collection: string[]): string => {\n assert(\n collection.length > 0,\n 'Invalid pattern provided, the given collection needs at least 1 element'\n );\n\n return collection.length === 1 ? collection[0] : `{${collection}}`;\n};\n\nexport class PluginProject extends Project {\n readonly type = 'plugin' as const satisfies ProjectType;\n\n /**\n * Returns an array of allowed file paths for a Strapi plugin\n *\n * The resulting paths include plugin default files, the root package.json file, and plugin-specific files.\n */\n private static get paths() {\n const allowedRootPaths = formatGlobCollectionPattern(\n constants.PROJECT_PLUGIN_ALLOWED_ROOT_PATHS\n );\n const allowedExtensions = formatGlobCollectionPattern(constants.PROJECT_ALLOWED_EXTENSIONS);\n\n return [\n // Plugin default files\n `./${allowedRootPaths}/**/*.${allowedExtensions}`,\n `!./**/node_modules/**/*`,\n `!./**/dist/**/*`,\n // Root package.json file\n constants.PROJECT_PACKAGE_JSON,\n // Plugin root files\n ...constants.PROJECT_PLUGIN_ROOT_FILES,\n ];\n }\n\n constructor(cwd: string) {\n super(cwd, { paths: PluginProject.paths });\n }\n}\n\nconst isPlugin = (cwd: string) => {\n const packageJSONPath = path.join(cwd, constants.PROJECT_PACKAGE_JSON);\n\n try {\n fse.accessSync(packageJSONPath);\n } catch {\n throw new Error(`Could not find a ${constants.PROJECT_PACKAGE_JSON} file in ${cwd}`);\n }\n\n const packageJSONBuffer = fse.readFileSync(packageJSONPath);\n\n const packageJSON = JSON.parse(packageJSONBuffer.toString());\n\n return packageJSON?.strapi?.kind === 'plugin';\n};\n\n// TODO: make this async so we can use async file methods\nexport const projectFactory = (cwd: string) => {\n fse.accessSync(cwd);\n\n return isPlugin(cwd) ? new PluginProject(cwd) : new AppProject(cwd);\n};\n"],"names":["Project","getFilesByExtensions","extensions","files","filter","filePath","fileExtension","path","extname","includes","refresh","refreshPackageJSON","refreshProjectFiles","runCodemods","codemods","options","runners","createProjectCodemodsRunners","dry","reports","codemod","runner","valid","report","run","push","jsonExtensions","constants","map","ext","codeExtensions","jsonFiles","codeFiles","codeRunner","codeRunnerFactory","parser","runInBand","babel","join","print","silent","verbose","jsonRunner","jsonRunnerFactory","cwd","packageJSONPath","fse","accessSync","Error","packageJSONBuffer","readFileSync","packageJSON","JSON","parse","toString","scanner","fileScannerFactory","scan","paths","config","pathExistsSync","AppProject","allowedRootPaths","formatGlobCollectionPattern","allowedExtensions","refreshStrapiVersion","strapiVersion","findStrapiVersionFromProjectPackageJSON","findLocallyInstalledStrapiVersion","projectName","name","version","dependencies","undefined","isValidSemVer","isLiteralSemVer","semver","semVerFactory","packageSearchText","strapiPackageJSONPath","strapiPackageJSON","require","resolve","assert","type","collection","length","PluginProject","isPlugin","strapi","kind","projectFactory"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"requirement.js","sources":["../../../../src/modules/requirement/requirement.ts"],"sourcesContent":["import type {\n Requirement as RequirementInterface,\n RequirementTestCallback,\n TestContext,\n TestResult,\n} from './types';\n\nexport class Requirement implements RequirementInterface {\n readonly isRequired: boolean;\n\n readonly name: string;\n\n readonly testCallback: RequirementTestCallback | null;\n\n children: RequirementInterface[];\n\n constructor(name: string, testCallback: RequirementTestCallback | null, isRequired?: boolean) {\n this.name = name;\n this.testCallback = testCallback;\n this.isRequired = isRequired ?? true;\n this.children = [];\n }\n\n setChildren(children: RequirementInterface[]) {\n this.children = children;\n return this;\n }\n\n addChild(child: RequirementInterface) {\n this.children.push(child);\n return this;\n }\n\n asOptional() {\n const newInstance = requirementFactory(this.name, this.testCallback, false);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n asRequired() {\n const newInstance = requirementFactory(this.name, this.testCallback, true);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n async test(context: TestContext) {\n try {\n await this.testCallback?.(context);\n return ok();\n } catch (e) {\n if (e instanceof Error) {\n return errored(e);\n }\n\n if (typeof e === 'string') {\n return errored(new Error(e));\n }\n\n return errored(new Error('Unknown error'));\n }\n }\n}\n\nconst ok = (): TestResult => ({ pass: true, error: null });\n\nconst errored = (error: Error): TestResult => ({ pass: false, error });\n\nexport const requirementFactory = (\n name: string,\n testCallback: RequirementTestCallback | null,\n isRequired?: boolean\n) => new Requirement(name, testCallback, isRequired);\n"],"names":["Requirement","setChildren","children","addChild","child","push","asOptional","newInstance","requirementFactory","name","testCallback","asRequired","test","context","ok","e","Error","errored","constructor","isRequired","pass","error"],"mappings":";;AAOO,MAAMA,WAAAA,CAAAA;AAgBXC,IAAAA,WAAAA,CAAYC,QAAgC,EAAE;QAC5C,IAAI,CAACA,QAAQ,GAAGA,QAAAA;AAChB,QAAA,OAAO,IAAI;AACb;AAEAC,IAAAA,QAAAA,CAASC,KAA2B,EAAE;AACpC,QAAA,IAAI,CAACF,QAAQ,CAACG,IAAI,CAACD,KAAAA,CAAAA;AACnB,QAAA,OAAO,IAAI;AACb;IAEAE,UAAa,GAAA;QACX,MAAMC,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,KAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEAI,UAAa,GAAA;QACX,MAAMJ,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,IAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEA,MAAMK,IAAAA,CAAKC,OAAoB,EAAE;QAC/B,IAAI;YACF,MAAM,IAAI,CAACH,YAAY,GAAGG,OAAAA,CAAAA;YAC1B,OAAOC,EAAAA,EAAAA;AACT,SAAA,CAAE,OAAOC,CAAG,EAAA;AACV,YAAA,IAAIA,aAAaC,KAAO,EAAA;AACtB,gBAAA,OAAOC,OAAQF,CAAAA,CAAAA,CAAAA;AACjB;YAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;gBACzB,OAAOE,OAAAA,CAAQ,IAAID,KAAMD,CAAAA,CAAAA,CAAAA,CAAAA;AAC3B;YAEA,OAAOE,OAAAA,CAAQ,IAAID,KAAM,CAAA,eAAA,CAAA,CAAA;AAC3B;AACF;AAhDAE,IAAAA,WAAAA,CAAYT,IAAY,EAAEC,YAA4C,EAAES,UAAoB,CAAE;QAC5F,IAAI,CAACV,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAACC,YAAY,GAAGA,YAAAA;QACpB,IAAI,CAACS,UAAU,GAAGA,UAAc,IAAA,IAAA;QAChC,IAAI,CAACjB,QAAQ,GAAG,EAAE;AACpB;AA4CF;AAEA,MAAMY,EAAAA,GAAK,KAAmB;QAAEM,IAAM,EAAA,IAAA;QAAMC,KAAO,EAAA;KAAK,CAAA;AAExD,MAAMJ,OAAAA,GAAU,CAACI,KAAAA,IAA8B;QAAED,IAAM,EAAA,KAAA;AAAOC,QAAAA;KAAM,CAAA;AAE7D,MAAMb,kBAAqB,GAAA,CAChCC,IACAC,EAAAA,YAAAA,EACAS,aACG,IAAInB,WAAAA,CAAYS,IAAMC,EAAAA,YAAAA,EAAcS,UAAY;;;;;"}
1
+ {"version":3,"file":"requirement.js","sources":["../../../../src/modules/requirement/requirement.ts"],"sourcesContent":["import type {\n Requirement as RequirementInterface,\n RequirementTestCallback,\n TestContext,\n TestResult,\n} from './types';\n\nexport class Requirement implements RequirementInterface {\n readonly isRequired: boolean;\n\n readonly name: string;\n\n readonly testCallback: RequirementTestCallback | null;\n\n children: RequirementInterface[];\n\n constructor(name: string, testCallback: RequirementTestCallback | null, isRequired?: boolean) {\n this.name = name;\n this.testCallback = testCallback;\n this.isRequired = isRequired ?? true;\n this.children = [];\n }\n\n setChildren(children: RequirementInterface[]) {\n this.children = children;\n return this;\n }\n\n addChild(child: RequirementInterface) {\n this.children.push(child);\n return this;\n }\n\n asOptional() {\n const newInstance = requirementFactory(this.name, this.testCallback, false);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n asRequired() {\n const newInstance = requirementFactory(this.name, this.testCallback, true);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n async test(context: TestContext) {\n try {\n await this.testCallback?.(context);\n return ok();\n } catch (e) {\n if (e instanceof Error) {\n return errored(e);\n }\n\n if (typeof e === 'string') {\n return errored(new Error(e));\n }\n\n return errored(new Error('Unknown error'));\n }\n }\n}\n\nconst ok = (): TestResult => ({ pass: true, error: null });\n\nconst errored = (error: Error): TestResult => ({ pass: false, error });\n\nexport const requirementFactory = (\n name: string,\n testCallback: RequirementTestCallback | null,\n isRequired?: boolean\n) => new Requirement(name, testCallback, isRequired);\n"],"names":["Requirement","setChildren","children","addChild","child","push","asOptional","newInstance","requirementFactory","name","testCallback","asRequired","test","context","ok","e","Error","errored","isRequired","pass","error"],"mappings":";;AAOO,MAAMA,WAAAA,CAAAA;AAgBXC,IAAAA,WAAAA,CAAYC,QAAgC,EAAE;QAC5C,IAAI,CAACA,QAAQ,GAAGA,QAAAA;AAChB,QAAA,OAAO,IAAI;AACb;AAEAC,IAAAA,QAAAA,CAASC,KAA2B,EAAE;AACpC,QAAA,IAAI,CAACF,QAAQ,CAACG,IAAI,CAACD,KAAAA,CAAAA;AACnB,QAAA,OAAO,IAAI;AACb;IAEAE,UAAa,GAAA;QACX,MAAMC,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,KAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEAI,UAAa,GAAA;QACX,MAAMJ,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,IAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEA,MAAMK,IAAAA,CAAKC,OAAoB,EAAE;QAC/B,IAAI;YACF,MAAM,IAAI,CAACH,YAAY,GAAGG,OAAAA,CAAAA;YAC1B,OAAOC,EAAAA,EAAAA;AACT,SAAA,CAAE,OAAOC,CAAG,EAAA;AACV,YAAA,IAAIA,aAAaC,KAAO,EAAA;AACtB,gBAAA,OAAOC,OAAQF,CAAAA,CAAAA,CAAAA;AACjB;YAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;gBACzB,OAAOE,OAAAA,CAAQ,IAAID,KAAMD,CAAAA,CAAAA,CAAAA,CAAAA;AAC3B;YAEA,OAAOE,OAAAA,CAAQ,IAAID,KAAM,CAAA,eAAA,CAAA,CAAA;AAC3B;AACF;AAhDA,IAAA,WAAA,CAAYP,IAAY,EAAEC,YAA4C,EAAEQ,UAAoB,CAAE;QAC5F,IAAI,CAACT,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAACC,YAAY,GAAGA,YAAAA;QACpB,IAAI,CAACQ,UAAU,GAAGA,UAAc,IAAA,IAAA;QAChC,IAAI,CAAChB,QAAQ,GAAG,EAAE;AACpB;AA4CF;AAEA,MAAMY,EAAAA,GAAK,KAAmB;QAAEK,IAAM,EAAA,IAAA;QAAMC,KAAO,EAAA;KAAK,CAAA;AAExD,MAAMH,OAAAA,GAAU,CAACG,KAAAA,IAA8B;QAAED,IAAM,EAAA,KAAA;AAAOC,QAAAA;KAAM,CAAA;AAE7D,MAAMZ,kBAAqB,GAAA,CAChCC,IACAC,EAAAA,YAAAA,EACAQ,aACG,IAAIlB,WAAAA,CAAYS,IAAMC,EAAAA,YAAAA,EAAcQ,UAAY;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"requirement.mjs","sources":["../../../../src/modules/requirement/requirement.ts"],"sourcesContent":["import type {\n Requirement as RequirementInterface,\n RequirementTestCallback,\n TestContext,\n TestResult,\n} from './types';\n\nexport class Requirement implements RequirementInterface {\n readonly isRequired: boolean;\n\n readonly name: string;\n\n readonly testCallback: RequirementTestCallback | null;\n\n children: RequirementInterface[];\n\n constructor(name: string, testCallback: RequirementTestCallback | null, isRequired?: boolean) {\n this.name = name;\n this.testCallback = testCallback;\n this.isRequired = isRequired ?? true;\n this.children = [];\n }\n\n setChildren(children: RequirementInterface[]) {\n this.children = children;\n return this;\n }\n\n addChild(child: RequirementInterface) {\n this.children.push(child);\n return this;\n }\n\n asOptional() {\n const newInstance = requirementFactory(this.name, this.testCallback, false);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n asRequired() {\n const newInstance = requirementFactory(this.name, this.testCallback, true);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n async test(context: TestContext) {\n try {\n await this.testCallback?.(context);\n return ok();\n } catch (e) {\n if (e instanceof Error) {\n return errored(e);\n }\n\n if (typeof e === 'string') {\n return errored(new Error(e));\n }\n\n return errored(new Error('Unknown error'));\n }\n }\n}\n\nconst ok = (): TestResult => ({ pass: true, error: null });\n\nconst errored = (error: Error): TestResult => ({ pass: false, error });\n\nexport const requirementFactory = (\n name: string,\n testCallback: RequirementTestCallback | null,\n isRequired?: boolean\n) => new Requirement(name, testCallback, isRequired);\n"],"names":["Requirement","setChildren","children","addChild","child","push","asOptional","newInstance","requirementFactory","name","testCallback","asRequired","test","context","ok","e","Error","errored","constructor","isRequired","pass","error"],"mappings":"AAOO,MAAMA,WAAAA,CAAAA;AAgBXC,IAAAA,WAAAA,CAAYC,QAAgC,EAAE;QAC5C,IAAI,CAACA,QAAQ,GAAGA,QAAAA;AAChB,QAAA,OAAO,IAAI;AACb;AAEAC,IAAAA,QAAAA,CAASC,KAA2B,EAAE;AACpC,QAAA,IAAI,CAACF,QAAQ,CAACG,IAAI,CAACD,KAAAA,CAAAA;AACnB,QAAA,OAAO,IAAI;AACb;IAEAE,UAAa,GAAA;QACX,MAAMC,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,KAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEAI,UAAa,GAAA;QACX,MAAMJ,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,IAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEA,MAAMK,IAAAA,CAAKC,OAAoB,EAAE;QAC/B,IAAI;YACF,MAAM,IAAI,CAACH,YAAY,GAAGG,OAAAA,CAAAA;YAC1B,OAAOC,EAAAA,EAAAA;AACT,SAAA,CAAE,OAAOC,CAAG,EAAA;AACV,YAAA,IAAIA,aAAaC,KAAO,EAAA;AACtB,gBAAA,OAAOC,OAAQF,CAAAA,CAAAA,CAAAA;AACjB;YAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;gBACzB,OAAOE,OAAAA,CAAQ,IAAID,KAAMD,CAAAA,CAAAA,CAAAA,CAAAA;AAC3B;YAEA,OAAOE,OAAAA,CAAQ,IAAID,KAAM,CAAA,eAAA,CAAA,CAAA;AAC3B;AACF;AAhDAE,IAAAA,WAAAA,CAAYT,IAAY,EAAEC,YAA4C,EAAES,UAAoB,CAAE;QAC5F,IAAI,CAACV,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAACC,YAAY,GAAGA,YAAAA;QACpB,IAAI,CAACS,UAAU,GAAGA,UAAc,IAAA,IAAA;QAChC,IAAI,CAACjB,QAAQ,GAAG,EAAE;AACpB;AA4CF;AAEA,MAAMY,EAAAA,GAAK,KAAmB;QAAEM,IAAM,EAAA,IAAA;QAAMC,KAAO,EAAA;KAAK,CAAA;AAExD,MAAMJ,OAAAA,GAAU,CAACI,KAAAA,IAA8B;QAAED,IAAM,EAAA,KAAA;AAAOC,QAAAA;KAAM,CAAA;AAE7D,MAAMb,kBAAqB,GAAA,CAChCC,IACAC,EAAAA,YAAAA,EACAS,aACG,IAAInB,WAAAA,CAAYS,IAAMC,EAAAA,YAAAA,EAAcS,UAAY;;;;"}
1
+ {"version":3,"file":"requirement.mjs","sources":["../../../../src/modules/requirement/requirement.ts"],"sourcesContent":["import type {\n Requirement as RequirementInterface,\n RequirementTestCallback,\n TestContext,\n TestResult,\n} from './types';\n\nexport class Requirement implements RequirementInterface {\n readonly isRequired: boolean;\n\n readonly name: string;\n\n readonly testCallback: RequirementTestCallback | null;\n\n children: RequirementInterface[];\n\n constructor(name: string, testCallback: RequirementTestCallback | null, isRequired?: boolean) {\n this.name = name;\n this.testCallback = testCallback;\n this.isRequired = isRequired ?? true;\n this.children = [];\n }\n\n setChildren(children: RequirementInterface[]) {\n this.children = children;\n return this;\n }\n\n addChild(child: RequirementInterface) {\n this.children.push(child);\n return this;\n }\n\n asOptional() {\n const newInstance = requirementFactory(this.name, this.testCallback, false);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n asRequired() {\n const newInstance = requirementFactory(this.name, this.testCallback, true);\n\n newInstance.setChildren(this.children);\n\n return newInstance;\n }\n\n async test(context: TestContext) {\n try {\n await this.testCallback?.(context);\n return ok();\n } catch (e) {\n if (e instanceof Error) {\n return errored(e);\n }\n\n if (typeof e === 'string') {\n return errored(new Error(e));\n }\n\n return errored(new Error('Unknown error'));\n }\n }\n}\n\nconst ok = (): TestResult => ({ pass: true, error: null });\n\nconst errored = (error: Error): TestResult => ({ pass: false, error });\n\nexport const requirementFactory = (\n name: string,\n testCallback: RequirementTestCallback | null,\n isRequired?: boolean\n) => new Requirement(name, testCallback, isRequired);\n"],"names":["Requirement","setChildren","children","addChild","child","push","asOptional","newInstance","requirementFactory","name","testCallback","asRequired","test","context","ok","e","Error","errored","isRequired","pass","error"],"mappings":"AAOO,MAAMA,WAAAA,CAAAA;AAgBXC,IAAAA,WAAAA,CAAYC,QAAgC,EAAE;QAC5C,IAAI,CAACA,QAAQ,GAAGA,QAAAA;AAChB,QAAA,OAAO,IAAI;AACb;AAEAC,IAAAA,QAAAA,CAASC,KAA2B,EAAE;AACpC,QAAA,IAAI,CAACF,QAAQ,CAACG,IAAI,CAACD,KAAAA,CAAAA;AACnB,QAAA,OAAO,IAAI;AACb;IAEAE,UAAa,GAAA;QACX,MAAMC,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,KAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEAI,UAAa,GAAA;QACX,MAAMJ,WAAAA,GAAcC,mBAAmB,IAAI,CAACC,IAAI,EAAE,IAAI,CAACC,YAAY,EAAE,IAAA,CAAA;AAErEH,QAAAA,WAAAA,CAAYN,WAAW,CAAC,IAAI,CAACC,QAAQ,CAAA;QAErC,OAAOK,WAAAA;AACT;IAEA,MAAMK,IAAAA,CAAKC,OAAoB,EAAE;QAC/B,IAAI;YACF,MAAM,IAAI,CAACH,YAAY,GAAGG,OAAAA,CAAAA;YAC1B,OAAOC,EAAAA,EAAAA;AACT,SAAA,CAAE,OAAOC,CAAG,EAAA;AACV,YAAA,IAAIA,aAAaC,KAAO,EAAA;AACtB,gBAAA,OAAOC,OAAQF,CAAAA,CAAAA,CAAAA;AACjB;YAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;gBACzB,OAAOE,OAAAA,CAAQ,IAAID,KAAMD,CAAAA,CAAAA,CAAAA,CAAAA;AAC3B;YAEA,OAAOE,OAAAA,CAAQ,IAAID,KAAM,CAAA,eAAA,CAAA,CAAA;AAC3B;AACF;AAhDA,IAAA,WAAA,CAAYP,IAAY,EAAEC,YAA4C,EAAEQ,UAAoB,CAAE;QAC5F,IAAI,CAACT,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAACC,YAAY,GAAGA,YAAAA;QACpB,IAAI,CAACQ,UAAU,GAAGA,UAAc,IAAA,IAAA;QAChC,IAAI,CAAChB,QAAQ,GAAG,EAAE;AACpB;AA4CF;AAEA,MAAMY,EAAAA,GAAK,KAAmB;QAAEK,IAAM,EAAA,IAAA;QAAMC,KAAO,EAAA;KAAK,CAAA;AAExD,MAAMH,OAAAA,GAAU,CAACG,KAAAA,IAA8B;QAAED,IAAM,EAAA,KAAA;AAAOC,QAAAA;KAAM,CAAA;AAE7D,MAAMZ,kBAAqB,GAAA,CAChCC,IACAC,EAAAA,YAAAA,EACAQ,aACG,IAAIlB,WAAAA,CAAYS,IAAMC,EAAAA,YAAAA,EAAcQ,UAAY;;;;"}
@@ -8,8 +8,7 @@ class CodeRunner extends runner.AbstractRunner {
8
8
  return codemod.kind === 'code';
9
9
  }
10
10
  constructor(...args){
11
- super(...args);
12
- this.runner = Runner.run;
11
+ super(...args), this.runner = Runner.run;
13
12
  }
14
13
  }
15
14
  const codeRunnerFactory = (paths, configuration)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"code.js","sources":["../../../../../src/modules/runner/code/code.ts"],"sourcesContent":["import { run as jscodeshift } from 'jscodeshift/src/Runner';\n\nimport { AbstractRunner } from '../runner';\n\nimport type { Codemod } from '../../codemod';\nimport type { CodeRunnerConfiguration } from './types';\n\nexport class CodeRunner extends AbstractRunner<CodeRunnerConfiguration> {\n runner = jscodeshift;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'code';\n }\n}\n\nexport const codeRunnerFactory = (paths: string[], configuration: CodeRunnerConfiguration) => {\n return new CodeRunner(paths, configuration);\n};\n"],"names":["CodeRunner","AbstractRunner","valid","codemod","kind","runner","jscodeshift","codeRunnerFactory","paths","configuration"],"mappings":";;;;;AAOO,MAAMA,UAAmBC,SAAAA,qBAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;;aAJAC,MAASC,GAAAA,UAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;;"}
1
+ {"version":3,"file":"code.js","sources":["../../../../../src/modules/runner/code/code.ts"],"sourcesContent":["import { run as jscodeshift } from 'jscodeshift/src/Runner';\n\nimport { AbstractRunner } from '../runner';\n\nimport type { Codemod } from '../../codemod';\nimport type { CodeRunnerConfiguration } from './types';\n\nexport class CodeRunner extends AbstractRunner<CodeRunnerConfiguration> {\n runner = jscodeshift;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'code';\n }\n}\n\nexport const codeRunnerFactory = (paths: string[], configuration: CodeRunnerConfiguration) => {\n return new CodeRunner(paths, configuration);\n};\n"],"names":["CodeRunner","AbstractRunner","valid","codemod","kind","runner","jscodeshift","codeRunnerFactory","paths","configuration"],"mappings":";;;;;AAOO,MAAMA,UAAmBC,SAAAA,qBAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;AALK,QAAA,KAAA,CAAA,GAAA,IAAA,CAAA,EAAA,IAAA,CACLC,MAASC,GAAAA,UAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;;"}
@@ -6,8 +6,7 @@ class CodeRunner extends AbstractRunner {
6
6
  return codemod.kind === 'code';
7
7
  }
8
8
  constructor(...args){
9
- super(...args);
10
- this.runner = run;
9
+ super(...args), this.runner = run;
11
10
  }
12
11
  }
13
12
  const codeRunnerFactory = (paths, configuration)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"code.mjs","sources":["../../../../../src/modules/runner/code/code.ts"],"sourcesContent":["import { run as jscodeshift } from 'jscodeshift/src/Runner';\n\nimport { AbstractRunner } from '../runner';\n\nimport type { Codemod } from '../../codemod';\nimport type { CodeRunnerConfiguration } from './types';\n\nexport class CodeRunner extends AbstractRunner<CodeRunnerConfiguration> {\n runner = jscodeshift;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'code';\n }\n}\n\nexport const codeRunnerFactory = (paths: string[], configuration: CodeRunnerConfiguration) => {\n return new CodeRunner(paths, configuration);\n};\n"],"names":["CodeRunner","AbstractRunner","valid","codemod","kind","runner","jscodeshift","codeRunnerFactory","paths","configuration"],"mappings":";;;AAOO,MAAMA,UAAmBC,SAAAA,cAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;;aAJAC,MAASC,GAAAA,GAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;"}
1
+ {"version":3,"file":"code.mjs","sources":["../../../../../src/modules/runner/code/code.ts"],"sourcesContent":["import { run as jscodeshift } from 'jscodeshift/src/Runner';\n\nimport { AbstractRunner } from '../runner';\n\nimport type { Codemod } from '../../codemod';\nimport type { CodeRunnerConfiguration } from './types';\n\nexport class CodeRunner extends AbstractRunner<CodeRunnerConfiguration> {\n runner = jscodeshift;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'code';\n }\n}\n\nexport const codeRunnerFactory = (paths: string[], configuration: CodeRunnerConfiguration) => {\n return new CodeRunner(paths, configuration);\n};\n"],"names":["CodeRunner","AbstractRunner","valid","codemod","kind","runner","jscodeshift","codeRunnerFactory","paths","configuration"],"mappings":";;;AAOO,MAAMA,UAAmBC,SAAAA,cAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;AALK,QAAA,KAAA,CAAA,GAAA,IAAA,CAAA,EAAA,IAAA,CACLC,MAASC,GAAAA,GAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;"}
@@ -8,8 +8,7 @@ class JSONRunner extends runner.AbstractRunner {
8
8
  return codemod.kind === 'json';
9
9
  }
10
10
  constructor(...args){
11
- super(...args);
12
- this.runner = transform.transformJSON;
11
+ super(...args), this.runner = transform.transformJSON;
13
12
  }
14
13
  }
15
14
  const jsonRunnerFactory = (paths, configuration)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sources":["../../../../../src/modules/runner/json/json.ts"],"sourcesContent":["import { AbstractRunner } from '../runner';\n\nimport { transformJSON } from './transform';\n\nimport type { Codemod } from '../../codemod';\nimport type { JSONRunnerConfiguration } from './types';\n\nexport class JSONRunner extends AbstractRunner<JSONRunnerConfiguration> {\n runner = transformJSON;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'json';\n }\n}\n\nexport const jsonRunnerFactory = (paths: string[], configuration: JSONRunnerConfiguration) => {\n return new JSONRunner(paths, configuration);\n};\n"],"names":["JSONRunner","AbstractRunner","valid","codemod","kind","runner","transformJSON","jsonRunnerFactory","paths","configuration"],"mappings":";;;;;AAOO,MAAMA,UAAmBC,SAAAA,qBAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;;aAJAC,MAASC,GAAAA,uBAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;;"}
1
+ {"version":3,"file":"json.js","sources":["../../../../../src/modules/runner/json/json.ts"],"sourcesContent":["import { AbstractRunner } from '../runner';\n\nimport { transformJSON } from './transform';\n\nimport type { Codemod } from '../../codemod';\nimport type { JSONRunnerConfiguration } from './types';\n\nexport class JSONRunner extends AbstractRunner<JSONRunnerConfiguration> {\n runner = transformJSON;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'json';\n }\n}\n\nexport const jsonRunnerFactory = (paths: string[], configuration: JSONRunnerConfiguration) => {\n return new JSONRunner(paths, configuration);\n};\n"],"names":["JSONRunner","AbstractRunner","valid","codemod","kind","runner","transformJSON","jsonRunnerFactory","paths","configuration"],"mappings":";;;;;AAOO,MAAMA,UAAmBC,SAAAA,qBAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;AALK,QAAA,KAAA,CAAA,GAAA,IAAA,CAAA,EAAA,IAAA,CACLC,MAASC,GAAAA,uBAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;;"}
@@ -6,8 +6,7 @@ class JSONRunner extends AbstractRunner {
6
6
  return codemod.kind === 'json';
7
7
  }
8
8
  constructor(...args){
9
- super(...args);
10
- this.runner = transformJSON;
9
+ super(...args), this.runner = transformJSON;
11
10
  }
12
11
  }
13
12
  const jsonRunnerFactory = (paths, configuration)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"json.mjs","sources":["../../../../../src/modules/runner/json/json.ts"],"sourcesContent":["import { AbstractRunner } from '../runner';\n\nimport { transformJSON } from './transform';\n\nimport type { Codemod } from '../../codemod';\nimport type { JSONRunnerConfiguration } from './types';\n\nexport class JSONRunner extends AbstractRunner<JSONRunnerConfiguration> {\n runner = transformJSON;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'json';\n }\n}\n\nexport const jsonRunnerFactory = (paths: string[], configuration: JSONRunnerConfiguration) => {\n return new JSONRunner(paths, configuration);\n};\n"],"names":["JSONRunner","AbstractRunner","valid","codemod","kind","runner","transformJSON","jsonRunnerFactory","paths","configuration"],"mappings":";;;AAOO,MAAMA,UAAmBC,SAAAA,cAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;;aAJAC,MAASC,GAAAA,aAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;"}
1
+ {"version":3,"file":"json.mjs","sources":["../../../../../src/modules/runner/json/json.ts"],"sourcesContent":["import { AbstractRunner } from '../runner';\n\nimport { transformJSON } from './transform';\n\nimport type { Codemod } from '../../codemod';\nimport type { JSONRunnerConfiguration } from './types';\n\nexport class JSONRunner extends AbstractRunner<JSONRunnerConfiguration> {\n runner = transformJSON;\n\n valid(codemod: Codemod.Codemod): boolean {\n return codemod.kind === 'json';\n }\n}\n\nexport const jsonRunnerFactory = (paths: string[], configuration: JSONRunnerConfiguration) => {\n return new JSONRunner(paths, configuration);\n};\n"],"names":["JSONRunner","AbstractRunner","valid","codemod","kind","runner","transformJSON","jsonRunnerFactory","paths","configuration"],"mappings":";;;AAOO,MAAMA,UAAmBC,SAAAA,cAAAA,CAAAA;AAG9BC,IAAAA,KAAAA,CAAMC,OAAwB,EAAW;QACvC,OAAOA,OAAAA,CAAQC,IAAI,KAAK,MAAA;AAC1B;;AALK,QAAA,KAAA,CAAA,GAAA,IAAA,CAAA,EAAA,IAAA,CACLC,MAASC,GAAAA,aAAAA;;AAKX;AAEO,MAAMC,iBAAoB,GAAA,CAACC,KAAiBC,EAAAA,aAAAA,GAAAA;IACjD,OAAO,IAAIT,WAAWQ,KAAOC,EAAAA,aAAAA,CAAAA;AAC/B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sources":["../../../../../src/modules/runner/json/transform.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n\nimport assert from 'node:assert';\nimport { isEqual } from 'lodash/fp';\nimport { register } from 'esbuild-register/dist/node';\n\nimport { createJSONTransformAPI, readJSON, saveJSON } from '../../json';\n\nimport type { Report } from '../../report';\n\nimport type { JSONRunnerConfiguration, JSONSourceFile, JSONTransformParams } from './types';\n\nexport const transformJSON = async (\n codemodPath: string,\n paths: string[],\n config: JSONRunnerConfiguration\n): Promise<Report.Report> => {\n const { dry } = config;\n const startTime = process.hrtime();\n\n const report: Report.Report = {\n ok: 0,\n nochange: 0,\n skip: 0,\n error: 0,\n timeElapsed: '',\n stats: {},\n };\n\n /**\n * Why do we need to include node_modules (hookIgnoreNodeModules) and specify a matcher (hookMatcher) to esbuild?\n *\n * When using tools like npx or dlx, the execution context is different from when running the program in a local\n * project. npx and dlx run the commands in a temporary installation, which is isolated from local project files.\n *\n * When hookIgnoreNodeModules is not specified (or set to true), esbuild-register instructs\n * Pirates (https://github.com/danez/pirates) to not transpile any files that come from node_modules.\n *\n * Now, when using npx or dlx to run a script, its location can be seen as \"external\" because it's not part of\n * the temporary environment where npx or dlx execute. Therefore, it's considered to be part of node_modules.\n *\n * Due to this, if hookIgnoreNodeModules is set to true or left unspecified,\n * esbuild-register won't try to compile them upon require.\n *\n * hookMatcher is added to make sure we're not matching anything else than our codemod in external directories.\n */\n const esbuildOptions = {\n extensions: ['.js', '.mjs', '.ts'],\n hookIgnoreNodeModules: false,\n hookMatcher: isEqual(codemodPath),\n };\n const { unregister } = register(esbuildOptions);\n\n const module = require(codemodPath);\n\n unregister();\n\n const codemod = typeof module.default === 'function' ? module.default : module;\n\n assert(typeof codemod === 'function', `Codemod must be a function. Found ${typeof codemod}`);\n\n for (const path of paths) {\n try {\n const json = await readJSON(path);\n\n // Make sure the JSON value is a JSON object\n assert(typeof json === 'object' && !Array.isArray(json) && json !== null);\n\n // TODO: Optimize the API to limit parse/stringify operations\n const file: JSONSourceFile = { path, json };\n const params: JSONTransformParams = { cwd: config.cwd, json: createJSONTransformAPI };\n\n const out = await codemod(file, params);\n\n if (out === undefined) {\n report.error += 1;\n }\n // If the json object has modifications\n else if (!isEqual(json, out)) {\n if (!dry) {\n await saveJSON(path, out);\n }\n report.ok += 1;\n }\n // No changes\n else {\n report.nochange += 1;\n }\n } catch {\n report.error += 1;\n }\n }\n\n const endTime = process.hrtime(startTime);\n report.timeElapsed = (endTime[0] + endTime[1] / 1e9).toFixed(3);\n\n return report;\n};\n"],"names":["transformJSON","codemodPath","paths","config","dry","startTime","process","hrtime","report","ok","nochange","skip","error","timeElapsed","stats","esbuildOptions","extensions","hookIgnoreNodeModules","hookMatcher","isEqual","unregister","register","module","require","codemod","default","assert","path","json","readJSON","Array","isArray","file","params","cwd","createJSONTransformAPI","out","undefined","saveJSON","endTime","toFixed"],"mappings":";;;;;;;;AAYaA,MAAAA,aAAAA,GAAgB,OAC3BC,WAAAA,EACAC,KACAC,EAAAA,MAAAA,GAAAA;IAEA,MAAM,EAAEC,GAAG,EAAE,GAAGD,MAAAA;IAChB,MAAME,SAAAA,GAAYC,QAAQC,MAAM,EAAA;AAEhC,IAAA,MAAMC,MAAwB,GAAA;QAC5BC,EAAI,EAAA,CAAA;QACJC,QAAU,EAAA,CAAA;QACVC,IAAM,EAAA,CAAA;QACNC,KAAO,EAAA,CAAA;QACPC,WAAa,EAAA,EAAA;AACbC,QAAAA,KAAAA,EAAO;AACT,KAAA;AAEA;;;;;;;;;;;;;;;;AAgBC,MACD,MAAMC,cAAiB,GAAA;QACrBC,UAAY,EAAA;AAAC,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;AAAM,SAAA;QAClCC,qBAAuB,EAAA,KAAA;AACvBC,QAAAA,WAAAA,EAAaC,UAAQlB,CAAAA,WAAAA;AACvB,KAAA;AACA,IAAA,MAAM,EAAEmB,UAAU,EAAE,GAAGC,aAASN,CAAAA,cAAAA,CAAAA;AAEhC,IAAA,MAAMO,SAASC,OAAQtB,CAAAA,WAAAA,CAAAA;AAEvBmB,IAAAA,UAAAA,EAAAA;IAEA,MAAMI,OAAAA,GAAU,OAAOF,MAAOG,CAAAA,OAAO,KAAK,UAAaH,GAAAA,MAAAA,CAAOG,OAAO,GAAGH,MAAAA;IAExEI,MAAO,CAAA,OAAOF,YAAY,UAAY,EAAA,CAAC,kCAAkC,EAAE,OAAOA,QAAQ,CAAC,CAAA;IAE3F,KAAK,MAAMG,QAAQzB,KAAO,CAAA;QACxB,IAAI;YACF,MAAM0B,IAAAA,GAAO,MAAMC,aAASF,CAAAA,IAAAA,CAAAA;;YAG5BD,MAAO,CAAA,OAAOE,SAAS,QAAY,IAAA,CAACE,MAAMC,OAAO,CAACH,SAASA,IAAS,KAAA,IAAA,CAAA;;AAGpE,YAAA,MAAMI,MAAuB,GAAA;AAAEL,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAK,aAAA;AAC1C,YAAA,MAAMK,MAA8B,GAAA;AAAEC,gBAAAA,GAAAA,EAAK/B,OAAO+B,GAAG;gBAAEN,IAAMO,EAAAA;AAAuB,aAAA;YAEpF,MAAMC,GAAAA,GAAM,MAAMZ,OAAAA,CAAQQ,MAAMC,EAAAA,MAAAA,CAAAA;AAEhC,YAAA,IAAIG,QAAQC,SAAW,EAAA;AACrB7B,gBAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB,aAAA,MAEK,IAAI,CAACO,UAAQS,CAAAA,IAAAA,EAAMQ,GAAM,CAAA,EAAA;AAC5B,gBAAA,IAAI,CAAChC,GAAK,EAAA;AACR,oBAAA,MAAMkC,cAASX,IAAMS,EAAAA,GAAAA,CAAAA;AACvB;AACA5B,gBAAAA,MAAAA,CAAOC,EAAE,IAAI,CAAA;aAGV,MAAA;AACHD,gBAAAA,MAAAA,CAAOE,QAAQ,IAAI,CAAA;AACrB;AACF,SAAA,CAAE,OAAM;AACNF,YAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB;AACF;IAEA,MAAM2B,OAAAA,GAAUjC,OAAQC,CAAAA,MAAM,CAACF,SAAAA,CAAAA;AAC/BG,IAAAA,MAAAA,CAAOK,WAAW,GAAG,CAAC0B,OAAO,CAAC,CAAA,CAAE,GAAGA,OAAO,CAAC,CAAE,CAAA,GAAG,GAAE,EAAGC,OAAO,CAAC,CAAA,CAAA;IAE7D,OAAOhC,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"transform.js","sources":["../../../../../src/modules/runner/json/transform.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n\nimport assert from 'node:assert';\nimport { isEqual } from 'lodash/fp';\nimport { register } from 'esbuild-register/dist/node';\n\nimport { createJSONTransformAPI, readJSON, saveJSON } from '../../json';\n\nimport type { Report } from '../../report';\n\nimport type { JSONRunnerConfiguration, JSONSourceFile, JSONTransformParams } from './types';\n\nexport const transformJSON = async (\n codemodPath: string,\n paths: string[],\n config: JSONRunnerConfiguration\n): Promise<Report.Report> => {\n const { dry } = config;\n const startTime = process.hrtime();\n\n const report: Report.Report = {\n ok: 0,\n nochange: 0,\n skip: 0,\n error: 0,\n timeElapsed: '',\n stats: {},\n };\n\n /**\n * Why do we need to include node_modules (hookIgnoreNodeModules) and specify a matcher (hookMatcher) to esbuild?\n *\n * When using tools like npx or dlx, the execution context is different from when running the program in a local\n * project. npx and dlx run the commands in a temporary installation, which is isolated from local project files.\n *\n * When hookIgnoreNodeModules is not specified (or set to true), esbuild-register instructs\n * Pirates (https://github.com/danez/pirates) to not transpile any files that come from node_modules.\n *\n * Now, when using npx or dlx to run a script, its location can be seen as \"external\" because it's not part of\n * the temporary environment where npx or dlx execute. Therefore, it's considered to be part of node_modules.\n *\n * Due to this, if hookIgnoreNodeModules is set to true or left unspecified,\n * esbuild-register won't try to compile them upon require.\n *\n * hookMatcher is added to make sure we're not matching anything else than our codemod in external directories.\n */\n const esbuildOptions = {\n extensions: ['.js', '.mjs', '.ts'],\n hookIgnoreNodeModules: false,\n hookMatcher: isEqual(codemodPath),\n };\n const { unregister } = register(esbuildOptions);\n\n const module = require(codemodPath);\n\n unregister();\n\n const codemod = typeof module.default === 'function' ? module.default : module;\n\n assert(typeof codemod === 'function', `Codemod must be a function. Found ${typeof codemod}`);\n\n for (const path of paths) {\n try {\n const json = await readJSON(path);\n\n // Make sure the JSON value is a JSON object\n assert(typeof json === 'object' && !Array.isArray(json) && json !== null);\n\n // TODO: Optimize the API to limit parse/stringify operations\n const file: JSONSourceFile = { path, json };\n const params: JSONTransformParams = { cwd: config.cwd, json: createJSONTransformAPI };\n\n const out = await codemod(file, params);\n\n if (out === undefined) {\n report.error += 1;\n }\n // If the json object has modifications\n else if (!isEqual(json, out)) {\n if (!dry) {\n await saveJSON(path, out);\n }\n report.ok += 1;\n }\n // No changes\n else {\n report.nochange += 1;\n }\n } catch {\n report.error += 1;\n }\n }\n\n const endTime = process.hrtime(startTime);\n report.timeElapsed = (endTime[0] + endTime[1] / 1e9).toFixed(3);\n\n return report;\n};\n"],"names":["transformJSON","codemodPath","paths","config","dry","startTime","process","hrtime","report","ok","nochange","skip","error","timeElapsed","stats","esbuildOptions","extensions","hookIgnoreNodeModules","hookMatcher","isEqual","unregister","register","module","require","codemod","default","assert","path","json","readJSON","Array","isArray","file","params","cwd","createJSONTransformAPI","out","undefined","saveJSON","endTime","toFixed"],"mappings":";;;;;;;;AAYaA,MAAAA,aAAAA,GAAgB,OAC3BC,WAAAA,EACAC,KACAC,EAAAA,MAAAA,GAAAA;IAEA,MAAM,EAAEC,GAAG,EAAE,GAAGD,MAAAA;IAChB,MAAME,SAAAA,GAAYC,QAAQC,MAAM,EAAA;AAEhC,IAAA,MAAMC,MAAwB,GAAA;QAC5BC,EAAI,EAAA,CAAA;QACJC,QAAU,EAAA,CAAA;QACVC,IAAM,EAAA,CAAA;QACNC,KAAO,EAAA,CAAA;QACPC,WAAa,EAAA,EAAA;AACbC,QAAAA,KAAAA,EAAO;AACT,KAAA;AAEA;;;;;;;;;;;;;;;;AAgBC,MACD,MAAMC,cAAiB,GAAA;QACrBC,UAAY,EAAA;AAAC,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;AAAM,SAAA;QAClCC,qBAAuB,EAAA,KAAA;AACvBC,QAAAA,WAAAA,EAAaC,UAAQlB,CAAAA,WAAAA;AACvB,KAAA;AACA,IAAA,MAAM,EAAEmB,UAAU,EAAE,GAAGC,aAASN,CAAAA,cAAAA,CAAAA;AAEhC,IAAA,MAAMO,SAASC,OAAQtB,CAAAA,WAAAA,CAAAA;AAEvBmB,IAAAA,UAAAA,EAAAA;IAEA,MAAMI,OAAAA,GAAU,OAAOF,MAAOG,CAAAA,OAAO,KAAK,UAAaH,GAAAA,MAAAA,CAAOG,OAAO,GAAGH,MAAAA;AAExEI,IAAAA,MAAAA,CAAO,OAAOF,OAAY,KAAA,UAAA,EAAY,CAAC,kCAAkC,EAAE,OAAOA,OAAS,CAAA,CAAA,CAAA;IAE3F,KAAK,MAAMG,QAAQzB,KAAO,CAAA;QACxB,IAAI;YACF,MAAM0B,IAAAA,GAAO,MAAMC,aAASF,CAAAA,IAAAA,CAAAA;;YAG5BD,MAAO,CAAA,OAAOE,SAAS,QAAY,IAAA,CAACE,MAAMC,OAAO,CAACH,SAASA,IAAS,KAAA,IAAA,CAAA;;AAGpE,YAAA,MAAMI,MAAuB,GAAA;AAAEL,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAK,aAAA;AAC1C,YAAA,MAAMK,MAA8B,GAAA;AAAEC,gBAAAA,GAAAA,EAAK/B,OAAO+B,GAAG;gBAAEN,IAAMO,EAAAA;AAAuB,aAAA;YAEpF,MAAMC,GAAAA,GAAM,MAAMZ,OAAAA,CAAQQ,MAAMC,EAAAA,MAAAA,CAAAA;AAEhC,YAAA,IAAIG,QAAQC,SAAW,EAAA;AACrB7B,gBAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB,aAAA,MAEK,IAAI,CAACO,UAAQS,CAAAA,IAAAA,EAAMQ,GAAM,CAAA,EAAA;AAC5B,gBAAA,IAAI,CAAChC,GAAK,EAAA;AACR,oBAAA,MAAMkC,cAASX,IAAMS,EAAAA,GAAAA,CAAAA;AACvB;AACA5B,gBAAAA,MAAAA,CAAOC,EAAE,IAAI,CAAA;aAGV,MAAA;AACHD,gBAAAA,MAAAA,CAAOE,QAAQ,IAAI,CAAA;AACrB;AACF,SAAA,CAAE,OAAM;AACNF,YAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB;AACF;IAEA,MAAM2B,OAAAA,GAAUjC,OAAQC,CAAAA,MAAM,CAACF,SAAAA,CAAAA;AAC/BG,IAAAA,MAAAA,CAAOK,WAAW,GAAG,CAAC0B,OAAO,CAAC,CAAA,CAAE,GAAGA,OAAO,CAAC,CAAE,CAAA,GAAG,GAAE,EAAGC,OAAO,CAAC,CAAA,CAAA;IAE7D,OAAOhC,MAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.mjs","sources":["../../../../../src/modules/runner/json/transform.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n\nimport assert from 'node:assert';\nimport { isEqual } from 'lodash/fp';\nimport { register } from 'esbuild-register/dist/node';\n\nimport { createJSONTransformAPI, readJSON, saveJSON } from '../../json';\n\nimport type { Report } from '../../report';\n\nimport type { JSONRunnerConfiguration, JSONSourceFile, JSONTransformParams } from './types';\n\nexport const transformJSON = async (\n codemodPath: string,\n paths: string[],\n config: JSONRunnerConfiguration\n): Promise<Report.Report> => {\n const { dry } = config;\n const startTime = process.hrtime();\n\n const report: Report.Report = {\n ok: 0,\n nochange: 0,\n skip: 0,\n error: 0,\n timeElapsed: '',\n stats: {},\n };\n\n /**\n * Why do we need to include node_modules (hookIgnoreNodeModules) and specify a matcher (hookMatcher) to esbuild?\n *\n * When using tools like npx or dlx, the execution context is different from when running the program in a local\n * project. npx and dlx run the commands in a temporary installation, which is isolated from local project files.\n *\n * When hookIgnoreNodeModules is not specified (or set to true), esbuild-register instructs\n * Pirates (https://github.com/danez/pirates) to not transpile any files that come from node_modules.\n *\n * Now, when using npx or dlx to run a script, its location can be seen as \"external\" because it's not part of\n * the temporary environment where npx or dlx execute. Therefore, it's considered to be part of node_modules.\n *\n * Due to this, if hookIgnoreNodeModules is set to true or left unspecified,\n * esbuild-register won't try to compile them upon require.\n *\n * hookMatcher is added to make sure we're not matching anything else than our codemod in external directories.\n */\n const esbuildOptions = {\n extensions: ['.js', '.mjs', '.ts'],\n hookIgnoreNodeModules: false,\n hookMatcher: isEqual(codemodPath),\n };\n const { unregister } = register(esbuildOptions);\n\n const module = require(codemodPath);\n\n unregister();\n\n const codemod = typeof module.default === 'function' ? module.default : module;\n\n assert(typeof codemod === 'function', `Codemod must be a function. Found ${typeof codemod}`);\n\n for (const path of paths) {\n try {\n const json = await readJSON(path);\n\n // Make sure the JSON value is a JSON object\n assert(typeof json === 'object' && !Array.isArray(json) && json !== null);\n\n // TODO: Optimize the API to limit parse/stringify operations\n const file: JSONSourceFile = { path, json };\n const params: JSONTransformParams = { cwd: config.cwd, json: createJSONTransformAPI };\n\n const out = await codemod(file, params);\n\n if (out === undefined) {\n report.error += 1;\n }\n // If the json object has modifications\n else if (!isEqual(json, out)) {\n if (!dry) {\n await saveJSON(path, out);\n }\n report.ok += 1;\n }\n // No changes\n else {\n report.nochange += 1;\n }\n } catch {\n report.error += 1;\n }\n }\n\n const endTime = process.hrtime(startTime);\n report.timeElapsed = (endTime[0] + endTime[1] / 1e9).toFixed(3);\n\n return report;\n};\n"],"names":["transformJSON","codemodPath","paths","config","dry","startTime","process","hrtime","report","ok","nochange","skip","error","timeElapsed","stats","esbuildOptions","extensions","hookIgnoreNodeModules","hookMatcher","isEqual","unregister","register","module","require","codemod","default","assert","path","json","readJSON","Array","isArray","file","params","cwd","createJSONTransformAPI","out","undefined","saveJSON","endTime","toFixed"],"mappings":";;;;;;AAYaA,MAAAA,aAAAA,GAAgB,OAC3BC,WAAAA,EACAC,KACAC,EAAAA,MAAAA,GAAAA;IAEA,MAAM,EAAEC,GAAG,EAAE,GAAGD,MAAAA;IAChB,MAAME,SAAAA,GAAYC,QAAQC,MAAM,EAAA;AAEhC,IAAA,MAAMC,MAAwB,GAAA;QAC5BC,EAAI,EAAA,CAAA;QACJC,QAAU,EAAA,CAAA;QACVC,IAAM,EAAA,CAAA;QACNC,KAAO,EAAA,CAAA;QACPC,WAAa,EAAA,EAAA;AACbC,QAAAA,KAAAA,EAAO;AACT,KAAA;AAEA;;;;;;;;;;;;;;;;AAgBC,MACD,MAAMC,cAAiB,GAAA;QACrBC,UAAY,EAAA;AAAC,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;AAAM,SAAA;QAClCC,qBAAuB,EAAA,KAAA;AACvBC,QAAAA,WAAAA,EAAaC,OAAQlB,CAAAA,WAAAA;AACvB,KAAA;AACA,IAAA,MAAM,EAAEmB,UAAU,EAAE,GAAGC,QAASN,CAAAA,cAAAA,CAAAA;AAEhC,IAAA,MAAMO,SAASC,OAAQtB,CAAAA,WAAAA,CAAAA;AAEvBmB,IAAAA,UAAAA,EAAAA;IAEA,MAAMI,OAAAA,GAAU,OAAOF,MAAOG,CAAAA,OAAO,KAAK,UAAaH,GAAAA,MAAAA,CAAOG,OAAO,GAAGH,MAAAA;IAExEI,MAAO,CAAA,OAAOF,YAAY,UAAY,EAAA,CAAC,kCAAkC,EAAE,OAAOA,QAAQ,CAAC,CAAA;IAE3F,KAAK,MAAMG,QAAQzB,KAAO,CAAA;QACxB,IAAI;YACF,MAAM0B,IAAAA,GAAO,MAAMC,QAASF,CAAAA,IAAAA,CAAAA;;YAG5BD,MAAO,CAAA,OAAOE,SAAS,QAAY,IAAA,CAACE,MAAMC,OAAO,CAACH,SAASA,IAAS,KAAA,IAAA,CAAA;;AAGpE,YAAA,MAAMI,IAAuB,GAAA;AAAEL,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAK,aAAA;AAC1C,YAAA,MAAMK,MAA8B,GAAA;AAAEC,gBAAAA,GAAAA,EAAK/B,OAAO+B,GAAG;gBAAEN,IAAMO,EAAAA;AAAuB,aAAA;YAEpF,MAAMC,GAAAA,GAAM,MAAMZ,OAAAA,CAAQQ,IAAMC,EAAAA,MAAAA,CAAAA;AAEhC,YAAA,IAAIG,QAAQC,SAAW,EAAA;AACrB7B,gBAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB,aAAA,MAEK,IAAI,CAACO,OAAQS,CAAAA,IAAAA,EAAMQ,GAAM,CAAA,EAAA;AAC5B,gBAAA,IAAI,CAAChC,GAAK,EAAA;AACR,oBAAA,MAAMkC,SAASX,IAAMS,EAAAA,GAAAA,CAAAA;AACvB;AACA5B,gBAAAA,MAAAA,CAAOC,EAAE,IAAI,CAAA;aAGV,MAAA;AACHD,gBAAAA,MAAAA,CAAOE,QAAQ,IAAI,CAAA;AACrB;AACF,SAAA,CAAE,OAAM;AACNF,YAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB;AACF;IAEA,MAAM2B,OAAAA,GAAUjC,OAAQC,CAAAA,MAAM,CAACF,SAAAA,CAAAA;AAC/BG,IAAAA,MAAAA,CAAOK,WAAW,GAAG,CAAC0B,OAAO,CAAC,CAAA,CAAE,GAAGA,OAAO,CAAC,CAAE,CAAA,GAAG,GAAE,EAAGC,OAAO,CAAC,CAAA,CAAA;IAE7D,OAAOhC,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"transform.mjs","sources":["../../../../../src/modules/runner/json/transform.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n\nimport assert from 'node:assert';\nimport { isEqual } from 'lodash/fp';\nimport { register } from 'esbuild-register/dist/node';\n\nimport { createJSONTransformAPI, readJSON, saveJSON } from '../../json';\n\nimport type { Report } from '../../report';\n\nimport type { JSONRunnerConfiguration, JSONSourceFile, JSONTransformParams } from './types';\n\nexport const transformJSON = async (\n codemodPath: string,\n paths: string[],\n config: JSONRunnerConfiguration\n): Promise<Report.Report> => {\n const { dry } = config;\n const startTime = process.hrtime();\n\n const report: Report.Report = {\n ok: 0,\n nochange: 0,\n skip: 0,\n error: 0,\n timeElapsed: '',\n stats: {},\n };\n\n /**\n * Why do we need to include node_modules (hookIgnoreNodeModules) and specify a matcher (hookMatcher) to esbuild?\n *\n * When using tools like npx or dlx, the execution context is different from when running the program in a local\n * project. npx and dlx run the commands in a temporary installation, which is isolated from local project files.\n *\n * When hookIgnoreNodeModules is not specified (or set to true), esbuild-register instructs\n * Pirates (https://github.com/danez/pirates) to not transpile any files that come from node_modules.\n *\n * Now, when using npx or dlx to run a script, its location can be seen as \"external\" because it's not part of\n * the temporary environment where npx or dlx execute. Therefore, it's considered to be part of node_modules.\n *\n * Due to this, if hookIgnoreNodeModules is set to true or left unspecified,\n * esbuild-register won't try to compile them upon require.\n *\n * hookMatcher is added to make sure we're not matching anything else than our codemod in external directories.\n */\n const esbuildOptions = {\n extensions: ['.js', '.mjs', '.ts'],\n hookIgnoreNodeModules: false,\n hookMatcher: isEqual(codemodPath),\n };\n const { unregister } = register(esbuildOptions);\n\n const module = require(codemodPath);\n\n unregister();\n\n const codemod = typeof module.default === 'function' ? module.default : module;\n\n assert(typeof codemod === 'function', `Codemod must be a function. Found ${typeof codemod}`);\n\n for (const path of paths) {\n try {\n const json = await readJSON(path);\n\n // Make sure the JSON value is a JSON object\n assert(typeof json === 'object' && !Array.isArray(json) && json !== null);\n\n // TODO: Optimize the API to limit parse/stringify operations\n const file: JSONSourceFile = { path, json };\n const params: JSONTransformParams = { cwd: config.cwd, json: createJSONTransformAPI };\n\n const out = await codemod(file, params);\n\n if (out === undefined) {\n report.error += 1;\n }\n // If the json object has modifications\n else if (!isEqual(json, out)) {\n if (!dry) {\n await saveJSON(path, out);\n }\n report.ok += 1;\n }\n // No changes\n else {\n report.nochange += 1;\n }\n } catch {\n report.error += 1;\n }\n }\n\n const endTime = process.hrtime(startTime);\n report.timeElapsed = (endTime[0] + endTime[1] / 1e9).toFixed(3);\n\n return report;\n};\n"],"names":["transformJSON","codemodPath","paths","config","dry","startTime","process","hrtime","report","ok","nochange","skip","error","timeElapsed","stats","esbuildOptions","extensions","hookIgnoreNodeModules","hookMatcher","isEqual","unregister","register","module","require","codemod","default","assert","path","json","readJSON","Array","isArray","file","params","cwd","createJSONTransformAPI","out","undefined","saveJSON","endTime","toFixed"],"mappings":";;;;;;AAYaA,MAAAA,aAAAA,GAAgB,OAC3BC,WAAAA,EACAC,KACAC,EAAAA,MAAAA,GAAAA;IAEA,MAAM,EAAEC,GAAG,EAAE,GAAGD,MAAAA;IAChB,MAAME,SAAAA,GAAYC,QAAQC,MAAM,EAAA;AAEhC,IAAA,MAAMC,MAAwB,GAAA;QAC5BC,EAAI,EAAA,CAAA;QACJC,QAAU,EAAA,CAAA;QACVC,IAAM,EAAA,CAAA;QACNC,KAAO,EAAA,CAAA;QACPC,WAAa,EAAA,EAAA;AACbC,QAAAA,KAAAA,EAAO;AACT,KAAA;AAEA;;;;;;;;;;;;;;;;AAgBC,MACD,MAAMC,cAAiB,GAAA;QACrBC,UAAY,EAAA;AAAC,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;AAAM,SAAA;QAClCC,qBAAuB,EAAA,KAAA;AACvBC,QAAAA,WAAAA,EAAaC,OAAQlB,CAAAA,WAAAA;AACvB,KAAA;AACA,IAAA,MAAM,EAAEmB,UAAU,EAAE,GAAGC,QAASN,CAAAA,cAAAA,CAAAA;AAEhC,IAAA,MAAMO,SAASC,OAAQtB,CAAAA,WAAAA,CAAAA;AAEvBmB,IAAAA,UAAAA,EAAAA;IAEA,MAAMI,OAAAA,GAAU,OAAOF,MAAOG,CAAAA,OAAO,KAAK,UAAaH,GAAAA,MAAAA,CAAOG,OAAO,GAAGH,MAAAA;AAExEI,IAAAA,MAAAA,CAAO,OAAOF,OAAY,KAAA,UAAA,EAAY,CAAC,kCAAkC,EAAE,OAAOA,OAAS,CAAA,CAAA,CAAA;IAE3F,KAAK,MAAMG,QAAQzB,KAAO,CAAA;QACxB,IAAI;YACF,MAAM0B,IAAAA,GAAO,MAAMC,QAASF,CAAAA,IAAAA,CAAAA;;YAG5BD,MAAO,CAAA,OAAOE,SAAS,QAAY,IAAA,CAACE,MAAMC,OAAO,CAACH,SAASA,IAAS,KAAA,IAAA,CAAA;;AAGpE,YAAA,MAAMI,IAAuB,GAAA;AAAEL,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAK,aAAA;AAC1C,YAAA,MAAMK,MAA8B,GAAA;AAAEC,gBAAAA,GAAAA,EAAK/B,OAAO+B,GAAG;gBAAEN,IAAMO,EAAAA;AAAuB,aAAA;YAEpF,MAAMC,GAAAA,GAAM,MAAMZ,OAAAA,CAAQQ,IAAMC,EAAAA,MAAAA,CAAAA;AAEhC,YAAA,IAAIG,QAAQC,SAAW,EAAA;AACrB7B,gBAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB,aAAA,MAEK,IAAI,CAACO,OAAQS,CAAAA,IAAAA,EAAMQ,GAAM,CAAA,EAAA;AAC5B,gBAAA,IAAI,CAAChC,GAAK,EAAA;AACR,oBAAA,MAAMkC,SAASX,IAAMS,EAAAA,GAAAA,CAAAA;AACvB;AACA5B,gBAAAA,MAAAA,CAAOC,EAAE,IAAI,CAAA;aAGV,MAAA;AACHD,gBAAAA,MAAAA,CAAOE,QAAQ,IAAI,CAAA;AACrB;AACF,SAAA,CAAE,OAAM;AACNF,YAAAA,MAAAA,CAAOI,KAAK,IAAI,CAAA;AAClB;AACF;IAEA,MAAM2B,OAAAA,GAAUjC,OAAQC,CAAAA,MAAM,CAACF,SAAAA,CAAAA;AAC/BG,IAAAA,MAAAA,CAAOK,WAAW,GAAG,CAAC0B,OAAO,CAAC,CAAA,CAAE,GAAGA,OAAO,CAAC,CAAE,CAAA,GAAG,GAAE,EAAGC,OAAO,CAAC,CAAA,CAAA;IAE7D,OAAOhC,MAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sources":["../../../../src/modules/runner/runner.ts"],"sourcesContent":["import type { Codemod } from '../codemod';\n\nimport type { Runner as RunnerInterface, RunnerConfiguration, RunnerFunction } from './types';\n\nexport abstract class AbstractRunner<TConfig extends RunnerConfiguration>\n implements RunnerInterface<TConfig>\n{\n abstract runner: RunnerFunction<TConfig>;\n\n paths: string[];\n\n configuration: TConfig;\n\n constructor(paths: string[], configuration: TConfig) {\n this.paths = paths;\n this.configuration = configuration;\n }\n\n async run(codemod: Codemod.Codemod, configuration?: TConfig) {\n const isValidCodemod = this.valid(codemod);\n\n if (!isValidCodemod) {\n throw new Error(`Invalid codemod provided to the runner: ${codemod.filename}`);\n }\n\n const runConfiguration: TConfig = { ...this.configuration, ...configuration };\n\n return this.runner(codemod.path, this.paths, runConfiguration);\n }\n\n abstract valid(codemod: Codemod.Codemod): boolean;\n}\n"],"names":["AbstractRunner","run","codemod","configuration","isValidCodemod","valid","Error","filename","runConfiguration","runner","path","paths","constructor"],"mappings":";;AAIO,MAAeA,cAAAA,CAAAA;AAcpB,IAAA,MAAMC,GAAIC,CAAAA,OAAwB,EAAEC,aAAuB,EAAE;AAC3D,QAAA,MAAMC,cAAiB,GAAA,IAAI,CAACC,KAAK,CAACH,OAAAA,CAAAA;AAElC,QAAA,IAAI,CAACE,cAAgB,EAAA;YACnB,MAAM,IAAIE,MAAM,CAAC,wCAAwC,EAAEJ,OAAQK,CAAAA,QAAQ,CAAC,CAAC,CAAA;AAC/E;AAEA,QAAA,MAAMC,gBAA4B,GAAA;YAAE,GAAG,IAAI,CAACL,aAAa;AAAE,YAAA,GAAGA;AAAc,SAAA;QAE5E,OAAO,IAAI,CAACM,MAAM,CAACP,OAAAA,CAAQQ,IAAI,EAAE,IAAI,CAACC,KAAK,EAAEH,gBAAAA,CAAAA;AAC/C;IAfAI,WAAYD,CAAAA,KAAe,EAAER,aAAsB,CAAE;QACnD,IAAI,CAACQ,KAAK,GAAGA,KAAAA;QACb,IAAI,CAACR,aAAa,GAAGA,aAAAA;AACvB;AAeF;;;;"}
1
+ {"version":3,"file":"runner.js","sources":["../../../../src/modules/runner/runner.ts"],"sourcesContent":["import type { Codemod } from '../codemod';\n\nimport type { Runner as RunnerInterface, RunnerConfiguration, RunnerFunction } from './types';\n\nexport abstract class AbstractRunner<TConfig extends RunnerConfiguration>\n implements RunnerInterface<TConfig>\n{\n abstract runner: RunnerFunction<TConfig>;\n\n paths: string[];\n\n configuration: TConfig;\n\n constructor(paths: string[], configuration: TConfig) {\n this.paths = paths;\n this.configuration = configuration;\n }\n\n async run(codemod: Codemod.Codemod, configuration?: TConfig) {\n const isValidCodemod = this.valid(codemod);\n\n if (!isValidCodemod) {\n throw new Error(`Invalid codemod provided to the runner: ${codemod.filename}`);\n }\n\n const runConfiguration: TConfig = { ...this.configuration, ...configuration };\n\n return this.runner(codemod.path, this.paths, runConfiguration);\n }\n\n abstract valid(codemod: Codemod.Codemod): boolean;\n}\n"],"names":["AbstractRunner","run","codemod","configuration","isValidCodemod","valid","Error","filename","runConfiguration","runner","path","paths"],"mappings":";;AAIO,MAAeA,cAAAA,CAAAA;AAcpB,IAAA,MAAMC,GAAIC,CAAAA,OAAwB,EAAEC,aAAuB,EAAE;AAC3D,QAAA,MAAMC,cAAiB,GAAA,IAAI,CAACC,KAAK,CAACH,OAAAA,CAAAA;AAElC,QAAA,IAAI,CAACE,cAAgB,EAAA;AACnB,YAAA,MAAM,IAAIE,KAAM,CAAA,CAAC,wCAAwC,EAAEJ,OAAAA,CAAQK,QAAQ,CAAE,CAAA,CAAA;AAC/E;AAEA,QAAA,MAAMC,gBAA4B,GAAA;YAAE,GAAG,IAAI,CAACL,aAAa;AAAE,YAAA,GAAGA;AAAc,SAAA;QAE5E,OAAO,IAAI,CAACM,MAAM,CAACP,OAAAA,CAAQQ,IAAI,EAAE,IAAI,CAACC,KAAK,EAAEH,gBAAAA,CAAAA;AAC/C;IAfA,WAAYG,CAAAA,KAAe,EAAER,aAAsB,CAAE;QACnD,IAAI,CAACQ,KAAK,GAAGA,KAAAA;QACb,IAAI,CAACR,aAAa,GAAGA,aAAAA;AACvB;AAeF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.mjs","sources":["../../../../src/modules/runner/runner.ts"],"sourcesContent":["import type { Codemod } from '../codemod';\n\nimport type { Runner as RunnerInterface, RunnerConfiguration, RunnerFunction } from './types';\n\nexport abstract class AbstractRunner<TConfig extends RunnerConfiguration>\n implements RunnerInterface<TConfig>\n{\n abstract runner: RunnerFunction<TConfig>;\n\n paths: string[];\n\n configuration: TConfig;\n\n constructor(paths: string[], configuration: TConfig) {\n this.paths = paths;\n this.configuration = configuration;\n }\n\n async run(codemod: Codemod.Codemod, configuration?: TConfig) {\n const isValidCodemod = this.valid(codemod);\n\n if (!isValidCodemod) {\n throw new Error(`Invalid codemod provided to the runner: ${codemod.filename}`);\n }\n\n const runConfiguration: TConfig = { ...this.configuration, ...configuration };\n\n return this.runner(codemod.path, this.paths, runConfiguration);\n }\n\n abstract valid(codemod: Codemod.Codemod): boolean;\n}\n"],"names":["AbstractRunner","run","codemod","configuration","isValidCodemod","valid","Error","filename","runConfiguration","runner","path","paths","constructor"],"mappings":"AAIO,MAAeA,cAAAA,CAAAA;AAcpB,IAAA,MAAMC,GAAIC,CAAAA,OAAwB,EAAEC,aAAuB,EAAE;AAC3D,QAAA,MAAMC,cAAiB,GAAA,IAAI,CAACC,KAAK,CAACH,OAAAA,CAAAA;AAElC,QAAA,IAAI,CAACE,cAAgB,EAAA;YACnB,MAAM,IAAIE,MAAM,CAAC,wCAAwC,EAAEJ,OAAQK,CAAAA,QAAQ,CAAC,CAAC,CAAA;AAC/E;AAEA,QAAA,MAAMC,gBAA4B,GAAA;YAAE,GAAG,IAAI,CAACL,aAAa;AAAE,YAAA,GAAGA;AAAc,SAAA;QAE5E,OAAO,IAAI,CAACM,MAAM,CAACP,OAAAA,CAAQQ,IAAI,EAAE,IAAI,CAACC,KAAK,EAAEH,gBAAAA,CAAAA;AAC/C;IAfAI,WAAYD,CAAAA,KAAe,EAAER,aAAsB,CAAE;QACnD,IAAI,CAACQ,KAAK,GAAGA,KAAAA;QACb,IAAI,CAACR,aAAa,GAAGA,aAAAA;AACvB;AAeF;;;;"}
1
+ {"version":3,"file":"runner.mjs","sources":["../../../../src/modules/runner/runner.ts"],"sourcesContent":["import type { Codemod } from '../codemod';\n\nimport type { Runner as RunnerInterface, RunnerConfiguration, RunnerFunction } from './types';\n\nexport abstract class AbstractRunner<TConfig extends RunnerConfiguration>\n implements RunnerInterface<TConfig>\n{\n abstract runner: RunnerFunction<TConfig>;\n\n paths: string[];\n\n configuration: TConfig;\n\n constructor(paths: string[], configuration: TConfig) {\n this.paths = paths;\n this.configuration = configuration;\n }\n\n async run(codemod: Codemod.Codemod, configuration?: TConfig) {\n const isValidCodemod = this.valid(codemod);\n\n if (!isValidCodemod) {\n throw new Error(`Invalid codemod provided to the runner: ${codemod.filename}`);\n }\n\n const runConfiguration: TConfig = { ...this.configuration, ...configuration };\n\n return this.runner(codemod.path, this.paths, runConfiguration);\n }\n\n abstract valid(codemod: Codemod.Codemod): boolean;\n}\n"],"names":["AbstractRunner","run","codemod","configuration","isValidCodemod","valid","Error","filename","runConfiguration","runner","path","paths"],"mappings":"AAIO,MAAeA,cAAAA,CAAAA;AAcpB,IAAA,MAAMC,GAAIC,CAAAA,OAAwB,EAAEC,aAAuB,EAAE;AAC3D,QAAA,MAAMC,cAAiB,GAAA,IAAI,CAACC,KAAK,CAACH,OAAAA,CAAAA;AAElC,QAAA,IAAI,CAACE,cAAgB,EAAA;AACnB,YAAA,MAAM,IAAIE,KAAM,CAAA,CAAC,wCAAwC,EAAEJ,OAAAA,CAAQK,QAAQ,CAAE,CAAA,CAAA;AAC/E;AAEA,QAAA,MAAMC,gBAA4B,GAAA;YAAE,GAAG,IAAI,CAACL,aAAa;AAAE,YAAA,GAAGA;AAAc,SAAA;QAE5E,OAAO,IAAI,CAACM,MAAM,CAACP,OAAAA,CAAQQ,IAAI,EAAE,IAAI,CAACC,KAAK,EAAEH,gBAAAA,CAAAA;AAC/C;IAfA,WAAYG,CAAAA,KAAe,EAAER,aAAsB,CAAE;QACnD,IAAI,CAACQ,KAAK,GAAGA,KAAAA;QACb,IAAI,CAACR,aAAa,GAAGA,aAAAA;AACvB;AAeF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"timer.js","sources":["../../../../src/modules/timer/timer.ts"],"sourcesContent":["import type { Timer as TimerInterface, TimeInterval } from './types';\n\nexport class Timer implements TimerInterface {\n private interval!: TimeInterval;\n\n constructor() {\n this.reset();\n }\n\n get elapsedMs() {\n const { start, end } = this.interval;\n\n return end ? end - start : Date.now() - start;\n }\n\n get end() {\n return this.interval.end;\n }\n\n get start() {\n return this.interval.start;\n }\n\n stop() {\n this.interval.end = Date.now();\n\n return this.elapsedMs;\n }\n\n reset() {\n this.interval = { start: Date.now(), end: null };\n\n return this;\n }\n}\n\nexport const timerFactory = () => new Timer();\n"],"names":["Timer","elapsedMs","start","end","interval","Date","now","stop","reset","constructor","timerFactory"],"mappings":";;AAEO,MAAMA,KAAAA,CAAAA;AAOX,IAAA,IAAIC,SAAY,GAAA;QACd,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAE,GAAG,IAAI,CAACC,QAAQ;AAEpC,QAAA,OAAOD,GAAMA,GAAAA,GAAAA,GAAMD,KAAQG,GAAAA,IAAAA,CAAKC,GAAG,EAAKJ,GAAAA,KAAAA;AAC1C;AAEA,IAAA,IAAIC,GAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAACC,QAAQ,CAACD,GAAG;AAC1B;AAEA,IAAA,IAAID,KAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAACE,QAAQ,CAACF,KAAK;AAC5B;IAEAK,IAAO,GAAA;AACL,QAAA,IAAI,CAACH,QAAQ,CAACD,GAAG,GAAGE,KAAKC,GAAG,EAAA;QAE5B,OAAO,IAAI,CAACL,SAAS;AACvB;IAEAO,KAAQ,GAAA;QACN,IAAI,CAACJ,QAAQ,GAAG;AAAEF,YAAAA,KAAAA,EAAOG,KAAKC,GAAG,EAAA;YAAIH,GAAK,EAAA;AAAK,SAAA;AAE/C,QAAA,OAAO,IAAI;AACb;IA5BAM,WAAc,EAAA;AACZ,QAAA,IAAI,CAACD,KAAK,EAAA;AACZ;AA2BF;AAEaE,MAAAA,YAAAA,GAAe,IAAM,IAAIV,KAAQ;;;;;"}
1
+ {"version":3,"file":"timer.js","sources":["../../../../src/modules/timer/timer.ts"],"sourcesContent":["import type { Timer as TimerInterface, TimeInterval } from './types';\n\nexport class Timer implements TimerInterface {\n private interval!: TimeInterval;\n\n constructor() {\n this.reset();\n }\n\n get elapsedMs() {\n const { start, end } = this.interval;\n\n return end ? end - start : Date.now() - start;\n }\n\n get end() {\n return this.interval.end;\n }\n\n get start() {\n return this.interval.start;\n }\n\n stop() {\n this.interval.end = Date.now();\n\n return this.elapsedMs;\n }\n\n reset() {\n this.interval = { start: Date.now(), end: null };\n\n return this;\n }\n}\n\nexport const timerFactory = () => new Timer();\n"],"names":["Timer","elapsedMs","start","end","interval","Date","now","stop","reset","timerFactory"],"mappings":";;AAEO,MAAMA,KAAAA,CAAAA;AAOX,IAAA,IAAIC,SAAY,GAAA;QACd,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAE,GAAG,IAAI,CAACC,QAAQ;AAEpC,QAAA,OAAOD,GAAMA,GAAAA,GAAAA,GAAMD,KAAQG,GAAAA,IAAAA,CAAKC,GAAG,EAAKJ,GAAAA,KAAAA;AAC1C;AAEA,IAAA,IAAIC,GAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAACC,QAAQ,CAACD,GAAG;AAC1B;AAEA,IAAA,IAAID,KAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAACE,QAAQ,CAACF,KAAK;AAC5B;IAEAK,IAAO,GAAA;AACL,QAAA,IAAI,CAACH,QAAQ,CAACD,GAAG,GAAGE,KAAKC,GAAG,EAAA;QAE5B,OAAO,IAAI,CAACL,SAAS;AACvB;IAEAO,KAAQ,GAAA;QACN,IAAI,CAACJ,QAAQ,GAAG;AAAEF,YAAAA,KAAAA,EAAOG,KAAKC,GAAG,EAAA;YAAIH,GAAK,EAAA;AAAK,SAAA;AAE/C,QAAA,OAAO,IAAI;AACb;IA5BA,WAAc,EAAA;AACZ,QAAA,IAAI,CAACK,KAAK,EAAA;AACZ;AA2BF;AAEaC,MAAAA,YAAAA,GAAe,IAAM,IAAIT,KAAQ;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"timer.mjs","sources":["../../../../src/modules/timer/timer.ts"],"sourcesContent":["import type { Timer as TimerInterface, TimeInterval } from './types';\n\nexport class Timer implements TimerInterface {\n private interval!: TimeInterval;\n\n constructor() {\n this.reset();\n }\n\n get elapsedMs() {\n const { start, end } = this.interval;\n\n return end ? end - start : Date.now() - start;\n }\n\n get end() {\n return this.interval.end;\n }\n\n get start() {\n return this.interval.start;\n }\n\n stop() {\n this.interval.end = Date.now();\n\n return this.elapsedMs;\n }\n\n reset() {\n this.interval = { start: Date.now(), end: null };\n\n return this;\n }\n}\n\nexport const timerFactory = () => new Timer();\n"],"names":["Timer","elapsedMs","start","end","interval","Date","now","stop","reset","constructor","timerFactory"],"mappings":"AAEO,MAAMA,KAAAA,CAAAA;AAOX,IAAA,IAAIC,SAAY,GAAA;QACd,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAE,GAAG,IAAI,CAACC,QAAQ;AAEpC,QAAA,OAAOD,GAAMA,GAAAA,GAAAA,GAAMD,KAAQG,GAAAA,IAAAA,CAAKC,GAAG,EAAKJ,GAAAA,KAAAA;AAC1C;AAEA,IAAA,IAAIC,GAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAACC,QAAQ,CAACD,GAAG;AAC1B;AAEA,IAAA,IAAID,KAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAACE,QAAQ,CAACF,KAAK;AAC5B;IAEAK,IAAO,GAAA;AACL,QAAA,IAAI,CAACH,QAAQ,CAACD,GAAG,GAAGE,KAAKC,GAAG,EAAA;QAE5B,OAAO,IAAI,CAACL,SAAS;AACvB;IAEAO,KAAQ,GAAA;QACN,IAAI,CAACJ,QAAQ,GAAG;AAAEF,YAAAA,KAAAA,EAAOG,KAAKC,GAAG,EAAA;YAAIH,GAAK,EAAA;AAAK,SAAA;AAE/C,QAAA,OAAO,IAAI;AACb;IA5BAM,WAAc,EAAA;AACZ,QAAA,IAAI,CAACD,KAAK,EAAA;AACZ;AA2BF;AAEaE,MAAAA,YAAAA,GAAe,IAAM,IAAIV,KAAQ;;;;"}
1
+ {"version":3,"file":"timer.mjs","sources":["../../../../src/modules/timer/timer.ts"],"sourcesContent":["import type { Timer as TimerInterface, TimeInterval } from './types';\n\nexport class Timer implements TimerInterface {\n private interval!: TimeInterval;\n\n constructor() {\n this.reset();\n }\n\n get elapsedMs() {\n const { start, end } = this.interval;\n\n return end ? end - start : Date.now() - start;\n }\n\n get end() {\n return this.interval.end;\n }\n\n get start() {\n return this.interval.start;\n }\n\n stop() {\n this.interval.end = Date.now();\n\n return this.elapsedMs;\n }\n\n reset() {\n this.interval = { start: Date.now(), end: null };\n\n return this;\n }\n}\n\nexport const timerFactory = () => new Timer();\n"],"names":["Timer","elapsedMs","start","end","interval","Date","now","stop","reset","timerFactory"],"mappings":"AAEO,MAAMA,KAAAA,CAAAA;AAOX,IAAA,IAAIC,SAAY,GAAA;QACd,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAE,GAAG,IAAI,CAACC,QAAQ;AAEpC,QAAA,OAAOD,GAAMA,GAAAA,GAAAA,GAAMD,KAAQG,GAAAA,IAAAA,CAAKC,GAAG,EAAKJ,GAAAA,KAAAA;AAC1C;AAEA,IAAA,IAAIC,GAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAACC,QAAQ,CAACD,GAAG;AAC1B;AAEA,IAAA,IAAID,KAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAACE,QAAQ,CAACF,KAAK;AAC5B;IAEAK,IAAO,GAAA;AACL,QAAA,IAAI,CAACH,QAAQ,CAACD,GAAG,GAAGE,KAAKC,GAAG,EAAA;QAE5B,OAAO,IAAI,CAACL,SAAS;AACvB;IAEAO,KAAQ,GAAA;QACN,IAAI,CAACJ,QAAQ,GAAG;AAAEF,YAAAA,KAAAA,EAAOG,KAAKC,GAAG,EAAA;YAAIH,GAAK,EAAA;AAAK,SAAA;AAE/C,QAAA,OAAO,IAAI;AACb;IA5BA,WAAc,EAAA;AACZ,QAAA,IAAI,CAACK,KAAK,EAAA;AACZ;AA2BF;AAEaC,MAAAA,YAAAA,GAAe,IAAM,IAAIT,KAAQ;;;;"}
@@ -10,7 +10,6 @@ require('node:assert');
10
10
  require('fs-extra');
11
11
  var semver = require('../version/semver.js');
12
12
  var range = require('../version/range.js');
13
- require('../version/types.js');
14
13
  require('fast-glob');
15
14
  require('jscodeshift/src/Runner');
16
15
  require('lodash/fp');
@@ -1 +1 @@
1
- {"version":3,"file":"upgrader.js","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const strapiDependencies = this.getScopedStrapiDependencies(dependencies);\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiDependencies.length)} dependency(ies) to update`\n );\n strapiDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n\n if (strapiDependencies.length === 0) {\n return;\n }\n\n strapiDependencies.forEach(([name]) => json.set(`dependencies.${name}`, this.target.raw));\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","strapiDependencies","getScopedStrapiDependencies","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","constructor","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","success"],"mappings":"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"}
1
+ {"version":3,"file":"upgrader.js","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const strapiDependencies = this.getScopedStrapiDependencies(dependencies);\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiDependencies.length)} dependency(ies) to update`\n );\n strapiDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n\n if (strapiDependencies.length === 0) {\n return;\n }\n\n strapiDependencies.forEach(([name]) => json.set(`dependencies.${name}`, this.target.raw));\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","strapiDependencies","getScopedStrapiDependencies","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","success"],"mappings":"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"}
@@ -8,7 +8,6 @@ import 'node:assert';
8
8
  import 'fs-extra';
9
9
  import { semVerFactory, isValidSemVer, isSemverInstance, isSemVerReleaseType } from '../version/semver.mjs';
10
10
  import { rangeFromVersions } from '../version/range.mjs';
11
- import '../version/types.mjs';
12
11
  import 'fast-glob';
13
12
  import 'jscodeshift/src/Runner';
14
13
  import 'lodash/fp';
@@ -1 +1 @@
1
- {"version":3,"file":"upgrader.mjs","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const strapiDependencies = this.getScopedStrapiDependencies(dependencies);\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiDependencies.length)} dependency(ies) to update`\n );\n strapiDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n\n if (strapiDependencies.length === 0) {\n return;\n }\n\n strapiDependencies.forEach(([name]) => json.set(`dependencies.${name}`, this.target.raw));\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","strapiDependencies","getScopedStrapiDependencies","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","constructor","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","success"],"mappings":"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"}
1
+ {"version":3,"file":"upgrader.mjs","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const strapiDependencies = this.getScopedStrapiDependencies(dependencies);\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiDependencies.length)} dependency(ies) to update`\n );\n strapiDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n\n if (strapiDependencies.length === 0) {\n return;\n }\n\n strapiDependencies.forEach(([name]) => json.set(`dependencies.${name}`, this.target.raw));\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","strapiDependencies","getScopedStrapiDependencies","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","success"],"mappings":"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"}