@platforma-sdk/package-builder-lib 1.1.0 → 1.2.1

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 (99) hide show
  1. package/dist/core/archive.cjs +3 -3
  2. package/dist/core/archive.cjs.map +1 -1
  3. package/dist/core/archive.js.map +1 -1
  4. package/dist/core/conda/builder.cjs +9 -4
  5. package/dist/core/conda/builder.cjs.map +1 -1
  6. package/dist/core/conda/builder.js +5 -1
  7. package/dist/core/conda/builder.js.map +1 -1
  8. package/dist/core/conda/validate-spec.cjs +2 -2
  9. package/dist/core/conda/validate-spec.cjs.map +1 -1
  10. package/dist/core/conda/validate-spec.js.map +1 -1
  11. package/dist/core/core.cjs +29 -8
  12. package/dist/core/core.cjs.map +1 -1
  13. package/dist/core/core.d.ts +6 -1
  14. package/dist/core/core.d.ts.map +1 -1
  15. package/dist/core/core.js +27 -6
  16. package/dist/core/core.js.map +1 -1
  17. package/dist/core/docker-conda.cjs +2 -2
  18. package/dist/core/docker-conda.cjs.map +1 -1
  19. package/dist/core/docker-conda.js.map +1 -1
  20. package/dist/core/docker-python.cjs +3 -2
  21. package/dist/core/docker-python.cjs.map +1 -1
  22. package/dist/core/docker-python.js +1 -1
  23. package/dist/core/docker-python.js.map +1 -1
  24. package/dist/core/docker.cjs +3 -3
  25. package/dist/core/docker.cjs.map +1 -1
  26. package/dist/core/docker.js.map +1 -1
  27. package/dist/core/envs.cjs +34 -0
  28. package/dist/core/envs.cjs.map +1 -1
  29. package/dist/core/envs.d.ts +8 -2
  30. package/dist/core/envs.d.ts.map +1 -1
  31. package/dist/core/envs.js +13 -1
  32. package/dist/core/envs.js.map +1 -1
  33. package/dist/core/package-info.cjs +59 -5
  34. package/dist/core/package-info.cjs.map +1 -1
  35. package/dist/core/package-info.d.ts +11 -2
  36. package/dist/core/package-info.d.ts.map +1 -1
  37. package/dist/core/package-info.js +60 -6
  38. package/dist/core/package-info.js.map +1 -1
  39. package/dist/core/paths.cjs +1 -1
  40. package/dist/core/paths.cjs.map +1 -1
  41. package/dist/core/paths.js +1 -1
  42. package/dist/core/paths.js.map +1 -1
  43. package/dist/core/resolver.cjs +7 -2
  44. package/dist/core/resolver.cjs.map +1 -1
  45. package/dist/core/resolver.js +1 -1
  46. package/dist/core/resolver.js.map +1 -1
  47. package/dist/core/schemas/artifacts.cjs +7 -1
  48. package/dist/core/schemas/artifacts.cjs.map +1 -1
  49. package/dist/core/schemas/artifacts.d.ts +1 -1
  50. package/dist/core/schemas/artifacts.d.ts.map +1 -1
  51. package/dist/core/schemas/artifacts.js +1 -1
  52. package/dist/core/schemas/artifacts.js.map +1 -1
  53. package/dist/core/schemas/entrypoints.cjs +4 -1
  54. package/dist/core/schemas/entrypoints.cjs.map +1 -1
  55. package/dist/core/schemas/entrypoints.d.ts +1 -1
  56. package/dist/core/schemas/entrypoints.d.ts.map +1 -1
  57. package/dist/core/schemas/entrypoints.js +1 -1
  58. package/dist/core/schemas/entrypoints.js.map +1 -1
  59. package/dist/core/schemas/sw-json.cjs +16 -1
  60. package/dist/core/schemas/sw-json.cjs.map +1 -1
  61. package/dist/core/schemas/sw-json.js +1 -1
  62. package/dist/core/schemas/sw-json.js.map +1 -1
  63. package/dist/core/storage.cjs +6 -2
  64. package/dist/core/storage.cjs.map +1 -1
  65. package/dist/core/storage.js +4 -1
  66. package/dist/core/storage.js.map +1 -1
  67. package/dist/core/sw-json-render.cjs +38 -7
  68. package/dist/core/sw-json-render.cjs.map +1 -1
  69. package/dist/core/sw-json-render.js +37 -8
  70. package/dist/core/sw-json-render.js.map +1 -1
  71. package/dist/core/util.cjs +33 -12
  72. package/dist/core/util.cjs.map +1 -1
  73. package/dist/core/util.d.ts +12 -7
  74. package/dist/core/util.d.ts.map +1 -1
  75. package/dist/core/util.js +17 -8
  76. package/dist/core/util.js.map +1 -1
  77. package/dist/defaults.cjs +18 -1
  78. package/dist/defaults.cjs.map +1 -1
  79. package/dist/defaults.d.ts +9 -3
  80. package/dist/defaults.d.ts.map +1 -1
  81. package/dist/defaults.js +13 -2
  82. package/dist/defaults.js.map +1 -1
  83. package/dist/index.cjs.map +1 -1
  84. package/dist/index.d.ts +4 -2
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js.map +1 -1
  87. package/package.json +4 -4
  88. package/src/core/core.test.ts +17 -0
  89. package/src/core/core.ts +48 -8
  90. package/src/core/envs.ts +8 -0
  91. package/src/core/package-info.test.ts +162 -3
  92. package/src/core/package-info.ts +88 -3
  93. package/src/core/schemas/test-artifacts.ts +1 -1
  94. package/src/core/sw-json-render.test.ts +23 -0
  95. package/src/core/sw-json-render.ts +30 -2
  96. package/src/core/util.test.ts +52 -0
  97. package/src/core/util.ts +27 -7
  98. package/src/defaults.ts +19 -1
  99. package/src/index.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"docker-conda.cjs","names":["fs","path","micromambaDownloadUrl","dockerfileAutogenPath"],"sources":["../../src/core/docker-conda.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { micromambaDownloadUrl } from \"./conda/builder\";\nimport { validateCondaSpec } from \"./conda/validate-spec\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nexport const tmpSpecFile = \"tmp-env-spec-88344b62d74b9307.yaml\";\n\nexport interface CondaOptions {\n baseImageTag: string;\n micromambaVersion: string;\n frozenSpecFile: string;\n pkg: string;\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface CondaDockerOptions extends CondaOptions, DockerOptions {}\n\nfunction generateCondaDockerfileContent(options: CondaOptions, arch: util.ArchType): string {\n // Read template from assets\n const templatePath = paths.assets(\"conda-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replaceAll(\"${BASE_IMAGE_TAG}\", options.baseImageTag)\n .replaceAll(\"${MAMBA_ROOT_PREFIX}\", path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION))\n .replaceAll(\n \"${CONDA_PKGS_DIRS}\",\n path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION, \"pkgs\"),\n )\n .replaceAll(\n \"${MICROMAMBA_DOWNLOAD_URL}\",\n micromambaDownloadUrl(options.micromambaVersion, `linux-${arch}`),\n )\n .replaceAll(\"${PKG}\", options.pkg)\n .replaceAll(\"${TMP_SPEC_FILE}\", tmpSpecFile)\n .replaceAll(\"${FROZEN_SPEC_FILE}\", options.frozenSpecFile);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n artifactID: string,\n buildParams: artifacts.condaType,\n arch: util.ArchType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Conda package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultCondaOptions();\n options.micromambaVersion = buildParams[\"micromamba-version\"];\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n const platform: util.PlatformType = `linux-${arch}`;\n\n if (!buildParams.roots) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n if (!buildParams.roots[platform]) {\n throw util.CLIError(\n `Cannot prepare Docker options: ${platform} root directory is not specified. Please ensure the 'roots' property is set for artifact.`,\n );\n }\n\n const contextDir = path.resolve(currentPackageRoot, buildParams.roots[platform]);\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n // Validate conda spec file before building\n const srcSpecPath = path.join(currentPackageRoot, buildParams.spec);\n logger.debug(`Validating conda spec file for forbidden channels...`);\n try {\n validateCondaSpec(logger, srcSpecPath);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(errorMessage);\n throw util.CLIError(\n `Cannot prepare Docker options for conda package '${artifactID}': ${errorMessage}`,\n );\n }\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created directory for autogenerated dockerfiles: ${dockerfileDir}`);\n\n fs.copyFileSync(srcSpecPath, path.join(contextDir, tmpSpecFile));\n logger.debug(`Copied spec file to context directory`);\n\n const dockerfile = {\n content: generateCondaDockerfileContent(options, arch),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction getDefaultCondaOptions(): CondaOptions {\n return {\n baseImageTag: defaults.CONDA_DOCKER_BASE_IMAGE,\n micromambaVersion: defaults.CONDA_MICROMAMBA_VERSION,\n frozenSpecFile: defaults.CONDA_FROZEN_ENV_SPEC_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,cAAc;AAkB3B,SAAS,+BAA+B,SAAuB,MAA6B;CAE1F,MAAM,eAAA,cAAA,OAA4B,4BAA4B;AAI9D,QAHwBA,QAAG,aAAa,cAAc,QAAQ,CAI3D,WAAW,qBAAqB,QAAQ,aAAa,CACrD,WAAW,wBAAwBC,UAAK,MAAM,KAAK,QAAQ,KAAA,iBAAA,oBAAkC,CAAC,CAC9F,WACC,sBACAA,UAAK,MAAM,KAAK,QAAQ,KAAA,iBAAA,qBAAmC,OAAO,CACnE,CACA,WACC,8BACAC,gBAAAA,sBAAsB,QAAQ,mBAAmB,SAAS,OAAO,CAClE,CACA,WAAW,UAAU,QAAQ,IAAI,CACjC,WAAW,oBAAoB,YAAY,CAC3C,WAAW,uBAAuB,QAAQ,eAAe;;AAG9D,SAAgB,qBACd,QACA,oBACA,YACA,aACA,MACe;AACf,QAAO,MACL,+CAA+C,YAAY,KAAK,QAAQ,WAAW,GACpF;CAED,MAAM,UAAU,wBAAwB;AACxC,SAAQ,oBAAoB,YAAY;AAExC,KAAI,YAAY,IACd,SAAQ,MAAM,YAAY;CAG5B,MAAM,WAA8B,SAAS;AAE7C,KAAI,CAAC,YAAY,MACf,OAAA,aAAA,SACE,8IACD;AAEH,KAAI,CAAC,YAAY,MAAM,UACrB,OAAA,aAAA,SACE,kCAAkC,SAAS,2FAC5C;CAGH,MAAM,aAAaD,UAAK,QAAQ,oBAAoB,YAAY,MAAM,UAAU;AAChF,KAAI,CAACD,QAAG,WAAW,WAAW,CAC5B,SAAG,UAAU,YAAY,EAAE,WAAW,MAAM,CAAC;CAI/C,MAAM,cAAcC,UAAK,KAAK,oBAAoB,YAAY,KAAK;AACnE,QAAO,MAAM,uDAAuD;AACpE,KAAI;AACF,wBAAA,kBAAkB,QAAQ,YAAY;UAC/B,OAAO;EACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAO,MAAM,aAAa;AAC1B,QAAA,aAAA,SACE,oDAAoD,WAAW,KAAK,eACrE;;CAIH,MAAM,iBAAiBE,eAAAA,sBAAsB,oBAAoB,WAAW;CAC5E,MAAM,gBAAgBF,UAAK,QAAQ,eAAe;AAClD,SAAG,UAAU,eAAe,EAAE,WAAW,MAAM,CAAC;AAChD,QAAO,MAAM,oDAAoD,gBAAgB;AAEjF,SAAG,aAAa,aAAaA,UAAK,KAAK,YAAY,YAAY,CAAC;AAChE,QAAO,MAAM,wCAAwC;CAErD,MAAM,aAAa;EACjB,SAAS,+BAA+B,SAAS,KAAK;EACtD,MAAM;EACP;AAED,SAAG,cAAc,WAAW,MAAM,WAAW,QAAQ;AACrD,QAAO,MAAM,0BAA0B,WAAW,OAAO;CAEzD,MAAM,SAAwB;EAC5B,YAAY,WAAW;EACvB,SAAS;EACT,YAAY,EAAE;EACd,KAAK,QAAQ;EACd;AAED,QAAO,MAAM,4BAA4B,KAAK,UAAU,OAAO,GAAG;AAClE,qBAAoB,OAAO;AAC3B,QAAO;;AAGT,SAAS,yBAAuC;AAC9C,QAAO;EACL,cAAA,iBAAA;EACA,mBAAA,iBAAA;EACA,gBAAA,iBAAA;EACA,KAAA,iBAAA;EACD;;AAGH,SAAS,oBAAoB,SAAwB;AACnD,KAAI,CAACD,QAAG,WAAW,QAAQ,WAAW,CACpC,OAAA,aAAA,SAAoB,eAAe,QAAQ,WAAW,aAAa;AAGrE,KAAI,CAACA,QAAG,WAAW,QAAQ,QAAQ,CACjC,OAAA,aAAA,SAAoB,YAAY,QAAQ,QAAQ,aAAa"}
1
+ {"version":3,"file":"docker-conda.cjs","names":["fs","path","micromambaDownloadUrl","dockerfileAutogenPath"],"sources":["../../src/core/docker-conda.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { micromambaDownloadUrl } from \"./conda/builder\";\nimport { validateCondaSpec } from \"./conda/validate-spec\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nexport const tmpSpecFile = \"tmp-env-spec-88344b62d74b9307.yaml\";\n\nexport interface CondaOptions {\n baseImageTag: string;\n micromambaVersion: string;\n frozenSpecFile: string;\n pkg: string;\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface CondaDockerOptions extends CondaOptions, DockerOptions {}\n\nfunction generateCondaDockerfileContent(options: CondaOptions, arch: util.ArchType): string {\n // Read template from assets\n const templatePath = paths.assets(\"conda-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replaceAll(\"${BASE_IMAGE_TAG}\", options.baseImageTag)\n .replaceAll(\"${MAMBA_ROOT_PREFIX}\", path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION))\n .replaceAll(\n \"${CONDA_PKGS_DIRS}\",\n path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION, \"pkgs\"),\n )\n .replaceAll(\n \"${MICROMAMBA_DOWNLOAD_URL}\",\n micromambaDownloadUrl(options.micromambaVersion, `linux-${arch}`),\n )\n .replaceAll(\"${PKG}\", options.pkg)\n .replaceAll(\"${TMP_SPEC_FILE}\", tmpSpecFile)\n .replaceAll(\"${FROZEN_SPEC_FILE}\", options.frozenSpecFile);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n artifactID: string,\n buildParams: artifacts.condaType,\n arch: util.ArchType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Conda package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultCondaOptions();\n options.micromambaVersion = buildParams[\"micromamba-version\"];\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n const platform: util.PlatformType = `linux-${arch}`;\n\n if (!buildParams.roots) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n if (!buildParams.roots[platform]) {\n throw util.CLIError(\n `Cannot prepare Docker options: ${platform} root directory is not specified. Please ensure the 'roots' property is set for artifact.`,\n );\n }\n\n const contextDir = path.resolve(currentPackageRoot, buildParams.roots[platform]);\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n // Validate conda spec file before building\n const srcSpecPath = path.join(currentPackageRoot, buildParams.spec);\n logger.debug(`Validating conda spec file for forbidden channels...`);\n try {\n validateCondaSpec(logger, srcSpecPath);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(errorMessage);\n throw util.CLIError(\n `Cannot prepare Docker options for conda package '${artifactID}': ${errorMessage}`,\n );\n }\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created directory for autogenerated dockerfiles: ${dockerfileDir}`);\n\n fs.copyFileSync(srcSpecPath, path.join(contextDir, tmpSpecFile));\n logger.debug(`Copied spec file to context directory`);\n\n const dockerfile = {\n content: generateCondaDockerfileContent(options, arch),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction getDefaultCondaOptions(): CondaOptions {\n return {\n baseImageTag: defaults.CONDA_DOCKER_BASE_IMAGE,\n micromambaVersion: defaults.CONDA_MICROMAMBA_VERSION,\n frozenSpecFile: defaults.CONDA_FROZEN_ENV_SPEC_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,cAAc;AAkB3B,SAAS,+BAA+B,SAAuB,MAA6B;CAE1F,MAAM,eAAA,cAAA,OAA4B,2BAA2B;CAI7D,OAHwBA,QAAG,aAAa,cAAc,OAGjC,CAAC,CACnB,WAAW,qBAAqB,QAAQ,YAAY,CAAC,CACrD,WAAW,wBAAwBC,UAAK,MAAM,KAAK,QAAQ,KAAA,iBAAA,mBAAiC,CAAC,CAAC,CAC9F,WACC,sBACAA,UAAK,MAAM,KAAK,QAAQ,KAAA,iBAAA,qBAAmC,MAAM,CACnE,CAAC,CACA,WACC,8BACAC,gBAAAA,sBAAsB,QAAQ,mBAAmB,SAAS,MAAM,CAClE,CAAC,CACA,WAAW,UAAU,QAAQ,GAAG,CAAC,CACjC,WAAW,oBAAoB,WAAW,CAAC,CAC3C,WAAW,uBAAuB,QAAQ,cAAc;AAC7D;AAEA,SAAgB,qBACd,QACA,oBACA,YACA,aACA,MACe;CACf,OAAO,MACL,+CAA+C,YAAY,KAAK,QAAQ,WAAW,EACrF;CAEA,MAAM,UAAU,uBAAuB;CACvC,QAAQ,oBAAoB,YAAY;CAExC,IAAI,YAAY,KACd,QAAQ,MAAM,YAAY;CAG5B,MAAM,WAA8B,SAAS;CAE7C,IAAI,CAAC,YAAY,OACf,MAAA,aAAA,SACE,6IACF;CAEF,IAAI,CAAC,YAAY,MAAM,WACrB,MAAA,aAAA,SACE,kCAAkC,SAAS,0FAC7C;CAGF,MAAM,aAAaD,UAAK,QAAQ,oBAAoB,YAAY,MAAM,SAAS;CAC/E,IAAI,CAACD,QAAG,WAAW,UAAU,GAC3B,QAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;CAI9C,MAAM,cAAcC,UAAK,KAAK,oBAAoB,YAAY,IAAI;CAClE,OAAO,MAAM,sDAAsD;CACnE,IAAI;EACF,sBAAA,kBAAkB,QAAQ,WAAW;CACvC,SAAS,OAAO;EACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC1E,OAAO,MAAM,YAAY;EACzB,MAAA,aAAA,SACE,oDAAoD,WAAW,KAAK,cACtE;CACF;CAGA,MAAM,iBAAiBE,eAAAA,sBAAsB,oBAAoB,UAAU;CAC3E,MAAM,gBAAgBF,UAAK,QAAQ,cAAc;CACjD,QAAG,UAAU,eAAe,EAAE,WAAW,KAAK,CAAC;CAC/C,OAAO,MAAM,oDAAoD,eAAe;CAEhF,QAAG,aAAa,aAAaA,UAAK,KAAK,YAAY,WAAW,CAAC;CAC/D,OAAO,MAAM,uCAAuC;CAEpD,MAAM,aAAa;EACjB,SAAS,+BAA+B,SAAS,IAAI;EACrD,MAAM;CACR;CAEA,QAAG,cAAc,WAAW,MAAM,WAAW,OAAO;CACpD,OAAO,MAAM,0BAA0B,WAAW,MAAM;CAExD,MAAM,SAAwB;EAC5B,YAAY,WAAW;EACvB,SAAS;EACT,YAAY,CAAC;EACb,KAAK,QAAQ;CACf;CAEA,OAAO,MAAM,4BAA4B,KAAK,UAAU,MAAM,GAAG;CACjE,oBAAoB,MAAM;CAC1B,OAAO;AACT;AAEA,SAAS,yBAAuC;CAC9C,OAAO;EACL,cAAA,iBAAA;EACA,mBAAA,iBAAA;EACA,gBAAA,iBAAA;EACA,KAAA,iBAAA;CACF;AACF;AAEA,SAAS,oBAAoB,SAAwB;CACnD,IAAI,CAACD,QAAG,WAAW,QAAQ,UAAU,GACnC,MAAA,aAAA,SAAoB,eAAe,QAAQ,WAAW,YAAY;CAGpE,IAAI,CAACA,QAAG,WAAW,QAAQ,OAAO,GAChC,MAAA,aAAA,SAAoB,YAAY,QAAQ,QAAQ,YAAY;AAEhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"docker-conda.js","names":["paths.assets","fs","path","defaults.CONDA_DATA_LOCATION","util.CLIError","defaults.CONDA_DOCKER_BASE_IMAGE","defaults.CONDA_MICROMAMBA_VERSION","defaults.CONDA_FROZEN_ENV_SPEC_FILE","defaults.DOCKER_PLACEHOLDER_PKG"],"sources":["../../src/core/docker-conda.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { micromambaDownloadUrl } from \"./conda/builder\";\nimport { validateCondaSpec } from \"./conda/validate-spec\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nexport const tmpSpecFile = \"tmp-env-spec-88344b62d74b9307.yaml\";\n\nexport interface CondaOptions {\n baseImageTag: string;\n micromambaVersion: string;\n frozenSpecFile: string;\n pkg: string;\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface CondaDockerOptions extends CondaOptions, DockerOptions {}\n\nfunction generateCondaDockerfileContent(options: CondaOptions, arch: util.ArchType): string {\n // Read template from assets\n const templatePath = paths.assets(\"conda-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replaceAll(\"${BASE_IMAGE_TAG}\", options.baseImageTag)\n .replaceAll(\"${MAMBA_ROOT_PREFIX}\", path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION))\n .replaceAll(\n \"${CONDA_PKGS_DIRS}\",\n path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION, \"pkgs\"),\n )\n .replaceAll(\n \"${MICROMAMBA_DOWNLOAD_URL}\",\n micromambaDownloadUrl(options.micromambaVersion, `linux-${arch}`),\n )\n .replaceAll(\"${PKG}\", options.pkg)\n .replaceAll(\"${TMP_SPEC_FILE}\", tmpSpecFile)\n .replaceAll(\"${FROZEN_SPEC_FILE}\", options.frozenSpecFile);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n artifactID: string,\n buildParams: artifacts.condaType,\n arch: util.ArchType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Conda package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultCondaOptions();\n options.micromambaVersion = buildParams[\"micromamba-version\"];\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n const platform: util.PlatformType = `linux-${arch}`;\n\n if (!buildParams.roots) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n if (!buildParams.roots[platform]) {\n throw util.CLIError(\n `Cannot prepare Docker options: ${platform} root directory is not specified. Please ensure the 'roots' property is set for artifact.`,\n );\n }\n\n const contextDir = path.resolve(currentPackageRoot, buildParams.roots[platform]);\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n // Validate conda spec file before building\n const srcSpecPath = path.join(currentPackageRoot, buildParams.spec);\n logger.debug(`Validating conda spec file for forbidden channels...`);\n try {\n validateCondaSpec(logger, srcSpecPath);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(errorMessage);\n throw util.CLIError(\n `Cannot prepare Docker options for conda package '${artifactID}': ${errorMessage}`,\n );\n }\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created directory for autogenerated dockerfiles: ${dockerfileDir}`);\n\n fs.copyFileSync(srcSpecPath, path.join(contextDir, tmpSpecFile));\n logger.debug(`Copied spec file to context directory`);\n\n const dockerfile = {\n content: generateCondaDockerfileContent(options, arch),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction getDefaultCondaOptions(): CondaOptions {\n return {\n baseImageTag: defaults.CONDA_DOCKER_BASE_IMAGE,\n micromambaVersion: defaults.CONDA_MICROMAMBA_VERSION,\n frozenSpecFile: defaults.CONDA_FROZEN_ENV_SPEC_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n"],"mappings":";;;;;;;;;AAaA,MAAa,cAAc;AAkB3B,SAAS,+BAA+B,SAAuB,MAA6B;CAE1F,MAAM,eAAeA,OAAa,4BAA4B;AAI9D,QAHwBC,KAAG,aAAa,cAAc,QAAQ,CAI3D,WAAW,qBAAqB,QAAQ,aAAa,CACrD,WAAW,wBAAwBC,OAAK,MAAM,KAAK,QAAQ,KAAKC,oBAA6B,CAAC,CAC9F,WACC,sBACAD,OAAK,MAAM,KAAK,QAAQ,KAAKC,qBAA8B,OAAO,CACnE,CACA,WACC,8BACA,sBAAsB,QAAQ,mBAAmB,SAAS,OAAO,CAClE,CACA,WAAW,UAAU,QAAQ,IAAI,CACjC,WAAW,oBAAoB,YAAY,CAC3C,WAAW,uBAAuB,QAAQ,eAAe;;AAG9D,SAAgB,qBACd,QACA,oBACA,YACA,aACA,MACe;AACf,QAAO,MACL,+CAA+C,YAAY,KAAK,QAAQ,WAAW,GACpF;CAED,MAAM,UAAU,wBAAwB;AACxC,SAAQ,oBAAoB,YAAY;AAExC,KAAI,YAAY,IACd,SAAQ,MAAM,YAAY;CAG5B,MAAM,WAA8B,SAAS;AAE7C,KAAI,CAAC,YAAY,MACf,OAAMC,SACJ,8IACD;AAEH,KAAI,CAAC,YAAY,MAAM,UACrB,OAAMA,SACJ,kCAAkC,SAAS,2FAC5C;CAGH,MAAM,aAAaF,OAAK,QAAQ,oBAAoB,YAAY,MAAM,UAAU;AAChF,KAAI,CAACD,KAAG,WAAW,WAAW,CAC5B,MAAG,UAAU,YAAY,EAAE,WAAW,MAAM,CAAC;CAI/C,MAAM,cAAcC,OAAK,KAAK,oBAAoB,YAAY,KAAK;AACnE,QAAO,MAAM,uDAAuD;AACpE,KAAI;AACF,oBAAkB,QAAQ,YAAY;UAC/B,OAAO;EACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAO,MAAM,aAAa;AAC1B,QAAME,SACJ,oDAAoD,WAAW,KAAK,eACrE;;CAIH,MAAM,iBAAiB,sBAAsB,oBAAoB,WAAW;CAC5E,MAAM,gBAAgBF,OAAK,QAAQ,eAAe;AAClD,MAAG,UAAU,eAAe,EAAE,WAAW,MAAM,CAAC;AAChD,QAAO,MAAM,oDAAoD,gBAAgB;AAEjF,MAAG,aAAa,aAAaA,OAAK,KAAK,YAAY,YAAY,CAAC;AAChE,QAAO,MAAM,wCAAwC;CAErD,MAAM,aAAa;EACjB,SAAS,+BAA+B,SAAS,KAAK;EACtD,MAAM;EACP;AAED,MAAG,cAAc,WAAW,MAAM,WAAW,QAAQ;AACrD,QAAO,MAAM,0BAA0B,WAAW,OAAO;CAEzD,MAAM,SAAwB;EAC5B,YAAY,WAAW;EACvB,SAAS;EACT,YAAY,EAAE;EACd,KAAK,QAAQ;EACd;AAED,QAAO,MAAM,4BAA4B,KAAK,UAAU,OAAO,GAAG;AAClE,qBAAoB,OAAO;AAC3B,QAAO;;AAGT,SAAS,yBAAuC;AAC9C,QAAO;EACL,cAAcG;EACd,mBAAmBC;EACnB,gBAAgBC;EAChB,KAAKC;EACN;;AAGH,SAAS,oBAAoB,SAAwB;AACnD,KAAI,CAACP,KAAG,WAAW,QAAQ,WAAW,CACpC,OAAMG,SAAc,eAAe,QAAQ,WAAW,aAAa;AAGrE,KAAI,CAACH,KAAG,WAAW,QAAQ,QAAQ,CACjC,OAAMG,SAAc,YAAY,QAAQ,QAAQ,aAAa"}
1
+ {"version":3,"file":"docker-conda.js","names":["paths.assets","fs","path","defaults.CONDA_DATA_LOCATION","util.CLIError","defaults.CONDA_DOCKER_BASE_IMAGE","defaults.CONDA_MICROMAMBA_VERSION","defaults.CONDA_FROZEN_ENV_SPEC_FILE","defaults.DOCKER_PLACEHOLDER_PKG"],"sources":["../../src/core/docker-conda.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { micromambaDownloadUrl } from \"./conda/builder\";\nimport { validateCondaSpec } from \"./conda/validate-spec\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nexport const tmpSpecFile = \"tmp-env-spec-88344b62d74b9307.yaml\";\n\nexport interface CondaOptions {\n baseImageTag: string;\n micromambaVersion: string;\n frozenSpecFile: string;\n pkg: string;\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface CondaDockerOptions extends CondaOptions, DockerOptions {}\n\nfunction generateCondaDockerfileContent(options: CondaOptions, arch: util.ArchType): string {\n // Read template from assets\n const templatePath = paths.assets(\"conda-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replaceAll(\"${BASE_IMAGE_TAG}\", options.baseImageTag)\n .replaceAll(\"${MAMBA_ROOT_PREFIX}\", path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION))\n .replaceAll(\n \"${CONDA_PKGS_DIRS}\",\n path.posix.join(options.pkg, defaults.CONDA_DATA_LOCATION, \"pkgs\"),\n )\n .replaceAll(\n \"${MICROMAMBA_DOWNLOAD_URL}\",\n micromambaDownloadUrl(options.micromambaVersion, `linux-${arch}`),\n )\n .replaceAll(\"${PKG}\", options.pkg)\n .replaceAll(\"${TMP_SPEC_FILE}\", tmpSpecFile)\n .replaceAll(\"${FROZEN_SPEC_FILE}\", options.frozenSpecFile);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n artifactID: string,\n buildParams: artifacts.condaType,\n arch: util.ArchType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Conda package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultCondaOptions();\n options.micromambaVersion = buildParams[\"micromamba-version\"];\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n const platform: util.PlatformType = `linux-${arch}`;\n\n if (!buildParams.roots) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n if (!buildParams.roots[platform]) {\n throw util.CLIError(\n `Cannot prepare Docker options: ${platform} root directory is not specified. Please ensure the 'roots' property is set for artifact.`,\n );\n }\n\n const contextDir = path.resolve(currentPackageRoot, buildParams.roots[platform]);\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n // Validate conda spec file before building\n const srcSpecPath = path.join(currentPackageRoot, buildParams.spec);\n logger.debug(`Validating conda spec file for forbidden channels...`);\n try {\n validateCondaSpec(logger, srcSpecPath);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(errorMessage);\n throw util.CLIError(\n `Cannot prepare Docker options for conda package '${artifactID}': ${errorMessage}`,\n );\n }\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created directory for autogenerated dockerfiles: ${dockerfileDir}`);\n\n fs.copyFileSync(srcSpecPath, path.join(contextDir, tmpSpecFile));\n logger.debug(`Copied spec file to context directory`);\n\n const dockerfile = {\n content: generateCondaDockerfileContent(options, arch),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction getDefaultCondaOptions(): CondaOptions {\n return {\n baseImageTag: defaults.CONDA_DOCKER_BASE_IMAGE,\n micromambaVersion: defaults.CONDA_MICROMAMBA_VERSION,\n frozenSpecFile: defaults.CONDA_FROZEN_ENV_SPEC_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n"],"mappings":";;;;;;;;;AAaA,MAAa,cAAc;AAkB3B,SAAS,+BAA+B,SAAuB,MAA6B;CAE1F,MAAM,eAAeA,OAAa,2BAA2B;CAI7D,OAHwBC,KAAG,aAAa,cAAc,OAGjC,CAAC,CACnB,WAAW,qBAAqB,QAAQ,YAAY,CAAC,CACrD,WAAW,wBAAwBC,OAAK,MAAM,KAAK,QAAQ,KAAKC,mBAA4B,CAAC,CAAC,CAC9F,WACC,sBACAD,OAAK,MAAM,KAAK,QAAQ,KAAKC,qBAA8B,MAAM,CACnE,CAAC,CACA,WACC,8BACA,sBAAsB,QAAQ,mBAAmB,SAAS,MAAM,CAClE,CAAC,CACA,WAAW,UAAU,QAAQ,GAAG,CAAC,CACjC,WAAW,oBAAoB,WAAW,CAAC,CAC3C,WAAW,uBAAuB,QAAQ,cAAc;AAC7D;AAEA,SAAgB,qBACd,QACA,oBACA,YACA,aACA,MACe;CACf,OAAO,MACL,+CAA+C,YAAY,KAAK,QAAQ,WAAW,EACrF;CAEA,MAAM,UAAU,uBAAuB;CACvC,QAAQ,oBAAoB,YAAY;CAExC,IAAI,YAAY,KACd,QAAQ,MAAM,YAAY;CAG5B,MAAM,WAA8B,SAAS;CAE7C,IAAI,CAAC,YAAY,OACf,MAAMC,SACJ,6IACF;CAEF,IAAI,CAAC,YAAY,MAAM,WACrB,MAAMA,SACJ,kCAAkC,SAAS,0FAC7C;CAGF,MAAM,aAAaF,OAAK,QAAQ,oBAAoB,YAAY,MAAM,SAAS;CAC/E,IAAI,CAACD,KAAG,WAAW,UAAU,GAC3B,KAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;CAI9C,MAAM,cAAcC,OAAK,KAAK,oBAAoB,YAAY,IAAI;CAClE,OAAO,MAAM,sDAAsD;CACnE,IAAI;EACF,kBAAkB,QAAQ,WAAW;CACvC,SAAS,OAAO;EACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC1E,OAAO,MAAM,YAAY;EACzB,MAAME,SACJ,oDAAoD,WAAW,KAAK,cACtE;CACF;CAGA,MAAM,iBAAiB,sBAAsB,oBAAoB,UAAU;CAC3E,MAAM,gBAAgBF,OAAK,QAAQ,cAAc;CACjD,KAAG,UAAU,eAAe,EAAE,WAAW,KAAK,CAAC;CAC/C,OAAO,MAAM,oDAAoD,eAAe;CAEhF,KAAG,aAAa,aAAaA,OAAK,KAAK,YAAY,WAAW,CAAC;CAC/D,OAAO,MAAM,uCAAuC;CAEpD,MAAM,aAAa;EACjB,SAAS,+BAA+B,SAAS,IAAI;EACrD,MAAM;CACR;CAEA,KAAG,cAAc,WAAW,MAAM,WAAW,OAAO;CACpD,OAAO,MAAM,0BAA0B,WAAW,MAAM;CAExD,MAAM,SAAwB;EAC5B,YAAY,WAAW;EACvB,SAAS;EACT,YAAY,CAAC;EACb,KAAK,QAAQ;CACf;CAEA,OAAO,MAAM,4BAA4B,KAAK,UAAU,MAAM,GAAG;CACjE,oBAAoB,MAAM;CAC1B,OAAO;AACT;AAEA,SAAS,yBAAuC;CAC9C,OAAO;EACL,cAAcG;EACd,mBAAmBC;EACnB,gBAAgBC;EAChB,KAAKC;CACP;AACF;AAEA,SAAS,oBAAoB,SAAwB;CACnD,IAAI,CAACP,KAAG,WAAW,QAAQ,UAAU,GACnC,MAAMG,SAAc,eAAe,QAAQ,WAAW,YAAY;CAGpE,IAAI,CAACH,KAAG,WAAW,QAAQ,OAAO,GAChC,MAAMG,SAAc,YAAY,QAAQ,QAAQ,YAAY;AAEhE"}
@@ -5,9 +5,9 @@ const require_docker = require("./docker.cjs");
5
5
  const require_paths = require("./paths.cjs");
6
6
  const require_resolver = require("./resolver.cjs");
7
7
  let node_fs = require("node:fs");
8
- node_fs = require_runtime.__toESM(node_fs);
8
+ node_fs = require_runtime.__toESM(node_fs, 1);
9
9
  let node_path = require("node:path");
10
- node_path = require_runtime.__toESM(node_path);
10
+ node_path = require_runtime.__toESM(node_path, 1);
11
11
  //#region src/core/docker-python.ts
12
12
  const PYTHON_VERSION_PATTERNS = {
13
13
  PY3_PREFIX: /^3\./,
@@ -142,6 +142,7 @@ function pythonVersionToDockerTag(pythonVersion) {
142
142
  return `python:${pythonVersion}-slim`;
143
143
  }
144
144
  //#endregion
145
+ exports.getRunEnvironmentPythonInfo = getRunEnvironmentPythonInfo;
145
146
  exports.prepareDockerOptions = prepareDockerOptions;
146
147
 
147
148
  //# sourceMappingURL=docker-python.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-python.cjs","names":["fs","path","dockerfileAutogenPath","resolveRunEnvironment"],"sources":["../../src/core/docker-python.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { resolveRunEnvironment } from \"./resolver\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nconst PYTHON_VERSION_PATTERNS = {\n PY3_PREFIX: /^3\\./,\n VERSION_FORMAT:\n /^3\\.\\d+(?:\\.\\d+)?(?:[-+_][a-zA-Z0-9]+|(?:a|b|rc)\\d+|[a-zA-Z]+\\d+(?:\\.[a-zA-Z0-9]+)*)*$/,\n DOCKER_SEPARATOR: /@.*$/,\n DOCKER_UNSAFE_CHARS: /[^A-Za-z0-9_.-]+/g,\n MULTIPLE_SEPARATORS: /[-.]{2,}/g,\n EDGE_SEPARATORS: /^[-.]+|[-.]+$/g,\n DOCKER_TAG_FORMAT: /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,\n};\n\nexport interface PythonOptions {\n baseImageTag: string;\n toolset: string;\n requirements: string;\n pkg: string;\n envVars: string[]; // custom environment variables set for run environment\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface PythonDockerOptions extends PythonOptions, DockerOptions {}\n\nfunction generatePythonDockerfileContent(options: PythonOptions): string {\n // Read template from assets\n const templatePath = paths.assets(\"python-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n const envVars = options.envVars.map((envVar) => `ENV ${envVar}`).join(\"\\n\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replace(/\\$\\{RUNENV_ENVS\\}/g, envVars)\n .replace(/\\$\\{BASE_IMAGE_TAG\\}/g, options.baseImageTag)\n .replace(/\\$\\{REQUIREMENTS_PATH\\}/g, options.requirements)\n .replace(/\\$\\{REQUIREMENTS_FILENAME\\}/g, path.basename(options.requirements))\n .replace(/\\$\\{TOOLSET\\}/g, options.toolset)\n .replace(/\\$\\{PKG\\}/g, options.pkg);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n artifactID: string,\n buildParams: artifacts.pythonType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Python package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultPythonOptions();\n\n const pythonInfo = getRunEnvironmentPythonInfo(\n logger,\n currentPackageRoot,\n currentPackageName,\n buildParams.environment,\n );\n if (pythonInfo.pythonVersion) {\n logger.debug(`Extracted Python version from environment: ${pythonInfo.pythonVersion}`);\n options.baseImageTag = pythonVersionToDockerTag(pythonInfo.pythonVersion);\n } else {\n logger.debug(`No Python version found in environment, using default: ${options.baseImageTag}`);\n }\n options.envVars = pythonInfo.envVars;\n\n if (buildParams.dependencies) {\n options.toolset = buildParams.dependencies.toolset;\n options.requirements = buildParams.dependencies.requirements;\n }\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n if (!buildParams.root) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n const contextDir = path.resolve(buildParams.root ?? currentPackageRoot);\n\n options.requirements = path.join(contextDir, options.requirements);\n const hasRequirements = fs.existsSync(options.requirements);\n\n if (!hasRequirements) {\n // If requirements.txt doesn't exist, create an empty one\n fs.writeFileSync(options.requirements, \"# No dependencies specified\\n\");\n logger.warn(`Created empty requirements.txt at: ${options.requirements}`);\n }\n // If requirements.txt exists, use relative path for Docker COPY command\n options.requirements = path.relative(contextDir, options.requirements);\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created temporary Docker directory: ${dockerfileDir}`);\n\n const dockerfile = {\n content: generatePythonDockerfileContent(options),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction normalizeDockerTag(candidate: string): string | undefined {\n if (!candidate || typeof candidate !== \"string\") {\n return undefined;\n }\n\n // First remove Docker-specific parts like @sha256:...\n let normalized = candidate.replace(PYTHON_VERSION_PATTERNS.DOCKER_SEPARATOR, \"\");\n\n // For cases like \"3.12.6:latest\", extract only the version part\n if (normalized.includes(\":\")) {\n normalized = normalized.split(\":\")[0];\n }\n\n // Clean up any remaining unsafe characters\n normalized = normalized\n .replace(PYTHON_VERSION_PATTERNS.DOCKER_UNSAFE_CHARS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.MULTIPLE_SEPARATORS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.EDGE_SEPARATORS, \"\");\n\n return normalized || undefined;\n}\n\nfunction isValidPythonVersion(version: string): boolean {\n return (\n PYTHON_VERSION_PATTERNS.PY3_PREFIX.test(version) &&\n PYTHON_VERSION_PATTERNS.VERSION_FORMAT.test(version)\n );\n}\n\nfunction isValidDockerTag(tag: string): boolean {\n return PYTHON_VERSION_PATTERNS.DOCKER_TAG_FORMAT.test(tag);\n}\n\nexport function getRunEnvironmentPythonInfo(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n runEnvironmentID: artifacts.artifactIDString,\n { normalizeForDocker = true }: { normalizeForDocker?: boolean } = {},\n): {\n pythonVersion: string | undefined;\n envVars: string[];\n} {\n if (!runEnvironmentID) {\n return {\n pythonVersion: undefined,\n envVars: [],\n };\n }\n\n const environmentDescriptor = resolveRunEnvironment(\n logger,\n currentPackageRoot,\n currentPackageName,\n runEnvironmentID,\n \"python\",\n );\n\n let pythonVersion: string | undefined = environmentDescriptor[\"python-version\"];\n const envVars = environmentDescriptor.envVars ?? [];\n if (!pythonVersion) {\n pythonVersion = undefined;\n const trimmedInput = runEnvironmentID.trim();\n if (!trimmedInput) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n const colonIndex = trimmedInput.indexOf(\":\");\n if (colonIndex === -1 || colonIndex === trimmedInput.length - 1) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n pythonVersion = trimmedInput.slice(colonIndex + 1);\n if (pythonVersion.startsWith(\"python\")) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n }\n\n if (!normalizeForDocker) {\n return {\n pythonVersion,\n envVars,\n };\n }\n\n const normalizedTag = normalizeDockerTag(pythonVersion);\n if (!normalizedTag) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n if (!isValidPythonVersion(normalizedTag) || !isValidDockerTag(normalizedTag)) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n return {\n pythonVersion: normalizedTag,\n envVars,\n };\n}\n\nfunction getDefaultPythonOptions(): PythonOptions {\n return {\n baseImageTag: defaults.PYTHON_DOCKER_BASE_IMAGE,\n toolset: defaults.PYTHON_TOOLSET,\n requirements: defaults.PYTHON_REQUIREMENTS_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n envVars: [],\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n\nfunction pythonVersionToDockerTag(pythonVersion: string): string {\n const parts = pythonVersion.split(\".\");\n if (parts.length > 2) {\n const major = parts[0];\n const minor = parts[1];\n return `python:${major}.${minor}-slim`;\n }\n\n return `python:${pythonVersion}-slim`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"docker-python.cjs","names":["fs","path","dockerfileAutogenPath","resolveRunEnvironment"],"sources":["../../src/core/docker-python.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { resolveRunEnvironment } from \"./resolver\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nconst PYTHON_VERSION_PATTERNS = {\n PY3_PREFIX: /^3\\./,\n VERSION_FORMAT:\n /^3\\.\\d+(?:\\.\\d+)?(?:[-+_][a-zA-Z0-9]+|(?:a|b|rc)\\d+|[a-zA-Z]+\\d+(?:\\.[a-zA-Z0-9]+)*)*$/,\n DOCKER_SEPARATOR: /@.*$/,\n DOCKER_UNSAFE_CHARS: /[^A-Za-z0-9_.-]+/g,\n MULTIPLE_SEPARATORS: /[-.]{2,}/g,\n EDGE_SEPARATORS: /^[-.]+|[-.]+$/g,\n DOCKER_TAG_FORMAT: /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,\n};\n\nexport interface PythonOptions {\n baseImageTag: string;\n toolset: string;\n requirements: string;\n pkg: string;\n envVars: string[]; // custom environment variables set for run environment\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface PythonDockerOptions extends PythonOptions, DockerOptions {}\n\nfunction generatePythonDockerfileContent(options: PythonOptions): string {\n // Read template from assets\n const templatePath = paths.assets(\"python-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n const envVars = options.envVars.map((envVar) => `ENV ${envVar}`).join(\"\\n\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replace(/\\$\\{RUNENV_ENVS\\}/g, envVars)\n .replace(/\\$\\{BASE_IMAGE_TAG\\}/g, options.baseImageTag)\n .replace(/\\$\\{REQUIREMENTS_PATH\\}/g, options.requirements)\n .replace(/\\$\\{REQUIREMENTS_FILENAME\\}/g, path.basename(options.requirements))\n .replace(/\\$\\{TOOLSET\\}/g, options.toolset)\n .replace(/\\$\\{PKG\\}/g, options.pkg);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n artifactID: string,\n buildParams: artifacts.pythonType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Python package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultPythonOptions();\n\n const pythonInfo = getRunEnvironmentPythonInfo(\n logger,\n currentPackageRoot,\n currentPackageName,\n buildParams.environment,\n );\n if (pythonInfo.pythonVersion) {\n logger.debug(`Extracted Python version from environment: ${pythonInfo.pythonVersion}`);\n options.baseImageTag = pythonVersionToDockerTag(pythonInfo.pythonVersion);\n } else {\n logger.debug(`No Python version found in environment, using default: ${options.baseImageTag}`);\n }\n options.envVars = pythonInfo.envVars;\n\n if (buildParams.dependencies) {\n options.toolset = buildParams.dependencies.toolset;\n options.requirements = buildParams.dependencies.requirements;\n }\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n if (!buildParams.root) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n const contextDir = path.resolve(buildParams.root ?? currentPackageRoot);\n\n options.requirements = path.join(contextDir, options.requirements);\n const hasRequirements = fs.existsSync(options.requirements);\n\n if (!hasRequirements) {\n // If requirements.txt doesn't exist, create an empty one\n fs.writeFileSync(options.requirements, \"# No dependencies specified\\n\");\n logger.warn(`Created empty requirements.txt at: ${options.requirements}`);\n }\n // If requirements.txt exists, use relative path for Docker COPY command\n options.requirements = path.relative(contextDir, options.requirements);\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created temporary Docker directory: ${dockerfileDir}`);\n\n const dockerfile = {\n content: generatePythonDockerfileContent(options),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction normalizeDockerTag(candidate: string): string | undefined {\n if (!candidate || typeof candidate !== \"string\") {\n return undefined;\n }\n\n // First remove Docker-specific parts like @sha256:...\n let normalized = candidate.replace(PYTHON_VERSION_PATTERNS.DOCKER_SEPARATOR, \"\");\n\n // For cases like \"3.12.6:latest\", extract only the version part\n if (normalized.includes(\":\")) {\n normalized = normalized.split(\":\")[0];\n }\n\n // Clean up any remaining unsafe characters\n normalized = normalized\n .replace(PYTHON_VERSION_PATTERNS.DOCKER_UNSAFE_CHARS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.MULTIPLE_SEPARATORS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.EDGE_SEPARATORS, \"\");\n\n return normalized || undefined;\n}\n\nfunction isValidPythonVersion(version: string): boolean {\n return (\n PYTHON_VERSION_PATTERNS.PY3_PREFIX.test(version) &&\n PYTHON_VERSION_PATTERNS.VERSION_FORMAT.test(version)\n );\n}\n\nfunction isValidDockerTag(tag: string): boolean {\n return PYTHON_VERSION_PATTERNS.DOCKER_TAG_FORMAT.test(tag);\n}\n\nexport function getRunEnvironmentPythonInfo(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n runEnvironmentID: artifacts.artifactIDString,\n { normalizeForDocker = true }: { normalizeForDocker?: boolean } = {},\n): {\n pythonVersion: string | undefined;\n envVars: string[];\n} {\n if (!runEnvironmentID) {\n return {\n pythonVersion: undefined,\n envVars: [],\n };\n }\n\n const environmentDescriptor = resolveRunEnvironment(\n logger,\n currentPackageRoot,\n currentPackageName,\n runEnvironmentID,\n \"python\",\n );\n\n let pythonVersion: string | undefined = environmentDescriptor[\"python-version\"];\n const envVars = environmentDescriptor.envVars ?? [];\n if (!pythonVersion) {\n pythonVersion = undefined;\n const trimmedInput = runEnvironmentID.trim();\n if (!trimmedInput) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n const colonIndex = trimmedInput.indexOf(\":\");\n if (colonIndex === -1 || colonIndex === trimmedInput.length - 1) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n pythonVersion = trimmedInput.slice(colonIndex + 1);\n if (pythonVersion.startsWith(\"python\")) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n }\n\n if (!normalizeForDocker) {\n return {\n pythonVersion,\n envVars,\n };\n }\n\n const normalizedTag = normalizeDockerTag(pythonVersion);\n if (!normalizedTag) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n if (!isValidPythonVersion(normalizedTag) || !isValidDockerTag(normalizedTag)) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n return {\n pythonVersion: normalizedTag,\n envVars,\n };\n}\n\nfunction getDefaultPythonOptions(): PythonOptions {\n return {\n baseImageTag: defaults.PYTHON_DOCKER_BASE_IMAGE,\n toolset: defaults.PYTHON_TOOLSET,\n requirements: defaults.PYTHON_REQUIREMENTS_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n envVars: [],\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n\nfunction pythonVersionToDockerTag(pythonVersion: string): string {\n const parts = pythonVersion.split(\".\");\n if (parts.length > 2) {\n const major = parts[0];\n const minor = parts[1];\n return `python:${major}.${minor}-slim`;\n }\n\n return `python:${pythonVersion}-slim`;\n}\n"],"mappings":"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"}
@@ -139,6 +139,6 @@ function pythonVersionToDockerTag(pythonVersion) {
139
139
  return `python:${pythonVersion}-slim`;
140
140
  }
141
141
  //#endregion
142
- export { prepareDockerOptions };
142
+ export { getRunEnvironmentPythonInfo, prepareDockerOptions };
143
143
 
144
144
  //# sourceMappingURL=docker-python.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-python.js","names":["paths.assets","fs","path","util.CLIError","defaults.PYTHON_DOCKER_BASE_IMAGE","defaults.PYTHON_REQUIREMENTS_FILE","defaults.DOCKER_PLACEHOLDER_PKG"],"sources":["../../src/core/docker-python.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { resolveRunEnvironment } from \"./resolver\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nconst PYTHON_VERSION_PATTERNS = {\n PY3_PREFIX: /^3\\./,\n VERSION_FORMAT:\n /^3\\.\\d+(?:\\.\\d+)?(?:[-+_][a-zA-Z0-9]+|(?:a|b|rc)\\d+|[a-zA-Z]+\\d+(?:\\.[a-zA-Z0-9]+)*)*$/,\n DOCKER_SEPARATOR: /@.*$/,\n DOCKER_UNSAFE_CHARS: /[^A-Za-z0-9_.-]+/g,\n MULTIPLE_SEPARATORS: /[-.]{2,}/g,\n EDGE_SEPARATORS: /^[-.]+|[-.]+$/g,\n DOCKER_TAG_FORMAT: /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,\n};\n\nexport interface PythonOptions {\n baseImageTag: string;\n toolset: string;\n requirements: string;\n pkg: string;\n envVars: string[]; // custom environment variables set for run environment\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface PythonDockerOptions extends PythonOptions, DockerOptions {}\n\nfunction generatePythonDockerfileContent(options: PythonOptions): string {\n // Read template from assets\n const templatePath = paths.assets(\"python-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n const envVars = options.envVars.map((envVar) => `ENV ${envVar}`).join(\"\\n\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replace(/\\$\\{RUNENV_ENVS\\}/g, envVars)\n .replace(/\\$\\{BASE_IMAGE_TAG\\}/g, options.baseImageTag)\n .replace(/\\$\\{REQUIREMENTS_PATH\\}/g, options.requirements)\n .replace(/\\$\\{REQUIREMENTS_FILENAME\\}/g, path.basename(options.requirements))\n .replace(/\\$\\{TOOLSET\\}/g, options.toolset)\n .replace(/\\$\\{PKG\\}/g, options.pkg);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n artifactID: string,\n buildParams: artifacts.pythonType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Python package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultPythonOptions();\n\n const pythonInfo = getRunEnvironmentPythonInfo(\n logger,\n currentPackageRoot,\n currentPackageName,\n buildParams.environment,\n );\n if (pythonInfo.pythonVersion) {\n logger.debug(`Extracted Python version from environment: ${pythonInfo.pythonVersion}`);\n options.baseImageTag = pythonVersionToDockerTag(pythonInfo.pythonVersion);\n } else {\n logger.debug(`No Python version found in environment, using default: ${options.baseImageTag}`);\n }\n options.envVars = pythonInfo.envVars;\n\n if (buildParams.dependencies) {\n options.toolset = buildParams.dependencies.toolset;\n options.requirements = buildParams.dependencies.requirements;\n }\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n if (!buildParams.root) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n const contextDir = path.resolve(buildParams.root ?? currentPackageRoot);\n\n options.requirements = path.join(contextDir, options.requirements);\n const hasRequirements = fs.existsSync(options.requirements);\n\n if (!hasRequirements) {\n // If requirements.txt doesn't exist, create an empty one\n fs.writeFileSync(options.requirements, \"# No dependencies specified\\n\");\n logger.warn(`Created empty requirements.txt at: ${options.requirements}`);\n }\n // If requirements.txt exists, use relative path for Docker COPY command\n options.requirements = path.relative(contextDir, options.requirements);\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created temporary Docker directory: ${dockerfileDir}`);\n\n const dockerfile = {\n content: generatePythonDockerfileContent(options),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction normalizeDockerTag(candidate: string): string | undefined {\n if (!candidate || typeof candidate !== \"string\") {\n return undefined;\n }\n\n // First remove Docker-specific parts like @sha256:...\n let normalized = candidate.replace(PYTHON_VERSION_PATTERNS.DOCKER_SEPARATOR, \"\");\n\n // For cases like \"3.12.6:latest\", extract only the version part\n if (normalized.includes(\":\")) {\n normalized = normalized.split(\":\")[0];\n }\n\n // Clean up any remaining unsafe characters\n normalized = normalized\n .replace(PYTHON_VERSION_PATTERNS.DOCKER_UNSAFE_CHARS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.MULTIPLE_SEPARATORS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.EDGE_SEPARATORS, \"\");\n\n return normalized || undefined;\n}\n\nfunction isValidPythonVersion(version: string): boolean {\n return (\n PYTHON_VERSION_PATTERNS.PY3_PREFIX.test(version) &&\n PYTHON_VERSION_PATTERNS.VERSION_FORMAT.test(version)\n );\n}\n\nfunction isValidDockerTag(tag: string): boolean {\n return PYTHON_VERSION_PATTERNS.DOCKER_TAG_FORMAT.test(tag);\n}\n\nexport function getRunEnvironmentPythonInfo(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n runEnvironmentID: artifacts.artifactIDString,\n { normalizeForDocker = true }: { normalizeForDocker?: boolean } = {},\n): {\n pythonVersion: string | undefined;\n envVars: string[];\n} {\n if (!runEnvironmentID) {\n return {\n pythonVersion: undefined,\n envVars: [],\n };\n }\n\n const environmentDescriptor = resolveRunEnvironment(\n logger,\n currentPackageRoot,\n currentPackageName,\n runEnvironmentID,\n \"python\",\n );\n\n let pythonVersion: string | undefined = environmentDescriptor[\"python-version\"];\n const envVars = environmentDescriptor.envVars ?? [];\n if (!pythonVersion) {\n pythonVersion = undefined;\n const trimmedInput = runEnvironmentID.trim();\n if (!trimmedInput) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n const colonIndex = trimmedInput.indexOf(\":\");\n if (colonIndex === -1 || colonIndex === trimmedInput.length - 1) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n pythonVersion = trimmedInput.slice(colonIndex + 1);\n if (pythonVersion.startsWith(\"python\")) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n }\n\n if (!normalizeForDocker) {\n return {\n pythonVersion,\n envVars,\n };\n }\n\n const normalizedTag = normalizeDockerTag(pythonVersion);\n if (!normalizedTag) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n if (!isValidPythonVersion(normalizedTag) || !isValidDockerTag(normalizedTag)) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n return {\n pythonVersion: normalizedTag,\n envVars,\n };\n}\n\nfunction getDefaultPythonOptions(): PythonOptions {\n return {\n baseImageTag: defaults.PYTHON_DOCKER_BASE_IMAGE,\n toolset: defaults.PYTHON_TOOLSET,\n requirements: defaults.PYTHON_REQUIREMENTS_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n envVars: [],\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n\nfunction pythonVersionToDockerTag(pythonVersion: string): string {\n const parts = pythonVersion.split(\".\");\n if (parts.length > 2) {\n const major = parts[0];\n const minor = parts[1];\n return `python:${major}.${minor}-slim`;\n }\n\n return `python:${pythonVersion}-slim`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"docker-python.js","names":["paths.assets","fs","path","util.CLIError","defaults.PYTHON_DOCKER_BASE_IMAGE","defaults.PYTHON_REQUIREMENTS_FILE","defaults.DOCKER_PLACEHOLDER_PKG"],"sources":["../../src/core/docker-python.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type winston from \"winston\";\n\nimport * as defaults from \"../defaults\";\nimport * as paths from \"./paths\";\nimport * as util from \"./util\";\n\nimport type * as artifacts from \"./schemas/artifacts\";\nimport { resolveRunEnvironment } from \"./resolver\";\nimport { dockerfileAutogenPath } from \"./docker\";\n\nconst PYTHON_VERSION_PATTERNS = {\n PY3_PREFIX: /^3\\./,\n VERSION_FORMAT:\n /^3\\.\\d+(?:\\.\\d+)?(?:[-+_][a-zA-Z0-9]+|(?:a|b|rc)\\d+|[a-zA-Z]+\\d+(?:\\.[a-zA-Z0-9]+)*)*$/,\n DOCKER_SEPARATOR: /@.*$/,\n DOCKER_UNSAFE_CHARS: /[^A-Za-z0-9_.-]+/g,\n MULTIPLE_SEPARATORS: /[-.]{2,}/g,\n EDGE_SEPARATORS: /^[-.]+|[-.]+$/g,\n DOCKER_TAG_FORMAT: /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,\n};\n\nexport interface PythonOptions {\n baseImageTag: string;\n toolset: string;\n requirements: string;\n pkg: string;\n envVars: string[]; // custom environment variables set for run environment\n}\n\nexport interface DockerOptions {\n context: string;\n dockerfile: string;\n entrypoint: string[];\n pkg: string;\n}\n\nexport interface PythonDockerOptions extends PythonOptions, DockerOptions {}\n\nfunction generatePythonDockerfileContent(options: PythonOptions): string {\n // Read template from assets\n const templatePath = paths.assets(\"python-dockerfile.template\");\n const templateContent = fs.readFileSync(templatePath, \"utf-8\");\n\n const envVars = options.envVars.map((envVar) => `ENV ${envVar}`).join(\"\\n\");\n\n // Generate Dockerfile with dependencies\n return templateContent\n .replace(/\\$\\{RUNENV_ENVS\\}/g, envVars)\n .replace(/\\$\\{BASE_IMAGE_TAG\\}/g, options.baseImageTag)\n .replace(/\\$\\{REQUIREMENTS_PATH\\}/g, options.requirements)\n .replace(/\\$\\{REQUIREMENTS_FILENAME\\}/g, path.basename(options.requirements))\n .replace(/\\$\\{TOOLSET\\}/g, options.toolset)\n .replace(/\\$\\{PKG\\}/g, options.pkg);\n}\n\nexport function prepareDockerOptions(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n artifactID: string,\n buildParams: artifacts.pythonType,\n): DockerOptions {\n logger.debug(\n `Preparing Docker options for Python package: ${buildParams.name} (id: ${artifactID})`,\n );\n\n const options = getDefaultPythonOptions();\n\n const pythonInfo = getRunEnvironmentPythonInfo(\n logger,\n currentPackageRoot,\n currentPackageName,\n buildParams.environment,\n );\n if (pythonInfo.pythonVersion) {\n logger.debug(`Extracted Python version from environment: ${pythonInfo.pythonVersion}`);\n options.baseImageTag = pythonVersionToDockerTag(pythonInfo.pythonVersion);\n } else {\n logger.debug(`No Python version found in environment, using default: ${options.baseImageTag}`);\n }\n options.envVars = pythonInfo.envVars;\n\n if (buildParams.dependencies) {\n options.toolset = buildParams.dependencies.toolset;\n options.requirements = buildParams.dependencies.requirements;\n }\n\n if (buildParams.pkg) {\n options.pkg = buildParams.pkg;\n }\n\n if (!buildParams.root) {\n throw util.CLIError(\n 'Cannot prepare Docker options: package root directory is not specified. Please ensure the \"root\" property is set in the build parameters.',\n );\n }\n const contextDir = path.resolve(buildParams.root ?? currentPackageRoot);\n\n options.requirements = path.join(contextDir, options.requirements);\n const hasRequirements = fs.existsSync(options.requirements);\n\n if (!hasRequirements) {\n // If requirements.txt doesn't exist, create an empty one\n fs.writeFileSync(options.requirements, \"# No dependencies specified\\n\");\n logger.warn(`Created empty requirements.txt at: ${options.requirements}`);\n }\n // If requirements.txt exists, use relative path for Docker COPY command\n options.requirements = path.relative(contextDir, options.requirements);\n\n // Generate a temporary directory for the Dockerfile\n const dockerfilePath = dockerfileAutogenPath(currentPackageRoot, artifactID);\n\n const dockerfileDir = path.dirname(dockerfilePath);\n fs.mkdirSync(dockerfileDir, { recursive: true });\n logger.debug(`Created temporary Docker directory: ${dockerfileDir}`);\n\n const dockerfile = {\n content: generatePythonDockerfileContent(options),\n path: dockerfilePath,\n };\n\n fs.writeFileSync(dockerfile.path, dockerfile.content);\n logger.debug(`Written Dockerfile to: ${dockerfile.path}`);\n\n const result: DockerOptions = {\n dockerfile: dockerfile.path,\n context: contextDir,\n entrypoint: [],\n pkg: options.pkg,\n };\n\n logger.debug(`Prepared Docker options: ${JSON.stringify(result)}`);\n verifyDockerOptions(result);\n return result;\n}\n\nfunction normalizeDockerTag(candidate: string): string | undefined {\n if (!candidate || typeof candidate !== \"string\") {\n return undefined;\n }\n\n // First remove Docker-specific parts like @sha256:...\n let normalized = candidate.replace(PYTHON_VERSION_PATTERNS.DOCKER_SEPARATOR, \"\");\n\n // For cases like \"3.12.6:latest\", extract only the version part\n if (normalized.includes(\":\")) {\n normalized = normalized.split(\":\")[0];\n }\n\n // Clean up any remaining unsafe characters\n normalized = normalized\n .replace(PYTHON_VERSION_PATTERNS.DOCKER_UNSAFE_CHARS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.MULTIPLE_SEPARATORS, \"-\")\n .replace(PYTHON_VERSION_PATTERNS.EDGE_SEPARATORS, \"\");\n\n return normalized || undefined;\n}\n\nfunction isValidPythonVersion(version: string): boolean {\n return (\n PYTHON_VERSION_PATTERNS.PY3_PREFIX.test(version) &&\n PYTHON_VERSION_PATTERNS.VERSION_FORMAT.test(version)\n );\n}\n\nfunction isValidDockerTag(tag: string): boolean {\n return PYTHON_VERSION_PATTERNS.DOCKER_TAG_FORMAT.test(tag);\n}\n\nexport function getRunEnvironmentPythonInfo(\n logger: winston.Logger,\n currentPackageRoot: string,\n currentPackageName: string,\n runEnvironmentID: artifacts.artifactIDString,\n { normalizeForDocker = true }: { normalizeForDocker?: boolean } = {},\n): {\n pythonVersion: string | undefined;\n envVars: string[];\n} {\n if (!runEnvironmentID) {\n return {\n pythonVersion: undefined,\n envVars: [],\n };\n }\n\n const environmentDescriptor = resolveRunEnvironment(\n logger,\n currentPackageRoot,\n currentPackageName,\n runEnvironmentID,\n \"python\",\n );\n\n let pythonVersion: string | undefined = environmentDescriptor[\"python-version\"];\n const envVars = environmentDescriptor.envVars ?? [];\n if (!pythonVersion) {\n pythonVersion = undefined;\n const trimmedInput = runEnvironmentID.trim();\n if (!trimmedInput) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n const colonIndex = trimmedInput.indexOf(\":\");\n if (colonIndex === -1 || colonIndex === trimmedInput.length - 1) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n pythonVersion = trimmedInput.slice(colonIndex + 1);\n if (pythonVersion.startsWith(\"python\")) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n }\n\n if (!normalizeForDocker) {\n return {\n pythonVersion,\n envVars,\n };\n }\n\n const normalizedTag = normalizeDockerTag(pythonVersion);\n if (!normalizedTag) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n if (!isValidPythonVersion(normalizedTag) || !isValidDockerTag(normalizedTag)) {\n return {\n pythonVersion: undefined,\n envVars,\n };\n }\n\n return {\n pythonVersion: normalizedTag,\n envVars,\n };\n}\n\nfunction getDefaultPythonOptions(): PythonOptions {\n return {\n baseImageTag: defaults.PYTHON_DOCKER_BASE_IMAGE,\n toolset: defaults.PYTHON_TOOLSET,\n requirements: defaults.PYTHON_REQUIREMENTS_FILE,\n pkg: defaults.DOCKER_PLACEHOLDER_PKG,\n envVars: [],\n };\n}\n\nfunction verifyDockerOptions(options: DockerOptions) {\n if (!fs.existsSync(options.dockerfile)) {\n throw util.CLIError(`Dockerfile '${options.dockerfile}' not found`);\n }\n\n if (!fs.existsSync(options.context)) {\n throw util.CLIError(`Context '${options.context}' not found`);\n }\n}\n\nfunction pythonVersionToDockerTag(pythonVersion: string): string {\n const parts = pythonVersion.split(\".\");\n if (parts.length > 2) {\n const major = parts[0];\n const minor = parts[1];\n return `python:${major}.${minor}-slim`;\n }\n\n return `python:${pythonVersion}-slim`;\n}\n"],"mappings":"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"}
@@ -2,11 +2,11 @@ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_defaults = require("../defaults.cjs");
3
3
  const require_util = require("./util.cjs");
4
4
  let node_fs = require("node:fs");
5
- node_fs = require_runtime.__toESM(node_fs);
5
+ node_fs = require_runtime.__toESM(node_fs, 1);
6
6
  let node_path = require("node:path");
7
- node_path = require_runtime.__toESM(node_path);
7
+ node_path = require_runtime.__toESM(node_path, 1);
8
8
  let node_os = require("node:os");
9
- node_os = require_runtime.__toESM(node_os);
9
+ node_os = require_runtime.__toESM(node_os, 1);
10
10
  let node_child_process = require("node:child_process");
11
11
  //#region src/core/docker.ts
12
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"docker.cjs","names":["os","path","fs"],"sources":["../../src/core/docker.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport * as defaults from \"../defaults\";\nimport type * as artifacts from \"./schemas/artifacts\";\nimport * as util from \"./util\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * To allow entrypoint keep both docker and binary package at the same time, we create virtual entrypoint with ':docker' suffix,\n * as entrypoints could not keep two different artifacts at the same time.\n */\nexport function entrypointName(name: string): string {\n return name + \":docker\";\n}\n\nexport function isVirtualDockerEntrypointName(name: string): boolean {\n return name.endsWith(\":docker\");\n}\n\nexport function entrypointNameToOrigin(name: string): string {\n if (!isVirtualDockerEntrypointName(name)) {\n return name;\n }\n return name.substring(0, name.length - \":docker\".length);\n}\n\nexport function getImageHash(tag: string): string {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"ls\", \"--filter=reference=\" + tag, \"--format={{.ID}}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`local docker image check failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim();\n if (output.split(\"\\n\").length > 1) {\n throw util.CLIError(\n `package-builder internal logic error: more than one image found by exact tag match: ${output}`,\n );\n }\n\n return output;\n}\n\nexport function getImageEntrypoint(tag: string): string[] {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"inspect\", tag, \"--format\", \"{{ .Config.Entrypoint | json }}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image inspect' failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim(); // 'null' or '[<string>, ...]' in JSON format\n return (JSON.parse(output) ?? []) as string[];\n}\n\nexport function localImageExists(tag: string): boolean {\n return getImageHash(tag) !== \"\";\n}\n\nexport function remoteImageExists(tag: string): boolean {\n const result = spawnSync(\"docker\", [\"manifest\", \"inspect\", tag], {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n\n if (result.error || result.status !== 0) {\n return false;\n }\n\n return true;\n}\n\nexport function build(\n context: string,\n dockerfile: string,\n tag: string,\n softwarePackage: string,\n softwareVersion: string | undefined,\n) {\n const result = spawnSync(\n \"docker\",\n [\n \"build\",\n // Pin platform so Platforma's linux/amd64 K8s nodes can run the image\n // regardless of host arch (cross-compile via qemu on non-x64 hosts).\n \"--platform\",\n defaults.DOCKER_BUILD_PLATFORM,\n // Disable buildkit's SLSA provenance + SBOM attestations. They embed\n // build-time timestamps into the manifest list, which produces a fresh\n // image digest on every build of identical source. That breaks the\n // content-addressable tag scheme (every dev rebuild re-pushes a new\n // tag) and defeats publishDockerImage's `remoteImageExists` smart-skip.\n \"--provenance=false\",\n \"--sbom=false\",\n \"-t\",\n tag,\n context,\n \"-f\",\n dockerfile,\n \"--label\",\n \"com.milaboratories.package-builder.software=true\",\n \"--label\",\n \"com.milaboratories.package-builder.software.package=\" + softwarePackage,\n \"--label\",\n \"com.milaboratories.package-builder.software.version=\" + softwareVersion,\n ],\n {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker build' failed with status ${result.status}`);\n }\n}\n\nexport function push(tag: string) {\n const result = spawnSync(\"docker\", [\"push\", tag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n const registry = tag.split(\"/\")[0];\n throw util.CLIError(\n `'docker push ${tag}' failed with status ${result.status}.\\n` +\n `If the error above mentions authentication or denied access, log in first:\\n` +\n ` aws sso login --profile research-poweruser <YOUR_PROFILE:research-poweruser?> \\n` +\n `Then login in docker:` +\n ` aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${registry}\\n` +\n `(for a private ECR use 'aws ecr' and your region instead of 'ecr-public'/us-east-1).`,\n );\n }\n}\n\nexport function addTag(imageIdOrTag: string, newTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"tag\", imageIdOrTag, newTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker tag' failed with status ${result.status}`);\n }\n}\n\nexport function removeTag(imageTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"rm\", imageTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image rm' failed with status ${result.status}`);\n }\n}\n\n/**\n * Generate unique content-addressable image tag\n * @param artifactName: artifact name generated from package name and artifact ID (or explicitly set for artifact in .name field)\n * @param imageID: unique image content hash (docker image ID in docker ls)\n * @param registry: custom registry and repository to use for this image\n * @returns full image tag in format: <registry>/repository:<artifactName>.<imageID>\n */\nexport function generateRemoteTagName(\n artifactName: string,\n imageID: string,\n registry?: string,\n): string {\n return dockerTag(artifactName, imageID, registry);\n}\n\n/**\n * Generate unique content-addressable image tag out of directories and Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns full image tag in format: <registry>/repository:<artifactName>.<contentHash>\n */\nexport function generateLocalTagName(packageRoot: string, artifact: artifacts.dockerType): string {\n const dockerfile = dockerfileAbsPath(packageRoot, artifact);\n const context = contextAbsPath(packageRoot, artifact);\n const hash = contentHash(context, dockerfile);\n\n return dockerTag(\"local-image\", hash);\n}\n\n/**\n * Absolute path to autogenerated Dockerfile for given artifact.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifactID: artifact ID\n * @returns absolute path to autogenerated Dockerfile\n */\nexport function dockerfileAutogenPath(packageRoot: string, artifactID: string): string {\n return path.resolve(packageRoot, \"dist\", \"docker\", `Dockerfile-${artifactID}`);\n}\n\n/**\n * Resolve path to Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to Dockerfile\n */\nfunction dockerfileAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n return path.resolve(packageRoot, artifact.dockerfile ?? \"Dockerfile\");\n}\n\n/**\n * Resolve path to docker build context directory.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to docker build context directory\n */\nfunction contextAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n if (artifact.context === \"./\" || artifact.context === \".\") {\n throw util.CLIError(\n `Invalid Docker context: \"${artifact.context}\". Context cannot be \"./\" or \".\" - use absolute path or relative path without \"./\" prefix`,\n );\n }\n return path.resolve(packageRoot, artifact.context ?? \".\");\n}\n\n/**\n * Calculate cummulative hash of docker build context directory context and Dockerfile.\n * To speedup hash calculation, we do not read contents of each item in context dir but\n * use metadata (size, mtime, ...).\n *\n * @param contextFullPath: abs path to docker build context\n * @param dockerfileFullPath: abs path to Dockerfile\n * @returns hash of what the keep\n */\nfunction contentHash(contextFullPath: string, dockerfileFullPath: string): string {\n if (!fs.existsSync(dockerfileFullPath)) {\n throw util.CLIError(`Dockerfile '${dockerfileFullPath}' not found`);\n }\n\n if (!fs.existsSync(contextFullPath)) {\n throw util.CLIError(`Context '${contextFullPath}' not found`);\n }\n\n const contextHash = util.hashDirMetaSync(contextFullPath);\n const dockerfileContent = fs.readFileSync(dockerfileFullPath, \"utf8\");\n contextHash.update(dockerfileContent);\n\n return contextHash.digest(\"hex\").slice(0, 12);\n}\n\nfunction dockerTag(packageName: string, contentHash: string, registry?: string): string {\n const dockerRegistry = registry ?? defaults.DOCKER_REGISTRY;\n return `${dockerRegistry}:${packageName.replaceAll(\"/\", \".\")}.${contentHash}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"docker.cjs","names":["os","path","fs"],"sources":["../../src/core/docker.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport * as defaults from \"../defaults\";\nimport type * as artifacts from \"./schemas/artifacts\";\nimport * as util from \"./util\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * To allow entrypoint keep both docker and binary package at the same time, we create virtual entrypoint with ':docker' suffix,\n * as entrypoints could not keep two different artifacts at the same time.\n */\nexport function entrypointName(name: string): string {\n return name + \":docker\";\n}\n\nexport function isVirtualDockerEntrypointName(name: string): boolean {\n return name.endsWith(\":docker\");\n}\n\nexport function entrypointNameToOrigin(name: string): string {\n if (!isVirtualDockerEntrypointName(name)) {\n return name;\n }\n return name.substring(0, name.length - \":docker\".length);\n}\n\nexport function getImageHash(tag: string): string {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"ls\", \"--filter=reference=\" + tag, \"--format={{.ID}}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`local docker image check failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim();\n if (output.split(\"\\n\").length > 1) {\n throw util.CLIError(\n `package-builder internal logic error: more than one image found by exact tag match: ${output}`,\n );\n }\n\n return output;\n}\n\nexport function getImageEntrypoint(tag: string): string[] {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"inspect\", tag, \"--format\", \"{{ .Config.Entrypoint | json }}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image inspect' failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim(); // 'null' or '[<string>, ...]' in JSON format\n return (JSON.parse(output) ?? []) as string[];\n}\n\nexport function localImageExists(tag: string): boolean {\n return getImageHash(tag) !== \"\";\n}\n\nexport function remoteImageExists(tag: string): boolean {\n const result = spawnSync(\"docker\", [\"manifest\", \"inspect\", tag], {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n\n if (result.error || result.status !== 0) {\n return false;\n }\n\n return true;\n}\n\nexport function build(\n context: string,\n dockerfile: string,\n tag: string,\n softwarePackage: string,\n softwareVersion: string | undefined,\n) {\n const result = spawnSync(\n \"docker\",\n [\n \"build\",\n // Pin platform so Platforma's linux/amd64 K8s nodes can run the image\n // regardless of host arch (cross-compile via qemu on non-x64 hosts).\n \"--platform\",\n defaults.DOCKER_BUILD_PLATFORM,\n // Disable buildkit's SLSA provenance + SBOM attestations. They embed\n // build-time timestamps into the manifest list, which produces a fresh\n // image digest on every build of identical source. That breaks the\n // content-addressable tag scheme (every dev rebuild re-pushes a new\n // tag) and defeats publishDockerImage's `remoteImageExists` smart-skip.\n \"--provenance=false\",\n \"--sbom=false\",\n \"-t\",\n tag,\n context,\n \"-f\",\n dockerfile,\n \"--label\",\n \"com.milaboratories.package-builder.software=true\",\n \"--label\",\n \"com.milaboratories.package-builder.software.package=\" + softwarePackage,\n \"--label\",\n \"com.milaboratories.package-builder.software.version=\" + softwareVersion,\n ],\n {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker build' failed with status ${result.status}`);\n }\n}\n\nexport function push(tag: string) {\n const result = spawnSync(\"docker\", [\"push\", tag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n const registry = tag.split(\"/\")[0];\n throw util.CLIError(\n `'docker push ${tag}' failed with status ${result.status}.\\n` +\n `If the error above mentions authentication or denied access, log in first:\\n` +\n ` aws sso login --profile research-poweruser <YOUR_PROFILE:research-poweruser?> \\n` +\n `Then login in docker:` +\n ` aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${registry}\\n` +\n `(for a private ECR use 'aws ecr' and your region instead of 'ecr-public'/us-east-1).`,\n );\n }\n}\n\nexport function addTag(imageIdOrTag: string, newTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"tag\", imageIdOrTag, newTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker tag' failed with status ${result.status}`);\n }\n}\n\nexport function removeTag(imageTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"rm\", imageTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image rm' failed with status ${result.status}`);\n }\n}\n\n/**\n * Generate unique content-addressable image tag\n * @param artifactName: artifact name generated from package name and artifact ID (or explicitly set for artifact in .name field)\n * @param imageID: unique image content hash (docker image ID in docker ls)\n * @param registry: custom registry and repository to use for this image\n * @returns full image tag in format: <registry>/repository:<artifactName>.<imageID>\n */\nexport function generateRemoteTagName(\n artifactName: string,\n imageID: string,\n registry?: string,\n): string {\n return dockerTag(artifactName, imageID, registry);\n}\n\n/**\n * Generate unique content-addressable image tag out of directories and Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns full image tag in format: <registry>/repository:<artifactName>.<contentHash>\n */\nexport function generateLocalTagName(packageRoot: string, artifact: artifacts.dockerType): string {\n const dockerfile = dockerfileAbsPath(packageRoot, artifact);\n const context = contextAbsPath(packageRoot, artifact);\n const hash = contentHash(context, dockerfile);\n\n return dockerTag(\"local-image\", hash);\n}\n\n/**\n * Absolute path to autogenerated Dockerfile for given artifact.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifactID: artifact ID\n * @returns absolute path to autogenerated Dockerfile\n */\nexport function dockerfileAutogenPath(packageRoot: string, artifactID: string): string {\n return path.resolve(packageRoot, \"dist\", \"docker\", `Dockerfile-${artifactID}`);\n}\n\n/**\n * Resolve path to Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to Dockerfile\n */\nfunction dockerfileAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n return path.resolve(packageRoot, artifact.dockerfile ?? \"Dockerfile\");\n}\n\n/**\n * Resolve path to docker build context directory.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to docker build context directory\n */\nfunction contextAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n if (artifact.context === \"./\" || artifact.context === \".\") {\n throw util.CLIError(\n `Invalid Docker context: \"${artifact.context}\". Context cannot be \"./\" or \".\" - use absolute path or relative path without \"./\" prefix`,\n );\n }\n return path.resolve(packageRoot, artifact.context ?? \".\");\n}\n\n/**\n * Calculate cummulative hash of docker build context directory context and Dockerfile.\n * To speedup hash calculation, we do not read contents of each item in context dir but\n * use metadata (size, mtime, ...).\n *\n * @param contextFullPath: abs path to docker build context\n * @param dockerfileFullPath: abs path to Dockerfile\n * @returns hash of what the keep\n */\nfunction contentHash(contextFullPath: string, dockerfileFullPath: string): string {\n if (!fs.existsSync(dockerfileFullPath)) {\n throw util.CLIError(`Dockerfile '${dockerfileFullPath}' not found`);\n }\n\n if (!fs.existsSync(contextFullPath)) {\n throw util.CLIError(`Context '${contextFullPath}' not found`);\n }\n\n const contextHash = util.hashDirMetaSync(contextFullPath);\n const dockerfileContent = fs.readFileSync(dockerfileFullPath, \"utf8\");\n contextHash.update(dockerfileContent);\n\n return contextHash.digest(\"hex\").slice(0, 12);\n}\n\nfunction dockerTag(packageName: string, contentHash: string, registry?: string): string {\n const dockerRegistry = registry ?? defaults.DOCKER_REGISTRY;\n return `${dockerRegistry}:${packageName.replaceAll(\"/\", \".\")}.${contentHash}`;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","names":["util.CLIError","defaults.DOCKER_BUILD_PLATFORM","path","fs","util.hashDirMetaSync"],"sources":["../../src/core/docker.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport * as defaults from \"../defaults\";\nimport type * as artifacts from \"./schemas/artifacts\";\nimport * as util from \"./util\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * To allow entrypoint keep both docker and binary package at the same time, we create virtual entrypoint with ':docker' suffix,\n * as entrypoints could not keep two different artifacts at the same time.\n */\nexport function entrypointName(name: string): string {\n return name + \":docker\";\n}\n\nexport function isVirtualDockerEntrypointName(name: string): boolean {\n return name.endsWith(\":docker\");\n}\n\nexport function entrypointNameToOrigin(name: string): string {\n if (!isVirtualDockerEntrypointName(name)) {\n return name;\n }\n return name.substring(0, name.length - \":docker\".length);\n}\n\nexport function getImageHash(tag: string): string {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"ls\", \"--filter=reference=\" + tag, \"--format={{.ID}}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`local docker image check failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim();\n if (output.split(\"\\n\").length > 1) {\n throw util.CLIError(\n `package-builder internal logic error: more than one image found by exact tag match: ${output}`,\n );\n }\n\n return output;\n}\n\nexport function getImageEntrypoint(tag: string): string[] {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"inspect\", tag, \"--format\", \"{{ .Config.Entrypoint | json }}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image inspect' failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim(); // 'null' or '[<string>, ...]' in JSON format\n return (JSON.parse(output) ?? []) as string[];\n}\n\nexport function localImageExists(tag: string): boolean {\n return getImageHash(tag) !== \"\";\n}\n\nexport function remoteImageExists(tag: string): boolean {\n const result = spawnSync(\"docker\", [\"manifest\", \"inspect\", tag], {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n\n if (result.error || result.status !== 0) {\n return false;\n }\n\n return true;\n}\n\nexport function build(\n context: string,\n dockerfile: string,\n tag: string,\n softwarePackage: string,\n softwareVersion: string | undefined,\n) {\n const result = spawnSync(\n \"docker\",\n [\n \"build\",\n // Pin platform so Platforma's linux/amd64 K8s nodes can run the image\n // regardless of host arch (cross-compile via qemu on non-x64 hosts).\n \"--platform\",\n defaults.DOCKER_BUILD_PLATFORM,\n // Disable buildkit's SLSA provenance + SBOM attestations. They embed\n // build-time timestamps into the manifest list, which produces a fresh\n // image digest on every build of identical source. That breaks the\n // content-addressable tag scheme (every dev rebuild re-pushes a new\n // tag) and defeats publishDockerImage's `remoteImageExists` smart-skip.\n \"--provenance=false\",\n \"--sbom=false\",\n \"-t\",\n tag,\n context,\n \"-f\",\n dockerfile,\n \"--label\",\n \"com.milaboratories.package-builder.software=true\",\n \"--label\",\n \"com.milaboratories.package-builder.software.package=\" + softwarePackage,\n \"--label\",\n \"com.milaboratories.package-builder.software.version=\" + softwareVersion,\n ],\n {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker build' failed with status ${result.status}`);\n }\n}\n\nexport function push(tag: string) {\n const result = spawnSync(\"docker\", [\"push\", tag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n const registry = tag.split(\"/\")[0];\n throw util.CLIError(\n `'docker push ${tag}' failed with status ${result.status}.\\n` +\n `If the error above mentions authentication or denied access, log in first:\\n` +\n ` aws sso login --profile research-poweruser <YOUR_PROFILE:research-poweruser?> \\n` +\n `Then login in docker:` +\n ` aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${registry}\\n` +\n `(for a private ECR use 'aws ecr' and your region instead of 'ecr-public'/us-east-1).`,\n );\n }\n}\n\nexport function addTag(imageIdOrTag: string, newTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"tag\", imageIdOrTag, newTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker tag' failed with status ${result.status}`);\n }\n}\n\nexport function removeTag(imageTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"rm\", imageTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image rm' failed with status ${result.status}`);\n }\n}\n\n/**\n * Generate unique content-addressable image tag\n * @param artifactName: artifact name generated from package name and artifact ID (or explicitly set for artifact in .name field)\n * @param imageID: unique image content hash (docker image ID in docker ls)\n * @param registry: custom registry and repository to use for this image\n * @returns full image tag in format: <registry>/repository:<artifactName>.<imageID>\n */\nexport function generateRemoteTagName(\n artifactName: string,\n imageID: string,\n registry?: string,\n): string {\n return dockerTag(artifactName, imageID, registry);\n}\n\n/**\n * Generate unique content-addressable image tag out of directories and Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns full image tag in format: <registry>/repository:<artifactName>.<contentHash>\n */\nexport function generateLocalTagName(packageRoot: string, artifact: artifacts.dockerType): string {\n const dockerfile = dockerfileAbsPath(packageRoot, artifact);\n const context = contextAbsPath(packageRoot, artifact);\n const hash = contentHash(context, dockerfile);\n\n return dockerTag(\"local-image\", hash);\n}\n\n/**\n * Absolute path to autogenerated Dockerfile for given artifact.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifactID: artifact ID\n * @returns absolute path to autogenerated Dockerfile\n */\nexport function dockerfileAutogenPath(packageRoot: string, artifactID: string): string {\n return path.resolve(packageRoot, \"dist\", \"docker\", `Dockerfile-${artifactID}`);\n}\n\n/**\n * Resolve path to Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to Dockerfile\n */\nfunction dockerfileAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n return path.resolve(packageRoot, artifact.dockerfile ?? \"Dockerfile\");\n}\n\n/**\n * Resolve path to docker build context directory.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to docker build context directory\n */\nfunction contextAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n if (artifact.context === \"./\" || artifact.context === \".\") {\n throw util.CLIError(\n `Invalid Docker context: \"${artifact.context}\". Context cannot be \"./\" or \".\" - use absolute path or relative path without \"./\" prefix`,\n );\n }\n return path.resolve(packageRoot, artifact.context ?? \".\");\n}\n\n/**\n * Calculate cummulative hash of docker build context directory context and Dockerfile.\n * To speedup hash calculation, we do not read contents of each item in context dir but\n * use metadata (size, mtime, ...).\n *\n * @param contextFullPath: abs path to docker build context\n * @param dockerfileFullPath: abs path to Dockerfile\n * @returns hash of what the keep\n */\nfunction contentHash(contextFullPath: string, dockerfileFullPath: string): string {\n if (!fs.existsSync(dockerfileFullPath)) {\n throw util.CLIError(`Dockerfile '${dockerfileFullPath}' not found`);\n }\n\n if (!fs.existsSync(contextFullPath)) {\n throw util.CLIError(`Context '${contextFullPath}' not found`);\n }\n\n const contextHash = util.hashDirMetaSync(contextFullPath);\n const dockerfileContent = fs.readFileSync(dockerfileFullPath, \"utf8\");\n contextHash.update(dockerfileContent);\n\n return contextHash.digest(\"hex\").slice(0, 12);\n}\n\nfunction dockerTag(packageName: string, contentHash: string, registry?: string): string {\n const dockerRegistry = registry ?? defaults.DOCKER_REGISTRY;\n return `${dockerRegistry}:${packageName.replaceAll(\"/\", \".\")}.${contentHash}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"docker.js","names":["util.CLIError","defaults.DOCKER_BUILD_PLATFORM","path","fs","util.hashDirMetaSync"],"sources":["../../src/core/docker.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport * as defaults from \"../defaults\";\nimport type * as artifacts from \"./schemas/artifacts\";\nimport * as util from \"./util\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * To allow entrypoint keep both docker and binary package at the same time, we create virtual entrypoint with ':docker' suffix,\n * as entrypoints could not keep two different artifacts at the same time.\n */\nexport function entrypointName(name: string): string {\n return name + \":docker\";\n}\n\nexport function isVirtualDockerEntrypointName(name: string): boolean {\n return name.endsWith(\":docker\");\n}\n\nexport function entrypointNameToOrigin(name: string): string {\n if (!isVirtualDockerEntrypointName(name)) {\n return name;\n }\n return name.substring(0, name.length - \":docker\".length);\n}\n\nexport function getImageHash(tag: string): string {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"ls\", \"--filter=reference=\" + tag, \"--format={{.ID}}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`local docker image check failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim();\n if (output.split(\"\\n\").length > 1) {\n throw util.CLIError(\n `package-builder internal logic error: more than one image found by exact tag match: ${output}`,\n );\n }\n\n return output;\n}\n\nexport function getImageEntrypoint(tag: string): string[] {\n const result = spawnSync(\n \"docker\",\n [\"image\", \"inspect\", tag, \"--format\", \"{{ .Config.Entrypoint | json }}\"],\n {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image inspect' failed with status ${result.status}`);\n }\n\n const output = result.stdout.toString().trim(); // 'null' or '[<string>, ...]' in JSON format\n return (JSON.parse(output) ?? []) as string[];\n}\n\nexport function localImageExists(tag: string): boolean {\n return getImageHash(tag) !== \"\";\n}\n\nexport function remoteImageExists(tag: string): boolean {\n const result = spawnSync(\"docker\", [\"manifest\", \"inspect\", tag], {\n stdio: \"pipe\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n\n if (result.error || result.status !== 0) {\n return false;\n }\n\n return true;\n}\n\nexport function build(\n context: string,\n dockerfile: string,\n tag: string,\n softwarePackage: string,\n softwareVersion: string | undefined,\n) {\n const result = spawnSync(\n \"docker\",\n [\n \"build\",\n // Pin platform so Platforma's linux/amd64 K8s nodes can run the image\n // regardless of host arch (cross-compile via qemu on non-x64 hosts).\n \"--platform\",\n defaults.DOCKER_BUILD_PLATFORM,\n // Disable buildkit's SLSA provenance + SBOM attestations. They embed\n // build-time timestamps into the manifest list, which produces a fresh\n // image digest on every build of identical source. That breaks the\n // content-addressable tag scheme (every dev rebuild re-pushes a new\n // tag) and defeats publishDockerImage's `remoteImageExists` smart-skip.\n \"--provenance=false\",\n \"--sbom=false\",\n \"-t\",\n tag,\n context,\n \"-f\",\n dockerfile,\n \"--label\",\n \"com.milaboratories.package-builder.software=true\",\n \"--label\",\n \"com.milaboratories.package-builder.software.package=\" + softwarePackage,\n \"--label\",\n \"com.milaboratories.package-builder.software.version=\" + softwareVersion,\n ],\n {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n },\n );\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker build' failed with status ${result.status}`);\n }\n}\n\nexport function push(tag: string) {\n const result = spawnSync(\"docker\", [\"push\", tag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n const registry = tag.split(\"/\")[0];\n throw util.CLIError(\n `'docker push ${tag}' failed with status ${result.status}.\\n` +\n `If the error above mentions authentication or denied access, log in first:\\n` +\n ` aws sso login --profile research-poweruser <YOUR_PROFILE:research-poweruser?> \\n` +\n `Then login in docker:` +\n ` aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${registry}\\n` +\n `(for a private ECR use 'aws ecr' and your region instead of 'ecr-public'/us-east-1).`,\n );\n }\n}\n\nexport function addTag(imageIdOrTag: string, newTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"tag\", imageIdOrTag, newTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker tag' failed with status ${result.status}`);\n }\n}\n\nexport function removeTag(imageTag: string) {\n const result = spawnSync(\"docker\", [\"image\", \"rm\", imageTag], {\n stdio: \"inherit\",\n env: {\n ...process.env, // PATH variable from parent process affects execution\n HOME: process.env.HOME || os.homedir(), // Ensure HOME is set\n },\n });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n throw util.CLIError(`'docker image rm' failed with status ${result.status}`);\n }\n}\n\n/**\n * Generate unique content-addressable image tag\n * @param artifactName: artifact name generated from package name and artifact ID (or explicitly set for artifact in .name field)\n * @param imageID: unique image content hash (docker image ID in docker ls)\n * @param registry: custom registry and repository to use for this image\n * @returns full image tag in format: <registry>/repository:<artifactName>.<imageID>\n */\nexport function generateRemoteTagName(\n artifactName: string,\n imageID: string,\n registry?: string,\n): string {\n return dockerTag(artifactName, imageID, registry);\n}\n\n/**\n * Generate unique content-addressable image tag out of directories and Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns full image tag in format: <registry>/repository:<artifactName>.<contentHash>\n */\nexport function generateLocalTagName(packageRoot: string, artifact: artifacts.dockerType): string {\n const dockerfile = dockerfileAbsPath(packageRoot, artifact);\n const context = contextAbsPath(packageRoot, artifact);\n const hash = contentHash(context, dockerfile);\n\n return dockerTag(\"local-image\", hash);\n}\n\n/**\n * Absolute path to autogenerated Dockerfile for given artifact.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifactID: artifact ID\n * @returns absolute path to autogenerated Dockerfile\n */\nexport function dockerfileAutogenPath(packageRoot: string, artifactID: string): string {\n return path.resolve(packageRoot, \"dist\", \"docker\", `Dockerfile-${artifactID}`);\n}\n\n/**\n * Resolve path to Dockerfile.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to Dockerfile\n */\nfunction dockerfileAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n return path.resolve(packageRoot, artifact.dockerfile ?? \"Dockerfile\");\n}\n\n/**\n * Resolve path to docker build context directory.\n * @param packageRoot: package root path from where to resolve artifact's paths (context, Dockerfile, ...)\n * @param artifact: docker artifact configuration\n * @returns absolute path to docker build context directory\n */\nfunction contextAbsPath(packageRoot: string, artifact: artifacts.dockerType): string {\n if (artifact.context === \"./\" || artifact.context === \".\") {\n throw util.CLIError(\n `Invalid Docker context: \"${artifact.context}\". Context cannot be \"./\" or \".\" - use absolute path or relative path without \"./\" prefix`,\n );\n }\n return path.resolve(packageRoot, artifact.context ?? \".\");\n}\n\n/**\n * Calculate cummulative hash of docker build context directory context and Dockerfile.\n * To speedup hash calculation, we do not read contents of each item in context dir but\n * use metadata (size, mtime, ...).\n *\n * @param contextFullPath: abs path to docker build context\n * @param dockerfileFullPath: abs path to Dockerfile\n * @returns hash of what the keep\n */\nfunction contentHash(contextFullPath: string, dockerfileFullPath: string): string {\n if (!fs.existsSync(dockerfileFullPath)) {\n throw util.CLIError(`Dockerfile '${dockerfileFullPath}' not found`);\n }\n\n if (!fs.existsSync(contextFullPath)) {\n throw util.CLIError(`Context '${contextFullPath}' not found`);\n }\n\n const contextHash = util.hashDirMetaSync(contextFullPath);\n const dockerfileContent = fs.readFileSync(dockerfileFullPath, \"utf8\");\n contextHash.update(dockerfileContent);\n\n return contextHash.digest(\"hex\").slice(0, 12);\n}\n\nfunction dockerTag(packageName: string, contentHash: string, registry?: string): string {\n const dockerRegistry = registry ?? defaults.DOCKER_REGISTRY;\n return `${dockerRegistry}:${packageName.replaceAll(\"/\", \".\")}.${contentHash}`;\n}\n"],"mappings":"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"}
@@ -3,6 +3,9 @@ var envs_exports = /* @__PURE__ */ require("../_virtual/_rolldown/runtime.cjs").
3
3
  CI: () => "CI",
4
4
  PL_CONDA_BUILD: () => PL_CONDA_BUILD,
5
5
  PL_CONDA_NO_BUILD: () => PL_CONDA_NO_BUILD,
6
+ PL_DEV_BINARY_UPLOAD_URL: () => PL_DEV_BINARY_UPLOAD_URL,
7
+ PL_DEV_DOCKER_PULL_URL: () => PL_DEV_DOCKER_PULL_URL,
8
+ PL_DEV_DOCKER_PUSH_URL: () => PL_DEV_DOCKER_PUSH_URL,
6
9
  PL_DOCKER_AUTOPUSH: () => PL_DOCKER_AUTOPUSH,
7
10
  PL_DOCKER_BUILD: () => PL_DOCKER_BUILD,
8
11
  PL_DOCKER_NO_AUTOPUSH: () => PL_DOCKER_NO_AUTOPUSH,
@@ -17,6 +20,9 @@ var envs_exports = /* @__PURE__ */ require("../_virtual/_rolldown/runtime.cjs").
17
20
  PL_PKG_OS: () => PL_PKG_OS,
18
21
  PL_PKG_STORAGE_URL: () => PL_PKG_STORAGE_URL,
19
22
  PL_PKG_VERSION: () => PL_PKG_VERSION,
23
+ PL_RELEASE_BINARY_UPLOAD_URL: () => PL_RELEASE_BINARY_UPLOAD_URL,
24
+ PL_RELEASE_DOCKER_PULL_URL: () => PL_RELEASE_DOCKER_PULL_URL,
25
+ PL_RELEASE_DOCKER_PUSH_URL: () => PL_RELEASE_DOCKER_PUSH_URL,
20
26
  RUNNER_DEBUG: () => RUNNER_DEBUG,
21
27
  isCI: () => isCI,
22
28
  isRunnerDebug: () => isRunnerDebug
@@ -33,6 +39,12 @@ const PL_CONDA_BUILD = "PL_CONDA_BUILD";
33
39
  const PL_CONDA_NO_BUILD = "PL_CONDA_NO_BUILD";
34
40
  const PL_DOCKER_REGISTRY = "PL_DOCKER_REGISTRY";
35
41
  const PL_DOCKER_REGISTRY_PUSH_TO = "PL_DOCKER_REGISTRY_PUSH_TO";
42
+ const PL_DEV_BINARY_UPLOAD_URL = "PL_DEV_BINARY_UPLOAD_URL";
43
+ const PL_RELEASE_BINARY_UPLOAD_URL = "PL_RELEASE_BINARY_UPLOAD_URL";
44
+ const PL_DEV_DOCKER_PUSH_URL = "PL_DEV_DOCKER_PUSH_URL";
45
+ const PL_DEV_DOCKER_PULL_URL = "PL_DEV_DOCKER_PULL_URL";
46
+ const PL_RELEASE_DOCKER_PUSH_URL = "PL_RELEASE_DOCKER_PUSH_URL";
47
+ const PL_RELEASE_DOCKER_PULL_URL = "PL_RELEASE_DOCKER_PULL_URL";
36
48
  const PL_DOCKER_BUILD = "PL_DOCKER_BUILD";
37
49
  const PL_DOCKER_NO_BUILD = "PL_DOCKER_NO_BUILD";
38
50
  const PL_DOCKER_AUTOPUSH = "PL_DOCKER_AUTOPUSH";
@@ -45,7 +57,29 @@ function isRunnerDebug() {
45
57
  return process.env["RUNNER_DEBUG"] === "true" || process.env["RUNNER_DEBUG"] === "1";
46
58
  }
47
59
  //#endregion
60
+ exports.PL_CONDA_BUILD = PL_CONDA_BUILD;
61
+ exports.PL_CONDA_NO_BUILD = PL_CONDA_NO_BUILD;
62
+ exports.PL_DEV_BINARY_UPLOAD_URL = PL_DEV_BINARY_UPLOAD_URL;
63
+ exports.PL_DEV_DOCKER_PULL_URL = PL_DEV_DOCKER_PULL_URL;
64
+ exports.PL_DEV_DOCKER_PUSH_URL = PL_DEV_DOCKER_PUSH_URL;
65
+ exports.PL_DOCKER_AUTOPUSH = PL_DOCKER_AUTOPUSH;
66
+ exports.PL_DOCKER_BUILD = PL_DOCKER_BUILD;
67
+ exports.PL_DOCKER_NO_AUTOPUSH = PL_DOCKER_NO_AUTOPUSH;
68
+ exports.PL_DOCKER_NO_BUILD = PL_DOCKER_NO_BUILD;
69
+ exports.PL_DOCKER_REGISTRY = PL_DOCKER_REGISTRY;
70
+ exports.PL_DOCKER_REGISTRY_PUSH_TO = PL_DOCKER_REGISTRY_PUSH_TO;
71
+ exports.PL_PKG_ARCH = PL_PKG_ARCH;
72
+ exports.PL_PKG_ARCHIVE = PL_PKG_ARCHIVE;
73
+ exports.PL_PKG_CONTENT_ROOT = PL_PKG_CONTENT_ROOT;
74
+ exports.PL_PKG_DEV = PL_PKG_DEV;
75
+ exports.PL_PKG_FULL_HASH = PL_PKG_FULL_HASH;
76
+ exports.PL_PKG_OS = PL_PKG_OS;
77
+ exports.PL_PKG_STORAGE_URL = PL_PKG_STORAGE_URL;
48
78
  exports.PL_PKG_VERSION = PL_PKG_VERSION;
79
+ exports.PL_RELEASE_BINARY_UPLOAD_URL = PL_RELEASE_BINARY_UPLOAD_URL;
80
+ exports.PL_RELEASE_DOCKER_PULL_URL = PL_RELEASE_DOCKER_PULL_URL;
81
+ exports.PL_RELEASE_DOCKER_PUSH_URL = PL_RELEASE_DOCKER_PUSH_URL;
82
+ exports.RUNNER_DEBUG = RUNNER_DEBUG;
49
83
  Object.defineProperty(exports, "envs_exports", {
50
84
  enumerable: true,
51
85
  get: function() {
@@ -1 +1 @@
1
- {"version":3,"file":"envs.cjs","names":[],"sources":["../../src/core/envs.ts"],"sourcesContent":["export const PL_PKG_VERSION = \"PL_PKG_VERSION\";\nexport const PL_PKG_OS = \"PL_PKG_OS\";\nexport const PL_PKG_ARCH = \"PL_PKG_ARCH\";\n\nexport const PL_PKG_CONTENT_ROOT = \"PL_PKG_CONTENT_ROOT\";\nexport const PL_PKG_ARCHIVE = \"PL_PKG_ARCHIVE\";\nexport const PL_PKG_STORAGE_URL = \"PL_PKG_STORAGE_URL\";\n\nexport const PL_PKG_DEV = \"PL_PKG_DEV\";\nexport const PL_PKG_FULL_HASH = \"PL_PKG_FULL_HASH\";\n\nexport const PL_CONDA_BUILD = \"PL_CONDA_BUILD\";\nexport const PL_CONDA_NO_BUILD = \"PL_CONDA_NO_BUILD\";\n\nexport const PL_DOCKER_REGISTRY = \"PL_DOCKER_REGISTRY\";\nexport const PL_DOCKER_REGISTRY_PUSH_TO = \"PL_DOCKER_REGISTRY_PUSH_TO\";\n\nexport const PL_DOCKER_BUILD = \"PL_DOCKER_BUILD\";\nexport const PL_DOCKER_NO_BUILD = \"PL_DOCKER_NO_BUILD\";\nexport const PL_DOCKER_AUTOPUSH = \"PL_DOCKER_AUTOPUSH\";\nexport const PL_DOCKER_NO_AUTOPUSH = \"PL_DOCKER_NO_AUTOPUSH\";\n\nexport const CI = \"CI\";\nexport const RUNNER_DEBUG = \"RUNNER_DEBUG\";\n\nexport function isCI(): boolean {\n return process.env[CI] === \"true\";\n}\nexport function isRunnerDebug(): boolean {\n return process.env[RUNNER_DEBUG] === \"true\" || process.env[RUNNER_DEBUG] === \"1\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAa,iBAAiB;AAC9B,MAAa,YAAY;AACzB,MAAa,cAAc;AAE3B,MAAa,sBAAsB;AACnC,MAAa,iBAAiB;AAC9B,MAAa,qBAAqB;AAElC,MAAa,aAAa;AAC1B,MAAa,mBAAmB;AAEhC,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AAEjC,MAAa,qBAAqB;AAClC,MAAa,6BAA6B;AAE1C,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AAGrC,MAAa,eAAe;AAE5B,SAAgB,OAAgB;AAC9B,QAAO,QAAQ,IAAA,UAAY;;AAE7B,SAAgB,gBAAyB;AACvC,QAAO,QAAQ,IAAA,oBAAsB,UAAU,QAAQ,IAAA,oBAAsB"}
1
+ {"version":3,"file":"envs.cjs","names":[],"sources":["../../src/core/envs.ts"],"sourcesContent":["export const PL_PKG_VERSION = \"PL_PKG_VERSION\";\nexport const PL_PKG_OS = \"PL_PKG_OS\";\nexport const PL_PKG_ARCH = \"PL_PKG_ARCH\";\n\nexport const PL_PKG_CONTENT_ROOT = \"PL_PKG_CONTENT_ROOT\";\nexport const PL_PKG_ARCHIVE = \"PL_PKG_ARCHIVE\";\nexport const PL_PKG_STORAGE_URL = \"PL_PKG_STORAGE_URL\";\n\nexport const PL_PKG_DEV = \"PL_PKG_DEV\";\nexport const PL_PKG_FULL_HASH = \"PL_PKG_FULL_HASH\";\n\nexport const PL_CONDA_BUILD = \"PL_CONDA_BUILD\";\nexport const PL_CONDA_NO_BUILD = \"PL_CONDA_NO_BUILD\";\n\nexport const PL_DOCKER_REGISTRY = \"PL_DOCKER_REGISTRY\";\nexport const PL_DOCKER_REGISTRY_PUSH_TO = \"PL_DOCKER_REGISTRY_PUSH_TO\";\n\nexport const PL_DEV_BINARY_UPLOAD_URL = \"PL_DEV_BINARY_UPLOAD_URL\";\nexport const PL_RELEASE_BINARY_UPLOAD_URL = \"PL_RELEASE_BINARY_UPLOAD_URL\";\n\nexport const PL_DEV_DOCKER_PUSH_URL = \"PL_DEV_DOCKER_PUSH_URL\";\nexport const PL_DEV_DOCKER_PULL_URL = \"PL_DEV_DOCKER_PULL_URL\";\nexport const PL_RELEASE_DOCKER_PUSH_URL = \"PL_RELEASE_DOCKER_PUSH_URL\";\nexport const PL_RELEASE_DOCKER_PULL_URL = \"PL_RELEASE_DOCKER_PULL_URL\";\n\nexport const PL_DOCKER_BUILD = \"PL_DOCKER_BUILD\";\nexport const PL_DOCKER_NO_BUILD = \"PL_DOCKER_NO_BUILD\";\nexport const PL_DOCKER_AUTOPUSH = \"PL_DOCKER_AUTOPUSH\";\nexport const PL_DOCKER_NO_AUTOPUSH = \"PL_DOCKER_NO_AUTOPUSH\";\n\nexport const CI = \"CI\";\nexport const RUNNER_DEBUG = \"RUNNER_DEBUG\";\n\nexport function isCI(): boolean {\n return process.env[CI] === \"true\";\n}\nexport function isRunnerDebug(): boolean {\n return process.env[RUNNER_DEBUG] === \"true\" || process.env[RUNNER_DEBUG] === \"1\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAa,iBAAiB;AAC9B,MAAa,YAAY;AACzB,MAAa,cAAc;AAE3B,MAAa,sBAAsB;AACnC,MAAa,iBAAiB;AAC9B,MAAa,qBAAqB;AAElC,MAAa,aAAa;AAC1B,MAAa,mBAAmB;AAEhC,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AAEjC,MAAa,qBAAqB;AAClC,MAAa,6BAA6B;AAE1C,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAE5C,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAE1C,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AAGrC,MAAa,eAAe;AAE5B,SAAgB,OAAgB;CAC9B,OAAO,QAAQ,IAAA,UAAY;AAC7B;AACA,SAAgB,gBAAyB;CACvC,OAAO,QAAQ,IAAA,oBAAsB,UAAU,QAAQ,IAAA,oBAAsB;AAC/E"}
@@ -1,5 +1,5 @@
1
1
  declare namespace envs_d_exports {
2
- export { CI, PL_CONDA_BUILD, PL_CONDA_NO_BUILD, PL_DOCKER_AUTOPUSH, PL_DOCKER_BUILD, PL_DOCKER_NO_AUTOPUSH, PL_DOCKER_NO_BUILD, PL_DOCKER_REGISTRY, PL_DOCKER_REGISTRY_PUSH_TO, PL_PKG_ARCH, PL_PKG_ARCHIVE, PL_PKG_CONTENT_ROOT, PL_PKG_DEV, PL_PKG_FULL_HASH, PL_PKG_OS, PL_PKG_STORAGE_URL, PL_PKG_VERSION, RUNNER_DEBUG, isCI, isRunnerDebug };
2
+ export { CI, PL_CONDA_BUILD, PL_CONDA_NO_BUILD, PL_DEV_BINARY_UPLOAD_URL, PL_DEV_DOCKER_PULL_URL, PL_DEV_DOCKER_PUSH_URL, PL_DOCKER_AUTOPUSH, PL_DOCKER_BUILD, PL_DOCKER_NO_AUTOPUSH, PL_DOCKER_NO_BUILD, PL_DOCKER_REGISTRY, PL_DOCKER_REGISTRY_PUSH_TO, PL_PKG_ARCH, PL_PKG_ARCHIVE, PL_PKG_CONTENT_ROOT, PL_PKG_DEV, PL_PKG_FULL_HASH, PL_PKG_OS, PL_PKG_STORAGE_URL, PL_PKG_VERSION, PL_RELEASE_BINARY_UPLOAD_URL, PL_RELEASE_DOCKER_PULL_URL, PL_RELEASE_DOCKER_PUSH_URL, RUNNER_DEBUG, isCI, isRunnerDebug };
3
3
  }
4
4
  declare const PL_PKG_VERSION = "PL_PKG_VERSION";
5
5
  declare const PL_PKG_OS = "PL_PKG_OS";
@@ -13,6 +13,12 @@ declare const PL_CONDA_BUILD = "PL_CONDA_BUILD";
13
13
  declare const PL_CONDA_NO_BUILD = "PL_CONDA_NO_BUILD";
14
14
  declare const PL_DOCKER_REGISTRY = "PL_DOCKER_REGISTRY";
15
15
  declare const PL_DOCKER_REGISTRY_PUSH_TO = "PL_DOCKER_REGISTRY_PUSH_TO";
16
+ declare const PL_DEV_BINARY_UPLOAD_URL = "PL_DEV_BINARY_UPLOAD_URL";
17
+ declare const PL_RELEASE_BINARY_UPLOAD_URL = "PL_RELEASE_BINARY_UPLOAD_URL";
18
+ declare const PL_DEV_DOCKER_PUSH_URL = "PL_DEV_DOCKER_PUSH_URL";
19
+ declare const PL_DEV_DOCKER_PULL_URL = "PL_DEV_DOCKER_PULL_URL";
20
+ declare const PL_RELEASE_DOCKER_PUSH_URL = "PL_RELEASE_DOCKER_PUSH_URL";
21
+ declare const PL_RELEASE_DOCKER_PULL_URL = "PL_RELEASE_DOCKER_PULL_URL";
16
22
  declare const PL_DOCKER_BUILD = "PL_DOCKER_BUILD";
17
23
  declare const PL_DOCKER_NO_BUILD = "PL_DOCKER_NO_BUILD";
18
24
  declare const PL_DOCKER_AUTOPUSH = "PL_DOCKER_AUTOPUSH";
@@ -22,5 +28,5 @@ declare const RUNNER_DEBUG = "RUNNER_DEBUG";
22
28
  declare function isCI(): boolean;
23
29
  declare function isRunnerDebug(): boolean;
24
30
  //#endregion
25
- export { envs_d_exports };
31
+ export { CI, PL_CONDA_BUILD, PL_CONDA_NO_BUILD, PL_DEV_BINARY_UPLOAD_URL, PL_DEV_DOCKER_PULL_URL, PL_DEV_DOCKER_PUSH_URL, PL_DOCKER_AUTOPUSH, PL_DOCKER_BUILD, PL_DOCKER_NO_AUTOPUSH, PL_DOCKER_NO_BUILD, PL_DOCKER_REGISTRY, PL_DOCKER_REGISTRY_PUSH_TO, PL_PKG_ARCH, PL_PKG_ARCHIVE, PL_PKG_CONTENT_ROOT, PL_PKG_DEV, PL_PKG_FULL_HASH, PL_PKG_OS, PL_PKG_STORAGE_URL, PL_PKG_VERSION, PL_RELEASE_BINARY_UPLOAD_URL, PL_RELEASE_DOCKER_PULL_URL, PL_RELEASE_DOCKER_PUSH_URL, RUNNER_DEBUG, envs_d_exports, isCI, isRunnerDebug };
26
32
  //# sourceMappingURL=envs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"envs.d.ts","names":[],"sources":["../../src/core/envs.ts"],"mappings":";;;cAAa,cAAA;AAAA,cACA,SAAA;AAAA,cACA,WAAA;AAAA,cAEA,mBAAA;AAAA,cACA,cAAA;AAAA,cACA,kBAAA;AAAA,cAEA,UAAA;AAAA,cACA,gBAAA;AAAA,cAEA,cAAA;AAAA,cACA,iBAAA;AAAA,cAEA,kBAAA;AAAA,cACA,0BAAA;AAAA,cAEA,eAAA;AAAA,cACA,kBAAA;AAAA,cACA,kBAAA;AAAA,cACA,qBAAA;AAAA,cAEA,EAAA;AAAA,cACA,YAAA;AAAA,iBAEG,IAAA,CAAA;AAAA,iBAGA,aAAA,CAAA"}
1
+ {"version":3,"file":"envs.d.ts","names":[],"sources":["../../src/core/envs.ts"],"mappings":";;;cAAa,cAAA;AAAA,cACA,SAAA;AAAA,cACA,WAAA;AAAA,cAEA,mBAAA;AAAA,cACA,cAAA;AAAA,cACA,kBAAA;AAAA,cAEA,UAAA;AAAA,cACA,gBAAA;AAAA,cAEA,cAAA;AAAA,cACA,iBAAA;AAAA,cAEA,kBAAA;AAAA,cACA,0BAAA;AAAA,cAEA,wBAAA;AAAA,cACA,4BAAA;AAAA,cAEA,sBAAA;AAAA,cACA,sBAAA;AAAA,cACA,0BAAA;AAAA,cACA,0BAAA;AAAA,cAEA,eAAA;AAAA,cACA,kBAAA;AAAA,cACA,kBAAA;AAAA,cACA,qBAAA;AAAA,cAEA,EAAA;AAAA,cACA,YAAA;AAAA,iBAEG,IAAA;AAAA,iBAGA,aAAA"}
package/dist/core/envs.js CHANGED
@@ -4,6 +4,9 @@ var envs_exports = /* @__PURE__ */ __exportAll({
4
4
  CI: () => "CI",
5
5
  PL_CONDA_BUILD: () => PL_CONDA_BUILD,
6
6
  PL_CONDA_NO_BUILD: () => PL_CONDA_NO_BUILD,
7
+ PL_DEV_BINARY_UPLOAD_URL: () => PL_DEV_BINARY_UPLOAD_URL,
8
+ PL_DEV_DOCKER_PULL_URL: () => PL_DEV_DOCKER_PULL_URL,
9
+ PL_DEV_DOCKER_PUSH_URL: () => PL_DEV_DOCKER_PUSH_URL,
7
10
  PL_DOCKER_AUTOPUSH: () => PL_DOCKER_AUTOPUSH,
8
11
  PL_DOCKER_BUILD: () => PL_DOCKER_BUILD,
9
12
  PL_DOCKER_NO_AUTOPUSH: () => PL_DOCKER_NO_AUTOPUSH,
@@ -18,6 +21,9 @@ var envs_exports = /* @__PURE__ */ __exportAll({
18
21
  PL_PKG_OS: () => PL_PKG_OS,
19
22
  PL_PKG_STORAGE_URL: () => PL_PKG_STORAGE_URL,
20
23
  PL_PKG_VERSION: () => PL_PKG_VERSION,
24
+ PL_RELEASE_BINARY_UPLOAD_URL: () => PL_RELEASE_BINARY_UPLOAD_URL,
25
+ PL_RELEASE_DOCKER_PULL_URL: () => PL_RELEASE_DOCKER_PULL_URL,
26
+ PL_RELEASE_DOCKER_PUSH_URL: () => PL_RELEASE_DOCKER_PUSH_URL,
21
27
  RUNNER_DEBUG: () => RUNNER_DEBUG,
22
28
  isCI: () => isCI,
23
29
  isRunnerDebug: () => isRunnerDebug
@@ -34,6 +40,12 @@ const PL_CONDA_BUILD = "PL_CONDA_BUILD";
34
40
  const PL_CONDA_NO_BUILD = "PL_CONDA_NO_BUILD";
35
41
  const PL_DOCKER_REGISTRY = "PL_DOCKER_REGISTRY";
36
42
  const PL_DOCKER_REGISTRY_PUSH_TO = "PL_DOCKER_REGISTRY_PUSH_TO";
43
+ const PL_DEV_BINARY_UPLOAD_URL = "PL_DEV_BINARY_UPLOAD_URL";
44
+ const PL_RELEASE_BINARY_UPLOAD_URL = "PL_RELEASE_BINARY_UPLOAD_URL";
45
+ const PL_DEV_DOCKER_PUSH_URL = "PL_DEV_DOCKER_PUSH_URL";
46
+ const PL_DEV_DOCKER_PULL_URL = "PL_DEV_DOCKER_PULL_URL";
47
+ const PL_RELEASE_DOCKER_PUSH_URL = "PL_RELEASE_DOCKER_PUSH_URL";
48
+ const PL_RELEASE_DOCKER_PULL_URL = "PL_RELEASE_DOCKER_PULL_URL";
37
49
  const PL_DOCKER_BUILD = "PL_DOCKER_BUILD";
38
50
  const PL_DOCKER_NO_BUILD = "PL_DOCKER_NO_BUILD";
39
51
  const PL_DOCKER_AUTOPUSH = "PL_DOCKER_AUTOPUSH";
@@ -46,6 +58,6 @@ function isRunnerDebug() {
46
58
  return process.env["RUNNER_DEBUG"] === "true" || process.env["RUNNER_DEBUG"] === "1";
47
59
  }
48
60
  //#endregion
49
- export { PL_PKG_VERSION, envs_exports, isCI, isRunnerDebug };
61
+ export { PL_CONDA_BUILD, PL_CONDA_NO_BUILD, PL_DEV_BINARY_UPLOAD_URL, PL_DEV_DOCKER_PULL_URL, PL_DEV_DOCKER_PUSH_URL, PL_DOCKER_AUTOPUSH, PL_DOCKER_BUILD, PL_DOCKER_NO_AUTOPUSH, PL_DOCKER_NO_BUILD, PL_DOCKER_REGISTRY, PL_DOCKER_REGISTRY_PUSH_TO, PL_PKG_ARCH, PL_PKG_ARCHIVE, PL_PKG_CONTENT_ROOT, PL_PKG_DEV, PL_PKG_FULL_HASH, PL_PKG_OS, PL_PKG_STORAGE_URL, PL_PKG_VERSION, PL_RELEASE_BINARY_UPLOAD_URL, PL_RELEASE_DOCKER_PULL_URL, PL_RELEASE_DOCKER_PUSH_URL, RUNNER_DEBUG, envs_exports, isCI, isRunnerDebug };
50
62
 
51
63
  //# sourceMappingURL=envs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"envs.js","names":[],"sources":["../../src/core/envs.ts"],"sourcesContent":["export const PL_PKG_VERSION = \"PL_PKG_VERSION\";\nexport const PL_PKG_OS = \"PL_PKG_OS\";\nexport const PL_PKG_ARCH = \"PL_PKG_ARCH\";\n\nexport const PL_PKG_CONTENT_ROOT = \"PL_PKG_CONTENT_ROOT\";\nexport const PL_PKG_ARCHIVE = \"PL_PKG_ARCHIVE\";\nexport const PL_PKG_STORAGE_URL = \"PL_PKG_STORAGE_URL\";\n\nexport const PL_PKG_DEV = \"PL_PKG_DEV\";\nexport const PL_PKG_FULL_HASH = \"PL_PKG_FULL_HASH\";\n\nexport const PL_CONDA_BUILD = \"PL_CONDA_BUILD\";\nexport const PL_CONDA_NO_BUILD = \"PL_CONDA_NO_BUILD\";\n\nexport const PL_DOCKER_REGISTRY = \"PL_DOCKER_REGISTRY\";\nexport const PL_DOCKER_REGISTRY_PUSH_TO = \"PL_DOCKER_REGISTRY_PUSH_TO\";\n\nexport const PL_DOCKER_BUILD = \"PL_DOCKER_BUILD\";\nexport const PL_DOCKER_NO_BUILD = \"PL_DOCKER_NO_BUILD\";\nexport const PL_DOCKER_AUTOPUSH = \"PL_DOCKER_AUTOPUSH\";\nexport const PL_DOCKER_NO_AUTOPUSH = \"PL_DOCKER_NO_AUTOPUSH\";\n\nexport const CI = \"CI\";\nexport const RUNNER_DEBUG = \"RUNNER_DEBUG\";\n\nexport function isCI(): boolean {\n return process.env[CI] === \"true\";\n}\nexport function isRunnerDebug(): boolean {\n return process.env[RUNNER_DEBUG] === \"true\" || process.env[RUNNER_DEBUG] === \"1\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAa,iBAAiB;AAC9B,MAAa,YAAY;AACzB,MAAa,cAAc;AAE3B,MAAa,sBAAsB;AACnC,MAAa,iBAAiB;AAC9B,MAAa,qBAAqB;AAElC,MAAa,aAAa;AAC1B,MAAa,mBAAmB;AAEhC,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AAEjC,MAAa,qBAAqB;AAClC,MAAa,6BAA6B;AAE1C,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AAGrC,MAAa,eAAe;AAE5B,SAAgB,OAAgB;AAC9B,QAAO,QAAQ,IAAA,UAAY;;AAE7B,SAAgB,gBAAyB;AACvC,QAAO,QAAQ,IAAA,oBAAsB,UAAU,QAAQ,IAAA,oBAAsB"}
1
+ {"version":3,"file":"envs.js","names":[],"sources":["../../src/core/envs.ts"],"sourcesContent":["export const PL_PKG_VERSION = \"PL_PKG_VERSION\";\nexport const PL_PKG_OS = \"PL_PKG_OS\";\nexport const PL_PKG_ARCH = \"PL_PKG_ARCH\";\n\nexport const PL_PKG_CONTENT_ROOT = \"PL_PKG_CONTENT_ROOT\";\nexport const PL_PKG_ARCHIVE = \"PL_PKG_ARCHIVE\";\nexport const PL_PKG_STORAGE_URL = \"PL_PKG_STORAGE_URL\";\n\nexport const PL_PKG_DEV = \"PL_PKG_DEV\";\nexport const PL_PKG_FULL_HASH = \"PL_PKG_FULL_HASH\";\n\nexport const PL_CONDA_BUILD = \"PL_CONDA_BUILD\";\nexport const PL_CONDA_NO_BUILD = \"PL_CONDA_NO_BUILD\";\n\nexport const PL_DOCKER_REGISTRY = \"PL_DOCKER_REGISTRY\";\nexport const PL_DOCKER_REGISTRY_PUSH_TO = \"PL_DOCKER_REGISTRY_PUSH_TO\";\n\nexport const PL_DEV_BINARY_UPLOAD_URL = \"PL_DEV_BINARY_UPLOAD_URL\";\nexport const PL_RELEASE_BINARY_UPLOAD_URL = \"PL_RELEASE_BINARY_UPLOAD_URL\";\n\nexport const PL_DEV_DOCKER_PUSH_URL = \"PL_DEV_DOCKER_PUSH_URL\";\nexport const PL_DEV_DOCKER_PULL_URL = \"PL_DEV_DOCKER_PULL_URL\";\nexport const PL_RELEASE_DOCKER_PUSH_URL = \"PL_RELEASE_DOCKER_PUSH_URL\";\nexport const PL_RELEASE_DOCKER_PULL_URL = \"PL_RELEASE_DOCKER_PULL_URL\";\n\nexport const PL_DOCKER_BUILD = \"PL_DOCKER_BUILD\";\nexport const PL_DOCKER_NO_BUILD = \"PL_DOCKER_NO_BUILD\";\nexport const PL_DOCKER_AUTOPUSH = \"PL_DOCKER_AUTOPUSH\";\nexport const PL_DOCKER_NO_AUTOPUSH = \"PL_DOCKER_NO_AUTOPUSH\";\n\nexport const CI = \"CI\";\nexport const RUNNER_DEBUG = \"RUNNER_DEBUG\";\n\nexport function isCI(): boolean {\n return process.env[CI] === \"true\";\n}\nexport function isRunnerDebug(): boolean {\n return process.env[RUNNER_DEBUG] === \"true\" || process.env[RUNNER_DEBUG] === \"1\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAa,iBAAiB;AAC9B,MAAa,YAAY;AACzB,MAAa,cAAc;AAE3B,MAAa,sBAAsB;AACnC,MAAa,iBAAiB;AAC9B,MAAa,qBAAqB;AAElC,MAAa,aAAa;AAC1B,MAAa,mBAAmB;AAEhC,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AAEjC,MAAa,qBAAqB;AAClC,MAAa,6BAA6B;AAE1C,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAE5C,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAE1C,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AAGrC,MAAa,eAAe;AAE5B,SAAgB,OAAgB;CAC9B,OAAO,QAAQ,IAAA,UAAY;AAC7B;AACA,SAAgB,gBAAyB;CACvC,OAAO,QAAQ,IAAA,oBAAsB,UAAU,QAAQ,IAAA,oBAAsB;AAC/E"}