@layerzerolabs/vm-tooling 0.2.112 → 0.2.114

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 (121) hide show
  1. package/dist/2ICMBBWU.js +6 -0
  2. package/dist/{N53MNPWU.js.map → 2ICMBBWU.js.map} +1 -1
  3. package/dist/{TWCQHE4E.js → 337JSZDD.js} +4 -4
  4. package/dist/{TWCQHE4E.js.map → 337JSZDD.js.map} +1 -1
  5. package/dist/{7CGWPLOJ.js → 4LO2IH4K.js} +6 -5
  6. package/dist/4LO2IH4K.js.map +1 -0
  7. package/dist/{NAWFODGG.js → 4Y7MN3EA.js} +5 -5
  8. package/dist/{NAWFODGG.js.map → 4Y7MN3EA.js.map} +1 -1
  9. package/dist/{IIZVEHVD.js → 5GPTK3MH.js} +12 -5
  10. package/dist/5GPTK3MH.js.map +1 -0
  11. package/dist/{TXIQ74D3.js → 6M2RYAT4.js} +9 -5
  12. package/dist/6M2RYAT4.js.map +1 -0
  13. package/dist/{UUWRT3Q2.js → 7AOPRLRU.js} +4 -4
  14. package/dist/{UUWRT3Q2.js.map → 7AOPRLRU.js.map} +1 -1
  15. package/dist/7ZZ35UQB.js +6 -0
  16. package/dist/{3N42XVZL.js.map → 7ZZ35UQB.js.map} +1 -1
  17. package/dist/BTTCOAYB.js +145 -0
  18. package/dist/BTTCOAYB.js.map +1 -0
  19. package/dist/{2PIH5TOH.js → CWBC3WMF.js} +3 -3
  20. package/dist/{2PIH5TOH.js.map → CWBC3WMF.js.map} +1 -1
  21. package/dist/{IPZ5KX7M.js → DCLKPAAD.js} +3 -3
  22. package/dist/{IPZ5KX7M.js.map → DCLKPAAD.js.map} +1 -1
  23. package/dist/{RORYN2CM.js → DHOHK2AA.js} +3 -3
  24. package/dist/{RORYN2CM.js.map → DHOHK2AA.js.map} +1 -1
  25. package/dist/DTNGUD3B.js +349 -0
  26. package/dist/DTNGUD3B.js.map +1 -0
  27. package/dist/{FFE7SXCG.js → EN67HYJT.js} +3 -3
  28. package/dist/{FFE7SXCG.js.map → EN67HYJT.js.map} +1 -1
  29. package/dist/{KBUFOLY3.js → H7PAZQ2B.js} +5 -5
  30. package/dist/{KBUFOLY3.js.map → H7PAZQ2B.js.map} +1 -1
  31. package/dist/{H6FLARPD.js → H7YRHR5O.js} +3 -3
  32. package/dist/{H6FLARPD.js.map → H7YRHR5O.js.map} +1 -1
  33. package/dist/ID575YY3.js +158 -0
  34. package/dist/ID575YY3.js.map +1 -0
  35. package/dist/{AIKNZKYE.js → INJJFIX2.js} +5 -5
  36. package/dist/{AIKNZKYE.js.map → INJJFIX2.js.map} +1 -1
  37. package/dist/LYF4JPSK.js +24 -0
  38. package/dist/LYF4JPSK.js.map +1 -0
  39. package/dist/{PNCVL7HO.js → MAF3KTCC.js} +5 -5
  40. package/dist/{PNCVL7HO.js.map → MAF3KTCC.js.map} +1 -1
  41. package/dist/SKMNEOBU.js +49 -0
  42. package/dist/SKMNEOBU.js.map +1 -0
  43. package/dist/{X6QPMSID.js → UBSQYHMB.js} +3 -3
  44. package/dist/{X6QPMSID.js.map → UBSQYHMB.js.map} +1 -1
  45. package/dist/{7DDNJRV6.js → V4633Q24.js} +8 -8
  46. package/dist/{7DDNJRV6.js.map → V4633Q24.js.map} +1 -1
  47. package/dist/WIT6LHNF.js +84 -0
  48. package/dist/WIT6LHNF.js.map +1 -0
  49. package/dist/{FT4JK367.js → WTU5LLJL.js} +5 -5
  50. package/dist/{FT4JK367.js.map → WTU5LLJL.js.map} +1 -1
  51. package/dist/ZBEXHZRK.js +46 -0
  52. package/dist/ZBEXHZRK.js.map +1 -0
  53. package/dist/cli.js +21 -16
  54. package/dist/config.d.ts +4 -0
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +3 -3
  57. package/dist/context.js +1 -1
  58. package/dist/core/index.js +17 -12
  59. package/dist/core/local-executor.js +2 -2
  60. package/dist/core/local-executor.test.js +3 -3
  61. package/dist/core/lock.js +2 -2
  62. package/dist/core/lock.test.js +3 -3
  63. package/dist/core/tool-executor.d.ts.map +1 -1
  64. package/dist/core/tool-executor.js +16 -11
  65. package/dist/core/tool-executor.test.js +17 -12
  66. package/dist/core/tool-executor.test.js.map +1 -1
  67. package/dist/core/version-resolver.js +4 -4
  68. package/dist/display/formatters.js +4 -4
  69. package/dist/display/index.js +6 -6
  70. package/dist/display/version-display.js +5 -5
  71. package/dist/environment.js +2 -2
  72. package/dist/github/index.js +7 -7
  73. package/dist/github/matrix.js +6 -6
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +24 -19
  77. package/dist/index.js.map +1 -1
  78. package/dist/mini-workspace/index.d.ts +6 -0
  79. package/dist/mini-workspace/index.d.ts.map +1 -0
  80. package/dist/mini-workspace/index.js +10 -0
  81. package/dist/mini-workspace/index.js.map +1 -0
  82. package/dist/mini-workspace/mini-workspace.test.js +643 -0
  83. package/dist/mini-workspace/mini-workspace.test.js.map +1 -0
  84. package/dist/mini-workspace/node-modules.d.ts +19 -0
  85. package/dist/mini-workspace/node-modules.d.ts.map +1 -0
  86. package/dist/mini-workspace/node-modules.js +4 -0
  87. package/dist/mini-workspace/node-modules.js.map +1 -0
  88. package/dist/mini-workspace/types.d.ts +82 -0
  89. package/dist/mini-workspace/types.d.ts.map +1 -0
  90. package/dist/mini-workspace/types.js +6 -0
  91. package/dist/mini-workspace/types.js.map +1 -0
  92. package/dist/mini-workspace/workspace-dependency-graph.d.ts +10 -0
  93. package/dist/mini-workspace/workspace-dependency-graph.d.ts.map +1 -0
  94. package/dist/mini-workspace/workspace-dependency-graph.js +7 -0
  95. package/dist/mini-workspace/workspace-dependency-graph.js.map +1 -0
  96. package/dist/mini-workspace/workspace-source-copy.d.ts +15 -0
  97. package/dist/mini-workspace/workspace-source-copy.d.ts.map +1 -0
  98. package/dist/mini-workspace/workspace-source-copy.js +6 -0
  99. package/dist/mini-workspace/workspace-source-copy.js.map +1 -0
  100. package/dist/test.js +6 -6
  101. package/dist/utils/docker.js +5 -5
  102. package/dist/utils/docker.test.js +6 -6
  103. package/dist/utils/error.js +2 -2
  104. package/dist/utils/finder.js +2 -2
  105. package/dist/utils/fs.d.ts +12 -0
  106. package/dist/utils/fs.d.ts.map +1 -0
  107. package/dist/utils/fs.js +4 -0
  108. package/dist/utils/fs.js.map +1 -0
  109. package/dist/utils.d.ts +0 -1
  110. package/dist/utils.d.ts.map +1 -1
  111. package/dist/utils.js +3 -3
  112. package/package.json +8 -5
  113. package/dist/3N42XVZL.js +0 -6
  114. package/dist/7CGWPLOJ.js.map +0 -1
  115. package/dist/IIZVEHVD.js.map +0 -1
  116. package/dist/N53MNPWU.js +0 -6
  117. package/dist/PXDULNML.js +0 -37
  118. package/dist/PXDULNML.js.map +0 -1
  119. package/dist/TXIQ74D3.js.map +0 -1
  120. package/dist/U3L7CZHW.js +0 -284
  121. package/dist/U3L7CZHW.js.map +0 -1
@@ -0,0 +1,643 @@
1
+ import { afterAll, describe, it, globalExpect } from '../5GPTK3MH.js';
2
+ import { createMiniWorkspace } from '../WIT6LHNF.js';
3
+ import { resolveWorkspaceDependencyGraph } from '../ID575YY3.js';
4
+ import { copyWorkspaceSources, DEFAULT_SOURCE_COPY_PATTERNS } from '../BTTCOAYB.js';
5
+ import '../SKMNEOBU.js';
6
+ import { copyRootNodeModulesSymlinks, getPnpmVirtualStoreMount } from '../ZBEXHZRK.js';
7
+ import '../LYF4JPSK.js';
8
+ import '../UBSQYHMB.js';
9
+ import { init_esm_shims, __dirname as __dirname$1, __name } from '../6M2RYAT4.js';
10
+ import { mkdtempSync, rmSync, mkdirSync, realpathSync, symlinkSync, existsSync, lstatSync, readlinkSync, writeFileSync } from 'fs';
11
+ import { tmpdir } from 'os';
12
+ import { join } from 'path';
13
+
14
+ // src/mini-workspace/mini-workspace.test.ts
15
+ init_esm_shims();
16
+ var TMP = mkdtempSync(join(tmpdir(), "lz-mini-workspace-test-"));
17
+ var GENERATED_MINI_ROOTS = [];
18
+ var trackMiniRoot = /* @__PURE__ */ __name((miniRoot) => {
19
+ GENERATED_MINI_ROOTS.push(miniRoot);
20
+ return miniRoot;
21
+ }, "trackMiniRoot");
22
+ var createPackage = /* @__PURE__ */ __name((dir, name, files = {}) => {
23
+ mkdirSync(dir, {
24
+ recursive: true
25
+ });
26
+ writeFileSync(join(dir, "package.json"), JSON.stringify({
27
+ name,
28
+ version: "0.0.0"
29
+ }));
30
+ for (const [file, content] of Object.entries(files)) {
31
+ const filePath = join(dir, file);
32
+ mkdirSync(join(filePath, ".."), {
33
+ recursive: true
34
+ });
35
+ writeFileSync(filePath, content);
36
+ }
37
+ }, "createPackage");
38
+ var createRepo = /* @__PURE__ */ __name((name) => {
39
+ const repo = join(TMP, name);
40
+ mkdirSync(repo, {
41
+ recursive: true
42
+ });
43
+ writeFileSync(join(repo, "pnpm-workspace.yaml"), 'packages:\n - "**"\n');
44
+ return repo;
45
+ }, "createRepo");
46
+ var writeLockfile = /* @__PURE__ */ __name((repo, body) => {
47
+ writeFileSync(join(repo, "pnpm-lock.yaml"), [
48
+ "lockfileVersion: '9.0'",
49
+ "",
50
+ "settings:",
51
+ " autoInstallPeers: true",
52
+ "",
53
+ "importers:",
54
+ body.trimEnd(),
55
+ "",
56
+ "packages:",
57
+ ""
58
+ ].join("\n"));
59
+ }, "writeLockfile");
60
+ afterAll(() => {
61
+ rmSync(TMP, {
62
+ recursive: true,
63
+ force: true
64
+ });
65
+ for (const miniRoot of GENERATED_MINI_ROOTS) {
66
+ rmSync(miniRoot, {
67
+ recursive: true,
68
+ force: true
69
+ });
70
+ }
71
+ });
72
+ describe(resolveWorkspaceDependencyGraph, () => {
73
+ it("follows transitive workspace link deps", async () => {
74
+ const repo = createRepo("dependency-graph");
75
+ const current = join(repo, "apps", "current");
76
+ const depA = join(repo, "packages", "dep-a");
77
+ const depB = join(repo, "packages", "dep-b");
78
+ const tooling = join(repo, "tools", "vm-utils", "solana", "build-utils");
79
+ createPackage(current, "@layerzerolabs/current");
80
+ createPackage(depA, "@layerzerolabs/dep-a");
81
+ createPackage(depB, "@layerzerolabs/dep-b");
82
+ createPackage(tooling, "@layerzerolabs/build-utils-solana");
83
+ writeLockfile(repo, `
84
+ apps/current:
85
+ dependencies:
86
+ '@layerzerolabs/dep-a':
87
+ specifier: workspace:*
88
+ version: link:../../packages/dep-a
89
+ '@layerzerolabs/build-utils-solana':
90
+ specifier: workspace:*
91
+ version: link:../../tools/vm-utils/solana/build-utils
92
+
93
+ .:
94
+ devDependencies:
95
+ eslint:
96
+ specifier: ^9.0.0
97
+ version: 9.0.0
98
+ '@layerzerolabs/dep-a':
99
+ specifier: workspace:*
100
+ version: link:packages/dep-a
101
+ '@layerzerolabs/build-utils-solana':
102
+ specifier: workspace:*
103
+ version: link:tools/vm-utils/solana/build-utils
104
+
105
+ packages/dep-a:
106
+ dependencies:
107
+ eslint:
108
+ specifier: ^9.0.0
109
+ version: 9.0.0
110
+ '@layerzerolabs/dep-b':
111
+ specifier: workspace:*
112
+ version: link:../dep-b
113
+
114
+ packages/dep-b:
115
+ dependencies:
116
+ '@layerzerolabs/dep-a':
117
+ specifier: workspace:*
118
+ version: link:../dep-a
119
+
120
+ tools/vm-utils/solana/build-utils:
121
+ devDependencies: {}
122
+ `);
123
+ const dependencyGraph = await resolveWorkspaceDependencyGraph({
124
+ cwd: current,
125
+ repoRoot: repo
126
+ });
127
+ const includedRelativePaths = dependencyGraph.includedWorkspaceDependencies.map((dependency) => dependency.relativePath);
128
+ globalExpect(includedRelativePaths).toHaveLength(3);
129
+ globalExpect(includedRelativePaths).toEqual(globalExpect.arrayContaining([
130
+ "packages/dep-a",
131
+ "packages/dep-b",
132
+ "tools/vm-utils/solana/build-utils"
133
+ ]));
134
+ globalExpect(dependencyGraph.rootNodeModulesDependencyNames).toHaveLength(3);
135
+ globalExpect(dependencyGraph.rootNodeModulesDependencyNames).toEqual(globalExpect.arrayContaining([
136
+ "@layerzerolabs/build-utils-solana",
137
+ "@layerzerolabs/dep-a",
138
+ "eslint"
139
+ ]));
140
+ });
141
+ it("resolves nested command directories to their ancestor package importer", async () => {
142
+ const repo = createRepo("nested-current");
143
+ const current = join(repo, "packages", "onesig", "onesig-starknet");
144
+ const contracts = join(current, "contracts");
145
+ const dep = join(repo, "packages", "protocol-starknet-v2");
146
+ createPackage(current, "@layerzerolabs/onesig-starknet", {
147
+ "contracts/Scarb.toml": '[package]\nname = "onesig"\n'
148
+ });
149
+ createPackage(dep, "@layerzerolabs/protocol-starknet-v2");
150
+ mkdirSync(contracts, {
151
+ recursive: true
152
+ });
153
+ writeLockfile(repo, `
154
+ packages/onesig/onesig-starknet:
155
+ devDependencies:
156
+ '@layerzerolabs/protocol-starknet-v2':
157
+ specifier: workspace:*
158
+ version: link:../../protocol-starknet-v2
159
+
160
+ .:
161
+ devDependencies:
162
+ '@layerzerolabs/protocol-starknet-v2':
163
+ specifier: workspace:*
164
+ version: link:packages/protocol-starknet-v2
165
+
166
+ packages/protocol-starknet-v2:
167
+ devDependencies: {}
168
+ `);
169
+ const dependencyGraph = await resolveWorkspaceDependencyGraph({
170
+ cwd: contracts,
171
+ repoRoot: repo
172
+ });
173
+ globalExpect(dependencyGraph.packageRoot).toBe(realpathSync(current));
174
+ globalExpect(dependencyGraph.packageRelativePath).toBe("packages/onesig/onesig-starknet");
175
+ globalExpect(dependencyGraph.includedWorkspaceDependencies.map((dependency) => dependency.relativePath)).toEqual([
176
+ "packages/protocol-starknet-v2"
177
+ ]);
178
+ globalExpect(dependencyGraph.rootNodeModulesDependencyNames).toEqual([
179
+ "@layerzerolabs/protocol-starknet-v2"
180
+ ]);
181
+ });
182
+ it("uses the real repository lockfile to include transitive anchor-trait for console-oft", async () => {
183
+ const repo = join(__dirname$1, "..", "..", "..", "..", "..");
184
+ const dependencyGraph = await resolveWorkspaceDependencyGraph({
185
+ cwd: join(repo, "apps/project-types/console-oft-app/contracts/solana"),
186
+ repoRoot: repo
187
+ });
188
+ globalExpect(dependencyGraph.includedWorkspaceDependencies.map((dependency) => dependency.name)).toContain("@layerzerolabs/framework-solana-anchor-trait");
189
+ });
190
+ it("invalidates cached lockfile importers when the lockfile changes", async () => {
191
+ const repo = createRepo("dependency-graph-cache-invalidation");
192
+ const current = join(repo, "apps", "current");
193
+ const depA = join(repo, "packages", "dep-a");
194
+ const depB = join(repo, "packages", "dep-b");
195
+ createPackage(current, "@layerzerolabs/current");
196
+ createPackage(depA, "@layerzerolabs/dep-a");
197
+ createPackage(depB, "@layerzerolabs/dep-b");
198
+ writeLockfile(repo, `
199
+ apps/current:
200
+ dependencies:
201
+ '@layerzerolabs/dep-a':
202
+ specifier: workspace:*
203
+ version: link:../../packages/dep-a
204
+
205
+ packages/dep-a:
206
+ devDependencies: {}
207
+ `);
208
+ const firstGraph = await resolveWorkspaceDependencyGraph({
209
+ cwd: current,
210
+ repoRoot: repo
211
+ });
212
+ writeLockfile(repo, `
213
+ apps/current:
214
+ dependencies:
215
+ '@layerzerolabs/dep-b':
216
+ specifier: workspace:*
217
+ version: link:../../packages/dep-b
218
+
219
+ packages/dep-b:
220
+ devDependencies: {}
221
+
222
+ # Keep the rewritten lockfile size different so mtime+size invalidation is exercised.
223
+ `);
224
+ const secondGraph = await resolveWorkspaceDependencyGraph({
225
+ cwd: current,
226
+ repoRoot: repo
227
+ });
228
+ globalExpect(firstGraph.includedWorkspaceDependencies.map((dependency) => dependency.relativePath)).toEqual([
229
+ "packages/dep-a"
230
+ ]);
231
+ globalExpect(secondGraph.includedWorkspaceDependencies.map((dependency) => dependency.relativePath)).toEqual([
232
+ "packages/dep-b"
233
+ ]);
234
+ });
235
+ });
236
+ describe(copyWorkspaceSources, () => {
237
+ it("copies dependency sources and dist outputs while excluding the current package and heavyweight generated output directories", async () => {
238
+ const repo = createRepo("workspace-source-copy");
239
+ const current = join(repo, "apps", "current");
240
+ const dep = join(repo, "packages", "dep");
241
+ createPackage(current, "@layerzerolabs/current", {
242
+ "src/index.ts": "export const current = true",
243
+ "target/deploy/current.so": "compiled"
244
+ });
245
+ createPackage(dep, "@layerzerolabs/dep", {
246
+ "src/index.ts": "export const dep = true",
247
+ "target/deploy/program.so": "compiled",
248
+ "target/wasm32v1-none/release/program.d": "program.wasm: src/lib.rs",
249
+ "target/wasm32v1-none/release/program.wasm": "compiled wasm",
250
+ "node_modules/pkg/index.js": "module.exports = {}",
251
+ "dist/index.js": "module.exports = {}",
252
+ "artifacts/contracts/Contract.json": "{}"
253
+ });
254
+ symlinkSync("../../../../node_modules/.pnpm/linked-pkg@1.0.0/node_modules/linked-pkg", join(dep, "node_modules", "linked-pkg"));
255
+ symlinkSync("src/index.ts", join(dep, "src-link.ts"));
256
+ const dependencyGraph = {
257
+ repoRoot: repo,
258
+ packageRoot: current,
259
+ packageRelativePath: "apps/current",
260
+ rootNodeModulesDependencyNames: [],
261
+ includedWorkspaceDependencies: [
262
+ {
263
+ name: "@layerzerolabs/dep",
264
+ importerRelativePath: "apps/current",
265
+ relativePath: "packages/dep",
266
+ absolutePath: dep,
267
+ version: "link:../../packages/dep"
268
+ }
269
+ ]
270
+ };
271
+ const result = await copyWorkspaceSources({
272
+ dependencyGraph
273
+ });
274
+ const miniRoot = trackMiniRoot(result.miniRoot);
275
+ globalExpect(result.copiedWorkspaceDependencies).toHaveLength(1);
276
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "src", "index.ts"))).toBe(true);
277
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "target", "deploy"))).toBe(false);
278
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "target", "wasm32v1-none", "release", "program.d"))).toBe(true);
279
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "target", "wasm32v1-none", "release", "program.wasm"))).toBe(true);
280
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "node_modules"))).toBe(true);
281
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "node_modules", "pkg", "index.js"))).toBe(false);
282
+ globalExpect(lstatSync(join(miniRoot, "packages", "dep", "node_modules", "linked-pkg")).isSymbolicLink()).toBe(true);
283
+ globalExpect(readlinkSync(join(miniRoot, "packages", "dep", "node_modules", "linked-pkg"))).toBe("../../../../node_modules/.pnpm/linked-pkg@1.0.0/node_modules/linked-pkg");
284
+ globalExpect(lstatSync(join(miniRoot, "packages", "dep", "src-link.ts")).isSymbolicLink()).toBe(true);
285
+ globalExpect(readlinkSync(join(miniRoot, "packages", "dep", "src-link.ts"))).toBe("src/index.ts");
286
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "dist", "index.js"))).toBe(true);
287
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "artifacts"))).toBe(false);
288
+ globalExpect(existsSync(join(miniRoot, "apps", "current"))).toBe(false);
289
+ });
290
+ it("applies glob-compatible mini-workspace prune patterns to dependency source copies", async () => {
291
+ const repo = createRepo("workspace-source-pattern-copy");
292
+ const current = join(repo, "apps", "current");
293
+ const dep = join(repo, "packages", "dep");
294
+ createPackage(current, "@layerzerolabs/current");
295
+ createPackage(dep, "@layerzerolabs/dep", {
296
+ "src/index.ts": "export const dep = true",
297
+ "README.md": "# dep",
298
+ LICENSE: "MIT",
299
+ "sdk/client.ts": "export const sdk = true",
300
+ "scripts/dev.ts": "export const dev = true",
301
+ "tests/fixture.ts": "export const secret = true",
302
+ "node_modules/pkg/index.js": "module.exports = {}",
303
+ "programs/demo/src/lib.rs": "pub fn process() {}",
304
+ "programs/demo/tests/integration.rs": "#[test] fn it_works() {}",
305
+ "target/deploy/program.so": "compiled"
306
+ });
307
+ symlinkSync("../src/index.ts", join(dep, "node_modules", "dep-link"));
308
+ const dependencyGraph = {
309
+ repoRoot: repo,
310
+ packageRoot: current,
311
+ packageRelativePath: "apps/current",
312
+ rootNodeModulesDependencyNames: [],
313
+ includedWorkspaceDependencies: [
314
+ {
315
+ name: "@layerzerolabs/dep",
316
+ importerRelativePath: "apps/current",
317
+ relativePath: "packages/dep",
318
+ absolutePath: dep,
319
+ version: "link:../../packages/dep"
320
+ }
321
+ ]
322
+ };
323
+ const result = await copyWorkspaceSources({
324
+ dependencyGraph,
325
+ prunePatterns: [
326
+ ...DEFAULT_SOURCE_COPY_PATTERNS,
327
+ "!**/*.md",
328
+ "!**/LICENSE",
329
+ "!sdk/**",
330
+ "!scripts/**",
331
+ "!tests/**",
332
+ "!programs/**/tests/**"
333
+ ]
334
+ });
335
+ const miniRoot = trackMiniRoot(result.miniRoot);
336
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "src", "index.ts"))).toBe(true);
337
+ globalExpect(existsSync(join(miniRoot, "apps", "current"))).toBe(false);
338
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "programs", "demo", "src", "lib.rs"))).toBe(true);
339
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "README.md"))).toBe(false);
340
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "LICENSE"))).toBe(false);
341
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "sdk"))).toBe(false);
342
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "scripts"))).toBe(false);
343
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "tests"))).toBe(false);
344
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "programs", "demo", "tests"))).toBe(false);
345
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "node_modules", "pkg"))).toBe(false);
346
+ globalExpect(lstatSync(join(miniRoot, "packages", "dep", "node_modules", "dep-link")).isSymbolicLink()).toBe(true);
347
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "target"))).toBe(false);
348
+ });
349
+ it("falls back to default patterns when global prune patterns are empty", async () => {
350
+ const repo = createRepo("workspace-source-package-pattern-copy");
351
+ const current = join(repo, "apps", "current");
352
+ const anchorDep = join(repo, "packages", "anchor-dep");
353
+ const utilityDep = join(repo, "packages", "utility-dep");
354
+ createPackage(current, "@layerzerolabs/current", {
355
+ "src/index.ts": "export const current = true",
356
+ "tests/secret.ts": "export const secret = true"
357
+ });
358
+ createPackage(anchorDep, "@layerzerolabs/anchor-dep", {
359
+ "Anchor.toml": '[programs.localnet]\nanchor_dep = "11111111111111111111111111111111"',
360
+ "programs/demo/Cargo.toml": '[package]\nname = "demo"',
361
+ "programs/demo/src/lib.rs": "pub fn process() {}",
362
+ "programs/demo/tests/integration.rs": "#[test] fn it_works() {}"
363
+ });
364
+ createPackage(utilityDep, "@layerzerolabs/utility-dep", {
365
+ "src/index.ts": "export const utility = true"
366
+ });
367
+ const dependencyGraph = {
368
+ repoRoot: repo,
369
+ packageRoot: current,
370
+ packageRelativePath: "apps/current",
371
+ rootNodeModulesDependencyNames: [],
372
+ includedWorkspaceDependencies: [
373
+ {
374
+ name: "@layerzerolabs/anchor-dep",
375
+ importerRelativePath: "apps/current",
376
+ relativePath: "packages/anchor-dep",
377
+ absolutePath: anchorDep,
378
+ version: "link:../../packages/anchor-dep"
379
+ },
380
+ {
381
+ name: "@layerzerolabs/utility-dep",
382
+ importerRelativePath: "apps/current",
383
+ relativePath: "packages/utility-dep",
384
+ absolutePath: utilityDep,
385
+ version: "link:../../packages/utility-dep"
386
+ }
387
+ ]
388
+ };
389
+ const result = await copyWorkspaceSources({
390
+ dependencyGraph,
391
+ prunePatterns: [],
392
+ packagePrunePatterns: {
393
+ "apps/current": [
394
+ "src/**"
395
+ ],
396
+ "packages/anchor-dep": [
397
+ "Anchor.toml",
398
+ "programs/*/Cargo.toml",
399
+ "programs/*/src/**"
400
+ ]
401
+ }
402
+ });
403
+ const miniRoot = trackMiniRoot(result.miniRoot);
404
+ globalExpect(existsSync(join(miniRoot, "apps", "current"))).toBe(false);
405
+ globalExpect(existsSync(join(miniRoot, "packages", "anchor-dep", "Anchor.toml"))).toBe(true);
406
+ globalExpect(existsSync(join(miniRoot, "packages", "anchor-dep", "programs", "demo", "Cargo.toml"))).toBe(true);
407
+ globalExpect(existsSync(join(miniRoot, "packages", "anchor-dep", "programs", "demo", "src", "lib.rs"))).toBe(true);
408
+ globalExpect(existsSync(join(miniRoot, "packages", "anchor-dep", "programs", "demo", "tests"))).toBe(false);
409
+ globalExpect(existsSync(join(miniRoot, "packages", "utility-dep", "src", "index.ts"))).toBe(true);
410
+ });
411
+ });
412
+ describe(createMiniWorkspace, () => {
413
+ it("uses the unpruned source-copy fallback when no pruner is configured", async () => {
414
+ const repo = createRepo("mini-workspace-fallback");
415
+ const current = join(repo, "apps", "current");
416
+ const dep = join(repo, "packages", "dep");
417
+ mkdirSync(join(repo, "node_modules", ".pnpm"), {
418
+ recursive: true
419
+ });
420
+ createPackage(current, "@layerzerolabs/current", {
421
+ "src/index.ts": "export const current = true"
422
+ });
423
+ createPackage(dep, "@layerzerolabs/dep", {
424
+ "src/index.ts": "export const dep = true"
425
+ });
426
+ writeLockfile(repo, `
427
+ apps/current:
428
+ dependencies:
429
+ '@layerzerolabs/dep':
430
+ specifier: workspace:*
431
+ version: link:../../packages/dep
432
+
433
+ packages/dep:
434
+ devDependencies: {}
435
+ `);
436
+ const result = await createMiniWorkspace({
437
+ cwd: current
438
+ });
439
+ const miniRoot = trackMiniRoot(result.miniRoot);
440
+ globalExpect(result.prunerName).toBeUndefined();
441
+ globalExpect(result.diagnostics).toEqual([
442
+ "No mini-workspace pruner configured; using unpruned package-level source copy fallback."
443
+ ]);
444
+ globalExpect(result.copiedWorkspacePackageCount).toBe(1);
445
+ globalExpect(result.copiedWorkspacePackagePaths).toEqual({
446
+ "packages/dep": realpathSync(dep)
447
+ });
448
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "src", "index.ts"))).toBe(true);
449
+ globalExpect(existsSync(join(miniRoot, "apps", "current"))).toBe(false);
450
+ });
451
+ it("uses a configured pruner to filter dependency package copies", async () => {
452
+ const repo = createRepo("mini-workspace-pruner");
453
+ const current = join(repo, "apps", "current");
454
+ const dep = join(repo, "packages", "dep");
455
+ const inputs = [];
456
+ const pruner = {
457
+ name: "test-pruner",
458
+ createPrunePlan: /* @__PURE__ */ __name(async (input) => {
459
+ inputs.push(input);
460
+ return {
461
+ patterns: [],
462
+ packagePatterns: {
463
+ "apps/current": [
464
+ "src/**"
465
+ ],
466
+ "packages/dep": [
467
+ ...DEFAULT_SOURCE_COPY_PATTERNS,
468
+ "!tests/**"
469
+ ]
470
+ },
471
+ diagnostics: [
472
+ "planned current package inputs"
473
+ ]
474
+ };
475
+ }, "createPrunePlan")
476
+ };
477
+ mkdirSync(join(repo, "node_modules", ".pnpm"), {
478
+ recursive: true
479
+ });
480
+ createPackage(current, "@layerzerolabs/current", {
481
+ "src/index.ts": "export const current = true",
482
+ "tests/secret.ts": "export const secret = true"
483
+ });
484
+ createPackage(dep, "@layerzerolabs/dep", {
485
+ "src/index.ts": "export const dep = true",
486
+ "tests/fixture.ts": "export const secret = true"
487
+ });
488
+ writeLockfile(repo, `
489
+ apps/current:
490
+ dependencies:
491
+ '@layerzerolabs/dep':
492
+ specifier: workspace:*
493
+ version: link:../../packages/dep
494
+
495
+ packages/dep:
496
+ devDependencies: {}
497
+ `);
498
+ const result = await createMiniWorkspace({
499
+ cwd: current,
500
+ pruner
501
+ });
502
+ const miniRoot = trackMiniRoot(result.miniRoot);
503
+ globalExpect(inputs).toHaveLength(1);
504
+ const firstInput = inputs[0];
505
+ globalExpect(firstInput).toMatchObject({
506
+ repoRoot: realpathSync(repo),
507
+ packageRoot: realpathSync(current),
508
+ packageRelativePath: "apps/current",
509
+ cwd: current
510
+ });
511
+ globalExpect(firstInput.dependencyGraph.includedWorkspaceDependencies.map(({ relativePath }) => relativePath)).toEqual([
512
+ "packages/dep"
513
+ ]);
514
+ globalExpect(result.prunerName).toBe("test-pruner");
515
+ globalExpect(result.diagnostics).toEqual([
516
+ "planned current package inputs"
517
+ ]);
518
+ globalExpect(result.copiedWorkspacePackageCount).toBe(1);
519
+ globalExpect(result.copiedWorkspacePackagePaths).toEqual({
520
+ "packages/dep": realpathSync(dep)
521
+ });
522
+ globalExpect(existsSync(join(miniRoot, "apps", "current"))).toBe(false);
523
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "src", "index.ts"))).toBe(true);
524
+ globalExpect(existsSync(join(miniRoot, "packages", "dep", "tests"))).toBe(false);
525
+ });
526
+ it("uses default dependency copies for pruned packages without package-specific patterns", async () => {
527
+ const repo = createRepo("mini-workspace-empty-global-patterns");
528
+ const current = join(repo, "apps", "current");
529
+ const prunedDep = join(repo, "packages", "pruned-dep");
530
+ const defaultDep = join(repo, "packages", "default-dep");
531
+ const pruner = {
532
+ name: "test-pruner",
533
+ createPrunePlan: /* @__PURE__ */ __name(async () => ({
534
+ patterns: [],
535
+ packagePatterns: {
536
+ "packages/pruned-dep": [
537
+ "src/**"
538
+ ]
539
+ }
540
+ }), "createPrunePlan")
541
+ };
542
+ mkdirSync(join(repo, "node_modules", ".pnpm"), {
543
+ recursive: true
544
+ });
545
+ createPackage(current, "@layerzerolabs/current", {
546
+ "src/index.ts": "export const current = true"
547
+ });
548
+ createPackage(prunedDep, "@layerzerolabs/pruned-dep", {
549
+ "src/index.ts": "export const pruned = true",
550
+ "tests/fixture.ts": "export const fixture = true"
551
+ });
552
+ createPackage(defaultDep, "@layerzerolabs/default-dep", {
553
+ "src/index.ts": "export const defaultDep = true"
554
+ });
555
+ writeLockfile(repo, `
556
+ apps/current:
557
+ dependencies:
558
+ '@layerzerolabs/pruned-dep':
559
+ specifier: workspace:*
560
+ version: link:../../packages/pruned-dep
561
+ '@layerzerolabs/default-dep':
562
+ specifier: workspace:*
563
+ version: link:../../packages/default-dep
564
+
565
+ packages/default-dep:
566
+ devDependencies: {}
567
+
568
+ packages/pruned-dep:
569
+ devDependencies: {}
570
+ `);
571
+ const result = await createMiniWorkspace({
572
+ cwd: current,
573
+ pruner
574
+ });
575
+ const miniRoot = trackMiniRoot(result.miniRoot);
576
+ globalExpect(existsSync(join(miniRoot, "packages", "pruned-dep", "src", "index.ts"))).toBe(true);
577
+ globalExpect(existsSync(join(miniRoot, "packages", "pruned-dep", "tests"))).toBe(false);
578
+ globalExpect(existsSync(join(miniRoot, "packages", "default-dep", "src", "index.ts"))).toBe(true);
579
+ });
580
+ });
581
+ describe(copyRootNodeModulesSymlinks, () => {
582
+ it("copies only selected root dependency symlinks without copying dependency contents", async () => {
583
+ const repo = createRepo("node-modules-symlinks");
584
+ const miniRoot = join(TMP, "mini-node-modules-symlinks");
585
+ const dep = join(repo, "apps", "oapp-app", "contracts", "solana");
586
+ createPackage(dep, "@layerzerolabs/oapp-solana-impl");
587
+ mkdirSync(join(repo, "node_modules", ".pnpm"), {
588
+ recursive: true
589
+ });
590
+ mkdirSync(join(repo, "node_modules", ".bin"), {
591
+ recursive: true
592
+ });
593
+ mkdirSync(join(repo, "node_modules", "@types"), {
594
+ recursive: true
595
+ });
596
+ mkdirSync(join(repo, "node_modules", "@layerzerolabs"), {
597
+ recursive: true
598
+ });
599
+ writeFileSync(join(repo, "node_modules", ".bin", "real-file"), "do not copy");
600
+ mkdirSync(join(miniRoot, "apps", "oapp-app", "contracts", "solana"), {
601
+ recursive: true
602
+ });
603
+ symlinkSync(".pnpm/eslint@1.0.0/node_modules/eslint", join(repo, "node_modules", "eslint"));
604
+ symlinkSync("../.pnpm/typescript@1.0.0/node_modules/typescript/bin/tsc", join(repo, "node_modules", ".bin", "tsc"));
605
+ symlinkSync("../.pnpm/@types+node@1.0.0/node_modules/@types/node", join(repo, "node_modules", "@types", "node"));
606
+ symlinkSync("../../apps/oapp-app/contracts/solana", join(repo, "node_modules", "@layerzerolabs", "oapp-solana-impl"));
607
+ symlinkSync("../..", join(repo, "node_modules", "@layerzerolabs", "whole-repo-link"));
608
+ const result = await copyRootNodeModulesSymlinks({
609
+ repoRoot: repo,
610
+ miniRoot,
611
+ dependencyNames: [
612
+ "@layerzerolabs/oapp-solana-impl",
613
+ "@types/node",
614
+ "eslint"
615
+ ]
616
+ });
617
+ globalExpect(result.nodeModulesPath).toBe(join(miniRoot, "node_modules"));
618
+ globalExpect(result.symlinks).toEqual([
619
+ "@layerzerolabs/oapp-solana-impl",
620
+ "@types/node",
621
+ "eslint"
622
+ ]);
623
+ globalExpect(readlinkSync(join(miniRoot, "node_modules", "eslint"))).toBe(".pnpm/eslint@1.0.0/node_modules/eslint");
624
+ globalExpect(lstatSync(join(miniRoot, "node_modules", ".pnpm")).isDirectory()).toBe(true);
625
+ globalExpect(existsSync(join(miniRoot, "node_modules", ".bin", "real-file"))).toBe(false);
626
+ globalExpect(existsSync(join(miniRoot, "node_modules", ".bin", "tsc"))).toBe(false);
627
+ globalExpect(lstatSync(join(miniRoot, "node_modules", "@types", "node")).isSymbolicLink()).toBe(true);
628
+ globalExpect(lstatSync(join(miniRoot, "node_modules", "@layerzerolabs", "oapp-solana-impl")).isSymbolicLink()).toBe(true);
629
+ globalExpect(readlinkSync(join(miniRoot, "node_modules", "@layerzerolabs", "oapp-solana-impl"))).toBe("../../apps/oapp-app/contracts/solana");
630
+ globalExpect(existsSync(join(miniRoot, "node_modules", "@layerzerolabs", "whole-repo-link"))).toBe(false);
631
+ });
632
+ });
633
+ describe(getPnpmVirtualStoreMount, () => {
634
+ it("describes a read-only .pnpm mount without requiring root node_modules copy", () => {
635
+ globalExpect(getPnpmVirtualStoreMount("/repo")).toEqual({
636
+ hostPath: "/repo/node_modules/.pnpm",
637
+ containerPath: "/workspace/node_modules/.pnpm",
638
+ readOnly: true
639
+ });
640
+ });
641
+ });
642
+ //# sourceMappingURL=mini-workspace.test.js.map
643
+ //# sourceMappingURL=mini-workspace.test.js.map