@strapi/upgrade 5.50.0 → 5.50.2

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 (59) hide show
  1. package/dist/cli/commands/codemods.d.ts +9 -0
  2. package/dist/cli/commands/codemods.d.ts.map +1 -0
  3. package/dist/cli/commands/upgrade.d.ts +8 -0
  4. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  5. package/dist/cli/errors.d.ts +2 -0
  6. package/dist/cli/errors.d.ts.map +1 -0
  7. package/dist/cli/index.d.ts +2 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/options.d.ts +8 -0
  10. package/dist/cli/options.d.ts.map +1 -0
  11. package/dist/cli/types.d.ts +41 -0
  12. package/dist/cli/types.d.ts.map +1 -0
  13. package/dist/modules/npm/package.d.ts.map +1 -1
  14. package/dist/modules/project/index.d.ts +1 -0
  15. package/dist/modules/project/index.d.ts.map +1 -1
  16. package/dist/modules/project/project.d.ts +3 -1
  17. package/dist/modules/project/project.d.ts.map +1 -1
  18. package/dist/modules/project/strapi-dependencies.d.ts +18 -0
  19. package/dist/modules/project/strapi-dependencies.d.ts.map +1 -0
  20. package/dist/package.json.js +1 -1
  21. package/dist/package.json.mjs +1 -1
  22. package/dist/src/modules/npm/package.js +0 -1
  23. package/dist/src/modules/npm/package.js.map +1 -1
  24. package/dist/src/modules/npm/package.mjs +0 -1
  25. package/dist/src/modules/npm/package.mjs.map +1 -1
  26. package/dist/src/modules/project/index.js +6 -0
  27. package/dist/src/modules/project/index.js.map +1 -1
  28. package/dist/src/modules/project/index.mjs +1 -0
  29. package/dist/src/modules/project/index.mjs.map +1 -1
  30. package/dist/src/modules/project/project.js +12 -3
  31. package/dist/src/modules/project/project.js.map +1 -1
  32. package/dist/src/modules/project/project.mjs +12 -3
  33. package/dist/src/modules/project/project.mjs.map +1 -1
  34. package/dist/src/modules/project/strapi-dependencies.js +95 -0
  35. package/dist/src/modules/project/strapi-dependencies.js.map +1 -0
  36. package/dist/src/modules/project/strapi-dependencies.mjs +85 -0
  37. package/dist/src/modules/project/strapi-dependencies.mjs.map +1 -0
  38. package/dist/src/tasks/codemods/list-codemods.js +1 -0
  39. package/dist/src/tasks/codemods/list-codemods.js.map +1 -1
  40. package/dist/src/tasks/codemods/list-codemods.mjs +1 -0
  41. package/dist/src/tasks/codemods/list-codemods.mjs.map +1 -1
  42. package/dist/src/tasks/codemods/run-codemods.js +1 -0
  43. package/dist/src/tasks/codemods/run-codemods.js.map +1 -1
  44. package/dist/src/tasks/codemods/run-codemods.mjs +1 -0
  45. package/dist/src/tasks/codemods/run-codemods.mjs.map +1 -1
  46. package/dist/src/tasks/upgrade/prompts/pin-versions.js +45 -0
  47. package/dist/src/tasks/upgrade/prompts/pin-versions.js.map +1 -0
  48. package/dist/src/tasks/upgrade/prompts/pin-versions.mjs +43 -0
  49. package/dist/src/tasks/upgrade/prompts/pin-versions.mjs.map +1 -0
  50. package/dist/src/tasks/upgrade/upgrade.js +5 -2
  51. package/dist/src/tasks/upgrade/upgrade.js.map +1 -1
  52. package/dist/src/tasks/upgrade/upgrade.mjs +5 -2
  53. package/dist/src/tasks/upgrade/upgrade.mjs.map +1 -1
  54. package/dist/tasks/upgrade/prompts/index.d.ts +1 -0
  55. package/dist/tasks/upgrade/prompts/index.d.ts.map +1 -1
  56. package/dist/tasks/upgrade/prompts/pin-versions.d.ts +10 -0
  57. package/dist/tasks/upgrade/prompts/pin-versions.d.ts.map +1 -0
  58. package/dist/tasks/upgrade/upgrade.d.ts.map +1 -1
  59. package/package.json +9 -6
@@ -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","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 applyPackageJSON(packageJSON: MinimalPackageJSON): void {\n this.packageJSON = packageJSON;\n this.refreshStrapiVersion();\n }\n\n getInstalledStrapiVersion(): Version.SemVer {\n return this.findLocallyInstalledStrapiVersion();\n }\n\n 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\n try {\n strapiPackageJSONPath = require.resolve(packageSearchText, { paths: [this.cwd] });\n } catch {\n strapiPackageJSONPath = path.join(\n this.cwd,\n 'node_modules',\n constants.STRAPI_DEPENDENCY_NAME,\n 'package.json'\n );\n }\n\n if (!fse.pathExistsSync(strapiPackageJSONPath)) {\n throw new Error(\n `Cannot resolve module \"${constants.STRAPI_DEPENDENCY_NAME}\" from paths [${this.cwd}]`\n );\n }\n\n const strapiPackageJSON = JSON.parse(\n fse.readFileSync(strapiPackageJSONPath, 'utf-8')\n ) as MinimalPackageJSON;\n\n assert(typeof strapiPackageJSON === 'object');\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","applyPackageJSON","getInstalledStrapiVersion","findLocallyInstalledStrapiVersion","strapiVersion","findStrapiVersionFromProjectPackageJSON","projectName","name","version","dependencies","undefined","isValidSemVer","isLiteralSemVer","semver","semVerFactory","packageSearchText","strapiPackageJSONPath","require","resolve","strapiPackageJSON","assert","type","collection","length","PluginProject","isPlugin","strapi","kind","projectFactory"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ var semver$1 = require('semver');
4
+ var semver = require('../version/semver.js');
5
+ var constants = require('./constants.js');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var semver__default = /*#__PURE__*/_interopDefault(semver$1);
10
+
11
+ const asDependencyRecord = (value)=>{
12
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
13
+ return undefined;
14
+ }
15
+ return value;
16
+ };
17
+ const getPackageDependencyRecords = (packageJSON)=>{
18
+ return {
19
+ dependencies: asDependencyRecord(packageJSON.dependencies),
20
+ devDependencies: asDependencyRecord(packageJSON.devDependencies)
21
+ };
22
+ };
23
+ const isPinnedSemVer = (version)=>{
24
+ return semver.isLiteralSemVer(version) && semver__default.default.valid(version) === version;
25
+ };
26
+ const findUnpinnedStrapiDependencies = (dependencies, devDependencies)=>{
27
+ const unpinned = [];
28
+ const sections = [
29
+ [
30
+ 'dependencies',
31
+ dependencies
32
+ ],
33
+ [
34
+ 'devDependencies',
35
+ devDependencies
36
+ ]
37
+ ];
38
+ for (const [section, deps] of sections){
39
+ if (!deps) {
40
+ continue;
41
+ }
42
+ for (const [name, version] of Object.entries(deps)){
43
+ const isScopedStrapiPackage = name.startsWith(constants.SCOPED_STRAPI_PACKAGE_PREFIX);
44
+ if (isScopedStrapiPackage && !isPinnedSemVer(version)) {
45
+ unpinned.push({
46
+ name,
47
+ declaredVersion: version,
48
+ section
49
+ });
50
+ }
51
+ }
52
+ }
53
+ return unpinned;
54
+ };
55
+ const getStrapiPinTargetVersion = (project)=>{
56
+ const declared = project.packageJSON.dependencies?.[constants.STRAPI_DEPENDENCY_NAME];
57
+ if (!declared) {
58
+ throw new Error(`No version of ${constants.STRAPI_DEPENDENCY_NAME} was found in ${project.packageJSON.name}`);
59
+ }
60
+ if (isPinnedSemVer(declared)) {
61
+ return semver.semVerFactory(declared);
62
+ }
63
+ const minVersion = semver__default.default.minVersion(declared);
64
+ if (minVersion) {
65
+ return semver.semVerFactory(minVersion.version);
66
+ }
67
+ return project.getInstalledStrapiVersion();
68
+ };
69
+ const pinStrapiDependencies = (packageJSON, pinVersion, unpinned)=>{
70
+ const dependencies = {
71
+ ...asDependencyRecord(packageJSON.dependencies)
72
+ };
73
+ const devDependencies = {
74
+ ...asDependencyRecord(packageJSON.devDependencies)
75
+ };
76
+ for (const { name, section } of unpinned){
77
+ if (section === 'dependencies') {
78
+ dependencies[name] = pinVersion;
79
+ } else {
80
+ devDependencies[name] = pinVersion;
81
+ }
82
+ }
83
+ return {
84
+ ...packageJSON,
85
+ dependencies,
86
+ devDependencies
87
+ };
88
+ };
89
+
90
+ exports.findUnpinnedStrapiDependencies = findUnpinnedStrapiDependencies;
91
+ exports.getPackageDependencyRecords = getPackageDependencyRecords;
92
+ exports.getStrapiPinTargetVersion = getStrapiPinTargetVersion;
93
+ exports.isPinnedSemVer = isPinnedSemVer;
94
+ exports.pinStrapiDependencies = pinStrapiDependencies;
95
+ //# sourceMappingURL=strapi-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strapi-dependencies.js","sources":["../../../../src/modules/project/strapi-dependencies.ts"],"sourcesContent":["import semver from 'semver';\n\nimport { isLiteralSemVer, semVerFactory } from '../version';\nimport * as constants from './constants';\n\nimport type { Version } from '../version';\nimport type { AppProject } from './project';\nimport type { MinimalPackageJSON } from './types';\n\nexport type StrapiDependencySection = 'dependencies' | 'devDependencies';\n\nexport type UnpinnedStrapiDependency = {\n name: string;\n declaredVersion: string;\n section: StrapiDependencySection;\n};\n\nconst asDependencyRecord = (value: unknown): Record<string, string> | undefined => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, string>;\n};\n\nexport const getPackageDependencyRecords = (packageJSON: MinimalPackageJSON) => {\n return {\n dependencies: asDependencyRecord(packageJSON.dependencies),\n devDependencies: asDependencyRecord(packageJSON.devDependencies),\n };\n};\n\nexport const isPinnedSemVer = (version: string): boolean => {\n return isLiteralSemVer(version) && semver.valid(version) === version;\n};\n\nexport const findUnpinnedStrapiDependencies = (\n dependencies: Record<string, string> | undefined,\n devDependencies: Record<string, string> | undefined\n): UnpinnedStrapiDependency[] => {\n const unpinned: UnpinnedStrapiDependency[] = [];\n\n const sections: Array<[StrapiDependencySection, Record<string, string> | undefined]> = [\n ['dependencies', dependencies],\n ['devDependencies', devDependencies],\n ];\n\n for (const [section, deps] of sections) {\n if (!deps) {\n continue;\n }\n\n for (const [name, version] of Object.entries(deps)) {\n const isScopedStrapiPackage = name.startsWith(constants.SCOPED_STRAPI_PACKAGE_PREFIX);\n\n if (isScopedStrapiPackage && !isPinnedSemVer(version)) {\n unpinned.push({ name, declaredVersion: version, section });\n }\n }\n }\n\n return unpinned;\n};\n\nexport const getStrapiPinTargetVersion = (project: AppProject): Version.SemVer => {\n const declared = project.packageJSON.dependencies?.[constants.STRAPI_DEPENDENCY_NAME];\n\n if (!declared) {\n throw new Error(\n `No version of ${constants.STRAPI_DEPENDENCY_NAME} was found in ${project.packageJSON.name}`\n );\n }\n\n if (isPinnedSemVer(declared)) {\n return semVerFactory(declared);\n }\n\n const minVersion = semver.minVersion(declared);\n\n if (minVersion) {\n return semVerFactory(minVersion.version);\n }\n\n return project.getInstalledStrapiVersion();\n};\n\nexport const pinStrapiDependencies = (\n packageJSON: MinimalPackageJSON,\n pinVersion: string,\n unpinned: UnpinnedStrapiDependency[]\n): MinimalPackageJSON => {\n const dependencies: Record<string, string> = {\n ...asDependencyRecord(packageJSON.dependencies),\n };\n const devDependencies: Record<string, string> = {\n ...asDependencyRecord(packageJSON.devDependencies),\n };\n\n for (const { name, section } of unpinned) {\n if (section === 'dependencies') {\n dependencies[name] = pinVersion;\n } else {\n devDependencies[name] = pinVersion;\n }\n }\n\n return {\n ...packageJSON,\n dependencies,\n devDependencies,\n };\n};\n"],"names":["asDependencyRecord","value","Array","isArray","undefined","getPackageDependencyRecords","packageJSON","dependencies","devDependencies","isPinnedSemVer","version","isLiteralSemVer","semver","valid","findUnpinnedStrapiDependencies","unpinned","sections","section","deps","name","Object","entries","isScopedStrapiPackage","startsWith","constants","push","declaredVersion","getStrapiPinTargetVersion","project","declared","Error","semVerFactory","minVersion","getInstalledStrapiVersion","pinStrapiDependencies","pinVersion"],"mappings":";;;;;;;;;;AAiBA,MAAMA,qBAAqB,CAACC,KAAAA,GAAAA;IAC1B,IAAI,CAACA,SAAS,OAAOA,KAAAA,KAAU,YAAYC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,EAAQ;QAC/D,OAAOG,SAAAA;AACT,IAAA;IAEA,OAAOH,KAAAA;AACT,CAAA;AAEO,MAAMI,8BAA8B,CAACC,WAAAA,GAAAA;IAC1C,OAAO;QACLC,YAAAA,EAAcP,kBAAAA,CAAmBM,YAAYC,YAAY,CAAA;QACzDC,eAAAA,EAAiBR,kBAAAA,CAAmBM,YAAYE,eAAe;AACjE,KAAA;AACF;AAEO,MAAMC,iBAAiB,CAACC,OAAAA,GAAAA;AAC7B,IAAA,OAAOC,sBAAAA,CAAgBD,OAAAA,CAAAA,IAAYE,uBAAAA,CAAOC,KAAK,CAACH,OAAAA,CAAAA,KAAaA,OAAAA;AAC/D;AAEO,MAAMI,8BAAAA,GAAiC,CAC5CP,YAAAA,EACAC,eAAAA,GAAAA;AAEA,IAAA,MAAMO,WAAuC,EAAE;AAE/C,IAAA,MAAMC,QAAAA,GAAiF;AACrF,QAAA;AAAC,YAAA,cAAA;AAAgBT,YAAAA;AAAa,SAAA;AAC9B,QAAA;AAAC,YAAA,iBAAA;AAAmBC,YAAAA;AAAgB;AACrC,KAAA;AAED,IAAA,KAAK,MAAM,CAACS,OAAAA,EAASC,IAAAA,CAAK,IAAIF,QAAAA,CAAU;AACtC,QAAA,IAAI,CAACE,IAAAA,EAAM;AACT,YAAA;AACF,QAAA;QAEA,KAAK,MAAM,CAACC,IAAAA,EAAMT,OAAAA,CAAQ,IAAIU,MAAAA,CAAOC,OAAO,CAACH,IAAAA,CAAAA,CAAO;AAClD,YAAA,MAAMI,qBAAAA,GAAwBH,IAAAA,CAAKI,UAAU,CAACC,sCAAsC,CAAA;YAEpF,IAAIF,qBAAAA,IAAyB,CAACb,cAAAA,CAAeC,OAAAA,CAAAA,EAAU;AACrDK,gBAAAA,QAAAA,CAASU,IAAI,CAAC;AAAEN,oBAAAA,IAAAA;oBAAMO,eAAAA,EAAiBhB,OAAAA;AAASO,oBAAAA;AAAQ,iBAAA,CAAA;AAC1D,YAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAOF,QAAAA;AACT;AAEO,MAAMY,4BAA4B,CAACC,OAAAA,GAAAA;IACxC,MAAMC,QAAAA,GAAWD,QAAQtB,WAAW,CAACC,YAAY,GAAGiB,gCAAgC,CAAC;AAErF,IAAA,IAAI,CAACK,QAAAA,EAAU;AACb,QAAA,MAAM,IAAIC,KAAAA,CACR,CAAC,cAAc,EAAEN,gCAAgC,CAAC,cAAc,EAAEI,OAAAA,CAAQtB,WAAW,CAACa,IAAI,CAAA,CAAE,CAAA;AAEhG,IAAA;AAEA,IAAA,IAAIV,eAAeoB,QAAAA,CAAAA,EAAW;AAC5B,QAAA,OAAOE,oBAAAA,CAAcF,QAAAA,CAAAA;AACvB,IAAA;IAEA,MAAMG,UAAAA,GAAapB,uBAAAA,CAAOoB,UAAU,CAACH,QAAAA,CAAAA;AAErC,IAAA,IAAIG,UAAAA,EAAY;QACd,OAAOD,oBAAAA,CAAcC,WAAWtB,OAAO,CAAA;AACzC,IAAA;AAEA,IAAA,OAAOkB,QAAQK,yBAAyB,EAAA;AAC1C;AAEO,MAAMC,qBAAAA,GAAwB,CACnC5B,WAAAA,EACA6B,UAAAA,EACApB,QAAAA,GAAAA;AAEA,IAAA,MAAMR,YAAAA,GAAuC;QAC3C,GAAGP,kBAAAA,CAAmBM,WAAAA,CAAYC,YAAY;AAChD,KAAA;AACA,IAAA,MAAMC,eAAAA,GAA0C;QAC9C,GAAGR,kBAAAA,CAAmBM,WAAAA,CAAYE,eAAe;AACnD,KAAA;AAEA,IAAA,KAAK,MAAM,EAAEW,IAAI,EAAEF,OAAO,EAAE,IAAIF,QAAAA,CAAU;AACxC,QAAA,IAAIE,YAAY,cAAA,EAAgB;YAC9BV,YAAY,CAACY,KAAK,GAAGgB,UAAAA;QACvB,CAAA,MAAO;YACL3B,eAAe,CAACW,KAAK,GAAGgB,UAAAA;AAC1B,QAAA;AACF,IAAA;IAEA,OAAO;AACL,QAAA,GAAG7B,WAAW;AACdC,QAAAA,YAAAA;AACAC,QAAAA;AACF,KAAA;AACF;;;;;;;;"}
@@ -0,0 +1,85 @@
1
+ import semver from 'semver';
2
+ import { semVerFactory, isLiteralSemVer } from '../version/semver.mjs';
3
+ import { SCOPED_STRAPI_PACKAGE_PREFIX, STRAPI_DEPENDENCY_NAME } from './constants.mjs';
4
+
5
+ const asDependencyRecord = (value)=>{
6
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
7
+ return undefined;
8
+ }
9
+ return value;
10
+ };
11
+ const getPackageDependencyRecords = (packageJSON)=>{
12
+ return {
13
+ dependencies: asDependencyRecord(packageJSON.dependencies),
14
+ devDependencies: asDependencyRecord(packageJSON.devDependencies)
15
+ };
16
+ };
17
+ const isPinnedSemVer = (version)=>{
18
+ return isLiteralSemVer(version) && semver.valid(version) === version;
19
+ };
20
+ const findUnpinnedStrapiDependencies = (dependencies, devDependencies)=>{
21
+ const unpinned = [];
22
+ const sections = [
23
+ [
24
+ 'dependencies',
25
+ dependencies
26
+ ],
27
+ [
28
+ 'devDependencies',
29
+ devDependencies
30
+ ]
31
+ ];
32
+ for (const [section, deps] of sections){
33
+ if (!deps) {
34
+ continue;
35
+ }
36
+ for (const [name, version] of Object.entries(deps)){
37
+ const isScopedStrapiPackage = name.startsWith(SCOPED_STRAPI_PACKAGE_PREFIX);
38
+ if (isScopedStrapiPackage && !isPinnedSemVer(version)) {
39
+ unpinned.push({
40
+ name,
41
+ declaredVersion: version,
42
+ section
43
+ });
44
+ }
45
+ }
46
+ }
47
+ return unpinned;
48
+ };
49
+ const getStrapiPinTargetVersion = (project)=>{
50
+ const declared = project.packageJSON.dependencies?.[STRAPI_DEPENDENCY_NAME];
51
+ if (!declared) {
52
+ throw new Error(`No version of ${STRAPI_DEPENDENCY_NAME} was found in ${project.packageJSON.name}`);
53
+ }
54
+ if (isPinnedSemVer(declared)) {
55
+ return semVerFactory(declared);
56
+ }
57
+ const minVersion = semver.minVersion(declared);
58
+ if (minVersion) {
59
+ return semVerFactory(minVersion.version);
60
+ }
61
+ return project.getInstalledStrapiVersion();
62
+ };
63
+ const pinStrapiDependencies = (packageJSON, pinVersion, unpinned)=>{
64
+ const dependencies = {
65
+ ...asDependencyRecord(packageJSON.dependencies)
66
+ };
67
+ const devDependencies = {
68
+ ...asDependencyRecord(packageJSON.devDependencies)
69
+ };
70
+ for (const { name, section } of unpinned){
71
+ if (section === 'dependencies') {
72
+ dependencies[name] = pinVersion;
73
+ } else {
74
+ devDependencies[name] = pinVersion;
75
+ }
76
+ }
77
+ return {
78
+ ...packageJSON,
79
+ dependencies,
80
+ devDependencies
81
+ };
82
+ };
83
+
84
+ export { findUnpinnedStrapiDependencies, getPackageDependencyRecords, getStrapiPinTargetVersion, isPinnedSemVer, pinStrapiDependencies };
85
+ //# sourceMappingURL=strapi-dependencies.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strapi-dependencies.mjs","sources":["../../../../src/modules/project/strapi-dependencies.ts"],"sourcesContent":["import semver from 'semver';\n\nimport { isLiteralSemVer, semVerFactory } from '../version';\nimport * as constants from './constants';\n\nimport type { Version } from '../version';\nimport type { AppProject } from './project';\nimport type { MinimalPackageJSON } from './types';\n\nexport type StrapiDependencySection = 'dependencies' | 'devDependencies';\n\nexport type UnpinnedStrapiDependency = {\n name: string;\n declaredVersion: string;\n section: StrapiDependencySection;\n};\n\nconst asDependencyRecord = (value: unknown): Record<string, string> | undefined => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, string>;\n};\n\nexport const getPackageDependencyRecords = (packageJSON: MinimalPackageJSON) => {\n return {\n dependencies: asDependencyRecord(packageJSON.dependencies),\n devDependencies: asDependencyRecord(packageJSON.devDependencies),\n };\n};\n\nexport const isPinnedSemVer = (version: string): boolean => {\n return isLiteralSemVer(version) && semver.valid(version) === version;\n};\n\nexport const findUnpinnedStrapiDependencies = (\n dependencies: Record<string, string> | undefined,\n devDependencies: Record<string, string> | undefined\n): UnpinnedStrapiDependency[] => {\n const unpinned: UnpinnedStrapiDependency[] = [];\n\n const sections: Array<[StrapiDependencySection, Record<string, string> | undefined]> = [\n ['dependencies', dependencies],\n ['devDependencies', devDependencies],\n ];\n\n for (const [section, deps] of sections) {\n if (!deps) {\n continue;\n }\n\n for (const [name, version] of Object.entries(deps)) {\n const isScopedStrapiPackage = name.startsWith(constants.SCOPED_STRAPI_PACKAGE_PREFIX);\n\n if (isScopedStrapiPackage && !isPinnedSemVer(version)) {\n unpinned.push({ name, declaredVersion: version, section });\n }\n }\n }\n\n return unpinned;\n};\n\nexport const getStrapiPinTargetVersion = (project: AppProject): Version.SemVer => {\n const declared = project.packageJSON.dependencies?.[constants.STRAPI_DEPENDENCY_NAME];\n\n if (!declared) {\n throw new Error(\n `No version of ${constants.STRAPI_DEPENDENCY_NAME} was found in ${project.packageJSON.name}`\n );\n }\n\n if (isPinnedSemVer(declared)) {\n return semVerFactory(declared);\n }\n\n const minVersion = semver.minVersion(declared);\n\n if (minVersion) {\n return semVerFactory(minVersion.version);\n }\n\n return project.getInstalledStrapiVersion();\n};\n\nexport const pinStrapiDependencies = (\n packageJSON: MinimalPackageJSON,\n pinVersion: string,\n unpinned: UnpinnedStrapiDependency[]\n): MinimalPackageJSON => {\n const dependencies: Record<string, string> = {\n ...asDependencyRecord(packageJSON.dependencies),\n };\n const devDependencies: Record<string, string> = {\n ...asDependencyRecord(packageJSON.devDependencies),\n };\n\n for (const { name, section } of unpinned) {\n if (section === 'dependencies') {\n dependencies[name] = pinVersion;\n } else {\n devDependencies[name] = pinVersion;\n }\n }\n\n return {\n ...packageJSON,\n dependencies,\n devDependencies,\n };\n};\n"],"names":["asDependencyRecord","value","Array","isArray","undefined","getPackageDependencyRecords","packageJSON","dependencies","devDependencies","isPinnedSemVer","version","isLiteralSemVer","semver","valid","findUnpinnedStrapiDependencies","unpinned","sections","section","deps","name","Object","entries","isScopedStrapiPackage","startsWith","constants","push","declaredVersion","getStrapiPinTargetVersion","project","declared","Error","semVerFactory","minVersion","getInstalledStrapiVersion","pinStrapiDependencies","pinVersion"],"mappings":"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"}
@@ -4,6 +4,7 @@ var repository = require('../../modules/codemod-repository/repository.js');
4
4
  require('../../modules/codemod-repository/constants.js');
5
5
  var project = require('../../modules/project/project.js');
6
6
  require('../../modules/project/constants.js');
7
+ require('semver');
7
8
  var utils = require('./utils.js');
8
9
  var formats = require('../../modules/format/formats.js');
9
10
 
@@ -1 +1 @@
1
- {"version":3,"file":"list-codemods.js","sources":["../../../../src/tasks/codemods/list-codemods.ts"],"sourcesContent":["import { codemodRepositoryFactory } from '../../modules/codemod-repository';\nimport { projectFactory } from '../../modules/project';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport * as f from '../../modules/format';\n\nimport type { ListCodemodsOptions } from './types';\n\nexport const listCodemods = async (options: ListCodemodsOptions) => {\n const { logger, target } = options;\n\n const cwd = resolvePath(options.cwd);\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n // Create a codemod repository targeting the default location of the codemods\n const repo = codemodRepositoryFactory();\n\n // Make sure all the codemods are loaded\n repo.refresh();\n\n // Find groups of codemods matching the given range\n const groups = repo.find({ range });\n\n // Flatten the groups into a simple codemod array\n const codemods = groups.flatMap((collection) => collection.codemods);\n\n // Debug\n logger.debug(`Found ${f.highlight(codemods.length)} codemods`);\n\n // Don't log an empty table\n if (codemods.length === 0) {\n logger.info(`Found no codemods matching ${f.versionRange(range)}`);\n return;\n }\n\n // Format the list to a pretty table\n const fCodemods = f.codemodList(codemods);\n\n logger.raw(fCodemods);\n};\n"],"names":["listCodemods","options","logger","target","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","debug","f","repo","codemodRepositoryFactory","refresh","groups","find","codemods","flatMap","collection","length","info","fCodemods","raw"],"mappings":";;;;;;;;;AAQO,MAAMA,eAAe,OAAOC,OAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;IAE3B,MAAMG,GAAAA,GAAMC,iBAAAA,CAAYJ,OAAAA,CAAQG,GAAG,CAAA;AACnC,IAAA,MAAME,YAAUC,sBAAAA,CAAeH,GAAAA,CAAAA;IAC/B,MAAMI,KAAAA,GAAQC,0BAAoBH,SAAAA,EAASH,MAAAA,CAAAA;AAE3CD,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,sBAAgB,CAACL,SAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOQ,KAAK,CAAC,CAAC,cAAc,EAAEC,oBAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;;AAGrD,IAAA,MAAMI,IAAAA,GAAOC,mCAAAA,EAAAA;;AAGbD,IAAAA,IAAAA,CAAKE,OAAO,EAAA;;IAGZ,MAAMC,MAAAA,GAASH,IAAAA,CAAKI,IAAI,CAAC;AAAER,QAAAA;AAAM,KAAA,CAAA;;AAGjC,IAAA,MAAMS,WAAWF,MAAAA,CAAOG,OAAO,CAAC,CAACC,UAAAA,GAAeA,WAAWF,QAAQ,CAAA;;AAGnEf,IAAAA,MAAAA,CAAOQ,KAAK,CAAC,CAAC,MAAM,EAAEC,iBAAW,CAACM,QAAAA,CAASG,MAAM,CAAA,CAAE,SAAS,CAAC,CAAA;;IAG7D,IAAIH,QAAAA,CAASG,MAAM,KAAK,CAAA,EAAG;QACzBlB,MAAAA,CAAOmB,IAAI,CAAC,CAAC,2BAA2B,EAAEV,oBAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AACjE,QAAA;AACF,IAAA;;IAGA,MAAMc,SAAAA,GAAYX,mBAAa,CAACM,QAAAA,CAAAA;AAEhCf,IAAAA,MAAAA,CAAOqB,GAAG,CAACD,SAAAA,CAAAA;AACb;;;;"}
1
+ {"version":3,"file":"list-codemods.js","sources":["../../../../src/tasks/codemods/list-codemods.ts"],"sourcesContent":["import { codemodRepositoryFactory } from '../../modules/codemod-repository';\nimport { projectFactory } from '../../modules/project';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport * as f from '../../modules/format';\n\nimport type { ListCodemodsOptions } from './types';\n\nexport const listCodemods = async (options: ListCodemodsOptions) => {\n const { logger, target } = options;\n\n const cwd = resolvePath(options.cwd);\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n // Create a codemod repository targeting the default location of the codemods\n const repo = codemodRepositoryFactory();\n\n // Make sure all the codemods are loaded\n repo.refresh();\n\n // Find groups of codemods matching the given range\n const groups = repo.find({ range });\n\n // Flatten the groups into a simple codemod array\n const codemods = groups.flatMap((collection) => collection.codemods);\n\n // Debug\n logger.debug(`Found ${f.highlight(codemods.length)} codemods`);\n\n // Don't log an empty table\n if (codemods.length === 0) {\n logger.info(`Found no codemods matching ${f.versionRange(range)}`);\n return;\n }\n\n // Format the list to a pretty table\n const fCodemods = f.codemodList(codemods);\n\n logger.raw(fCodemods);\n};\n"],"names":["listCodemods","options","logger","target","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","debug","f","repo","codemodRepositoryFactory","refresh","groups","find","codemods","flatMap","collection","length","info","fCodemods","raw"],"mappings":";;;;;;;;;;AAQO,MAAMA,eAAe,OAAOC,OAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;IAE3B,MAAMG,GAAAA,GAAMC,iBAAAA,CAAYJ,OAAAA,CAAQG,GAAG,CAAA;AACnC,IAAA,MAAME,YAAUC,sBAAAA,CAAeH,GAAAA,CAAAA;IAC/B,MAAMI,KAAAA,GAAQC,0BAAoBH,SAAAA,EAASH,MAAAA,CAAAA;AAE3CD,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,sBAAgB,CAACL,SAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOQ,KAAK,CAAC,CAAC,cAAc,EAAEC,oBAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;;AAGrD,IAAA,MAAMI,IAAAA,GAAOC,mCAAAA,EAAAA;;AAGbD,IAAAA,IAAAA,CAAKE,OAAO,EAAA;;IAGZ,MAAMC,MAAAA,GAASH,IAAAA,CAAKI,IAAI,CAAC;AAAER,QAAAA;AAAM,KAAA,CAAA;;AAGjC,IAAA,MAAMS,WAAWF,MAAAA,CAAOG,OAAO,CAAC,CAACC,UAAAA,GAAeA,WAAWF,QAAQ,CAAA;;AAGnEf,IAAAA,MAAAA,CAAOQ,KAAK,CAAC,CAAC,MAAM,EAAEC,iBAAW,CAACM,QAAAA,CAASG,MAAM,CAAA,CAAE,SAAS,CAAC,CAAA;;IAG7D,IAAIH,QAAAA,CAASG,MAAM,KAAK,CAAA,EAAG;QACzBlB,MAAAA,CAAOmB,IAAI,CAAC,CAAC,2BAA2B,EAAEV,oBAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AACjE,QAAA;AACF,IAAA;;IAGA,MAAMc,SAAAA,GAAYX,mBAAa,CAACM,QAAAA,CAAAA;AAEhCf,IAAAA,MAAAA,CAAOqB,GAAG,CAACD,SAAAA,CAAAA;AACb;;;;"}
@@ -2,6 +2,7 @@ import { codemodRepositoryFactory } from '../../modules/codemod-repository/repos
2
2
  import '../../modules/codemod-repository/constants.mjs';
3
3
  import { projectFactory } from '../../modules/project/project.mjs';
4
4
  import '../../modules/project/constants.mjs';
5
+ import 'semver';
5
6
  import { resolvePath, findRangeFromTarget } from './utils.mjs';
6
7
  import { projectDetails, versionRange, highlight, codemodList } from '../../modules/format/formats.mjs';
7
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"list-codemods.mjs","sources":["../../../../src/tasks/codemods/list-codemods.ts"],"sourcesContent":["import { codemodRepositoryFactory } from '../../modules/codemod-repository';\nimport { projectFactory } from '../../modules/project';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport * as f from '../../modules/format';\n\nimport type { ListCodemodsOptions } from './types';\n\nexport const listCodemods = async (options: ListCodemodsOptions) => {\n const { logger, target } = options;\n\n const cwd = resolvePath(options.cwd);\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n // Create a codemod repository targeting the default location of the codemods\n const repo = codemodRepositoryFactory();\n\n // Make sure all the codemods are loaded\n repo.refresh();\n\n // Find groups of codemods matching the given range\n const groups = repo.find({ range });\n\n // Flatten the groups into a simple codemod array\n const codemods = groups.flatMap((collection) => collection.codemods);\n\n // Debug\n logger.debug(`Found ${f.highlight(codemods.length)} codemods`);\n\n // Don't log an empty table\n if (codemods.length === 0) {\n logger.info(`Found no codemods matching ${f.versionRange(range)}`);\n return;\n }\n\n // Format the list to a pretty table\n const fCodemods = f.codemodList(codemods);\n\n logger.raw(fCodemods);\n};\n"],"names":["listCodemods","options","logger","target","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","debug","f","repo","codemodRepositoryFactory","refresh","groups","find","codemods","flatMap","collection","length","info","fCodemods","raw"],"mappings":";;;;;;;AAQO,MAAMA,eAAe,OAAOC,OAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;IAE3B,MAAMG,GAAAA,GAAMC,WAAAA,CAAYJ,OAAAA,CAAQG,GAAG,CAAA;AACnC,IAAA,MAAME,UAAUC,cAAAA,CAAeH,GAAAA,CAAAA;IAC/B,MAAMI,KAAAA,GAAQC,oBAAoBH,OAAAA,EAASH,MAAAA,CAAAA;AAE3CD,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,cAAgB,CAACL,OAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOQ,KAAK,CAAC,CAAC,cAAc,EAAEC,YAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;;AAGrD,IAAA,MAAMI,IAAAA,GAAOC,wBAAAA,EAAAA;;AAGbD,IAAAA,IAAAA,CAAKE,OAAO,EAAA;;IAGZ,MAAMC,MAAAA,GAASH,IAAAA,CAAKI,IAAI,CAAC;AAAER,QAAAA;AAAM,KAAA,CAAA;;AAGjC,IAAA,MAAMS,WAAWF,MAAAA,CAAOG,OAAO,CAAC,CAACC,UAAAA,GAAeA,WAAWF,QAAQ,CAAA;;AAGnEf,IAAAA,MAAAA,CAAOQ,KAAK,CAAC,CAAC,MAAM,EAAEC,SAAW,CAACM,QAAAA,CAASG,MAAM,CAAA,CAAE,SAAS,CAAC,CAAA;;IAG7D,IAAIH,QAAAA,CAASG,MAAM,KAAK,CAAA,EAAG;QACzBlB,MAAAA,CAAOmB,IAAI,CAAC,CAAC,2BAA2B,EAAEV,YAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AACjE,QAAA;AACF,IAAA;;IAGA,MAAMc,SAAAA,GAAYX,WAAa,CAACM,QAAAA,CAAAA;AAEhCf,IAAAA,MAAAA,CAAOqB,GAAG,CAACD,SAAAA,CAAAA;AACb;;;;"}
1
+ {"version":3,"file":"list-codemods.mjs","sources":["../../../../src/tasks/codemods/list-codemods.ts"],"sourcesContent":["import { codemodRepositoryFactory } from '../../modules/codemod-repository';\nimport { projectFactory } from '../../modules/project';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport * as f from '../../modules/format';\n\nimport type { ListCodemodsOptions } from './types';\n\nexport const listCodemods = async (options: ListCodemodsOptions) => {\n const { logger, target } = options;\n\n const cwd = resolvePath(options.cwd);\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n // Create a codemod repository targeting the default location of the codemods\n const repo = codemodRepositoryFactory();\n\n // Make sure all the codemods are loaded\n repo.refresh();\n\n // Find groups of codemods matching the given range\n const groups = repo.find({ range });\n\n // Flatten the groups into a simple codemod array\n const codemods = groups.flatMap((collection) => collection.codemods);\n\n // Debug\n logger.debug(`Found ${f.highlight(codemods.length)} codemods`);\n\n // Don't log an empty table\n if (codemods.length === 0) {\n logger.info(`Found no codemods matching ${f.versionRange(range)}`);\n return;\n }\n\n // Format the list to a pretty table\n const fCodemods = f.codemodList(codemods);\n\n logger.raw(fCodemods);\n};\n"],"names":["listCodemods","options","logger","target","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","debug","f","repo","codemodRepositoryFactory","refresh","groups","find","codemods","flatMap","collection","length","info","fCodemods","raw"],"mappings":";;;;;;;;AAQO,MAAMA,eAAe,OAAOC,OAAAA,GAAAA;AACjC,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGF,OAAAA;IAE3B,MAAMG,GAAAA,GAAMC,WAAAA,CAAYJ,OAAAA,CAAQG,GAAG,CAAA;AACnC,IAAA,MAAME,UAAUC,cAAAA,CAAeH,GAAAA,CAAAA;IAC/B,MAAMI,KAAAA,GAAQC,oBAAoBH,OAAAA,EAASH,MAAAA,CAAAA;AAE3CD,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,cAAgB,CAACL,OAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOQ,KAAK,CAAC,CAAC,cAAc,EAAEC,YAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;;AAGrD,IAAA,MAAMI,IAAAA,GAAOC,wBAAAA,EAAAA;;AAGbD,IAAAA,IAAAA,CAAKE,OAAO,EAAA;;IAGZ,MAAMC,MAAAA,GAASH,IAAAA,CAAKI,IAAI,CAAC;AAAER,QAAAA;AAAM,KAAA,CAAA;;AAGjC,IAAA,MAAMS,WAAWF,MAAAA,CAAOG,OAAO,CAAC,CAACC,UAAAA,GAAeA,WAAWF,QAAQ,CAAA;;AAGnEf,IAAAA,MAAAA,CAAOQ,KAAK,CAAC,CAAC,MAAM,EAAEC,SAAW,CAACM,QAAAA,CAASG,MAAM,CAAA,CAAE,SAAS,CAAC,CAAA;;IAG7D,IAAIH,QAAAA,CAASG,MAAM,KAAK,CAAA,EAAG;QACzBlB,MAAAA,CAAOmB,IAAI,CAAC,CAAC,2BAA2B,EAAEV,YAAc,CAACH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AACjE,QAAA;AACF,IAAA;;IAGA,MAAMc,SAAAA,GAAYX,WAAa,CAACM,QAAAA,CAAAA;AAEhCf,IAAAA,MAAAA,CAAOqB,GAAG,CAACD,SAAAA,CAAAA;AACb;;;;"}
@@ -4,6 +4,7 @@ var formats = require('../../modules/format/formats.js');
4
4
  var timer = require('../../modules/timer/timer.js');
5
5
  var project = require('../../modules/project/project.js');
6
6
  require('../../modules/project/constants.js');
7
+ require('semver');
7
8
  var codemodRunner = require('../../modules/codemod-runner/codemod-runner.js');
8
9
  var utils = require('./utils.js');
9
10
 
@@ -1 +1 @@
1
- {"version":3,"file":"run-codemods.js","sources":["../../../../src/tasks/codemods/run-codemods.ts"],"sourcesContent":["import * as f from '../../modules/format';\nimport { timerFactory } from '../../modules/timer';\nimport { projectFactory } from '../../modules/project';\nimport { codemodRunnerFactory } from '../../modules/codemod-runner';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport type { RunCodemodsOptions } from './types';\nimport type { CodemodRunnerReport } from '../../modules/codemod-runner';\n\nexport const runCodemods = async (options: RunCodemodsOptions) => {\n const timer = timerFactory();\n const { logger, uid } = options;\n\n // Make sure we're resolving the correct working directory based on the given input\n const cwd = resolvePath(options.cwd);\n\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, options.target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n const codemodRunner = codemodRunnerFactory(project, range)\n .dry(options.dry ?? false)\n .onSelectCodemods(options.selectCodemods ?? null)\n .setLogger(logger);\n\n let report: CodemodRunnerReport;\n\n // If uid is defined, only run the selected codemod\n if (uid !== undefined) {\n logger.debug(`Running a single codemod: ${f.codemodUID(uid)}`);\n report = await codemodRunner.runByUID(uid);\n }\n\n // By default, only filter using the specified range\n else {\n report = await codemodRunner.run();\n }\n\n if (!report.success) {\n throw report.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${timer.elapsedMs}`);\n};\n"],"names":["runCodemods","options","timer","timerFactory","logger","uid","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","target","debug","f","codemodRunner","codemodRunnerFactory","dry","onSelectCodemods","selectCodemods","setLogger","report","undefined","runByUID","run","success","error","stop","info","elapsedMs"],"mappings":";;;;;;;;;AASO,MAAMA,cAAc,OAAOC,OAAAA,GAAAA;AAChC,IAAA,MAAMC,OAAAA,GAAQC,kBAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,GAAG,EAAE,GAAGJ,OAAAA;;IAGxB,MAAMK,GAAAA,GAAMC,iBAAAA,CAAYN,OAAAA,CAAQK,GAAG,CAAA;AAEnC,IAAA,MAAME,YAAUC,sBAAAA,CAAeH,GAAAA,CAAAA;AAC/B,IAAA,MAAMI,KAAAA,GAAQC,yBAAAA,CAAoBH,SAAAA,EAASP,OAAAA,CAAQW,MAAM,CAAA;AAEzDR,IAAAA,MAAAA,CAAOS,KAAK,CAACC,sBAAgB,CAACN,SAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOS,KAAK,CAAC,CAAC,cAAc,EAAEC,oBAAc,CAACJ,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAErD,IAAA,MAAMK,kBAAgBC,kCAAAA,CAAqBR,SAAAA,EAASE,KAAAA,CAAAA,CACjDO,GAAG,CAAChB,OAAAA,CAAQgB,GAAG,IAAI,KAAA,CAAA,CACnBC,gBAAgB,CAACjB,OAAAA,CAAQkB,cAAc,IAAI,IAAA,CAAA,CAC3CC,SAAS,CAAChB,MAAAA,CAAAA;IAEb,IAAIiB,MAAAA;;AAGJ,IAAA,IAAIhB,QAAQiB,SAAAA,EAAW;QACrBlB,MAAAA,CAAOS,KAAK,CAAC,CAAC,0BAA0B,EAAEC,kBAAY,CAACT,GAAAA,CAAAA,CAAAA,CAAM,CAAA;QAC7DgB,MAAAA,GAAS,MAAMN,eAAAA,CAAcQ,QAAQ,CAAClB,GAAAA,CAAAA;IACxC,CAAA,MAGK;QACHgB,MAAAA,GAAS,MAAMN,gBAAcS,GAAG,EAAA;AAClC,IAAA;IAEA,IAAI,CAACH,MAAAA,CAAOI,OAAO,EAAE;AACnB,QAAA,MAAMJ,OAAOK,KAAK;AACpB,IAAA;AAEAxB,IAAAA,OAAAA,CAAMyB,IAAI,EAAA;AAEVvB,IAAAA,MAAAA,CAAOwB,IAAI,CAAC,CAAC,aAAa,EAAE1B,OAAAA,CAAM2B,SAAS,CAAA,CAAE,CAAA;AAC/C;;;;"}
1
+ {"version":3,"file":"run-codemods.js","sources":["../../../../src/tasks/codemods/run-codemods.ts"],"sourcesContent":["import * as f from '../../modules/format';\nimport { timerFactory } from '../../modules/timer';\nimport { projectFactory } from '../../modules/project';\nimport { codemodRunnerFactory } from '../../modules/codemod-runner';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport type { RunCodemodsOptions } from './types';\nimport type { CodemodRunnerReport } from '../../modules/codemod-runner';\n\nexport const runCodemods = async (options: RunCodemodsOptions) => {\n const timer = timerFactory();\n const { logger, uid } = options;\n\n // Make sure we're resolving the correct working directory based on the given input\n const cwd = resolvePath(options.cwd);\n\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, options.target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n const codemodRunner = codemodRunnerFactory(project, range)\n .dry(options.dry ?? false)\n .onSelectCodemods(options.selectCodemods ?? null)\n .setLogger(logger);\n\n let report: CodemodRunnerReport;\n\n // If uid is defined, only run the selected codemod\n if (uid !== undefined) {\n logger.debug(`Running a single codemod: ${f.codemodUID(uid)}`);\n report = await codemodRunner.runByUID(uid);\n }\n\n // By default, only filter using the specified range\n else {\n report = await codemodRunner.run();\n }\n\n if (!report.success) {\n throw report.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${timer.elapsedMs}`);\n};\n"],"names":["runCodemods","options","timer","timerFactory","logger","uid","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","target","debug","f","codemodRunner","codemodRunnerFactory","dry","onSelectCodemods","selectCodemods","setLogger","report","undefined","runByUID","run","success","error","stop","info","elapsedMs"],"mappings":";;;;;;;;;;AASO,MAAMA,cAAc,OAAOC,OAAAA,GAAAA;AAChC,IAAA,MAAMC,OAAAA,GAAQC,kBAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,GAAG,EAAE,GAAGJ,OAAAA;;IAGxB,MAAMK,GAAAA,GAAMC,iBAAAA,CAAYN,OAAAA,CAAQK,GAAG,CAAA;AAEnC,IAAA,MAAME,YAAUC,sBAAAA,CAAeH,GAAAA,CAAAA;AAC/B,IAAA,MAAMI,KAAAA,GAAQC,yBAAAA,CAAoBH,SAAAA,EAASP,OAAAA,CAAQW,MAAM,CAAA;AAEzDR,IAAAA,MAAAA,CAAOS,KAAK,CAACC,sBAAgB,CAACN,SAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOS,KAAK,CAAC,CAAC,cAAc,EAAEC,oBAAc,CAACJ,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAErD,IAAA,MAAMK,kBAAgBC,kCAAAA,CAAqBR,SAAAA,EAASE,KAAAA,CAAAA,CACjDO,GAAG,CAAChB,OAAAA,CAAQgB,GAAG,IAAI,KAAA,CAAA,CACnBC,gBAAgB,CAACjB,OAAAA,CAAQkB,cAAc,IAAI,IAAA,CAAA,CAC3CC,SAAS,CAAChB,MAAAA,CAAAA;IAEb,IAAIiB,MAAAA;;AAGJ,IAAA,IAAIhB,QAAQiB,SAAAA,EAAW;QACrBlB,MAAAA,CAAOS,KAAK,CAAC,CAAC,0BAA0B,EAAEC,kBAAY,CAACT,GAAAA,CAAAA,CAAAA,CAAM,CAAA;QAC7DgB,MAAAA,GAAS,MAAMN,eAAAA,CAAcQ,QAAQ,CAAClB,GAAAA,CAAAA;IACxC,CAAA,MAGK;QACHgB,MAAAA,GAAS,MAAMN,gBAAcS,GAAG,EAAA;AAClC,IAAA;IAEA,IAAI,CAACH,MAAAA,CAAOI,OAAO,EAAE;AACnB,QAAA,MAAMJ,OAAOK,KAAK;AACpB,IAAA;AAEAxB,IAAAA,OAAAA,CAAMyB,IAAI,EAAA;AAEVvB,IAAAA,MAAAA,CAAOwB,IAAI,CAAC,CAAC,aAAa,EAAE1B,OAAAA,CAAM2B,SAAS,CAAA,CAAE,CAAA;AAC/C;;;;"}
@@ -2,6 +2,7 @@ import { projectDetails, versionRange, codemodUID } from '../../modules/format/f
2
2
  import { timerFactory } from '../../modules/timer/timer.mjs';
3
3
  import { projectFactory } from '../../modules/project/project.mjs';
4
4
  import '../../modules/project/constants.mjs';
5
+ import 'semver';
5
6
  import { codemodRunnerFactory } from '../../modules/codemod-runner/codemod-runner.mjs';
6
7
  import { resolvePath, findRangeFromTarget } from './utils.mjs';
7
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"run-codemods.mjs","sources":["../../../../src/tasks/codemods/run-codemods.ts"],"sourcesContent":["import * as f from '../../modules/format';\nimport { timerFactory } from '../../modules/timer';\nimport { projectFactory } from '../../modules/project';\nimport { codemodRunnerFactory } from '../../modules/codemod-runner';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport type { RunCodemodsOptions } from './types';\nimport type { CodemodRunnerReport } from '../../modules/codemod-runner';\n\nexport const runCodemods = async (options: RunCodemodsOptions) => {\n const timer = timerFactory();\n const { logger, uid } = options;\n\n // Make sure we're resolving the correct working directory based on the given input\n const cwd = resolvePath(options.cwd);\n\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, options.target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n const codemodRunner = codemodRunnerFactory(project, range)\n .dry(options.dry ?? false)\n .onSelectCodemods(options.selectCodemods ?? null)\n .setLogger(logger);\n\n let report: CodemodRunnerReport;\n\n // If uid is defined, only run the selected codemod\n if (uid !== undefined) {\n logger.debug(`Running a single codemod: ${f.codemodUID(uid)}`);\n report = await codemodRunner.runByUID(uid);\n }\n\n // By default, only filter using the specified range\n else {\n report = await codemodRunner.run();\n }\n\n if (!report.success) {\n throw report.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${timer.elapsedMs}`);\n};\n"],"names":["runCodemods","options","timer","timerFactory","logger","uid","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","target","debug","f","codemodRunner","codemodRunnerFactory","dry","onSelectCodemods","selectCodemods","setLogger","report","undefined","runByUID","run","success","error","stop","info","elapsedMs"],"mappings":";;;;;;;AASO,MAAMA,cAAc,OAAOC,OAAAA,GAAAA;AAChC,IAAA,MAAMC,KAAAA,GAAQC,YAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,GAAG,EAAE,GAAGJ,OAAAA;;IAGxB,MAAMK,GAAAA,GAAMC,WAAAA,CAAYN,OAAAA,CAAQK,GAAG,CAAA;AAEnC,IAAA,MAAME,UAAUC,cAAAA,CAAeH,GAAAA,CAAAA;AAC/B,IAAA,MAAMI,KAAAA,GAAQC,mBAAAA,CAAoBH,OAAAA,EAASP,OAAAA,CAAQW,MAAM,CAAA;AAEzDR,IAAAA,MAAAA,CAAOS,KAAK,CAACC,cAAgB,CAACN,OAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOS,KAAK,CAAC,CAAC,cAAc,EAAEC,YAAc,CAACJ,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAErD,IAAA,MAAMK,gBAAgBC,oBAAAA,CAAqBR,OAAAA,EAASE,KAAAA,CAAAA,CACjDO,GAAG,CAAChB,OAAAA,CAAQgB,GAAG,IAAI,KAAA,CAAA,CACnBC,gBAAgB,CAACjB,OAAAA,CAAQkB,cAAc,IAAI,IAAA,CAAA,CAC3CC,SAAS,CAAChB,MAAAA,CAAAA;IAEb,IAAIiB,MAAAA;;AAGJ,IAAA,IAAIhB,QAAQiB,SAAAA,EAAW;QACrBlB,MAAAA,CAAOS,KAAK,CAAC,CAAC,0BAA0B,EAAEC,UAAY,CAACT,GAAAA,CAAAA,CAAAA,CAAM,CAAA;QAC7DgB,MAAAA,GAAS,MAAMN,aAAAA,CAAcQ,QAAQ,CAAClB,GAAAA,CAAAA;IACxC,CAAA,MAGK;QACHgB,MAAAA,GAAS,MAAMN,cAAcS,GAAG,EAAA;AAClC,IAAA;IAEA,IAAI,CAACH,MAAAA,CAAOI,OAAO,EAAE;AACnB,QAAA,MAAMJ,OAAOK,KAAK;AACpB,IAAA;AAEAxB,IAAAA,KAAAA,CAAMyB,IAAI,EAAA;AAEVvB,IAAAA,MAAAA,CAAOwB,IAAI,CAAC,CAAC,aAAa,EAAE1B,KAAAA,CAAM2B,SAAS,CAAA,CAAE,CAAA;AAC/C;;;;"}
1
+ {"version":3,"file":"run-codemods.mjs","sources":["../../../../src/tasks/codemods/run-codemods.ts"],"sourcesContent":["import * as f from '../../modules/format';\nimport { timerFactory } from '../../modules/timer';\nimport { projectFactory } from '../../modules/project';\nimport { codemodRunnerFactory } from '../../modules/codemod-runner';\nimport { findRangeFromTarget, resolvePath } from './utils';\n\nimport type { RunCodemodsOptions } from './types';\nimport type { CodemodRunnerReport } from '../../modules/codemod-runner';\n\nexport const runCodemods = async (options: RunCodemodsOptions) => {\n const timer = timerFactory();\n const { logger, uid } = options;\n\n // Make sure we're resolving the correct working directory based on the given input\n const cwd = resolvePath(options.cwd);\n\n const project = projectFactory(cwd);\n const range = findRangeFromTarget(project, options.target);\n\n logger.debug(f.projectDetails(project));\n logger.debug(`Range: set to ${f.versionRange(range)}`);\n\n const codemodRunner = codemodRunnerFactory(project, range)\n .dry(options.dry ?? false)\n .onSelectCodemods(options.selectCodemods ?? null)\n .setLogger(logger);\n\n let report: CodemodRunnerReport;\n\n // If uid is defined, only run the selected codemod\n if (uid !== undefined) {\n logger.debug(`Running a single codemod: ${f.codemodUID(uid)}`);\n report = await codemodRunner.runByUID(uid);\n }\n\n // By default, only filter using the specified range\n else {\n report = await codemodRunner.run();\n }\n\n if (!report.success) {\n throw report.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${timer.elapsedMs}`);\n};\n"],"names":["runCodemods","options","timer","timerFactory","logger","uid","cwd","resolvePath","project","projectFactory","range","findRangeFromTarget","target","debug","f","codemodRunner","codemodRunnerFactory","dry","onSelectCodemods","selectCodemods","setLogger","report","undefined","runByUID","run","success","error","stop","info","elapsedMs"],"mappings":";;;;;;;;AASO,MAAMA,cAAc,OAAOC,OAAAA,GAAAA;AAChC,IAAA,MAAMC,KAAAA,GAAQC,YAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,GAAG,EAAE,GAAGJ,OAAAA;;IAGxB,MAAMK,GAAAA,GAAMC,WAAAA,CAAYN,OAAAA,CAAQK,GAAG,CAAA;AAEnC,IAAA,MAAME,UAAUC,cAAAA,CAAeH,GAAAA,CAAAA;AAC/B,IAAA,MAAMI,KAAAA,GAAQC,mBAAAA,CAAoBH,OAAAA,EAASP,OAAAA,CAAQW,MAAM,CAAA;AAEzDR,IAAAA,MAAAA,CAAOS,KAAK,CAACC,cAAgB,CAACN,OAAAA,CAAAA,CAAAA;IAC9BJ,MAAAA,CAAOS,KAAK,CAAC,CAAC,cAAc,EAAEC,YAAc,CAACJ,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAErD,IAAA,MAAMK,gBAAgBC,oBAAAA,CAAqBR,OAAAA,EAASE,KAAAA,CAAAA,CACjDO,GAAG,CAAChB,OAAAA,CAAQgB,GAAG,IAAI,KAAA,CAAA,CACnBC,gBAAgB,CAACjB,OAAAA,CAAQkB,cAAc,IAAI,IAAA,CAAA,CAC3CC,SAAS,CAAChB,MAAAA,CAAAA;IAEb,IAAIiB,MAAAA;;AAGJ,IAAA,IAAIhB,QAAQiB,SAAAA,EAAW;QACrBlB,MAAAA,CAAOS,KAAK,CAAC,CAAC,0BAA0B,EAAEC,UAAY,CAACT,GAAAA,CAAAA,CAAAA,CAAM,CAAA;QAC7DgB,MAAAA,GAAS,MAAMN,aAAAA,CAAcQ,QAAQ,CAAClB,GAAAA,CAAAA;IACxC,CAAA,MAGK;QACHgB,MAAAA,GAAS,MAAMN,cAAcS,GAAG,EAAA;AAClC,IAAA;IAEA,IAAI,CAACH,MAAAA,CAAOI,OAAO,EAAE;AACnB,QAAA,MAAMJ,OAAOK,KAAK;AACpB,IAAA;AAEAxB,IAAAA,KAAAA,CAAMyB,IAAI,EAAA;AAEVvB,IAAAA,MAAAA,CAAOwB,IAAI,CAAC,CAAC,aAAa,EAAE1B,KAAAA,CAAM2B,SAAS,CAAA,CAAE,CAAA;AAC/C;;;;"}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var utils$1 = require('../../../modules/error/utils.js');
4
+ var formats = require('../../../modules/format/formats.js');
5
+ require('lodash/fp');
6
+ var file = require('../../../modules/json/file.js');
7
+ var strapiDependencies = require('../../../modules/project/strapi-dependencies.js');
8
+ var utils = require('../../../modules/project/utils.js');
9
+
10
+ /**
11
+ * Detects ranged @strapi/* dependencies and offers to pin them before upgrading.
12
+ *
13
+ * The upgrade tool matches and bumps only exact semver pins. Ranges (e.g. ^4.26.1)
14
+ * make the current version ambiguous and can cause false "already up-to-date" errors.
15
+ */ const pinVersions = async (project, options)=>{
16
+ utils.assertAppProject(project);
17
+ const { dependencies, devDependencies } = strapiDependencies.getPackageDependencyRecords(project.packageJSON);
18
+ const unpinned = strapiDependencies.findUnpinnedStrapiDependencies(dependencies, devDependencies);
19
+ if (unpinned.length === 0) {
20
+ return;
21
+ }
22
+ const pinTarget = strapiDependencies.getStrapiPinTargetVersion(project);
23
+ const pinVersion = pinTarget.raw;
24
+ const unpinnedList = unpinned.map(({ name, declaredVersion })=>`${name} (${formats.highlight(declaredVersion)})`).join(', ');
25
+ options.logger.warn([
26
+ 'Found @strapi/* dependencies using version ranges instead of pinned versions:',
27
+ unpinnedList,
28
+ `(will pin to ${formats.version(pinTarget)} before upgrading)`
29
+ ].join(' '));
30
+ const confirmed = typeof options.confirm === 'function' ? await options.confirm(`Pin all @strapi/* dependencies to ${formats.version(pinTarget)} before upgrading?`) : true;
31
+ if (!confirmed) {
32
+ throw new utils$1.AbortedError();
33
+ }
34
+ const updatedPackageJSON = strapiDependencies.pinStrapiDependencies(project.packageJSON, pinVersion, unpinned);
35
+ if (options.dry) {
36
+ project.applyPackageJSON(updatedPackageJSON);
37
+ options.logger.warn('Pinned versions in memory only (dry mode).');
38
+ return;
39
+ }
40
+ await file.saveJSON(project.packageJSONPath, updatedPackageJSON);
41
+ project.refresh();
42
+ };
43
+
44
+ exports.pinVersions = pinVersions;
45
+ //# sourceMappingURL=pin-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-versions.js","sources":["../../../../../src/tasks/upgrade/prompts/pin-versions.ts"],"sourcesContent":["import { AbortedError } from '../../../modules/error';\nimport * as f from '../../../modules/format';\nimport { saveJSON } from '../../../modules/json';\nimport {\n findUnpinnedStrapiDependencies,\n getPackageDependencyRecords,\n getStrapiPinTargetVersion,\n pinStrapiDependencies,\n} from '../../../modules/project/strapi-dependencies';\nimport { assertAppProject } from '../../../modules/project/utils';\n\nimport type { Project } from '../../../modules/project';\nimport type { UpgradeOptions } from '../types';\n\n/**\n * Detects ranged @strapi/* dependencies and offers to pin them before upgrading.\n *\n * The upgrade tool matches and bumps only exact semver pins. Ranges (e.g. ^4.26.1)\n * make the current version ambiguous and can cause false \"already up-to-date\" errors.\n */\nexport const pinVersions = async (project: Project, options: UpgradeOptions) => {\n assertAppProject(project);\n\n const { dependencies, devDependencies } = getPackageDependencyRecords(project.packageJSON);\n\n const unpinned = findUnpinnedStrapiDependencies(dependencies, devDependencies);\n\n if (unpinned.length === 0) {\n return;\n }\n\n const pinTarget = getStrapiPinTargetVersion(project);\n const pinVersion = pinTarget.raw;\n\n const unpinnedList = unpinned\n .map(({ name, declaredVersion }) => `${name} (${f.highlight(declaredVersion)})`)\n .join(', ');\n\n options.logger.warn(\n [\n 'Found @strapi/* dependencies using version ranges instead of pinned versions:',\n unpinnedList,\n `(will pin to ${f.version(pinTarget)} before upgrading)`,\n ].join(' ')\n );\n\n const confirmed =\n typeof options.confirm === 'function'\n ? await options.confirm(\n `Pin all @strapi/* dependencies to ${f.version(pinTarget)} before upgrading?`\n )\n : true;\n\n if (!confirmed) {\n throw new AbortedError();\n }\n\n const updatedPackageJSON = pinStrapiDependencies(project.packageJSON, pinVersion, unpinned);\n\n if (options.dry) {\n project.applyPackageJSON(updatedPackageJSON);\n options.logger.warn('Pinned versions in memory only (dry mode).');\n return;\n }\n\n await saveJSON(project.packageJSONPath, updatedPackageJSON);\n project.refresh();\n};\n"],"names":["pinVersions","project","options","assertAppProject","dependencies","devDependencies","getPackageDependencyRecords","packageJSON","unpinned","findUnpinnedStrapiDependencies","length","pinTarget","getStrapiPinTargetVersion","pinVersion","raw","unpinnedList","map","name","declaredVersion","f","join","logger","warn","confirmed","confirm","AbortedError","updatedPackageJSON","pinStrapiDependencies","dry","applyPackageJSON","saveJSON","packageJSONPath","refresh"],"mappings":";;;;;;;;;AAcA;;;;;AAKC,IACM,MAAMA,WAAAA,GAAc,OAAOC,OAAAA,EAAkBC,OAAAA,GAAAA;IAClDC,sBAAAA,CAAiBF,OAAAA,CAAAA;IAEjB,MAAM,EAAEG,YAAY,EAAEC,eAAe,EAAE,GAAGC,8CAAAA,CAA4BL,QAAQM,WAAW,CAAA;IAEzF,MAAMC,QAAAA,GAAWC,kDAA+BL,YAAAA,EAAcC,eAAAA,CAAAA;IAE9D,IAAIG,QAAAA,CAASE,MAAM,KAAK,CAAA,EAAG;AACzB,QAAA;AACF,IAAA;AAEA,IAAA,MAAMC,YAAYC,4CAAAA,CAA0BX,OAAAA,CAAAA;IAC5C,MAAMY,UAAAA,GAAaF,UAAUG,GAAG;IAEhC,MAAMC,YAAAA,GAAeP,SAClBQ,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAEC,eAAe,EAAE,GAAK,GAAGD,IAAAA,CAAK,EAAE,EAAEE,iBAAW,CAACD,iBAAiB,CAAC,CAAC,CAAA,CAC9EE,IAAI,CAAC,IAAA,CAAA;IAERlB,OAAAA,CAAQmB,MAAM,CAACC,IAAI,CACjB;AACE,QAAA,+EAAA;AACAP,QAAAA,YAAAA;AACA,QAAA,CAAC,aAAa,EAAEI,eAAS,CAACR,SAAAA,CAAAA,CAAW,kBAAkB;AACxD,KAAA,CAACS,IAAI,CAAC,GAAA,CAAA,CAAA;AAGT,IAAA,MAAMG,YACJ,OAAOrB,OAAAA,CAAQsB,OAAO,KAAK,UAAA,GACvB,MAAMtB,OAAAA,CAAQsB,OAAO,CACnB,CAAC,kCAAkC,EAAEL,eAAS,CAACR,SAAAA,CAAAA,CAAW,kBAAkB,CAAC,CAAA,GAE/E,IAAA;AAEN,IAAA,IAAI,CAACY,SAAAA,EAAW;AACd,QAAA,MAAM,IAAIE,oBAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMC,kBAAAA,GAAqBC,wCAAAA,CAAsB1B,OAAAA,CAAQM,WAAW,EAAEM,UAAAA,EAAYL,QAAAA,CAAAA;IAElF,IAAIN,OAAAA,CAAQ0B,GAAG,EAAE;AACf3B,QAAAA,OAAAA,CAAQ4B,gBAAgB,CAACH,kBAAAA,CAAAA;QACzBxB,OAAAA,CAAQmB,MAAM,CAACC,IAAI,CAAC,4CAAA,CAAA;AACpB,QAAA;AACF,IAAA;IAEA,MAAMQ,aAAAA,CAAS7B,OAAAA,CAAQ8B,eAAe,EAAEL,kBAAAA,CAAAA;AACxCzB,IAAAA,OAAAA,CAAQ+B,OAAO,EAAA;AACjB;;;;"}
@@ -0,0 +1,43 @@
1
+ import { AbortedError } from '../../../modules/error/utils.mjs';
2
+ import { highlight, version } from '../../../modules/format/formats.mjs';
3
+ import 'lodash/fp';
4
+ import { saveJSON } from '../../../modules/json/file.mjs';
5
+ import { getPackageDependencyRecords, findUnpinnedStrapiDependencies, getStrapiPinTargetVersion, pinStrapiDependencies } from '../../../modules/project/strapi-dependencies.mjs';
6
+ import { assertAppProject } from '../../../modules/project/utils.mjs';
7
+
8
+ /**
9
+ * Detects ranged @strapi/* dependencies and offers to pin them before upgrading.
10
+ *
11
+ * The upgrade tool matches and bumps only exact semver pins. Ranges (e.g. ^4.26.1)
12
+ * make the current version ambiguous and can cause false "already up-to-date" errors.
13
+ */ const pinVersions = async (project, options)=>{
14
+ assertAppProject(project);
15
+ const { dependencies, devDependencies } = getPackageDependencyRecords(project.packageJSON);
16
+ const unpinned = findUnpinnedStrapiDependencies(dependencies, devDependencies);
17
+ if (unpinned.length === 0) {
18
+ return;
19
+ }
20
+ const pinTarget = getStrapiPinTargetVersion(project);
21
+ const pinVersion = pinTarget.raw;
22
+ const unpinnedList = unpinned.map(({ name, declaredVersion })=>`${name} (${highlight(declaredVersion)})`).join(', ');
23
+ options.logger.warn([
24
+ 'Found @strapi/* dependencies using version ranges instead of pinned versions:',
25
+ unpinnedList,
26
+ `(will pin to ${version(pinTarget)} before upgrading)`
27
+ ].join(' '));
28
+ const confirmed = typeof options.confirm === 'function' ? await options.confirm(`Pin all @strapi/* dependencies to ${version(pinTarget)} before upgrading?`) : true;
29
+ if (!confirmed) {
30
+ throw new AbortedError();
31
+ }
32
+ const updatedPackageJSON = pinStrapiDependencies(project.packageJSON, pinVersion, unpinned);
33
+ if (options.dry) {
34
+ project.applyPackageJSON(updatedPackageJSON);
35
+ options.logger.warn('Pinned versions in memory only (dry mode).');
36
+ return;
37
+ }
38
+ await saveJSON(project.packageJSONPath, updatedPackageJSON);
39
+ project.refresh();
40
+ };
41
+
42
+ export { pinVersions };
43
+ //# sourceMappingURL=pin-versions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-versions.mjs","sources":["../../../../../src/tasks/upgrade/prompts/pin-versions.ts"],"sourcesContent":["import { AbortedError } from '../../../modules/error';\nimport * as f from '../../../modules/format';\nimport { saveJSON } from '../../../modules/json';\nimport {\n findUnpinnedStrapiDependencies,\n getPackageDependencyRecords,\n getStrapiPinTargetVersion,\n pinStrapiDependencies,\n} from '../../../modules/project/strapi-dependencies';\nimport { assertAppProject } from '../../../modules/project/utils';\n\nimport type { Project } from '../../../modules/project';\nimport type { UpgradeOptions } from '../types';\n\n/**\n * Detects ranged @strapi/* dependencies and offers to pin them before upgrading.\n *\n * The upgrade tool matches and bumps only exact semver pins. Ranges (e.g. ^4.26.1)\n * make the current version ambiguous and can cause false \"already up-to-date\" errors.\n */\nexport const pinVersions = async (project: Project, options: UpgradeOptions) => {\n assertAppProject(project);\n\n const { dependencies, devDependencies } = getPackageDependencyRecords(project.packageJSON);\n\n const unpinned = findUnpinnedStrapiDependencies(dependencies, devDependencies);\n\n if (unpinned.length === 0) {\n return;\n }\n\n const pinTarget = getStrapiPinTargetVersion(project);\n const pinVersion = pinTarget.raw;\n\n const unpinnedList = unpinned\n .map(({ name, declaredVersion }) => `${name} (${f.highlight(declaredVersion)})`)\n .join(', ');\n\n options.logger.warn(\n [\n 'Found @strapi/* dependencies using version ranges instead of pinned versions:',\n unpinnedList,\n `(will pin to ${f.version(pinTarget)} before upgrading)`,\n ].join(' ')\n );\n\n const confirmed =\n typeof options.confirm === 'function'\n ? await options.confirm(\n `Pin all @strapi/* dependencies to ${f.version(pinTarget)} before upgrading?`\n )\n : true;\n\n if (!confirmed) {\n throw new AbortedError();\n }\n\n const updatedPackageJSON = pinStrapiDependencies(project.packageJSON, pinVersion, unpinned);\n\n if (options.dry) {\n project.applyPackageJSON(updatedPackageJSON);\n options.logger.warn('Pinned versions in memory only (dry mode).');\n return;\n }\n\n await saveJSON(project.packageJSONPath, updatedPackageJSON);\n project.refresh();\n};\n"],"names":["pinVersions","project","options","assertAppProject","dependencies","devDependencies","getPackageDependencyRecords","packageJSON","unpinned","findUnpinnedStrapiDependencies","length","pinTarget","getStrapiPinTargetVersion","pinVersion","raw","unpinnedList","map","name","declaredVersion","f","join","logger","warn","confirmed","confirm","AbortedError","updatedPackageJSON","pinStrapiDependencies","dry","applyPackageJSON","saveJSON","packageJSONPath","refresh"],"mappings":";;;;;;;AAcA;;;;;AAKC,IACM,MAAMA,WAAAA,GAAc,OAAOC,OAAAA,EAAkBC,OAAAA,GAAAA;IAClDC,gBAAAA,CAAiBF,OAAAA,CAAAA;IAEjB,MAAM,EAAEG,YAAY,EAAEC,eAAe,EAAE,GAAGC,2BAAAA,CAA4BL,QAAQM,WAAW,CAAA;IAEzF,MAAMC,QAAAA,GAAWC,+BAA+BL,YAAAA,EAAcC,eAAAA,CAAAA;IAE9D,IAAIG,QAAAA,CAASE,MAAM,KAAK,CAAA,EAAG;AACzB,QAAA;AACF,IAAA;AAEA,IAAA,MAAMC,YAAYC,yBAAAA,CAA0BX,OAAAA,CAAAA;IAC5C,MAAMY,UAAAA,GAAaF,UAAUG,GAAG;IAEhC,MAAMC,YAAAA,GAAeP,SAClBQ,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAEC,eAAe,EAAE,GAAK,GAAGD,IAAAA,CAAK,EAAE,EAAEE,SAAW,CAACD,iBAAiB,CAAC,CAAC,CAAA,CAC9EE,IAAI,CAAC,IAAA,CAAA;IAERlB,OAAAA,CAAQmB,MAAM,CAACC,IAAI,CACjB;AACE,QAAA,+EAAA;AACAP,QAAAA,YAAAA;AACA,QAAA,CAAC,aAAa,EAAEI,OAAS,CAACR,SAAAA,CAAAA,CAAW,kBAAkB;AACxD,KAAA,CAACS,IAAI,CAAC,GAAA,CAAA,CAAA;AAGT,IAAA,MAAMG,YACJ,OAAOrB,OAAAA,CAAQsB,OAAO,KAAK,UAAA,GACvB,MAAMtB,OAAAA,CAAQsB,OAAO,CACnB,CAAC,kCAAkC,EAAEL,OAAS,CAACR,SAAAA,CAAAA,CAAW,kBAAkB,CAAC,CAAA,GAE/E,IAAA;AAEN,IAAA,IAAI,CAACY,SAAAA,EAAW;AACd,QAAA,MAAM,IAAIE,YAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMC,kBAAAA,GAAqBC,qBAAAA,CAAsB1B,OAAAA,CAAQM,WAAW,EAAEM,UAAAA,EAAYL,QAAAA,CAAAA;IAElF,IAAIN,OAAAA,CAAQ0B,GAAG,EAAE;AACf3B,QAAAA,OAAAA,CAAQ4B,gBAAgB,CAACH,kBAAAA,CAAAA;QACzBxB,OAAAA,CAAQmB,MAAM,CAACC,IAAI,CAAC,4CAAA,CAAA;AACpB,QAAA;AACF,IAAA;IAEA,MAAMQ,QAAAA,CAAS7B,OAAAA,CAAQ8B,eAAe,EAAEL,kBAAAA,CAAAA;AACxCzB,IAAAA,OAAAA,CAAQ+B,OAAO,EAAA;AACjB;;;;"}
@@ -6,14 +6,15 @@ var _package = require('../../modules/npm/package.js');
6
6
  var project = require('../../modules/project/project.js');
7
7
  require('../../modules/project/constants.js');
8
8
  var utils = require('../../modules/project/utils.js');
9
+ require('semver');
10
+ var types = require('../../modules/version/types.js');
9
11
  var timer = require('../../modules/timer/timer.js');
10
12
  var upgrader = require('../../modules/upgrader/upgrader.js');
11
13
  var constants = require('../../modules/upgrader/constants.js');
12
- require('semver');
13
- var types = require('../../modules/version/types.js');
14
14
  var major = require('./requirements/major.js');
15
15
  var common = require('./requirements/common.js');
16
16
  var latest = require('./prompts/latest.js');
17
+ var pinVersions = require('./prompts/pin-versions.js');
17
18
 
18
19
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
20
 
@@ -33,6 +34,8 @@ const upgrade = async (options)=>{
33
34
  const npmPackage = _package.npmPackageFactory(constants.STRAPI_PACKAGE_NAME, project$1.cwd, logger);
34
35
  // Load all available versions from the NPM registry
35
36
  await npmPackage.refresh();
37
+ // Pin ranged @strapi/* dependencies before resolving upgrade targets
38
+ await pinVersions.pinVersions(project$1, options);
36
39
  // Initialize the upgrade instance
37
40
  // Throws during initialization if the provided target is incompatible with the current version
38
41
  const upgrader$1 = upgrader.upgraderFactory(project$1, options.target, npmPackage).dry(options.dry ?? false).onConfirm(options.confirm ?? null).setLogger(logger);
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sources":["../../../../src/tasks/upgrade/upgrade.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as f from '../../modules/format';\nimport { npmPackageFactory } from '../../modules/npm';\nimport { isApplicationProject, projectFactory } from '../../modules/project';\nimport { timerFactory } from '../../modules/timer';\nimport { constants as upgraderConstants, upgraderFactory } from '../../modules/upgrader';\nimport { Version } from '../../modules/version';\n\nimport * as requirements from './requirements';\nimport * as prompts from './prompts';\n\nimport type { UpgradeOptions } from './types';\nimport type { Upgrader } from '../../modules/upgrader';\n\nexport const upgrade = async (options: UpgradeOptions) => {\n const timer = timerFactory();\n const { logger, codemodsTarget } = options;\n\n // Resolves the correct working directory based on the given input\n const cwd = path.resolve(options.cwd ?? process.cwd());\n\n const project = projectFactory(cwd);\n\n logger.debug(f.projectDetails(project));\n\n if (!isApplicationProject(project)) {\n throw new Error(\n `The \"${options.target}\" upgrade can only be run on a Strapi project; for plugins, please use \"codemods\".`\n );\n }\n\n logger.debug(\n `Application: VERSION=${f.version(project.packageJSON.version as Version.LiteralVersion)}; STRAPI_VERSION=${f.version(project.strapiVersion)}`\n );\n\n const npmPackage = npmPackageFactory(upgraderConstants.STRAPI_PACKAGE_NAME, project.cwd, logger);\n\n // Load all available versions from the NPM registry\n await npmPackage.refresh();\n\n // Initialize the upgrade instance\n // Throws during initialization if the provided target is incompatible with the current version\n const upgrader = upgraderFactory(project, options.target, npmPackage)\n .dry(options.dry ?? false)\n .onConfirm(options.confirm ?? null)\n .setLogger(logger);\n\n // Manually override the target version for codemods if it's explicitly provided\n if (codemodsTarget !== undefined) {\n upgrader.overrideCodemodsTarget(codemodsTarget);\n }\n\n // Prompt user for confirmation details before upgrading\n await runUpgradePrompts(upgrader, options);\n\n // Add specific requirements before upgrading\n addUpgradeRequirements(upgrader, options);\n\n // Actually run the upgrade process once configured,\n // The response contains information about the final status: success/error\n const upgradeReport = await upgrader.upgrade();\n\n if (!upgradeReport.success) {\n throw upgradeReport.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${f.durationMs(timer.elapsedMs)}ms`);\n};\n\nconst runUpgradePrompts = async (upgrader: Upgrader, options: UpgradeOptions) => {\n if (options.target === Version.RELEASE_TYPES.Latest) {\n await prompts.latest(upgrader, options);\n }\n};\n\nconst addUpgradeRequirements = (upgrader: Upgrader, options: UpgradeOptions): void => {\n // Major release upgrades enforce stepping through the latest patch for the current major.\n // Semver targets (via the \"to\" command) skip these checks intentionally.\n if (options.target === Version.RELEASE_TYPES.Major) {\n upgrader\n .addRequirement(requirements.major.REQUIRE_AVAILABLE_NEXT_MAJOR)\n .addRequirement(requirements.major.REQUIRE_LATEST_FOR_CURRENT_MAJOR);\n }\n\n // Make sure the git repository is in an optimal state before running the upgrade\n // Mainly used to ease rollbacks in case the upgrade is corrupted\n upgrader.addRequirement(requirements.common.REQUIRE_GIT.asOptional());\n};\n"],"names":["upgrade","options","timer","timerFactory","logger","codemodsTarget","cwd","path","resolve","process","project","projectFactory","debug","f","isApplicationProject","Error","target","packageJSON","version","strapiVersion","npmPackage","npmPackageFactory","upgraderConstants","refresh","upgrader","upgraderFactory","dry","onConfirm","confirm","setLogger","undefined","overrideCodemodsTarget","runUpgradePrompts","addUpgradeRequirements","upgradeReport","success","error","stop","info","elapsedMs","Version","Latest","prompts","Major","addRequirement","requirements","asOptional"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAeO,MAAMA,UAAU,OAAOC,OAAAA,GAAAA;AAC5B,IAAA,MAAMC,OAAAA,GAAQC,kBAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAE,GAAGJ,OAAAA;;IAGnC,MAAMK,GAAAA,GAAMC,sBAAKC,OAAO,CAACP,QAAQK,GAAG,IAAIG,QAAQH,GAAG,EAAA,CAAA;AAEnD,IAAA,MAAMI,YAAUC,sBAAAA,CAAeL,GAAAA,CAAAA;AAE/BF,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,sBAAgB,CAACH,SAAAA,CAAAA,CAAAA;IAE9B,IAAI,CAACI,2BAAqBJ,SAAAA,CAAAA,EAAU;QAClC,MAAM,IAAIK,MACR,CAAC,KAAK,EAAEd,OAAAA,CAAQe,MAAM,CAAC,kFAAkF,CAAC,CAAA;AAE9G,IAAA;IAEAZ,MAAAA,CAAOQ,KAAK,CACV,CAAC,qBAAqB,EAAEC,eAAS,CAACH,SAAAA,CAAQO,WAAW,CAACC,OAAO,CAAA,CAA4B,iBAAiB,EAAEL,eAAS,CAACH,SAAAA,CAAQS,aAAa,CAAA,CAAA,CAAG,CAAA;AAGhJ,IAAA,MAAMC,aAAaC,0BAAAA,CAAkBC,6BAAqC,EAAEZ,SAAAA,CAAQJ,GAAG,EAAEF,MAAAA,CAAAA;;AAGzF,IAAA,MAAMgB,WAAWG,OAAO,EAAA;;;IAIxB,MAAMC,UAAAA,GAAWC,yBAAgBf,SAAAA,EAAST,OAAAA,CAAQe,MAAM,EAAEI,UAAAA,CAAAA,CACvDM,GAAG,CAACzB,OAAAA,CAAQyB,GAAG,IAAI,KAAA,CAAA,CACnBC,SAAS,CAAC1B,OAAAA,CAAQ2B,OAAO,IAAI,IAAA,CAAA,CAC7BC,SAAS,CAACzB,MAAAA,CAAAA;;AAGb,IAAA,IAAIC,mBAAmByB,SAAAA,EAAW;AAChCN,QAAAA,UAAAA,CAASO,sBAAsB,CAAC1B,cAAAA,CAAAA;AAClC,IAAA;;AAGA,IAAA,MAAM2B,kBAAkBR,UAAAA,EAAUvB,OAAAA,CAAAA;;AAGlCgC,IAAAA,sBAAAA,CAAuBT,UAAAA,EAAUvB,OAAAA,CAAAA;;;IAIjC,MAAMiC,aAAAA,GAAgB,MAAMV,UAAAA,CAASxB,OAAO,EAAA;IAE5C,IAAI,CAACkC,aAAAA,CAAcC,OAAO,EAAE;AAC1B,QAAA,MAAMD,cAAcE,KAAK;AAC3B,IAAA;AAEAlC,IAAAA,OAAAA,CAAMmC,IAAI,EAAA;AAEVjC,IAAAA,MAAAA,CAAOkC,IAAI,CAAC,CAAC,aAAa,EAAEzB,kBAAY,CAACX,OAAAA,CAAMqC,SAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/D;AAEA,MAAMP,iBAAAA,GAAoB,OAAOR,QAAAA,EAAoBvB,OAAAA,GAAAA;AACnD,IAAA,IAAIA,QAAQe,MAAM,KAAKwB,mBAAqB,CAACC,MAAM,EAAE;QACnD,MAAMC,aAAc,CAAClB,QAAAA,EAAUvB,OAAAA,CAAAA;AACjC,IAAA;AACF,CAAA;AAEA,MAAMgC,sBAAAA,GAAyB,CAACT,QAAAA,EAAoBvB,OAAAA,GAAAA;;;AAGlD,IAAA,IAAIA,QAAQe,MAAM,KAAKwB,mBAAqB,CAACG,KAAK,EAAE;AAClDnB,QAAAA,QAAAA,CACGoB,cAAc,CAACC,kCAA+C,CAAA,CAC9DD,cAAc,CAACC,sCAAmD,CAAA;AACvE,IAAA;;;AAIArB,IAAAA,QAAAA,CAASoB,cAAc,CAACC,kBAA+B,CAACC,UAAU,EAAA,CAAA;AACpE,CAAA;;;;"}
1
+ {"version":3,"file":"upgrade.js","sources":["../../../../src/tasks/upgrade/upgrade.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as f from '../../modules/format';\nimport { npmPackageFactory } from '../../modules/npm';\nimport { isApplicationProject, projectFactory } from '../../modules/project';\nimport { timerFactory } from '../../modules/timer';\nimport { constants as upgraderConstants, upgraderFactory } from '../../modules/upgrader';\nimport { Version } from '../../modules/version';\n\nimport * as requirements from './requirements';\nimport * as prompts from './prompts';\n\nimport type { UpgradeOptions } from './types';\nimport type { Upgrader } from '../../modules/upgrader';\n\nexport const upgrade = async (options: UpgradeOptions) => {\n const timer = timerFactory();\n const { logger, codemodsTarget } = options;\n\n // Resolves the correct working directory based on the given input\n const cwd = path.resolve(options.cwd ?? process.cwd());\n\n const project = projectFactory(cwd);\n\n logger.debug(f.projectDetails(project));\n\n if (!isApplicationProject(project)) {\n throw new Error(\n `The \"${options.target}\" upgrade can only be run on a Strapi project; for plugins, please use \"codemods\".`\n );\n }\n\n logger.debug(\n `Application: VERSION=${f.version(project.packageJSON.version as Version.LiteralVersion)}; STRAPI_VERSION=${f.version(project.strapiVersion)}`\n );\n\n const npmPackage = npmPackageFactory(upgraderConstants.STRAPI_PACKAGE_NAME, project.cwd, logger);\n\n // Load all available versions from the NPM registry\n await npmPackage.refresh();\n\n // Pin ranged @strapi/* dependencies before resolving upgrade targets\n await prompts.pinVersions(project, options);\n\n // Initialize the upgrade instance\n // Throws during initialization if the provided target is incompatible with the current version\n const upgrader = upgraderFactory(project, options.target, npmPackage)\n .dry(options.dry ?? false)\n .onConfirm(options.confirm ?? null)\n .setLogger(logger);\n\n // Manually override the target version for codemods if it's explicitly provided\n if (codemodsTarget !== undefined) {\n upgrader.overrideCodemodsTarget(codemodsTarget);\n }\n\n // Prompt user for confirmation details before upgrading\n await runUpgradePrompts(upgrader, options);\n\n // Add specific requirements before upgrading\n addUpgradeRequirements(upgrader, options);\n\n // Actually run the upgrade process once configured,\n // The response contains information about the final status: success/error\n const upgradeReport = await upgrader.upgrade();\n\n if (!upgradeReport.success) {\n throw upgradeReport.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${f.durationMs(timer.elapsedMs)}ms`);\n};\n\nconst runUpgradePrompts = async (upgrader: Upgrader, options: UpgradeOptions) => {\n if (options.target === Version.RELEASE_TYPES.Latest) {\n await prompts.latest(upgrader, options);\n }\n};\n\nconst addUpgradeRequirements = (upgrader: Upgrader, options: UpgradeOptions): void => {\n // Major release upgrades enforce stepping through the latest patch for the current major.\n // Semver targets (via the \"to\" command) skip these checks intentionally.\n if (options.target === Version.RELEASE_TYPES.Major) {\n upgrader\n .addRequirement(requirements.major.REQUIRE_AVAILABLE_NEXT_MAJOR)\n .addRequirement(requirements.major.REQUIRE_LATEST_FOR_CURRENT_MAJOR);\n }\n\n // Make sure the git repository is in an optimal state before running the upgrade\n // Mainly used to ease rollbacks in case the upgrade is corrupted\n upgrader.addRequirement(requirements.common.REQUIRE_GIT.asOptional());\n};\n"],"names":["upgrade","options","timer","timerFactory","logger","codemodsTarget","cwd","path","resolve","process","project","projectFactory","debug","f","isApplicationProject","Error","target","packageJSON","version","strapiVersion","npmPackage","npmPackageFactory","upgraderConstants","refresh","prompts","upgrader","upgraderFactory","dry","onConfirm","confirm","setLogger","undefined","overrideCodemodsTarget","runUpgradePrompts","addUpgradeRequirements","upgradeReport","success","error","stop","info","elapsedMs","Version","Latest","Major","addRequirement","requirements","asOptional"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAeO,MAAMA,UAAU,OAAOC,OAAAA,GAAAA;AAC5B,IAAA,MAAMC,OAAAA,GAAQC,kBAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAE,GAAGJ,OAAAA;;IAGnC,MAAMK,GAAAA,GAAMC,sBAAKC,OAAO,CAACP,QAAQK,GAAG,IAAIG,QAAQH,GAAG,EAAA,CAAA;AAEnD,IAAA,MAAMI,YAAUC,sBAAAA,CAAeL,GAAAA,CAAAA;AAE/BF,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,sBAAgB,CAACH,SAAAA,CAAAA,CAAAA;IAE9B,IAAI,CAACI,2BAAqBJ,SAAAA,CAAAA,EAAU;QAClC,MAAM,IAAIK,MACR,CAAC,KAAK,EAAEd,OAAAA,CAAQe,MAAM,CAAC,kFAAkF,CAAC,CAAA;AAE9G,IAAA;IAEAZ,MAAAA,CAAOQ,KAAK,CACV,CAAC,qBAAqB,EAAEC,eAAS,CAACH,SAAAA,CAAQO,WAAW,CAACC,OAAO,CAAA,CAA4B,iBAAiB,EAAEL,eAAS,CAACH,SAAAA,CAAQS,aAAa,CAAA,CAAA,CAAG,CAAA;AAGhJ,IAAA,MAAMC,aAAaC,0BAAAA,CAAkBC,6BAAqC,EAAEZ,SAAAA,CAAQJ,GAAG,EAAEF,MAAAA,CAAAA;;AAGzF,IAAA,MAAMgB,WAAWG,OAAO,EAAA;;IAGxB,MAAMC,uBAAmB,CAACd,SAAAA,EAAST,OAAAA,CAAAA;;;IAInC,MAAMwB,UAAAA,GAAWC,yBAAgBhB,SAAAA,EAAST,OAAAA,CAAQe,MAAM,EAAEI,UAAAA,CAAAA,CACvDO,GAAG,CAAC1B,OAAAA,CAAQ0B,GAAG,IAAI,KAAA,CAAA,CACnBC,SAAS,CAAC3B,OAAAA,CAAQ4B,OAAO,IAAI,IAAA,CAAA,CAC7BC,SAAS,CAAC1B,MAAAA,CAAAA;;AAGb,IAAA,IAAIC,mBAAmB0B,SAAAA,EAAW;AAChCN,QAAAA,UAAAA,CAASO,sBAAsB,CAAC3B,cAAAA,CAAAA;AAClC,IAAA;;AAGA,IAAA,MAAM4B,kBAAkBR,UAAAA,EAAUxB,OAAAA,CAAAA;;AAGlCiC,IAAAA,sBAAAA,CAAuBT,UAAAA,EAAUxB,OAAAA,CAAAA;;;IAIjC,MAAMkC,aAAAA,GAAgB,MAAMV,UAAAA,CAASzB,OAAO,EAAA;IAE5C,IAAI,CAACmC,aAAAA,CAAcC,OAAO,EAAE;AAC1B,QAAA,MAAMD,cAAcE,KAAK;AAC3B,IAAA;AAEAnC,IAAAA,OAAAA,CAAMoC,IAAI,EAAA;AAEVlC,IAAAA,MAAAA,CAAOmC,IAAI,CAAC,CAAC,aAAa,EAAE1B,kBAAY,CAACX,OAAAA,CAAMsC,SAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/D;AAEA,MAAMP,iBAAAA,GAAoB,OAAOR,QAAAA,EAAoBxB,OAAAA,GAAAA;AACnD,IAAA,IAAIA,QAAQe,MAAM,KAAKyB,mBAAqB,CAACC,MAAM,EAAE;QACnD,MAAMlB,aAAc,CAACC,QAAAA,EAAUxB,OAAAA,CAAAA;AACjC,IAAA;AACF,CAAA;AAEA,MAAMiC,sBAAAA,GAAyB,CAACT,QAAAA,EAAoBxB,OAAAA,GAAAA;;;AAGlD,IAAA,IAAIA,QAAQe,MAAM,KAAKyB,mBAAqB,CAACE,KAAK,EAAE;AAClDlB,QAAAA,QAAAA,CACGmB,cAAc,CAACC,kCAA+C,CAAA,CAC9DD,cAAc,CAACC,sCAAmD,CAAA;AACvE,IAAA;;;AAIApB,IAAAA,QAAAA,CAASmB,cAAc,CAACC,kBAA+B,CAACC,UAAU,EAAA,CAAA;AACpE,CAAA;;;;"}