@strapi/upgrade 5.0.0-alpha.5 → 5.0.0-alpha.8

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 (43) hide show
  1. package/dist/_chunks/{codemod-runner-CrDQxTWE.js → codemod-runner-krrxD_9I.js} +88 -20
  2. package/dist/_chunks/codemod-runner-krrxD_9I.js.map +1 -0
  3. package/dist/_chunks/{codemods-SNk0-R2U.js → codemods-VIOYreYU.js} +4 -4
  4. package/dist/_chunks/{codemods-SNk0-R2U.js.map → codemods-VIOYreYU.js.map} +1 -1
  5. package/dist/_chunks/{index-jxp8ewxV.js → index-_Qwh0DXj.js} +5 -5
  6. package/dist/_chunks/{index-jxp8ewxV.js.map → index-_Qwh0DXj.js.map} +1 -1
  7. package/dist/_chunks/{upgrade-cGHdihLS.js → upgrade-BmHEuMjJ.js} +10 -3
  8. package/dist/_chunks/upgrade-BmHEuMjJ.js.map +1 -0
  9. package/dist/cli.js +1 -1
  10. package/dist/index.js +112 -19
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +112 -19
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/modules/codemod-repository/repository.d.ts +1 -0
  15. package/dist/modules/codemod-repository/repository.d.ts.map +1 -1
  16. package/dist/modules/codemod-runner/codemod-runner.d.ts +3 -3
  17. package/dist/modules/codemod-runner/codemod-runner.d.ts.map +1 -1
  18. package/dist/modules/project/constants.d.ts +2 -0
  19. package/dist/modules/project/constants.d.ts.map +1 -1
  20. package/dist/modules/project/index.d.ts +2 -0
  21. package/dist/modules/project/index.d.ts.map +1 -1
  22. package/dist/modules/project/project.d.ts +12 -4
  23. package/dist/modules/project/project.d.ts.map +1 -1
  24. package/dist/modules/project/types.d.ts +0 -11
  25. package/dist/modules/project/types.d.ts.map +1 -1
  26. package/dist/modules/project/utils.d.ts +6 -0
  27. package/dist/modules/project/utils.d.ts.map +1 -0
  28. package/dist/modules/requirement/types.d.ts +2 -2
  29. package/dist/modules/requirement/types.d.ts.map +1 -1
  30. package/dist/modules/upgrader/upgrader.d.ts +3 -3
  31. package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
  32. package/dist/tasks/codemods/codemods.d.ts.map +1 -1
  33. package/dist/tasks/upgrade/upgrade.d.ts.map +1 -1
  34. package/package.json +6 -6
  35. package/resources/codemods/5.0.0/dependency-remove-strapi-plugin-i18n.json.ts +31 -0
  36. package/resources/codemods/5.0.0/dependency-upgrade-react-router-dom.json.ts +59 -0
  37. package/resources/codemods/5.0.0/s3-keys-wrapped-in-credentials.code.ts +1 -1
  38. package/resources/codemods/5.0.0/sqlite3-to-better-sqlite3.json.ts +5 -2
  39. package/resources/codemods/5.0.0/use-uid-for-config-namespace.code.ts +1 -1
  40. package/resources/examples/console.log-to-console.info.code.ts +1 -1
  41. package/resources/examples/disable-jsx-buttons.code.ts +42 -0
  42. package/dist/_chunks/codemod-runner-CrDQxTWE.js.map +0 -1
  43. package/dist/_chunks/upgrade-cGHdihLS.js.map +0 -1
@@ -12,6 +12,7 @@ export declare class CodemodRepository implements CodemodRepositoryInterface {
12
12
  exists(version: Version.SemVer): boolean;
13
13
  findByRange(range: Version.Range): Codemod.VersionedCollection[];
14
14
  findByVersion(version: Version.SemVer): Codemod.Codemod[];
15
+ findAll(): Codemod.VersionedCollection[];
15
16
  private refreshAvailableVersions;
16
17
  private refreshAvailableFiles;
17
18
  private refreshAvailableFilesForVersion;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/modules/codemod-repository/repository.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,iBAAiB,IAAI,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE/E,qBAAa,iBAAkB,YAAW,0BAA0B;IAClE,OAAO,CAAC,MAAM,CAAmD;IAEjE,OAAO,CAAC,QAAQ,CAAmB;IAE5B,GAAG,EAAE,MAAM,CAAC;gBAEP,GAAG,EAAE,MAAM;IASvB,OAAO;IAOP,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;IAI7B,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;IAI/B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;IAI9B,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;IAWhC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;IAOrC,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,+BAA+B;CAsBxC;AAED,eAAO,MAAM,4BAA4B,aAAc,MAAM,KAAG,QAAQ,IAOvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,MAAM,sBAA+B,CAAC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/modules/codemod-repository/repository.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,iBAAiB,IAAI,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE/E,qBAAa,iBAAkB,YAAW,0BAA0B;IAClE,OAAO,CAAC,MAAM,CAAmD;IAEjE,OAAO,CAAC,QAAQ,CAAmB;IAE5B,GAAG,EAAE,MAAM,CAAC;gBAEP,GAAG,EAAE,MAAM;IASvB,OAAO;IAOP,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;IAI7B,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;IAI/B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;IAI9B,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;IAWhC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;IAOrC,OAAO;IASP,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,+BAA+B;CAsBxC;AAED,eAAO,MAAM,4BAA4B,aAAc,MAAM,KAAG,QAAQ,IAOvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,MAAM,sBAA+B,CAAC"}
@@ -4,16 +4,16 @@ import type { CodemodRunnerInterface, CodemodRunnerReport, SelectCodemodsCallbac
4
4
  import type { Version } from '../version';
5
5
  export declare class CodemodRunner implements CodemodRunnerInterface {
6
6
  private readonly project;
7
- private range;
7
+ private range?;
8
8
  private isDry;
9
9
  private logger;
10
10
  private selectCodemodsCallback;
11
- constructor(project: Project, range: Version.Range);
11
+ constructor(project: Project, range?: Version.Range);
12
12
  setRange(range: Version.Range): this;
13
13
  setLogger(logger: Logger): this;
14
14
  onSelectCodemods(callback: SelectCodemodsCallback | null): this;
15
15
  dry(enabled?: boolean): this;
16
16
  run(codemodsDirectory?: string): Promise<CodemodRunnerReport>;
17
17
  }
18
- export declare const codemodRunnerFactory: (project: Project, range: Version.Range) => CodemodRunner;
18
+ export declare const codemodRunnerFactory: (project: Project, range?: Version.Range) => CodemodRunner;
19
19
  //# sourceMappingURL=codemod-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codemod-runner.d.ts","sourceRoot":"","sources":["../../../src/modules/codemod-runner/codemod-runner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,KAAK,CAAgB;IAE7B,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,sBAAsB,CAAgC;gBAElD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK;IAUlD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;IAK7B,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKxD,GAAG,CAAC,OAAO,GAAE,OAAc;IAKrB,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA2CpE;AAED,eAAO,MAAM,oBAAoB,YAAa,OAAO,SAAS,aAAa,kBAE1E,CAAC"}
1
+ {"version":3,"file":"codemod-runner.d.ts","sourceRoot":"","sources":["../../../src/modules/codemod-runner/codemod-runner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,KAAK,CAAC,CAAgB;IAE9B,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,sBAAsB,CAAgC;gBAElD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK;IAUnD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;IAK7B,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKxD,GAAG,CAAC,OAAO,GAAE,OAAc;IAKrB,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAoDpE;AAED,eAAO,MAAM,oBAAoB,YAAa,OAAO,UAAU,aAAa,kBAE3E,CAAC"}
@@ -1,5 +1,7 @@
1
1
  export declare const PROJECT_PACKAGE_JSON = "package.json";
2
2
  export declare const PROJECT_DEFAULT_ALLOWED_ROOT_PATHS: string[];
3
+ export declare const PROJECT_DEFAULT_CODE_EXTENSIONS: string[];
4
+ export declare const PROJECT_DEFAULT_JSON_EXTENSIONS: string[];
3
5
  export declare const PROJECT_DEFAULT_ALLOWED_EXTENSIONS: string[];
4
6
  export declare const PROJECT_DEFAULT_PATTERNS: string[];
5
7
  export declare const SCOPED_STRAPI_PACKAGE_PREFIX = "@strapi/";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/modules/project/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD,eAAO,MAAM,kCAAkC,UAA8B,CAAC;AAE9E,eAAO,MAAM,kCAAkC,UAAuB,CAAC;AAEvE,eAAO,MAAM,wBAAwB,UAAmB,CAAC;AAEzD,eAAO,MAAM,4BAA4B,aAAa,CAAC;AAEvD,eAAO,MAAM,sBAAsB,mBAA0C,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/modules/project/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD,eAAO,MAAM,kCAAkC,UAA8B,CAAC;AAE9E,eAAO,MAAM,+BAA+B,UAQ3C,CAAC;AAEF,eAAO,MAAM,+BAA+B,UAAW,CAAC;AAExD,eAAO,MAAM,kCAAkC,UAG9C,CAAC;AAEF,eAAO,MAAM,wBAAwB,UAAmB,CAAC;AAEzD,eAAO,MAAM,4BAA4B,aAAa,CAAC;AAEvD,eAAO,MAAM,sBAAsB,mBAA0C,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export type * from './types';
2
+ export type { Project, AppProject, PluginProject } from './project';
2
3
  export { projectFactory } from './project';
3
4
  export * as constants from './constants';
5
+ export * from './utils';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/project/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/project/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,cAAc,SAAS,CAAC"}
@@ -1,13 +1,12 @@
1
1
  import type { Version } from '../version';
2
2
  import type { Codemod } from '../codemod';
3
3
  import type { Report } from '../report';
4
- import type { Project as ProjectInterface, FileExtension, MinimalPackageJSON, RunCodemodsOptions } from './types';
5
- export declare class Project implements ProjectInterface {
4
+ import type { FileExtension, MinimalPackageJSON, RunCodemodsOptions } from './types';
5
+ export declare class Project {
6
6
  cwd: string;
7
7
  files: string[];
8
8
  packageJSONPath: string;
9
9
  packageJSON: MinimalPackageJSON;
10
- strapiVersion: Version.SemVer;
11
10
  constructor(cwd: string);
12
11
  getFilesByExtensions(extensions: FileExtension[]): string[];
13
12
  refresh(): this;
@@ -15,9 +14,18 @@ export declare class Project implements ProjectInterface {
15
14
  private createProjectCodemodsRunners;
16
15
  private refreshPackageJSON;
17
16
  private refreshProjectFiles;
17
+ }
18
+ export declare class AppProject extends Project {
19
+ strapiVersion: Version.SemVer;
20
+ readonly type: "app";
21
+ constructor(cwd: string);
22
+ refresh(): this;
18
23
  private refreshStrapiVersion;
19
24
  private findStrapiVersionFromProjectPackageJSON;
20
25
  private findLocallyInstalledStrapiVersion;
21
26
  }
22
- export declare const projectFactory: (cwd: string) => Project;
27
+ export declare class PluginProject extends Project {
28
+ readonly type: "plugin";
29
+ }
30
+ export declare const projectFactory: (cwd: string) => AppProject | PluginProject;
23
31
  //# sourceMappingURL=project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/modules/project/project.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EACV,OAAO,IAAI,gBAAgB,EAC3B,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,qBAAa,OAAQ,YAAW,gBAAgB;IACvC,GAAG,EAAE,MAAM,CAAC;IAIZ,KAAK,EAAG,MAAM,EAAE,CAAC;IAEjB,eAAe,EAAG,MAAM,CAAC;IAEzB,WAAW,EAAG,kBAAkB,CAAC;IAEjC,aAAa,EAAG,OAAO,CAAC,MAAM,CAAC;gBAE1B,GAAG,EAAE,MAAM;IAUvB,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE;IAQhD,OAAO;IAQD,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,kBAAkB;IAgBrE,OAAO,CAAC,4BAA4B;IAmBpC,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,uCAAuC;IAgB/C,OAAO,CAAC,iCAAiC;CA2B1C;AAWD,eAAO,MAAM,cAAc,QAAS,MAAM,YAAqB,CAAC"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/modules/project/project.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,OAAO;IACX,GAAG,EAAE,MAAM,CAAC;IAIZ,KAAK,EAAG,MAAM,EAAE,CAAC;IAEjB,eAAe,EAAG,MAAM,CAAC;IAEzB,WAAW,EAAG,kBAAkB,CAAC;gBAE5B,GAAG,EAAE,MAAM;IAUvB,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE;IAQhD,OAAO;IAOD,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,kBAAkB;IAgBrE,OAAO,CAAC,4BAA4B;IA2BpC,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,mBAAmB;CAgB5B;AAED,qBAAa,UAAW,SAAQ,OAAO;IAC9B,aAAa,EAAG,OAAO,CAAC,MAAM,CAAC;IAEtC,QAAQ,CAAC,IAAI,QAAkB;gBAEnB,GAAG,EAAE,MAAM;IAKvB,OAAO;IAMP,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,uCAAuC;IAgB/C,OAAO,CAAC,iCAAiC;CA2B1C;AAWD,qBAAa,aAAc,SAAQ,OAAO;IACxC,QAAQ,CAAC,IAAI,WAAqB;CACnC;AAmBD,eAAO,MAAM,cAAc,QAAS,MAAM,+BAQzC,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import type { Utils } from '@strapi/types';
2
- import type { Version } from '../version';
3
2
  import type { Codemod } from '../codemod';
4
3
  import type { Report } from '../report';
5
4
  export type FileExtension = `.${string}`;
@@ -13,14 +12,4 @@ export type MinimalPackageJSON = {
13
12
  version: string;
14
13
  dependencies?: Record<string, string>;
15
14
  } & Utils.JSONObject;
16
- export interface Project {
17
- cwd: string;
18
- files: string[];
19
- packageJSONPath: string;
20
- packageJSON: MinimalPackageJSON;
21
- strapiVersion: Version.SemVer;
22
- getFilesByExtensions(extensions: FileExtension[]): string[];
23
- runCodemods(codemods: Codemod.List, options: RunCodemodsOptions): Promise<Report.CodemodReport[]>;
24
- refresh(): this;
25
- }
26
15
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/project/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,aAAa,GAAG,IAAI,MAAM,EAAE,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,qBAAqB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtF,sBAAsB,CAAC,CACrB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,GAAG,KAAK,CAAC,UAAU,CAAC;AAErB,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,kBAAkB,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;IAE9B,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;IAC5D,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAElG,OAAO,IAAI,IAAI,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/project/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,aAAa,GAAG,IAAI,MAAM,EAAE,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,qBAAqB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtF,sBAAsB,CAAC,CACrB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,GAAG,KAAK,CAAC,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { AppProject, PluginProject } from './project';
2
+ export declare const isPluginProject: (project: unknown) => project is PluginProject;
3
+ export declare function assertPluginProject(project: unknown): asserts project is PluginProject;
4
+ export declare const isAppProject: (project: unknown) => project is AppProject;
5
+ export declare function assertAppProject(project: unknown): asserts project is AppProject;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/modules/project/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEtD,eAAO,MAAM,eAAe,YAAa,OAAO,6BAE/C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,aAAa,CAItF;AAED,eAAO,MAAM,YAAY,YAAa,OAAO,0BAE5C,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAIhF"}
@@ -1,4 +1,4 @@
1
- import type { Project } from '../project';
1
+ import type { AppProject } from '../project';
2
2
  import type { MaybePromise } from '../../types';
3
3
  import type { Version } from '../version';
4
4
  import type { NPMPackageVersion } from '../npm/types';
@@ -23,7 +23,7 @@ export interface Requirement {
23
23
  export interface TestContext {
24
24
  target: Version.SemVer;
25
25
  npmVersionsMatches: NPMPackageVersion[];
26
- project: Project;
26
+ project: AppProject;
27
27
  }
28
28
  export type RequirementTestCallback = (context: TestContext) => MaybePromise<void>;
29
29
  export interface RequirementInformation {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/requirement/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC7C,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAEnC,UAAU,IAAI,WAAW,CAAC;IAC1B,UAAU,IAAI,WAAW,CAAC;IAE1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;IACvB,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,WAAW,EAAE,sBAAsB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC,WAAW,EAAE,sBAAsB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAE5B,EAAE,CAAC,UAAU,SAAS,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAElG,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;CAClC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/requirement/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC7C,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAEnC,UAAU,IAAI,WAAW,CAAC;IAC1B,UAAU,IAAI,WAAW,CAAC;IAE1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;IACvB,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,OAAO,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,WAAW,EAAE,sBAAsB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC,WAAW,EAAE,sBAAsB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAE5B,EAAE,CAAC,UAAU,SAAS,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAElG,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;CAClC"}
@@ -3,7 +3,7 @@ import type { Version } from '../version';
3
3
  import type { Logger } from '../logger';
4
4
  import type { Requirement } from '../requirement';
5
5
  import type { NPM } from '../npm';
6
- import type { Project } from '../project';
6
+ import type { AppProject } from '../project';
7
7
  import type { ConfirmationCallback } from '../common/types';
8
8
  export declare class Upgrader implements UpgraderInterface {
9
9
  private readonly project;
@@ -14,7 +14,7 @@ export declare class Upgrader implements UpgraderInterface {
14
14
  private logger;
15
15
  private requirements;
16
16
  private confirmationCallback;
17
- constructor(project: Project, target: Version.SemVer, npmPackage: NPM.Package);
17
+ constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package);
18
18
  setRequirements(requirements: Requirement.Requirement[]): this;
19
19
  setTarget(target: Version.SemVer): this;
20
20
  syncCodemodsTarget(): this;
@@ -32,5 +32,5 @@ export declare class Upgrader implements UpgraderInterface {
32
32
  private installDependencies;
33
33
  private runCodemods;
34
34
  }
35
- export declare const upgraderFactory: (project: Project, target: Version.ReleaseType | Version.SemVer, npmPackage: NPM.Package) => Upgrader;
35
+ export declare const upgraderFactory: (project: AppProject, target: Version.ReleaseType | Version.SemVer, npmPackage: NPM.Package) => Upgrader;
36
36
  //# sourceMappingURL=upgrader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrader.d.ts","sourceRoot":"","sources":["../../../src/modules/upgrader/upgrader.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,IAAI,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,qBAAa,QAAS,YAAW,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IAEzC,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,YAAY,CAA4B;IAEhD,OAAO,CAAC,oBAAoB,CAA8B;gBAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO;IAe7E,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE;IAKvD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAKhC,kBAAkB;IAqBlB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAU7C,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAK/C,GAAG,CAAC,OAAO,GAAE,OAAc;IAK3B,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW;IAW7C,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;YA2CzB,iBAAiB;YAejB,uBAAuB;YAWvB,mBAAmB;YAyBnB,kBAAkB;IA6BhC,OAAO,CAAC,2BAA2B;YAkBrB,mBAAmB;YAkBnB,WAAW;CAQ1B;AA6BD,eAAO,MAAM,eAAe,YACjB,OAAO,UACR,QAAQ,WAAW,GAAG,QAAQ,MAAM,cAChC,IAAI,OAAO,aAcxB,CAAC"}
1
+ {"version":3,"file":"upgrader.d.ts","sourceRoot":"","sources":["../../../src/modules/upgrader/upgrader.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,IAAI,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,qBAAa,QAAS,YAAW,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IAEzC,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,YAAY,CAA4B;IAEhD,OAAO,CAAC,oBAAoB,CAA8B;gBAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO;IAehF,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE;IAKvD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAKhC,kBAAkB;IAqBlB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAU7C,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAK/C,GAAG,CAAC,OAAO,GAAE,OAAc;IAK3B,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW;IAW7C,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;YAgDzB,iBAAiB;YAejB,uBAAuB;YAWvB,mBAAmB;YAyBnB,kBAAkB;IA6BhC,OAAO,CAAC,2BAA2B;YAkBrB,mBAAmB;YAkBnB,WAAW;CAQ1B;AA6BD,eAAO,MAAM,eAAe,YACjB,UAAU,UACX,QAAQ,WAAW,GAAG,QAAQ,MAAM,cAChC,IAAI,OAAO,aAcxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codemods.d.ts","sourceRoot":"","sources":["../../../src/tasks/codemods/codemods.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD,eAAO,MAAM,QAAQ,YAAmB,kBAAkB,kBAuBzD,CAAC"}
1
+ {"version":3,"file":"codemods.d.ts","sourceRoot":"","sources":["../../../src/tasks/codemods/codemods.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,eAAO,MAAM,QAAQ,YAAmB,kBAAkB,kBA0BzD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/tasks/upgrade/upgrade.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,eAAO,MAAM,OAAO,YAAmB,cAAc,kBA6CpD,CAAC"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/tasks/upgrade/upgrade.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,eAAO,MAAM,OAAO,YAAmB,cAAc,kBAmDpD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/upgrade",
3
- "version": "5.0.0-alpha.5",
3
+ "version": "5.0.0-alpha.8",
4
4
  "description": "CLI to upgrade Strapi applications effortless",
5
5
  "keywords": [
6
6
  "strapi",
@@ -59,7 +59,7 @@
59
59
  "watch": "pack-up watch"
60
60
  },
61
61
  "dependencies": {
62
- "@strapi/utils": "5.0.0-alpha.5",
62
+ "@strapi/utils": "5.0.0-alpha.8",
63
63
  "chalk": "4.1.2",
64
64
  "cli-table3": "0.6.2",
65
65
  "commander": "8.3.0",
@@ -75,15 +75,15 @@
75
75
  "simple-git": "3.21.0"
76
76
  },
77
77
  "devDependencies": {
78
- "@strapi/pack-up": "5.0.0-alpha.5",
79
- "@strapi/types": "5.0.0-alpha.5",
78
+ "@strapi/pack-up": "5.0.0-alpha.8",
79
+ "@strapi/types": "5.0.0-alpha.8",
80
80
  "@types/jscodeshift": "0.11.10",
81
- "eslint-config-custom": "5.0.0-alpha.5",
81
+ "eslint-config-custom": "5.0.0-alpha.8",
82
82
  "rimraf": "3.0.2"
83
83
  },
84
84
  "engines": {
85
85
  "node": ">=18.0.0 <=20.x.x",
86
86
  "npm": ">=6.0.0"
87
87
  },
88
- "gitHead": "894c8f40f330ee96f282b3fe1d2c68c24006ac62"
88
+ "gitHead": "ac4bbf6602523215c40548a8a09079076b3dadda"
89
89
  }
@@ -0,0 +1,31 @@
1
+ import path from 'node:path';
2
+
3
+ import type { modules } from '../../../dist';
4
+
5
+ const STRAPI_I18N_DEP_NAME = '@strapi/plugin-i18n';
6
+ const STRAPI_I18N_DEP_PATH = `dependencies.${STRAPI_I18N_DEP_NAME}`;
7
+
8
+ /**
9
+ * Specifically targets the root package.json and removes the @strapi/plugin-i18n dependency.
10
+ *
11
+ * Why? The i18n plugin is now a hard dependency of @strapi/strapi and isn't needed in the package.json anymore.
12
+ */
13
+ const transform: modules.runner.json.JSONTransform = (file, params) => {
14
+ const { cwd, json } = params;
15
+
16
+ const rootPackageJsonPath = path.join(cwd, 'package.json');
17
+
18
+ if (file.path !== rootPackageJsonPath) {
19
+ return file.json;
20
+ }
21
+
22
+ const j = json(file.json);
23
+
24
+ if (j.has(STRAPI_I18N_DEP_PATH)) {
25
+ j.remove(STRAPI_I18N_DEP_PATH);
26
+ }
27
+
28
+ return j.root();
29
+ };
30
+
31
+ export default transform;
@@ -0,0 +1,59 @@
1
+ import path from 'node:path';
2
+ import semver from 'semver';
3
+
4
+ import type { modules } from '../../../dist';
5
+
6
+ const REACT_ROUTER_DEP_NAME = 'react-router-dom';
7
+ const REACT_ROUTER_DEP_PATH = `dependencies.${REACT_ROUTER_DEP_NAME}`;
8
+
9
+ const DEP_NEW_VERSION_RANGE = '^6.0.0';
10
+
11
+ /**
12
+ * Specifically targets the root package.json and updates the react-router-dom dependency version.
13
+ *
14
+ * We first check if the react-router-dom dependency is listed in the package.json. If the dependency is
15
+ * found, we verify its version.
16
+ *
17
+ * If the detected version does not satisfy the new version range, we replace it with the new one.
18
+ *
19
+ * Conversely, if no react-router-dom dependency is listed, we add it with the new version range.
20
+ */
21
+ const transform: modules.runner.json.JSONTransform = (file, params) => {
22
+ const { cwd, json } = params;
23
+
24
+ const rootPackageJsonPath = path.join(cwd, 'package.json');
25
+
26
+ if (file.path !== rootPackageJsonPath) {
27
+ return file.json;
28
+ }
29
+
30
+ const j = json(file.json);
31
+
32
+ if (j.has(REACT_ROUTER_DEP_PATH)) {
33
+ const currentVersion = j.get(REACT_ROUTER_DEP_PATH);
34
+
35
+ // If the current version is not a string, then something is wrong, abort
36
+ if (typeof currentVersion !== 'string') {
37
+ return j.root();
38
+ }
39
+
40
+ const currentSatisfiesNew = semver.satisfies(currentVersion, DEP_NEW_VERSION_RANGE);
41
+
42
+ // if the current version satisfies the new range, keep it as is and abort
43
+ if (currentSatisfiesNew) {
44
+ return j.root();
45
+ }
46
+
47
+ // else, update the version with the new one
48
+ j.set(REACT_ROUTER_DEP_PATH, DEP_NEW_VERSION_RANGE);
49
+ }
50
+
51
+ // If the dependency is not listed yet, add it
52
+ else {
53
+ j.set(REACT_ROUTER_DEP_PATH, DEP_NEW_VERSION_RANGE);
54
+ }
55
+
56
+ return j.root();
57
+ };
58
+
59
+ export default transform;
@@ -59,7 +59,7 @@ const transform: Transform = (file, api) => {
59
59
  }
60
60
 
61
61
  const { j } = api;
62
- const root = j(file.source);
62
+ const root = j.withParser('tsx')(file.source);
63
63
 
64
64
  root
65
65
  .find(j.ArrowFunctionExpression)
@@ -17,18 +17,21 @@ const transform: modules.runner.json.JSONTransform = (file, params) => {
17
17
 
18
18
  const j = json(file.json);
19
19
 
20
+ let removed = false;
21
+
20
22
  const targetProperties = ['sqlite3', '@vscode/sqlite3'];
21
23
 
22
24
  targetProperties.forEach((targetProperty) => {
23
25
  const oldSqliteDependency = `dependencies.${targetProperty}`;
24
26
  if (j.has(oldSqliteDependency)) {
25
27
  j.remove(oldSqliteDependency);
28
+ removed = true;
26
29
  }
27
30
  });
28
31
 
29
- if (!j.has('dependencies.better-sqlite3')) {
32
+ if (removed && !j.has('dependencies.better-sqlite3')) {
30
33
  // TODO check this version when releasing V5
31
- j.set('dependencies.better-sqlite3', '9.0.0');
34
+ j.set('dependencies.better-sqlite3', '9.4.3');
32
35
  }
33
36
 
34
37
  return j.root();
@@ -7,7 +7,7 @@ import { Transform } from 'jscodeshift';
7
7
  */
8
8
  const transform: Transform = (file, api) => {
9
9
  const j = api.jscodeshift;
10
- const root = j(file.source);
10
+ const root = j.withParser('tsx')(file.source);
11
11
 
12
12
  const ignoreList = ['api.rest', 'api.responses'];
13
13
 
@@ -8,7 +8,7 @@ const transform: Transform = (file, api) => {
8
8
  // Extract the jscodeshift API
9
9
  const { j } = api;
10
10
  // Parse the file content
11
- const root = j(file.source);
11
+ const root = j.withParser('tsx')(file.source);
12
12
 
13
13
  root
14
14
  // Find console.log calls expressions
@@ -0,0 +1,42 @@
1
+ import type { Transform } from 'jscodeshift';
2
+ import { relative } from 'node:path';
3
+
4
+ const transform: Transform = (file, api) => {
5
+ const j = api.jscodeshift;
6
+ const root = j.withParser('JSX')(file.source);
7
+
8
+ const isReactFile = file.path.endsWith('.jsx') || file.path.endsWith('.tsx');
9
+
10
+ if (!isReactFile) {
11
+ return root.toSource();
12
+ }
13
+
14
+ const fileName = relative(process.cwd(), file.path);
15
+
16
+ console.log(`Found React file: ${fileName}`);
17
+
18
+ const buttons = root.findJSXElements('Button');
19
+
20
+ console.log(`Found ${buttons.length} buttons in ${fileName}`);
21
+
22
+ buttons.forEach((button) => {
23
+ const { openingElement } = button.node;
24
+ const isDisabled = openingElement.attributes.some(
25
+ (attribute) => j.JSXAttribute.check(attribute) && attribute.name.name === 'disabled'
26
+ );
27
+
28
+ console.log(`Is disabled? ${isDisabled}`);
29
+
30
+ if (!isDisabled) {
31
+ openingElement.attributes.push(
32
+ j.jsxAttribute(j.jsxIdentifier('disabled'), j.jsxExpressionContainer(j.literal(true)))
33
+ );
34
+
35
+ console.log('Added the disabled attribute');
36
+ }
37
+ });
38
+
39
+ return root.toSource();
40
+ };
41
+
42
+ export default transform;
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemod-runner-CrDQxTWE.js","sources":["../../src/modules/version/range.ts","../../src/modules/logger/logger.ts","../../src/cli/errors.ts","../../src/modules/requirement/requirement.ts","../../src/tasks/upgrade/requirements/common.ts","../../src/modules/timer/timer.ts","../../src/modules/timer/constants.ts","../../src/modules/json/transform-api.ts","../../src/modules/json/file.ts","../../src/modules/file-scanner/scanner.ts","../../src/modules/runner/runner.ts","../../src/modules/runner/code/code.ts","../../src/modules/runner/json/transform.ts","../../src/modules/runner/json/json.ts","../../src/modules/project/constants.ts","../../src/modules/project/project.ts","../../src/modules/error/utils.ts","../../src/modules/format/formats.ts","../../src/modules/codemod/constants.ts","../../src/modules/codemod/codemod.ts","../../src/modules/codemod-repository/repository.ts","../../src/modules/codemod-repository/constants.ts","../../src/modules/codemod-runner/codemod-runner.ts"],"sourcesContent":["import semver from 'semver';\n\nimport * as Version from './types';\nimport { isSemverInstance, isSemVerReleaseType } from './semver';\n\nexport const rangeFactory = (range: string): Version.Range => {\n return new semver.Range(range);\n};\n\nexport const rangeFromReleaseType = (current: Version.SemVer, identifier: Version.ReleaseType) => {\n switch (identifier) {\n case Version.ReleaseType.Major: {\n // semver.inc(_, 'major') will target <major + 1>.0.0 which is what we want\n // e.g. for 4.15.4, it'll return 5.0.0\n const nextMajor = semver.inc(current, 'major') as Version.LiteralSemVer;\n return rangeFactory(`>${current.raw} <=${nextMajor}`);\n }\n case Version.ReleaseType.Patch: {\n // This will return the minor for the next minor\n // e.g. for 4.15.4, it'll return 4.16.0\n const minor = semver.inc(current, 'minor') as Version.LiteralSemVer;\n return rangeFactory(`>${current.raw} <${minor}`);\n }\n case Version.ReleaseType.Minor: {\n // This will return the major for the next major\n // e.g. for 4.15.4, it'll return 5.0.0\n const major = semver.inc(current, 'major') as Version.LiteralSemVer;\n return rangeFactory(`>${current.raw} <${major}`);\n }\n default: {\n throw new Error('Not implemented');\n }\n }\n};\n\nexport const rangeFromVersions = (\n currentVersion: Version.SemVer,\n target: Version.ReleaseType | Version.SemVer\n) => {\n if (isSemverInstance(target)) {\n return rangeFactory(`>${currentVersion.raw} <=${target.raw}`);\n }\n\n if (isSemVerReleaseType(target)) {\n return rangeFromReleaseType(currentVersion, target);\n }\n\n throw new Error(`Invalid target set: ${target}`); // TODO: better errors\n};\n","import chalk from 'chalk';\n\nimport type { Logger as LoggerInterface, LoggerOptions } from './types';\n\nexport class Logger implements LoggerInterface {\n isDebug: boolean;\n\n isSilent: boolean;\n\n private nbErrorsCalls: number;\n\n private nbWarningsCalls: number;\n\n constructor(options: LoggerOptions = {}) {\n // Set verbosity options\n this.isDebug = options.debug ?? false;\n this.isSilent = options.silent ?? false;\n\n // Initialize counters\n this.nbErrorsCalls = 0;\n this.nbWarningsCalls = 0;\n }\n\n private get isNotSilent(): boolean {\n return !this.isSilent;\n }\n\n get errors(): number {\n return this.nbErrorsCalls;\n }\n\n get warnings(): number {\n return this.nbWarningsCalls;\n }\n\n get stdout(): (NodeJS.WriteStream & { fd: 1 }) | undefined {\n return this.isSilent ? undefined : process.stdout;\n }\n\n get stderr(): (NodeJS.WriteStream & { fd: 2 }) | undefined {\n return this.isSilent ? undefined : process.stderr;\n }\n\n setDebug(debug: boolean): this {\n this.isDebug = debug;\n return this;\n }\n\n setSilent(silent: boolean): this {\n this.isSilent = silent;\n return this;\n }\n\n debug(...args: unknown[]): this {\n const isDebugEnabled = this.isNotSilent && this.isDebug;\n\n if (isDebugEnabled) {\n console.log(chalk.cyan(`[DEBUG]\\t[${nowAsISO()}]`), ...args);\n }\n\n return this;\n }\n\n error(...args: unknown[]): this {\n this.nbErrorsCalls += 1;\n\n if (this.isNotSilent) {\n console.error(chalk.red(`[ERROR]\\t[${nowAsISO()}]`), ...args);\n }\n\n return this;\n }\n\n info(...args: unknown[]): this {\n if (this.isNotSilent) {\n console.info(chalk.blue(`[INFO]\\t[${new Date().toISOString()}]`), ...args);\n }\n\n return this;\n }\n\n raw(...args: unknown[]): this {\n if (this.isNotSilent) {\n console.log(...args);\n }\n\n return this;\n }\n\n warn(...args: unknown[]): this {\n this.nbWarningsCalls += 1;\n\n if (this.isNotSilent) {\n console.warn(chalk.yellow(`[WARN]\\t[${new Date().toISOString()}]`), ...args);\n }\n\n return this;\n }\n}\n\nconst nowAsISO = () => new Date().toISOString();\n\nexport const loggerFactory = (options: LoggerOptions = {}) => new Logger(options);\n","import chalk from 'chalk';\n\nexport const handleError = (err: unknown, isSilent: boolean) => {\n if (!isSilent) {\n console.error(\n chalk.red(`[ERROR]\\t[${new Date().toISOString()}]`),\n err instanceof Error ? err.message : err\n );\n }\n\n process.exit(1);\n};\n","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","import simpleGit from 'simple-git';\n\nimport { requirementFactory } from '../../../modules/requirement';\n\nexport const REQUIRE_GIT_CLEAN_REPOSITORY = requirementFactory(\n 'REQUIRE_GIT_CLEAN_REPOSITORY',\n async (context) => {\n const git = simpleGit({ baseDir: context.project.cwd });\n\n const status = await git.status();\n\n if (!status.isClean()) {\n throw new Error(\n 'Repository is not clean. Please commit or stash any changes before upgrading'\n );\n }\n }\n);\n\nexport const REQUIRE_GIT_REPOSITORY = requirementFactory(\n 'REQUIRE_GIT_REPOSITORY',\n async (context) => {\n const git = simpleGit({ baseDir: context.project.cwd });\n\n const isRepo = await git.checkIsRepo();\n\n if (!isRepo) {\n throw new Error('Not a git repository (or any of the parent directories)');\n }\n }\n).addChild(REQUIRE_GIT_CLEAN_REPOSITORY.asOptional());\n\nexport const REQUIRE_GIT_INSTALLED = requirementFactory(\n 'REQUIRE_GIT_INSTALLED',\n async (context) => {\n const git = simpleGit({ baseDir: context.project.cwd });\n\n try {\n await git.version();\n } catch {\n throw new Error('Git is not installed');\n }\n }\n).addChild(REQUIRE_GIT_REPOSITORY.asOptional());\n\nexport const REQUIRE_GIT = requirementFactory('REQUIRE_GIT', null).addChild(\n REQUIRE_GIT_INSTALLED.asOptional()\n);\n","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","export const ONE_SECOND_MS = 1000;\n","import { cloneDeep, get, has, set, merge, omit } from 'lodash/fp';\n\nimport type { Utils } from '@strapi/types';\n\nimport type { JSONTransformAPI as JSONTransformAPIInterface } from './types';\n\nexport class JSONTransformAPI implements JSONTransformAPIInterface {\n private json: Utils.JSONObject;\n\n constructor(json: Utils.JSONObject) {\n this.json = cloneDeep(json);\n }\n\n get<T extends Utils.JSONValue>(path: string): T | undefined;\n get<T extends Utils.JSONValue>(path: string, defaultValue: T): T;\n get<T extends Utils.JSONValue>(path?: string, defaultValue?: T) {\n if (!path) {\n return this.root() as T;\n }\n\n return cloneDeep(get(path, this.json) ?? defaultValue) as T;\n }\n\n has(path: string) {\n return has(path, this.json);\n }\n\n merge(other: Utils.JSONObject) {\n this.json = merge(other, this.json);\n\n return this;\n }\n\n root(): Utils.JSONObject {\n return cloneDeep(this.json);\n }\n\n set(path: string, value: Utils.JSONValue) {\n this.json = set(path, value, this.json);\n\n return this;\n }\n\n remove(path: string) {\n this.json = omit(path, this.json);\n return this;\n }\n}\n\nexport const createJSONTransformAPI = (object: Utils.JSONObject) => new JSONTransformAPI(object);\n","import fse from 'fs-extra';\n\nimport type { Utils } from '@strapi/types';\n\nexport const readJSON = async (path: string): Promise<Utils.JSONValue> => {\n const buffer = await fse.readFile(path);\n\n return JSON.parse(buffer.toString());\n};\n\nexport const saveJSON = async (path: string, json: Utils.JSONValue): Promise<void> => {\n const jsonAsString = `${JSON.stringify(json, null, 2)}\\n`;\n\n await fse.writeFile(path, jsonAsString);\n};\n","import path from 'node:path';\nimport { glob } from 'glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n const filenames = glob.sync(patterns, { cwd: this.cwd });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n","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","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","/* 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 const esbuildOptions = { extensions: ['.js', '.mjs', '.ts'] };\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","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","export const PROJECT_PACKAGE_JSON = 'package.json';\n\nexport const PROJECT_DEFAULT_ALLOWED_ROOT_PATHS = ['src', 'config', 'public'];\n\nexport const PROJECT_DEFAULT_ALLOWED_EXTENSIONS = ['js', 'ts', 'json'];\n\nexport const PROJECT_DEFAULT_PATTERNS = ['package.json'];\n\nexport const SCOPED_STRAPI_PACKAGE_PREFIX = '@strapi/';\n\nexport const STRAPI_DEPENDENCY_NAME = `${SCOPED_STRAPI_PACKAGE_PREFIX}strapi`;\n","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 Project as ProjectInterface,\n FileExtension,\n MinimalPackageJSON,\n RunCodemodsOptions,\n} from './types';\n\nexport class Project implements ProjectInterface {\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 strapiVersion!: Version.SemVer;\n\n constructor(cwd: string) {\n if (!fse.pathExistsSync(cwd)) {\n throw new Error(`ENOENT: no such file or directory, access '${cwd}'`);\n }\n\n this.cwd = cwd;\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.refreshStrapiVersion();\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 jsonFiles = this.getFilesByExtensions(['.json']);\n const codeFiles = this.getFilesByExtensions(['.js', '.ts', '.mjs']);\n\n const codeRunner = codeRunnerFactory(codeFiles, {\n dry,\n print: false,\n silent: true,\n extensions: 'js,ts',\n runInBand: true,\n verbose: 0,\n babel: true,\n parser: 'ts',\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 allowedRootPaths = formatGlobCollectionPattern(\n constants.PROJECT_DEFAULT_ALLOWED_ROOT_PATHS\n );\n\n const allowedExtensions = formatGlobCollectionPattern(\n constants.PROJECT_DEFAULT_ALLOWED_EXTENSIONS\n );\n\n const projectFilesPattern = `./${allowedRootPaths}/**/*.${allowedExtensions}`;\n\n const patterns = [projectFilesPattern, ...constants.PROJECT_DEFAULT_PATTERNS];\n const scanner = fileScannerFactory(this.cwd);\n\n this.files = scanner.scan(patterns);\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 const projectFactory = (cwd: string) => new Project(cwd);\n","export class UnexpectedError extends Error {\n constructor() {\n super('Unexpected Error');\n }\n}\n\nexport const unknownToError = (e: unknown): Error => {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new Error(e);\n }\n\n return new UnexpectedError();\n};\n","import CliTable3 from 'cli-table3';\nimport chalk from 'chalk';\n\nimport { constants as timerConstants } from '../timer';\n\nimport type { Version } from '../version';\nimport type { Report } from '../report';\n\nexport const path = (path: string) => chalk.blue(path);\n\nexport const version = (version: Version.LiteralVersion | Version.SemVer) => {\n return chalk.italic.yellow(`v${version}`);\n};\n\nexport const versionRange = (range: Version.Range) => chalk.italic.yellow(range);\n\nexport const transform = (transformFilePath: string) => chalk.cyan(transformFilePath);\n\nexport const highlight = (arg: unknown) => chalk.bold.underline(arg);\n\nexport const upgradeStep = (text: string, step: [current: number, total: number]) => {\n return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);\n};\n\nexport const reports = (reports: Report.CodemodReport[]) => {\n const rows = reports.map(({ codemod, report }, i) => {\n const fIndex = chalk.grey(i);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fFormattedTransformPath = chalk.cyan(codemod.format());\n const fTimeElapsed =\n i === 0\n ? `${report.timeElapsed}s ${chalk.dim.italic('(cold start)')}`\n : `${report.timeElapsed}s`;\n const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);\n const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);\n\n return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.cyan('Name'),\n chalk.bold.green('Affected'),\n chalk.bold.red('Unchanged'),\n chalk.bold.blue('Duration'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const durationMs = (elapsedMs: number) => {\n const elapsedSeconds = (elapsedMs / timerConstants.ONE_SECOND_MS).toFixed(3);\n\n return `${elapsedSeconds}s`;\n};\n","export const CODEMOD_CODE_SUFFIX = 'code';\n\nexport const CODEMOD_JSON_SUFFIX = 'json';\n\nexport const CODEMOD_ALLOWED_SUFFIXES = [CODEMOD_CODE_SUFFIX, CODEMOD_JSON_SUFFIX];\n\nexport const CODEMOD_EXTENSION = 'ts';\n\nexport const CODEMOD_FILE_REGEXP = new RegExp(\n `^.+[.](${CODEMOD_ALLOWED_SUFFIXES.join('|')})[.]${CODEMOD_EXTENSION}$`\n);\n","import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, Kind } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n }\n\n format() {\n return this.filename\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}.${constants.CODEMOD_EXTENSION}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}.${constants.CODEMOD_EXTENSION}`, '')\n .replaceAll('-', ' ');\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n","import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { semVerFactory } from '../version';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n countRange(range: Version.Range) {\n return this.findByRange(range).length;\n }\n\n exists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n findByRange(range: Version.Range) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return entries\n .filter(([version]) => range.test(version))\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string) => new CodemodRepository(cwd);\n","import path from 'node:path';\n\nexport const INTERNAL_CODEMODS_DIRECTORY = path.join(\n __dirname,\n '..',\n '..',\n 'resources',\n 'codemods'\n);\n","import {\n codemodRepositoryFactory,\n constants as codemodRepositoryConstants,\n} from '../codemod-repository';\nimport { unknownToError } from '../error';\nimport * as f from '../format';\n\nimport type { Logger } from '../logger';\nimport type { Project } from '../project';\nimport type { UpgradeReport } from '../upgrader';\nimport type { CodemodRunnerInterface, CodemodRunnerReport, SelectCodemodsCallback } from './types';\nimport type { Version } from '../version';\n\nexport class CodemodRunner implements CodemodRunnerInterface {\n private readonly project: Project;\n\n private range: Version.Range;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private selectCodemodsCallback: SelectCodemodsCallback | null;\n\n constructor(project: Project, range: Version.Range) {\n this.project = project;\n this.range = range;\n\n this.isDry = false;\n\n this.logger = null;\n this.selectCodemodsCallback = null;\n }\n\n setRange(range: Version.Range) {\n this.range = range;\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onSelectCodemods(callback: SelectCodemodsCallback | null) {\n this.selectCodemodsCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n async run(codemodsDirectory?: string): Promise<CodemodRunnerReport> {\n const repository = codemodRepositoryFactory(\n codemodsDirectory ?? codemodRepositoryConstants.INTERNAL_CODEMODS_DIRECTORY\n );\n\n // Make sure we have access to the latest snapshots of codemods on the system\n repository.refresh();\n\n const allVersionedCodemods = repository.findByRange(this.range);\n\n // If a selection callback is set, use it, else keep every codemods\n const versionedCodemods = this.selectCodemodsCallback\n ? await this.selectCodemodsCallback(allVersionedCodemods)\n : allVersionedCodemods;\n\n const hasCodemodsToRun = versionedCodemods.length > 0;\n\n if (!hasCodemodsToRun) {\n this.logger?.debug(`Found no codemods to run for ${f.versionRange(this.range)}`);\n return successReport();\n }\n\n this.logger?.debug(\n `Found codemods for ${f.highlight(\n versionedCodemods.length\n )} version(s) using ${f.versionRange(this.range)}`\n );\n versionedCodemods.forEach(({ version, codemods }) =>\n this.logger?.debug(`- ${f.version(version)} (${codemods.length})`)\n );\n\n // Flatten the collection to a single list of codemods, the original list should already be sorted\n const codemods = versionedCodemods.map(({ codemods }) => codemods).flat();\n\n try {\n const reports = await this.project.runCodemods(codemods, { dry: this.isDry });\n this.logger?.raw(f.reports(reports));\n } catch (e: unknown) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n}\n\nexport const codemodRunnerFactory = (project: Project, range: Version.Range) => {\n return new CodemodRunner(project, range);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["semver","Version.ReleaseType","isSemverInstance","isSemVerReleaseType","chalk","simpleGit","cloneDeep","path","get","has","merge","set","omit","fse","glob","jscodeshift","register","module","assert","isEqual","reports","constants.PROJECT_PACKAGE_JSON","constants.PROJECT_DEFAULT_ALLOWED_ROOT_PATHS","constants.PROJECT_DEFAULT_ALLOWED_EXTENSIONS","constants.PROJECT_DEFAULT_PATTERNS","version","constants.STRAPI_DEPENDENCY_NAME","isValidSemVer","isLiteralSemVer","semVerFactory","CliTable3","timerConstants.ONE_SECOND_MS","constants.CODEMOD_CODE_SUFFIX","constants.CODEMOD_EXTENSION","constants.CODEMOD_JSON_SUFFIX","constants.CODEMOD_FILE_REGEXP","constants.CODEMOD_ALLOWED_SUFFIXES","codemodRepositoryConstants.INTERNAL_CODEMODS_DIRECTORY","f.versionRange","f.highlight","codemods","f.version","f.reports"],"mappings":"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"}