@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
package/dist/N53MNPWU.js DELETED
@@ -1,6 +0,0 @@
1
- import { init_esm_shims } from './TXIQ74D3.js';
2
-
3
- // src/core/index.ts
4
- init_esm_shims();
5
- //# sourceMappingURL=N53MNPWU.js.map
6
- //# sourceMappingURL=N53MNPWU.js.map
package/dist/PXDULNML.js DELETED
@@ -1,37 +0,0 @@
1
- import { findToolVersionsForCombination } from './X6QPMSID.js';
2
- import { init_esm_shims, __name } from './TXIQ74D3.js';
3
- import { access } from 'fs/promises';
4
- import { dirname, join } from 'path';
5
-
6
- // src/utils.ts
7
- init_esm_shims();
8
- var rootFiles = [
9
- "pnpm-workspace.yaml",
10
- ".git"
11
- ];
12
- var getCombinationId = /* @__PURE__ */ __name((context, combination) => Object.entries(findToolVersionsForCombination(context, combination)).toSorted().flat().join("-"), "getCombinationId");
13
- var findFileInParentDirectory = /* @__PURE__ */ __name(async (directory, filename) => {
14
- while (directory !== dirname(directory)) {
15
- const path = join(directory, filename);
16
- try {
17
- await access(path);
18
- return path;
19
- } catch (_) {
20
- }
21
- directory = dirname(directory);
22
- }
23
- return null;
24
- }, "findFileInParentDirectory");
25
- var findWorkspaceRoot = /* @__PURE__ */ __name(async (directory) => {
26
- for (const rootFile of rootFiles) {
27
- const path = await findFileInParentDirectory(directory, rootFile);
28
- if (path) {
29
- return dirname(path);
30
- }
31
- }
32
- throw new Error(`Workspace root not found from directory: ${directory}`);
33
- }, "findWorkspaceRoot");
34
-
35
- export { findFileInParentDirectory, findWorkspaceRoot, getCombinationId };
36
- //# sourceMappingURL=PXDULNML.js.map
37
- //# sourceMappingURL=PXDULNML.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils.ts"],"names":["rootFiles","getCombinationId","context","combination","Object","entries","findToolVersionsForCombination","toSorted","flat","join","findFileInParentDirectory","directory","filename","dirname","path","access","_","findWorkspaceRoot","rootFile","Error"],"mappings":";;;;;;AAAA,cAAA,EAAA;AAQA,IAAMA,SAAAA,GAAsB;AAAC,EAAA,qBAAA;AAAuB,EAAA;;AAE7C,IAAMC,mCAAmB,MAAA,CAAA,CAC5BC,OAAAA,EACAC,WAAAA,KAEAC,MAAAA,CAAOC,QAAQC,8BAAAA,CAA+BJ,OAAAA,EAASC,WAAAA,CAAAA,EAClDI,QAAAA,EAAQ,CACRC,MAAI,CACJC,IAAAA,CAAK,GAAA,CAAA,EAPkB,kBAAA;AASzB,IAAMC,yBAAAA,mBAA4B,MAAA,CAAA,OACrCC,SAAAA,EACAC,QAAAA,KAAAA;AAEA,EAAA,OAAOD,SAAAA,KAAcE,OAAAA,CAAQF,SAAAA,CAAAA,EAAY;AACrC,IAAA,MAAMG,IAAAA,GAAOL,IAAAA,CAAKE,SAAAA,EAAWC,QAAAA,CAAAA;AAE7B,IAAA,IAAI;AACA,MAAA,MAAMG,OAAOD,IAAAA,CAAAA;AACb,MAAA,OAAOA,IAAAA;AACX,IAAA,CAAA,CAAA,OAASE,CAAAA,EAAG;AAAC,IAAA;AAEbL,IAAAA,SAAAA,GAAYE,QAAQF,SAAAA,CAAAA;AACxB,EAAA;AAEA,EAAA,OAAO,IAAA;AACX,CAAA,EAhByC,2BAAA;AAkBlC,IAAMM,iBAAAA,iCAA2BN,SAAAA,KAAAA;AACpC,EAAA,KAAA,MAAWO,YAAYlB,SAAAA,EAAW;AAC9B,IAAA,MAAMc,IAAAA,GAAO,MAAMJ,yBAAAA,CAA0BC,SAAAA,EAAWO,QAAAA,CAAAA;AAExD,IAAA,IAAIJ,IAAAA,EAAM;AACN,MAAA,OAAOD,QAAQC,IAAAA,CAAAA;AACnB,IAAA;AACJ,EAAA;AAEA,EAAA,MAAM,IAAIK,KAAAA,CAAM,CAAA,yCAAA,EAA4CR,SAAAA,CAAAA,CAAW,CAAA;AAC3E,CAAA,EAViC,mBAAA","file":"PXDULNML.js","sourcesContent":["import { access } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { VersionCombination } from './config';\nimport type { ChainContext } from './context';\nimport { findToolVersionsForCombination } from './utils/finder';\n\n// TODO Add more root markers when we publish the VM tooling package.\nconst rootFiles: string[] = ['pnpm-workspace.yaml', '.git'];\n\nexport const getCombinationId = <TImageId extends string>(\n context: ChainContext<TImageId>,\n combination: VersionCombination<TImageId>,\n): string =>\n Object.entries(findToolVersionsForCombination(context, combination))\n .toSorted()\n .flat()\n .join('-');\n\nexport const findFileInParentDirectory = async (\n directory: string,\n filename: string,\n): Promise<string | null> => {\n while (directory !== dirname(directory)) {\n const path = join(directory, filename);\n\n try {\n await access(path);\n return path;\n } catch (_) {}\n\n directory = dirname(directory);\n }\n\n return null;\n};\n\nexport const findWorkspaceRoot = async (directory: string): Promise<string> => {\n for (const rootFile of rootFiles) {\n const path = await findFileInParentDirectory(directory, rootFile);\n\n if (path) {\n return dirname(path);\n }\n }\n\n throw new Error(`Workspace root not found from directory: ${directory}`);\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.2_@swc+helpers@0.5.17__jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.8.2_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA,KAAA,CAAA","file":"TXIQ74D3.js","sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n"]}
package/dist/U3L7CZHW.js DELETED
@@ -1,284 +0,0 @@
1
- import { stringifyError } from './FFE7SXCG.js';
2
- import { executeLocally } from './IPZ5KX7M.js';
3
- import { lockMany } from './H6FLARPD.js';
4
- import { resolveTypeVersions } from './FT4JK367.js';
5
- import { resolveDockerPlatformExecution, findImageForTool, getImageUri, getImageTag, qualifyVolumeName } from './KBUFOLY3.js';
6
- import { CARGO_TARGET_CACHE_PATH } from './7CGWPLOJ.js';
7
- import { findWorkspaceRoot } from './PXDULNML.js';
8
- import { findToolByName } from './X6QPMSID.js';
9
- import { init_esm_shims, __name } from './TXIQ74D3.js';
10
- import { uniqBy } from 'es-toolkit';
11
- import os from 'os';
12
- import path from 'path';
13
- import process from 'process';
14
- import * as semver from 'semver';
15
- import { $ } from 'zx';
16
-
17
- // src/core/tool-executor.ts
18
- init_esm_shims();
19
- var getHostUserIds = /* @__PURE__ */ __name(() => {
20
- const userInfo = os.userInfo();
21
- if (userInfo.uid === -1 || userInfo.gid === -1) {
22
- return void 0;
23
- }
24
- return {
25
- uid: userInfo.uid,
26
- gid: userInfo.gid
27
- };
28
- }, "getHostUserIds");
29
- $.verbose = true;
30
- $.stdio = [
31
- "inherit",
32
- "pipe",
33
- process.stderr
34
- ];
35
- var mergeVolumes = /* @__PURE__ */ __name((defaultVolumes, userVolumes) => uniqBy([
36
- ...userVolumes,
37
- ...defaultVolumes
38
- ], (volume) => volume.containerPath), "mergeVolumes");
39
- var mergeToolEnv = /* @__PURE__ */ __name((...layers) => uniqBy(layers.flat(), ({ name }) => name), "mergeToolEnv");
40
- var CACHE_SAFE_CARGO_RE = /\bcargo\s+(?:\+\S+\s+)?(?:test|nextest|check|clippy|t|c)(?:\s|$)|\bcargo\s+(?:\+\S+\s+)?test-\S+/;
41
- var CARGO_BUILD_RE = /\banchor\s+(?:idl\s+build|build|test)\b|\bcargo-(?:build|test)-(?:sbf|bpf)\b|\bcargo\s+(?:\+\S+\s+)?(?:build(?:-sbf|-bpf)?|b|rustc|test-(?:sbf|bpf))(?![\w-])/;
42
- var resolveCargoCacheEnv = /* @__PURE__ */ __name((script, volumes) => {
43
- if (!script || !CACHE_SAFE_CARGO_RE.test(script) || CARGO_BUILD_RE.test(script)) {
44
- return [];
45
- }
46
- const cacheVolume = volumes.find((volume) => volume.type === "isolate" && volume.containerPath === CARGO_TARGET_CACHE_PATH);
47
- if (!cacheVolume) {
48
- return [];
49
- }
50
- return [
51
- {
52
- name: "CARGO_TARGET_DIR",
53
- value: cacheVolume.containerPath
54
- }
55
- ];
56
- }, "resolveCargoCacheEnv");
57
- var resolveVolumePath = /* @__PURE__ */ __name((volume, workspaceRoot) => volume.type === "host" ? {
58
- ...volume,
59
- hostPath: path.resolve(workspaceRoot, volume.hostPath.replace(/^~/, os.homedir()))
60
- } : volume, "resolveVolumePath");
61
- var ensureDockerImage = /* @__PURE__ */ __name(async (imageUri, dockerPlatform) => {
62
- const platform = dockerPlatform.platform;
63
- const expectedArchitecture = platform?.arch;
64
- const docker$ = dockerPlatform.processEnv ? $({
65
- env: dockerPlatform.processEnv
66
- }) : $;
67
- const probeDockerPlatformContainerCreation = /* @__PURE__ */ __name(async (expectedPlatform) => {
68
- const container = await docker$`docker container create --platform ${expectedPlatform.value} ${imageUri} true`.nothrow().quiet();
69
- if (container.exitCode) {
70
- throw new Error([
71
- "Failed to create Docker platform probe container:",
72
- ` - Image: ${imageUri}`,
73
- ` - Platform: ${expectedPlatform.value}`
74
- ].join("\n"));
75
- }
76
- const containerId = container.stdout.trim();
77
- if (!containerId) {
78
- throw new Error([
79
- "Docker platform probe did not return a container id:",
80
- ` - Image: ${imageUri}`,
81
- ` - Platform: ${expectedPlatform.value}`
82
- ].join("\n"));
83
- }
84
- await docker$`docker container rm ${containerId}`.nothrow().quiet();
85
- }, "probeDockerPlatformContainerCreation");
86
- const localImage = await docker$`docker image inspect --format {{.Architecture}} ${imageUri}`.nothrow().quiet();
87
- if (!localImage.exitCode) {
88
- const cachedArch = localImage.stdout.trim();
89
- if (!platform) {
90
- console.info(`\u2705 Using cached Docker image: ${imageUri}${cachedArch ? ` (${cachedArch})` : ""}`);
91
- return;
92
- }
93
- if (cachedArch === expectedArchitecture) {
94
- await probeDockerPlatformContainerCreation(platform);
95
- console.info(`\u2705 Using cached Docker image: ${imageUri} (${platform.value})`);
96
- return;
97
- }
98
- console.info(`\u{1F504} Cached Docker image does not include the requested platform (${platform.value}); re-pulling.`);
99
- }
100
- console.info(platform ? `\u{1F4E5} Pulling Docker image from: ${imageUri} (platform: ${platform.value})` : `\u{1F4E5} Pulling Docker image from: ${imageUri}`);
101
- const output = await docker$`docker pull ${dockerPlatform.args} ${imageUri}`.nothrow();
102
- if (output.exitCode) {
103
- const stderr = output.stderr ?? "";
104
- const isAuthError = stderr.includes("authorization token has expired") || stderr.includes("denied") || stderr.includes("pull access denied");
105
- throw new Error([
106
- "Docker image not available:",
107
- ` - Image: ${imageUri} (pull failed)`,
108
- isAuthError ? " - ECR auth expired. Run: pnpm localnet login" : " - Check if the image tag exists in image registry."
109
- ].join("\n"));
110
- }
111
- if (platform) {
112
- await probeDockerPlatformContainerCreation(platform);
113
- }
114
- console.info(`\u2705 Successfully pulled: ${imageUri}`);
115
- }, "ensureDockerImage");
116
- async function executeToolCommand(context, toolName, args, { cwd, volumes: userVolumes, customEntrypoint: entrypoint, env: customEnvVars, script, publish, versions = {}, defaultVolumesEnabled = true, local, dockerPlatform: dockerPlatformOverride }) {
117
- const tool = findToolByName(context, toolName);
118
- const dockerPlatform = resolveDockerPlatformExecution({
119
- dockerPlatform: dockerPlatformOverride,
120
- toolDockerPlatform: tool.dockerPlatform
121
- });
122
- if (tool.preExecute) {
123
- await tool.preExecute(context, {
124
- cwd,
125
- args,
126
- volumes: userVolumes,
127
- env: customEnvVars,
128
- script,
129
- publish,
130
- versions,
131
- defaultVolumesEnabled,
132
- dockerPlatform: dockerPlatformOverride
133
- });
134
- }
135
- const resolvedVersion = resolveTypeVersions(context, versions)[tool.name];
136
- if (!resolvedVersion) {
137
- throw new Error(`No version resolved for tool ${tool.name}`);
138
- }
139
- console.info(`\u{1F527} ${tool.name} version: ${resolvedVersion}`);
140
- if (tool.getSecondaryVersion) {
141
- try {
142
- const secondaryVersion = await tool.getSecondaryVersion({
143
- cwd
144
- });
145
- if (!semver.satisfies(secondaryVersion, resolvedVersion)) {
146
- console.warn(`Warning: Local configuration version (${secondaryVersion}) differs from resolved version (${resolvedVersion})`);
147
- }
148
- } catch (error) {
149
- console.warn("Could not validate secondary version:", stringifyError(error));
150
- }
151
- }
152
- if (local) {
153
- return executeLocally(tool, resolvedVersion, {
154
- cwd,
155
- args,
156
- env: customEnvVars,
157
- script
158
- });
159
- }
160
- const workspaceRoot = await findWorkspaceRoot(cwd);
161
- const defaultVolumes = defaultVolumesEnabled ? tool.defaultVolumes ?? [] : [];
162
- const resolvedVolumes = mergeVolumes(defaultVolumes, userVolumes).map((volume) => resolveVolumePath(volume, workspaceRoot));
163
- if (defaultVolumes.length > 0) {
164
- console.info(`\u{1F4E6} Using ${defaultVolumes.length} default volume(s) for ${tool.name}`);
165
- if (userVolumes.length > 0) {
166
- const overrides = userVolumes.filter((userVolume) => defaultVolumes.some((defaultVolume) => defaultVolume.containerPath === userVolume.containerPath));
167
- if (overrides.length > 0) {
168
- console.info(`\u{1F527} User volumes override ${overrides.length} default volume(s)`);
169
- }
170
- }
171
- }
172
- const image = findImageForTool(context, tool.name, resolvedVersion);
173
- const imageUri = await getImageUri(image);
174
- const relativePath = path.relative(workspaceRoot, cwd);
175
- const cacheKey = getImageTag(image);
176
- const qualifiedVolumes = resolvedVolumes.map((volume) => qualifyVolumeName(volume, {
177
- ...dockerPlatform.volumeNameOptions,
178
- cacheKey
179
- }));
180
- await ensureDockerImage(imageUri, dockerPlatform);
181
- if (entrypoint?.trim()) {
182
- console.info(`\u{1F527} Using custom entrypoint: ${entrypoint}`);
183
- }
184
- const defaultEnv = tool.defaultEnv ?? [];
185
- const hasDockerSocketMount = resolvedVolumes.some((volume) => volume.type === "host" && volume.containerPath === "/var/run/docker.sock");
186
- const dockerSocketEnv = hasDockerSocketMount ? [
187
- {
188
- name: "HOST_CWD",
189
- value: cwd
190
- },
191
- {
192
- name: "HOST_WORKSPACE_ROOT",
193
- value: workspaceRoot
194
- }
195
- ] : [];
196
- const cargoCacheEnv = resolveCargoCacheEnv(script, resolvedVolumes);
197
- const envArgs = mergeToolEnv(customEnvVars, dockerSocketEnv, defaultEnv, cargoCacheEnv).flatMap(({ name, value }) => [
198
- "-e",
199
- `${name}=${value}`
200
- ]);
201
- if (cargoCacheEnv.length > 0) {
202
- console.info(`\u{1F5C3}\uFE0F Sharing cargo target cache at ${CARGO_TARGET_CACHE_PATH}`);
203
- }
204
- const hostUserIds = getHostUserIds();
205
- const userIdEnvArgs = hostUserIds ? [
206
- "-e",
207
- `LOCAL_UID=${hostUserIds.uid}`,
208
- "-e",
209
- `LOCAL_GID=${hostUserIds.gid}`
210
- ] : [];
211
- console.info(`\u{1F464} Running container as UID:GID ${hostUserIds?.uid}:${hostUserIds?.gid}`);
212
- if (defaultEnv.length > 0) {
213
- console.info(`\u{1F30D} Using ${defaultEnv.length} default environment variable(s) for ${tool.name}`);
214
- }
215
- if (customEnvVars.length > 0) {
216
- console.info(`\u{1F30D} Using ${customEnvVars.length} custom environment variable(s)`);
217
- }
218
- let finalArgs;
219
- if (script && script.trim() !== "") {
220
- console.info(`\u{1F4DC} Executing custom script: ${script}`);
221
- finalArgs = [
222
- "bash",
223
- "-c",
224
- script
225
- ];
226
- } else {
227
- finalArgs = entrypoint === void 0 ? [
228
- tool.name,
229
- ...args
230
- ] : args;
231
- }
232
- const dockerArgs = [
233
- "run",
234
- ...dockerPlatform.args,
235
- ...tool.privileged ? [
236
- "--privileged"
237
- ] : [],
238
- "--rm",
239
- "--add-host=host.docker.internal:host-gateway",
240
- ...envArgs,
241
- ...userIdEnvArgs,
242
- "-v",
243
- `${workspaceRoot}:/workspace`,
244
- "-w",
245
- `/workspace/${relativePath}`,
246
- ...(publish ?? []).flatMap((p) => [
247
- "-p",
248
- p.trim()
249
- ]),
250
- ...qualifiedVolumes.flatMap((volume) => [
251
- "-v",
252
- `${volume.type === "host" ? volume.hostPath : volume.name}:${volume.containerPath}`
253
- ]),
254
- ...entrypoint ? [
255
- "--entrypoint",
256
- entrypoint
257
- ] : [],
258
- imageUri,
259
- ...finalArgs
260
- ];
261
- const output = await lockMany(qualifiedVolumes.flatMap((volume) => volume.type === "isolate" && volume.locked ? [
262
- volume.name
263
- ] : []), async () => {
264
- const label = `\u23F3 ${finalArgs.join(" ")}`;
265
- console.time(label);
266
- const docker$ = dockerPlatform.processEnv ? $({
267
- env: dockerPlatform.processEnv
268
- }) : $;
269
- const result = await docker$`docker ${dockerArgs}`.nothrow();
270
- console.timeEnd(label);
271
- return result;
272
- });
273
- if (output.exitCode) {
274
- const stdout = output.stdout.trim();
275
- throw new Error(`Failed to run Docker container (exit code: ${output.exitCode})${stdout ? `
276
- ${stdout}` : ""}`);
277
- }
278
- return output;
279
- }
280
- __name(executeToolCommand, "executeToolCommand");
281
-
282
- export { executeToolCommand, mergeToolEnv, resolveCargoCacheEnv };
283
- //# sourceMappingURL=U3L7CZHW.js.map
284
- //# sourceMappingURL=U3L7CZHW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/tool-executor.ts"],"names":["getHostUserIds","userInfo","os","uid","gid","undefined","$","verbose","stdio","process","stderr","mergeVolumes","defaultVolumes","userVolumes","uniqBy","volume","containerPath","mergeToolEnv","layers","flat","name","CACHE_SAFE_CARGO_RE","CARGO_BUILD_RE","resolveCargoCacheEnv","script","volumes","test","cacheVolume","find","type","CARGO_TARGET_CACHE_PATH","value","resolveVolumePath","workspaceRoot","hostPath","path","resolve","replace","homedir","ensureDockerImage","imageUri","dockerPlatform","platform","expectedArchitecture","arch","docker$","processEnv","env","probeDockerPlatformContainerCreation","expectedPlatform","container","nothrow","quiet","exitCode","Error","join","containerId","stdout","trim","localImage","cachedArch","console","info","output","args","isAuthError","includes","executeToolCommand","context","toolName","cwd","customEntrypoint","entrypoint","customEnvVars","publish","versions","defaultVolumesEnabled","local","dockerPlatformOverride","tool","findToolByName","resolveDockerPlatformExecution","toolDockerPlatform","preExecute","resolvedVersion","resolveTypeVersions","getSecondaryVersion","secondaryVersion","satisfies","warn","error","stringifyError","executeLocally","findWorkspaceRoot","resolvedVolumes","map","length","overrides","filter","userVolume","some","defaultVolume","image","findImageForTool","getImageUri","relativePath","relative","cacheKey","getImageTag","qualifiedVolumes","qualifyVolumeName","volumeNameOptions","defaultEnv","hasDockerSocketMount","dockerSocketEnv","cargoCacheEnv","envArgs","flatMap","hostUserIds","userIdEnvArgs","finalArgs","dockerArgs","privileged","p","lockMany","locked","label","time","result","timeEnd"],"mappings":"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","file":"U3L7CZHW.js","sourcesContent":["import { uniqBy } from 'es-toolkit';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\nimport * as semver from 'semver';\nimport { $, type ProcessOutput } from 'zx';\n\nimport type { DockerPlatformOverride, EnvironmentVariable, VolumeMapping } from '../config';\nimport { CARGO_TARGET_CACHE_PATH } from '../config';\nimport type { ChainContext } from '../context';\nimport { findWorkspaceRoot } from '../utils';\nimport {\n type DockerPlatform,\n type DockerPlatformExecution,\n findImageForTool,\n getImageTag,\n getImageUri,\n qualifyVolumeName,\n resolveDockerPlatformExecution,\n} from '../utils/docker';\nimport { stringifyError } from '../utils/error';\nimport { findToolByName } from '../utils/finder';\nimport { executeLocally } from './local-executor';\nimport { lockMany } from './lock';\nimport { resolveTypeVersions } from './version-resolver';\n\n/**\n * Get the current user's UID and GID for Docker container user matching.\n * This prevents permission issues when containers write to bind-mounted directories.\n * On Windows or when running as root, returns undefined as UID/GID matching is not needed.\n */\nconst getHostUserIds = (): { uid: number; gid: number } | undefined => {\n // os.userInfo() returns uid/gid on POSIX systems, -1 on Windows\n const userInfo = os.userInfo();\n if (userInfo.uid === -1 || userInfo.gid === -1) {\n return undefined;\n }\n\n return { uid: userInfo.uid, gid: userInfo.gid };\n};\n\n// Configure zx to inherit stdio by default (moved from original setup)\n$.verbose = true;\n$.stdio = ['inherit', 'pipe', process.stderr];\n\n/**\n * Merge default volumes with user-specified volumes\n * User volumes take precedence when containerPath conflicts\n */\nconst mergeVolumes = (\n defaultVolumes: readonly VolumeMapping[],\n userVolumes: readonly VolumeMapping[],\n): VolumeMapping[] => uniqBy([...userVolumes, ...defaultVolumes], (volume) => volume.containerPath);\n\n/**\n * Merge env layers, highest precedence first. On a name collision the earlier layer wins — so the\n * cache redirect (passed last) can never clobber a user --env or a tool default for the same var.\n */\nexport const mergeToolEnv = (\n ...layers: readonly (readonly EnvironmentVariable[])[]\n): EnvironmentVariable[] => uniqBy(layers.flat(), ({ name }) => name);\n\n// test/nextest/check/clippy, the `t`/`c` aliases, and `cargo test-*`, with an optional +toolchain.\nconst CACHE_SAFE_CARGO_RE =\n /\\bcargo\\s+(?:\\+\\S+\\s+)?(?:test|nextest|check|clippy|t|c)(?:\\s|$)|\\bcargo\\s+(?:\\+\\S+\\s+)?test-\\S+/;\n// Anything that emits host artifacts: cargo build/b, rustc, sbf/bpf (incl. the dashed `cargo-*-sbf`\n// binaries the space-anchored branch would miss), and anchor build / idl build / test (anchor test\n// compiles the program + IDL before running). `(?![\\w-])` ends on a non-word boundary so a\n// separator-glued build (`cargo build;`) still trips it.\nconst CARGO_BUILD_RE =\n /\\banchor\\s+(?:idl\\s+build|build|test)\\b|\\bcargo-(?:build|test)-(?:sbf|bpf)\\b|\\bcargo\\s+(?:\\+\\S+\\s+)?(?:build(?:-sbf|-bpf)?|b|rustc|test-(?:sbf|bpf))(?![\\w-])/;\n\n/**\n * Redirect a cache-safe cargo `--script` to the shared `/cargo-target` mount via CARGO_TARGET_DIR.\n * Skips scripts containing a build (CARGO_BUILD_RE): a build's .so/IDL must reach the host-mounted\n * target/, not the cache. No-ops for tools that don't mount the cache.\n */\nexport const resolveCargoCacheEnv = (\n script: string | undefined,\n volumes: readonly VolumeMapping[],\n): EnvironmentVariable[] => {\n if (!script || !CACHE_SAFE_CARGO_RE.test(script) || CARGO_BUILD_RE.test(script)) {\n return [];\n }\n\n const cacheVolume = volumes.find(\n (volume) => volume.type === 'isolate' && volume.containerPath === CARGO_TARGET_CACHE_PATH,\n );\n if (!cacheVolume) {\n return [];\n }\n\n return [{ name: 'CARGO_TARGET_DIR', value: cacheVolume.containerPath }];\n};\n\n/**\n * Resolve a host path in a volume to an absolute path.\n * - Paths starting with ~ are resolved to home directory\n * - Relative paths (starting with . or no prefix) are resolved to workspace root\n * - Absolute paths are left unchanged\n */\nconst resolveVolumePath = (volume: VolumeMapping, workspaceRoot: string): VolumeMapping =>\n volume.type === 'host'\n ? {\n ...volume,\n hostPath: path.resolve(workspaceRoot, volume.hostPath.replace(/^~/, os.homedir())),\n }\n : volume;\n\nconst ensureDockerImage = async (\n imageUri: string,\n dockerPlatform: DockerPlatformExecution,\n): Promise<void> => {\n const platform = dockerPlatform.platform;\n const expectedArchitecture = platform?.arch;\n const docker$ = dockerPlatform.processEnv ? $({ env: dockerPlatform.processEnv }) : $;\n\n // Probe Docker's runnable platform by creating a container with the requested\n // platform. Docker uses this same platform resolution path for `docker run`.\n //\n // Do not inspect `.ImageManifestDescriptor.platform` here: Docker only added\n // that field in API v1.48 and may still omit it when the daemon does not use a\n // multi-platform image store. `docker image inspect` is also tag/cache-level\n // metadata, not the run-path decision. A successful `container create` is the\n // portable verification signal available without executing the tool command.\n const probeDockerPlatformContainerCreation = async (\n expectedPlatform: DockerPlatform,\n ): Promise<void> => {\n const container =\n await docker$`docker container create --platform ${expectedPlatform.value} ${imageUri} true`\n .nothrow()\n .quiet();\n\n if (container.exitCode) {\n throw new Error(\n [\n 'Failed to create Docker platform probe container:',\n ` - Image: ${imageUri}`,\n ` - Platform: ${expectedPlatform.value}`,\n ].join('\\n'),\n );\n }\n\n const containerId = container.stdout.trim();\n if (!containerId) {\n throw new Error(\n [\n 'Docker platform probe did not return a container id:',\n ` - Image: ${imageUri}`,\n ` - Platform: ${expectedPlatform.value}`,\n ].join('\\n'),\n );\n }\n\n await docker$`docker container rm ${containerId}`.nothrow().quiet();\n };\n\n // NOTE: `docker image ls <ref>` prints repository/tag in separate columns, so\n // `stdout.includes(<full-ref>)` is not reliable. Use `inspect` instead: exitCode=0\n // means the image exists locally.\n // Keep output minimal to avoid dumping full inspect JSON into CI logs.\n //\n // NOTE: Using `.quiet()` to avoid stderr being captured in the CI logs. If the image\n // is not in the cache, the process prints \"Error response from daemon: No such image: ...\"\n // which can confuse the uninitiated. It's just a cache miss, not an error.\n const localImage = await docker$`docker image inspect --format {{.Architecture}} ${imageUri}`\n .nothrow()\n .quiet();\n if (!localImage.exitCode) {\n const cachedArch = localImage.stdout.trim();\n if (!platform) {\n // No platform was requested, so any locally cached image is acceptable.\n console.info(\n `✅ Using cached Docker image: ${imageUri}${cachedArch ? ` (${cachedArch})` : ''}`,\n );\n return;\n }\n\n if (cachedArch === expectedArchitecture) {\n // A pinned platform still needs the container probe because tag-level\n // Architecture can disagree with Docker's actual --platform resolution.\n await probeDockerPlatformContainerCreation(platform);\n console.info(`✅ Using cached Docker image: ${imageUri} (${platform.value})`);\n return;\n }\n\n console.info(\n `🔄 Cached Docker image does not include the requested platform (${platform.value}); re-pulling.`,\n );\n }\n\n console.info(\n platform\n ? `📥 Pulling Docker image from: ${imageUri} (platform: ${platform.value})`\n : `📥 Pulling Docker image from: ${imageUri}`,\n );\n const output = await docker$`docker pull ${dockerPlatform.args} ${imageUri}`.nothrow();\n\n if (output.exitCode) {\n const stderr = output.stderr ?? '';\n const isAuthError =\n stderr.includes('authorization token has expired') ||\n stderr.includes('denied') ||\n stderr.includes('pull access denied');\n\n throw new Error(\n [\n 'Docker image not available:',\n ` - Image: ${imageUri} (pull failed)`,\n isAuthError\n ? ' - ECR auth expired. Run: pnpm localnet login'\n : ' - Check if the image tag exists in image registry.',\n ].join('\\n'),\n );\n }\n\n // After pulling, verify the same platform resolution path used by `docker run`.\n if (platform) {\n await probeDockerPlatformContainerCreation(platform);\n }\n\n console.info(`✅ Successfully pulled: ${imageUri}`);\n};\n\nexport interface ToolCommandExecutionOptions {\n cwd: string;\n volumes: readonly VolumeMapping[];\n customEntrypoint?: string;\n env: EnvironmentVariable[];\n args?: string[];\n script?: string;\n publish?: string[];\n versions?: Record<string, string>;\n defaultVolumesEnabled?: boolean;\n local?: boolean;\n dockerPlatform?: DockerPlatformOverride;\n}\n\n/**\n * Enhanced tool command execution using the new version compatibility matrix system\n */\nexport async function executeToolCommand<TImageId extends string>(\n context: ChainContext<TImageId>,\n toolName: string,\n args: string[],\n {\n cwd,\n volumes: userVolumes,\n customEntrypoint: entrypoint,\n env: customEnvVars,\n script,\n publish,\n versions = {},\n defaultVolumesEnabled = true,\n local,\n dockerPlatform: dockerPlatformOverride,\n }: ToolCommandExecutionOptions,\n): Promise<ProcessOutput> {\n const tool = findToolByName(context, toolName);\n const dockerPlatform = resolveDockerPlatformExecution({\n dockerPlatform: dockerPlatformOverride,\n toolDockerPlatform: tool.dockerPlatform,\n });\n\n // Run pre-execution hook if defined (e.g., toolchain sync)\n // TODO Support a local tool execution.\n if (tool.preExecute) {\n await tool.preExecute(context, {\n cwd,\n args,\n volumes: userVolumes,\n env: customEnvVars,\n script,\n publish,\n versions,\n defaultVolumesEnabled,\n dockerPlatform: dockerPlatformOverride,\n });\n }\n\n // Get the resolved version for the current tool.\n const resolvedVersion = resolveTypeVersions(context, versions)[tool.name];\n\n if (!resolvedVersion) {\n throw new Error(`No version resolved for tool ${tool.name}`);\n }\n\n console.info(`🔧 ${tool.name} version: ${resolvedVersion}`);\n\n // Check secondary version validation if available\n if (tool.getSecondaryVersion) {\n try {\n const secondaryVersion = await tool.getSecondaryVersion({ cwd });\n\n if (!semver.satisfies(secondaryVersion, resolvedVersion)) {\n console.warn(\n `Warning: Local configuration version (${secondaryVersion}) differs from resolved version (${resolvedVersion})`,\n );\n }\n } catch (error) {\n // Secondary version check failed, but continue with resolved version\n console.warn('Could not validate secondary version:', stringifyError(error));\n }\n }\n\n if (local) {\n return executeLocally(tool, resolvedVersion, {\n cwd,\n args,\n env: customEnvVars,\n script,\n });\n }\n\n const workspaceRoot = await findWorkspaceRoot(cwd);\n\n const defaultVolumes = defaultVolumesEnabled ? (tool.defaultVolumes ?? []) : [];\n // Names are qualified below, once imageUri (the toolchain key) resolves.\n const resolvedVolumes = mergeVolumes(defaultVolumes, userVolumes).map((volume) =>\n resolveVolumePath(volume, workspaceRoot),\n );\n\n if (defaultVolumes.length > 0) {\n console.info(`📦 Using ${defaultVolumes.length} default volume(s) for ${tool.name}`);\n\n if (userVolumes.length > 0) {\n const overrides = userVolumes.filter((userVolume) =>\n defaultVolumes.some(\n (defaultVolume) => defaultVolume.containerPath === userVolume.containerPath,\n ),\n );\n\n if (overrides.length > 0) {\n console.info(`🔧 User volumes override ${overrides.length} default volume(s)`);\n }\n }\n }\n\n // Use Docker image with merged volumes\n const image = findImageForTool(context, tool.name, resolvedVersion);\n const imageUri = await getImageUri(image);\n const relativePath = path.relative(workspaceRoot, cwd);\n\n // The image tag keys toolchain-shared caches — it's the registry identity of the pulled image,\n // so artifacts compiled inside it can't bleed across toolchains. See qualifyVolumeName.\n const cacheKey = getImageTag(image);\n const qualifiedVolumes = resolvedVolumes.map((volume) =>\n qualifyVolumeName(volume, { ...dockerPlatform.volumeNameOptions, cacheKey }),\n );\n\n await ensureDockerImage(imageUri, dockerPlatform);\n\n if (entrypoint?.trim()) {\n console.info(`🔧 Using custom entrypoint: ${entrypoint}`);\n }\n\n // Merge default env vars with custom env vars (custom takes precedence)\n const defaultEnv = tool.defaultEnv ?? [];\n\n // Check if Docker socket is mounted (for tools that spawn Docker containers like anchor --verifiable)\n // If so, inject HOST_CWD and HOST_WORKSPACE_ROOT so the inner container knows the host paths\n const hasDockerSocketMount = resolvedVolumes.some(\n (volume) => volume.type === 'host' && volume.containerPath === '/var/run/docker.sock',\n );\n const dockerSocketEnv: EnvironmentVariable[] = hasDockerSocketMount\n ? [\n { name: 'HOST_CWD', value: cwd },\n { name: 'HOST_WORKSPACE_ROOT', value: workspaceRoot },\n ]\n : [];\n\n // Lowest precedence (passed last) so a user --env or tool default for CARGO_TARGET_DIR wins.\n const cargoCacheEnv = resolveCargoCacheEnv(script, resolvedVolumes);\n\n const envArgs = mergeToolEnv(customEnvVars, dockerSocketEnv, defaultEnv, cargoCacheEnv).flatMap(\n ({ name, value }) => ['-e', `${name}=${value}`],\n );\n\n if (cargoCacheEnv.length > 0) {\n console.info(`🗃️ Sharing cargo target cache at ${CARGO_TARGET_CACHE_PATH}`);\n }\n\n // Add host user UID/GID for permission matching on Linux/macOS\n // This prevents artifacts created in containers from having root ownership\n // Used by stellar, sui, and iota images which have an entrypoint that handles UID/GID\n const hostUserIds = getHostUserIds();\n const userIdEnvArgs = hostUserIds\n ? ['-e', `LOCAL_UID=${hostUserIds.uid}`, '-e', `LOCAL_GID=${hostUserIds.gid}`]\n : [];\n\n console.info(`👤 Running container as UID:GID ${hostUserIds?.uid}:${hostUserIds?.gid}`);\n\n if (defaultEnv.length > 0) {\n console.info(\n `🌍 Using ${defaultEnv.length} default environment variable(s) for ${tool.name}`,\n );\n }\n if (customEnvVars.length > 0) {\n console.info(`🌍 Using ${customEnvVars.length} custom environment variable(s)`);\n }\n\n // Handle custom script execution\n let finalArgs: string[];\n if (script && script.trim() !== '') {\n console.info(`📜 Executing custom script: ${script}`);\n finalArgs = ['bash', '-c', script];\n } else {\n finalArgs = entrypoint === undefined ? [tool.name, ...args] : args;\n }\n\n // Build the Docker command with proper argument separation\n const dockerArgs = [\n 'run',\n ...dockerPlatform.args,\n ...(tool.privileged ? ['--privileged'] : []),\n '--rm',\n '--add-host=host.docker.internal:host-gateway',\n ...envArgs,\n ...userIdEnvArgs,\n '-v',\n `${workspaceRoot}:/workspace`,\n '-w',\n `/workspace/${relativePath}`,\n ...(publish ?? []).flatMap((p) => ['-p', p.trim()]),\n ...qualifiedVolumes.flatMap((volume) => [\n '-v',\n `${volume.type === 'host' ? volume.hostPath : volume.name}:${volume.containerPath}`,\n ]),\n ...(entrypoint ? ['--entrypoint', entrypoint] : []),\n imageUri,\n ...finalArgs,\n ];\n\n const output = await lockMany(\n qualifiedVolumes.flatMap((volume) =>\n volume.type === 'isolate' && volume.locked ? [volume.name] : [],\n ),\n async () => {\n const label = `⏳ ${finalArgs.join(' ')}`;\n console.time(label);\n const docker$ = dockerPlatform.processEnv ? $({ env: dockerPlatform.processEnv }) : $;\n const result = await docker$`docker ${dockerArgs}`.nothrow();\n console.timeEnd(label);\n\n return result;\n },\n );\n\n if (output.exitCode) {\n const stdout = output.stdout.trim();\n throw new Error(\n `Failed to run Docker container (exit code: ${output.exitCode})${stdout ? `\\n${stdout}` : ''}`,\n );\n }\n\n return output;\n}\n"]}