@layerzerolabs/vm-tooling 0.2.104 → 0.2.106

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 (54) hide show
  1. package/dist/{5PWUQUE5.js → DVALPAAO.js} +25 -3
  2. package/dist/DVALPAAO.js.map +1 -0
  3. package/dist/{3IQB2ZZF.js → E35WFC4E.js} +3 -3
  4. package/dist/{3IQB2ZZF.js.map → E35WFC4E.js.map} +1 -1
  5. package/dist/{TMKE5ARZ.js → EY2G7NK4.js} +3 -3
  6. package/dist/{TMKE5ARZ.js.map → EY2G7NK4.js.map} +1 -1
  7. package/dist/{SQYDOF2V.js → GFKRACRT.js} +3 -3
  8. package/dist/{SQYDOF2V.js.map → GFKRACRT.js.map} +1 -1
  9. package/dist/GIFXFMSS.js +13 -0
  10. package/dist/GIFXFMSS.js.map +1 -0
  11. package/dist/{TSEHDOF7.js → GMN3ZEOV.js} +14 -6
  12. package/dist/GMN3ZEOV.js.map +1 -0
  13. package/dist/{INYD2E56.js → HN2JUVAX.js} +94 -29
  14. package/dist/HN2JUVAX.js.map +1 -0
  15. package/dist/KN3TRHEZ.js +107 -0
  16. package/dist/KN3TRHEZ.js.map +1 -0
  17. package/dist/{HOFCGMNS.js → TMIYMQW3.js} +27 -9
  18. package/dist/TMIYMQW3.js.map +1 -0
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +6 -5
  21. package/dist/config.d.ts +12 -1
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +2 -1
  24. package/dist/core/index.js +5 -4
  25. package/dist/core/local-executor.test.js +1 -1
  26. package/dist/core/lock.test.js +1 -1
  27. package/dist/core/tool-executor.d.ts +14 -2
  28. package/dist/core/tool-executor.d.ts.map +1 -1
  29. package/dist/core/tool-executor.js +5 -4
  30. package/dist/core/tool-executor.test.js +180 -0
  31. package/dist/core/tool-executor.test.js.map +1 -0
  32. package/dist/environment.d.ts +4 -0
  33. package/dist/environment.d.ts.map +1 -0
  34. package/dist/environment.js +4 -0
  35. package/dist/environment.js.map +1 -0
  36. package/dist/github/index.js +5 -4
  37. package/dist/github/matrix.js +4 -3
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -8
  41. package/dist/index.js.map +1 -1
  42. package/dist/test.js +4 -3
  43. package/dist/utils/docker.d.ts +30 -3
  44. package/dist/utils/docker.d.ts.map +1 -1
  45. package/dist/utils/docker.js +3 -2
  46. package/dist/utils/docker.test.js +272 -0
  47. package/dist/utils/docker.test.js.map +1 -0
  48. package/package.json +5 -5
  49. package/dist/5PWUQUE5.js.map +0 -1
  50. package/dist/HOFCGMNS.js.map +0 -1
  51. package/dist/INYD2E56.js.map +0 -1
  52. package/dist/RVVZQC34.js +0 -56
  53. package/dist/RVVZQC34.js.map +0 -1
  54. package/dist/TSEHDOF7.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { getImageTag } from './RVVZQC34.js';
1
+ import { getImageTag } from './KN3TRHEZ.js';
2
2
  import { getImageName } from './3XEUJAQB.js';
3
3
  import { init_esm_shims, __name } from './CWKWODSW.js';
4
4
  import { constantCase } from 'es-toolkit';
@@ -51,5 +51,5 @@ var generateGithubMatrix = /* @__PURE__ */ __name((images, directory, versionCom
51
51
  }, "generateGithubMatrix");
52
52
 
53
53
  export { generateGithubMatrix };
54
- //# sourceMappingURL=3IQB2ZZF.js.map
55
- //# sourceMappingURL=3IQB2ZZF.js.map
54
+ //# sourceMappingURL=E35WFC4E.js.map
55
+ //# sourceMappingURL=E35WFC4E.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/github/matrix.ts"],"names":["generateGithubMatrix","images","directory","versionCombinations","createImageEntry","imageId","image","tag","getImageTag","Error","entry","id","name","build_args","Object","entries","versions","dependencies","sort","map","key","value","constantCase","join","image_name","getImageName","tags","results","imageEntries","r","mirroredImages","filter","result","mirrorRegistries","length","flatMap","mirror","activeImages","activeImageIds","Set","combo","values","push"],"mappings":";;;;;;;AAAA,cAAA,EAAA;AA8BO,IAAMA,oBAAAA,mBAAuB,MAAA,CAAA,CAChCC,MAAAA,EACAC,SAAAA,EACAC,mBAAAA,KAAAA;AAEA,EAAA,MAAMC,gBAAAA,mBAAmB,MAAA,CAAA,CAAC,CAACC,OAAAA,EAASC,KAAAA,CAAAA,KAAuB;AAIvD,IAAA,MAAMC,GAAAA,GAAMC,YAAYF,KAAAA,CAAAA;AAExB,IAAA,IAAI,CAACC,GAAAA,EAAK;AACN,MAAA,MAAM,IAAIE,KAAAA,CACN,CAAA,OAAA,EAAUJ,OAAAA,CAAAA,qEAAAA,CAA8E,CAAA;AAEhG,IAAA;AAEA,IAAA,OAAO;MACHK,KAAAA,EAAO;QACHC,EAAAA,EAAIN,OAAAA;AACJO,QAAAA,IAAAA,EAAMN,KAAAA,CAAMM,IAAAA;AACZC,QAAAA,UAAAA,EAAYC,OAAOC,OAAAA,CAAQ;AAAE,UAAA,GAAGT,KAAAA,CAAMU,QAAAA;AAAU,UAAA,GAAGV,KAAAA,CAAMW;AAAa,SAAA,CAAA,CACjEC,IAAAA,EAAI,CACJC,GAAAA,CAAI,CAAC,CAACC,GAAAA,EAAKC,KAAAA,CAAAA,KAAW,GAAGC,YAAAA,CAAaF,GAAAA,CAAAA,CAAAA,SAAAA,EAAgBC,KAAAA,CAAAA,CAAO,CAAA;AAClEnB,QAAAA,SAAAA,EAAWqB,IAAAA,CAAKrB,SAAAA,EAAW,QAAA,EAAUI,KAAAA,CAAMM,IAAI,CAAA;QAC/CY,UAAAA,EAAYC,YAAAA,CAAanB,MAAMM,IAAI,CAAA;QACnCc,IAAAA,EAAM;AAACnB,UAAAA;;AACX,OAAA;AACAD,MAAAA;AACJ,KAAA;EACJ,CAAA,EAzByB,kBAAA,CAAA;AA2BzB,EAAA,MAAMqB,UAAUb,MAAAA,CAAOC,OAAAA,CAAQd,MAAAA,CAAAA,CAAQkB,IAAIf,gBAAAA,CAAAA;AAE3C,EAAA,MAAMwB,eAAeD,OAAAA,CAAQR,GAAAA,CAAI,CAACU,CAAAA,KAAMA,EAAEnB,KAAK,CAAA;AAE/C,EAAA,MAAMoB,cAAAA,GAAiBH,QAClBI,MAAAA,CAAO,CAACC,WAAWA,MAAAA,CAAO1B,KAAAA,CAAM2B,kBAAkBC,MAAAA,CAAAA,CAClDC,QAAQ,CAAC,EAAEzB,OAAOJ,KAAAA,EAAK,KACpBA,MAAM2B,gBAAAA,CAAkBd,GAAAA,CAAI,CAACiB,MAAAA,MAAY;AACrCzB,IAAAA,EAAAA,EAAID,KAAAA,CAAMC,EAAAA;AACVC,IAAAA,IAAAA,EAAMF,KAAAA,CAAME,IAAAA;AACZY,IAAAA,UAAAA,EAAYd,KAAAA,CAAMc,UAAAA;AAClBE,IAAAA,IAAAA,EAAMhB,KAAAA,CAAMgB,IAAAA;AACZU,IAAAA;AACJ,GAAA,CAAA,CAAA,CAAA;AAGR,EAAA,MAAMC,eAAyB,EAAA;AAC/B,EAAA,IAAIlC,mBAAAA,EAAqB;AACrB,IAAA,MAAMmC,cAAAA,GAAiB,IAAIC,GAAAA,CACvBpC,mBAAAA,CAAoBgC,OAAAA,CAAQ,CAACK,KAAAA,KAAU1B,MAAAA,CAAO2B,MAAAA,CAAOD,KAAAA,CAAMvC,MAAM,CAAA,CAAA,CAAA;AAErEoC,IAAAA,YAAAA,CAAaK,IAAAA,CAAI,GAAIJ,cAAAA,CAAAA;AACzB,EAAA;AAEA,EAAA,OAAO;IAAErC,MAAAA,EAAQ2B,YAAAA;AAAcE,IAAAA,cAAAA;AAAgBO,IAAAA;AAAa,GAAA;AAChE,CAAA,EAzDoC,sBAAA","file":"3IQB2ZZF.js","sourcesContent":["import { constantCase } from 'es-toolkit';\nimport { join } from 'node:path';\n\nimport { type Image, type VersionCombination } from '../config';\nimport { getImageTag } from '../utils/docker';\nimport { getImageName } from '../utils/finder';\n\ninterface ImageEntry {\n id: string;\n name: string;\n build_args: string[];\n image_name: string;\n tags: string[];\n directory: string;\n}\n\ninterface MirroredImageEntry {\n id: string;\n name: string;\n image_name: string;\n tags: string[];\n mirror: string;\n}\n\ninterface GithubMatrixOutput {\n images: ImageEntry[];\n mirroredImages: MirroredImageEntry[];\n activeImages: string[];\n}\n\nexport const generateGithubMatrix = (\n images: Record<string, Image>,\n directory: string,\n versionCombinations?: VersionCombination<string>[],\n): GithubMatrixOutput => {\n const createImageEntry = ([imageId, image]: [string, Image]): {\n entry: ImageEntry;\n image: Image;\n } => {\n const tag = getImageTag(image);\n\n if (!tag) {\n throw new Error(\n `Image \"${imageId}\" produced no tags. Every image must have at least one non-empty tag.`,\n );\n }\n\n return {\n entry: {\n id: imageId,\n name: image.name,\n build_args: Object.entries({ ...image.versions, ...image.dependencies })\n .sort()\n .map(([key, value]) => `${constantCase(key)}_VERSION=${value}`),\n directory: join(directory, 'docker', image.name),\n image_name: getImageName(image.name),\n tags: [tag],\n },\n image,\n };\n };\n\n const results = Object.entries(images).map(createImageEntry);\n\n const imageEntries = results.map((r) => r.entry);\n\n const mirroredImages = results\n .filter((result) => result.image.mirrorRegistries?.length)\n .flatMap(({ entry, image }) =>\n image.mirrorRegistries!.map((mirror) => ({\n id: entry.id,\n name: entry.name,\n image_name: entry.image_name,\n tags: entry.tags,\n mirror,\n })),\n );\n\n const activeImages: string[] = [];\n if (versionCombinations) {\n const activeImageIds = new Set(\n versionCombinations.flatMap((combo) => Object.values(combo.images)),\n );\n activeImages.push(...activeImageIds);\n }\n\n return { images: imageEntries, mirroredImages, activeImages };\n};\n"]}
1
+ {"version":3,"sources":["../src/github/matrix.ts"],"names":["generateGithubMatrix","images","directory","versionCombinations","createImageEntry","imageId","image","tag","getImageTag","Error","entry","id","name","build_args","Object","entries","versions","dependencies","sort","map","key","value","constantCase","join","image_name","getImageName","tags","results","imageEntries","r","mirroredImages","filter","result","mirrorRegistries","length","flatMap","mirror","activeImages","activeImageIds","Set","combo","values","push"],"mappings":";;;;;;;AAAA,cAAA,EAAA;AA8BO,IAAMA,oBAAAA,mBAAuB,MAAA,CAAA,CAChCC,MAAAA,EACAC,SAAAA,EACAC,mBAAAA,KAAAA;AAEA,EAAA,MAAMC,gBAAAA,mBAAmB,MAAA,CAAA,CAAC,CAACC,OAAAA,EAASC,KAAAA,CAAAA,KAAuB;AAIvD,IAAA,MAAMC,GAAAA,GAAMC,YAAYF,KAAAA,CAAAA;AAExB,IAAA,IAAI,CAACC,GAAAA,EAAK;AACN,MAAA,MAAM,IAAIE,KAAAA,CACN,CAAA,OAAA,EAAUJ,OAAAA,CAAAA,qEAAAA,CAA8E,CAAA;AAEhG,IAAA;AAEA,IAAA,OAAO;MACHK,KAAAA,EAAO;QACHC,EAAAA,EAAIN,OAAAA;AACJO,QAAAA,IAAAA,EAAMN,KAAAA,CAAMM,IAAAA;AACZC,QAAAA,UAAAA,EAAYC,OAAOC,OAAAA,CAAQ;AAAE,UAAA,GAAGT,KAAAA,CAAMU,QAAAA;AAAU,UAAA,GAAGV,KAAAA,CAAMW;AAAa,SAAA,CAAA,CACjEC,IAAAA,EAAI,CACJC,GAAAA,CAAI,CAAC,CAACC,GAAAA,EAAKC,KAAAA,CAAAA,KAAW,GAAGC,YAAAA,CAAaF,GAAAA,CAAAA,CAAAA,SAAAA,EAAgBC,KAAAA,CAAAA,CAAO,CAAA;AAClEnB,QAAAA,SAAAA,EAAWqB,IAAAA,CAAKrB,SAAAA,EAAW,QAAA,EAAUI,KAAAA,CAAMM,IAAI,CAAA;QAC/CY,UAAAA,EAAYC,YAAAA,CAAanB,MAAMM,IAAI,CAAA;QACnCc,IAAAA,EAAM;AAACnB,UAAAA;;AACX,OAAA;AACAD,MAAAA;AACJ,KAAA;EACJ,CAAA,EAzByB,kBAAA,CAAA;AA2BzB,EAAA,MAAMqB,UAAUb,MAAAA,CAAOC,OAAAA,CAAQd,MAAAA,CAAAA,CAAQkB,IAAIf,gBAAAA,CAAAA;AAE3C,EAAA,MAAMwB,eAAeD,OAAAA,CAAQR,GAAAA,CAAI,CAACU,CAAAA,KAAMA,EAAEnB,KAAK,CAAA;AAE/C,EAAA,MAAMoB,cAAAA,GAAiBH,QAClBI,MAAAA,CAAO,CAACC,WAAWA,MAAAA,CAAO1B,KAAAA,CAAM2B,kBAAkBC,MAAAA,CAAAA,CAClDC,QAAQ,CAAC,EAAEzB,OAAOJ,KAAAA,EAAK,KACpBA,MAAM2B,gBAAAA,CAAkBd,GAAAA,CAAI,CAACiB,MAAAA,MAAY;AACrCzB,IAAAA,EAAAA,EAAID,KAAAA,CAAMC,EAAAA;AACVC,IAAAA,IAAAA,EAAMF,KAAAA,CAAME,IAAAA;AACZY,IAAAA,UAAAA,EAAYd,KAAAA,CAAMc,UAAAA;AAClBE,IAAAA,IAAAA,EAAMhB,KAAAA,CAAMgB,IAAAA;AACZU,IAAAA;AACJ,GAAA,CAAA,CAAA,CAAA;AAGR,EAAA,MAAMC,eAAyB,EAAA;AAC/B,EAAA,IAAIlC,mBAAAA,EAAqB;AACrB,IAAA,MAAMmC,cAAAA,GAAiB,IAAIC,GAAAA,CACvBpC,mBAAAA,CAAoBgC,OAAAA,CAAQ,CAACK,KAAAA,KAAU1B,MAAAA,CAAO2B,MAAAA,CAAOD,KAAAA,CAAMvC,MAAM,CAAA,CAAA,CAAA;AAErEoC,IAAAA,YAAAA,CAAaK,IAAAA,CAAI,GAAIJ,cAAAA,CAAAA;AACzB,EAAA;AAEA,EAAA,OAAO;IAAErC,MAAAA,EAAQ2B,YAAAA;AAAcE,IAAAA,cAAAA;AAAgBO,IAAAA;AAAa,GAAA;AAChE,CAAA,EAzDoC,sBAAA","file":"E35WFC4E.js","sourcesContent":["import { constantCase } from 'es-toolkit';\nimport { join } from 'node:path';\n\nimport { type Image, type VersionCombination } from '../config';\nimport { getImageTag } from '../utils/docker';\nimport { getImageName } from '../utils/finder';\n\ninterface ImageEntry {\n id: string;\n name: string;\n build_args: string[];\n image_name: string;\n tags: string[];\n directory: string;\n}\n\ninterface MirroredImageEntry {\n id: string;\n name: string;\n image_name: string;\n tags: string[];\n mirror: string;\n}\n\ninterface GithubMatrixOutput {\n images: ImageEntry[];\n mirroredImages: MirroredImageEntry[];\n activeImages: string[];\n}\n\nexport const generateGithubMatrix = (\n images: Record<string, Image>,\n directory: string,\n versionCombinations?: VersionCombination<string>[],\n): GithubMatrixOutput => {\n const createImageEntry = ([imageId, image]: [string, Image]): {\n entry: ImageEntry;\n image: Image;\n } => {\n const tag = getImageTag(image);\n\n if (!tag) {\n throw new Error(\n `Image \"${imageId}\" produced no tags. Every image must have at least one non-empty tag.`,\n );\n }\n\n return {\n entry: {\n id: imageId,\n name: image.name,\n build_args: Object.entries({ ...image.versions, ...image.dependencies })\n .sort()\n .map(([key, value]) => `${constantCase(key)}_VERSION=${value}`),\n directory: join(directory, 'docker', image.name),\n image_name: getImageName(image.name),\n tags: [tag],\n },\n image,\n };\n };\n\n const results = Object.entries(images).map(createImageEntry);\n\n const imageEntries = results.map((r) => r.entry);\n\n const mirroredImages = results\n .filter((result) => result.image.mirrorRegistries?.length)\n .flatMap(({ entry, image }) =>\n image.mirrorRegistries!.map((mirror) => ({\n id: entry.id,\n name: entry.name,\n image_name: entry.image_name,\n tags: entry.tags,\n mirror,\n })),\n );\n\n const activeImages: string[] = [];\n if (versionCombinations) {\n const activeImageIds = new Set(\n versionCombinations.flatMap((combo) => Object.values(combo.images)),\n );\n activeImages.push(...activeImageIds);\n }\n\n return { images: imageEntries, mirroredImages, activeImages };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { getImageTag, getImageUri } from './RVVZQC34.js';
1
+ import { getImageTag, getImageUri } from './KN3TRHEZ.js';
2
2
  import { init_esm_shims, __name } from './CWKWODSW.js';
3
3
  import { execFile } from 'child_process';
4
4
  import { promisify } from 'util';
@@ -62,5 +62,5 @@ var testTools = /* @__PURE__ */ __name(({ describe, expect, it, beforeAll }, ima
62
62
  }, "testTools");
63
63
 
64
64
  export { testTools };
65
- //# sourceMappingURL=TMKE5ARZ.js.map
66
- //# sourceMappingURL=TMKE5ARZ.js.map
65
+ //# sourceMappingURL=EY2G7NK4.js.map
66
+ //# sourceMappingURL=EY2G7NK4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test.ts"],"names":["COMMAND_TIMEOUT","PULL_TIMEOUT","VERSION_TEST_TIMEOUT","runCommand","command","args","timeout","promisify","execFile","killSignal","stdout","trim","ensureDockerImageExists","imageUri","testTools","describe","expect","it","beforeAll","images","_versionCombinations","versionCommands","name","image","Object","entries","getImageTag","join","toBe","literalImage","values","getImageUri","tool","expectedVersion","versions","Array","Error","version","toContain"],"mappings":"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","file":"TMKE5ARZ.js","sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type * as vitest from 'vitest';\n\nimport type { VersionCombination } from './config';\nimport { type Image } from './config';\nimport { getImageTag, getImageUri } from './utils/docker';\n\nconst COMMAND_TIMEOUT = 5 * 60_000;\nconst PULL_TIMEOUT = 10 * 60_000;\nconst VERSION_TEST_TIMEOUT = 15 * 60_000;\n\nconst runCommand = async (\n command: string,\n args: string[],\n timeout = COMMAND_TIMEOUT,\n): Promise<string> =>\n (\n await promisify(execFile)(command, args, {\n timeout,\n killSignal: 'SIGKILL', // Force kill if timeout\n })\n ).stdout.trim();\n\n/** Run a no-op command in the image to trigger a pull if it's not available locally. */\nconst ensureDockerImageExists = async (imageUri: string): Promise<void> => {\n await runCommand('docker', ['run', '--rm', '--entrypoint', 'true', imageUri], PULL_TIMEOUT);\n};\n\nexport const testTools = (\n { describe, expect, it, beforeAll }: typeof vitest,\n images: Record<string, Image>,\n _versionCombinations: VersionCombination<string>[],\n versionCommands: Record<string, string[]>,\n): void => {\n describe('Docker image IDs', () => {\n for (const [name, image] of Object.entries(images)) {\n it(`has an image ID of ${name}`, () => {\n expect([image.name, getImageTag(image)].join(':')).toBe(name);\n });\n }\n });\n\n describe('Tool versions', () => {\n for (const literalImage of Object.values(images)) {\n const image: Image = literalImage;\n\n describe(getImageTag(image), () => {\n let imageUri: string;\n\n beforeAll(async () => {\n imageUri = await getImageUri(image);\n await ensureDockerImageExists(imageUri);\n }, PULL_TIMEOUT);\n\n for (const [tool, expectedVersion] of Object.entries(image.versions)) {\n it(\n `should have ${tool} of version ${expectedVersion}`,\n async () => {\n if (!(versionCommands[tool] instanceof Array)) {\n throw new Error('Missing version command');\n }\n\n const version = await runCommand('docker', [\n 'run',\n '--rm',\n '--privileged',\n imageUri,\n ...versionCommands[tool],\n ]);\n\n expect(version).toContain(expectedVersion);\n },\n VERSION_TEST_TIMEOUT,\n );\n }\n });\n }\n });\n};\n"]}
1
+ {"version":3,"sources":["../src/test.ts"],"names":["COMMAND_TIMEOUT","PULL_TIMEOUT","VERSION_TEST_TIMEOUT","runCommand","command","args","timeout","promisify","execFile","killSignal","stdout","trim","ensureDockerImageExists","imageUri","testTools","describe","expect","it","beforeAll","images","_versionCombinations","versionCommands","name","image","Object","entries","getImageTag","join","toBe","literalImage","values","getImageUri","tool","expectedVersion","versions","Array","Error","version","toContain"],"mappings":"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","file":"EY2G7NK4.js","sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type * as vitest from 'vitest';\n\nimport type { VersionCombination } from './config';\nimport { type Image } from './config';\nimport { getImageTag, getImageUri } from './utils/docker';\n\nconst COMMAND_TIMEOUT = 5 * 60_000;\nconst PULL_TIMEOUT = 10 * 60_000;\nconst VERSION_TEST_TIMEOUT = 15 * 60_000;\n\nconst runCommand = async (\n command: string,\n args: string[],\n timeout = COMMAND_TIMEOUT,\n): Promise<string> =>\n (\n await promisify(execFile)(command, args, {\n timeout,\n killSignal: 'SIGKILL', // Force kill if timeout\n })\n ).stdout.trim();\n\n/** Run a no-op command in the image to trigger a pull if it's not available locally. */\nconst ensureDockerImageExists = async (imageUri: string): Promise<void> => {\n await runCommand('docker', ['run', '--rm', '--entrypoint', 'true', imageUri], PULL_TIMEOUT);\n};\n\nexport const testTools = (\n { describe, expect, it, beforeAll }: typeof vitest,\n images: Record<string, Image>,\n _versionCombinations: VersionCombination<string>[],\n versionCommands: Record<string, string[]>,\n): void => {\n describe('Docker image IDs', () => {\n for (const [name, image] of Object.entries(images)) {\n it(`has an image ID of ${name}`, () => {\n expect([image.name, getImageTag(image)].join(':')).toBe(name);\n });\n }\n });\n\n describe('Tool versions', () => {\n for (const literalImage of Object.values(images)) {\n const image: Image = literalImage;\n\n describe(getImageTag(image), () => {\n let imageUri: string;\n\n beforeAll(async () => {\n imageUri = await getImageUri(image);\n await ensureDockerImageExists(imageUri);\n }, PULL_TIMEOUT);\n\n for (const [tool, expectedVersion] of Object.entries(image.versions)) {\n it(\n `should have ${tool} of version ${expectedVersion}`,\n async () => {\n if (!(versionCommands[tool] instanceof Array)) {\n throw new Error('Missing version command');\n }\n\n const version = await runCommand('docker', [\n 'run',\n '--rm',\n '--privileged',\n imageUri,\n ...versionCommands[tool],\n ]);\n\n expect(version).toContain(expectedVersion);\n },\n VERSION_TEST_TIMEOUT,\n );\n }\n });\n }\n });\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { generateGithubMatrix } from './3IQB2ZZF.js';
1
+ import { generateGithubMatrix } from './E35WFC4E.js';
2
2
  import { init_esm_shims, __name } from './CWKWODSW.js';
3
3
  import { stdout } from 'process';
4
4
 
@@ -11,5 +11,5 @@ var runGithubMatrixGenerator = /* @__PURE__ */ __name(async (images, directory,
11
11
  }, "runGithubMatrixGenerator");
12
12
 
13
13
  export { runGithubMatrixGenerator };
14
- //# sourceMappingURL=SQYDOF2V.js.map
15
- //# sourceMappingURL=SQYDOF2V.js.map
14
+ //# sourceMappingURL=GFKRACRT.js.map
15
+ //# sourceMappingURL=GFKRACRT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/github/index.ts"],"names":["runGithubMatrixGenerator","images","directory","versionCombinations","entries","generateGithubMatrix","console","warn","JSON","stringify","stdout","write"],"mappings":";;;;;AAAA,cAAA,EAAA;AAKO,IAAMA,wBAAAA,mBAA2B,MAAA,CAAA,OACpCC,MAAAA,EACAC,SAAAA,EACAC,mBAAAA,KAAAA;AAEA,EAAA,MAAMC,OAAAA,GAAUC,oBAAAA,CAAqBJ,MAAAA,EAAQC,SAAAA,EAAWC,mBAAAA,CAAAA;AAExDG,EAAAA,OAAAA,CAAQC,KAAK,iCAAA,EAAmCC,IAAAA,CAAKC,UAAUL,OAAAA,EAAS,IAAA,EAAM,CAAA,CAAA,CAAA;AAC9EM,EAAAA,MAAAA,CAAOC,KAAAA,CAAMH,IAAAA,CAAKC,SAAAA,CAAUL,OAAAA,CAAAA,CAAAA;AAChC,CAAA,EATwC,0BAAA","file":"SQYDOF2V.js","sourcesContent":["import { stdout } from 'node:process';\n\nimport type { Image, VersionCombination } from '../config';\nimport { generateGithubMatrix } from './matrix';\n\nexport const runGithubMatrixGenerator = async (\n images: Record<string, Image>,\n directory: string,\n versionCombinations?: VersionCombination<string>[],\n): Promise<void> => {\n const entries = generateGithubMatrix(images, directory, versionCombinations);\n\n console.warn('GitHub Action matrix generated:', JSON.stringify(entries, null, 2));\n stdout.write(JSON.stringify(entries));\n};\n"]}
1
+ {"version":3,"sources":["../src/github/index.ts"],"names":["runGithubMatrixGenerator","images","directory","versionCombinations","entries","generateGithubMatrix","console","warn","JSON","stringify","stdout","write"],"mappings":";;;;;AAAA,cAAA,EAAA;AAKO,IAAMA,wBAAAA,mBAA2B,MAAA,CAAA,OACpCC,MAAAA,EACAC,SAAAA,EACAC,mBAAAA,KAAAA;AAEA,EAAA,MAAMC,OAAAA,GAAUC,oBAAAA,CAAqBJ,MAAAA,EAAQC,SAAAA,EAAWC,mBAAAA,CAAAA;AAExDG,EAAAA,OAAAA,CAAQC,KAAK,iCAAA,EAAmCC,IAAAA,CAAKC,UAAUL,OAAAA,EAAS,IAAA,EAAM,CAAA,CAAA,CAAA;AAC9EM,EAAAA,MAAAA,CAAOC,KAAAA,CAAMH,IAAAA,CAAKC,SAAAA,CAAUL,OAAAA,CAAAA,CAAAA;AAChC,CAAA,EATwC,0BAAA","file":"GFKRACRT.js","sourcesContent":["import { stdout } from 'node:process';\n\nimport type { Image, VersionCombination } from '../config';\nimport { generateGithubMatrix } from './matrix';\n\nexport const runGithubMatrixGenerator = async (\n images: Record<string, Image>,\n directory: string,\n versionCombinations?: VersionCombination<string>[],\n): Promise<void> => {\n const entries = generateGithubMatrix(images, directory, versionCombinations);\n\n console.warn('GitHub Action matrix generated:', JSON.stringify(entries, null, 2));\n stdout.write(JSON.stringify(entries));\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import { init_esm_shims, __name } from './CWKWODSW.js';
2
+ import { env } from 'process';
3
+
4
+ // src/environment.ts
5
+ init_esm_shims();
6
+ var parseBoolean = /* @__PURE__ */ __name((value) => !!value && !!JSON.parse(value), "parseBoolean");
7
+ var local = parseBoolean(env.VM_TOOLING_LOCAL);
8
+ var registry = env.VM_TOOLING_REGISTRY;
9
+ var imageDirectory = env.VM_TOOLING_IMAGE_DIRECTORY;
10
+
11
+ export { imageDirectory, local, registry };
12
+ //# sourceMappingURL=GIFXFMSS.js.map
13
+ //# sourceMappingURL=GIFXFMSS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/environment.ts"],"names":["parseBoolean","value","JSON","parse","local","env","VM_TOOLING_LOCAL","registry","VM_TOOLING_REGISTRY","imageDirectory","VM_TOOLING_IMAGE_DIRECTORY"],"mappings":";;;;AAAA,cAAA,EAAA;AAEA,IAAMA,YAAAA,mBAAe,MAAA,CAAA,CAACC,KAAAA,KAAuC,CAAC,CAACA,KAAAA,IAAS,CAAC,CAACC,IAAAA,CAAKC,KAAAA,CAAMF,KAAAA,CAAAA,EAAhE,cAAA,CAAA;AAEd,IAAMG,KAAAA,GAAiBJ,YAAAA,CAAaK,GAAAA,CAAIC,gBAAgB;AACxD,IAAMC,WAA+BF,GAAAA,CAAIG;AACzC,IAAMC,iBAAqCJ,GAAAA,CAAIK","file":"GIFXFMSS.js","sourcesContent":["import { env } from 'node:process';\n\nconst parseBoolean = (value: string | undefined): boolean => !!value && !!JSON.parse(value);\n\nexport const local: boolean = parseBoolean(env.VM_TOOLING_LOCAL);\nexport const registry: string | undefined = env.VM_TOOLING_REGISTRY;\nexport const imageDirectory: string | undefined = env.VM_TOOLING_IMAGE_DIRECTORY;\n"]}
@@ -1,6 +1,7 @@
1
1
  import { displayVersionCombinations, displayToolVersionInfo } from './QH3FM6DD.js';
2
- import { executeToolCommand } from './INYD2E56.js';
3
- import { volumeMappingSchema } from './HOFCGMNS.js';
2
+ import { executeToolCommand } from './HN2JUVAX.js';
3
+ import { volumeMappingSchema, DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION, isDockerPlatformOverride } from './TMIYMQW3.js';
4
+ import { local } from './GIFXFMSS.js';
4
5
  import { getToolDefaultVersion, getToolSupportedVersions } from './3XEUJAQB.js';
5
6
  import { init_esm_shims, __name } from './CWKWODSW.js';
6
7
  import { Command } from 'commander';
@@ -11,6 +12,12 @@ import process from 'process';
11
12
 
12
13
  // src/cli.ts
13
14
  init_esm_shims();
15
+ var parseDockerPlatformOverride = /* @__PURE__ */ __name((input) => {
16
+ if (isDockerPlatformOverride(input)) {
17
+ return input;
18
+ }
19
+ throw new Error(`Invalid docker platform: ${String(input)}. Expected ${DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION}.`);
20
+ }, "parseDockerPlatformOverride");
14
21
  var createCli = /* @__PURE__ */ __name((context, registerExtraCommands) => {
15
22
  const { tools } = context;
16
23
  const toolVersionOptions = Object.fromEntries(tools.map(({ name }) => [
@@ -34,7 +41,8 @@ var createCli = /* @__PURE__ */ __name((context, registerExtraCommands) => {
34
41
  cwd: resolvedCwd,
35
42
  volumes: volume,
36
43
  versions,
37
- defaultVolumesEnabled: defaultVolumes
44
+ defaultVolumesEnabled: defaultVolumes,
45
+ local: options.local || local
38
46
  };
39
47
  }, "parseGlobalOptions");
40
48
  const program = new Command();
@@ -100,7 +108,7 @@ var createCli = /* @__PURE__ */ __name((context, registerExtraCommands) => {
100
108
  }, []).option("-p, --publish <host_port:container_port>", "Publish a container's port(s) to the host (repeatable)", (value, previous) => [
101
109
  ...previous,
102
110
  value
103
- ], []).option("--no-default-volumes", "Disable default volumes for the tool").option("--local", "Run the tool from the host installation instead of Docker");
111
+ ], []).option("--no-default-volumes", "Disable default volumes for the tool").option("--docker-platform <platform>", `Override the Docker platform for this run (${DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION})`, parseDockerPlatformOverride).option("--local", "Run the tool from the host installation instead of Docker");
104
112
  for (const tool of tools) {
105
113
  const defaultVersion = getToolDefaultVersion(context, tool.name);
106
114
  const supportedVersions = getToolSupportedVersions(context, tool.name);
@@ -128,5 +136,5 @@ var runCli = /* @__PURE__ */ __name(async (config, registerExtraCommands) => {
128
136
  }, "runCli");
129
137
 
130
138
  export { runCli };
131
- //# sourceMappingURL=TSEHDOF7.js.map
132
- //# sourceMappingURL=TSEHDOF7.js.map
139
+ //# sourceMappingURL=GMN3ZEOV.js.map
140
+ //# sourceMappingURL=GMN3ZEOV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"names":["parseDockerPlatformOverride","input","isDockerPlatformOverride","Error","String","DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION","createCli","context","registerExtraCommands","tools","toolVersionOptions","Object","fromEntries","map","name","camelCase","parseGlobalOptions","command","cwd","volume","defaultVolumes","options","opts","resolvedCwd","process","cliVersions","entries","version","filter","tool","configVersions","getDefaultVersions","versions","volumes","defaultVolumesEnabled","local","program","Command","description","enablePositionalOptions","argv","includes","displayVersionCombinations","exit","option","path","isAbsolute","fs","existsSync","statSync","isDirectory","variables","valueParts","split","length","value","join","type","hostPath","containerPath","volumeMappingSchema","parse","previous","defaultVersion","getToolDefaultVersion","supportedVersions","getToolSupportedVersions","action","toolName","displayToolVersionInfo","isDefault","passThroughOptions","allowUnknownOption","helpOption","argument","args","executeToolCommand","runCli","config","parseAsync","error","console"],"mappings":";;;;;;;;;;;;;AAAA,cAAA,EAAA;AAoCA,IAAMA,2BAAAA,2BAA+BC,KAAAA,KAAAA;AACjC,EAAA,IAAIC,wBAAAA,CAAyBD,KAAAA,CAAAA,EAAQ;AACjC,IAAA,OAAOA,KAAAA;AACX,EAAA;AAEA,EAAA,MAAM,IAAIE,MACN,CAAA,yBAAA,EAA4BC,MAAAA,CAAOH,KAAAA,CAAAA,CAAAA,WAAAA,EAAoBI,2CAAAA,CAAAA,CAAAA,CAA8C,CAAA;AAE7G,CAAA,EARoC,6BAAA,CAAA;AAUpC,IAAMC,SAAAA,mBAAY,MAAA,CAAA,CACdC,OAAAA,EACAC,qBAAAA,KAAAA;AAEA,EAAA,MAAM,EAAEC,OAAK,GAAKF,OAAAA;AAClB,EAAA,MAAMG,kBAAAA,GAAqBC,OAAOC,WAAAA,CAC9BH,KAAAA,CAAMI,IAAI,CAAC,EAAEC,MAAI,KAAO;IAAC,CAAA,EAAGC,SAAAA,CAAUD,IAAAA,CAAAA,CAAAA,OAAAA,CAAAA;AAAgBA,IAAAA;GAAK,CAAA,CAAA;AAG/D,EAAA,MAAME,kBAAAA,iCAA4BC,OAAAA,KAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAKC,MAAAA,EAAQC,cAAAA,EAAgB,GAAGC,OAAAA,EAAAA,GAAYJ,QAAQK,IAAAA,EAAI;AAChE,IAAA,MAAMC,WAAAA,GAAcL,GAAAA,IAAOM,OAAAA,CAAQN,GAAAA,EAAG;AAGtC,IAAA,MAAMO,WAAAA,GAAcd,MAAAA,CAAOC,WAAAA,CACvBD,MAAAA,CAAOe,OAAAA,CAAQL,OAAAA,CAAAA,CACVR,GAAAA,CAAI,CAAC,CAACC,IAAAA,EAAMa,OAAAA,CAAAA,KAAa;AAACjB,MAAAA,kBAAAA,CAAmBI,IAAAA,CAAAA;AAAOa,MAAAA;AAAQ,KAAA,CAAA,CAC5DC,OAAO,CAAC,CAACC,IAAAA,CAAAA,KAAUA,IAAAA,CAAAA,CAAAA;AAI5B,IAAA,MAAMC,iBAAkB,MAAMvB,OAAAA,CAAQwB,kBAAAA,GAAqBR,WAAAA,KAAiB,EAAC;AAC7E,IAAA,MAAMS,QAAAA,GAAW;MAAE,GAAGF,cAAAA;MAAgB,GAAGL;AAAY,KAAA;AAErD,IAAA,OAAO;MACH,GAAGJ,OAAAA;MACHH,GAAAA,EAAKK,WAAAA;MACLU,OAAAA,EAASd,MAAAA;AACTa,MAAAA,QAAAA;MACAE,qBAAAA,EAAuBd,cAAAA;AACvBe,MAAAA,KAAAA,EAAOd,QAAQc,KAAAA,IAAqBA;AACxC,KAAA;EACJ,CAAA,EAvB2B,oBAAA,CAAA;AAyB3B,EAAA,MAAMC,OAAAA,GAAU,IAAIC,OAAAA,EAAAA;AAEpBD,EAAAA,OAAAA,CACKtB,IAAAA,CAAK,SAAA,CAAA,CACLwB,WAAAA,CACG,6RASI,CAAA,CAEPX,OAAAA,CAAQ,OAAA,CAAA,CACRY,uBAAAA,EAAuB;AAG5B,EAAA,IAAIf,OAAAA,CAAQgB,IAAAA,CAAKC,QAAAA,CAAS,iBAAA,CAAA,EAAoB;AAC1CC,IAAAA,0BAAAA,CAA2BnC,OAAAA,CAAAA;AAC3BiB,IAAAA,OAAAA,CAAQmB,KAAK,CAAA,CAAA;AACjB,EAAA;AAGAP,EAAAA,OAAAA,CACKQ,MAAAA,CAAO,kBAAA,EAAoB,2BAAA,EAA6B,CAAC3C,KAAAA,KAAAA;AACtD,IAAA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAIE,MAAM,2BAAA,CAAA;AACpB,IAAA;AAEA,IAAA,IAAI,CAAC0C,IAAAA,CAAKC,UAAAA,CAAW7C,KAAAA,CAAAA,EAAQ;AACzB,MAAA,MAAM,IAAIE,MAAM,0CAAA,CAAA;AACpB,IAAA;AAEA,IAAA,IAAI,CAAC4C,EAAAA,CAAGC,UAAAA,CAAW/C,KAAAA,CAAAA,EAAQ;AACvB,MAAA,MAAM,IAAIE,MAAM,oBAAA,CAAA;AACpB,IAAA;AAEA,IAAA,IAAI,CAAC4C,EAAAA,CAAGE,QAAAA,CAAShD,KAAAA,CAAAA,CAAOiD,aAAW,EAAI;AACnC,MAAA,MAAM,IAAI/C,MAAM,yBAAA,CAAA;AACpB,IAAA;AAEA,IAAA,OAAOF,KAAAA;AACX,EAAA,CAAA,CAAA,CACC2C,MAAAA,CACG,sCAAA,EACA,qDAAA,EAEHA,MAAAA,CACG,mBAAA,EACA,0GAAA,CAAA,CAEHA,MAAAA,CACG,oBAAA,EACA,kFAAA,EACA,CAAC3C,OAAekD,SAAAA,KAAAA;AACZ,IAAA,MAAM,CAACrC,IAAAA,EAAM,GAAGsC,UAAAA,CAAAA,GAAcnD,KAAAA,CAAMoD,MAAM,GAAA,CAAA;AAE1C,IAAA,IAAI,CAACvC,IAAAA,IAAQ,CAACsC,UAAAA,CAAWE,MAAAA,EAAQ;AAC7B,MAAA,MAAM,IAAInD,KAAAA,CACN,CAAA,qCAAA,EAAwCF,KAAAA,CAAAA,sBAAAA,CAA6B,CAAA;AAE7E,IAAA;AAEA,IAAA,OAAO;AAAIkD,MAAAA,GAAAA,SAAAA;AAAW,MAAA;AAAErC,QAAAA,IAAAA;QAAMyC,KAAAA,EAAOH,UAAAA,CAAWI,KAAK,GAAA;AAAK;;EAC9D,CAAA,EACA,EAAE,CAAA,CAELZ,MAAAA,CACG,qDACA,iJAAA,EACA,CAAC3C,OAAegC,OAAAA,KAAAA;AACZ,IAAA,MAAM,CAACwB,MAAMC,QAAAA,EAAUC,aAAAA,EAAe7C,IAAAA,CAAAA,GAAQb,KAAAA,CAAMoD,MAAM,GAAA,CAAA;AAE1D,IAAA,QAAQI,IAAAA;MACJ,KAAK,MAAA;AACD,QAAA,IAAI,CAACC,QAAAA,EAAU;AACX,UAAA,MAAM,IAAIvD,MAAM,CAAA,4CAAA,CAA8C,CAAA;AAClE,QAAA;AACA,QAAA;MACJ,KAAK,SAAA;AACD,QAAA,IAAI,CAACW,IAAAA,EAAM;AACP,UAAA,MAAM,IAAIX,MAAM,CAAA,0CAAA,CAA4C,CAAA;AAChE,QAAA;AACA,QAAA;AACJ,MAAA;AACI,QAAA,MAAM,IAAIA,KAAAA,CAAM,CAAA,qBAAA,EAAwBsD,IAAAA,CAAAA,CAAM,CAAA;AACtD;AAEA,IAAA,IAAI,CAACE,aAAAA,EAAe;AAChB,MAAA,MAAM,IAAIxD,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAChD,IAAA;AAEA,IAAA,OAAO;AACA8B,MAAAA,GAAAA,OAAAA;AACH2B,MAAAA,mBAAAA,CAAoBC,KAAAA,CAAM;AAAEJ,QAAAA,IAAAA;AAAMC,QAAAA,QAAAA;AAAUC,QAAAA,aAAAA;AAAe7C,QAAAA;OAAK;;EAExE,CAAA,EACA,EAAE,CAAA,CAEL8B,MAAAA,CACG,4CACA,wDAAA,EACA,CAACW,OAAeO,QAAAA,KAAuB;AAAIA,IAAAA,GAAAA,QAAAA;AAAUP,IAAAA;AACrD,GAAA,EAAA,EAAE,CAAA,CAELX,MAAAA,CAAO,sBAAA,EAAwB,sCAAA,CAAA,CAC/BA,MAAAA,CACG,8BAAA,EACA,CAAA,2CAAA,EAA8CvC,2CAAAA,CAAAA,CAAAA,CAAAA,EAC9CL,2BAAAA,CAAAA,CAEH4C,MAAAA,CAAO,WAAW,2DAAA,CAAA;AAGvB,EAAA,KAAA,MAAWf,QAAQpB,KAAAA,EAAO;AACtB,IAAA,MAAMsD,cAAAA,GAAiBC,qBAAAA,CAAsBzD,OAAAA,EAASsB,IAAAA,CAAKf,IAAI,CAAA;AAC/D,IAAA,MAAMmD,iBAAAA,GAAoBC,wBAAAA,CAAyB3D,OAAAA,EAASsB,IAAAA,CAAKf,IAAI,CAAA;AAErEsB,IAAAA,OAAAA,CAAQQ,MAAAA,CACJ,CAAA,EAAA,EAAKf,IAAAA,CAAKf,IAAI,sBACd,CAAA,QAAA,EAAWe,IAAAA,CAAKf,IAAI,CAAA,mBAAA,EAAsBiD,cAAAA,CAAAA,aAAAA,EAA8BE,iBAAAA,CAAkBT,IAAAA,CAAK,IAAA,CAAA,CAAA,CAAA,CAAQ,CAAA;AAE/G,EAAA;AAGApB,EAAAA,OAAAA,CAAQQ,MAAAA,CAAO,mBAAmB,qDAAA,CAAA;AAGlCR,EAAAA,OAAAA,CACKnB,OAAAA,CAAQ,qBAAA,CAAA,CACRqB,WAAAA,CAAY,0DAAA,CAAA,CACZ6B,MAAAA,CAAO,CAACC,QAAAA,KAAqBC,sBAAAA,CAAuB9D,OAAAA,EAAS6D,QAAAA,CAAAA,CAAAA;AAElE,EAAA,KAAA,MAAWvC,QAAQpB,KAAAA,EAAO;AAGtB2B,IAAAA,OAAAA,CACKnB,OAAAA,CAAQY,KAAKf,IAAAA,EAAM;MAAEwD,SAAAA,EAAW;KAAM,CAAA,CACtChC,YAAY,CAAA,IAAA,EAAOT,IAAAA,CAAKf,IAAI,CAAA,sBAAA,CAAwB,CAAA,CACpDyD,mBAAmB,IAAA,CAAA,CACnBC,oBAAkB,CAClBC,UAAAA,CAAW,KAAA,CAAA,CACXC,QAAAA,CAAS,aAAa,+BAAA,CAAA,CACtBP,MAAAA,CAAO,OAAOQ,IAAAA,KAAAA;AACX,MAAA,MAAMC,kBAAAA,CACFrE,SACAsB,IAAAA,CAAKf,IAAAA,EACL6D,MACA,MAAM3D,kBAAAA,CAAmBoB,OAAAA,CAAAA,CAAAA;IAEjC,CAAA,CAAA;AACR,EAAA;AAGA5B,EAAAA,qBAAAA,GAAwB4B,SAASpB,kBAAAA,CAAAA;AAEjC,EAAA,OAAOoB,OAAAA;AACX,CAAA,EAlMkB,WAAA,CAAA;AAoMX,IAAMyC,MAAAA,mBAAS,MAAA,CAAA,OAClBC,MAAAA,EACAtE,qBAAAA,KAAAA;AAEA,EAAA,IAAI;AACA,IAAA,MAAMF,SAAAA,CAAoBwE,MAAAA,EAAQtE,qBAAAA,CAAAA,CAAuBuE,UAAAA,EAAU;AACvE,EAAA,CAAA,CAAA,OAASC,KAAAA,EAAO;AACZC,IAAAA,OAAAA,CAAQD,KAAAA,CAAM,mCAA8BA,KAAAA,CAAAA;AAC5CxD,IAAAA,OAAAA,CAAQmB,KAAK,CAAA,CAAA;AACjB,EAAA;AACJ,CAAA,EAVsB,QAAA","file":"GMN3ZEOV.js","sourcesContent":["import { Command } from 'commander';\nimport { camelCase } from 'es-toolkit';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\n\nimport type { DockerPlatformOverride, EnvironmentVariable, VolumeMapping } from './config';\nimport {\n DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION,\n isDockerPlatformOverride,\n volumeMappingSchema,\n} from './config';\nimport type { ChainContext } from './context';\nimport type { ToolCommandExecutionOptions } from './core';\nimport { executeToolCommand } from './core';\nimport { displayToolVersionInfo, displayVersionCombinations } from './display';\nimport * as environment from './environment';\nimport { getToolDefaultVersion, getToolSupportedVersions } from './utils/finder';\n\ninterface GlobalOptions {\n cwd?: string;\n volume: VolumeMapping[];\n env: EnvironmentVariable[];\n publish?: string[];\n script?: string;\n customEntrypoint?: string;\n defaultVolumes: boolean;\n local?: boolean;\n dockerPlatform?: DockerPlatformOverride;\n}\n\ntype RegisterExtraCommands = (\n program: Command,\n parseGlobalOptions: (command: Command) => Promise<ToolCommandExecutionOptions>,\n) => void;\n\nconst parseDockerPlatformOverride = (input: unknown): DockerPlatformOverride => {\n if (isDockerPlatformOverride(input)) {\n return input;\n }\n\n throw new Error(\n `Invalid docker platform: ${String(input)}. Expected ${DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION}.`,\n );\n};\n\nconst createCli = <TImageId extends string>(\n context: ChainContext<TImageId>,\n registerExtraCommands?: RegisterExtraCommands,\n): Command => {\n const { tools } = context;\n const toolVersionOptions = Object.fromEntries(\n tools.map(({ name }) => [`${camelCase(name)}Version`, name]),\n );\n\n const parseGlobalOptions = async (command: Command): Promise<ToolCommandExecutionOptions> => {\n const { cwd, volume, defaultVolumes, ...options } = command.opts<GlobalOptions>();\n const resolvedCwd = cwd ?? process.cwd();\n\n // CLI flags take precedence over project config versions\n const cliVersions = Object.fromEntries(\n Object.entries(options)\n .map(([name, version]) => [toolVersionOptions[name], version])\n .filter(([tool]) => tool),\n );\n\n // Read defaults from project config (e.g., Anchor.toml) if the chain provides a hook\n const configVersions = (await context.getDefaultVersions?.(resolvedCwd)) ?? {};\n const versions = { ...configVersions, ...cliVersions };\n\n return {\n ...options,\n cwd: resolvedCwd,\n volumes: volume,\n versions,\n defaultVolumesEnabled: defaultVolumes,\n local: options.local || environment.local,\n };\n };\n\n const program = new Command();\n\n program\n .name('lz-tool')\n .description(\n '🚀 LayerZero VM tooling with intelligent version management\\n' +\n '\\n' +\n 'Usage pattern:\\n' +\n ' lz-tool [global-options] <tool> [tool-args...]\\n' +\n '\\n' +\n 'Examples:\\n' +\n ' lz-tool -e bash sui --help\\n' +\n ' lz-tool --sui-version 1.38.0 sui client\\n' +\n '\\n' +\n 'Note: All lz-tool options must appear BEFORE the tool name.',\n )\n .version('1.0.0')\n .enablePositionalOptions(); // Required for passThroughOptions to work\n\n // Check for --list-versions before parsing to avoid help display\n if (process.argv.includes('--list-versions')) {\n displayVersionCombinations(context);\n process.exit(0);\n }\n\n // Add global options.\n program\n .option('-c, --cwd <path>', 'Current working directory', (input: string) => {\n if (typeof input !== 'string') {\n throw new Error('cwd flag must be a string');\n }\n\n if (!path.isAbsolute(input)) {\n throw new Error('cwd must be an absolute path if provided');\n }\n\n if (!fs.existsSync(input)) {\n throw new Error('cwd does not exist');\n }\n\n if (!fs.statSync(input).isDirectory()) {\n throw new Error('cwd must be a directory');\n }\n\n return input;\n })\n .option(\n '-e, --custom-entrypoint <entrypoint>',\n 'Override the default Docker entrypoint for the tool',\n )\n .option(\n '--script <script>',\n 'Execute a custom script using bash -c in the Docker container (e.g., --script \"npm install && npm test\")',\n )\n .option(\n '--env <name=value>',\n 'Set environment variables for Docker container (e.g., --env NODE_ENV=production)',\n (input: string, variables: EnvironmentVariable[]) => {\n const [name, ...valueParts] = input.split('=');\n\n if (!name || !valueParts.length) {\n throw new Error(\n `Invalid environment variable format: ${input}. Use --env NAME=VALUE`,\n );\n }\n\n return [...variables, { name, value: valueParts.join('=') }];\n },\n [],\n )\n .option(\n '-v, --volume <type:hostPath:containerPath[:name]>',\n 'Volume mappings in the format type:hostPath:containerPath[:name] (e.g., host:/host/path:/container/path or isolate::/container/path:volumeName)',\n (input: string, volumes: VolumeMapping[]) => {\n const [type, hostPath, containerPath, name] = input.split(':');\n\n switch (type) {\n case 'host':\n if (!hostPath) {\n throw new Error(`Host path is required for volume type 'host'`);\n }\n break;\n case 'isolate':\n if (!name) {\n throw new Error(`Name is required for volume type 'isolate'`);\n }\n break;\n default:\n throw new Error(`Invalid volume type: ${type}`);\n }\n\n if (!containerPath) {\n throw new Error(`Container path is required`);\n }\n\n return [\n ...volumes,\n volumeMappingSchema.parse({ type, hostPath, containerPath, name }),\n ];\n },\n [],\n )\n .option(\n '-p, --publish <host_port:container_port>',\n \"Publish a container's port(s) to the host (repeatable)\",\n (value: string, previous: string[]) => [...previous, value],\n [],\n )\n .option('--no-default-volumes', 'Disable default volumes for the tool')\n .option(\n '--docker-platform <platform>',\n `Override the Docker platform for this run (${DOCKER_PLATFORM_OVERRIDE_VALUES_DESCRIPTION})`,\n parseDockerPlatformOverride,\n )\n .option('--local', 'Run the tool from the host installation instead of Docker');\n\n // Add version options for each tool dynamically\n for (const tool of tools) {\n const defaultVersion = getToolDefaultVersion(context, tool.name);\n const supportedVersions = getToolSupportedVersions(context, tool.name);\n\n program.option(\n `--${tool.name}-version <version>`,\n `Specify ${tool.name} version (default: ${defaultVersion}, supported: ${supportedVersions.join(', ')})`,\n );\n }\n\n // Add utility options\n program.option('--list-versions', 'Display all supported version combinations and exit');\n\n // Add version info command\n program\n .command('version-info <tool>')\n .description('Display detailed version information for a specific tool')\n .action((toolName: string) => displayToolVersionInfo(context, toolName));\n\n for (const tool of tools) {\n // Don't add any options to the subcommand level.\n // All lz-tool options must be specified before the subcommand.\n program\n .command(tool.name, { isDefault: false })\n .description(`Run ${tool.name} with version checking`)\n .passThroughOptions(true) // Pass through all options after the subcommand\n .allowUnknownOption()\n .helpOption(false) // Disable automatic help option to pass --help to the tool\n .argument('[args...]', 'Arguments to pass to the tool')\n .action(async (args: string[]) => {\n await executeToolCommand(\n context,\n tool.name,\n args,\n await parseGlobalOptions(program),\n );\n });\n }\n\n // Allow external registration of extra commands\n registerExtraCommands?.(program, parseGlobalOptions);\n\n return program;\n};\n\nexport const runCli = async <TImageId extends string>(\n config: ChainContext<TImageId>,\n registerExtraCommands?: RegisterExtraCommands,\n): Promise<void> => {\n try {\n await createCli<TImageId>(config, registerExtraCommands).parseAsync();\n } catch (error) {\n console.error('❌ VM tool execution failed', error);\n process.exit(1);\n }\n};\n"]}
@@ -1,10 +1,11 @@
1
1
  import { stringifyError } from './2XGBQPKA.js';
2
+ import { executeLocally } from './HC7LYTHL.js';
2
3
  import { lockMany } from './4SFAVHVD.js';
3
4
  import { resolveTypeVersions } from './6L6NUQMM.js';
4
- import { qualifyVolumeName, getImageUriForTool } from './RVVZQC34.js';
5
+ import { resolveDockerPlatformExecution, findImageForTool, getImageUri, getImageTag, qualifyVolumeName } from './KN3TRHEZ.js';
6
+ import { CARGO_TARGET_CACHE_PATH } from './TMIYMQW3.js';
5
7
  import { findWorkspaceRoot } from './UBUQDI5Q.js';
6
8
  import { findToolByName } from './3XEUJAQB.js';
7
- import { executeLocally } from './HC7LYTHL.js';
8
9
  import { init_esm_shims, __name } from './CWKWODSW.js';
9
10
  import { uniqBy } from 'es-toolkit';
10
11
  import os from 'os';
@@ -35,23 +36,69 @@ var mergeVolumes = /* @__PURE__ */ __name((defaultVolumes, userVolumes) => uniqB
35
36
  ...userVolumes,
36
37
  ...defaultVolumes
37
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");
38
57
  var resolveVolumePath = /* @__PURE__ */ __name((volume, workspaceRoot) => volume.type === "host" ? {
39
58
  ...volume,
40
59
  hostPath: path.resolve(workspaceRoot, volume.hostPath.replace(/^~/, os.homedir()))
41
60
  } : volume, "resolveVolumePath");
42
- var ensureDockerImage = /* @__PURE__ */ __name(async (imageUri) => {
43
- let output;
44
- try {
45
- output = await $`docker image inspect --format {{.Id}} ${imageUri}`.nothrow().quiet();
46
- if (!output.exitCode) {
47
- console.info(`\u2705 Using cached Docker image: ${imageUri}`);
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})`);
48
96
  return;
49
97
  }
50
- console.info("\u{1F4E5} Pulling Docker image from:", imageUri);
51
- output = await $`docker pull ${imageUri}`.nothrow();
52
- } catch (error) {
53
- throw new Error(`Failed to pull Docker image ${imageUri}: ${stringifyError(error)}`);
98
+ console.info(`\u{1F504} Cached Docker image does not include the requested platform (${platform.value}); re-pulling.`);
54
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();
55
102
  if (output.exitCode) {
56
103
  const stderr = output.stderr ?? "";
57
104
  const isAuthError = stderr.includes("authorization token has expired") || stderr.includes("denied") || stderr.includes("pull access denied");
@@ -61,10 +108,17 @@ var ensureDockerImage = /* @__PURE__ */ __name(async (imageUri) => {
61
108
  isAuthError ? " - ECR auth expired. Run: pnpm localnet login" : " - Check if the image tag exists in image registry."
62
109
  ].join("\n"));
63
110
  }
111
+ if (platform) {
112
+ await probeDockerPlatformContainerCreation(platform);
113
+ }
64
114
  console.info(`\u2705 Successfully pulled: ${imageUri}`);
65
115
  }, "ensureDockerImage");
66
- async function executeToolCommand(context, toolName, args, { cwd, volumes: userVolumes, customEntrypoint: entrypoint, env: customEnvVars, script, publish, versions = {}, defaultVolumesEnabled = true, local }) {
116
+ async function executeToolCommand(context, toolName, args, { cwd, volumes: userVolumes, customEntrypoint: entrypoint, env: customEnvVars, script, publish, versions = {}, defaultVolumesEnabled = true, local, dockerPlatform: dockerPlatformOverride }) {
67
117
  const tool = findToolByName(context, toolName);
118
+ const dockerPlatform = resolveDockerPlatformExecution({
119
+ dockerPlatform: dockerPlatformOverride,
120
+ toolDockerPlatform: tool.dockerPlatform
121
+ });
68
122
  if (tool.preExecute) {
69
123
  await tool.preExecute(context, {
70
124
  cwd,
@@ -74,7 +128,8 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
74
128
  script,
75
129
  publish,
76
130
  versions,
77
- defaultVolumesEnabled
131
+ defaultVolumesEnabled,
132
+ dockerPlatform: dockerPlatformOverride
78
133
  });
79
134
  }
80
135
  const resolvedVersion = resolveTypeVersions(context, versions)[tool.name];
@@ -104,7 +159,7 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
104
159
  }
105
160
  const workspaceRoot = await findWorkspaceRoot(cwd);
106
161
  const defaultVolumes = defaultVolumesEnabled ? tool.defaultVolumes ?? [] : [];
107
- const volumes = mergeVolumes(defaultVolumes, userVolumes).map((volume) => resolveVolumePath(volume, workspaceRoot)).map(qualifyVolumeName);
162
+ const resolvedVolumes = mergeVolumes(defaultVolumes, userVolumes).map((volume) => resolveVolumePath(volume, workspaceRoot));
108
163
  if (defaultVolumes.length > 0) {
109
164
  console.info(`\u{1F4E6} Using ${defaultVolumes.length} default volume(s) for ${tool.name}`);
110
165
  if (userVolumes.length > 0) {
@@ -114,14 +169,20 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
114
169
  }
115
170
  }
116
171
  }
117
- const imageUri = await getImageUriForTool(context, tool.name, resolvedVersion);
172
+ const image = findImageForTool(context, tool.name, resolvedVersion);
173
+ const imageUri = await getImageUri(image);
118
174
  const relativePath = path.relative(workspaceRoot, cwd);
119
- await ensureDockerImage(imageUri);
175
+ const cacheKey = getImageTag(image);
176
+ const qualifiedVolumes = resolvedVolumes.map((volume) => qualifyVolumeName(volume, {
177
+ ...dockerPlatform.volumeNameOptions,
178
+ cacheKey
179
+ }));
180
+ await ensureDockerImage(imageUri, dockerPlatform);
120
181
  if (entrypoint?.trim()) {
121
182
  console.info(`\u{1F527} Using custom entrypoint: ${entrypoint}`);
122
183
  }
123
184
  const defaultEnv = tool.defaultEnv ?? [];
124
- const hasDockerSocketMount = volumes.some((volume) => volume.type === "host" && volume.containerPath === "/var/run/docker.sock");
185
+ const hasDockerSocketMount = resolvedVolumes.some((volume) => volume.type === "host" && volume.containerPath === "/var/run/docker.sock");
125
186
  const dockerSocketEnv = hasDockerSocketMount ? [
126
187
  {
127
188
  name: "HOST_CWD",
@@ -132,14 +193,14 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
132
193
  value: workspaceRoot
133
194
  }
134
195
  ] : [];
135
- const envArgs = uniqBy([
136
- ...customEnvVars,
137
- ...dockerSocketEnv,
138
- ...defaultEnv
139
- ], ({ name }) => name).flatMap(({ name, value }) => [
196
+ const cargoCacheEnv = resolveCargoCacheEnv(script, resolvedVolumes);
197
+ const envArgs = mergeToolEnv(customEnvVars, dockerSocketEnv, defaultEnv, cargoCacheEnv).flatMap(({ name, value }) => [
140
198
  "-e",
141
199
  `${name}=${value}`
142
200
  ]);
201
+ if (cargoCacheEnv.length > 0) {
202
+ console.info(`\u{1F5C3}\uFE0F Sharing cargo target cache at ${CARGO_TARGET_CACHE_PATH}`);
203
+ }
143
204
  const hostUserIds = getHostUserIds();
144
205
  const userIdEnvArgs = hostUserIds ? [
145
206
  "-e",
@@ -170,6 +231,7 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
170
231
  }
171
232
  const dockerArgs = [
172
233
  "run",
234
+ ...dockerPlatform.args,
173
235
  ...tool.privileged ? [
174
236
  "--privileged"
175
237
  ] : [],
@@ -185,7 +247,7 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
185
247
  "-p",
186
248
  p.trim()
187
249
  ]),
188
- ...volumes.flatMap((volume) => [
250
+ ...qualifiedVolumes.flatMap((volume) => [
189
251
  "-v",
190
252
  `${volume.type === "host" ? volume.hostPath : volume.name}:${volume.containerPath}`
191
253
  ]),
@@ -196,12 +258,15 @@ async function executeToolCommand(context, toolName, args, { cwd, volumes: userV
196
258
  imageUri,
197
259
  ...finalArgs
198
260
  ];
199
- const output = await lockMany(volumes.flatMap((volume) => volume.type === "isolate" && volume.locked ? [
261
+ const output = await lockMany(qualifiedVolumes.flatMap((volume) => volume.type === "isolate" && volume.locked ? [
200
262
  volume.name
201
263
  ] : []), async () => {
202
264
  const label = `\u23F3 ${finalArgs.join(" ")}`;
203
265
  console.time(label);
204
- const result = await $`docker ${dockerArgs}`.nothrow();
266
+ const docker$ = dockerPlatform.processEnv ? $({
267
+ env: dockerPlatform.processEnv
268
+ }) : $;
269
+ const result = await docker$`docker ${dockerArgs}`.nothrow();
205
270
  console.timeEnd(label);
206
271
  return result;
207
272
  });
@@ -214,6 +279,6 @@ ${stdout}` : ""}`);
214
279
  }
215
280
  __name(executeToolCommand, "executeToolCommand");
216
281
 
217
- export { executeToolCommand };
218
- //# sourceMappingURL=INYD2E56.js.map
219
- //# sourceMappingURL=INYD2E56.js.map
282
+ export { executeToolCommand, mergeToolEnv, resolveCargoCacheEnv };
283
+ //# sourceMappingURL=HN2JUVAX.js.map
284
+ //# sourceMappingURL=HN2JUVAX.js.map
@@ -0,0 +1 @@
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":"HN2JUVAX.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"]}
@@ -0,0 +1,107 @@
1
+ import { DOCKER_PLATFORM_NATIVE, getRegistry, getImageDirectory } from './TMIYMQW3.js';
2
+ import { findToolVersionsForCombination, getImageName } from './3XEUJAQB.js';
3
+ import { init_esm_shims, __name } from './CWKWODSW.js';
4
+ import { join, basename } from 'path';
5
+ import { env } from 'process';
6
+
7
+ // src/utils/docker.ts
8
+ init_esm_shims();
9
+ var resolveDockerPlatform = /* @__PURE__ */ __name((dockerPlatform) => {
10
+ if (!dockerPlatform) {
11
+ return void 0;
12
+ }
13
+ const [, archSegment] = dockerPlatform.split("/");
14
+ const arch = archSegment || dockerPlatform;
15
+ return {
16
+ value: dockerPlatform,
17
+ namespace: dockerPlatform.replace(/\//g, "-"),
18
+ arch
19
+ };
20
+ }, "resolveDockerPlatform");
21
+ var resolveEffectiveDockerPlatformValue = /* @__PURE__ */ __name(({ dockerPlatform, toolDockerPlatform, envDockerPlatform = env.DOCKER_DEFAULT_PLATFORM }) => {
22
+ if (dockerPlatform === DOCKER_PLATFORM_NATIVE) {
23
+ return void 0;
24
+ }
25
+ return dockerPlatform ?? toolDockerPlatform ?? envDockerPlatform;
26
+ }, "resolveEffectiveDockerPlatformValue");
27
+ var resolveDockerPlatformExecution = /* @__PURE__ */ __name((options) => {
28
+ if (options.dockerPlatform === DOCKER_PLATFORM_NATIVE) {
29
+ const { DOCKER_DEFAULT_PLATFORM: _dockerDefaultPlatform, ...processEnv } = env;
30
+ return {
31
+ args: [],
32
+ processEnv,
33
+ volumeNameOptions: {
34
+ dockerPlatform: void 0
35
+ }
36
+ };
37
+ }
38
+ const platform = resolveDockerPlatform(resolveEffectiveDockerPlatformValue(options));
39
+ return {
40
+ platform,
41
+ args: platform ? [
42
+ "--platform",
43
+ platform.value
44
+ ] : [],
45
+ volumeNameOptions: {
46
+ dockerPlatform: platform?.value
47
+ }
48
+ };
49
+ }, "resolveDockerPlatformExecution");
50
+ var findImageForTool = /* @__PURE__ */ __name((context, toolName, version) => {
51
+ const [image] = context.versionCombinations.flatMap((combination) => {
52
+ const imageId = combination.images[toolName];
53
+ if (!imageId) {
54
+ return [];
55
+ }
56
+ const image2 = context.images[imageId];
57
+ return image2 && findToolVersionsForCombination(context, combination)[toolName] === version ? [
58
+ image2
59
+ ] : [];
60
+ });
61
+ if (!image) {
62
+ throw new Error(`No version combination found for tool ${toolName} with version ${version}`);
63
+ }
64
+ return image;
65
+ }, "findImageForTool");
66
+ var getImageUri = /* @__PURE__ */ __name(async (image) => join(await getRegistry(), await getImageDirectory(), `${getImageName(image.name)}:${getImageTag(image)}`), "getImageUri");
67
+ var getImageTag = /* @__PURE__ */ __name(({ versions, patch }) => [
68
+ ...Object.entries(versions).sort().flat(),
69
+ ...patch ? [
70
+ "patch",
71
+ patch
72
+ ] : []
73
+ ].join("-"), "getImageTag");
74
+ var qualifyVolumeName = /* @__PURE__ */ __name((volume, { cacheKey, dockerPlatform } = {
75
+ dockerPlatform: env.DOCKER_DEFAULT_PLATFORM
76
+ }) => {
77
+ if (volume.type !== "isolate") {
78
+ return volume;
79
+ }
80
+ const components = [
81
+ "lz-tooling-cache",
82
+ volume.name
83
+ ];
84
+ if (!volume.shared) {
85
+ if (volume.toolchainKeyed && cacheKey) {
86
+ components.push(cacheKey);
87
+ } else {
88
+ const packageName = env.npm_package_name;
89
+ if (!packageName) {
90
+ throw new Error("npm_package_name environment variable not defined");
91
+ }
92
+ components.push(basename(packageName));
93
+ }
94
+ }
95
+ const platform = resolveDockerPlatform(dockerPlatform);
96
+ if (platform && !volume.architectureIndependent) {
97
+ components.push(platform.namespace);
98
+ }
99
+ return {
100
+ ...volume,
101
+ name: components.join("-")
102
+ };
103
+ }, "qualifyVolumeName");
104
+
105
+ export { findImageForTool, getImageTag, getImageUri, qualifyVolumeName, resolveDockerPlatform, resolveDockerPlatformExecution, resolveEffectiveDockerPlatformValue };
106
+ //# sourceMappingURL=KN3TRHEZ.js.map
107
+ //# sourceMappingURL=KN3TRHEZ.js.map