@mxpicture/build-api 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/barrel/Barrel.d.ts +15 -0
  2. package/dist/barrel/Barrel.js +136 -0
  3. package/dist/barrel/index.d.ts +1 -0
  4. package/dist/barrel/index.js +2 -0
  5. package/dist/cleanup/Cleanup.d.ts +24 -0
  6. package/dist/cleanup/Cleanup.js +83 -0
  7. package/dist/cleanup/index.d.ts +1 -0
  8. package/dist/cleanup/index.js +2 -0
  9. package/dist/deps/FixWorkspaceDeps.d.ts +30 -0
  10. package/dist/deps/FixWorkspaceDeps.js +121 -0
  11. package/dist/deps/index.d.ts +1 -0
  12. package/dist/deps/index.js +2 -0
  13. package/dist/osInfo/index.d.ts +1 -0
  14. package/dist/osInfo/index.js +2 -0
  15. package/dist/osInfo/osInfo.common.d.ts +4 -0
  16. package/dist/osInfo/osInfo.common.js +56 -0
  17. package/dist/pkg/Pkg.d.ts +7 -0
  18. package/dist/pkg/Pkg.js +13 -0
  19. package/dist/pkg/index.d.ts +2 -0
  20. package/dist/pkg/index.js +3 -0
  21. package/dist/pkg/pkg.common.d.ts +5 -0
  22. package/dist/pkg/pkg.common.js +41 -0
  23. package/dist/scripts/fix-workspace-deps.d.ts +2 -0
  24. package/dist/scripts/fix-workspace-deps.js +16 -0
  25. package/dist/types/index.d.ts +7 -0
  26. package/dist/types/index.js +8 -0
  27. package/dist/types/types.barrel.d.ts +11 -0
  28. package/dist/types/types.barrel.js +1 -0
  29. package/dist/types/types.cleanup.d.ts +8 -0
  30. package/dist/types/types.cleanup.js +1 -0
  31. package/dist/types/types.common.d.ts +25 -0
  32. package/dist/types/types.common.js +1 -0
  33. package/dist/types/types.deps.d.ts +8 -0
  34. package/dist/types/types.deps.js +10 -0
  35. package/dist/types/types.os.d.ts +7 -0
  36. package/dist/types/types.os.js +1 -0
  37. package/dist/types/types.package.d.ts +27 -0
  38. package/dist/types/types.package.js +1 -0
  39. package/dist/types/types.vscode.d.ts +36 -0
  40. package/dist/types/types.vscode.js +1 -0
  41. package/dist/types/types.workspace.d.ts +27 -0
  42. package/dist/types/types.workspace.js +6 -0
  43. package/dist/vscode/OSUser.d.ts +9 -0
  44. package/dist/vscode/OSUser.js +62 -0
  45. package/dist/vscode/VSCodeSettings.d.ts +10 -0
  46. package/dist/vscode/VSCodeSettings.js +41 -0
  47. package/dist/vscode/VSCodeWorkspace.d.ts +9 -0
  48. package/dist/vscode/VSCodeWorkspace.js +29 -0
  49. package/dist/vscode/common.vscode.d.ts +21 -0
  50. package/dist/vscode/common.vscode.js +65 -0
  51. package/dist/vscode/config.vscode.d.ts +2 -0
  52. package/dist/vscode/config.vscode.js +4 -0
  53. package/dist/vscode/index.d.ts +5 -0
  54. package/dist/vscode/index.js +6 -0
  55. package/dist/vscode/profiles.vscode.d.ts +5 -0
  56. package/dist/vscode/profiles.vscode.js +29 -0
  57. package/dist/vscode/storage.vscode.d.ts +3 -0
  58. package/dist/vscode/storage.vscode.js +15 -0
  59. package/dist/vscode/types.vscode.d.ts +37 -0
  60. package/dist/vscode/types.vscode.js +6 -0
  61. package/dist/vscode/vscode.config.d.ts +2 -0
  62. package/dist/vscode/vscode.config.js +4 -0
  63. package/dist/vscode/vscode.profiles.d.ts +5 -0
  64. package/dist/vscode/vscode.profiles.js +30 -0
  65. package/dist/vscode/vscode.settings.d.ts +3 -0
  66. package/dist/vscode/vscode.settings.js +26 -0
  67. package/dist/vscode/vscode.storage.d.ts +3 -0
  68. package/dist/vscode/vscode.storage.js +15 -0
  69. package/dist/vscode/vscode.workspace.d.ts +3 -0
  70. package/dist/vscode/vscode.workspace.js +14 -0
  71. package/dist/vscode/workspace.vscode.d.ts +11 -0
  72. package/dist/vscode/workspace.vscode.js +149 -0
  73. package/dist/workspace/IFixWorkspaceDeps.d.ts +22 -0
  74. package/dist/workspace/IFixWorkspaceDeps.js +118 -0
  75. package/dist/workspace/WorkspacePaths.d.ts +7 -0
  76. package/dist/workspace/WorkspacePaths.js +30 -0
  77. package/dist/workspace/fixWorkspaceDeps.d.ts +22 -0
  78. package/dist/workspace/fixWorkspaceDeps.js +118 -0
  79. package/dist/workspace/index.d.ts +2 -0
  80. package/dist/workspace/index.js +3 -0
  81. package/dist/workspace/workspace.common.d.ts +13 -0
  82. package/dist/workspace/workspace.common.js +152 -0
  83. package/dist/zod/index.d.ts +1 -0
  84. package/dist/zod/index.js +2 -0
  85. package/dist/zod/zod.package.d.ts +9 -0
  86. package/dist/zod/zod.package.js +8 -0
  87. package/package.json +45 -0
@@ -0,0 +1,3 @@
1
+ import { VSCodeWorkspace } from "../types/types.vscode.js";
2
+ export declare const vscodeWorkspace: (workspaceFile: string) => Promise<VSCodeWorkspace>;
3
+ export declare const vscodeWorkspaceRoot: (workspaceFile: string) => string;
@@ -0,0 +1,14 @@
1
+ import { readFile } from "fs/promises";
2
+ import pkg from "json5";
3
+ import { dirname } from "path";
4
+ const __workspaces = {};
5
+ export const vscodeWorkspace = async (workspaceFile) => {
6
+ let found = __workspaces[workspaceFile];
7
+ if (!found) {
8
+ const raw = await readFile(workspaceFile, "utf-8");
9
+ found = pkg.parse(raw);
10
+ __workspaces[workspaceFile] = found;
11
+ }
12
+ return { ...found };
13
+ };
14
+ export const vscodeWorkspaceRoot = (workspaceFile) => dirname(workspaceFile);
@@ -0,0 +1,11 @@
1
+ import { WorkspaceFile } from "./types.vscode.js";
2
+ import { MapEntry, PackageEntry, PackageJson, PnpmWorkspace } from "../types/types.common.js";
3
+ export declare const findWorkspaceRoot: (startPath?: string) => Promise<WorkspaceFile>;
4
+ export declare const readWorkspaceYaml: (repoRoot: string) => Promise<PnpmWorkspace>;
5
+ export declare const readPackageJson: (dirOrFilepath: string) => Promise<PackageJson | null>;
6
+ export declare const readPackageJsonThrow: (dirOrFilepath: string) => Promise<PackageJson>;
7
+ export declare const readPackageJsons: (repoRoot: string) => Promise<PackageEntry[]>;
8
+ export declare const writePackageJsons: (entries: PackageEntry[]) => Promise<void[]>;
9
+ export declare const buildMapEntries: (pkgEntries: PackageEntry[]) => MapEntry[];
10
+ export declare const readPackageVersions: (rootDir: string) => Promise<Record<string, string>>;
11
+ export declare const readMinPackageVersion: (rootDir: string) => Promise<string | null>;
@@ -0,0 +1,149 @@
1
+ import { dirname, join, relative, resolve } from "path";
2
+ import { parse } from "yaml";
3
+ import { fileURLToPath } from "url";
4
+ import pkg from "json5";
5
+ import { WorkspaceFileType } from "./types.vscode.js";
6
+ import { compareVersions, concatVersion, getFileType, splitVersion, } from "./common.vscode.js";
7
+ import { readdir, readFile, writeFile } from "fs/promises";
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ let __workspaceRoot = null;
10
+ export const findWorkspaceRoot = async (startPath) => {
11
+ if (__workspaceRoot)
12
+ return __workspaceRoot;
13
+ let path = startPath ?? __dirname;
14
+ let level = 0;
15
+ const promises = [];
16
+ while (path.length > 0) {
17
+ promises.push((async () => {
18
+ const l = level;
19
+ const entries = await readdir(path, { withFileTypes: true });
20
+ let pkg = null;
21
+ for (const entry of entries) {
22
+ if (!entry.isFile())
23
+ continue;
24
+ const type = getFileType(entry.name);
25
+ if (type === WorkspaceFileType.workspace)
26
+ return {
27
+ filePath: join(path, entry.name),
28
+ dirPath: path,
29
+ filename: entry.name,
30
+ level: l,
31
+ type,
32
+ };
33
+ if (!pkg && type === WorkspaceFileType.package)
34
+ pkg = {
35
+ filePath: join(path, entry.name),
36
+ dirPath: path,
37
+ filename: entry.name,
38
+ level: l,
39
+ type,
40
+ };
41
+ }
42
+ if (!pkg)
43
+ throw new Error("");
44
+ return pkg;
45
+ })());
46
+ level++;
47
+ path = path.replace(/\/?[^\/]+\/?$/, ""); // remove last dir
48
+ }
49
+ const results = (await Promise.allSettled(promises)).filter((r) => r.status === "fulfilled");
50
+ results.sort((a, b) => a.value.level - b.value.level);
51
+ const result = results.find((r) => r.value.type === WorkspaceFileType.workspace)?.value &&
52
+ results.find((r) => r.value.type === WorkspaceFileType.package)?.value;
53
+ if (!result)
54
+ throw new Error("findWorkspaceRoot: no file found");
55
+ __workspaceRoot = result;
56
+ return result;
57
+ };
58
+ export const readWorkspaceYaml = async (repoRoot) => {
59
+ const workspaceFilePath = resolve(repoRoot, "pnpm-workspace.yaml");
60
+ const fileContent = await readFile(workspaceFilePath, "utf8");
61
+ const parsed = parse(fileContent);
62
+ if (!parsed || !parsed.packages || !Array.isArray(parsed.packages))
63
+ throw new Error("No 'packages' field found in pnpm-workspace.yaml");
64
+ const packageColletions = await Promise.all(parsed.packages.map(async (p) => {
65
+ if (!p.endsWith("/*"))
66
+ return [p];
67
+ const base = p.substring(0, p.length - 2);
68
+ const pkgs = await readdir(join(repoRoot, base));
69
+ return pkgs
70
+ .filter((pkg) => !pkg.startsWith("."))
71
+ .map((pkg) => join(base, pkg));
72
+ }));
73
+ const packages = [];
74
+ for (const packageColletion of packageColletions)
75
+ packages.push(...packageColletion);
76
+ return { packages };
77
+ };
78
+ export const readPackageJson = async (dirOrFilepath) => {
79
+ try {
80
+ return readPackageJsonThrow(dirOrFilepath);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ };
86
+ export const readPackageJsonThrow = async (dirOrFilepath) => {
87
+ const pkgPath = dirOrFilepath.endsWith("/package.json")
88
+ ? dirOrFilepath
89
+ : join(dirOrFilepath, "package.json");
90
+ return pkg.parse(await readFile(pkgPath, "utf8"));
91
+ };
92
+ export const readPackageJsons = async (repoRoot) => {
93
+ try {
94
+ const pnpmWS = await readWorkspaceYaml(repoRoot);
95
+ return Promise.all(pnpmWS.packages.map(async (repoPath) => {
96
+ const jsonPath = join(repoRoot, repoPath, "package.json");
97
+ const content = await readPackageJsonThrow(jsonPath);
98
+ return {
99
+ jsonPath,
100
+ repoPath,
101
+ content,
102
+ modified: false,
103
+ wsName: repoPath.startsWith("packages/")
104
+ ? repoPath.substring(9)
105
+ : repoPath,
106
+ };
107
+ }));
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ };
113
+ export const writePackageJsons = async (entries) => Promise.all(entries.map(async (entry) => {
114
+ if (entry.modified) {
115
+ await writeFile(entry.jsonPath, JSON.stringify(entry.content, null, 2) + "\n", "utf8");
116
+ console.log(` ✅ Updated ${entry.content.name}\n`);
117
+ }
118
+ else {
119
+ console.log(` ⏭️ No workspace dependencies to fix. ${entry.content.name}\n`);
120
+ }
121
+ }));
122
+ // Build a map of package names to their versions
123
+ export const buildMapEntries = (pkgEntries) => {
124
+ const versionEntries = [];
125
+ for (const fromPkg of pkgEntries)
126
+ for (const toPkg of pkgEntries)
127
+ if (fromPkg.content.name !== toPkg.content.name)
128
+ versionEntries.push({
129
+ fromPkg,
130
+ toPkg,
131
+ relPath: relative(fromPkg.repoPath, toPkg.repoPath),
132
+ });
133
+ return versionEntries;
134
+ };
135
+ export const readPackageVersions = async (rootDir) => {
136
+ const versions = {};
137
+ const packageJsons = await readPackageJsons(rootDir);
138
+ for (const packageJson of packageJsons)
139
+ versions[packageJson.repoPath] = packageJson.content.version;
140
+ return versions;
141
+ };
142
+ export const readMinPackageVersion = async (rootDir) => {
143
+ const versions = await readPackageVersions(rootDir);
144
+ const splitVersions = Object.values(versions).map(splitVersion);
145
+ if (splitVersions.length === 0)
146
+ return null;
147
+ splitVersions.sort(compareVersions);
148
+ return concatVersion(splitVersions[0]);
149
+ };
@@ -0,0 +1,22 @@
1
+ import { ProcessMode } from "../types/types.vscode.js";
2
+ import { FixWorkspaceDepsMain, FixWorkspaceDepsParams } from "../types/types.workspace.js";
3
+ export declare const runFixDepsByVersion: (repoRoot: string, mode: ProcessMode) => Promise<void>;
4
+ export declare const runFixDepsByFile: (repoRoot: string, mode: ProcessMode) => Promise<void>;
5
+ export declare abstract class IFixWorkspaceDeps {
6
+ readonly repoRoot: string;
7
+ readonly mode: ProcessMode;
8
+ constructor(repoRoot: string, mode: ProcessMode);
9
+ protected abstract fixVersion(p: FixWorkspaceDepsParams): string | null;
10
+ protected abstract restoreVersion(p: FixWorkspaceDepsParams): string | null;
11
+ run(): Promise<void>;
12
+ protected handleDependencies(deps: Record<string, string> | undefined, p: FixWorkspaceDepsMain): boolean;
13
+ protected runSingle(p: FixWorkspaceDepsMain): boolean;
14
+ }
15
+ export declare class FixWorkspaceDepsVersion extends IFixWorkspaceDeps {
16
+ protected fixVersion(p: FixWorkspaceDepsParams): string | null;
17
+ protected restoreVersion(p: FixWorkspaceDepsParams): string | null;
18
+ }
19
+ export declare class FixWorkspaceDepsFile extends IFixWorkspaceDeps {
20
+ protected fixVersion(p: FixWorkspaceDepsParams): string | null;
21
+ protected restoreVersion(p: FixWorkspaceDepsParams): string | null;
22
+ }
@@ -0,0 +1,118 @@
1
+ import { buildMapEntries, readPackageJsons, writePackageJsons, } from "./workspace.common.js";
2
+ export const runFixDepsByVersion = async (repoRoot, mode) => new FixWorkspaceDepsVersion(repoRoot, mode).run();
3
+ export const runFixDepsByFile = async (repoRoot, mode) => new FixWorkspaceDepsFile(repoRoot, mode).run();
4
+ export class IFixWorkspaceDeps {
5
+ repoRoot;
6
+ mode;
7
+ constructor(repoRoot, mode) {
8
+ this.repoRoot = repoRoot;
9
+ this.mode = mode;
10
+ }
11
+ async run() {
12
+ if (this.mode === "fix")
13
+ console.log("🔧 Fixing workspace dependencies...\n");
14
+ else
15
+ console.log("🔧 Restoring workspace dependencies...\n");
16
+ const pkgs = await readPackageJsons(this.repoRoot);
17
+ const mapEntries = buildMapEntries(pkgs);
18
+ const versionMap = new Map();
19
+ const workspacePackages = new Set();
20
+ for (const pkg of pkgs) {
21
+ versionMap.set(pkg.content.name, pkg.content.version);
22
+ workspacePackages.add(pkg.content.name);
23
+ }
24
+ console.log("📋 Version map:");
25
+ for (const map of mapEntries)
26
+ console.log(` ${map.fromPkg.content.name} --> ${map.toPkg.content.name}: ${map.relPath}`);
27
+ console.log();
28
+ for (const consumingPkg of pkgs) {
29
+ console.log(`📦 Processing ${consumingPkg.content.name}...`);
30
+ try {
31
+ consumingPkg.modified = this.runSingle({
32
+ consumingPkg,
33
+ mapEntries,
34
+ versionMap,
35
+ workspacePackages,
36
+ });
37
+ }
38
+ catch (err) {
39
+ console.error(`\nError processing ${consumingPkg.content.name}:`, err);
40
+ throw err;
41
+ }
42
+ }
43
+ await writePackageJsons(pkgs);
44
+ if (this.mode === "fix")
45
+ console.log("✅ Done fixing workspace dependencies!");
46
+ else
47
+ console.log("✅ Done restoring workspace dependencies!");
48
+ }
49
+ // Replace workspace:* with file:...
50
+ handleDependencies(deps, p) {
51
+ if (!deps)
52
+ return false;
53
+ const handler = this.mode === "fix" ? this.fixVersion : this.restoreVersion;
54
+ let modified = false;
55
+ for (const [name, version] of Object.entries(deps)) {
56
+ const newVersion = handler({ ...p, pkg: name, version });
57
+ if (!newVersion)
58
+ continue;
59
+ console.log(` ✓ Replaced ${name}: ${version} → ${newVersion}`);
60
+ deps[name] = newVersion;
61
+ modified = true;
62
+ }
63
+ return modified;
64
+ }
65
+ runSingle(p) {
66
+ let modified = false;
67
+ modified =
68
+ this.handleDependencies(p.consumingPkg.content.dependencies, p) ||
69
+ modified;
70
+ modified =
71
+ this.handleDependencies(p.consumingPkg.content.devDependencies, p) ||
72
+ modified;
73
+ modified =
74
+ this.handleDependencies(p.consumingPkg.content.peerDependencies, p) ||
75
+ modified;
76
+ return modified;
77
+ }
78
+ }
79
+ export class FixWorkspaceDepsVersion extends IFixWorkspaceDeps {
80
+ fixVersion(p) {
81
+ if (p.version !== "workspace:*")
82
+ return null;
83
+ const actualVersion = p.versionMap.get(p.pkg);
84
+ if (!actualVersion) {
85
+ console.error(` ERROR: Could not find version for workspace dependency ${p.pkg}`);
86
+ throw new Error(`Cannot resolve workspace dependency: ${p.pkg}`);
87
+ }
88
+ return `^${actualVersion}`;
89
+ }
90
+ restoreVersion(p) {
91
+ if (p.workspacePackages.has(p.pkg) && p.version.startsWith("^")) {
92
+ // Verify the version matches what fix script would have created
93
+ const actualVersion = p.versionMap.get(p.pkg);
94
+ if (actualVersion && p.version === `^${actualVersion}`) {
95
+ return "workspace:*";
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ }
101
+ export class FixWorkspaceDepsFile extends IFixWorkspaceDeps {
102
+ fixVersion(p) {
103
+ if (p.version !== "workspace:*")
104
+ return null;
105
+ const mapEntry = p.mapEntries.find((mapEntry) => mapEntry.fromPkg.content.name === p.consumingPkg.content.name &&
106
+ mapEntry.toPkg.content.name === p.pkg);
107
+ if (!mapEntry) {
108
+ console.error(` ERROR: Could not find version for workspace dependency ${p.pkg}`);
109
+ throw new Error(`Cannot resolve workspace dependency: ${p.pkg}`);
110
+ }
111
+ return `file:${mapEntry.relPath}`;
112
+ }
113
+ restoreVersion(p) {
114
+ if (!p.version.startsWith("file:"))
115
+ return null;
116
+ return "workspace:*";
117
+ }
118
+ }
@@ -0,0 +1,7 @@
1
+ export declare class WorkspacePaths {
2
+ readonly repoRoot: string;
3
+ readonly workspacesDir: string;
4
+ static instance(repoRoot: string, workspacesName?: string): WorkspacePaths;
5
+ private constructor();
6
+ workspaceByPath(path: string): Promise<string | null>;
7
+ }
@@ -0,0 +1,30 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { join, relative, sep } from "node:path";
3
+ const __instances = {};
4
+ export class WorkspacePaths {
5
+ repoRoot;
6
+ workspacesDir;
7
+ static instance(repoRoot, workspacesName = "packages") {
8
+ const workspacesDir = join(repoRoot, workspacesName);
9
+ if (!__instances[workspacesDir])
10
+ __instances[workspacesDir] = new WorkspacePaths(repoRoot, workspacesDir);
11
+ return __instances[workspacesDir];
12
+ }
13
+ constructor(repoRoot, workspacesDir) {
14
+ this.repoRoot = repoRoot;
15
+ this.workspacesDir = workspacesDir;
16
+ }
17
+ async workspaceByPath(path) {
18
+ try {
19
+ const pkgPath = relative(this.workspacesDir, path);
20
+ const pkg = pkgPath.split(sep).shift();
21
+ if (!pkg)
22
+ return null;
23
+ const pkgJsonPath = join(this.workspacesDir, pkg, "package.json");
24
+ return (await stat(pkgJsonPath)).isFile() ? pkg : null;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,22 @@
1
+ import { FixWorkspaceDepsMain, FixWorkspaceDepsParams } from "../types/types.workspace.js";
2
+ export type ProcessMode = "fix" | "restore";
3
+ export declare const runFixDepsByVersion: (repoRoot: string, mode: ProcessMode) => Promise<void>;
4
+ export declare const runFixDepsByFile: (repoRoot: string, mode: ProcessMode) => Promise<void>;
5
+ export declare abstract class IFixWorkspaceDeps {
6
+ readonly repoRoot: string;
7
+ readonly mode: ProcessMode;
8
+ constructor(repoRoot: string, mode: ProcessMode);
9
+ protected abstract fixVersion(p: FixWorkspaceDepsParams): string | null;
10
+ protected abstract restoreVersion(p: FixWorkspaceDepsParams): string | null;
11
+ run(): Promise<void>;
12
+ protected handleDependencies(deps: Record<string, string> | undefined, p: FixWorkspaceDepsMain): boolean;
13
+ protected runSingle(p: FixWorkspaceDepsMain): boolean;
14
+ }
15
+ export declare class FixWorkspaceDepsVersion extends IFixWorkspaceDeps {
16
+ protected fixVersion(p: FixWorkspaceDepsParams): string | null;
17
+ protected restoreVersion(p: FixWorkspaceDepsParams): string | null;
18
+ }
19
+ export declare class FixWorkspaceDepsFile extends IFixWorkspaceDeps {
20
+ protected fixVersion(p: FixWorkspaceDepsParams): string | null;
21
+ protected restoreVersion(p: FixWorkspaceDepsParams): string | null;
22
+ }
@@ -0,0 +1,118 @@
1
+ import { buildMapEntries, readPackageJsons, writePackageJsons, } from "./workspace.common.js";
2
+ export const runFixDepsByVersion = async (repoRoot, mode) => new FixWorkspaceDepsVersion(repoRoot, mode).run();
3
+ export const runFixDepsByFile = async (repoRoot, mode) => new FixWorkspaceDepsFile(repoRoot, mode).run();
4
+ export class IFixWorkspaceDeps {
5
+ repoRoot;
6
+ mode;
7
+ constructor(repoRoot, mode) {
8
+ this.repoRoot = repoRoot;
9
+ this.mode = mode;
10
+ }
11
+ async run() {
12
+ if (this.mode === "fix")
13
+ console.log("🔧 Fixing workspace dependencies...\n");
14
+ else
15
+ console.log("🔧 Restoring workspace dependencies...\n");
16
+ const pkgs = await readPackageJsons(this.repoRoot);
17
+ const mapEntries = buildMapEntries(pkgs);
18
+ const versionMap = new Map();
19
+ const workspacePackages = new Set();
20
+ for (const pkg of pkgs) {
21
+ versionMap.set(pkg.content.name, pkg.content.version);
22
+ workspacePackages.add(pkg.content.name);
23
+ }
24
+ console.log("📋 Version map:");
25
+ for (const map of mapEntries)
26
+ console.log(` ${map.fromPkg.content.name} --> ${map.toPkg.content.name}: ${map.relPath}`);
27
+ console.log();
28
+ for (const consumingPkg of pkgs) {
29
+ console.log(`📦 Processing ${consumingPkg.content.name}...`);
30
+ try {
31
+ consumingPkg.modified = this.runSingle({
32
+ consumingPkg,
33
+ mapEntries,
34
+ versionMap,
35
+ workspacePackages,
36
+ });
37
+ }
38
+ catch (err) {
39
+ console.error(`\nError processing ${consumingPkg.content.name}:`, err);
40
+ throw err;
41
+ }
42
+ }
43
+ await writePackageJsons(pkgs);
44
+ if (this.mode === "fix")
45
+ console.log("✅ Done fixing workspace dependencies!");
46
+ else
47
+ console.log("✅ Done restoring workspace dependencies!");
48
+ }
49
+ // Replace workspace:* with file:...
50
+ handleDependencies(deps, p) {
51
+ if (!deps)
52
+ return false;
53
+ const handler = this.mode === "fix" ? this.fixVersion : this.restoreVersion;
54
+ let modified = false;
55
+ for (const [name, version] of Object.entries(deps)) {
56
+ const newVersion = handler({ ...p, pkg: name, version });
57
+ if (!newVersion)
58
+ continue;
59
+ console.log(` ✓ Replaced ${name}: ${version} → ${newVersion}`);
60
+ deps[name] = newVersion;
61
+ modified = true;
62
+ }
63
+ return modified;
64
+ }
65
+ runSingle(p) {
66
+ let modified = false;
67
+ modified =
68
+ this.handleDependencies(p.consumingPkg.content.dependencies, p) ||
69
+ modified;
70
+ modified =
71
+ this.handleDependencies(p.consumingPkg.content.devDependencies, p) ||
72
+ modified;
73
+ modified =
74
+ this.handleDependencies(p.consumingPkg.content.peerDependencies, p) ||
75
+ modified;
76
+ return modified;
77
+ }
78
+ }
79
+ export class FixWorkspaceDepsVersion extends IFixWorkspaceDeps {
80
+ fixVersion(p) {
81
+ if (p.version !== "workspace:*")
82
+ return null;
83
+ const actualVersion = p.versionMap.get(p.pkg);
84
+ if (!actualVersion) {
85
+ console.error(` ERROR: Could not find version for workspace dependency ${p.pkg}`);
86
+ throw new Error(`Cannot resolve workspace dependency: ${p.pkg}`);
87
+ }
88
+ return `^${actualVersion}`;
89
+ }
90
+ restoreVersion(p) {
91
+ if (p.workspacePackages.has(p.pkg) && p.version.startsWith("^")) {
92
+ // Verify the version matches what fix script would have created
93
+ const actualVersion = p.versionMap.get(p.pkg);
94
+ if (actualVersion && p.version === `^${actualVersion}`) {
95
+ return "workspace:*";
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ }
101
+ export class FixWorkspaceDepsFile extends IFixWorkspaceDeps {
102
+ fixVersion(p) {
103
+ if (p.version !== "workspace:*")
104
+ return null;
105
+ const mapEntry = p.mapEntries.find((mapEntry) => mapEntry.fromPkg.content.name === p.consumingPkg.content.name &&
106
+ mapEntry.toPkg.content.name === p.pkg);
107
+ if (!mapEntry) {
108
+ console.error(` ERROR: Could not find version for workspace dependency ${p.pkg}`);
109
+ throw new Error(`Cannot resolve workspace dependency: ${p.pkg}`);
110
+ }
111
+ return `file:${mapEntry.relPath}`;
112
+ }
113
+ restoreVersion(p) {
114
+ if (!p.version.startsWith("file:"))
115
+ return null;
116
+ return "workspace:*";
117
+ }
118
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./WorkspacePaths.js";
2
+ export * from "./workspace.common.js";
@@ -0,0 +1,3 @@
1
+ // This file is auto-generated. Do not edit manually.
2
+ export * from "./WorkspacePaths.js";
3
+ export * from "./workspace.common.js";
@@ -0,0 +1,13 @@
1
+ import { PnpmWorkspace, WorkspaceFile, WorkspaceFileType } from "../types/types.workspace.js";
2
+ import { PackageJson, PackageEntry, MapEntry } from "../types/types.package.js";
3
+ export declare const DEFAULT_WORKSPACE_FILE_ENDING = ".code-workspace";
4
+ export declare const getFileType: (filename: string) => WorkspaceFileType;
5
+ export declare const findWorkspaceRoot: (startPath: string) => Promise<WorkspaceFile>;
6
+ export declare const readWorkspaceYaml: (repoRoot: string) => Promise<PnpmWorkspace>;
7
+ export declare const readPackageJson: (dirOrFilepath: string) => Promise<PackageJson | null>;
8
+ export declare const readPackageJsonThrow: (dirOrFilepath: string) => Promise<PackageJson>;
9
+ export declare const readPackageJsons: (repoRoot: string) => Promise<PackageEntry[]>;
10
+ export declare const writePackageJsons: (entries: PackageEntry[]) => Promise<void[]>;
11
+ export declare const buildMapEntries: (pkgEntries: PackageEntry[]) => MapEntry[];
12
+ export declare const readPackageVersions: (rootDir: string) => Promise<Record<string, string>>;
13
+ export declare const readMinPackageVersion: (rootDir: string) => Promise<string | null>;