@strapi/upgrade 5.48.1 → 5.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +6 -1
- package/dist/cli.js.map +1 -1
- package/dist/modules/codemod/codemod.d.ts.map +1 -1
- package/dist/modules/codemod-repository/repository.d.ts.map +1 -1
- package/dist/modules/codemod-runner/codemod-runner.d.ts.map +1 -1
- package/dist/modules/error/utils.d.ts.map +1 -1
- package/dist/modules/file-scanner/scanner.d.ts.map +1 -1
- package/dist/modules/format/formats.d.ts.map +1 -1
- package/dist/modules/json/file.d.ts.map +1 -1
- package/dist/modules/json/transform-api.d.ts.map +1 -1
- package/dist/modules/logger/logger.d.ts +0 -1
- package/dist/modules/logger/logger.d.ts.map +1 -1
- package/dist/modules/logger/types.d.ts +0 -1
- package/dist/modules/logger/types.d.ts.map +1 -1
- package/dist/modules/npm/package.d.ts.map +1 -1
- package/dist/modules/project/project.d.ts.map +1 -1
- package/dist/modules/project/utils.d.ts.map +1 -1
- package/dist/modules/report/report.d.ts.map +1 -1
- package/dist/modules/requirement/requirement.d.ts.map +1 -1
- package/dist/modules/runner/code/code.d.ts.map +1 -1
- package/dist/modules/runner/json/json.d.ts.map +1 -1
- package/dist/modules/runner/json/transform.d.ts.map +1 -1
- package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
- package/dist/modules/version/range.d.ts.map +1 -1
- package/dist/modules/version/semver.d.ts +1 -1
- package/dist/modules/version/semver.d.ts.map +1 -1
- package/dist/modules/version/types.d.ts +7 -6
- package/dist/modules/version/types.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/codemods.js +6 -2
- package/dist/src/cli/commands/codemods.js.map +1 -1
- package/dist/src/cli/commands/codemods.mjs +2 -2
- package/dist/src/cli/commands/codemods.mjs.map +1 -1
- package/dist/src/cli/commands/upgrade.js +9 -5
- package/dist/src/cli/commands/upgrade.js.map +1 -1
- package/dist/src/cli/commands/upgrade.mjs +5 -5
- package/dist/src/cli/commands/upgrade.mjs.map +1 -1
- package/dist/src/cli/errors.js +5 -1
- package/dist/src/cli/errors.js.map +1 -1
- package/dist/src/modules/codemod/codemod.js +5 -1
- package/dist/src/modules/codemod/codemod.js.map +1 -1
- package/dist/src/modules/codemod-repository/constants.js +5 -1
- package/dist/src/modules/codemod-repository/constants.js.map +1 -1
- package/dist/src/modules/codemod-repository/repository.js +18 -11
- package/dist/src/modules/codemod-repository/repository.js.map +1 -1
- package/dist/src/modules/file-scanner/scanner.js +7 -2
- package/dist/src/modules/file-scanner/scanner.js.map +1 -1
- package/dist/src/modules/format/formats.js +38 -33
- package/dist/src/modules/format/formats.js.map +1 -1
- package/dist/src/modules/json/file.js +6 -2
- package/dist/src/modules/json/file.js.map +1 -1
- package/dist/src/modules/logger/logger.js +8 -4
- package/dist/src/modules/logger/logger.js.map +1 -1
- package/dist/src/modules/npm/package.js +12 -6
- package/dist/src/modules/npm/package.js.map +1 -1
- package/dist/src/modules/project/project.js +19 -12
- package/dist/src/modules/project/project.js.map +1 -1
- package/dist/src/modules/runner/json/transform.js +6 -2
- package/dist/src/modules/runner/json/transform.js.map +1 -1
- package/dist/src/modules/upgrader/upgrader.js +13 -7
- package/dist/src/modules/upgrader/upgrader.js.map +1 -1
- package/dist/src/modules/version/range.js +11 -7
- package/dist/src/modules/version/range.js.map +1 -1
- package/dist/src/modules/version/range.mjs +5 -5
- package/dist/src/modules/version/range.mjs.map +1 -1
- package/dist/src/modules/version/semver.js +8 -4
- package/dist/src/modules/version/semver.js.map +1 -1
- package/dist/src/modules/version/semver.mjs +2 -2
- package/dist/src/modules/version/semver.mjs.map +1 -1
- package/dist/src/modules/version/types.js +7 -8
- package/dist/src/modules/version/types.js.map +1 -1
- package/dist/src/modules/version/types.mjs +7 -8
- package/dist/src/modules/version/types.mjs.map +1 -1
- package/dist/src/tasks/codemods/utils.js +9 -5
- package/dist/src/tasks/codemods/utils.js.map +1 -1
- package/dist/src/tasks/codemods/utils.mjs +5 -5
- package/dist/src/tasks/codemods/utils.mjs.map +1 -1
- package/dist/src/tasks/upgrade/prompts/latest.js +2 -2
- package/dist/src/tasks/upgrade/prompts/latest.js.map +1 -1
- package/dist/src/tasks/upgrade/prompts/latest.mjs +3 -3
- package/dist/src/tasks/upgrade/prompts/latest.mjs.map +1 -1
- package/dist/src/tasks/upgrade/requirements/common.js +7 -3
- package/dist/src/tasks/upgrade/requirements/common.js.map +1 -1
- package/dist/src/tasks/upgrade/upgrade.js +7 -3
- package/dist/src/tasks/upgrade/upgrade.js.map +1 -1
- package/dist/src/tasks/upgrade/upgrade.mjs +3 -3
- package/dist/src/tasks/upgrade/upgrade.mjs.map +1 -1
- package/dist/tasks/codemods/list-codemods.d.ts.map +1 -1
- package/dist/tasks/codemods/run-codemods.d.ts.map +1 -1
- package/dist/tasks/codemods/utils.d.ts.map +1 -1
- package/dist/tasks/upgrade/prompts/latest.d.ts.map +1 -1
- package/dist/tasks/upgrade/upgrade.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemod.js","sources":["../../../../src/modules/codemod/codemod.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, FormatOptions, Kind, UID } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n uid: UID;\n\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n this.uid = this.createUID();\n }\n\n private createUID(): UID {\n const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });\n const kind = this.kind;\n const version = this.version.raw as Version.LiteralSemVer;\n\n return `${version}-${name}-${kind}`;\n }\n\n format(options?: FormatOptions) {\n const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};\n\n let formatted = this.filename;\n\n if (stripExtension) {\n formatted = formatted.replace(new RegExp(`\\\\.${constants.CODEMOD_EXTENSION}$`, 'i'), '');\n }\n\n if (stripKind) {\n formatted = formatted\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}`, '');\n }\n\n if (stripHyphens) {\n formatted = formatted.replaceAll('-', ' ');\n }\n\n return formatted;\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n"],"names":["Codemod","createUID","name","format","stripExtension","stripKind","stripHyphens","kind","version","raw","options","formatted","filename","replace","RegExp","constants","replaceAll","baseDirectory","path","join","uid","codemodFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"codemod.js","sources":["../../../../src/modules/codemod/codemod.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as constants from './constants';\n\nimport type { Codemod as CodemodInterface, FormatOptions, Kind, UID } from './types';\nimport type { Version } from '../version';\n\ntype CreateCodemodPayload = Pick<\n CodemodInterface,\n 'kind' | 'version' | 'baseDirectory' | 'filename'\n>;\n\nexport class Codemod implements CodemodInterface {\n uid: UID;\n\n kind: Kind;\n\n version: Version.SemVer;\n\n baseDirectory: string;\n\n filename: string;\n\n path: string;\n\n constructor(options: CreateCodemodPayload) {\n this.kind = options.kind;\n this.version = options.version;\n this.baseDirectory = options.baseDirectory;\n this.filename = options.filename;\n\n this.path = path.join(this.baseDirectory, this.version.raw, this.filename);\n this.uid = this.createUID();\n }\n\n private createUID(): UID {\n const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });\n const kind = this.kind;\n const version = this.version.raw as Version.LiteralSemVer;\n\n return `${version}-${name}-${kind}`;\n }\n\n format(options?: FormatOptions) {\n const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};\n\n let formatted = this.filename;\n\n if (stripExtension) {\n formatted = formatted.replace(new RegExp(`\\\\.${constants.CODEMOD_EXTENSION}$`, 'i'), '');\n }\n\n if (stripKind) {\n formatted = formatted\n .replace(`.${constants.CODEMOD_CODE_SUFFIX}`, '')\n .replace(`.${constants.CODEMOD_JSON_SUFFIX}`, '');\n }\n\n if (stripHyphens) {\n formatted = formatted.replaceAll('-', ' ');\n }\n\n return formatted;\n }\n}\n\nexport const codemodFactory = (options: CreateCodemodPayload) => new Codemod(options);\n"],"names":["Codemod","createUID","name","format","stripExtension","stripKind","stripHyphens","kind","version","raw","options","formatted","filename","replace","RegExp","constants","replaceAll","baseDirectory","path","join","uid","codemodFactory"],"mappings":";;;;;;;;;AAYO,MAAMA,OAAAA,CAAAA;IAuBHC,SAAAA,GAAiB;AACvB,QAAA,MAAMC,IAAAA,GAAO,IAAI,CAACC,MAAM,CAAC;YAAEC,cAAAA,EAAgB,IAAA;YAAMC,SAAAA,EAAW,IAAA;YAAMC,YAAAA,EAAc;AAAM,SAAA,CAAA;QACtF,MAAMC,IAAAA,GAAO,IAAI,CAACA,IAAI;AACtB,QAAA,MAAMC,OAAAA,GAAU,IAAI,CAACA,OAAO,CAACC,GAAG;AAEhC,QAAA,OAAO,GAAGD,OAAAA,CAAQ,CAAC,EAAEN,IAAAA,CAAK,CAAC,EAAEK,IAAAA,CAAAA,CAAM;AACrC,IAAA;AAEAJ,IAAAA,MAAAA,CAAOO,OAAuB,EAAE;AAC9B,QAAA,MAAM,EAAEN,cAAAA,GAAiB,IAAI,EAAEC,SAAAA,GAAY,IAAI,EAAEC,YAAAA,GAAe,IAAI,EAAE,GAAGI,OAAAA,IAAW,EAAC;QAErF,IAAIC,SAAAA,GAAY,IAAI,CAACC,QAAQ;AAE7B,QAAA,IAAIR,cAAAA,EAAgB;AAClBO,YAAAA,SAAAA,GAAYA,SAAAA,CAAUE,OAAO,CAAC,IAAIC,OAAO,CAAC,GAAG,EAAEC,2BAA2B,CAAC,CAAC,CAAC,EAAE,GAAA,CAAA,EAAM,EAAA,CAAA;AACvF,QAAA;AAEA,QAAA,IAAIV,SAAAA,EAAW;AACbM,YAAAA,SAAAA,GAAYA,UACTE,OAAO,CAAC,CAAC,CAAC,EAAEE,6BAA6B,CAAA,CAAE,EAAE,EAAA,CAAA,CAC7CF,OAAO,CAAC,CAAC,CAAC,EAAEE,6BAA6B,EAAE,EAAE,EAAA,CAAA;AAClD,QAAA;AAEA,QAAA,IAAIT,YAAAA,EAAc;YAChBK,SAAAA,GAAYA,SAAAA,CAAUK,UAAU,CAAC,GAAA,EAAK,GAAA,CAAA;AACxC,QAAA;QAEA,OAAOL,SAAAA;AACT,IAAA;AAtCA,IAAA,WAAA,CAAYD,OAA6B,CAAE;AACzC,QAAA,IAAI,CAACH,IAAI,GAAGG,OAAAA,CAAQH,IAAI;AACxB,QAAA,IAAI,CAACC,OAAO,GAAGE,OAAAA,CAAQF,OAAO;AAC9B,QAAA,IAAI,CAACS,aAAa,GAAGP,OAAAA,CAAQO,aAAa;AAC1C,QAAA,IAAI,CAACL,QAAQ,GAAGF,OAAAA,CAAQE,QAAQ;AAEhC,QAAA,IAAI,CAACM,IAAI,GAAGA,sBAAKC,IAAI,CAAC,IAAI,CAACF,aAAa,EAAE,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,IAAI,CAACG,QAAQ,CAAA;AACzE,QAAA,IAAI,CAACQ,GAAG,GAAG,IAAI,CAACnB,SAAS,EAAA;AAC3B,IAAA;AA+BF;MAEaoB,cAAAA,GAAiB,CAACX,OAAAA,GAAkC,IAAIV,QAAQU,OAAAA;;;;;"}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var path = require('node:path');
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
8
|
+
|
|
9
|
+
const INTERNAL_CODEMODS_DIRECTORY = path__default.default.join(__dirname, '..', '..', '..', '..', 'resources', 'codemods' // resources/codemods
|
|
6
10
|
);
|
|
7
11
|
|
|
8
12
|
exports.INTERNAL_CODEMODS_DIRECTORY = INTERNAL_CODEMODS_DIRECTORY;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../src/modules/codemod-repository/constants.ts"],"sourcesContent":["import path from 'node:path';\n\nexport const INTERNAL_CODEMODS_DIRECTORY = path.join(\n __dirname, // upgrade/dist/src/modules/codemod-repository\n '..', // upgrade/dist/src/modules\n '..', // upgrade/dist/src\n '..', // upgrade/dist\n '..', // upgrade\n 'resources', // resources\n 'codemods' // resources/codemods\n);\n"],"names":["INTERNAL_CODEMODS_DIRECTORY","path","join","__dirname"],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../src/modules/codemod-repository/constants.ts"],"sourcesContent":["import path from 'node:path';\n\nexport const INTERNAL_CODEMODS_DIRECTORY = path.join(\n __dirname, // upgrade/dist/src/modules/codemod-repository\n '..', // upgrade/dist/src/modules\n '..', // upgrade/dist/src\n '..', // upgrade/dist\n '..', // upgrade\n 'resources', // resources\n 'codemods' // resources/codemods\n);\n"],"names":["INTERNAL_CODEMODS_DIRECTORY","path","join","__dirname"],"mappings":";;;;;;;;AAEO,MAAMA,2BAAAA,GAA8BC,qBAAAA,CAAKC,IAAI,CAClDC,SAAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,WAAA,EACA,UAAA;AACA;;;;"}
|
|
@@ -10,6 +10,13 @@ var semver = require('../version/semver.js');
|
|
|
10
10
|
var range = require('../version/range.js');
|
|
11
11
|
var constants = require('./constants.js');
|
|
12
12
|
|
|
13
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
|
|
15
|
+
var assert__default = /*#__PURE__*/_interopDefault(assert);
|
|
16
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
17
|
+
var semver__default = /*#__PURE__*/_interopDefault(semver$1);
|
|
18
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
19
|
+
|
|
13
20
|
class CodemodRepository {
|
|
14
21
|
refresh() {
|
|
15
22
|
this.refreshAvailableVersions();
|
|
@@ -70,11 +77,11 @@ class CodemodRepository {
|
|
|
70
77
|
}));
|
|
71
78
|
}
|
|
72
79
|
refreshAvailableVersions() {
|
|
73
|
-
this.versions =
|
|
74
|
-
.filter((filename)=>
|
|
75
|
-
.filter((filename)=>
|
|
80
|
+
this.versions = fse__default.default.readdirSync(this.cwd) // Only keep root directories
|
|
81
|
+
.filter((filename)=>fse__default.default.statSync(path__default.default.join(this.cwd, filename)).isDirectory())// Paths should be valid semver
|
|
82
|
+
.filter((filename)=>semver__default.default.valid(filename) !== null)// Transform files names to SemVer instances
|
|
76
83
|
.map((version)=>semver.semVerFactory(version))// Sort versions in ascending order
|
|
77
|
-
.sort(
|
|
84
|
+
.sort(semver__default.default.compare);
|
|
78
85
|
return this;
|
|
79
86
|
}
|
|
80
87
|
refreshAvailableFiles() {
|
|
@@ -85,13 +92,13 @@ class CodemodRepository {
|
|
|
85
92
|
}
|
|
86
93
|
refreshAvailableFilesForVersion(version) {
|
|
87
94
|
const literalVersion = version.raw;
|
|
88
|
-
const versionDirectory =
|
|
95
|
+
const versionDirectory = path__default.default.join(this.cwd, literalVersion);
|
|
89
96
|
// Ignore obsolete versions
|
|
90
|
-
if (!
|
|
97
|
+
if (!fse__default.default.existsSync(versionDirectory)) {
|
|
91
98
|
return;
|
|
92
99
|
}
|
|
93
|
-
this.groups[literalVersion] =
|
|
94
|
-
.filter((filename)=>
|
|
100
|
+
this.groups[literalVersion] = fse__default.default.readdirSync(versionDirectory)// Make sure the filenames are valid codemod files
|
|
101
|
+
.filter((filename)=>fse__default.default.statSync(path__default.default.join(versionDirectory, filename)).isFile()).filter((filename)=>constants$1.CODEMOD_FILE_REGEXP.test(filename))// Transform the filenames into Codemod instances
|
|
95
102
|
.map((filename)=>{
|
|
96
103
|
const kind = parseCodemodKindFromFilename(filename);
|
|
97
104
|
const baseDirectory = this.cwd;
|
|
@@ -104,7 +111,7 @@ class CodemodRepository {
|
|
|
104
111
|
});
|
|
105
112
|
}
|
|
106
113
|
constructor(cwd){
|
|
107
|
-
|
|
114
|
+
assert__default.default(fse__default.default.existsSync(cwd), `Invalid codemods directory provided "${cwd}"`);
|
|
108
115
|
this.cwd = cwd;
|
|
109
116
|
this.groups = {};
|
|
110
117
|
this.versions = [];
|
|
@@ -112,8 +119,8 @@ class CodemodRepository {
|
|
|
112
119
|
}
|
|
113
120
|
const parseCodemodKindFromFilename = (filename)=>{
|
|
114
121
|
const kind = filename.split('.').at(-2);
|
|
115
|
-
|
|
116
|
-
|
|
122
|
+
assert__default.default(kind !== undefined);
|
|
123
|
+
assert__default.default(constants$1.CODEMOD_ALLOWED_SUFFIXES.includes(kind));
|
|
117
124
|
return kind;
|
|
118
125
|
};
|
|
119
126
|
const codemodRepositoryFactory = (cwd = constants.INTERNAL_CODEMODS_DIRECTORY)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sources":["../../../../src/modules/codemod-repository/repository.ts"],"sourcesContent":["import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { isRangeInstance, semVerFactory } from '../version';\n\nimport { INTERNAL_CODEMODS_DIRECTORY } from './constants';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface, FindQuery } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n versionExists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n has(uid: string) {\n const result = this.find({ uids: [uid] });\n\n if (result.length !== 1) {\n return false;\n }\n\n const { codemods } = result[0];\n\n return codemods.length === 1 && codemods[0].uid === uid;\n }\n\n find(q: FindQuery) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return (\n entries\n // Filter by range if provided in the query\n .filter(maybeFilterByRange)\n // Transform version/codemods tuples into regular objects\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n // Filter by UID if provided in the query\n codemods: codemods.filter(maybeFilterByUIDs),\n }))\n // Only return groups with at least 1 codemod\n .filter(({ codemods }) => codemods.length > 0)\n );\n\n function maybeFilterByRange([version]: [Version.LiteralSemVer, Codemod.List]) {\n if (!isRangeInstance(q.range)) {\n return true;\n }\n\n return q.range.test(version);\n }\n\n function maybeFilterByUIDs(codemod: Codemod.Codemod) {\n if (q.uids === undefined) {\n return true;\n }\n\n return q.uids.includes(codemod.uid);\n }\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n findAll() {\n const entries = Object.entries(this.groups);\n\n return entries.map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string = INTERNAL_CODEMODS_DIRECTORY) => {\n return new CodemodRepository(cwd);\n};\n"],"names":["CodemodRepository","refresh","refreshAvailableVersions","refreshAvailableFiles","count","version","findByVersion","length","versionExists","raw","groups","has","uid","result","find","uids","codemods","q","entries","Object","filter","maybeFilterByRange","map","semVerFactory","maybeFilterByUIDs","isRangeInstance","range","test","codemod","undefined","includes","literalVersion","findAll","versions","fse","readdirSync","cwd","filename","statSync","path","join","isDirectory","semver","valid","sort","compare","refreshAvailableFilesForVersion","versionDirectory","existsSync","isFile","constants","kind","parseCodemodKindFromFilename","baseDirectory","codemodFactory","assert","split","at","codemodRepositoryFactory","INTERNAL_CODEMODS_DIRECTORY"],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.js","sources":["../../../../src/modules/codemod-repository/repository.ts"],"sourcesContent":["import assert from 'node:assert';\nimport fse from 'fs-extra';\nimport semver from 'semver';\nimport path from 'node:path';\n\nimport { codemodFactory, constants } from '../codemod';\nimport { isRangeInstance, semVerFactory } from '../version';\n\nimport { INTERNAL_CODEMODS_DIRECTORY } from './constants';\n\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\n\nimport type { CodemodRepository as CodemodRepositoryInterface, FindQuery } from './types';\n\nexport class CodemodRepository implements CodemodRepositoryInterface {\n private groups: Record<Version.LiteralSemVer, Codemod.Codemod[]>;\n\n private versions: Version.SemVer[];\n\n public cwd: string;\n\n constructor(cwd: string) {\n assert(fse.existsSync(cwd), `Invalid codemods directory provided \"${cwd}\"`);\n\n this.cwd = cwd;\n\n this.groups = {};\n this.versions = [];\n }\n\n refresh() {\n this.refreshAvailableVersions();\n this.refreshAvailableFiles();\n\n return this;\n }\n\n count(version: Version.SemVer) {\n return this.findByVersion(version).length;\n }\n\n versionExists(version: Version.SemVer) {\n return version.raw in this.groups;\n }\n\n has(uid: string) {\n const result = this.find({ uids: [uid] });\n\n if (result.length !== 1) {\n return false;\n }\n\n const { codemods } = result[0];\n\n return codemods.length === 1 && codemods[0].uid === uid;\n }\n\n find(q: FindQuery) {\n const entries = Object.entries(this.groups) as Array<[Version.LiteralSemVer, Codemod.List]>;\n\n return (\n entries\n // Filter by range if provided in the query\n .filter(maybeFilterByRange)\n // Transform version/codemods tuples into regular objects\n .map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n // Filter by UID if provided in the query\n codemods: codemods.filter(maybeFilterByUIDs),\n }))\n // Only return groups with at least 1 codemod\n .filter(({ codemods }) => codemods.length > 0)\n );\n\n function maybeFilterByRange([version]: [Version.LiteralSemVer, Codemod.List]) {\n if (!isRangeInstance(q.range)) {\n return true;\n }\n\n return q.range.test(version);\n }\n\n function maybeFilterByUIDs(codemod: Codemod.Codemod) {\n if (q.uids === undefined) {\n return true;\n }\n\n return q.uids.includes(codemod.uid);\n }\n }\n\n findByVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const codemods = this.groups[literalVersion];\n\n return codemods ?? [];\n }\n\n findAll() {\n const entries = Object.entries(this.groups);\n\n return entries.map<Codemod.VersionedCollection>(([version, codemods]) => ({\n version: semVerFactory(version),\n codemods,\n }));\n }\n\n private refreshAvailableVersions() {\n this.versions = fse\n .readdirSync(this.cwd) // Only keep root directories\n .filter((filename) => fse.statSync(path.join(this.cwd, filename)).isDirectory())\n // Paths should be valid semver\n .filter((filename): filename is Version.LiteralSemVer => semver.valid(filename) !== null)\n // Transform files names to SemVer instances\n .map<Version.SemVer>((version) => semVerFactory(version))\n // Sort versions in ascending order\n .sort(semver.compare);\n\n return this;\n }\n\n private refreshAvailableFiles() {\n this.groups = {};\n\n for (const version of this.versions) {\n this.refreshAvailableFilesForVersion(version);\n }\n }\n\n private refreshAvailableFilesForVersion(version: Version.SemVer) {\n const literalVersion = version.raw as Version.LiteralSemVer;\n const versionDirectory = path.join(this.cwd, literalVersion);\n\n // Ignore obsolete versions\n if (!fse.existsSync(versionDirectory)) {\n return;\n }\n\n this.groups[literalVersion] = fse\n .readdirSync(versionDirectory)\n // Make sure the filenames are valid codemod files\n .filter((filename) => fse.statSync(path.join(versionDirectory, filename)).isFile())\n .filter((filename) => constants.CODEMOD_FILE_REGEXP.test(filename))\n // Transform the filenames into Codemod instances\n .map((filename) => {\n const kind = parseCodemodKindFromFilename(filename);\n const baseDirectory = this.cwd;\n\n return codemodFactory({ kind, baseDirectory, version, filename });\n });\n }\n}\n\nexport const parseCodemodKindFromFilename = (filename: string): Codemod.Kind => {\n const kind = filename.split('.').at(-2) as Codemod.Kind | undefined;\n\n assert(kind !== undefined);\n assert(constants.CODEMOD_ALLOWED_SUFFIXES.includes(kind));\n\n return kind;\n};\n\nexport const codemodRepositoryFactory = (cwd: string = INTERNAL_CODEMODS_DIRECTORY) => {\n return new CodemodRepository(cwd);\n};\n"],"names":["CodemodRepository","refresh","refreshAvailableVersions","refreshAvailableFiles","count","version","findByVersion","length","versionExists","raw","groups","has","uid","result","find","uids","codemods","q","entries","Object","filter","maybeFilterByRange","map","semVerFactory","maybeFilterByUIDs","isRangeInstance","range","test","codemod","undefined","includes","literalVersion","findAll","versions","fse","readdirSync","cwd","filename","statSync","path","join","isDirectory","semver","valid","sort","compare","refreshAvailableFilesForVersion","versionDirectory","existsSync","isFile","constants","kind","parseCodemodKindFromFilename","baseDirectory","codemodFactory","assert","split","at","codemodRepositoryFactory","INTERNAL_CODEMODS_DIRECTORY"],"mappings":"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"}
|
|
@@ -3,14 +3,19 @@
|
|
|
3
3
|
var path = require('node:path');
|
|
4
4
|
var fastglob = require('fast-glob');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
9
|
+
var fastglob__default = /*#__PURE__*/_interopDefault(fastglob);
|
|
10
|
+
|
|
6
11
|
class FileScanner {
|
|
7
12
|
scan(patterns) {
|
|
8
13
|
// we use fastglob instead of glob because it supports negation patterns
|
|
9
|
-
const filenames =
|
|
14
|
+
const filenames = fastglob__default.default.sync(patterns, {
|
|
10
15
|
cwd: this.cwd
|
|
11
16
|
});
|
|
12
17
|
// Resolve the full paths for every filename
|
|
13
|
-
return filenames.map((filename)=>
|
|
18
|
+
return filenames.map((filename)=>path__default.default.join(this.cwd, filename));
|
|
14
19
|
}
|
|
15
20
|
constructor(cwd){
|
|
16
21
|
this.cwd = cwd;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sources":["../../../../src/modules/file-scanner/scanner.ts"],"sourcesContent":["import path from 'node:path';\nimport fastglob from 'fast-glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n // we use fastglob instead of glob because it supports negation patterns\n const filenames = fastglob.sync(patterns, {\n cwd: this.cwd,\n });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n"],"names":["FileScanner","scan","patterns","filenames","fastglob","sync","cwd","map","filename","path","join","fileScannerFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"scanner.js","sources":["../../../../src/modules/file-scanner/scanner.ts"],"sourcesContent":["import path from 'node:path';\nimport fastglob from 'fast-glob';\n\nimport type { FileScanner as FileScannerInterface } from './types';\n\nexport class FileScanner implements FileScannerInterface {\n public cwd: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n scan(patterns: string[]) {\n // we use fastglob instead of glob because it supports negation patterns\n const filenames = fastglob.sync(patterns, {\n cwd: this.cwd,\n });\n\n // Resolve the full paths for every filename\n return filenames.map((filename) => path.join(this.cwd, filename));\n }\n}\n\nexport const fileScannerFactory = (cwd: string) => new FileScanner(cwd);\n"],"names":["FileScanner","scan","patterns","filenames","fastglob","sync","cwd","map","filename","path","join","fileScannerFactory"],"mappings":";;;;;;;;;;AAKO,MAAMA,WAAAA,CAAAA;AAOXC,IAAAA,IAAAA,CAAKC,QAAkB,EAAE;;AAEvB,QAAA,MAAMC,SAAAA,GAAYC,yBAAAA,CAASC,IAAI,CAACH,QAAAA,EAAU;YACxCI,GAAAA,EAAK,IAAI,CAACA;AACZ,SAAA,CAAA;;QAGA,OAAOH,SAAAA,CAAUI,GAAG,CAAC,CAACC,QAAAA,GAAaC,qBAAAA,CAAKC,IAAI,CAAC,IAAI,CAACJ,GAAG,EAAEE,QAAAA,CAAAA,CAAAA;AACzD,IAAA;AAZA,IAAA,WAAA,CAAYF,GAAW,CAAE;QACvB,IAAI,CAACA,GAAG,GAAGA,GAAAA;AACb,IAAA;AAWF;MAEaK,kBAAAA,GAAqB,CAACL,GAAAA,GAAgB,IAAIN,YAAYM,GAAAA;;;;;"}
|
|
@@ -4,32 +4,37 @@ var CliTable3 = require('cli-table3');
|
|
|
4
4
|
var chalk = require('chalk');
|
|
5
5
|
var constants = require('../timer/constants.js');
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var CliTable3__default = /*#__PURE__*/_interopDefault(CliTable3);
|
|
10
|
+
var chalk__default = /*#__PURE__*/_interopDefault(chalk);
|
|
11
|
+
|
|
12
|
+
const path = (path)=>chalk__default.default.blue(path);
|
|
8
13
|
const version = (version)=>{
|
|
9
|
-
return
|
|
14
|
+
return chalk__default.default.italic.yellow(`v${version}`);
|
|
10
15
|
};
|
|
11
16
|
const codemodUID = (uid)=>{
|
|
12
|
-
return
|
|
17
|
+
return chalk__default.default.bold.cyan(uid);
|
|
13
18
|
};
|
|
14
19
|
const projectDetails = (project)=>{
|
|
15
20
|
return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;
|
|
16
21
|
};
|
|
17
|
-
const projectType = (type)=>
|
|
18
|
-
const versionRange = (range)=>
|
|
19
|
-
const transform = (transformFilePath)=>
|
|
20
|
-
const highlight = (arg)=>
|
|
22
|
+
const projectType = (type)=>chalk__default.default.cyan(type);
|
|
23
|
+
const versionRange = (range)=>chalk__default.default.italic.yellow(range.raw);
|
|
24
|
+
const transform = (transformFilePath)=>chalk__default.default.cyan(transformFilePath);
|
|
25
|
+
const highlight = (arg)=>chalk__default.default.bold.underline(arg);
|
|
21
26
|
const upgradeStep = (text, step)=>{
|
|
22
|
-
return
|
|
27
|
+
return chalk__default.default.bold(`(${step[0]}/${step[1]}) ${text}...`);
|
|
23
28
|
};
|
|
24
29
|
const reports = (reports)=>{
|
|
25
30
|
const rows = reports.map(({ codemod, report }, i)=>{
|
|
26
|
-
const fIndex =
|
|
27
|
-
const fVersion =
|
|
28
|
-
const fKind =
|
|
29
|
-
const fFormattedTransformPath =
|
|
30
|
-
const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${
|
|
31
|
-
const fAffected = report.ok > 0 ?
|
|
32
|
-
const fUnchanged = report.ok === 0 ?
|
|
31
|
+
const fIndex = chalk__default.default.grey(i);
|
|
32
|
+
const fVersion = chalk__default.default.magenta(codemod.version);
|
|
33
|
+
const fKind = chalk__default.default.yellow(codemod.kind);
|
|
34
|
+
const fFormattedTransformPath = chalk__default.default.cyan(codemod.format());
|
|
35
|
+
const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${chalk__default.default.dim.italic('(cold start)')}` : `${report.timeElapsed}s`;
|
|
36
|
+
const fAffected = report.ok > 0 ? chalk__default.default.green(report.ok) : chalk__default.default.grey(0);
|
|
37
|
+
const fUnchanged = report.ok === 0 ? chalk__default.default.red(report.nochange) : chalk__default.default.grey(report.nochange);
|
|
33
38
|
return [
|
|
34
39
|
fIndex,
|
|
35
40
|
fVersion,
|
|
@@ -40,18 +45,18 @@ const reports = (reports)=>{
|
|
|
40
45
|
fTimeElapsed
|
|
41
46
|
];
|
|
42
47
|
});
|
|
43
|
-
const table = new
|
|
48
|
+
const table = new CliTable3__default.default({
|
|
44
49
|
style: {
|
|
45
50
|
compact: true
|
|
46
51
|
},
|
|
47
52
|
head: [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
chalk__default.default.bold.grey('N°'),
|
|
54
|
+
chalk__default.default.bold.magenta('Version'),
|
|
55
|
+
chalk__default.default.bold.yellow('Kind'),
|
|
56
|
+
chalk__default.default.bold.cyan('Name'),
|
|
57
|
+
chalk__default.default.bold.green('Affected'),
|
|
58
|
+
chalk__default.default.bold.red('Unchanged'),
|
|
59
|
+
chalk__default.default.bold.blue('Duration')
|
|
55
60
|
]
|
|
56
61
|
});
|
|
57
62
|
table.push(...rows);
|
|
@@ -59,10 +64,10 @@ const reports = (reports)=>{
|
|
|
59
64
|
};
|
|
60
65
|
const codemodList = (codemods)=>{
|
|
61
66
|
const rows = codemods.map((codemod, index)=>{
|
|
62
|
-
const fIndex =
|
|
63
|
-
const fVersion =
|
|
64
|
-
const fKind =
|
|
65
|
-
const fName =
|
|
67
|
+
const fIndex = chalk__default.default.grey(index);
|
|
68
|
+
const fVersion = chalk__default.default.magenta(codemod.version);
|
|
69
|
+
const fKind = chalk__default.default.yellow(codemod.kind);
|
|
70
|
+
const fName = chalk__default.default.blue(codemod.format());
|
|
66
71
|
const fUID = codemodUID(codemod.uid);
|
|
67
72
|
return [
|
|
68
73
|
fIndex,
|
|
@@ -72,16 +77,16 @@ const codemodList = (codemods)=>{
|
|
|
72
77
|
fUID
|
|
73
78
|
];
|
|
74
79
|
});
|
|
75
|
-
const table = new
|
|
80
|
+
const table = new CliTable3__default.default({
|
|
76
81
|
style: {
|
|
77
82
|
compact: true
|
|
78
83
|
},
|
|
79
84
|
head: [
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
chalk__default.default.bold.grey('N°'),
|
|
86
|
+
chalk__default.default.bold.magenta('Version'),
|
|
87
|
+
chalk__default.default.bold.yellow('Kind'),
|
|
88
|
+
chalk__default.default.bold.blue('Name'),
|
|
89
|
+
chalk__default.default.bold.cyan('UID')
|
|
85
90
|
]
|
|
86
91
|
});
|
|
87
92
|
table.push(...rows);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formats.js","sources":["../../../../src/modules/format/formats.ts"],"sourcesContent":["import CliTable3 from 'cli-table3';\nimport chalk from 'chalk';\n\nimport { constants as timerConstants } from '../timer';\n\nimport type { AppProject, PluginProject, ProjectType } from '../project';\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\nimport type { Report } from '../report';\n\nexport const path = (path: string) => chalk.blue(path);\n\nexport const version = (version: Version.LiteralVersion | Version.SemVer) => {\n return chalk.italic.yellow(`v${version}`);\n};\n\nexport const codemodUID = (uid: string) => {\n return chalk.bold.cyan(uid);\n};\n\nexport const projectDetails = (project: AppProject | PluginProject) => {\n return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;\n};\n\nexport const projectType = (type: ProjectType) => chalk.cyan(type);\n\nexport const versionRange = (range: Version.Range) => chalk.italic.yellow(range.raw);\n\nexport const transform = (transformFilePath: string) => chalk.cyan(transformFilePath);\n\nexport const highlight = (arg: unknown) => chalk.bold.underline(arg);\n\nexport const upgradeStep = (text: string, step: [current: number, total: number]) => {\n return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);\n};\n\nexport const reports = (reports: Report.CodemodReport[]) => {\n const rows = reports.map(({ codemod, report }, i) => {\n const fIndex = chalk.grey(i);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fFormattedTransformPath = chalk.cyan(codemod.format());\n const fTimeElapsed =\n i === 0\n ? `${report.timeElapsed}s ${chalk.dim.italic('(cold start)')}`\n : `${report.timeElapsed}s`;\n const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);\n const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);\n\n return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.cyan('Name'),\n chalk.bold.green('Affected'),\n chalk.bold.red('Unchanged'),\n chalk.bold.blue('Duration'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const codemodList = (codemods: Codemod.List) => {\n type Row = [index: string, version: string, kind: string, name: string, uid: string];\n\n const rows = codemods.map<Row>((codemod, index) => {\n const fIndex = chalk.grey(index);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fName = chalk.blue(codemod.format());\n const fUID = codemodUID(codemod.uid);\n\n return [fIndex, fVersion, fKind, fName, fUID] satisfies Row;\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.blue('Name'),\n chalk.bold.cyan('UID'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const durationMs = (elapsedMs: number) => {\n const elapsedSeconds = (elapsedMs / timerConstants.ONE_SECOND_MS).toFixed(3);\n\n return `${elapsedSeconds}s`;\n};\n"],"names":["path","chalk","blue","version","italic","yellow","codemodUID","uid","bold","cyan","projectDetails","project","projectType","type","cwd","paths","map","versionRange","range","raw","transform","transformFilePath","highlight","arg","underline","upgradeStep","text","step","reports","rows","codemod","report","i","fIndex","grey","fVersion","magenta","fKind","kind","fFormattedTransformPath","format","fTimeElapsed","timeElapsed","dim","fAffected","ok","green","fUnchanged","red","nochange","table","CliTable3","style","compact","head","push","toString","codemodList","codemods","index","fName","fUID","durationMs","elapsedMs","elapsedSeconds","timerConstants","toFixed"],"mappings":"
|
|
1
|
+
{"version":3,"file":"formats.js","sources":["../../../../src/modules/format/formats.ts"],"sourcesContent":["import CliTable3 from 'cli-table3';\nimport chalk from 'chalk';\n\nimport { constants as timerConstants } from '../timer';\n\nimport type { AppProject, PluginProject, ProjectType } from '../project';\nimport type { Codemod } from '../codemod';\nimport type { Version } from '../version';\nimport type { Report } from '../report';\n\nexport const path = (path: string) => chalk.blue(path);\n\nexport const version = (version: Version.LiteralVersion | Version.SemVer) => {\n return chalk.italic.yellow(`v${version}`);\n};\n\nexport const codemodUID = (uid: string) => {\n return chalk.bold.cyan(uid);\n};\n\nexport const projectDetails = (project: AppProject | PluginProject) => {\n return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;\n};\n\nexport const projectType = (type: ProjectType) => chalk.cyan(type);\n\nexport const versionRange = (range: Version.Range) => chalk.italic.yellow(range.raw);\n\nexport const transform = (transformFilePath: string) => chalk.cyan(transformFilePath);\n\nexport const highlight = (arg: unknown) => chalk.bold.underline(arg);\n\nexport const upgradeStep = (text: string, step: [current: number, total: number]) => {\n return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);\n};\n\nexport const reports = (reports: Report.CodemodReport[]) => {\n const rows = reports.map(({ codemod, report }, i) => {\n const fIndex = chalk.grey(i);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fFormattedTransformPath = chalk.cyan(codemod.format());\n const fTimeElapsed =\n i === 0\n ? `${report.timeElapsed}s ${chalk.dim.italic('(cold start)')}`\n : `${report.timeElapsed}s`;\n const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);\n const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);\n\n return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.cyan('Name'),\n chalk.bold.green('Affected'),\n chalk.bold.red('Unchanged'),\n chalk.bold.blue('Duration'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const codemodList = (codemods: Codemod.List) => {\n type Row = [index: string, version: string, kind: string, name: string, uid: string];\n\n const rows = codemods.map<Row>((codemod, index) => {\n const fIndex = chalk.grey(index);\n const fVersion = chalk.magenta(codemod.version);\n const fKind = chalk.yellow(codemod.kind);\n const fName = chalk.blue(codemod.format());\n const fUID = codemodUID(codemod.uid);\n\n return [fIndex, fVersion, fKind, fName, fUID] satisfies Row;\n });\n\n const table = new CliTable3({\n style: { compact: true },\n head: [\n chalk.bold.grey('N°'),\n chalk.bold.magenta('Version'),\n chalk.bold.yellow('Kind'),\n chalk.bold.blue('Name'),\n chalk.bold.cyan('UID'),\n ],\n });\n\n table.push(...rows);\n\n return table.toString();\n};\n\nexport const durationMs = (elapsedMs: number) => {\n const elapsedSeconds = (elapsedMs / timerConstants.ONE_SECOND_MS).toFixed(3);\n\n return `${elapsedSeconds}s`;\n};\n"],"names":["path","chalk","blue","version","italic","yellow","codemodUID","uid","bold","cyan","projectDetails","project","projectType","type","cwd","paths","map","versionRange","range","raw","transform","transformFilePath","highlight","arg","underline","upgradeStep","text","step","reports","rows","codemod","report","i","fIndex","grey","fVersion","magenta","fKind","kind","fFormattedTransformPath","format","fTimeElapsed","timeElapsed","dim","fAffected","ok","green","fUnchanged","red","nochange","table","CliTable3","style","compact","head","push","toString","codemodList","codemods","index","fName","fUID","durationMs","elapsedMs","elapsedSeconds","timerConstants","toFixed"],"mappings":"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"}
|
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
var fse = require('fs-extra');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
8
|
+
|
|
5
9
|
const readJSON = async (path)=>{
|
|
6
|
-
const buffer = await
|
|
10
|
+
const buffer = await fse__default.default.readFile(path);
|
|
7
11
|
return JSON.parse(buffer.toString());
|
|
8
12
|
};
|
|
9
13
|
const saveJSON = async (path, json)=>{
|
|
10
14
|
const jsonAsString = `${JSON.stringify(json, null, 2)}\n`;
|
|
11
|
-
await
|
|
15
|
+
await fse__default.default.writeFile(path, jsonAsString);
|
|
12
16
|
};
|
|
13
17
|
|
|
14
18
|
exports.readJSON = readJSON;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sources":["../../../../src/modules/json/file.ts"],"sourcesContent":["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"],"names":["readJSON","path","buffer","fse","readFile","JSON","parse","toString","saveJSON","json","jsonAsString","stringify","writeFile"],"mappings":"
|
|
1
|
+
{"version":3,"file":"file.js","sources":["../../../../src/modules/json/file.ts"],"sourcesContent":["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"],"names":["readJSON","path","buffer","fse","readFile","JSON","parse","toString","saveJSON","json","jsonAsString","stringify","writeFile"],"mappings":";;;;;;;;AAIO,MAAMA,WAAW,OAAOC,IAAAA,GAAAA;AAC7B,IAAA,MAAMC,MAAAA,GAAS,MAAMC,oBAAAA,CAAIC,QAAQ,CAACH,IAAAA,CAAAA;AAElC,IAAA,OAAOI,IAAAA,CAAKC,KAAK,CAACJ,MAAAA,CAAOK,QAAQ,EAAA,CAAA;AACnC;AAEO,MAAMC,QAAAA,GAAW,OAAOP,IAAAA,EAAcQ,IAAAA,GAAAA;IAC3C,MAAMC,YAAAA,GAAe,GAAGL,IAAAA,CAAKM,SAAS,CAACF,IAAAA,EAAM,IAAA,EAAM,CAAA,CAAA,CAAG,EAAE,CAAC;IAEzD,MAAMN,oBAAAA,CAAIS,SAAS,CAACX,IAAAA,EAAMS,YAAAA,CAAAA;AAC5B;;;;;"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var chalk__default = /*#__PURE__*/_interopDefault(chalk);
|
|
8
|
+
|
|
5
9
|
class Logger {
|
|
6
10
|
get isNotSilent() {
|
|
7
11
|
return !this.isSilent;
|
|
@@ -29,20 +33,20 @@ class Logger {
|
|
|
29
33
|
debug(...args) {
|
|
30
34
|
const isDebugEnabled = this.isNotSilent && this.isDebug;
|
|
31
35
|
if (isDebugEnabled) {
|
|
32
|
-
console.log(
|
|
36
|
+
console.log(chalk__default.default.cyan(`[DEBUG]\t[${nowAsISO()}]`), ...args);
|
|
33
37
|
}
|
|
34
38
|
return this;
|
|
35
39
|
}
|
|
36
40
|
error(...args) {
|
|
37
41
|
this.nbErrorsCalls += 1;
|
|
38
42
|
if (this.isNotSilent) {
|
|
39
|
-
console.error(
|
|
43
|
+
console.error(chalk__default.default.red(`[ERROR]\t[${nowAsISO()}]`), ...args);
|
|
40
44
|
}
|
|
41
45
|
return this;
|
|
42
46
|
}
|
|
43
47
|
info(...args) {
|
|
44
48
|
if (this.isNotSilent) {
|
|
45
|
-
console.info(
|
|
49
|
+
console.info(chalk__default.default.blue(`[INFO]\t[${new Date().toISOString()}]`), ...args);
|
|
46
50
|
}
|
|
47
51
|
return this;
|
|
48
52
|
}
|
|
@@ -55,7 +59,7 @@ class Logger {
|
|
|
55
59
|
warn(...args) {
|
|
56
60
|
this.nbWarningsCalls += 1;
|
|
57
61
|
if (this.isNotSilent) {
|
|
58
|
-
console.warn(
|
|
62
|
+
console.warn(chalk__default.default.yellow(`[WARN]\t[${new Date().toISOString()}]`), ...args);
|
|
59
63
|
}
|
|
60
64
|
return this;
|
|
61
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sources":["../../../../src/modules/logger/logger.ts"],"sourcesContent":["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"],"names":["Logger","isNotSilent","isSilent","errors","nbErrorsCalls","warnings","nbWarningsCalls","stdout","undefined","process","stderr","setDebug","debug","isDebug","setSilent","silent","args","isDebugEnabled","console","log","chalk","cyan","nowAsISO","error","red","info","blue","Date","toISOString","raw","warn","yellow","options","loggerFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sources":["../../../../src/modules/logger/logger.ts"],"sourcesContent":["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"],"names":["Logger","isNotSilent","isSilent","errors","nbErrorsCalls","warnings","nbWarningsCalls","stdout","undefined","process","stderr","setDebug","debug","isDebug","setSilent","silent","args","isDebugEnabled","console","log","chalk","cyan","nowAsISO","error","red","info","blue","Date","toISOString","raw","warn","yellow","options","loggerFactory"],"mappings":"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"}
|
|
@@ -8,6 +8,12 @@ var undici = require('undici');
|
|
|
8
8
|
var constants = require('./constants.js');
|
|
9
9
|
var semver = require('../version/semver.js');
|
|
10
10
|
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var assert__default = /*#__PURE__*/_interopDefault(assert);
|
|
14
|
+
var semver__default = /*#__PURE__*/_interopDefault(semver$1);
|
|
15
|
+
var execa__default = /*#__PURE__*/_interopDefault(execa);
|
|
16
|
+
|
|
11
17
|
const proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;
|
|
12
18
|
const agent = proxyUrl ? new undici.ProxyAgent(proxyUrl) : undefined;
|
|
13
19
|
class Package {
|
|
@@ -15,7 +21,7 @@ class Package {
|
|
|
15
21
|
return this.npmPackage !== null;
|
|
16
22
|
}
|
|
17
23
|
assertPackageIsLoaded(npmPackage) {
|
|
18
|
-
|
|
24
|
+
assert__default.default(this.isLoaded, 'The package is not loaded yet');
|
|
19
25
|
}
|
|
20
26
|
getVersionsDict() {
|
|
21
27
|
this.assertPackageIsLoaded(this.npmPackage);
|
|
@@ -30,11 +36,11 @@ class Package {
|
|
|
30
36
|
return versions// Only select versions matching the upgrade range
|
|
31
37
|
.filter((v)=>range.test(v.version))// Only select supported version format (x.x.x)
|
|
32
38
|
.filter((v)=>semver.isLiteralSemVer(v.version))// Sort in ascending order
|
|
33
|
-
.sort((v1, v2)=>
|
|
39
|
+
.sort((v1, v2)=>semver__default.default.compare(v1.version, v2.version));
|
|
34
40
|
}
|
|
35
41
|
async getYarnMajorVersion() {
|
|
36
42
|
try {
|
|
37
|
-
const { stdout } = await
|
|
43
|
+
const { stdout } = await execa__default.default('yarn', [
|
|
38
44
|
'--version'
|
|
39
45
|
], {
|
|
40
46
|
timeout: 5000
|
|
@@ -81,7 +87,7 @@ class Package {
|
|
|
81
87
|
this.logger.warn(`Unsupported package manager: ${packageManagerName}`);
|
|
82
88
|
return undefined;
|
|
83
89
|
}
|
|
84
|
-
const { stdout } = await
|
|
90
|
+
const { stdout } = await execa__default.default(packageManagerName, [
|
|
85
91
|
...command
|
|
86
92
|
], {
|
|
87
93
|
timeout: 10000
|
|
@@ -107,7 +113,7 @@ class Package {
|
|
|
107
113
|
}
|
|
108
114
|
findVersion(version) {
|
|
109
115
|
const versions = this.getVersionsAsList();
|
|
110
|
-
return versions.find((npmVersion)=>
|
|
116
|
+
return versions.find((npmVersion)=>semver__default.default.eq(npmVersion.version, version));
|
|
111
117
|
}
|
|
112
118
|
async refresh() {
|
|
113
119
|
const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;
|
|
@@ -116,7 +122,7 @@ class Package {
|
|
|
116
122
|
dispatcher: agent
|
|
117
123
|
});
|
|
118
124
|
// TODO: Use a validation library to make sure the response structure is correct
|
|
119
|
-
|
|
125
|
+
assert__default.default(response.ok, `Request failed for ${packageURL}`);
|
|
120
126
|
this.npmPackage = await response.json();
|
|
121
127
|
return this;
|
|
122
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sources":["../../../../src/modules/npm/package.ts"],"sourcesContent":["import assert from 'node:assert';\nimport semver from 'semver';\nimport execa from 'execa';\nimport { packageManager } from '@strapi/utils';\n\nimport { ProxyAgent } from 'undici';\nimport * as constants from './constants';\nimport { isLiteralSemVer } from '../version';\n\nimport type { Package as PackageInterface, NPMPackage, NPMPackageVersion } from './types';\nimport type { Version } from '../version';\nimport { Logger } from '../logger';\n\nconst proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;\nconst agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;\n\nexport class Package implements PackageInterface {\n name: string;\n\n cwd: string;\n\n private logger: Logger;\n\n private npmPackage: NPMPackage | null;\n\n constructor(name: string, cwd: string, logger: Logger) {\n this.name = name;\n this.cwd = cwd;\n this.logger = logger;\n this.npmPackage = null;\n }\n\n get isLoaded() {\n return this.npmPackage !== null;\n }\n\n private assertPackageIsLoaded(npmPackage: NPMPackage | null): asserts npmPackage is NPMPackage {\n assert(this.isLoaded, 'The package is not loaded yet');\n }\n\n getVersionsDict() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return this.npmPackage.versions;\n }\n\n getVersionsAsList() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return Object.values(this.npmPackage.versions);\n }\n\n findVersionsInRange(range: Version.Range) {\n const versions = this.getVersionsAsList();\n\n return (\n versions\n // Only select versions matching the upgrade range\n .filter((v) => range.test(v.version))\n // Only select supported version format (x.x.x)\n .filter((v) => isLiteralSemVer(v.version))\n // Sort in ascending order\n .sort((v1, v2) => semver.compare(v1.version, v2.version))\n );\n }\n\n private async getYarnMajorVersion(): Promise<number> {\n try {\n const { stdout } = await execa('yarn', ['--version'], { timeout: 5_000 });\n const version = stdout.trim();\n return parseInt(version.split('.')[0], 10);\n } catch {\n // Default to Yarn Berry (v2+) if version check fails\n return 2;\n }\n }\n\n private normalizeRegistryOutput(stdout: string): string | undefined {\n const registry = stdout.trim();\n\n // Yarn Classic (v1) may return literal \"undefined\" for unset config values\n if (!registry || registry === 'undefined') {\n return undefined;\n }\n\n return registry;\n }\n\n private async getRegistryFromPackageManager(): Promise<string | undefined> {\n try {\n const packageManagerName = await packageManager.getPreferred(this.cwd);\n if (!packageManagerName) return undefined;\n\n let command: readonly string[];\n\n if (packageManagerName === 'yarn') {\n const yarnMajorVersion = await this.getYarnMajorVersion();\n // Yarn Classic (v1) uses 'registry', Yarn Berry (v2+) uses 'npmRegistryServer'\n command =\n yarnMajorVersion >= 2\n ? ['config', 'get', 'npmRegistryServer']\n : ['config', 'get', 'registry'];\n } else if (packageManagerName === 'npm' || packageManagerName === 'pnpm') {\n command = ['config', 'get', 'registry'];\n } else {\n this.logger.warn(`Unsupported package manager: ${packageManagerName}`);\n return undefined;\n }\n\n const { stdout } = await execa(packageManagerName, [...command], { timeout: 10_000 });\n return this.normalizeRegistryOutput(stdout);\n } catch (error) {\n this.logger.warn('Failed to determine registry URL from package manager');\n return undefined;\n }\n }\n\n private async determineRegistryUrl(): Promise<string> {\n if (process.env.NPM_REGISTRY_URL) {\n this.logger.debug(`Using NPM_REGISTRY_URL: ${process.env.NPM_REGISTRY_URL}`);\n return process.env.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n const packageManagerRegistry = await this.getRegistryFromPackageManager();\n if (packageManagerRegistry) {\n this.logger.debug(`Using package manager registry: ${packageManagerRegistry}`);\n return packageManagerRegistry.replace(/\\/$/, '');\n }\n\n this.logger.debug(`Using default registry: ${constants.NPM_REGISTRY_URL}`);\n return constants.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n findVersion(version: Version.SemVer): NPMPackageVersion | undefined {\n const versions = this.getVersionsAsList();\n\n return versions.find((npmVersion) => semver.eq(npmVersion.version, version));\n }\n\n async refresh() {\n const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;\n\n const response = await fetch(packageURL, {\n // @ts-expect-error Node.js fetch supports dispatcher (undici extension)\n dispatcher: agent,\n });\n\n // TODO: Use a validation library to make sure the response structure is correct\n assert(response.ok, `Request failed for ${packageURL}`);\n\n this.npmPackage = (await response.json()) as NPMPackage;\n\n return this;\n }\n\n versionExists(version: Version.SemVer) {\n return this.findVersion(version) !== undefined;\n }\n}\n\nexport const npmPackageFactory = (name: string, cwd: string, logger: Logger) =>\n new Package(name, cwd, logger);\n"],"names":["proxyUrl","process","env","HTTP_PROXY","HTTPS_PROXY","agent","ProxyAgent","undefined","Package","isLoaded","npmPackage","assertPackageIsLoaded","assert","getVersionsDict","versions","getVersionsAsList","Object","values","findVersionsInRange","range","filter","v","test","version","isLiteralSemVer","sort","v1","v2","semver","compare","getYarnMajorVersion","stdout","execa","timeout","trim","parseInt","split","normalizeRegistryOutput","registry","getRegistryFromPackageManager","packageManagerName","packageManager","getPreferred","cwd","command","yarnMajorVersion","logger","warn","error","determineRegistryUrl","NPM_REGISTRY_URL","debug","replace","packageManagerRegistry","constants","findVersion","find","npmVersion","eq","refresh","packageURL","name","response","fetch","dispatcher","ok","json","versionExists","npmPackageFactory"],"mappings":";;;;;;;;;;AAaA,MAAMA,QAAAA,GAAWC,QAAQC,GAAG,CAACC,UAAU,IAAIF,OAAAA,CAAQC,GAAG,CAACE,WAAW;AAClE,MAAMC,KAAAA,GAAQL,QAAAA,GAAW,IAAIM,iBAAAA,CAAWN,QAAAA,CAAAA,GAAYO,SAAAA;AAE7C,MAAMC,OAAAA,CAAAA;AAgBX,IAAA,IAAIC,QAAAA,GAAW;QACb,OAAO,IAAI,CAACC,UAAU,KAAK,IAAA;AAC7B,IAAA;AAEQC,IAAAA,qBAAAA,CAAsBD,UAA6B,EAAoC;QAC7FE,MAAAA,CAAO,IAAI,CAACH,QAAQ,EAAE,+BAAA,CAAA;AACxB,IAAA;IAEAI,eAAAA,GAAkB;AAChB,QAAA,IAAI,CAACF,qBAAqB,CAAC,IAAI,CAACD,UAAU,CAAA;AAE1C,QAAA,OAAO,IAAI,CAACA,UAAU,CAACI,QAAQ;AACjC,IAAA;IAEAC,iBAAAA,GAAoB;AAClB,QAAA,IAAI,CAACJ,qBAAqB,CAAC,IAAI,CAACD,UAAU,CAAA;AAE1C,QAAA,OAAOM,OAAOC,MAAM,CAAC,IAAI,CAACP,UAAU,CAACI,QAAQ,CAAA;AAC/C,IAAA;AAEAI,IAAAA,mBAAAA,CAAoBC,KAAoB,EAAE;QACxC,MAAML,QAAAA,GAAW,IAAI,CAACC,iBAAiB,EAAA;AAEvC,QAAA,OACED,QACE;SACCM,MAAM,CAAC,CAACC,CAAAA,GAAMF,KAAAA,CAAMG,IAAI,CAACD,CAAAA,CAAEE,OAAO,CAAA,CACnC;AACCH,SAAAA,MAAM,CAAC,CAACC,CAAAA,GAAMG,uBAAgBH,CAAAA,CAAEE,OAAO,EACxC;SACCE,IAAI,CAAC,CAACC,EAAAA,EAAIC,EAAAA,GAAOC,QAAAA,CAAOC,OAAO,CAACH,EAAAA,CAAGH,OAAO,EAAEI,EAAAA,CAAGJ,OAAO,CAAA,CAAA;AAE7D,IAAA;AAEA,IAAA,MAAcO,mBAAAA,GAAuC;QACnD,IAAI;AACF,YAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,MAAM,MAAA,EAAQ;AAAC,gBAAA;aAAY,EAAE;gBAAEC,OAAAA,EAAS;AAAM,aAAA,CAAA;YACvE,MAAMV,OAAAA,GAAUQ,OAAOG,IAAI,EAAA;AAC3B,YAAA,OAAOC,SAASZ,OAAAA,CAAQa,KAAK,CAAC,GAAA,CAAI,CAAC,EAAE,EAAE,EAAA,CAAA;AACzC,QAAA,CAAA,CAAE,OAAM;;YAEN,OAAO,CAAA;AACT,QAAA;AACF,IAAA;AAEQC,IAAAA,uBAAAA,CAAwBN,MAAc,EAAsB;QAClE,MAAMO,QAAAA,GAAWP,OAAOG,IAAI,EAAA;;QAG5B,IAAI,CAACI,QAAAA,IAAYA,QAAAA,KAAa,WAAA,EAAa;YACzC,OAAO/B,SAAAA;AACT,QAAA;QAEA,OAAO+B,QAAAA;AACT,IAAA;AAEA,IAAA,MAAcC,6BAAAA,GAA6D;QACzE,IAAI;AACF,YAAA,MAAMC,qBAAqB,MAAMC,oBAAAA,CAAeC,YAAY,CAAC,IAAI,CAACC,GAAG,CAAA;YACrE,IAAI,CAACH,oBAAoB,OAAOjC,SAAAA;YAEhC,IAAIqC,OAAAA;AAEJ,YAAA,IAAIJ,uBAAuB,MAAA,EAAQ;AACjC,gBAAA,MAAMK,gBAAAA,GAAmB,MAAM,IAAI,CAACf,mBAAmB,EAAA;;AAEvDc,gBAAAA,OAAAA,GACEC,oBAAoB,CAAA,GAChB;AAAC,oBAAA,QAAA;AAAU,oBAAA,KAAA;AAAO,oBAAA;iBAAoB,GACtC;AAAC,oBAAA,QAAA;AAAU,oBAAA,KAAA;AAAO,oBAAA;AAAW,iBAAA;AACrC,YAAA,CAAA,MAAO,IAAIL,kBAAAA,KAAuB,KAAA,IAASA,kBAAAA,KAAuB,MAAA,EAAQ;gBACxEI,OAAAA,GAAU;AAAC,oBAAA,QAAA;AAAU,oBAAA,KAAA;AAAO,oBAAA;AAAW,iBAAA;YACzC,CAAA,MAAO;gBACL,IAAI,CAACE,MAAM,CAACC,IAAI,CAAC,CAAC,6BAA6B,EAAEP,kBAAAA,CAAAA,CAAoB,CAAA;gBACrE,OAAOjC,SAAAA;AACT,YAAA;AAEA,YAAA,MAAM,EAAEwB,MAAM,EAAE,GAAG,MAAMC,MAAMQ,kBAAAA,EAAoB;AAAII,gBAAAA,GAAAA;aAAQ,EAAE;gBAAEX,OAAAA,EAAS;AAAO,aAAA,CAAA;YACnF,OAAO,IAAI,CAACI,uBAAuB,CAACN,MAAAA,CAAAA;AACtC,QAAA,CAAA,CAAE,OAAOiB,KAAAA,EAAO;AACd,YAAA,IAAI,CAACF,MAAM,CAACC,IAAI,CAAC,uDAAA,CAAA;YACjB,OAAOxC,SAAAA;AACT,QAAA;AACF,IAAA;AAEA,IAAA,MAAc0C,oBAAAA,GAAwC;AACpD,QAAA,IAAIhD,OAAAA,CAAQC,GAAG,CAACgD,gBAAgB,EAAE;AAChC,YAAA,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,CAAC,wBAAwB,EAAElD,OAAAA,CAAQC,GAAG,CAACgD,gBAAgB,CAAA,CAAE,CAAA;AAC3E,YAAA,OAAOjD,QAAQC,GAAG,CAACgD,gBAAgB,CAACE,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AACrD,QAAA;AAEA,QAAA,MAAMC,sBAAAA,GAAyB,MAAM,IAAI,CAACd,6BAA6B,EAAA;AACvE,QAAA,IAAIc,sBAAAA,EAAwB;YAC1B,IAAI,CAACP,MAAM,CAACK,KAAK,CAAC,CAAC,gCAAgC,EAAEE,sBAAAA,CAAAA,CAAwB,CAAA;YAC7E,OAAOA,sBAAAA,CAAuBD,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AAC/C,QAAA;QAEA,IAAI,CAACN,MAAM,CAACK,KAAK,CAAC,CAAC,wBAAwB,EAAEG,0BAA0B,CAAA,CAAE,CAAA;AACzE,QAAA,OAAOA,0BAA0B,CAACF,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AACnD,IAAA;AAEAG,IAAAA,WAAAA,CAAYhC,OAAuB,EAAiC;QAClE,MAAMT,QAAAA,GAAW,IAAI,CAACC,iBAAiB,EAAA;QAEvC,OAAOD,QAAAA,CAAS0C,IAAI,CAAC,CAACC,UAAAA,GAAe7B,SAAO8B,EAAE,CAACD,UAAAA,CAAWlC,OAAO,EAAEA,OAAAA,CAAAA,CAAAA;AACrE,IAAA;AAEA,IAAA,MAAMoC,OAAAA,GAAU;AACd,QAAA,MAAMC,UAAAA,GAAa,CAAA,EAAG,MAAM,IAAI,CAACX,oBAAoB,EAAA,CAAG,CAAC,EAAE,IAAI,CAACY,IAAI,CAAA,CAAE;QAEtE,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMH,UAAAA,EAAY;;YAEvCI,UAAAA,EAAY3D;AACd,SAAA,CAAA;;AAGAO,QAAAA,MAAAA,CAAOkD,SAASG,EAAE,EAAE,CAAC,mBAAmB,EAAEL,UAAAA,CAAAA,CAAY,CAAA;AAEtD,QAAA,IAAI,CAAClD,UAAU,GAAI,MAAMoD,SAASI,IAAI,EAAA;AAEtC,QAAA,OAAO,IAAI;AACb,IAAA;AAEAC,IAAAA,aAAAA,CAAc5C,OAAuB,EAAE;AACrC,QAAA,OAAO,IAAI,CAACgC,WAAW,CAAChC,OAAAA,CAAAA,KAAahB,SAAAA;AACvC,IAAA;AApIA,IAAA,WAAA,CAAYsD,IAAY,EAAElB,GAAW,EAAEG,MAAc,CAAE;QACrD,IAAI,CAACe,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAAClB,GAAG,GAAGA,GAAAA;QACX,IAAI,CAACG,MAAM,GAAGA,MAAAA;QACd,IAAI,CAACpC,UAAU,GAAG,IAAA;AACpB,IAAA;AAgIF;AAEO,MAAM0D,iBAAAA,GAAoB,CAACP,IAAAA,EAAclB,GAAAA,EAAaG,SAC3D,IAAItC,OAAAA,CAAQqD,IAAAA,EAAMlB,GAAAA,EAAKG,MAAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"package.js","sources":["../../../../src/modules/npm/package.ts"],"sourcesContent":["import assert from 'node:assert';\nimport semver from 'semver';\nimport execa from 'execa';\nimport { packageManager } from '@strapi/utils';\n\nimport { ProxyAgent } from 'undici';\nimport * as constants from './constants';\nimport { isLiteralSemVer } from '../version';\n\nimport type { Package as PackageInterface, NPMPackage, NPMPackageVersion } from './types';\nimport type { Version } from '../version';\nimport { Logger } from '../logger';\n\nconst proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;\nconst agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;\n\nexport class Package implements PackageInterface {\n name: string;\n\n cwd: string;\n\n private logger: Logger;\n\n private npmPackage: NPMPackage | null;\n\n constructor(name: string, cwd: string, logger: Logger) {\n this.name = name;\n this.cwd = cwd;\n this.logger = logger;\n this.npmPackage = null;\n }\n\n get isLoaded() {\n return this.npmPackage !== null;\n }\n\n private assertPackageIsLoaded(npmPackage: NPMPackage | null): asserts npmPackage is NPMPackage {\n assert(this.isLoaded, 'The package is not loaded yet');\n }\n\n getVersionsDict() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return this.npmPackage.versions;\n }\n\n getVersionsAsList() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return Object.values(this.npmPackage.versions);\n }\n\n findVersionsInRange(range: Version.Range) {\n const versions = this.getVersionsAsList();\n\n return (\n versions\n // Only select versions matching the upgrade range\n .filter((v) => range.test(v.version))\n // Only select supported version format (x.x.x)\n .filter((v) => isLiteralSemVer(v.version))\n // Sort in ascending order\n .sort((v1, v2) => semver.compare(v1.version, v2.version))\n );\n }\n\n private async getYarnMajorVersion(): Promise<number> {\n try {\n const { stdout } = await execa('yarn', ['--version'], { timeout: 5_000 });\n const version = stdout.trim();\n return parseInt(version.split('.')[0], 10);\n } catch {\n // Default to Yarn Berry (v2+) if version check fails\n return 2;\n }\n }\n\n private normalizeRegistryOutput(stdout: string): string | undefined {\n const registry = stdout.trim();\n\n // Yarn Classic (v1) may return literal \"undefined\" for unset config values\n if (!registry || registry === 'undefined') {\n return undefined;\n }\n\n return registry;\n }\n\n private async getRegistryFromPackageManager(): Promise<string | undefined> {\n try {\n const packageManagerName = await packageManager.getPreferred(this.cwd);\n if (!packageManagerName) return undefined;\n\n let command: readonly string[];\n\n if (packageManagerName === 'yarn') {\n const yarnMajorVersion = await this.getYarnMajorVersion();\n // Yarn Classic (v1) uses 'registry', Yarn Berry (v2+) uses 'npmRegistryServer'\n command =\n yarnMajorVersion >= 2\n ? ['config', 'get', 'npmRegistryServer']\n : ['config', 'get', 'registry'];\n } else if (packageManagerName === 'npm' || packageManagerName === 'pnpm') {\n command = ['config', 'get', 'registry'];\n } else {\n this.logger.warn(`Unsupported package manager: ${packageManagerName}`);\n return undefined;\n }\n\n const { stdout } = await execa(packageManagerName, [...command], { timeout: 10_000 });\n return this.normalizeRegistryOutput(stdout);\n } catch (error) {\n this.logger.warn('Failed to determine registry URL from package manager');\n return undefined;\n }\n }\n\n private async determineRegistryUrl(): Promise<string> {\n if (process.env.NPM_REGISTRY_URL) {\n this.logger.debug(`Using NPM_REGISTRY_URL: ${process.env.NPM_REGISTRY_URL}`);\n return process.env.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n const packageManagerRegistry = await this.getRegistryFromPackageManager();\n if (packageManagerRegistry) {\n this.logger.debug(`Using package manager registry: ${packageManagerRegistry}`);\n return packageManagerRegistry.replace(/\\/$/, '');\n }\n\n this.logger.debug(`Using default registry: ${constants.NPM_REGISTRY_URL}`);\n return constants.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n findVersion(version: Version.SemVer): NPMPackageVersion | undefined {\n const versions = this.getVersionsAsList();\n\n return versions.find((npmVersion) => semver.eq(npmVersion.version, version));\n }\n\n async refresh() {\n const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;\n\n const response = await fetch(packageURL, {\n // @ts-expect-error Node.js fetch supports dispatcher (undici extension)\n dispatcher: agent,\n });\n\n // TODO: Use a validation library to make sure the response structure is correct\n assert(response.ok, `Request failed for ${packageURL}`);\n\n this.npmPackage = (await response.json()) as NPMPackage;\n\n return this;\n }\n\n versionExists(version: Version.SemVer) {\n return this.findVersion(version) !== undefined;\n }\n}\n\nexport const npmPackageFactory = (name: string, cwd: string, logger: Logger) =>\n new Package(name, cwd, logger);\n"],"names":["proxyUrl","process","env","HTTP_PROXY","HTTPS_PROXY","agent","ProxyAgent","undefined","Package","isLoaded","npmPackage","assertPackageIsLoaded","assert","getVersionsDict","versions","getVersionsAsList","Object","values","findVersionsInRange","range","filter","v","test","version","isLiteralSemVer","sort","v1","v2","semver","compare","getYarnMajorVersion","stdout","execa","timeout","trim","parseInt","split","normalizeRegistryOutput","registry","getRegistryFromPackageManager","packageManagerName","packageManager","getPreferred","cwd","command","yarnMajorVersion","logger","warn","error","determineRegistryUrl","NPM_REGISTRY_URL","debug","replace","packageManagerRegistry","constants","findVersion","find","npmVersion","eq","refresh","packageURL","name","response","fetch","dispatcher","ok","json","versionExists","npmPackageFactory"],"mappings":";;;;;;;;;;;;;;;;AAaA,MAAMA,QAAAA,GAAWC,QAAQC,GAAG,CAACC,UAAU,IAAIF,OAAAA,CAAQC,GAAG,CAACE,WAAW;AAClE,MAAMC,KAAAA,GAAQL,QAAAA,GAAW,IAAIM,iBAAAA,CAAWN,QAAAA,CAAAA,GAAYO,SAAAA;AAE7C,MAAMC,OAAAA,CAAAA;AAgBX,IAAA,IAAIC,QAAAA,GAAW;QACb,OAAO,IAAI,CAACC,UAAU,KAAK,IAAA;AAC7B,IAAA;AAEQC,IAAAA,qBAAAA,CAAsBD,UAA6B,EAAoC;QAC7FE,uBAAAA,CAAO,IAAI,CAACH,QAAQ,EAAE,+BAAA,CAAA;AACxB,IAAA;IAEAI,eAAAA,GAAkB;AAChB,QAAA,IAAI,CAACF,qBAAqB,CAAC,IAAI,CAACD,UAAU,CAAA;AAE1C,QAAA,OAAO,IAAI,CAACA,UAAU,CAACI,QAAQ;AACjC,IAAA;IAEAC,iBAAAA,GAAoB;AAClB,QAAA,IAAI,CAACJ,qBAAqB,CAAC,IAAI,CAACD,UAAU,CAAA;AAE1C,QAAA,OAAOM,OAAOC,MAAM,CAAC,IAAI,CAACP,UAAU,CAACI,QAAQ,CAAA;AAC/C,IAAA;AAEAI,IAAAA,mBAAAA,CAAoBC,KAAoB,EAAE;QACxC,MAAML,QAAAA,GAAW,IAAI,CAACC,iBAAiB,EAAA;AAEvC,QAAA,OACED,QACE;SACCM,MAAM,CAAC,CAACC,CAAAA,GAAMF,KAAAA,CAAMG,IAAI,CAACD,CAAAA,CAAEE,OAAO,CAAA,CACnC;AACCH,SAAAA,MAAM,CAAC,CAACC,CAAAA,GAAMG,uBAAgBH,CAAAA,CAAEE,OAAO,EACxC;SACCE,IAAI,CAAC,CAACC,EAAAA,EAAIC,EAAAA,GAAOC,uBAAAA,CAAOC,OAAO,CAACH,EAAAA,CAAGH,OAAO,EAAEI,EAAAA,CAAGJ,OAAO,CAAA,CAAA;AAE7D,IAAA;AAEA,IAAA,MAAcO,mBAAAA,GAAuC;QACnD,IAAI;AACF,YAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,uBAAM,MAAA,EAAQ;AAAC,gBAAA;aAAY,EAAE;gBAAEC,OAAAA,EAAS;AAAM,aAAA,CAAA;YACvE,MAAMV,OAAAA,GAAUQ,OAAOG,IAAI,EAAA;AAC3B,YAAA,OAAOC,SAASZ,OAAAA,CAAQa,KAAK,CAAC,GAAA,CAAI,CAAC,EAAE,EAAE,EAAA,CAAA;AACzC,QAAA,CAAA,CAAE,OAAM;;YAEN,OAAO,CAAA;AACT,QAAA;AACF,IAAA;AAEQC,IAAAA,uBAAAA,CAAwBN,MAAc,EAAsB;QAClE,MAAMO,QAAAA,GAAWP,OAAOG,IAAI,EAAA;;QAG5B,IAAI,CAACI,QAAAA,IAAYA,QAAAA,KAAa,WAAA,EAAa;YACzC,OAAO/B,SAAAA;AACT,QAAA;QAEA,OAAO+B,QAAAA;AACT,IAAA;AAEA,IAAA,MAAcC,6BAAAA,GAA6D;QACzE,IAAI;AACF,YAAA,MAAMC,qBAAqB,MAAMC,oBAAAA,CAAeC,YAAY,CAAC,IAAI,CAACC,GAAG,CAAA;YACrE,IAAI,CAACH,oBAAoB,OAAOjC,SAAAA;YAEhC,IAAIqC,OAAAA;AAEJ,YAAA,IAAIJ,uBAAuB,MAAA,EAAQ;AACjC,gBAAA,MAAMK,gBAAAA,GAAmB,MAAM,IAAI,CAACf,mBAAmB,EAAA;;AAEvDc,gBAAAA,OAAAA,GACEC,oBAAoB,CAAA,GAChB;AAAC,oBAAA,QAAA;AAAU,oBAAA,KAAA;AAAO,oBAAA;iBAAoB,GACtC;AAAC,oBAAA,QAAA;AAAU,oBAAA,KAAA;AAAO,oBAAA;AAAW,iBAAA;AACrC,YAAA,CAAA,MAAO,IAAIL,kBAAAA,KAAuB,KAAA,IAASA,kBAAAA,KAAuB,MAAA,EAAQ;gBACxEI,OAAAA,GAAU;AAAC,oBAAA,QAAA;AAAU,oBAAA,KAAA;AAAO,oBAAA;AAAW,iBAAA;YACzC,CAAA,MAAO;gBACL,IAAI,CAACE,MAAM,CAACC,IAAI,CAAC,CAAC,6BAA6B,EAAEP,kBAAAA,CAAAA,CAAoB,CAAA;gBACrE,OAAOjC,SAAAA;AACT,YAAA;AAEA,YAAA,MAAM,EAAEwB,MAAM,EAAE,GAAG,MAAMC,uBAAMQ,kBAAAA,EAAoB;AAAII,gBAAAA,GAAAA;aAAQ,EAAE;gBAAEX,OAAAA,EAAS;AAAO,aAAA,CAAA;YACnF,OAAO,IAAI,CAACI,uBAAuB,CAACN,MAAAA,CAAAA;AACtC,QAAA,CAAA,CAAE,OAAOiB,KAAAA,EAAO;AACd,YAAA,IAAI,CAACF,MAAM,CAACC,IAAI,CAAC,uDAAA,CAAA;YACjB,OAAOxC,SAAAA;AACT,QAAA;AACF,IAAA;AAEA,IAAA,MAAc0C,oBAAAA,GAAwC;AACpD,QAAA,IAAIhD,OAAAA,CAAQC,GAAG,CAACgD,gBAAgB,EAAE;AAChC,YAAA,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,CAAC,wBAAwB,EAAElD,OAAAA,CAAQC,GAAG,CAACgD,gBAAgB,CAAA,CAAE,CAAA;AAC3E,YAAA,OAAOjD,QAAQC,GAAG,CAACgD,gBAAgB,CAACE,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AACrD,QAAA;AAEA,QAAA,MAAMC,sBAAAA,GAAyB,MAAM,IAAI,CAACd,6BAA6B,EAAA;AACvE,QAAA,IAAIc,sBAAAA,EAAwB;YAC1B,IAAI,CAACP,MAAM,CAACK,KAAK,CAAC,CAAC,gCAAgC,EAAEE,sBAAAA,CAAAA,CAAwB,CAAA;YAC7E,OAAOA,sBAAAA,CAAuBD,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AAC/C,QAAA;QAEA,IAAI,CAACN,MAAM,CAACK,KAAK,CAAC,CAAC,wBAAwB,EAAEG,0BAA0B,CAAA,CAAE,CAAA;AACzE,QAAA,OAAOA,0BAA0B,CAACF,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AACnD,IAAA;AAEAG,IAAAA,WAAAA,CAAYhC,OAAuB,EAAiC;QAClE,MAAMT,QAAAA,GAAW,IAAI,CAACC,iBAAiB,EAAA;QAEvC,OAAOD,QAAAA,CAAS0C,IAAI,CAAC,CAACC,UAAAA,GAAe7B,wBAAO8B,EAAE,CAACD,UAAAA,CAAWlC,OAAO,EAAEA,OAAAA,CAAAA,CAAAA;AACrE,IAAA;AAEA,IAAA,MAAMoC,OAAAA,GAAU;AACd,QAAA,MAAMC,UAAAA,GAAa,CAAA,EAAG,MAAM,IAAI,CAACX,oBAAoB,EAAA,CAAG,CAAC,EAAE,IAAI,CAACY,IAAI,CAAA,CAAE;QAEtE,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMH,UAAAA,EAAY;;YAEvCI,UAAAA,EAAY3D;AACd,SAAA,CAAA;;AAGAO,QAAAA,uBAAAA,CAAOkD,SAASG,EAAE,EAAE,CAAC,mBAAmB,EAAEL,UAAAA,CAAAA,CAAY,CAAA;AAEtD,QAAA,IAAI,CAAClD,UAAU,GAAI,MAAMoD,SAASI,IAAI,EAAA;AAEtC,QAAA,OAAO,IAAI;AACb,IAAA;AAEAC,IAAAA,aAAAA,CAAc5C,OAAuB,EAAE;AACrC,QAAA,OAAO,IAAI,CAACgC,WAAW,CAAChC,OAAAA,CAAAA,KAAahB,SAAAA;AACvC,IAAA;AApIA,IAAA,WAAA,CAAYsD,IAAY,EAAElB,GAAW,EAAEG,MAAc,CAAE;QACrD,IAAI,CAACe,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAAClB,GAAG,GAAGA,GAAAA;QACX,IAAI,CAACG,MAAM,GAAGA,MAAAA;QACd,IAAI,CAACpC,UAAU,GAAG,IAAA;AACpB,IAAA;AAgIF;AAEO,MAAM0D,iBAAAA,GAAoB,CAACP,IAAAA,EAAclB,GAAAA,EAAaG,SAC3D,IAAItC,OAAAA,CAAQqD,IAAAA,EAAMlB,GAAAA,EAAKG,MAAAA;;;;;"}
|