@mxpicture/build-api 0.3.18 → 0.3.20
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/imp/MissingImports.d.ts +19 -0
- package/dist/imp/MissingImports.d.ts.map +1 -0
- package/dist/imp/MissingImports.js +69 -0
- package/dist/imp/MissingImports.js.map +1 -0
- package/dist/imp/index.d.ts +2 -0
- package/dist/imp/index.d.ts.map +1 -0
- package/dist/imp/index.js +3 -0
- package/dist/imp/index.js.map +1 -0
- package/dist/pkg/UpdatePackages.d.ts +9 -7
- package/dist/pkg/UpdatePackages.d.ts.map +1 -1
- package/dist/pkg/UpdatePackages.js +33 -26
- package/dist/pkg/UpdatePackages.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export type VirtualFiles = Record<string, string>;
|
|
3
|
+
export declare class MissingImports {
|
|
4
|
+
readonly tsconfigPath: string;
|
|
5
|
+
protected readonly virtualFiles: VirtualFiles;
|
|
6
|
+
protected _configFile: {
|
|
7
|
+
config?: any;
|
|
8
|
+
error?: ts.Diagnostic;
|
|
9
|
+
} | null;
|
|
10
|
+
constructor(tsconfigPath: string, virtualFiles: VirtualFiles);
|
|
11
|
+
get missingNames(): Record<string, string[]>;
|
|
12
|
+
protected get service(): ts.LanguageService;
|
|
13
|
+
protected get configFile(): {
|
|
14
|
+
config?: any;
|
|
15
|
+
error?: ts.Diagnostic;
|
|
16
|
+
};
|
|
17
|
+
protected get serviceHost(): ts.LanguageServiceHost;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=MissingImports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissingImports.d.ts","sourceRoot":"","sources":["../../src/imp/MissingImports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,qBAAa,cAAc;aAQP,YAAY,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;IAR/C,SAAS,CAAC,WAAW,EAAE;QAErB,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;KACvB,GAAG,IAAI,CAAQ;gBAGE,YAAY,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY;IAG/C,IAAW,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAmBlD;IAED,SAAS,KAAK,OAAO,IAAI,EAAE,CAAC,eAAe,CAK1C;IAED,SAAS,KAAK,UAAU;iBArCb,GAAG;gBACJ,EAAE,CAAC,UAAU;MAkDtB;IAED,SAAS,KAAK,WAAW,IAAI,EAAE,CAAC,mBAAmB,CAmClD;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import { cwd } from "node:process";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
export class MissingImports {
|
|
5
|
+
tsconfigPath;
|
|
6
|
+
virtualFiles;
|
|
7
|
+
_configFile = null;
|
|
8
|
+
constructor(tsconfigPath, virtualFiles) {
|
|
9
|
+
this.tsconfigPath = tsconfigPath;
|
|
10
|
+
this.virtualFiles = virtualFiles;
|
|
11
|
+
}
|
|
12
|
+
get missingNames() {
|
|
13
|
+
const result = {};
|
|
14
|
+
for (const fileName of Object.keys(this.virtualFiles)) {
|
|
15
|
+
const diagnostics = this.service.getSemanticDiagnostics(fileName);
|
|
16
|
+
const missing = new Set();
|
|
17
|
+
for (const diag of diagnostics) {
|
|
18
|
+
if (diag.code !== 2304 || diag.start === undefined)
|
|
19
|
+
continue;
|
|
20
|
+
const source = this.virtualFiles[fileName];
|
|
21
|
+
const text = source.slice(diag.start, diag.start + (diag.length || 0));
|
|
22
|
+
if (text)
|
|
23
|
+
missing.add(text);
|
|
24
|
+
}
|
|
25
|
+
if (missing.size > 0)
|
|
26
|
+
result[fileName] = Array.from(missing);
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
get service() {
|
|
31
|
+
return ts.createLanguageService(this.serviceHost, ts.createDocumentRegistry());
|
|
32
|
+
}
|
|
33
|
+
get configFile() {
|
|
34
|
+
if (!this._configFile || this._configFile.error) {
|
|
35
|
+
this._configFile = ts.readConfigFile(this.tsconfigPath, ts.sys.readFile);
|
|
36
|
+
if (this._configFile.error)
|
|
37
|
+
throw new Error(ts.flattenDiagnosticMessageText(this._configFile.error.messageText, "\n"));
|
|
38
|
+
}
|
|
39
|
+
return this._configFile;
|
|
40
|
+
}
|
|
41
|
+
get serviceHost() {
|
|
42
|
+
const parsed = ts.parseJsonConfigFileContent(this.configFile.config, ts.sys, dirname(this.tsconfigPath));
|
|
43
|
+
const allFileNames = new Set([
|
|
44
|
+
...parsed.fileNames,
|
|
45
|
+
...Object.keys(this.virtualFiles),
|
|
46
|
+
]);
|
|
47
|
+
const fileVersions = new Map();
|
|
48
|
+
for (const f of allFileNames)
|
|
49
|
+
fileVersions.set(f, 0);
|
|
50
|
+
return {
|
|
51
|
+
getScriptFileNames: () => Array.from(allFileNames),
|
|
52
|
+
getScriptVersion: (fileName) => fileVersions.get(fileName)?.toString() ?? "0",
|
|
53
|
+
getScriptSnapshot: (fileName) => {
|
|
54
|
+
if (this.virtualFiles[fileName])
|
|
55
|
+
return ts.ScriptSnapshot.fromString(this.virtualFiles[fileName]);
|
|
56
|
+
if (!ts.sys.fileExists(fileName))
|
|
57
|
+
return undefined;
|
|
58
|
+
return ts.ScriptSnapshot.fromString(ts.sys.readFile(fileName) || "");
|
|
59
|
+
},
|
|
60
|
+
getCurrentDirectory: () => cwd(),
|
|
61
|
+
getCompilationSettings: () => parsed.options,
|
|
62
|
+
getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),
|
|
63
|
+
fileExists: (fileName) => fileName in this.virtualFiles || ts.sys.fileExists(fileName),
|
|
64
|
+
readFile: (fileName) => this.virtualFiles[fileName] ?? ts.sys.readFile(fileName),
|
|
65
|
+
readDirectory: ts.sys.readDirectory,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=MissingImports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissingImports.js","sourceRoot":"","sources":["../../src/imp/MissingImports.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport ts from \"typescript\";\n\nexport type VirtualFiles = Record<string, string>;\n\nexport class MissingImports {\n protected _configFile: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config?: any;\n error?: ts.Diagnostic;\n } | null = null;\n\n public constructor(\n public readonly tsconfigPath: string,\n protected readonly virtualFiles: VirtualFiles,\n ) {}\n\n public get missingNames(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const fileName of Object.keys(this.virtualFiles)) {\n const diagnostics = this.service.getSemanticDiagnostics(fileName);\n\n const missing = new Set<string>();\n\n for (const diag of diagnostics) {\n if (diag.code !== 2304 || diag.start === undefined) continue;\n const source = this.virtualFiles[fileName];\n const text = source.slice(diag.start, diag.start + (diag.length || 0));\n if (text) missing.add(text);\n }\n\n if (missing.size > 0) result[fileName] = Array.from(missing);\n }\n\n return result;\n }\n\n protected get service(): ts.LanguageService {\n return ts.createLanguageService(\n this.serviceHost,\n ts.createDocumentRegistry(),\n );\n }\n\n protected get configFile() {\n if (!this._configFile || this._configFile.error) {\n this._configFile = ts.readConfigFile(this.tsconfigPath, ts.sys.readFile);\n\n if (this._configFile.error)\n throw new Error(\n ts.flattenDiagnosticMessageText(\n this._configFile.error.messageText,\n \"\\n\",\n ),\n );\n }\n\n return this._configFile;\n }\n\n protected get serviceHost(): ts.LanguageServiceHost {\n const parsed = ts.parseJsonConfigFileContent(\n this.configFile.config,\n ts.sys,\n dirname(this.tsconfigPath),\n );\n\n const allFileNames = new Set([\n ...parsed.fileNames,\n ...Object.keys(this.virtualFiles),\n ]);\n\n const fileVersions = new Map<string, number>();\n for (const f of allFileNames) fileVersions.set(f, 0);\n\n return {\n getScriptFileNames: () => Array.from(allFileNames),\n getScriptVersion: (fileName) =>\n fileVersions.get(fileName)?.toString() ?? \"0\",\n getScriptSnapshot: (fileName) => {\n if (this.virtualFiles[fileName])\n return ts.ScriptSnapshot.fromString(this.virtualFiles[fileName]);\n\n if (!ts.sys.fileExists(fileName)) return undefined;\n return ts.ScriptSnapshot.fromString(ts.sys.readFile(fileName) || \"\");\n },\n getCurrentDirectory: () => cwd(),\n getCompilationSettings: () => parsed.options,\n getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),\n fileExists: (fileName) =>\n fileName in this.virtualFiles || ts.sys.fileExists(fileName),\n readFile: (fileName) =>\n this.virtualFiles[fileName] ?? ts.sys.readFile(fileName),\n readDirectory: ts.sys.readDirectory,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/imp/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/imp/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,cAAc,qBAAqB,CAAC","sourcesContent":["// This file is auto-generated for build-cli. Do not edit manually.\nexport * from \"./MissingImports.js\";\n"]}
|
|
@@ -22,14 +22,14 @@ export declare const runUpdatePackages: (params: UpdatePackagesParams) => Promis
|
|
|
22
22
|
* 5. Verify that all workspaces converge on the same version for each package.
|
|
23
23
|
*/
|
|
24
24
|
export declare class UpdatePackages {
|
|
25
|
-
protected readonly
|
|
26
|
-
protected
|
|
25
|
+
protected readonly patterns: string[];
|
|
26
|
+
protected readonly patternsWoSlash: string[];
|
|
27
27
|
/**
|
|
28
28
|
* Creates a new UpdatePackages instance.
|
|
29
29
|
*
|
|
30
|
-
* @param
|
|
30
|
+
* @param patterns - An array of glob pattern used to match dependency names (e.g. `"@angular/*"`).
|
|
31
31
|
*/
|
|
32
|
-
constructor(
|
|
32
|
+
constructor(...patterns: string[]);
|
|
33
33
|
/**
|
|
34
34
|
* Executes the full package-update pipeline.
|
|
35
35
|
*
|
|
@@ -43,12 +43,14 @@ export declare class UpdatePackages {
|
|
|
43
43
|
run(): Promise<void>;
|
|
44
44
|
protected exec(command: string): Promise<string>;
|
|
45
45
|
protected getPackages(): Promise<Set<string>>;
|
|
46
|
-
protected filterPackages(wsPackages: PackageJson[]):
|
|
47
|
-
protected filterPackage(wsPackage: PackageJson):
|
|
48
|
-
protected filterPackageDep(deps: Record<string, string> | undefined):
|
|
46
|
+
protected filterPackages(wsPackages: PackageJson[]): string[];
|
|
47
|
+
protected filterPackage(wsPackage: PackageJson): string[];
|
|
48
|
+
protected filterPackageDep(deps: Record<string, string> | undefined): string[];
|
|
49
49
|
protected updatePackages(packages: Set<string>): Promise<void>;
|
|
50
50
|
protected deduplicate(): Promise<void>;
|
|
51
51
|
protected rmOldVersions(): Promise<void>;
|
|
52
52
|
protected verifyPackages(): Promise<void>;
|
|
53
|
+
protected match(text: string): boolean;
|
|
54
|
+
protected matchWoSlash(text: string): boolean;
|
|
53
55
|
}
|
|
54
56
|
//# sourceMappingURL=UpdatePackages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdatePackages.d.ts","sourceRoot":"","sources":["../../src/pkg/UpdatePackages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAMnC;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAU,QAAQ,oBAAoB,kBAInE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"UpdatePackages.d.ts","sourceRoot":"","sources":["../../src/pkg/UpdatePackages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAMnC;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAU,QAAQ,oBAAoB,kBAInE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IACzB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAE7C;;;;OAIG;gBACgB,GAAG,QAAQ,EAAE,MAAM,EAAE;IAKxC;;;;;;;;;OASG;IACU,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;cA0BjB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAetC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAWnD,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE;IAI7D,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,EAAE;IAOzD,SAAS,CAAC,gBAAgB,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GACvC,MAAM,EAAE;cAIK,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;cAMpD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;cAK5B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;cAwD9B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD/C,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAK9C"}
|
|
@@ -15,8 +15,7 @@ import { initWorkspace, workspace } from "../workspace/Workspace.js";
|
|
|
15
15
|
export const runUpdatePackages = async (params) => {
|
|
16
16
|
initWorkspace(params.repoRoot);
|
|
17
17
|
// in sequence to avoid locks
|
|
18
|
-
|
|
19
|
-
await new UpdatePackages(pat).run();
|
|
18
|
+
await new UpdatePackages(...params.pattern).run();
|
|
20
19
|
};
|
|
21
20
|
/**
|
|
22
21
|
* Bulk-updates dependencies matching a glob pattern across all workspace packages.
|
|
@@ -30,16 +29,16 @@ export const runUpdatePackages = async (params) => {
|
|
|
30
29
|
* 5. Verify that all workspaces converge on the same version for each package.
|
|
31
30
|
*/
|
|
32
31
|
export class UpdatePackages {
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
patterns;
|
|
33
|
+
patternsWoSlash;
|
|
35
34
|
/**
|
|
36
35
|
* Creates a new UpdatePackages instance.
|
|
37
36
|
*
|
|
38
|
-
* @param
|
|
37
|
+
* @param patterns - An array of glob pattern used to match dependency names (e.g. `"@angular/*"`).
|
|
39
38
|
*/
|
|
40
|
-
constructor(
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
39
|
+
constructor(...patterns) {
|
|
40
|
+
this.patterns = patterns;
|
|
41
|
+
this.patternsWoSlash = patterns.map((pat) => pat.replaceAll("/", "+"));
|
|
43
42
|
}
|
|
44
43
|
/**
|
|
45
44
|
* Executes the full package-update pipeline.
|
|
@@ -52,14 +51,14 @@ export class UpdatePackages {
|
|
|
52
51
|
* @returns A promise that resolves when the pipeline completes successfully.
|
|
53
52
|
*/
|
|
54
53
|
async run() {
|
|
55
|
-
logInfo(`🚀 Starting ${this.
|
|
54
|
+
logInfo(`🚀 Starting ${this.patterns.join(", ")} packages update process...\n`);
|
|
56
55
|
// Step 1: Find all packages
|
|
57
56
|
const packages = await this.getPackages();
|
|
58
|
-
logInfo(`📦 Found ${this.
|
|
57
|
+
logInfo(`📦 Found ${this.patterns.join(", ")} packages:`);
|
|
59
58
|
for (const pkg of packages)
|
|
60
59
|
logInfo(` - ${pkg}`);
|
|
61
60
|
if (packages.size === 0)
|
|
62
|
-
return logSuccess(`✅ No ${this.
|
|
61
|
+
return logSuccess(`✅ No ${this.patterns.join(", ")} packages found.`);
|
|
63
62
|
// Step 2: Update packages in all workspaces recursively
|
|
64
63
|
await this.updatePackages(packages);
|
|
65
64
|
// Step 3: Deduplicate dependencies
|
|
@@ -86,7 +85,7 @@ export class UpdatePackages {
|
|
|
86
85
|
const ws = workspace();
|
|
87
86
|
await ws.read();
|
|
88
87
|
const pkgs = [...ws.packages, ws.rootPackage];
|
|
89
|
-
const packageNames =
|
|
88
|
+
const packageNames = this.filterPackages(pkgs.map((p) => p.content));
|
|
90
89
|
return new Set(packageNames);
|
|
91
90
|
}
|
|
92
91
|
filterPackages(wsPackages) {
|
|
@@ -96,10 +95,10 @@ export class UpdatePackages {
|
|
|
96
95
|
return [
|
|
97
96
|
this.filterPackageDep(wsPackage.dependencies),
|
|
98
97
|
this.filterPackageDep(wsPackage.devDependencies),
|
|
99
|
-
];
|
|
98
|
+
].flat();
|
|
100
99
|
}
|
|
101
|
-
|
|
102
|
-
return
|
|
100
|
+
filterPackageDep(deps) {
|
|
101
|
+
return Object.keys(deps ?? []).filter((depName) => this.match(depName));
|
|
103
102
|
}
|
|
104
103
|
async updatePackages(packages) {
|
|
105
104
|
logInfo("\n📥 Updating packages across all workspaces...");
|
|
@@ -112,8 +111,10 @@ export class UpdatePackages {
|
|
|
112
111
|
}
|
|
113
112
|
async rmOldVersions() {
|
|
114
113
|
logInfo("\n🧹 Checking for old versions...");
|
|
115
|
-
const
|
|
116
|
-
|
|
114
|
+
const versionDirs = (await Promise.all(this.patternsWoSlash.map(async (pat) => {
|
|
115
|
+
const oldVersions = await this.exec(`find node_modules/.pnpm -type d -name "${pat}" -depth 1 2>/dev/null || true`);
|
|
116
|
+
return oldVersions.trim().split("\n").filter(Boolean);
|
|
117
|
+
}))).flat();
|
|
117
118
|
// Group by package name to identify duplicates
|
|
118
119
|
const packageVersions = new Map();
|
|
119
120
|
for (const dir of versionDirs) {
|
|
@@ -121,7 +122,7 @@ export class UpdatePackages {
|
|
|
121
122
|
if (!match)
|
|
122
123
|
continue;
|
|
123
124
|
const [, pkgName, version] = match;
|
|
124
|
-
if (!
|
|
125
|
+
if (!this.matchWoSlash(pkgName))
|
|
125
126
|
continue;
|
|
126
127
|
const key = pkgName.replace(/\+/g, "/");
|
|
127
128
|
if (!packageVersions.has(key))
|
|
@@ -150,18 +151,18 @@ export class UpdatePackages {
|
|
|
150
151
|
}
|
|
151
152
|
async verifyPackages() {
|
|
152
153
|
logSuccess("\n✅ Verifying package versions...");
|
|
153
|
-
const listOutput = await this.exec(`pnpm list ${this.
|
|
154
|
+
const listOutput = await this.exec(`pnpm list ${this.patterns.join(" ")} --depth=0 -r --json`);
|
|
154
155
|
const workspaces = JSON.parse(listOutput);
|
|
155
156
|
const versionMap = new Map();
|
|
156
157
|
for (const workspace of workspaces) {
|
|
157
158
|
const deps = workspace.dependencies ?? {};
|
|
158
159
|
for (const [pkg, info] of Object.entries(deps)) {
|
|
159
|
-
if (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
if (!this.match(pkg))
|
|
161
|
+
continue;
|
|
162
|
+
if (!versionMap.has(pkg))
|
|
163
|
+
versionMap.set(pkg, new Map());
|
|
164
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
165
|
+
versionMap.get(pkg).set(workspace.name, info.version);
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
let allConsistent = true;
|
|
@@ -180,9 +181,15 @@ export class UpdatePackages {
|
|
|
180
181
|
console.error("\n❌ Version inconsistencies detected! Please review and fix manually.");
|
|
181
182
|
process.exit(1);
|
|
182
183
|
}
|
|
183
|
-
logInfo(`\n🎉 All ${this.
|
|
184
|
+
logInfo(`\n🎉 All ${this.patterns.join(", ")} packages updated successfully!`);
|
|
184
185
|
logInfo("\n💡 Tip: Restart your TypeScript server in VS Code to pick up the new types.");
|
|
185
186
|
logInfo(' - Cmd+Shift+P → "TypeScript: Restart TS Server"');
|
|
186
187
|
}
|
|
188
|
+
match(text) {
|
|
189
|
+
return !!this.patterns.find((pattern) => micromatch.isMatch(text, pattern));
|
|
190
|
+
}
|
|
191
|
+
matchWoSlash(text) {
|
|
192
|
+
return !!this.patternsWoSlash.find((pattern) => micromatch.isMatch(text, pattern));
|
|
193
|
+
}
|
|
187
194
|
}
|
|
188
195
|
//# sourceMappingURL=UpdatePackages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdatePackages.js","sourceRoot":"","sources":["../../src/pkg/UpdatePackages.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PackageJson,\n UpdatePackagesParams,\n} from \"../types/types.package.js\";\nimport { logInfo, logSuccess } from \"../logger/Logger.js\";\nimport { execAsync } from \"../common/common.fs.js\";\nimport micromatch from \"micromatch\";\nimport { initWorkspace, workspace } from \"../workspace/Workspace.js\";\n\n/**\n * Initializes the workspace and runs the package-update workflow.\n *\n * @remarks\n * This is a convenience entry point that constructs an {@link UpdatePackages} instance\n * and immediately invokes its {@link UpdatePackages.run} method.\n *\n * @param params - Configuration for the update, including the repo root and a glob pattern to select packages.\n * @returns A promise that resolves when all matching packages have been updated and verified.\n */\nexport const runUpdatePackages = async (params: UpdatePackagesParams) => {\n initWorkspace(params.repoRoot);\n // in sequence to avoid locks\n for (const pat of params.pattern) await new UpdatePackages(pat).run();\n};\n\n/**\n * Bulk-updates dependencies matching a glob pattern across all workspace packages.\n *\n * @remarks\n * The update pipeline performs five sequential steps:\n * 1. Discover matching dependencies across every workspace package.\n * 2. Run `pnpm update -r --latest` for the matched packages.\n * 3. Deduplicate the dependency tree with `pnpm dedupe`.\n * 4. Remove stale duplicate versions from `node_modules/.pnpm`.\n * 5. Verify that all workspaces converge on the same version for each package.\n */\nexport class UpdatePackages {\n protected patternWoSlash: string;\n\n /**\n * Creates a new UpdatePackages instance.\n *\n * @param pattern - A glob pattern used to match dependency names (e.g. `\"@angular/*\"`).\n */\n public constructor(protected readonly pattern: string) {\n this.patternWoSlash = pattern.replaceAll(\"/\", \"+\");\n }\n\n /**\n * Executes the full package-update pipeline.\n *\n * @remarks\n * Discovers matching packages, updates them, deduplicates, cleans old versions,\n * and verifies consistency. Exits the process with code 1 if version\n * inconsistencies are detected after the update.\n *\n * @returns A promise that resolves when the pipeline completes successfully.\n */\n public async run(): Promise<void> {\n logInfo(`🚀 Starting ${this.pattern} packages update process...\\n`);\n\n // Step 1: Find all packages\n const packages = await this.getPackages();\n logInfo(`📦 Found ${this.pattern} packages:`);\n for (const pkg of packages) logInfo(` - ${pkg}`);\n\n if (packages.size === 0)\n return logSuccess(`✅ No ${this.pattern} packages found.`);\n\n // Step 2: Update packages in all workspaces recursively\n await this.updatePackages(packages);\n\n // Step 3: Deduplicate dependencies\n await this.deduplicate();\n\n // Step 4: Remove old versions from node_modules\n await this.rmOldVersions();\n\n // Step 5: Verify all packages are at the same version\n await this.verifyPackages();\n }\n\n protected async exec(command: string): Promise<string> {\n console.log(`\\n▶ ${command}`);\n try {\n return (\n await execAsync(command, {\n cwd: workspace().repoRoot,\n encoding: \"utf-8\",\n })\n ).stdout;\n } catch (error) {\n console.error(`Error executing: ${command}`);\n throw error;\n }\n }\n\n protected async getPackages(): Promise<Set<string>> {\n const ws = workspace();\n await ws.read();\n const pkgs = [...ws.packages, ws.rootPackage];\n const packageNames: string[] = (\n await Promise.all(this.filterPackages(pkgs.map((p) => p.content)))\n ).flat();\n\n return new Set<string>(packageNames);\n }\n\n protected filterPackages(wsPackages: PackageJson[]): Promise<string[]>[] {\n return wsPackages.flatMap((wsPackage) => this.filterPackage(wsPackage));\n }\n\n protected filterPackage(wsPackage: PackageJson): Promise<string[]>[] {\n return [\n this.filterPackageDep(wsPackage.dependencies),\n this.filterPackageDep(wsPackage.devDependencies),\n ];\n }\n\n protected async filterPackageDep(\n deps: Record<string, string> | undefined,\n ): Promise<string[]> {\n return Promise.resolve(\n Object.keys(deps ?? []).filter((depName) =>\n micromatch.isMatch(depName, this.pattern),\n ),\n );\n }\n\n protected async updatePackages(packages: Set<string>): Promise<void> {\n logInfo(\"\\n📥 Updating packages across all workspaces...\");\n const packageList = Array.from(packages).join(\" \");\n await this.exec(`pnpm update -r --latest ${packageList}`);\n }\n\n protected async deduplicate(): Promise<void> {\n logInfo(\"\\n🔧 Deduplicating dependencies...\");\n await this.exec(\"pnpm dedupe\");\n }\n\n protected async rmOldVersions(): Promise<void> {\n logInfo(\"\\n🧹 Checking for old versions...\");\n const oldVersions = await this.exec(\n `find node_modules/.pnpm -type d -name \"${this.patternWoSlash}\" -depth 1 2>/dev/null || true`,\n );\n const versionDirs = oldVersions.trim().split(\"\\n\").filter(Boolean);\n\n // Group by package name to identify duplicates\n const packageVersions = new Map<\n string,\n { versions: string[]; dirs: string[] }\n >();\n for (const dir of versionDirs) {\n const match = dir.match(/\\/(@?[a-z-+]+)@(.+)$/);\n if (!match) continue;\n const [, pkgName, version] = match;\n if (!micromatch.isMatch(pkgName, this.patternWoSlash)) continue;\n const key = pkgName.replace(/\\+/g, \"/\");\n if (!packageVersions.has(key))\n packageVersions.set(key, { versions: [], dirs: [] });\n const entry = packageVersions.get(key)!;\n entry.versions.push(version.split(\"_\")[0]); // Remove peer dep suffixes\n entry.dirs.push(dir);\n }\n\n // Collect only directories for packages that have duplicates\n const dirsToRemove: string[] = [];\n for (const [pkg, { versions, dirs }] of packageVersions) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length <= 1) continue;\n logInfo(\n `⚠️ Multiple versions found for ${pkg}:`,\n uniqueVersions.join(\", \"),\n );\n dirsToRemove.push(...dirs);\n }\n\n if (dirsToRemove.length > 0) {\n logInfo(\"\\n🔨 Removing duplicate version directories...\");\n logInfo(\" This ensures TypeScript loads the correct types.\");\n // Remove only the specific duplicate directories, not all of node_modules\n await Promise.all(\n dirsToRemove.map((dir) => this.exec(`rm -rf '${dir}'`)),\n );\n // Fast reinstall — only needs to recreate symlinks for removed packages\n await this.exec(\"pnpm install\");\n }\n }\n\n protected async verifyPackages(): Promise<void> {\n logSuccess(\"\\n✅ Verifying package versions...\");\n const listOutput = await this.exec(\n `pnpm list ${this.pattern} --depth=0 -r --json`,\n );\n const workspaces = JSON.parse(listOutput);\n\n const versionMap = new Map<string, Map<string, string>>();\n\n for (const workspace of workspaces) {\n const deps = workspace.dependencies ?? {};\n for (const [pkg, info] of Object.entries(deps)) {\n if (micromatch.isMatch(pkg, this.pattern)) {\n if (!versionMap.has(pkg)) versionMap.set(pkg, new Map());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n versionMap.get(pkg)!.set(workspace.name, (info as any).version);\n }\n }\n }\n\n let allConsistent = true;\n for (const [pkg, versions] of versionMap) {\n const uniqueVersions = new Set(versions.values());\n if (uniqueVersions.size <= 1) {\n logSuccess(`✅ ${pkg}: ${[...uniqueVersions][0]}`);\n continue;\n }\n\n logInfo(`❌ Inconsistent versions for ${pkg}:`);\n for (const [workspace, version] of versions)\n logInfo(` - ${workspace}: ${version}`);\n\n allConsistent = false;\n }\n\n if (!allConsistent) {\n console.error(\n \"\\n❌ Version inconsistencies detected! Please review and fix manually.\",\n );\n process.exit(1);\n }\n\n logInfo(`\\n🎉 All ${this.pattern} packages updated successfully!`);\n logInfo(\n \"\\n💡 Tip: Restart your TypeScript server in VS Code to pick up the new types.\",\n );\n logInfo(' - Cmd+Shift+P → \"TypeScript: Restart TS Server\"');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UpdatePackages.js","sourceRoot":"","sources":["../../src/pkg/UpdatePackages.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PackageJson,\n UpdatePackagesParams,\n} from \"../types/types.package.js\";\nimport { logInfo, logSuccess } from \"../logger/Logger.js\";\nimport { execAsync } from \"../common/common.fs.js\";\nimport micromatch from \"micromatch\";\nimport { initWorkspace, workspace } from \"../workspace/Workspace.js\";\n\n/**\n * Initializes the workspace and runs the package-update workflow.\n *\n * @remarks\n * This is a convenience entry point that constructs an {@link UpdatePackages} instance\n * and immediately invokes its {@link UpdatePackages.run} method.\n *\n * @param params - Configuration for the update, including the repo root and a glob pattern to select packages.\n * @returns A promise that resolves when all matching packages have been updated and verified.\n */\nexport const runUpdatePackages = async (params: UpdatePackagesParams) => {\n initWorkspace(params.repoRoot);\n // in sequence to avoid locks\n await new UpdatePackages(...params.pattern).run();\n};\n\n/**\n * Bulk-updates dependencies matching a glob pattern across all workspace packages.\n *\n * @remarks\n * The update pipeline performs five sequential steps:\n * 1. Discover matching dependencies across every workspace package.\n * 2. Run `pnpm update -r --latest` for the matched packages.\n * 3. Deduplicate the dependency tree with `pnpm dedupe`.\n * 4. Remove stale duplicate versions from `node_modules/.pnpm`.\n * 5. Verify that all workspaces converge on the same version for each package.\n */\nexport class UpdatePackages {\n protected readonly patterns: string[];\n protected readonly patternsWoSlash: string[];\n\n /**\n * Creates a new UpdatePackages instance.\n *\n * @param patterns - An array of glob pattern used to match dependency names (e.g. `\"@angular/*\"`).\n */\n public constructor(...patterns: string[]) {\n this.patterns = patterns;\n this.patternsWoSlash = patterns.map((pat) => pat.replaceAll(\"/\", \"+\"));\n }\n\n /**\n * Executes the full package-update pipeline.\n *\n * @remarks\n * Discovers matching packages, updates them, deduplicates, cleans old versions,\n * and verifies consistency. Exits the process with code 1 if version\n * inconsistencies are detected after the update.\n *\n * @returns A promise that resolves when the pipeline completes successfully.\n */\n public async run(): Promise<void> {\n logInfo(\n `🚀 Starting ${this.patterns.join(\", \")} packages update process...\\n`,\n );\n\n // Step 1: Find all packages\n const packages = await this.getPackages();\n logInfo(`📦 Found ${this.patterns.join(\", \")} packages:`);\n for (const pkg of packages) logInfo(` - ${pkg}`);\n\n if (packages.size === 0)\n return logSuccess(`✅ No ${this.patterns.join(\", \")} packages found.`);\n\n // Step 2: Update packages in all workspaces recursively\n await this.updatePackages(packages);\n\n // Step 3: Deduplicate dependencies\n await this.deduplicate();\n\n // Step 4: Remove old versions from node_modules\n await this.rmOldVersions();\n\n // Step 5: Verify all packages are at the same version\n await this.verifyPackages();\n }\n\n protected async exec(command: string): Promise<string> {\n console.log(`\\n▶ ${command}`);\n try {\n return (\n await execAsync(command, {\n cwd: workspace().repoRoot,\n encoding: \"utf-8\",\n })\n ).stdout;\n } catch (error) {\n console.error(`Error executing: ${command}`);\n throw error;\n }\n }\n\n protected async getPackages(): Promise<Set<string>> {\n const ws = workspace();\n await ws.read();\n const pkgs = [...ws.packages, ws.rootPackage];\n const packageNames: string[] = this.filterPackages(\n pkgs.map((p) => p.content),\n );\n\n return new Set<string>(packageNames);\n }\n\n protected filterPackages(wsPackages: PackageJson[]): string[] {\n return wsPackages.flatMap((wsPackage) => this.filterPackage(wsPackage));\n }\n\n protected filterPackage(wsPackage: PackageJson): string[] {\n return [\n this.filterPackageDep(wsPackage.dependencies),\n this.filterPackageDep(wsPackage.devDependencies),\n ].flat();\n }\n\n protected filterPackageDep(\n deps: Record<string, string> | undefined,\n ): string[] {\n return Object.keys(deps ?? []).filter((depName) => this.match(depName));\n }\n\n protected async updatePackages(packages: Set<string>): Promise<void> {\n logInfo(\"\\n📥 Updating packages across all workspaces...\");\n const packageList = Array.from(packages).join(\" \");\n await this.exec(`pnpm update -r --latest ${packageList}`);\n }\n\n protected async deduplicate(): Promise<void> {\n logInfo(\"\\n🔧 Deduplicating dependencies...\");\n await this.exec(\"pnpm dedupe\");\n }\n\n protected async rmOldVersions(): Promise<void> {\n logInfo(\"\\n🧹 Checking for old versions...\");\n\n const versionDirs = (\n await Promise.all(\n this.patternsWoSlash.map(async (pat) => {\n const oldVersions = await this.exec(\n `find node_modules/.pnpm -type d -name \"${pat}\" -depth 1 2>/dev/null || true`,\n );\n return oldVersions.trim().split(\"\\n\").filter(Boolean);\n }),\n )\n ).flat();\n\n // Group by package name to identify duplicates\n const packageVersions = new Map<\n string,\n { versions: string[]; dirs: string[] }\n >();\n for (const dir of versionDirs) {\n const match = dir.match(/\\/(@?[a-z-+]+)@(.+)$/);\n if (!match) continue;\n const [, pkgName, version] = match;\n if (!this.matchWoSlash(pkgName)) continue;\n const key = pkgName.replace(/\\+/g, \"/\");\n if (!packageVersions.has(key))\n packageVersions.set(key, { versions: [], dirs: [] });\n const entry = packageVersions.get(key)!;\n entry.versions.push(version.split(\"_\")[0]); // Remove peer dep suffixes\n entry.dirs.push(dir);\n }\n\n // Collect only directories for packages that have duplicates\n const dirsToRemove: string[] = [];\n for (const [pkg, { versions, dirs }] of packageVersions) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length <= 1) continue;\n logInfo(\n `⚠️ Multiple versions found for ${pkg}:`,\n uniqueVersions.join(\", \"),\n );\n dirsToRemove.push(...dirs);\n }\n\n if (dirsToRemove.length > 0) {\n logInfo(\"\\n🔨 Removing duplicate version directories...\");\n logInfo(\" This ensures TypeScript loads the correct types.\");\n // Remove only the specific duplicate directories, not all of node_modules\n await Promise.all(\n dirsToRemove.map((dir) => this.exec(`rm -rf '${dir}'`)),\n );\n // Fast reinstall — only needs to recreate symlinks for removed packages\n await this.exec(\"pnpm install\");\n }\n }\n\n protected async verifyPackages(): Promise<void> {\n logSuccess(\"\\n✅ Verifying package versions...\");\n const listOutput = await this.exec(\n `pnpm list ${this.patterns.join(\" \")} --depth=0 -r --json`,\n );\n const workspaces = JSON.parse(listOutput);\n\n const versionMap = new Map<string, Map<string, string>>();\n\n for (const workspace of workspaces) {\n const deps = workspace.dependencies ?? {};\n for (const [pkg, info] of Object.entries(deps)) {\n if (!this.match(pkg)) continue;\n\n if (!versionMap.has(pkg)) versionMap.set(pkg, new Map());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n versionMap.get(pkg)!.set(workspace.name, (info as any).version);\n }\n }\n\n let allConsistent = true;\n for (const [pkg, versions] of versionMap) {\n const uniqueVersions = new Set(versions.values());\n if (uniqueVersions.size <= 1) {\n logSuccess(`✅ ${pkg}: ${[...uniqueVersions][0]}`);\n continue;\n }\n\n logInfo(`❌ Inconsistent versions for ${pkg}:`);\n for (const [workspace, version] of versions)\n logInfo(` - ${workspace}: ${version}`);\n\n allConsistent = false;\n }\n\n if (!allConsistent) {\n console.error(\n \"\\n❌ Version inconsistencies detected! Please review and fix manually.\",\n );\n process.exit(1);\n }\n\n logInfo(\n `\\n🎉 All ${this.patterns.join(\", \")} packages updated successfully!`,\n );\n logInfo(\n \"\\n💡 Tip: Restart your TypeScript server in VS Code to pick up the new types.\",\n );\n logInfo(' - Cmd+Shift+P → \"TypeScript: Restart TS Server\"');\n }\n\n protected match(text: string): boolean {\n return !!this.patterns.find((pattern) => micromatch.isMatch(text, pattern));\n }\n\n protected matchWoSlash(text: string): boolean {\n return !!this.patternsWoSlash.find((pattern) =>\n micromatch.isMatch(text, pattern),\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mxpicture/build-api",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.20",
|
|
4
4
|
"description": "Build utilities API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "MXPicture",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"./enum": "./dist/enum/index.js",
|
|
19
19
|
"./exp": "./dist/exp/index.js",
|
|
20
20
|
"./git": "./dist/git/index.js",
|
|
21
|
+
"./imp": "./dist/imp/index.js",
|
|
21
22
|
"./logger": "./dist/logger/index.js",
|
|
22
23
|
"./npmPublish": "./dist/npmPublish/index.js",
|
|
23
24
|
"./osInfo": "./dist/osInfo/index.js",
|