@platforma-sdk/package-builder-lib 1.3.0 → 1.4.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 (53) hide show
  1. package/dist/core/core.cjs +23 -0
  2. package/dist/core/core.cjs.map +1 -1
  3. package/dist/core/core.d.ts +22 -6
  4. package/dist/core/core.d.ts.map +1 -1
  5. package/dist/core/core.js +23 -0
  6. package/dist/core/core.js.map +1 -1
  7. package/dist/core/docker-coverage.cjs +56 -0
  8. package/dist/core/docker-coverage.cjs.map +1 -0
  9. package/dist/core/docker-coverage.d.ts +35 -0
  10. package/dist/core/docker-coverage.d.ts.map +1 -0
  11. package/dist/core/docker-coverage.js +53 -0
  12. package/dist/core/docker-coverage.js.map +1 -0
  13. package/dist/core/docker.cjs +2 -3
  14. package/dist/core/docker.cjs.map +1 -1
  15. package/dist/core/docker.js +2 -3
  16. package/dist/core/docker.js.map +1 -1
  17. package/dist/core/envs.d.ts +27 -27
  18. package/dist/core/envs.d.ts.map +1 -1
  19. package/dist/core/package-info.cjs +6 -1
  20. package/dist/core/package-info.cjs.map +1 -1
  21. package/dist/core/package-info.d.ts +6 -6
  22. package/dist/core/package-info.d.ts.map +1 -1
  23. package/dist/core/package-info.js +6 -1
  24. package/dist/core/package-info.js.map +1 -1
  25. package/dist/core/push-guard.d.ts +9 -6
  26. package/dist/core/push-guard.d.ts.map +1 -1
  27. package/dist/core/schemas/artifacts.d.ts +236 -71
  28. package/dist/core/schemas/artifacts.d.ts.map +1 -1
  29. package/dist/core/schemas/entrypoints.d.ts +357 -10
  30. package/dist/core/schemas/entrypoints.d.ts.map +1 -1
  31. package/dist/core/sw-json-render.cjs +18 -0
  32. package/dist/core/sw-json-render.cjs.map +1 -1
  33. package/dist/core/sw-json-render.js +18 -0
  34. package/dist/core/sw-json-render.js.map +1 -1
  35. package/dist/core/util.d.ts +42 -44
  36. package/dist/core/util.d.ts.map +1 -1
  37. package/dist/defaults.d.ts +22 -22
  38. package/dist/defaults.d.ts.map +1 -1
  39. package/dist/index.cjs +4 -0
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.ts +5 -5
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +2 -1
  44. package/dist/index.js.map +1 -1
  45. package/package.json +5 -5
  46. package/src/core/__tests__/docker-build.test.ts +51 -0
  47. package/src/core/__tests__/docker-coverage.test.ts +319 -0
  48. package/src/core/core.ts +37 -0
  49. package/src/core/docker-coverage.ts +112 -0
  50. package/src/core/docker.ts +2 -7
  51. package/src/core/package-info.ts +11 -0
  52. package/src/core/sw-json-render.ts +25 -0
  53. package/src/index.ts +7 -0
@@ -1,32 +1,32 @@
1
1
  declare namespace envs_d_exports {
2
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
- declare const PL_PKG_VERSION = "PL_PKG_VERSION";
5
- declare const PL_PKG_OS = "PL_PKG_OS";
6
- declare const PL_PKG_ARCH = "PL_PKG_ARCH";
7
- declare const PL_PKG_CONTENT_ROOT = "PL_PKG_CONTENT_ROOT";
8
- declare const PL_PKG_ARCHIVE = "PL_PKG_ARCHIVE";
9
- declare const PL_PKG_STORAGE_URL = "PL_PKG_STORAGE_URL";
10
- declare const PL_PKG_DEV = "PL_PKG_DEV";
11
- declare const PL_PKG_FULL_HASH = "PL_PKG_FULL_HASH";
12
- declare const PL_CONDA_BUILD = "PL_CONDA_BUILD";
13
- declare const PL_CONDA_NO_BUILD = "PL_CONDA_NO_BUILD";
14
- declare const PL_DOCKER_REGISTRY = "PL_DOCKER_REGISTRY";
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";
22
- declare const PL_DOCKER_BUILD = "PL_DOCKER_BUILD";
23
- declare const PL_DOCKER_NO_BUILD = "PL_DOCKER_NO_BUILD";
24
- declare const PL_DOCKER_AUTOPUSH = "PL_DOCKER_AUTOPUSH";
25
- declare const PL_DOCKER_NO_AUTOPUSH = "PL_DOCKER_NO_AUTOPUSH";
26
- declare const CI = "CI";
27
- declare const RUNNER_DEBUG = "RUNNER_DEBUG";
28
- declare function isCI(): boolean;
29
- declare function isRunnerDebug(): boolean;
4
+ export declare const PL_PKG_VERSION = "PL_PKG_VERSION";
5
+ export declare const PL_PKG_OS = "PL_PKG_OS";
6
+ export declare const PL_PKG_ARCH = "PL_PKG_ARCH";
7
+ export declare const PL_PKG_CONTENT_ROOT = "PL_PKG_CONTENT_ROOT";
8
+ export declare const PL_PKG_ARCHIVE = "PL_PKG_ARCHIVE";
9
+ export declare const PL_PKG_STORAGE_URL = "PL_PKG_STORAGE_URL";
10
+ export declare const PL_PKG_DEV = "PL_PKG_DEV";
11
+ export declare const PL_PKG_FULL_HASH = "PL_PKG_FULL_HASH";
12
+ export declare const PL_CONDA_BUILD = "PL_CONDA_BUILD";
13
+ export declare const PL_CONDA_NO_BUILD = "PL_CONDA_NO_BUILD";
14
+ export declare const PL_DOCKER_REGISTRY = "PL_DOCKER_REGISTRY";
15
+ export declare const PL_DOCKER_REGISTRY_PUSH_TO = "PL_DOCKER_REGISTRY_PUSH_TO";
16
+ export declare const PL_DEV_BINARY_UPLOAD_URL = "PL_DEV_BINARY_UPLOAD_URL";
17
+ export declare const PL_RELEASE_BINARY_UPLOAD_URL = "PL_RELEASE_BINARY_UPLOAD_URL";
18
+ export declare const PL_DEV_DOCKER_PUSH_URL = "PL_DEV_DOCKER_PUSH_URL";
19
+ export declare const PL_DEV_DOCKER_PULL_URL = "PL_DEV_DOCKER_PULL_URL";
20
+ export declare const PL_RELEASE_DOCKER_PUSH_URL = "PL_RELEASE_DOCKER_PUSH_URL";
21
+ export declare const PL_RELEASE_DOCKER_PULL_URL = "PL_RELEASE_DOCKER_PULL_URL";
22
+ export declare const PL_DOCKER_BUILD = "PL_DOCKER_BUILD";
23
+ export declare const PL_DOCKER_NO_BUILD = "PL_DOCKER_NO_BUILD";
24
+ export declare const PL_DOCKER_AUTOPUSH = "PL_DOCKER_AUTOPUSH";
25
+ export declare const PL_DOCKER_NO_AUTOPUSH = "PL_DOCKER_NO_AUTOPUSH";
26
+ export declare const CI = "CI";
27
+ export declare const RUNNER_DEBUG = "RUNNER_DEBUG";
28
+ export declare function isCI(): boolean;
29
+ export declare function isRunnerDebug(): boolean;
30
30
  //#endregion
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 };
31
+ export { envs_d_exports };
32
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,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"}
1
+ {"version":3,"file":"envs.d.ts","names":[],"sources":["../../src/core/envs.ts"],"mappings":";;;qBAAa;qBACA;qBACA;qBAEA;qBACA;qBACA;qBAEA;qBACA;qBAEA;qBACA;qBAEA;qBACA;qBAEA;qBACA;qBAEA;qBACA;qBACA;qBACA;qBAEA;qBACA;qBACA;qBACA;qBAEA;qBACA;wBAEG;wBAGA"}
@@ -27,7 +27,8 @@ const packageJsonSchema = zod_v4.z.object({
27
27
  "block-software": zod_v4.z.object({
28
28
  registries: zod_v4.z.object({ binary: binaryRegistryPresetsSchema.optional() }).optional(),
29
29
  artifacts: require_artifacts.artifactIndexSchema.optional(),
30
- entrypoints: require_entrypoints.entrypointListSchema
30
+ entrypoints: require_entrypoints.entrypointListSchema,
31
+ requireDocker: zod_v4.z.boolean().optional()
31
32
  })
32
33
  });
33
34
  const wellKnownRegistries = { [require_defaults.BIN_REGISTRY_NAME]: { downloadURL: require_defaults.BIN_REGISTRY_DOWNLOAD_URL } };
@@ -65,6 +66,10 @@ var PackageInfo = class {
65
66
  get isPrivate() {
66
67
  return this.pkgJson.private ?? false;
67
68
  }
69
+ /** Whether every software entrypoint of this package must ship a docker image. */
70
+ get requireDocker() {
71
+ return this.pkgJson["block-software"].requireDocker ?? true;
72
+ }
68
73
  get binaryRegistries() {
69
74
  return this.pkgJson["block-software"].registries?.binary ?? {};
70
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"package-info.cjs","names":["z","path","fs","pythonDockerOptions","condaDockerOptions"],"sources":["../../src/core/package-info.ts"],"sourcesContent":["import * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport type winston from \"winston\";\nimport { z } from \"zod/v4\";\n\nimport * as defaults from \"../defaults\";\nimport * as util from \"./util\";\nimport * as envs from \"./envs\";\nimport * as artifacts from \"./schemas/artifacts\";\nimport * as entrypoints from \"./schemas/entrypoints\";\nimport { tryResolve } from \"@milaboratories/resolve-helper\";\nimport * as docker from \"./docker\";\nimport { prepareDockerOptions as pythonDockerOptions } from \"./docker-python\";\nimport { prepareDockerOptions as condaDockerOptions } from \"./docker-conda\";\n\nconst storagePresetSchema = z.object({\n downloadURL: z.string().optional(),\n storageURL: z.string().optional(),\n});\ntype storagePreset = z.infer<typeof storagePresetSchema>;\n\nconst binaryRegistryPresetsSchema = z.record(z.string(), storagePresetSchema);\ntype binaryRegistryPresets = z.infer<typeof binaryRegistryPresetsSchema>;\n\nconst packageJsonSchema = z.object({\n name: z.string(),\n version: z.string(),\n private: z.boolean().optional(),\n\n \"block-software\": z.object({\n registries: z\n .object({\n binary: binaryRegistryPresetsSchema.optional(),\n })\n .optional(),\n\n artifacts: artifacts.artifactIndexSchema.optional(),\n entrypoints: entrypoints.entrypointListSchema,\n }),\n});\ntype packageJson = z.infer<typeof packageJsonSchema>;\n\nconst wellKnownRegistries: Record<string, storagePreset> = {\n [defaults.BIN_REGISTRY_NAME]: {\n downloadURL: defaults.BIN_REGISTRY_DOWNLOAD_URL,\n },\n};\n\n/*\n * package.json -> block-software structure example:\n * {\n * \"block-software\": {\n * \"registries\": {\n * \"binary\": {\n * \"default\": { \"uploadURL\": \"s3://<bucket>/<some-prefix>?region=<region-name>\" }\n * }\n * },\n *\n * \"artifacts\": {\n * \"pkg-1\": {\n * \"type\": \"binary\",\n * \"roots\": {\n * \"linux-x64\": \"./linux-x64/src\",\n * \"linux-aarch64\": \"./linux-aarch/src\",\n * \"...and so on...\": \"platform-dependant roots\",\n * }\n * }\n * }\n *\n * \"entrypoints\": {\n * \"script1\": {\n * \"software\": {\n * \"artifact\": \"pkg-1\",\n * \"cmd\": [ \"{pkg}/script1\" ]\n * }\n * }\n * }\n * }\n * }\n */\nexport class PackageInfo {\n public readonly packageRoot: string;\n public readonly packageName: string;\n\n private readonly pkgJson: packageJson;\n private _versionOverride: string | undefined;\n\n /** Backing store for `Core.buildMode` (Core delegates its accessor here); gates content-addressable dev naming. */\n public buildMode: util.BuildMode = \"release\";\n\n constructor(\n private logger: winston.Logger,\n options?: {\n packageRoot?: string;\n pkgJsonData?: string;\n },\n ) {\n this.logger.debug(\"Reading package information...\");\n\n this.packageRoot = options?.packageRoot ?? util.findPackageRoot(logger);\n\n let pkgJsonData: string;\n if (options?.pkgJsonData) {\n pkgJsonData = options.pkgJsonData;\n } else {\n const pkgJsonPath = path.resolve(this.packageRoot, util.packageJsonName);\n\n this.logger.debug(` - loading '${pkgJsonPath}'`);\n if (!fs.existsSync(pkgJsonPath)) {\n this.logger.error(`no '${util.packageJsonName}' file found at '${this.packageRoot}'`);\n throw util.CLIError(\"not a platform software package directory\");\n }\n\n pkgJsonData = fs.readFileSync(pkgJsonPath, \"utf8\");\n }\n\n const result = parsePackageJson(pkgJsonData);\n if (!result.success) {\n throw util.CLIError(`\\n` + util.formatZodIssues(result.error.issues));\n }\n this.pkgJson = result.data;\n this.logger.debug(\" \" + JSON.stringify(this.pkgJson));\n\n this.validateConfig();\n\n this.packageName = this.pkgJson.name;\n\n logger.debug(\" package information loaded successfully.\");\n }\n\n get isPrivate(): boolean {\n return this.pkgJson.private ?? false;\n }\n\n get binaryRegistries(): binaryRegistryPresets {\n return this.pkgJson[\"block-software\"].registries?.binary ?? {};\n }\n\n get entrypoints(): Map<string, entrypoints.Entrypoint> {\n const list = new Map<string, entrypoints.Entrypoint>();\n\n for (const [epName, ep] of Object.entries(this.pkgJson[\"block-software\"].entrypoints)) {\n if (ep.docker) {\n const artifactID = typeof ep.docker.artifact === \"string\" ? ep.docker.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"docker\");\n\n // will mix docker to separate entrypoint\n // render function have to merge\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: ep.docker.cmd ?? [],\n env: ep.docker.envVars ?? [],\n });\n }\n\n if (ep.reference) {\n list.set(epName, {\n type: \"reference\",\n name: epName,\n reference: ep.reference,\n });\n continue;\n }\n\n if (ep.binary || ep.conda) {\n const swOptions: entrypoints.softwareOptionsType = ep.binary ? ep.binary : ep.conda!;\n const artifactOrRef = ep.binary ? ep.binary.artifact : ep.conda!.artifact;\n const artifactID = typeof artifactOrRef === \"string\" ? artifactOrRef : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n if (artifact.type === \"asset\") {\n throw util.CLIError(`binary entrypoint cannot point to asset artifact: ${epName}`);\n }\n if (artifact.type === \"environment\") {\n throw util.CLIError(`binary entrypoint cannot point to environment artifact: ${epName}`);\n }\n\n list.set(epName, {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n\n if (!ep.docker) {\n if (artifacts.dockerAutogenTypes.includes(artifact.type)) {\n switch (artifact.type) {\n case \"conda\":\n case \"python\":\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: this.generateDockerPackage(artifact),\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n continue;\n default: {\n throw new Error(`docker autogeneration is not defined for type: ${artifact.type}`);\n }\n }\n }\n }\n }\n\n if (ep.environment) {\n const packageID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n list.set(epName, {\n type: \"environment\",\n name: epName,\n artifact: this.getArtifact(packageID, \"environment\"),\n env: ep.environment.envVars ?? [],\n });\n continue;\n }\n\n if (ep.asset) {\n const packageID = typeof ep.asset === \"string\" ? ep.asset : epName;\n list.set(epName, {\n type: \"asset\",\n name: epName,\n artifact: this.getArtifact(packageID, \"asset\"),\n });\n continue;\n }\n\n if (list.size === 0) {\n throw util.CLIError(\n `entrypoint '${epName}' type is not supported by current platforma package builder`,\n );\n }\n }\n\n return list;\n }\n\n // Get not docker entrypoint if exists.\n // If only docker entrypoint exists, return it.\n public getMainEntrypoint(name: string): entrypoints.Entrypoint {\n const ep = this.entrypoints.get(name);\n if (ep) {\n return ep;\n }\n\n return this.entrypoints.get(docker.entrypointName(name))!;\n }\n\n /**\n * Resolves entrypoint reference to full entrypoint file path and type\n */\n public resolveReference(epName: string, ep: entrypoints.ReferenceEntrypoint): string {\n this.logger.debug(\n `resolving entrypoint '${epName}' reference '${ep.reference}'. packageRoot='${this.packageRoot}'`,\n );\n\n const refInfo = ep.reference.match(entrypoints.EnyrypointReferencePattern)?.groups;\n\n if (!refInfo) {\n this.logger.error(\n `entrypoint reference '${epName}' has incorrect reference format. <full package name>/<path to entrypoint> is expected`,\n );\n throw util.CLIError(`invalid entrypoint '${epName}' reference format`);\n }\n\n const refPath = tryResolve(this.packageRoot, ep.reference);\n if (!refPath) {\n this.logger.error(`entrypoint reference '${epName}' cannot be resolved into file path`);\n throw util.CLIError(`invalid entrypoint '${epName}' reference`);\n }\n\n return refPath;\n }\n\n // Packages are buildable artifacts with entrypoints\n get packages(): Map<string, artifacts.withId<artifacts.anyArtifactType>> {\n const result = new Map<string, artifacts.withId<artifacts.anyArtifactType>>();\n\n for (const ep of this.entrypoints.values()) {\n if (ep.type === \"reference\") {\n // Entrypoint references are not buildable\n continue;\n }\n\n if (!result.has(ep.artifact.id)) {\n result.set(ep.artifact.id, ep.artifact);\n }\n }\n\n return result;\n }\n\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"docker\",\n platform: util.ArchType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\",\n platform?: util.PlatformType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\" | \"docker\",\n platform?: util.PlatformType | util.ArchType,\n ): string {\n const platformPart = platform ? `_${platform}` : \"\";\n return path.resolve(\n this.packageRoot,\n \"dist\",\n \"artifacts\",\n pkgID,\n `${artifactType}${platformPart}.json`,\n );\n }\n\n private generateDockerPackage(\n artifact: artifacts.withId<artifacts.pythonType | artifacts.condaType>,\n ): artifacts.withId<artifacts.dockerType> {\n switch (artifact.type) {\n case \"python\": {\n const options = pythonDockerOptions(\n this.logger,\n this.packageRoot,\n this.packageName,\n artifact.id,\n artifact,\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n case \"conda\": {\n const options = condaDockerOptions(\n this.logger,\n this.packageRoot,\n artifact.id,\n artifact,\n util.currentArch(),\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n default: {\n util.assertNever(artifact);\n throw new Error(\"calm down the linter\");\n }\n }\n }\n\n public getArtifact(\n id: string,\n type: \"asset\",\n ): artifacts.withId<artifacts.withType<\"asset\", artifacts.assetType>>;\n public getArtifact(id: string, type: \"environment\"): artifacts.withId<artifacts.environmentType>;\n public getArtifact(id: string, type: \"binary\"): artifacts.withId<artifacts.binaryType>;\n public getArtifact(id: string, type: \"java\"): artifacts.withId<artifacts.javaType>;\n public getArtifact(id: string, type: \"python\"): artifacts.withId<artifacts.pythonType>;\n public getArtifact(id: string, type: \"R\"): artifacts.withId<artifacts.rType>;\n public getArtifact(id: string, type: \"docker\"): artifacts.withId<artifacts.dockerType>;\n public getArtifact(id: string, type: \"conda\"): artifacts.withId<artifacts.condaType>;\n public getArtifact(id: string, type: \"any\"): artifacts.withId<artifacts.anyArtifactType>;\n public getArtifact(\n id: string,\n type: artifacts.artifactType | \"any\",\n ): artifacts.withId<artifacts.anyArtifactType> {\n const artifacts = this.pkgJson[\"block-software\"].artifacts ?? {};\n const entrypoints = this.pkgJson[\"block-software\"].entrypoints;\n\n let artifact: artifacts.anyArtifactType | undefined;\n let errMsg = \"\";\n if (artifacts[id]) {\n artifact = artifacts[id];\n } else {\n const ep = entrypoints[id];\n if (!ep) {\n throw util.CLIError(\n `artifact with id '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n errMsg = `incorrect artifact reference in entrypoint '${id}'`;\n\n if (ep.asset) {\n artifact =\n typeof ep.asset === \"string\"\n ? artifacts[ep.asset]\n : ({ type: \"asset\", ...ep.asset } as artifacts.assetType);\n } else if (ep.binary && type !== \"docker\") {\n // single entrypoint can keep both binary and docker\n const a = ep.binary.artifact;\n artifact = typeof a === \"string\" ? artifacts[a] : a;\n } else if (ep.conda && type !== \"docker\") {\n // single entrypoint can keep both conda and docker\n const a = ep.conda.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"conda\", ...a } as artifacts.condaType);\n } else if (ep.environment) {\n const a = ep.environment.artifact;\n artifact =\n typeof a === \"string\"\n ? artifacts[a]\n : ({ type: \"environment\", ...a } as artifacts.environmentType);\n } else if (ep.docker) {\n const a = ep.docker.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"docker\", ...a } as artifacts.dockerType);\n }\n }\n\n if (!artifact) {\n throw util.CLIError(\n `artifact '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n switch (type) {\n case \"docker\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"docker\", errMsg),\n };\n }\n case \"asset\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"asset\", errMsg),\n };\n }\n case \"environment\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"environment\", errMsg),\n };\n }\n case \"binary\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"binary\", errMsg),\n };\n }\n case \"java\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"java\", errMsg),\n };\n }\n case \"python\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"python\", errMsg),\n };\n }\n case \"R\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"R\", errMsg),\n };\n }\n case \"conda\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"conda\", errMsg),\n };\n }\n case \"any\": {\n return {\n id: id,\n ...artifact,\n };\n }\n default: {\n util.assertNever(type);\n throw util.CLIError(`invalid artifact type`); // calm down the linter\n }\n }\n }\n\n public set version(v: string | undefined) {\n this._versionOverride = v;\n }\n\n public artifactName(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (artifact.type !== \"docker\") {\n if (artifact.name) {\n return artifact.name;\n }\n }\n\n return util.trimPrefix(this.pkgJson.name, \"@\") + \"/\" + artifact.id;\n }\n\n public artifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n const base = this.baseArtifactVersion(artifact);\n\n if (util.isDevMode(this.buildMode) && artifact.type !== \"docker\") {\n const hash = this.devContentHash(artifact);\n if (hash) {\n return `${base}-${hash}`;\n }\n }\n\n return base;\n }\n\n private baseArtifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (this._versionOverride) {\n return this._versionOverride;\n }\n\n if (process.env[envs.PL_PKG_VERSION]) {\n return process.env[envs.PL_PKG_VERSION];\n }\n\n if (artifact.type !== \"docker\" && artifact.version) {\n return artifact.version;\n }\n\n return this.pkgJson.version;\n }\n\n /**\n * Short content hash of the artifact's content root(s), used as the dev version suffix.\n */\n private readonly devContentHashCache = new Map<string, string | undefined>();\n\n private devContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n // Content roots are stable for the lifetime of this builder, so hash each artifact once.\n if (this.devContentHashCache.has(artifact.id)) {\n return this.devContentHashCache.get(artifact.id);\n }\n\n const hash = this.computeDevContentHash(artifact);\n this.devContentHashCache.set(artifact.id, hash);\n return hash;\n }\n\n private computeDevContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n const hasher = createHash(\"sha256\");\n let hashedAny = false;\n\n let platforms: util.PlatformType[];\n try {\n // Sorted so the hash is independent of package.json root-key order.\n platforms = this.artifactPlatforms(artifact).toSorted();\n } catch {\n return undefined; // no content roots at all — leave the version without a suffix\n }\n\n for (const platform of platforms) {\n let root: string;\n try {\n root = this.artifactContentRoot(artifact, platform);\n } catch {\n continue; // platform without a defined/present root — skip\n }\n if (!fs.existsSync(root)) {\n continue;\n }\n // Hash the platform name too, so the same files under a different platform yield a different\n // hash.\n hasher.update(platform);\n util.hashDirSync(root, hasher);\n hashedAny = true;\n }\n\n return hashedAny ? hasher.digest(\"hex\").slice(0, 12) : undefined;\n }\n\n public artifactRegistrySettings(artifact: artifacts.anyArtifactType): artifacts.registry {\n if (artifact.type === \"docker\") {\n return {\n name: artifact.registry,\n };\n }\n\n const registry = artifact.registry;\n const registries = this.binaryRegistries;\n\n const result: artifacts.registry = {\n name: \"default\",\n downloadURL: registries.default?.downloadURL,\n storageURL: registries.default?.storageURL,\n };\n\n if (registry) {\n if (typeof registry === \"string\") {\n result.name = registry;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL = registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL = registries[result.name]?.storageURL ?? regDefault?.storageURL;\n } else {\n result.name = registry.name;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL =\n registry.downloadURL ?? registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL =\n registry.storageURL ?? registries[result.name]?.storageURL ?? regDefault?.storageURL;\n }\n }\n\n const regNameUpper = result.name.toUpperCase().replaceAll(/[^A-Z0-9_]/g, \"_\");\n\n const uploadTo = process.env[`PL_REGISTRY_${regNameUpper}_UPLOAD_URL`];\n if (uploadTo) {\n result.storageURL = uploadTo;\n }\n\n const downloadFrom = process.env[`PL_REGISTRY_${regNameUpper}_DOWNLOAD_URL`];\n if (downloadFrom) {\n result.downloadURL = downloadFrom;\n }\n\n // Dev channel: the embedded binary registry is the built-in `midev` uploading to its built-in\n // endpoint, flipping to `dev` and `PL_DEV_BINARY_UPLOAD_URL` when that is set.\n if (util.isDevMode(this.buildMode)) {\n const devUpload = process.env[envs.PL_DEV_BINARY_UPLOAD_URL];\n result.name = devUpload\n ? defaults.DEV_BIN_REGISTRY_NAME_OVERRIDDEN\n : defaults.DEV_BIN_REGISTRY_NAME;\n result.storageURL = devUpload ?? defaults.DEV_BINARY_UPLOAD_TARGET;\n } else {\n const releaseUpload = process.env[envs.PL_RELEASE_BINARY_UPLOAD_URL];\n if (releaseUpload) {\n result.storageURL = releaseUpload;\n }\n }\n\n if (result.downloadURL) {\n const u = new URL(result.downloadURL, \"file:/nonexistent\"); // check download URL is valid URL\n if (![\"https:\", \"http:\"].includes(u.protocol)) {\n throw util.CLIError(\n `registry ${result.name} download URL is not valid. Only 'https://' and 'http://' schemes are supported for now`,\n );\n }\n }\n\n return result;\n }\n\n public artifactContentRoot(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n if (\"root\" in artifact && artifact.root) {\n return path.resolve(this.packageRoot, artifact.root);\n }\n if (\"roots\" in artifact && artifact.roots[platform]) {\n return path.resolve(this.packageRoot, artifact.roots[platform]);\n }\n\n throw util.CLIError(\n `root path of software archive on ${platform} is undefined for binary package`,\n );\n }\n\n public artifactPlatforms(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): util.PlatformType[] {\n if (artifact.type === \"docker\") {\n return [util.currentPlatform()];\n }\n\n if (\"root\" in artifact && artifact.root) {\n return [util.currentPlatform()];\n }\n\n if (\"roots\" in artifact) {\n return Object.keys(artifact.roots) as util.PlatformType[];\n }\n\n throw util.CLIError(\n `no platforms are defined as supported for artifact '${artifact.id}' in binary mode ` +\n `(no 'roots' are defined)`,\n );\n }\n\n public artifactArchiveFullName(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n const { os, arch } = util.splitPlatform(platform);\n return `${group}/${name}/${version}-${os}-${arch}.${extension}`;\n }\n\n public artifactArchiveAddressPattern(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n return `${group}/${name}/${version}-{os}-{arch}.${extension}`;\n }\n\n private validateConfig() {\n let hasErrors: boolean = false;\n\n const blockSoftware = this.pkgJson[\"block-software\"];\n\n const as = blockSoftware.artifacts ?? {};\n const entrypoints = blockSoftware.entrypoints ?? {};\n\n for (const [epName, ep] of Object.entries(entrypoints)) {\n if (ep.binary) {\n const artifactID = typeof ep.binary.artifact === \"string\" ? ep.binary.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (!artifacts.isBuildable(artifact.type)) {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' is not buildable to binary package`,\n );\n hasErrors = true;\n }\n\n if (artifact.type === \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' cannot be build into software pacakge. Use 'environment' entrypoint`,\n );\n hasErrors = true;\n }\n }\n\n if (ep.environment) {\n const artifactID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (artifact.type !== \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' with 'environment' settings should refer to 'environment' artifact type`,\n );\n hasErrors = true;\n }\n }\n\n // TODO: add docker validation here\n // TODO(rfiskov)[MILAB-3163]: Carefully handle docker artifacts, as some (e.g., for Python) may be autogenerated dynamically rather than explicitly defined.\n }\n\n const uniquePackageNames = new Set<string>();\n\n for (const [artifactID, artifact] of Object.entries(as)) {\n if (!artifacts.isBuildable(artifact.type)) {\n continue;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n const withId = { id: artifactID, ...artifact };\n const name = this.artifactName(withId);\n const version = this.artifactVersion(withId);\n const uniqueName = `${name}-${version}`;\n if (uniquePackageNames.has(uniqueName)) {\n this.logger.error(\n `found two packages with the same name '${name}' and version '${version}'`,\n );\n hasErrors = true;\n }\n\n uniquePackageNames.add(uniqueName);\n }\n\n if (hasErrors) {\n throw util.CLIError(\n `${util.softwareConfigName} has xconfiguration errors in 'block-software' section. See error log messages above for details`,\n );\n }\n }\n\n private validateArtifact(artifactName: string, artifact: artifacts.anyArtifactType): boolean {\n if (artifacts.isBuildable(artifact.type)) {\n // Validate that root is not equal to package root\n const resolvedRoots: string[] = [];\n const aType = artifact.type;\n switch (aType) {\n case \"asset\":\n case \"java\":\n case \"R\":\n case \"python\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.root));\n break;\n }\n case \"docker\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.context));\n break;\n }\n case \"environment\":\n case \"conda\":\n case \"binary\": {\n resolvedRoots.push(\n ...Object.values(artifact.roots).map((root) => path.resolve(this.packageRoot, root)),\n );\n break;\n }\n default:\n util.assertNever(aType);\n }\n\n for (const root of resolvedRoots) {\n if (root === this.packageRoot) {\n this.logger.error(\n `Invalid configuration: '${artifact.type}' artifact '${artifactName}' has 'root' set to the package root, which is not allowed`,\n );\n return false;\n }\n }\n }\n\n return true;\n }\n}\n\nfunction parsePackageJson(data: string): z.ZodSafeParseResult<packageJson> {\n const parsedData: unknown = JSON.parse(data);\n return packageJsonSchema.safeParse(parsedData);\n}\n\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"asset\",\n errMsg: string,\n): artifacts.withType<\"asset\", artifacts.assetType>;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"environment\",\n errMsg: string,\n): artifacts.environmentType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"java\",\n errMsg: string,\n): artifacts.javaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"python\",\n errMsg: string,\n): artifacts.pythonType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"R\",\n errMsg: string,\n): artifacts.rType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"binary\",\n errMsg: string,\n): artifacts.binaryType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"docker\",\n errMsg: string,\n): artifacts.dockerType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"conda\",\n errMsg: string,\n): artifacts.condaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: artifacts.artifactType,\n errMsg: string,\n): artifacts.anyArtifactType {\n if (artifact.type === type) {\n return artifact;\n }\n\n if (errMsg) {\n errMsg = `${errMsg}: `;\n }\n\n throw util.CLIError(`${errMsg}wrong artifact type: expected '${type}', got '${artifact.type}'`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAM,sBAAsBA,OAAAA,EAAE,OAAO;CACnC,aAAaA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,YAAYA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAClC,CAAC;AAGD,MAAM,8BAA8BA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAG,mBAAmB;AAG5E,MAAM,oBAAoBA,OAAAA,EAAE,OAAO;CACjC,MAAMA,OAAAA,EAAE,OAAO;CACf,SAASA,OAAAA,EAAE,OAAO;CAClB,SAASA,OAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS;CAE9B,kBAAkBA,OAAAA,EAAE,OAAO;EACzB,YAAYA,OAAAA,EACT,OAAO,EACN,QAAQ,4BAA4B,SAAS,EAC/C,CAAC,CAAC,CACD,SAAS;EAEZ,WAAA,kBAAA,oBAAyC,SAAS;EAClD,aAAA,oBAAA;CACF,CAAC;AACH,CAAC;AAGD,MAAM,sBAAqD,GAAA,iBAAA,oBAC3B,EAC5B,aAAA,iBAAA,0BACF,EACF;AAkCA,IAAa,cAAb,MAAyB;CAWb;CAVV;CACA;CAEA;CACA;;CAGA,YAAmC;CAEnC,YACE,QACA,SAIA;EALQ,KAAA,SAAA;EAMR,KAAK,OAAO,MAAM,gCAAgC;EAElD,KAAK,cAAc,SAAS,eAAA,aAAA,gBAAoC,MAAM;EAEtE,IAAI;EACJ,IAAI,SAAS,aACX,cAAc,QAAQ;OACjB;GACL,MAAM,cAAcC,UAAK,QAAQ,KAAK,aAAA,aAAA,eAAiC;GAEvE,KAAK,OAAO,MAAM,gBAAgB,YAAY,EAAE;GAChD,IAAI,CAACC,QAAG,WAAW,WAAW,GAAG;IAC/B,KAAK,OAAO,MAAM,OAAA,aAAA,gBAA4B,mBAAmB,KAAK,YAAY,EAAE;IACpF,MAAA,aAAA,SAAoB,2CAA2C;GACjE;GAEA,cAAcA,QAAG,aAAa,aAAa,MAAM;EACnD;EAEA,MAAM,SAAS,iBAAiB,WAAW;EAC3C,IAAI,CAAC,OAAO,SACV,MAAA,aAAA,SAAoB,OAAA,aAAA,gBAA4B,OAAO,MAAM,MAAM,CAAC;EAEtE,KAAK,UAAU,OAAO;EACtB,KAAK,OAAO,MAAM,SAAS,KAAK,UAAU,KAAK,OAAO,CAAC;EAEvD,KAAK,eAAe;EAEpB,KAAK,cAAc,KAAK,QAAQ;EAEhC,OAAO,MAAM,4CAA4C;CAC3D;CAEA,IAAI,YAAqB;EACvB,OAAO,KAAK,QAAQ,WAAW;CACjC;CAEA,IAAI,mBAA0C;EAC5C,OAAO,KAAK,QAAQ,iBAAiB,CAAC,YAAY,UAAU,CAAC;CAC/D;CAEA,IAAI,cAAmD;EACrD,MAAM,uBAAO,IAAI,IAAoC;EAErD,KAAK,MAAM,CAAC,QAAQ,OAAO,OAAO,QAAQ,KAAK,QAAQ,iBAAiB,CAAC,WAAW,GAAG;GACrF,IAAI,GAAG,QAAQ;IACb,MAAM,aAAa,OAAO,GAAG,OAAO,aAAa,WAAW,GAAG,OAAO,WAAW;IACjF,MAAM,WAAW,KAAK,YAAY,YAAY,QAAQ;IAItD,KAAK,IAAA,eAAA,eAA0B,MAAM,GAAG;KACtC,MAAM;KACN,MAAM;KACI;KACV,KAAK,GAAG,OAAO,OAAO,CAAC;KACvB,KAAK,GAAG,OAAO,WAAW,CAAC;IAC7B,CAAC;GACH;GAEA,IAAI,GAAG,WAAW;IAChB,KAAK,IAAI,QAAQ;KACf,MAAM;KACN,MAAM;KACN,WAAW,GAAG;IAChB,CAAC;IACD;GACF;GAEA,IAAI,GAAG,UAAU,GAAG,OAAO;IACzB,MAAM,YAA6C,GAAG,SAAS,GAAG,SAAS,GAAG;IAC9E,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,WAAW,GAAG,MAAO;IACjE,MAAM,aAAa,OAAO,kBAAkB,WAAW,gBAAgB;IACvE,MAAM,WAAW,KAAK,YAAY,YAAY,KAAK;IACnD,IAAI,SAAS,SAAS,SACpB,MAAA,aAAA,SAAoB,qDAAqD,QAAQ;IAEnF,IAAI,SAAS,SAAS,eACpB,MAAA,aAAA,SAAoB,2DAA2D,QAAQ;IAGzF,KAAK,IAAI,QAAQ;KACf,MAAM;KACN,MAAM;KACI;KACV,KAAK,UAAU;KACf,KAAK,UAAU,WAAW,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,GAAG;8CAC2B,SAAS,SAAS,IAAI,GACrD,QAAQ,SAAS,MAAjB;MACE,KAAK;MACL,KAAK;OACH,KAAK,IAAA,eAAA,eAA0B,MAAM,GAAG;QACtC,MAAM;QACN,MAAM;QACN,UAAU,KAAK,sBAAsB,QAAQ;QAC7C,KAAK,UAAU;QACf,KAAK,UAAU,WAAW,CAAC;OAC7B,CAAC;OACD;MACF,SACE,MAAM,IAAI,MAAM,kDAAkD,SAAS,MAAM;KAErF;;GAGN;GAEA,IAAI,GAAG,aAAa;IAClB,MAAM,YACJ,OAAO,GAAG,YAAY,aAAa,WAAW,GAAG,YAAY,WAAW;IAC1E,KAAK,IAAI,QAAQ;KACf,MAAM;KACN,MAAM;KACN,UAAU,KAAK,YAAY,WAAW,aAAa;KACnD,KAAK,GAAG,YAAY,WAAW,CAAC;IAClC,CAAC;IACD;GACF;GAEA,IAAI,GAAG,OAAO;IACZ,MAAM,YAAY,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ;IAC5D,KAAK,IAAI,QAAQ;KACf,MAAM;KACN,MAAM;KACN,UAAU,KAAK,YAAY,WAAW,OAAO;IAC/C,CAAC;IACD;GACF;GAEA,IAAI,KAAK,SAAS,GAChB,MAAA,aAAA,SACE,eAAe,OAAO,6DACxB;EAEJ;EAEA,OAAO;CACT;CAIA,kBAAyB,MAAsC;EAC7D,MAAM,KAAK,KAAK,YAAY,IAAI,IAAI;EACpC,IAAI,IACF,OAAO;EAGT,OAAO,KAAK,YAAY,IAAA,eAAA,eAA0B,IAAI,CAAC;CACzD;;;;CAKA,iBAAwB,QAAgB,IAA6C;EACnF,KAAK,OAAO,MACV,yBAAyB,OAAO,eAAe,GAAG,UAAU,kBAAkB,KAAK,YAAY,EACjG;EAIA,IAAI,CAFY,GAAG,UAAU,MAAA,oBAAA,0BAA4C,CAAC,EAAE,QAE9D;GACZ,KAAK,OAAO,MACV,yBAAyB,OAAO,uFAClC;GACA,MAAA,aAAA,SAAoB,uBAAuB,OAAO,mBAAmB;EACvE;EAEA,MAAM,WAAA,GAAA,+BAAA,WAAA,CAAqB,KAAK,aAAa,GAAG,SAAS;EACzD,IAAI,CAAC,SAAS;GACZ,KAAK,OAAO,MAAM,yBAAyB,OAAO,oCAAoC;GACtF,MAAA,aAAA,SAAoB,uBAAuB,OAAO,YAAY;EAChE;EAEA,OAAO;CACT;CAGA,IAAI,WAAqE;EACvE,MAAM,yBAAS,IAAI,IAAyD;EAE5E,KAAK,MAAM,MAAM,KAAK,YAAY,OAAO,GAAG;GAC1C,IAAI,GAAG,SAAS,aAEd;GAGF,IAAI,CAAC,OAAO,IAAI,GAAG,SAAS,EAAE,GAC5B,OAAO,IAAI,GAAG,SAAS,IAAI,GAAG,QAAQ;EAE1C;EAEA,OAAO;CACT;CAYA,qBACE,OACA,cACA,UACQ;EACR,MAAM,eAAe,WAAW,IAAI,aAAa;EACjD,OAAOD,UAAK,QACV,KAAK,aACL,QACA,aACA,OACA,GAAG,eAAe,aAAa,MACjC;CACF;CAEA,sBACE,UACwC;EACxC,QAAQ,SAAS,MAAjB;GACE,KAAK,UAAU;IACb,MAAM,UAAUE,sBAAAA,qBACd,KAAK,QACL,KAAK,aACL,KAAK,aACL,SAAS,IACT,QACF;IAEA,OAAO;KACL,IAAI,SAAS;KACb,MAAM;KACN,UAAU,SAAS;KACnB,GAAG;IACL;GACF;GACA,KAAK,SAAS;IACZ,MAAM,UAAUC,qBAAAA,qBACd,KAAK,QACL,KAAK,aACL,SAAS,IACT,UAAA,aAAA,YACiB,CACnB;IAEA,OAAO;KACL,IAAI,SAAS;KACb,MAAM;KACN,UAAU,SAAS;KACnB,GAAG;IACL;GACF;GACA;IACE,aAAA,YAAiB,QAAQ;IACzB,MAAM,IAAI,MAAM,sBAAsB;EAE1C;CACF;CAcA,YACE,IACA,MAC6C;EAC7C,MAAM,YAAY,KAAK,QAAQ,iBAAiB,CAAC,aAAa,CAAC;EAC/D,MAAM,cAAc,KAAK,QAAQ,iBAAiB,CAAC;EAEnD,IAAI;EACJ,IAAI,SAAS;EACb,IAAI,UAAU,KACZ,WAAW,UAAU;OAChB;GACL,MAAM,KAAK,YAAY;GACvB,IAAI,CAAC,IACH,MAAA,aAAA,SACE,qBAAqB,GAAG,yDAC1B;GAGF,SAAS,+CAA+C,GAAG;GAE3D,IAAI,GAAG,OACL,WACE,OAAO,GAAG,UAAU,WAChB,UAAU,GAAG,SACZ;IAAE,MAAM;IAAS,GAAG,GAAG;GAAM;QAC/B,IAAI,GAAG,UAAU,SAAS,UAAU;IAEzC,MAAM,IAAI,GAAG,OAAO;IACpB,WAAW,OAAO,MAAM,WAAW,UAAU,KAAK;GACpD,OAAO,IAAI,GAAG,SAAS,SAAS,UAAU;IAExC,MAAM,IAAI,GAAG,MAAM;IACnB,WACE,OAAO,MAAM,WAAW,UAAU,KAAM;KAAE,MAAM;KAAS,GAAG;IAAE;GAClE,OAAO,IAAI,GAAG,aAAa;IACzB,MAAM,IAAI,GAAG,YAAY;IACzB,WACE,OAAO,MAAM,WACT,UAAU,KACT;KAAE,MAAM;KAAe,GAAG;IAAE;GACrC,OAAO,IAAI,GAAG,QAAQ;IACpB,MAAM,IAAI,GAAG,OAAO;IACpB,WACE,OAAO,MAAM,WAAW,UAAU,KAAM;KAAE,MAAM;KAAU,GAAG;IAAE;GACnE;EACF;EAEA,IAAI,CAAC,UACH,MAAA,aAAA,SACE,aAAa,GAAG,yDAClB;EAGF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,UAAU,MAAM;GACnD;GAEF,KAAK,SACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,SAAS,MAAM;GAClD;GAEF,KAAK,eACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,eAAe,MAAM;GACxD;GAEF,KAAK,UACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,UAAU,MAAM;GACnD;GAEF,KAAK,QACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,QAAQ,MAAM;GACjD;GAEF,KAAK,UACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,UAAU,MAAM;GACnD;GAEF,KAAK,KACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,KAAK,MAAM;GAC9C;GAEF,KAAK,SACH,OAAO;IACD;IACJ,GAAG,oBAAoB,UAAU,SAAS,MAAM;GAClD;GAEF,KAAK,OACH,OAAO;IACD;IACJ,GAAG;GACL;GAEF;IACE,aAAA,YAAiB,IAAI;IACrB,MAAA,aAAA,SAAoB,uBAAuB;EAE/C;CACF;CAEA,IAAW,QAAQ,GAAuB;EACxC,KAAK,mBAAmB;CAC1B;CAEA,aAAoB,UAA+D;EACjF,IAAI,SAAS,SAAS;OAChB,SAAS,MACX,OAAO,SAAS;EAAA;EAIpB,OAAA,aAAA,WAAuB,KAAK,QAAQ,MAAM,GAAG,IAAI,MAAM,SAAS;CAClE;CAEA,gBAAuB,UAA+D;EACpF,MAAM,OAAO,KAAK,oBAAoB,QAAQ;EAE9C,IAAA,aAAA,UAAmB,KAAK,SAAS,KAAK,SAAS,SAAS,UAAU;GAChE,MAAM,OAAO,KAAK,eAAe,QAAQ;GACzC,IAAI,MACF,OAAO,GAAG,KAAK,GAAG;EAEtB;EAEA,OAAO;CACT;CAEA,oBAA4B,UAA+D;EACzF,IAAI,KAAK,kBACP,OAAO,KAAK;EAGd,IAAI,QAAQ,IAAI,mBACd,OAAO,QAAQ,IAAA,aAAA;EAGjB,IAAI,SAAS,SAAS,YAAY,SAAS,SACzC,OAAO,SAAS;EAGlB,OAAO,KAAK,QAAQ;CACtB;;;;CAKA,sCAAuC,IAAI,IAAgC;CAE3E,eACE,UACoB;EAEpB,IAAI,KAAK,oBAAoB,IAAI,SAAS,EAAE,GAC1C,OAAO,KAAK,oBAAoB,IAAI,SAAS,EAAE;EAGjD,MAAM,OAAO,KAAK,sBAAsB,QAAQ;EAChD,KAAK,oBAAoB,IAAI,SAAS,IAAI,IAAI;EAC9C,OAAO;CACT;CAEA,sBACE,UACoB;EACpB,MAAM,UAAA,GAAA,YAAA,WAAA,CAAoB,QAAQ;EAClC,IAAI,YAAY;EAEhB,IAAI;EACJ,IAAI;GAEF,YAAY,KAAK,kBAAkB,QAAQ,CAAC,CAAC,SAAS;EACxD,QAAQ;GACN;EACF;EAEA,KAAK,MAAM,YAAY,WAAW;GAChC,IAAI;GACJ,IAAI;IACF,OAAO,KAAK,oBAAoB,UAAU,QAAQ;GACpD,QAAQ;IACN;GACF;GACA,IAAI,CAACF,QAAG,WAAW,IAAI,GACrB;GAIF,OAAO,OAAO,QAAQ;GACtB,aAAA,YAAiB,MAAM,MAAM;GAC7B,YAAY;EACd;EAEA,OAAO,YAAY,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,IAAI,KAAA;CACzD;CAEA,yBAAgC,UAAyD;EACvF,IAAI,SAAS,SAAS,UACpB,OAAO,EACL,MAAM,SAAS,SACjB;EAGF,MAAM,WAAW,SAAS;EAC1B,MAAM,aAAa,KAAK;EAExB,MAAM,SAA6B;GACjC,MAAM;GACN,aAAa,WAAW,SAAS;GACjC,YAAY,WAAW,SAAS;EAClC;EAEA,IAAI,UACF,IAAI,OAAO,aAAa,UAAU;GAChC,OAAO,OAAO;GACd,MAAM,aAAa,oBAAoB,OAAO;GAC9C,OAAO,cAAc,WAAW,OAAO,KAAK,EAAE,eAAe,YAAY;GACzE,OAAO,aAAa,WAAW,OAAO,KAAK,EAAE,cAAc,YAAY;EACzE,OAAO;GACL,OAAO,OAAO,SAAS;GACvB,MAAM,aAAa,oBAAoB,OAAO;GAC9C,OAAO,cACL,SAAS,eAAe,WAAW,OAAO,KAAK,EAAE,eAAe,YAAY;GAC9E,OAAO,aACL,SAAS,cAAc,WAAW,OAAO,KAAK,EAAE,cAAc,YAAY;EAC9E;EAGF,MAAM,eAAe,OAAO,KAAK,YAAY,CAAC,CAAC,WAAW,eAAe,GAAG;EAE5E,MAAM,WAAW,QAAQ,IAAI,eAAe,aAAa;EACzD,IAAI,UACF,OAAO,aAAa;EAGtB,MAAM,eAAe,QAAQ,IAAI,eAAe,aAAa;EAC7D,IAAI,cACF,OAAO,cAAc;EAKvB,IAAA,aAAA,UAAmB,KAAK,SAAS,GAAG;GAClC,MAAM,YAAY,QAAQ,IAAA,aAAA;GAC1B,OAAO,OAAO,YACV,QAAA,iBAAA;GAEJ,OAAO,aAAa,aAAa;EACnC,OAAO;GACL,MAAM,gBAAgB,QAAQ,IAAA,aAAA;GAC9B,IAAI,eACF,OAAO,aAAa;EAExB;EAEA,IAAI,OAAO,aAAa;GACtB,MAAM,IAAI,IAAI,IAAI,OAAO,aAAa,mBAAmB;GACzD,IAAI,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,SAAS,EAAE,QAAQ,GAC1C,MAAA,aAAA,SACE,YAAY,OAAO,KAAK,wFAC1B;EAEJ;EAEA,OAAO;CACT;CAEA,oBACE,UACA,UACQ;EACR,IAAI,UAAU,YAAY,SAAS,MACjC,OAAOD,UAAK,QAAQ,KAAK,aAAa,SAAS,IAAI;EAErD,IAAI,WAAW,YAAY,SAAS,MAAM,WACxC,OAAOA,UAAK,QAAQ,KAAK,aAAa,SAAS,MAAM,SAAS;EAGhE,MAAA,aAAA,SACE,oCAAoC,SAAS,iCAC/C;CACF;CAEA,kBACE,UACqB;EACrB,IAAI,SAAS,SAAS,UACpB,OAAO,CAAA,aAAA,gBAAsB,CAAC;EAGhC,IAAI,UAAU,YAAY,SAAS,MACjC,OAAO,CAAA,aAAA,gBAAsB,CAAC;EAGhC,IAAI,WAAW,UACb,OAAO,OAAO,KAAK,SAAS,KAAK;EAGnC,MAAA,aAAA,SACE,uDAAuD,SAAS,GAAG,0CAErE;CACF;CAEA,wBACE,UACA,UACQ;EACR,MAAM,QAAQ,SAAS,SAAS,UAAU,WAAW;EACrD,MAAM,YAAY,SAAS,SAAS,UAAU,QAAQ;EACtD,MAAM,OAAO,KAAK,aAAa,QAAQ;EACvC,MAAM,UAAU,KAAK,gBAAgB,QAAQ;EAE7C,IAAA,kBAAA,gBAA8B,SAAS,IAAI,GACzC,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG;EAGxC,MAAM,EAAE,IAAI,SAAA,aAAA,cAA4B,QAAQ;EAChD,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,GAAG,GAAG,KAAK,GAAG;CACtD;CAEA,8BACE,UACQ;EACR,MAAM,QAAQ,SAAS,SAAS,UAAU,WAAW;EACrD,MAAM,YAAY,SAAS,SAAS,UAAU,QAAQ;EACtD,MAAM,OAAO,KAAK,aAAa,QAAQ;EACvC,MAAM,UAAU,KAAK,gBAAgB,QAAQ;EAE7C,IAAA,kBAAA,gBAA8B,SAAS,IAAI,GACzC,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG;EAGxC,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,eAAe;CACpD;CAEA,iBAAyB;EACvB,IAAI,YAAqB;EAEzB,MAAM,gBAAgB,KAAK,QAAQ;EAEnC,MAAM,KAAK,cAAc,aAAa,CAAC;EACvC,MAAM,cAAc,cAAc,eAAe,CAAC;EAElD,KAAK,MAAM,CAAC,QAAQ,OAAO,OAAO,QAAQ,WAAW,GAAG;GACtD,IAAI,GAAG,QAAQ;IACb,MAAM,aAAa,OAAO,GAAG,OAAO,aAAa,WAAW,GAAG,OAAO,WAAW;IACjF,MAAM,WAAW,KAAK,YAAY,YAAY,KAAK;IAEnD,IAAI,CAAC,UAAU;KACb,KAAK,OAAO,MACV,eAAe,OAAO,wBAAwB,WAAW,6BAAA,aAAA,mBAAqD,EAChH;KACA,YAAY;IACd;IAEA,IAAI,CAAC,KAAK,iBAAiB,YAAY,QAAQ,GAC7C,YAAY;IAGd,IAAI,CAAA,kBAAA,YAAuB,SAAS,IAAI,GAAG;KACzC,KAAK,OAAO,MACV,eAAe,OAAO,mBAAmB,SAAS,KAAK,qCACzD;KACA,YAAY;IACd;IAEA,IAAI,SAAS,SAAS,eAAe;KACnC,KAAK,OAAO,MACV,eAAe,OAAO,mBAAmB,SAAS,KAAK,sEACzD;KACA,YAAY;IACd;GACF;GAEA,IAAI,GAAG,aAAa;IAClB,MAAM,aACJ,OAAO,GAAG,YAAY,aAAa,WAAW,GAAG,YAAY,WAAW;IAC1E,MAAM,WAAW,KAAK,YAAY,YAAY,KAAK;IAEnD,IAAI,CAAC,UAAU;KACb,KAAK,OAAO,MACV,eAAe,OAAO,wBAAwB,WAAW,6BAAA,aAAA,mBAAqD,EAChH;KACA,YAAY;IACd;IAEA,IAAI,CAAC,KAAK,iBAAiB,YAAY,QAAQ,GAC7C,YAAY;IAGd,IAAI,SAAS,SAAS,eAAe;KACnC,KAAK,OAAO,MACV,eAAe,OAAO,0EACxB;KACA,YAAY;IACd;GACF;EAIF;EAEA,MAAM,qCAAqB,IAAI,IAAY;EAE3C,KAAK,MAAM,CAAC,YAAY,aAAa,OAAO,QAAQ,EAAE,GAAG;GACvD,IAAI,CAAA,kBAAA,YAAuB,SAAS,IAAI,GACtC;GAGF,IAAI,CAAC,KAAK,iBAAiB,YAAY,QAAQ,GAC7C,YAAY;GAGd,MAAM,SAAS;IAAE,IAAI;IAAY,GAAG;GAAS;GAC7C,MAAM,OAAO,KAAK,aAAa,MAAM;GACrC,MAAM,UAAU,KAAK,gBAAgB,MAAM;GAC3C,MAAM,aAAa,GAAG,KAAK,GAAG;GAC9B,IAAI,mBAAmB,IAAI,UAAU,GAAG;IACtC,KAAK,OAAO,MACV,0CAA0C,KAAK,iBAAiB,QAAQ,EAC1E;IACA,YAAY;GACd;GAEA,mBAAmB,IAAI,UAAU;EACnC;EAEA,IAAI,WACF,MAAA,aAAA,SACE,GAAA,aAAA,mBAA2B,iGAC7B;CAEJ;CAEA,iBAAyB,cAAsB,UAA8C;EAC3F,IAAA,kBAAA,YAA0B,SAAS,IAAI,GAAG;GAExC,MAAM,gBAA0B,CAAC;GACjC,MAAM,QAAQ,SAAS;GACvB,QAAQ,OAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,cAAc,KAAKA,UAAK,QAAQ,KAAK,aAAa,SAAS,IAAI,CAAC;KAChE;IAEF,KAAK;KACH,cAAc,KAAKA,UAAK,QAAQ,KAAK,aAAa,SAAS,OAAO,CAAC;KACnE;IAEF,KAAK;IACL,KAAK;IACL,KAAK;KACH,cAAc,KACZ,GAAG,OAAO,OAAO,SAAS,KAAK,CAAC,CAAC,KAAK,SAASA,UAAK,QAAQ,KAAK,aAAa,IAAI,CAAC,CACrF;KACA;IAEF,SACE,aAAA,YAAiB,KAAK;GAC1B;GAEA,KAAK,MAAM,QAAQ,eACjB,IAAI,SAAS,KAAK,aAAa;IAC7B,KAAK,OAAO,MACV,2BAA2B,SAAS,KAAK,cAAc,aAAa,2DACtE;IACA,OAAO;GACT;EAEJ;EAEA,OAAO;CACT;AACF;AAEA,SAAS,iBAAiB,MAAiD;CACzE,MAAM,aAAsB,KAAK,MAAM,IAAI;CAC3C,OAAO,kBAAkB,UAAU,UAAU;AAC/C;AA0CA,SAAS,oBACP,UACA,MACA,QAC2B;CAC3B,IAAI,SAAS,SAAS,MACpB,OAAO;CAGT,IAAI,QACF,SAAS,GAAG,OAAO;CAGrB,MAAA,aAAA,SAAoB,GAAG,OAAO,iCAAiC,KAAK,UAAU,SAAS,KAAK,EAAE;AAChG"}
1
+ {"version":3,"file":"package-info.cjs","names":["z","path","fs","pythonDockerOptions","condaDockerOptions"],"sources":["../../src/core/package-info.ts"],"sourcesContent":["import * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport type winston from \"winston\";\nimport { z } from \"zod/v4\";\n\nimport * as defaults from \"../defaults\";\nimport * as util from \"./util\";\nimport * as envs from \"./envs\";\nimport * as artifacts from \"./schemas/artifacts\";\nimport * as entrypoints from \"./schemas/entrypoints\";\nimport { tryResolve } from \"@milaboratories/resolve-helper\";\nimport * as docker from \"./docker\";\nimport { prepareDockerOptions as pythonDockerOptions } from \"./docker-python\";\nimport { prepareDockerOptions as condaDockerOptions } from \"./docker-conda\";\n\nconst storagePresetSchema = z.object({\n downloadURL: z.string().optional(),\n storageURL: z.string().optional(),\n});\ntype storagePreset = z.infer<typeof storagePresetSchema>;\n\nconst binaryRegistryPresetsSchema = z.record(z.string(), storagePresetSchema);\ntype binaryRegistryPresets = z.infer<typeof binaryRegistryPresetsSchema>;\n\nconst packageJsonSchema = z.object({\n name: z.string(),\n version: z.string(),\n private: z.boolean().optional(),\n\n \"block-software\": z.object({\n registries: z\n .object({\n binary: binaryRegistryPresetsSchema.optional(),\n })\n .optional(),\n\n artifacts: artifacts.artifactIndexSchema.optional(),\n entrypoints: entrypoints.entrypointListSchema,\n\n // Opt out of the \"every software entrypoint needs a docker image\" rule for a\n // package that is deliberately binary-only. Kept here rather than behind a CLI\n // flag or env var: the exception belongs to the package, where it is reviewable,\n // not to whichever CI run happens to build it. See core/docker-coverage.ts.\n requireDocker: z.boolean().optional(),\n }),\n});\ntype packageJson = z.infer<typeof packageJsonSchema>;\n\nconst wellKnownRegistries: Record<string, storagePreset> = {\n [defaults.BIN_REGISTRY_NAME]: {\n downloadURL: defaults.BIN_REGISTRY_DOWNLOAD_URL,\n },\n};\n\n/*\n * package.json -> block-software structure example:\n * {\n * \"block-software\": {\n * \"registries\": {\n * \"binary\": {\n * \"default\": { \"uploadURL\": \"s3://<bucket>/<some-prefix>?region=<region-name>\" }\n * }\n * },\n *\n * \"artifacts\": {\n * \"pkg-1\": {\n * \"type\": \"binary\",\n * \"roots\": {\n * \"linux-x64\": \"./linux-x64/src\",\n * \"linux-aarch64\": \"./linux-aarch/src\",\n * \"...and so on...\": \"platform-dependant roots\",\n * }\n * }\n * }\n *\n * \"entrypoints\": {\n * \"script1\": {\n * \"software\": {\n * \"artifact\": \"pkg-1\",\n * \"cmd\": [ \"{pkg}/script1\" ]\n * }\n * }\n * }\n * }\n * }\n */\nexport class PackageInfo {\n public readonly packageRoot: string;\n public readonly packageName: string;\n\n private readonly pkgJson: packageJson;\n private _versionOverride: string | undefined;\n\n /** Backing store for `Core.buildMode` (Core delegates its accessor here); gates content-addressable dev naming. */\n public buildMode: util.BuildMode = \"release\";\n\n constructor(\n private logger: winston.Logger,\n options?: {\n packageRoot?: string;\n pkgJsonData?: string;\n },\n ) {\n this.logger.debug(\"Reading package information...\");\n\n this.packageRoot = options?.packageRoot ?? util.findPackageRoot(logger);\n\n let pkgJsonData: string;\n if (options?.pkgJsonData) {\n pkgJsonData = options.pkgJsonData;\n } else {\n const pkgJsonPath = path.resolve(this.packageRoot, util.packageJsonName);\n\n this.logger.debug(` - loading '${pkgJsonPath}'`);\n if (!fs.existsSync(pkgJsonPath)) {\n this.logger.error(`no '${util.packageJsonName}' file found at '${this.packageRoot}'`);\n throw util.CLIError(\"not a platform software package directory\");\n }\n\n pkgJsonData = fs.readFileSync(pkgJsonPath, \"utf8\");\n }\n\n const result = parsePackageJson(pkgJsonData);\n if (!result.success) {\n throw util.CLIError(`\\n` + util.formatZodIssues(result.error.issues));\n }\n this.pkgJson = result.data;\n this.logger.debug(\" \" + JSON.stringify(this.pkgJson));\n\n this.validateConfig();\n\n this.packageName = this.pkgJson.name;\n\n logger.debug(\" package information loaded successfully.\");\n }\n\n get isPrivate(): boolean {\n return this.pkgJson.private ?? false;\n }\n\n /** Whether every software entrypoint of this package must ship a docker image. */\n get requireDocker(): boolean {\n return this.pkgJson[\"block-software\"].requireDocker ?? true;\n }\n\n get binaryRegistries(): binaryRegistryPresets {\n return this.pkgJson[\"block-software\"].registries?.binary ?? {};\n }\n\n get entrypoints(): Map<string, entrypoints.Entrypoint> {\n const list = new Map<string, entrypoints.Entrypoint>();\n\n for (const [epName, ep] of Object.entries(this.pkgJson[\"block-software\"].entrypoints)) {\n if (ep.docker) {\n const artifactID = typeof ep.docker.artifact === \"string\" ? ep.docker.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"docker\");\n\n // will mix docker to separate entrypoint\n // render function have to merge\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: ep.docker.cmd ?? [],\n env: ep.docker.envVars ?? [],\n });\n }\n\n if (ep.reference) {\n list.set(epName, {\n type: \"reference\",\n name: epName,\n reference: ep.reference,\n });\n continue;\n }\n\n if (ep.binary || ep.conda) {\n const swOptions: entrypoints.softwareOptionsType = ep.binary ? ep.binary : ep.conda!;\n const artifactOrRef = ep.binary ? ep.binary.artifact : ep.conda!.artifact;\n const artifactID = typeof artifactOrRef === \"string\" ? artifactOrRef : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n if (artifact.type === \"asset\") {\n throw util.CLIError(`binary entrypoint cannot point to asset artifact: ${epName}`);\n }\n if (artifact.type === \"environment\") {\n throw util.CLIError(`binary entrypoint cannot point to environment artifact: ${epName}`);\n }\n\n list.set(epName, {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n\n if (!ep.docker) {\n if (artifacts.dockerAutogenTypes.includes(artifact.type)) {\n switch (artifact.type) {\n case \"conda\":\n case \"python\":\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: this.generateDockerPackage(artifact),\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n continue;\n default: {\n throw new Error(`docker autogeneration is not defined for type: ${artifact.type}`);\n }\n }\n }\n }\n }\n\n if (ep.environment) {\n const packageID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n list.set(epName, {\n type: \"environment\",\n name: epName,\n artifact: this.getArtifact(packageID, \"environment\"),\n env: ep.environment.envVars ?? [],\n });\n continue;\n }\n\n if (ep.asset) {\n const packageID = typeof ep.asset === \"string\" ? ep.asset : epName;\n list.set(epName, {\n type: \"asset\",\n name: epName,\n artifact: this.getArtifact(packageID, \"asset\"),\n });\n continue;\n }\n\n if (list.size === 0) {\n throw util.CLIError(\n `entrypoint '${epName}' type is not supported by current platforma package builder`,\n );\n }\n }\n\n return list;\n }\n\n // Get not docker entrypoint if exists.\n // If only docker entrypoint exists, return it.\n public getMainEntrypoint(name: string): entrypoints.Entrypoint {\n const ep = this.entrypoints.get(name);\n if (ep) {\n return ep;\n }\n\n return this.entrypoints.get(docker.entrypointName(name))!;\n }\n\n /**\n * Resolves entrypoint reference to full entrypoint file path and type\n */\n public resolveReference(epName: string, ep: entrypoints.ReferenceEntrypoint): string {\n this.logger.debug(\n `resolving entrypoint '${epName}' reference '${ep.reference}'. packageRoot='${this.packageRoot}'`,\n );\n\n const refInfo = ep.reference.match(entrypoints.EnyrypointReferencePattern)?.groups;\n\n if (!refInfo) {\n this.logger.error(\n `entrypoint reference '${epName}' has incorrect reference format. <full package name>/<path to entrypoint> is expected`,\n );\n throw util.CLIError(`invalid entrypoint '${epName}' reference format`);\n }\n\n const refPath = tryResolve(this.packageRoot, ep.reference);\n if (!refPath) {\n this.logger.error(`entrypoint reference '${epName}' cannot be resolved into file path`);\n throw util.CLIError(`invalid entrypoint '${epName}' reference`);\n }\n\n return refPath;\n }\n\n // Packages are buildable artifacts with entrypoints\n get packages(): Map<string, artifacts.withId<artifacts.anyArtifactType>> {\n const result = new Map<string, artifacts.withId<artifacts.anyArtifactType>>();\n\n for (const ep of this.entrypoints.values()) {\n if (ep.type === \"reference\") {\n // Entrypoint references are not buildable\n continue;\n }\n\n if (!result.has(ep.artifact.id)) {\n result.set(ep.artifact.id, ep.artifact);\n }\n }\n\n return result;\n }\n\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"docker\",\n platform: util.ArchType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\",\n platform?: util.PlatformType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\" | \"docker\",\n platform?: util.PlatformType | util.ArchType,\n ): string {\n const platformPart = platform ? `_${platform}` : \"\";\n return path.resolve(\n this.packageRoot,\n \"dist\",\n \"artifacts\",\n pkgID,\n `${artifactType}${platformPart}.json`,\n );\n }\n\n private generateDockerPackage(\n artifact: artifacts.withId<artifacts.pythonType | artifacts.condaType>,\n ): artifacts.withId<artifacts.dockerType> {\n switch (artifact.type) {\n case \"python\": {\n const options = pythonDockerOptions(\n this.logger,\n this.packageRoot,\n this.packageName,\n artifact.id,\n artifact,\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n case \"conda\": {\n const options = condaDockerOptions(\n this.logger,\n this.packageRoot,\n artifact.id,\n artifact,\n util.currentArch(),\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n default: {\n util.assertNever(artifact);\n throw new Error(\"calm down the linter\");\n }\n }\n }\n\n public getArtifact(\n id: string,\n type: \"asset\",\n ): artifacts.withId<artifacts.withType<\"asset\", artifacts.assetType>>;\n public getArtifact(id: string, type: \"environment\"): artifacts.withId<artifacts.environmentType>;\n public getArtifact(id: string, type: \"binary\"): artifacts.withId<artifacts.binaryType>;\n public getArtifact(id: string, type: \"java\"): artifacts.withId<artifacts.javaType>;\n public getArtifact(id: string, type: \"python\"): artifacts.withId<artifacts.pythonType>;\n public getArtifact(id: string, type: \"R\"): artifacts.withId<artifacts.rType>;\n public getArtifact(id: string, type: \"docker\"): artifacts.withId<artifacts.dockerType>;\n public getArtifact(id: string, type: \"conda\"): artifacts.withId<artifacts.condaType>;\n public getArtifact(id: string, type: \"any\"): artifacts.withId<artifacts.anyArtifactType>;\n public getArtifact(\n id: string,\n type: artifacts.artifactType | \"any\",\n ): artifacts.withId<artifacts.anyArtifactType> {\n const artifacts = this.pkgJson[\"block-software\"].artifacts ?? {};\n const entrypoints = this.pkgJson[\"block-software\"].entrypoints;\n\n let artifact: artifacts.anyArtifactType | undefined;\n let errMsg = \"\";\n if (artifacts[id]) {\n artifact = artifacts[id];\n } else {\n const ep = entrypoints[id];\n if (!ep) {\n throw util.CLIError(\n `artifact with id '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n errMsg = `incorrect artifact reference in entrypoint '${id}'`;\n\n if (ep.asset) {\n artifact =\n typeof ep.asset === \"string\"\n ? artifacts[ep.asset]\n : ({ type: \"asset\", ...ep.asset } as artifacts.assetType);\n } else if (ep.binary && type !== \"docker\") {\n // single entrypoint can keep both binary and docker\n const a = ep.binary.artifact;\n artifact = typeof a === \"string\" ? artifacts[a] : a;\n } else if (ep.conda && type !== \"docker\") {\n // single entrypoint can keep both conda and docker\n const a = ep.conda.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"conda\", ...a } as artifacts.condaType);\n } else if (ep.environment) {\n const a = ep.environment.artifact;\n artifact =\n typeof a === \"string\"\n ? artifacts[a]\n : ({ type: \"environment\", ...a } as artifacts.environmentType);\n } else if (ep.docker) {\n const a = ep.docker.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"docker\", ...a } as artifacts.dockerType);\n }\n }\n\n if (!artifact) {\n throw util.CLIError(\n `artifact '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n switch (type) {\n case \"docker\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"docker\", errMsg),\n };\n }\n case \"asset\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"asset\", errMsg),\n };\n }\n case \"environment\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"environment\", errMsg),\n };\n }\n case \"binary\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"binary\", errMsg),\n };\n }\n case \"java\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"java\", errMsg),\n };\n }\n case \"python\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"python\", errMsg),\n };\n }\n case \"R\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"R\", errMsg),\n };\n }\n case \"conda\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"conda\", errMsg),\n };\n }\n case \"any\": {\n return {\n id: id,\n ...artifact,\n };\n }\n default: {\n util.assertNever(type);\n throw util.CLIError(`invalid artifact type`); // calm down the linter\n }\n }\n }\n\n public set version(v: string | undefined) {\n this._versionOverride = v;\n }\n\n public artifactName(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (artifact.type !== \"docker\") {\n if (artifact.name) {\n return artifact.name;\n }\n }\n\n return util.trimPrefix(this.pkgJson.name, \"@\") + \"/\" + artifact.id;\n }\n\n public artifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n const base = this.baseArtifactVersion(artifact);\n\n if (util.isDevMode(this.buildMode) && artifact.type !== \"docker\") {\n const hash = this.devContentHash(artifact);\n if (hash) {\n return `${base}-${hash}`;\n }\n }\n\n return base;\n }\n\n private baseArtifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (this._versionOverride) {\n return this._versionOverride;\n }\n\n if (process.env[envs.PL_PKG_VERSION]) {\n return process.env[envs.PL_PKG_VERSION];\n }\n\n if (artifact.type !== \"docker\" && artifact.version) {\n return artifact.version;\n }\n\n return this.pkgJson.version;\n }\n\n /**\n * Short content hash of the artifact's content root(s), used as the dev version suffix.\n */\n private readonly devContentHashCache = new Map<string, string | undefined>();\n\n private devContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n // Content roots are stable for the lifetime of this builder, so hash each artifact once.\n if (this.devContentHashCache.has(artifact.id)) {\n return this.devContentHashCache.get(artifact.id);\n }\n\n const hash = this.computeDevContentHash(artifact);\n this.devContentHashCache.set(artifact.id, hash);\n return hash;\n }\n\n private computeDevContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n const hasher = createHash(\"sha256\");\n let hashedAny = false;\n\n let platforms: util.PlatformType[];\n try {\n // Sorted so the hash is independent of package.json root-key order.\n platforms = this.artifactPlatforms(artifact).toSorted();\n } catch {\n return undefined; // no content roots at all — leave the version without a suffix\n }\n\n for (const platform of platforms) {\n let root: string;\n try {\n root = this.artifactContentRoot(artifact, platform);\n } catch {\n continue; // platform without a defined/present root — skip\n }\n if (!fs.existsSync(root)) {\n continue;\n }\n // Hash the platform name too, so the same files under a different platform yield a different\n // hash.\n hasher.update(platform);\n util.hashDirSync(root, hasher);\n hashedAny = true;\n }\n\n return hashedAny ? hasher.digest(\"hex\").slice(0, 12) : undefined;\n }\n\n public artifactRegistrySettings(artifact: artifacts.anyArtifactType): artifacts.registry {\n if (artifact.type === \"docker\") {\n return {\n name: artifact.registry,\n };\n }\n\n const registry = artifact.registry;\n const registries = this.binaryRegistries;\n\n const result: artifacts.registry = {\n name: \"default\",\n downloadURL: registries.default?.downloadURL,\n storageURL: registries.default?.storageURL,\n };\n\n if (registry) {\n if (typeof registry === \"string\") {\n result.name = registry;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL = registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL = registries[result.name]?.storageURL ?? regDefault?.storageURL;\n } else {\n result.name = registry.name;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL =\n registry.downloadURL ?? registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL =\n registry.storageURL ?? registries[result.name]?.storageURL ?? regDefault?.storageURL;\n }\n }\n\n const regNameUpper = result.name.toUpperCase().replaceAll(/[^A-Z0-9_]/g, \"_\");\n\n const uploadTo = process.env[`PL_REGISTRY_${regNameUpper}_UPLOAD_URL`];\n if (uploadTo) {\n result.storageURL = uploadTo;\n }\n\n const downloadFrom = process.env[`PL_REGISTRY_${regNameUpper}_DOWNLOAD_URL`];\n if (downloadFrom) {\n result.downloadURL = downloadFrom;\n }\n\n // Dev channel: the embedded binary registry is the built-in `midev` uploading to its built-in\n // endpoint, flipping to `dev` and `PL_DEV_BINARY_UPLOAD_URL` when that is set.\n if (util.isDevMode(this.buildMode)) {\n const devUpload = process.env[envs.PL_DEV_BINARY_UPLOAD_URL];\n result.name = devUpload\n ? defaults.DEV_BIN_REGISTRY_NAME_OVERRIDDEN\n : defaults.DEV_BIN_REGISTRY_NAME;\n result.storageURL = devUpload ?? defaults.DEV_BINARY_UPLOAD_TARGET;\n } else {\n const releaseUpload = process.env[envs.PL_RELEASE_BINARY_UPLOAD_URL];\n if (releaseUpload) {\n result.storageURL = releaseUpload;\n }\n }\n\n if (result.downloadURL) {\n const u = new URL(result.downloadURL, \"file:/nonexistent\"); // check download URL is valid URL\n if (![\"https:\", \"http:\"].includes(u.protocol)) {\n throw util.CLIError(\n `registry ${result.name} download URL is not valid. Only 'https://' and 'http://' schemes are supported for now`,\n );\n }\n }\n\n return result;\n }\n\n public artifactContentRoot(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n if (\"root\" in artifact && artifact.root) {\n return path.resolve(this.packageRoot, artifact.root);\n }\n if (\"roots\" in artifact && artifact.roots[platform]) {\n return path.resolve(this.packageRoot, artifact.roots[platform]);\n }\n\n throw util.CLIError(\n `root path of software archive on ${platform} is undefined for binary package`,\n );\n }\n\n public artifactPlatforms(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): util.PlatformType[] {\n if (artifact.type === \"docker\") {\n return [util.currentPlatform()];\n }\n\n if (\"root\" in artifact && artifact.root) {\n return [util.currentPlatform()];\n }\n\n if (\"roots\" in artifact) {\n return Object.keys(artifact.roots) as util.PlatformType[];\n }\n\n throw util.CLIError(\n `no platforms are defined as supported for artifact '${artifact.id}' in binary mode ` +\n `(no 'roots' are defined)`,\n );\n }\n\n public artifactArchiveFullName(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n const { os, arch } = util.splitPlatform(platform);\n return `${group}/${name}/${version}-${os}-${arch}.${extension}`;\n }\n\n public artifactArchiveAddressPattern(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n return `${group}/${name}/${version}-{os}-{arch}.${extension}`;\n }\n\n private validateConfig() {\n let hasErrors: boolean = false;\n\n const blockSoftware = this.pkgJson[\"block-software\"];\n\n const as = blockSoftware.artifacts ?? {};\n const entrypoints = blockSoftware.entrypoints ?? {};\n\n for (const [epName, ep] of Object.entries(entrypoints)) {\n if (ep.binary) {\n const artifactID = typeof ep.binary.artifact === \"string\" ? ep.binary.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (!artifacts.isBuildable(artifact.type)) {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' is not buildable to binary package`,\n );\n hasErrors = true;\n }\n\n if (artifact.type === \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' cannot be build into software pacakge. Use 'environment' entrypoint`,\n );\n hasErrors = true;\n }\n }\n\n if (ep.environment) {\n const artifactID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (artifact.type !== \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' with 'environment' settings should refer to 'environment' artifact type`,\n );\n hasErrors = true;\n }\n }\n\n // TODO: add docker validation here\n // TODO(rfiskov)[MILAB-3163]: Carefully handle docker artifacts, as some (e.g., for Python) may be autogenerated dynamically rather than explicitly defined.\n }\n\n const uniquePackageNames = new Set<string>();\n\n for (const [artifactID, artifact] of Object.entries(as)) {\n if (!artifacts.isBuildable(artifact.type)) {\n continue;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n const withId = { id: artifactID, ...artifact };\n const name = this.artifactName(withId);\n const version = this.artifactVersion(withId);\n const uniqueName = `${name}-${version}`;\n if (uniquePackageNames.has(uniqueName)) {\n this.logger.error(\n `found two packages with the same name '${name}' and version '${version}'`,\n );\n hasErrors = true;\n }\n\n uniquePackageNames.add(uniqueName);\n }\n\n if (hasErrors) {\n throw util.CLIError(\n `${util.softwareConfigName} has xconfiguration errors in 'block-software' section. See error log messages above for details`,\n );\n }\n }\n\n private validateArtifact(artifactName: string, artifact: artifacts.anyArtifactType): boolean {\n if (artifacts.isBuildable(artifact.type)) {\n // Validate that root is not equal to package root\n const resolvedRoots: string[] = [];\n const aType = artifact.type;\n switch (aType) {\n case \"asset\":\n case \"java\":\n case \"R\":\n case \"python\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.root));\n break;\n }\n case \"docker\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.context));\n break;\n }\n case \"environment\":\n case \"conda\":\n case \"binary\": {\n resolvedRoots.push(\n ...Object.values(artifact.roots).map((root) => path.resolve(this.packageRoot, root)),\n );\n break;\n }\n default:\n util.assertNever(aType);\n }\n\n for (const root of resolvedRoots) {\n if (root === this.packageRoot) {\n this.logger.error(\n `Invalid configuration: '${artifact.type}' artifact '${artifactName}' has 'root' set to the package root, which is not allowed`,\n );\n return false;\n }\n }\n }\n\n return true;\n }\n}\n\nfunction parsePackageJson(data: string): z.ZodSafeParseResult<packageJson> {\n const parsedData: unknown = JSON.parse(data);\n return packageJsonSchema.safeParse(parsedData);\n}\n\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"asset\",\n errMsg: string,\n): artifacts.withType<\"asset\", artifacts.assetType>;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"environment\",\n errMsg: string,\n): artifacts.environmentType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"java\",\n errMsg: string,\n): artifacts.javaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"python\",\n errMsg: string,\n): artifacts.pythonType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"R\",\n errMsg: string,\n): artifacts.rType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"binary\",\n errMsg: string,\n): artifacts.binaryType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"docker\",\n errMsg: string,\n): artifacts.dockerType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"conda\",\n errMsg: string,\n): artifacts.condaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: artifacts.artifactType,\n errMsg: string,\n): artifacts.anyArtifactType {\n if (artifact.type === type) {\n return artifact;\n }\n\n if (errMsg) {\n errMsg = `${errMsg}: `;\n }\n\n throw util.CLIError(`${errMsg}wrong artifact type: expected '${type}', got '${artifact.type}'`);\n}\n"],"mappings":"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"}
@@ -1,16 +1,15 @@
1
- import { ArchType, BuildMode, PlatformType } from "./util.js";
2
- import { anyArtifactType, assetType, binaryType, condaType, dockerType, environmentType, javaType, pythonType, rType, registry, withId, withType } from "./schemas/artifacts.js";
3
- import { Entrypoint, ReferenceEntrypoint } from "./schemas/entrypoints.js";
1
+ import { ArchType, BuildMode, PlatformType, util_d_exports } from "./util.js";
2
+ import { anyArtifactType, artifacts_d_exports, assetType, binaryType, condaType, dockerType, environmentType, javaType, pythonType, rType, registry, withId, withType } from "./schemas/artifacts.js";
3
+ import { Entrypoint, ReferenceEntrypoint, entrypoints_d_exports } from "./schemas/entrypoints.js";
4
4
  import { z } from "zod/v4";
5
5
  import winston from "winston";
6
-
7
6
  //#region src/core/package-info.d.ts
8
7
  declare const binaryRegistryPresetsSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
9
8
  downloadURL: z.ZodOptional<z.ZodString>;
10
9
  storageURL: z.ZodOptional<z.ZodString>;
11
10
  }, z.core.$strip>>;
12
11
  type binaryRegistryPresets = z.infer<typeof binaryRegistryPresetsSchema>;
13
- declare class PackageInfo {
12
+ export declare class PackageInfo {
14
13
  private logger;
15
14
  readonly packageRoot: string;
16
15
  readonly packageName: string;
@@ -23,6 +22,8 @@ declare class PackageInfo {
23
22
  pkgJsonData?: string;
24
23
  });
25
24
  get isPrivate(): boolean;
25
+ /** Whether every software entrypoint of this package must ship a docker image. */
26
+ get requireDocker(): boolean;
26
27
  get binaryRegistries(): binaryRegistryPresets;
27
28
  get entrypoints(): Map<string, Entrypoint>;
28
29
  getMainEntrypoint(name: string): Entrypoint;
@@ -62,5 +63,4 @@ declare class PackageInfo {
62
63
  private validateArtifact;
63
64
  }
64
65
  //#endregion
65
- export { PackageInfo };
66
66
  //# sourceMappingURL=package-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-info.d.ts","names":[],"sources":["../../src/core/package-info.ts"],"mappings":";;;;;;;cAsBM,2BAAA,EAA2B,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,SAAA;;;;KAC5B,qBAAA,GAAwB,CAAA,CAAE,KAAK,QAAQ,2BAAA;AAAA,cA0D/B,WAAA;EAAA,QAWD,MAAA;EAAA,SAVM,WAAA;EAAA,SACA,WAAA;EAAA,iBAEC,OAAA;EAAA,QACT,gBAAA;EAhEuB;EAmExB,SAAA,EAAW,SAAA;cAGR,MAAA,EAAQ,OAAA,CAAQ,MAAA,EACxB,OAAA;IACE,WAAA;IACA,WAAA;EAAA;EAAA,IAoCA,SAAA;EAAA,IAIA,gBAAA,IAAoB,qBAAA;EAAA,IAIpB,WAAA,IAAe,GAAA,SAAY,UAAA;EAuGxB,iBAAA,CAAkB,IAAA,WAAe,UAAA;;;;EAYjC,gBAAA,CAAiB,MAAA,UAAgB,EAAA,EAAI,mBAAA;EAAA,IAwBxC,QAAA,IAAY,GAAA,SAAY,MAAA,CAAiB,eAAA;EAiBtC,oBAAA,CACL,KAAA,UACA,YAAA,YACA,QAAA,EAAU,QAAA;EAEL,oBAAA,CACL,KAAA,UACA,YAAA,aACA,QAAA,GAAW,YAAA;EAAA,QAiBL,qBAAA;EA2CD,WAAA,CACL,EAAA,UACA,IAAA,YACC,MAAA,CAAiB,QAAA,UAA4B,SAAA;EACzC,WAAA,CAAY,EAAA,UAAY,IAAA,kBAAsB,MAAA,CAAiB,eAAA;EAC/D,WAAA,CAAY,EAAA,UAAY,IAAA,aAAiB,MAAA,CAAiB,UAAA;EAC1D,WAAA,CAAY,EAAA,UAAY,IAAA,WAAe,MAAA,CAAiB,QAAA;EACxD,WAAA,CAAY,EAAA,UAAY,IAAA,aAAiB,MAAA,CAAiB,UAAA;EAC1D,WAAA,CAAY,EAAA,UAAY,IAAA,QAAY,MAAA,CAAiB,KAAA;EACrD,WAAA,CAAY,EAAA,UAAY,IAAA,aAAiB,MAAA,CAAiB,UAAA;EAC1D,WAAA,CAAY,EAAA,UAAY,IAAA,YAAgB,MAAA,CAAiB,SAAA;EACzD,WAAA,CAAY,EAAA,UAAY,IAAA,UAAc,MAAA,CAAiB,eAAA;EAAA,IAqHnD,OAAA,CAAQ,CAAA;EAIZ,YAAA,CAAa,QAAA,EAAU,MAAA,CAAiB,eAAA;EAUxC,eAAA,CAAgB,QAAA,EAAU,MAAA,CAAiB,eAAA;EAAA,QAa1C,mBAAA;EA/ekC;;AAA2B;EAA3B,iBAkgBzB,mBAAA;EAAA,QAET,cAAA;EAAA,QAaA,qBAAA;EAkCD,wBAAA,CAAyB,QAAA,EAAU,eAAA,GAA4B,QAAA;EAuE/D,mBAAA,CACL,QAAA,EAAU,MAAA,CAAiB,eAAA,GAC3B,QAAA,EAAU,YAAA;EAcL,iBAAA,CACL,QAAA,EAAU,MAAA,CAAiB,eAAA,IAC1B,YAAA;EAmBI,uBAAA,CACL,QAAA,EAAU,MAAA,CAAiB,eAAA,GAC3B,QAAA,EAAU,YAAA;EAeL,6BAAA,CACL,QAAA,EAAU,MAAA,CAAiB,eAAA;EAAA,QAcrB,cAAA;EAAA,QAmGA,gBAAA;AAAA"}
1
+ {"version":3,"file":"package-info.d.ts","names":[],"sources":["../../src/core/package-info.ts"],"mappings":";;;;;;cAsBM,6BAA2B,EAAA,UAAA,EAAA,WAAA,EAAA;;;;KAC5B,wBAAwB,EAAE,aAAa;qBAgE/B;UAWD;WAVM;WACA;mBAEC;UACT;;EAGD,WAAW;EAElB,YACU,QAAQ,QAAQ,QACxB;IACE;IACA;;MAoCA;;MAKA;MAIA,oBAAoB;MAIpB,eAAe,YAAY;EAuGxB,kBAAkB,eAAe;;;;EAYjC,iBAAiB,gBAAgB,IAAI;MAwBxC,YAAY,YAAY,OAAiB;EAiBtC,qBACL,eACA,wBACA,UAAU;EAEL,qBACL,eACA,yBACA,WAAW;UAiBL;EA2CD,YACL,YACA,gBACC,OAAiB,kBAA4B;EACzC,YAAY,YAAY,sBAAsB,OAAiB;EAC/D,YAAY,YAAY,iBAAiB,OAAiB;EAC1D,YAAY,YAAY,eAAe,OAAiB;EACxD,YAAY,YAAY,iBAAiB,OAAiB;EAC1D,YAAY,YAAY,YAAY,OAAiB;EACrD,YAAY,YAAY,iBAAiB,OAAiB;EAC1D,YAAY,YAAY,gBAAgB,OAAiB;EACzD,YAAY,YAAY,cAAc,OAAiB;MAqHnD,QAAQ;EAIZ,aAAa,UAAU,OAAiB;EAUxC,gBAAgB,UAAU,OAAiB;UAa1C;;;;mBAmBS;UAET;UAaA;EAkCD,yBAAyB,UAAU,kBAA4B;EAuE/D,oBACL,UAAU,OAAiB,kBAC3B,UAAU;EAcL,kBACL,UAAU,OAAiB,mBAC1B;EAmBI,wBACL,UAAU,OAAiB,kBAC3B,UAAU;EAeL,8BACL,UAAU,OAAiB;UAcrB;UAmGA"}
@@ -24,7 +24,8 @@ const packageJsonSchema = z.object({
24
24
  "block-software": z.object({
25
25
  registries: z.object({ binary: binaryRegistryPresetsSchema.optional() }).optional(),
26
26
  artifacts: artifactIndexSchema.optional(),
27
- entrypoints: entrypointListSchema
27
+ entrypoints: entrypointListSchema,
28
+ requireDocker: z.boolean().optional()
28
29
  })
29
30
  });
30
31
  const wellKnownRegistries = { [BIN_REGISTRY_NAME]: { downloadURL: BIN_REGISTRY_DOWNLOAD_URL } };
@@ -62,6 +63,10 @@ var PackageInfo = class {
62
63
  get isPrivate() {
63
64
  return this.pkgJson.private ?? false;
64
65
  }
66
+ /** Whether every software entrypoint of this package must ship a docker image. */
67
+ get requireDocker() {
68
+ return this.pkgJson["block-software"].requireDocker ?? true;
69
+ }
65
70
  get binaryRegistries() {
66
71
  return this.pkgJson["block-software"].registries?.binary ?? {};
67
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"package-info.js","names":["entrypoints.entrypointListSchema","defaults.BIN_REGISTRY_NAME","defaults.BIN_REGISTRY_DOWNLOAD_URL","util.findPackageRoot","path","util.packageJsonName","fs","util.CLIError","util.formatZodIssues","docker.entrypointName","entrypoints.EnyrypointReferencePattern","pythonDockerOptions","condaDockerOptions","util.currentArch","util.trimPrefix","util.isDevMode","envs.PL_PKG_VERSION","envs.PL_DEV_BINARY_UPLOAD_URL","defaults.DEV_BIN_REGISTRY_NAME","envs.PL_RELEASE_BINARY_UPLOAD_URL","util.currentPlatform","artifacts.isCrossPlatform","util.splitPlatform","util.softwareConfigName","artifacts.isBuildable"],"sources":["../../src/core/package-info.ts"],"sourcesContent":["import * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport type winston from \"winston\";\nimport { z } from \"zod/v4\";\n\nimport * as defaults from \"../defaults\";\nimport * as util from \"./util\";\nimport * as envs from \"./envs\";\nimport * as artifacts from \"./schemas/artifacts\";\nimport * as entrypoints from \"./schemas/entrypoints\";\nimport { tryResolve } from \"@milaboratories/resolve-helper\";\nimport * as docker from \"./docker\";\nimport { prepareDockerOptions as pythonDockerOptions } from \"./docker-python\";\nimport { prepareDockerOptions as condaDockerOptions } from \"./docker-conda\";\n\nconst storagePresetSchema = z.object({\n downloadURL: z.string().optional(),\n storageURL: z.string().optional(),\n});\ntype storagePreset = z.infer<typeof storagePresetSchema>;\n\nconst binaryRegistryPresetsSchema = z.record(z.string(), storagePresetSchema);\ntype binaryRegistryPresets = z.infer<typeof binaryRegistryPresetsSchema>;\n\nconst packageJsonSchema = z.object({\n name: z.string(),\n version: z.string(),\n private: z.boolean().optional(),\n\n \"block-software\": z.object({\n registries: z\n .object({\n binary: binaryRegistryPresetsSchema.optional(),\n })\n .optional(),\n\n artifacts: artifacts.artifactIndexSchema.optional(),\n entrypoints: entrypoints.entrypointListSchema,\n }),\n});\ntype packageJson = z.infer<typeof packageJsonSchema>;\n\nconst wellKnownRegistries: Record<string, storagePreset> = {\n [defaults.BIN_REGISTRY_NAME]: {\n downloadURL: defaults.BIN_REGISTRY_DOWNLOAD_URL,\n },\n};\n\n/*\n * package.json -> block-software structure example:\n * {\n * \"block-software\": {\n * \"registries\": {\n * \"binary\": {\n * \"default\": { \"uploadURL\": \"s3://<bucket>/<some-prefix>?region=<region-name>\" }\n * }\n * },\n *\n * \"artifacts\": {\n * \"pkg-1\": {\n * \"type\": \"binary\",\n * \"roots\": {\n * \"linux-x64\": \"./linux-x64/src\",\n * \"linux-aarch64\": \"./linux-aarch/src\",\n * \"...and so on...\": \"platform-dependant roots\",\n * }\n * }\n * }\n *\n * \"entrypoints\": {\n * \"script1\": {\n * \"software\": {\n * \"artifact\": \"pkg-1\",\n * \"cmd\": [ \"{pkg}/script1\" ]\n * }\n * }\n * }\n * }\n * }\n */\nexport class PackageInfo {\n public readonly packageRoot: string;\n public readonly packageName: string;\n\n private readonly pkgJson: packageJson;\n private _versionOverride: string | undefined;\n\n /** Backing store for `Core.buildMode` (Core delegates its accessor here); gates content-addressable dev naming. */\n public buildMode: util.BuildMode = \"release\";\n\n constructor(\n private logger: winston.Logger,\n options?: {\n packageRoot?: string;\n pkgJsonData?: string;\n },\n ) {\n this.logger.debug(\"Reading package information...\");\n\n this.packageRoot = options?.packageRoot ?? util.findPackageRoot(logger);\n\n let pkgJsonData: string;\n if (options?.pkgJsonData) {\n pkgJsonData = options.pkgJsonData;\n } else {\n const pkgJsonPath = path.resolve(this.packageRoot, util.packageJsonName);\n\n this.logger.debug(` - loading '${pkgJsonPath}'`);\n if (!fs.existsSync(pkgJsonPath)) {\n this.logger.error(`no '${util.packageJsonName}' file found at '${this.packageRoot}'`);\n throw util.CLIError(\"not a platform software package directory\");\n }\n\n pkgJsonData = fs.readFileSync(pkgJsonPath, \"utf8\");\n }\n\n const result = parsePackageJson(pkgJsonData);\n if (!result.success) {\n throw util.CLIError(`\\n` + util.formatZodIssues(result.error.issues));\n }\n this.pkgJson = result.data;\n this.logger.debug(\" \" + JSON.stringify(this.pkgJson));\n\n this.validateConfig();\n\n this.packageName = this.pkgJson.name;\n\n logger.debug(\" package information loaded successfully.\");\n }\n\n get isPrivate(): boolean {\n return this.pkgJson.private ?? false;\n }\n\n get binaryRegistries(): binaryRegistryPresets {\n return this.pkgJson[\"block-software\"].registries?.binary ?? {};\n }\n\n get entrypoints(): Map<string, entrypoints.Entrypoint> {\n const list = new Map<string, entrypoints.Entrypoint>();\n\n for (const [epName, ep] of Object.entries(this.pkgJson[\"block-software\"].entrypoints)) {\n if (ep.docker) {\n const artifactID = typeof ep.docker.artifact === \"string\" ? ep.docker.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"docker\");\n\n // will mix docker to separate entrypoint\n // render function have to merge\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: ep.docker.cmd ?? [],\n env: ep.docker.envVars ?? [],\n });\n }\n\n if (ep.reference) {\n list.set(epName, {\n type: \"reference\",\n name: epName,\n reference: ep.reference,\n });\n continue;\n }\n\n if (ep.binary || ep.conda) {\n const swOptions: entrypoints.softwareOptionsType = ep.binary ? ep.binary : ep.conda!;\n const artifactOrRef = ep.binary ? ep.binary.artifact : ep.conda!.artifact;\n const artifactID = typeof artifactOrRef === \"string\" ? artifactOrRef : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n if (artifact.type === \"asset\") {\n throw util.CLIError(`binary entrypoint cannot point to asset artifact: ${epName}`);\n }\n if (artifact.type === \"environment\") {\n throw util.CLIError(`binary entrypoint cannot point to environment artifact: ${epName}`);\n }\n\n list.set(epName, {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n\n if (!ep.docker) {\n if (artifacts.dockerAutogenTypes.includes(artifact.type)) {\n switch (artifact.type) {\n case \"conda\":\n case \"python\":\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: this.generateDockerPackage(artifact),\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n continue;\n default: {\n throw new Error(`docker autogeneration is not defined for type: ${artifact.type}`);\n }\n }\n }\n }\n }\n\n if (ep.environment) {\n const packageID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n list.set(epName, {\n type: \"environment\",\n name: epName,\n artifact: this.getArtifact(packageID, \"environment\"),\n env: ep.environment.envVars ?? [],\n });\n continue;\n }\n\n if (ep.asset) {\n const packageID = typeof ep.asset === \"string\" ? ep.asset : epName;\n list.set(epName, {\n type: \"asset\",\n name: epName,\n artifact: this.getArtifact(packageID, \"asset\"),\n });\n continue;\n }\n\n if (list.size === 0) {\n throw util.CLIError(\n `entrypoint '${epName}' type is not supported by current platforma package builder`,\n );\n }\n }\n\n return list;\n }\n\n // Get not docker entrypoint if exists.\n // If only docker entrypoint exists, return it.\n public getMainEntrypoint(name: string): entrypoints.Entrypoint {\n const ep = this.entrypoints.get(name);\n if (ep) {\n return ep;\n }\n\n return this.entrypoints.get(docker.entrypointName(name))!;\n }\n\n /**\n * Resolves entrypoint reference to full entrypoint file path and type\n */\n public resolveReference(epName: string, ep: entrypoints.ReferenceEntrypoint): string {\n this.logger.debug(\n `resolving entrypoint '${epName}' reference '${ep.reference}'. packageRoot='${this.packageRoot}'`,\n );\n\n const refInfo = ep.reference.match(entrypoints.EnyrypointReferencePattern)?.groups;\n\n if (!refInfo) {\n this.logger.error(\n `entrypoint reference '${epName}' has incorrect reference format. <full package name>/<path to entrypoint> is expected`,\n );\n throw util.CLIError(`invalid entrypoint '${epName}' reference format`);\n }\n\n const refPath = tryResolve(this.packageRoot, ep.reference);\n if (!refPath) {\n this.logger.error(`entrypoint reference '${epName}' cannot be resolved into file path`);\n throw util.CLIError(`invalid entrypoint '${epName}' reference`);\n }\n\n return refPath;\n }\n\n // Packages are buildable artifacts with entrypoints\n get packages(): Map<string, artifacts.withId<artifacts.anyArtifactType>> {\n const result = new Map<string, artifacts.withId<artifacts.anyArtifactType>>();\n\n for (const ep of this.entrypoints.values()) {\n if (ep.type === \"reference\") {\n // Entrypoint references are not buildable\n continue;\n }\n\n if (!result.has(ep.artifact.id)) {\n result.set(ep.artifact.id, ep.artifact);\n }\n }\n\n return result;\n }\n\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"docker\",\n platform: util.ArchType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\",\n platform?: util.PlatformType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\" | \"docker\",\n platform?: util.PlatformType | util.ArchType,\n ): string {\n const platformPart = platform ? `_${platform}` : \"\";\n return path.resolve(\n this.packageRoot,\n \"dist\",\n \"artifacts\",\n pkgID,\n `${artifactType}${platformPart}.json`,\n );\n }\n\n private generateDockerPackage(\n artifact: artifacts.withId<artifacts.pythonType | artifacts.condaType>,\n ): artifacts.withId<artifacts.dockerType> {\n switch (artifact.type) {\n case \"python\": {\n const options = pythonDockerOptions(\n this.logger,\n this.packageRoot,\n this.packageName,\n artifact.id,\n artifact,\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n case \"conda\": {\n const options = condaDockerOptions(\n this.logger,\n this.packageRoot,\n artifact.id,\n artifact,\n util.currentArch(),\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n default: {\n util.assertNever(artifact);\n throw new Error(\"calm down the linter\");\n }\n }\n }\n\n public getArtifact(\n id: string,\n type: \"asset\",\n ): artifacts.withId<artifacts.withType<\"asset\", artifacts.assetType>>;\n public getArtifact(id: string, type: \"environment\"): artifacts.withId<artifacts.environmentType>;\n public getArtifact(id: string, type: \"binary\"): artifacts.withId<artifacts.binaryType>;\n public getArtifact(id: string, type: \"java\"): artifacts.withId<artifacts.javaType>;\n public getArtifact(id: string, type: \"python\"): artifacts.withId<artifacts.pythonType>;\n public getArtifact(id: string, type: \"R\"): artifacts.withId<artifacts.rType>;\n public getArtifact(id: string, type: \"docker\"): artifacts.withId<artifacts.dockerType>;\n public getArtifact(id: string, type: \"conda\"): artifacts.withId<artifacts.condaType>;\n public getArtifact(id: string, type: \"any\"): artifacts.withId<artifacts.anyArtifactType>;\n public getArtifact(\n id: string,\n type: artifacts.artifactType | \"any\",\n ): artifacts.withId<artifacts.anyArtifactType> {\n const artifacts = this.pkgJson[\"block-software\"].artifacts ?? {};\n const entrypoints = this.pkgJson[\"block-software\"].entrypoints;\n\n let artifact: artifacts.anyArtifactType | undefined;\n let errMsg = \"\";\n if (artifacts[id]) {\n artifact = artifacts[id];\n } else {\n const ep = entrypoints[id];\n if (!ep) {\n throw util.CLIError(\n `artifact with id '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n errMsg = `incorrect artifact reference in entrypoint '${id}'`;\n\n if (ep.asset) {\n artifact =\n typeof ep.asset === \"string\"\n ? artifacts[ep.asset]\n : ({ type: \"asset\", ...ep.asset } as artifacts.assetType);\n } else if (ep.binary && type !== \"docker\") {\n // single entrypoint can keep both binary and docker\n const a = ep.binary.artifact;\n artifact = typeof a === \"string\" ? artifacts[a] : a;\n } else if (ep.conda && type !== \"docker\") {\n // single entrypoint can keep both conda and docker\n const a = ep.conda.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"conda\", ...a } as artifacts.condaType);\n } else if (ep.environment) {\n const a = ep.environment.artifact;\n artifact =\n typeof a === \"string\"\n ? artifacts[a]\n : ({ type: \"environment\", ...a } as artifacts.environmentType);\n } else if (ep.docker) {\n const a = ep.docker.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"docker\", ...a } as artifacts.dockerType);\n }\n }\n\n if (!artifact) {\n throw util.CLIError(\n `artifact '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n switch (type) {\n case \"docker\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"docker\", errMsg),\n };\n }\n case \"asset\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"asset\", errMsg),\n };\n }\n case \"environment\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"environment\", errMsg),\n };\n }\n case \"binary\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"binary\", errMsg),\n };\n }\n case \"java\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"java\", errMsg),\n };\n }\n case \"python\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"python\", errMsg),\n };\n }\n case \"R\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"R\", errMsg),\n };\n }\n case \"conda\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"conda\", errMsg),\n };\n }\n case \"any\": {\n return {\n id: id,\n ...artifact,\n };\n }\n default: {\n util.assertNever(type);\n throw util.CLIError(`invalid artifact type`); // calm down the linter\n }\n }\n }\n\n public set version(v: string | undefined) {\n this._versionOverride = v;\n }\n\n public artifactName(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (artifact.type !== \"docker\") {\n if (artifact.name) {\n return artifact.name;\n }\n }\n\n return util.trimPrefix(this.pkgJson.name, \"@\") + \"/\" + artifact.id;\n }\n\n public artifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n const base = this.baseArtifactVersion(artifact);\n\n if (util.isDevMode(this.buildMode) && artifact.type !== \"docker\") {\n const hash = this.devContentHash(artifact);\n if (hash) {\n return `${base}-${hash}`;\n }\n }\n\n return base;\n }\n\n private baseArtifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (this._versionOverride) {\n return this._versionOverride;\n }\n\n if (process.env[envs.PL_PKG_VERSION]) {\n return process.env[envs.PL_PKG_VERSION];\n }\n\n if (artifact.type !== \"docker\" && artifact.version) {\n return artifact.version;\n }\n\n return this.pkgJson.version;\n }\n\n /**\n * Short content hash of the artifact's content root(s), used as the dev version suffix.\n */\n private readonly devContentHashCache = new Map<string, string | undefined>();\n\n private devContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n // Content roots are stable for the lifetime of this builder, so hash each artifact once.\n if (this.devContentHashCache.has(artifact.id)) {\n return this.devContentHashCache.get(artifact.id);\n }\n\n const hash = this.computeDevContentHash(artifact);\n this.devContentHashCache.set(artifact.id, hash);\n return hash;\n }\n\n private computeDevContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n const hasher = createHash(\"sha256\");\n let hashedAny = false;\n\n let platforms: util.PlatformType[];\n try {\n // Sorted so the hash is independent of package.json root-key order.\n platforms = this.artifactPlatforms(artifact).toSorted();\n } catch {\n return undefined; // no content roots at all — leave the version without a suffix\n }\n\n for (const platform of platforms) {\n let root: string;\n try {\n root = this.artifactContentRoot(artifact, platform);\n } catch {\n continue; // platform without a defined/present root — skip\n }\n if (!fs.existsSync(root)) {\n continue;\n }\n // Hash the platform name too, so the same files under a different platform yield a different\n // hash.\n hasher.update(platform);\n util.hashDirSync(root, hasher);\n hashedAny = true;\n }\n\n return hashedAny ? hasher.digest(\"hex\").slice(0, 12) : undefined;\n }\n\n public artifactRegistrySettings(artifact: artifacts.anyArtifactType): artifacts.registry {\n if (artifact.type === \"docker\") {\n return {\n name: artifact.registry,\n };\n }\n\n const registry = artifact.registry;\n const registries = this.binaryRegistries;\n\n const result: artifacts.registry = {\n name: \"default\",\n downloadURL: registries.default?.downloadURL,\n storageURL: registries.default?.storageURL,\n };\n\n if (registry) {\n if (typeof registry === \"string\") {\n result.name = registry;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL = registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL = registries[result.name]?.storageURL ?? regDefault?.storageURL;\n } else {\n result.name = registry.name;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL =\n registry.downloadURL ?? registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL =\n registry.storageURL ?? registries[result.name]?.storageURL ?? regDefault?.storageURL;\n }\n }\n\n const regNameUpper = result.name.toUpperCase().replaceAll(/[^A-Z0-9_]/g, \"_\");\n\n const uploadTo = process.env[`PL_REGISTRY_${regNameUpper}_UPLOAD_URL`];\n if (uploadTo) {\n result.storageURL = uploadTo;\n }\n\n const downloadFrom = process.env[`PL_REGISTRY_${regNameUpper}_DOWNLOAD_URL`];\n if (downloadFrom) {\n result.downloadURL = downloadFrom;\n }\n\n // Dev channel: the embedded binary registry is the built-in `midev` uploading to its built-in\n // endpoint, flipping to `dev` and `PL_DEV_BINARY_UPLOAD_URL` when that is set.\n if (util.isDevMode(this.buildMode)) {\n const devUpload = process.env[envs.PL_DEV_BINARY_UPLOAD_URL];\n result.name = devUpload\n ? defaults.DEV_BIN_REGISTRY_NAME_OVERRIDDEN\n : defaults.DEV_BIN_REGISTRY_NAME;\n result.storageURL = devUpload ?? defaults.DEV_BINARY_UPLOAD_TARGET;\n } else {\n const releaseUpload = process.env[envs.PL_RELEASE_BINARY_UPLOAD_URL];\n if (releaseUpload) {\n result.storageURL = releaseUpload;\n }\n }\n\n if (result.downloadURL) {\n const u = new URL(result.downloadURL, \"file:/nonexistent\"); // check download URL is valid URL\n if (![\"https:\", \"http:\"].includes(u.protocol)) {\n throw util.CLIError(\n `registry ${result.name} download URL is not valid. Only 'https://' and 'http://' schemes are supported for now`,\n );\n }\n }\n\n return result;\n }\n\n public artifactContentRoot(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n if (\"root\" in artifact && artifact.root) {\n return path.resolve(this.packageRoot, artifact.root);\n }\n if (\"roots\" in artifact && artifact.roots[platform]) {\n return path.resolve(this.packageRoot, artifact.roots[platform]);\n }\n\n throw util.CLIError(\n `root path of software archive on ${platform} is undefined for binary package`,\n );\n }\n\n public artifactPlatforms(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): util.PlatformType[] {\n if (artifact.type === \"docker\") {\n return [util.currentPlatform()];\n }\n\n if (\"root\" in artifact && artifact.root) {\n return [util.currentPlatform()];\n }\n\n if (\"roots\" in artifact) {\n return Object.keys(artifact.roots) as util.PlatformType[];\n }\n\n throw util.CLIError(\n `no platforms are defined as supported for artifact '${artifact.id}' in binary mode ` +\n `(no 'roots' are defined)`,\n );\n }\n\n public artifactArchiveFullName(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n const { os, arch } = util.splitPlatform(platform);\n return `${group}/${name}/${version}-${os}-${arch}.${extension}`;\n }\n\n public artifactArchiveAddressPattern(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n return `${group}/${name}/${version}-{os}-{arch}.${extension}`;\n }\n\n private validateConfig() {\n let hasErrors: boolean = false;\n\n const blockSoftware = this.pkgJson[\"block-software\"];\n\n const as = blockSoftware.artifacts ?? {};\n const entrypoints = blockSoftware.entrypoints ?? {};\n\n for (const [epName, ep] of Object.entries(entrypoints)) {\n if (ep.binary) {\n const artifactID = typeof ep.binary.artifact === \"string\" ? ep.binary.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (!artifacts.isBuildable(artifact.type)) {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' is not buildable to binary package`,\n );\n hasErrors = true;\n }\n\n if (artifact.type === \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' cannot be build into software pacakge. Use 'environment' entrypoint`,\n );\n hasErrors = true;\n }\n }\n\n if (ep.environment) {\n const artifactID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (artifact.type !== \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' with 'environment' settings should refer to 'environment' artifact type`,\n );\n hasErrors = true;\n }\n }\n\n // TODO: add docker validation here\n // TODO(rfiskov)[MILAB-3163]: Carefully handle docker artifacts, as some (e.g., for Python) may be autogenerated dynamically rather than explicitly defined.\n }\n\n const uniquePackageNames = new Set<string>();\n\n for (const [artifactID, artifact] of Object.entries(as)) {\n if (!artifacts.isBuildable(artifact.type)) {\n continue;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n const withId = { id: artifactID, ...artifact };\n const name = this.artifactName(withId);\n const version = this.artifactVersion(withId);\n const uniqueName = `${name}-${version}`;\n if (uniquePackageNames.has(uniqueName)) {\n this.logger.error(\n `found two packages with the same name '${name}' and version '${version}'`,\n );\n hasErrors = true;\n }\n\n uniquePackageNames.add(uniqueName);\n }\n\n if (hasErrors) {\n throw util.CLIError(\n `${util.softwareConfigName} has xconfiguration errors in 'block-software' section. See error log messages above for details`,\n );\n }\n }\n\n private validateArtifact(artifactName: string, artifact: artifacts.anyArtifactType): boolean {\n if (artifacts.isBuildable(artifact.type)) {\n // Validate that root is not equal to package root\n const resolvedRoots: string[] = [];\n const aType = artifact.type;\n switch (aType) {\n case \"asset\":\n case \"java\":\n case \"R\":\n case \"python\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.root));\n break;\n }\n case \"docker\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.context));\n break;\n }\n case \"environment\":\n case \"conda\":\n case \"binary\": {\n resolvedRoots.push(\n ...Object.values(artifact.roots).map((root) => path.resolve(this.packageRoot, root)),\n );\n break;\n }\n default:\n util.assertNever(aType);\n }\n\n for (const root of resolvedRoots) {\n if (root === this.packageRoot) {\n this.logger.error(\n `Invalid configuration: '${artifact.type}' artifact '${artifactName}' has 'root' set to the package root, which is not allowed`,\n );\n return false;\n }\n }\n }\n\n return true;\n }\n}\n\nfunction parsePackageJson(data: string): z.ZodSafeParseResult<packageJson> {\n const parsedData: unknown = JSON.parse(data);\n return packageJsonSchema.safeParse(parsedData);\n}\n\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"asset\",\n errMsg: string,\n): artifacts.withType<\"asset\", artifacts.assetType>;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"environment\",\n errMsg: string,\n): artifacts.environmentType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"java\",\n errMsg: string,\n): artifacts.javaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"python\",\n errMsg: string,\n): artifacts.pythonType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"R\",\n errMsg: string,\n): artifacts.rType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"binary\",\n errMsg: string,\n): artifacts.binaryType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"docker\",\n errMsg: string,\n): artifacts.dockerType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"conda\",\n errMsg: string,\n): artifacts.condaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: artifacts.artifactType,\n errMsg: string,\n): artifacts.anyArtifactType {\n if (artifact.type === type) {\n return artifact;\n }\n\n if (errMsg) {\n errMsg = `${errMsg}: `;\n }\n\n throw util.CLIError(`${errMsg}wrong artifact type: expected '${type}', got '${artifact.type}'`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"package-info.js","names":["entrypoints.entrypointListSchema","defaults.BIN_REGISTRY_NAME","defaults.BIN_REGISTRY_DOWNLOAD_URL","util.findPackageRoot","path","util.packageJsonName","fs","util.CLIError","util.formatZodIssues","docker.entrypointName","entrypoints.EnyrypointReferencePattern","pythonDockerOptions","condaDockerOptions","util.currentArch","util.trimPrefix","util.isDevMode","envs.PL_PKG_VERSION","envs.PL_DEV_BINARY_UPLOAD_URL","defaults.DEV_BIN_REGISTRY_NAME","envs.PL_RELEASE_BINARY_UPLOAD_URL","util.currentPlatform","artifacts.isCrossPlatform","util.splitPlatform","util.softwareConfigName","artifacts.isBuildable"],"sources":["../../src/core/package-info.ts"],"sourcesContent":["import * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport type winston from \"winston\";\nimport { z } from \"zod/v4\";\n\nimport * as defaults from \"../defaults\";\nimport * as util from \"./util\";\nimport * as envs from \"./envs\";\nimport * as artifacts from \"./schemas/artifacts\";\nimport * as entrypoints from \"./schemas/entrypoints\";\nimport { tryResolve } from \"@milaboratories/resolve-helper\";\nimport * as docker from \"./docker\";\nimport { prepareDockerOptions as pythonDockerOptions } from \"./docker-python\";\nimport { prepareDockerOptions as condaDockerOptions } from \"./docker-conda\";\n\nconst storagePresetSchema = z.object({\n downloadURL: z.string().optional(),\n storageURL: z.string().optional(),\n});\ntype storagePreset = z.infer<typeof storagePresetSchema>;\n\nconst binaryRegistryPresetsSchema = z.record(z.string(), storagePresetSchema);\ntype binaryRegistryPresets = z.infer<typeof binaryRegistryPresetsSchema>;\n\nconst packageJsonSchema = z.object({\n name: z.string(),\n version: z.string(),\n private: z.boolean().optional(),\n\n \"block-software\": z.object({\n registries: z\n .object({\n binary: binaryRegistryPresetsSchema.optional(),\n })\n .optional(),\n\n artifacts: artifacts.artifactIndexSchema.optional(),\n entrypoints: entrypoints.entrypointListSchema,\n\n // Opt out of the \"every software entrypoint needs a docker image\" rule for a\n // package that is deliberately binary-only. Kept here rather than behind a CLI\n // flag or env var: the exception belongs to the package, where it is reviewable,\n // not to whichever CI run happens to build it. See core/docker-coverage.ts.\n requireDocker: z.boolean().optional(),\n }),\n});\ntype packageJson = z.infer<typeof packageJsonSchema>;\n\nconst wellKnownRegistries: Record<string, storagePreset> = {\n [defaults.BIN_REGISTRY_NAME]: {\n downloadURL: defaults.BIN_REGISTRY_DOWNLOAD_URL,\n },\n};\n\n/*\n * package.json -> block-software structure example:\n * {\n * \"block-software\": {\n * \"registries\": {\n * \"binary\": {\n * \"default\": { \"uploadURL\": \"s3://<bucket>/<some-prefix>?region=<region-name>\" }\n * }\n * },\n *\n * \"artifacts\": {\n * \"pkg-1\": {\n * \"type\": \"binary\",\n * \"roots\": {\n * \"linux-x64\": \"./linux-x64/src\",\n * \"linux-aarch64\": \"./linux-aarch/src\",\n * \"...and so on...\": \"platform-dependant roots\",\n * }\n * }\n * }\n *\n * \"entrypoints\": {\n * \"script1\": {\n * \"software\": {\n * \"artifact\": \"pkg-1\",\n * \"cmd\": [ \"{pkg}/script1\" ]\n * }\n * }\n * }\n * }\n * }\n */\nexport class PackageInfo {\n public readonly packageRoot: string;\n public readonly packageName: string;\n\n private readonly pkgJson: packageJson;\n private _versionOverride: string | undefined;\n\n /** Backing store for `Core.buildMode` (Core delegates its accessor here); gates content-addressable dev naming. */\n public buildMode: util.BuildMode = \"release\";\n\n constructor(\n private logger: winston.Logger,\n options?: {\n packageRoot?: string;\n pkgJsonData?: string;\n },\n ) {\n this.logger.debug(\"Reading package information...\");\n\n this.packageRoot = options?.packageRoot ?? util.findPackageRoot(logger);\n\n let pkgJsonData: string;\n if (options?.pkgJsonData) {\n pkgJsonData = options.pkgJsonData;\n } else {\n const pkgJsonPath = path.resolve(this.packageRoot, util.packageJsonName);\n\n this.logger.debug(` - loading '${pkgJsonPath}'`);\n if (!fs.existsSync(pkgJsonPath)) {\n this.logger.error(`no '${util.packageJsonName}' file found at '${this.packageRoot}'`);\n throw util.CLIError(\"not a platform software package directory\");\n }\n\n pkgJsonData = fs.readFileSync(pkgJsonPath, \"utf8\");\n }\n\n const result = parsePackageJson(pkgJsonData);\n if (!result.success) {\n throw util.CLIError(`\\n` + util.formatZodIssues(result.error.issues));\n }\n this.pkgJson = result.data;\n this.logger.debug(\" \" + JSON.stringify(this.pkgJson));\n\n this.validateConfig();\n\n this.packageName = this.pkgJson.name;\n\n logger.debug(\" package information loaded successfully.\");\n }\n\n get isPrivate(): boolean {\n return this.pkgJson.private ?? false;\n }\n\n /** Whether every software entrypoint of this package must ship a docker image. */\n get requireDocker(): boolean {\n return this.pkgJson[\"block-software\"].requireDocker ?? true;\n }\n\n get binaryRegistries(): binaryRegistryPresets {\n return this.pkgJson[\"block-software\"].registries?.binary ?? {};\n }\n\n get entrypoints(): Map<string, entrypoints.Entrypoint> {\n const list = new Map<string, entrypoints.Entrypoint>();\n\n for (const [epName, ep] of Object.entries(this.pkgJson[\"block-software\"].entrypoints)) {\n if (ep.docker) {\n const artifactID = typeof ep.docker.artifact === \"string\" ? ep.docker.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"docker\");\n\n // will mix docker to separate entrypoint\n // render function have to merge\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: ep.docker.cmd ?? [],\n env: ep.docker.envVars ?? [],\n });\n }\n\n if (ep.reference) {\n list.set(epName, {\n type: \"reference\",\n name: epName,\n reference: ep.reference,\n });\n continue;\n }\n\n if (ep.binary || ep.conda) {\n const swOptions: entrypoints.softwareOptionsType = ep.binary ? ep.binary : ep.conda!;\n const artifactOrRef = ep.binary ? ep.binary.artifact : ep.conda!.artifact;\n const artifactID = typeof artifactOrRef === \"string\" ? artifactOrRef : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n if (artifact.type === \"asset\") {\n throw util.CLIError(`binary entrypoint cannot point to asset artifact: ${epName}`);\n }\n if (artifact.type === \"environment\") {\n throw util.CLIError(`binary entrypoint cannot point to environment artifact: ${epName}`);\n }\n\n list.set(epName, {\n type: \"software\",\n name: epName,\n artifact: artifact,\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n\n if (!ep.docker) {\n if (artifacts.dockerAutogenTypes.includes(artifact.type)) {\n switch (artifact.type) {\n case \"conda\":\n case \"python\":\n list.set(docker.entrypointName(epName), {\n type: \"software\",\n name: epName,\n artifact: this.generateDockerPackage(artifact),\n cmd: swOptions.cmd,\n env: swOptions.envVars ?? [],\n });\n continue;\n default: {\n throw new Error(`docker autogeneration is not defined for type: ${artifact.type}`);\n }\n }\n }\n }\n }\n\n if (ep.environment) {\n const packageID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n list.set(epName, {\n type: \"environment\",\n name: epName,\n artifact: this.getArtifact(packageID, \"environment\"),\n env: ep.environment.envVars ?? [],\n });\n continue;\n }\n\n if (ep.asset) {\n const packageID = typeof ep.asset === \"string\" ? ep.asset : epName;\n list.set(epName, {\n type: \"asset\",\n name: epName,\n artifact: this.getArtifact(packageID, \"asset\"),\n });\n continue;\n }\n\n if (list.size === 0) {\n throw util.CLIError(\n `entrypoint '${epName}' type is not supported by current platforma package builder`,\n );\n }\n }\n\n return list;\n }\n\n // Get not docker entrypoint if exists.\n // If only docker entrypoint exists, return it.\n public getMainEntrypoint(name: string): entrypoints.Entrypoint {\n const ep = this.entrypoints.get(name);\n if (ep) {\n return ep;\n }\n\n return this.entrypoints.get(docker.entrypointName(name))!;\n }\n\n /**\n * Resolves entrypoint reference to full entrypoint file path and type\n */\n public resolveReference(epName: string, ep: entrypoints.ReferenceEntrypoint): string {\n this.logger.debug(\n `resolving entrypoint '${epName}' reference '${ep.reference}'. packageRoot='${this.packageRoot}'`,\n );\n\n const refInfo = ep.reference.match(entrypoints.EnyrypointReferencePattern)?.groups;\n\n if (!refInfo) {\n this.logger.error(\n `entrypoint reference '${epName}' has incorrect reference format. <full package name>/<path to entrypoint> is expected`,\n );\n throw util.CLIError(`invalid entrypoint '${epName}' reference format`);\n }\n\n const refPath = tryResolve(this.packageRoot, ep.reference);\n if (!refPath) {\n this.logger.error(`entrypoint reference '${epName}' cannot be resolved into file path`);\n throw util.CLIError(`invalid entrypoint '${epName}' reference`);\n }\n\n return refPath;\n }\n\n // Packages are buildable artifacts with entrypoints\n get packages(): Map<string, artifacts.withId<artifacts.anyArtifactType>> {\n const result = new Map<string, artifacts.withId<artifacts.anyArtifactType>>();\n\n for (const ep of this.entrypoints.values()) {\n if (ep.type === \"reference\") {\n // Entrypoint references are not buildable\n continue;\n }\n\n if (!result.has(ep.artifact.id)) {\n result.set(ep.artifact.id, ep.artifact);\n }\n }\n\n return result;\n }\n\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"docker\",\n platform: util.ArchType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\",\n platform?: util.PlatformType,\n ): string;\n public artifactInfoLocation(\n pkgID: string,\n artifactType: \"archive\" | \"docker\",\n platform?: util.PlatformType | util.ArchType,\n ): string {\n const platformPart = platform ? `_${platform}` : \"\";\n return path.resolve(\n this.packageRoot,\n \"dist\",\n \"artifacts\",\n pkgID,\n `${artifactType}${platformPart}.json`,\n );\n }\n\n private generateDockerPackage(\n artifact: artifacts.withId<artifacts.pythonType | artifacts.condaType>,\n ): artifacts.withId<artifacts.dockerType> {\n switch (artifact.type) {\n case \"python\": {\n const options = pythonDockerOptions(\n this.logger,\n this.packageRoot,\n this.packageName,\n artifact.id,\n artifact,\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n case \"conda\": {\n const options = condaDockerOptions(\n this.logger,\n this.packageRoot,\n artifact.id,\n artifact,\n util.currentArch(),\n );\n\n return {\n id: artifact.id,\n type: \"docker\",\n registry: artifact[\"docker-registry\"],\n ...options,\n };\n }\n default: {\n util.assertNever(artifact);\n throw new Error(\"calm down the linter\");\n }\n }\n }\n\n public getArtifact(\n id: string,\n type: \"asset\",\n ): artifacts.withId<artifacts.withType<\"asset\", artifacts.assetType>>;\n public getArtifact(id: string, type: \"environment\"): artifacts.withId<artifacts.environmentType>;\n public getArtifact(id: string, type: \"binary\"): artifacts.withId<artifacts.binaryType>;\n public getArtifact(id: string, type: \"java\"): artifacts.withId<artifacts.javaType>;\n public getArtifact(id: string, type: \"python\"): artifacts.withId<artifacts.pythonType>;\n public getArtifact(id: string, type: \"R\"): artifacts.withId<artifacts.rType>;\n public getArtifact(id: string, type: \"docker\"): artifacts.withId<artifacts.dockerType>;\n public getArtifact(id: string, type: \"conda\"): artifacts.withId<artifacts.condaType>;\n public getArtifact(id: string, type: \"any\"): artifacts.withId<artifacts.anyArtifactType>;\n public getArtifact(\n id: string,\n type: artifacts.artifactType | \"any\",\n ): artifacts.withId<artifacts.anyArtifactType> {\n const artifacts = this.pkgJson[\"block-software\"].artifacts ?? {};\n const entrypoints = this.pkgJson[\"block-software\"].entrypoints;\n\n let artifact: artifacts.anyArtifactType | undefined;\n let errMsg = \"\";\n if (artifacts[id]) {\n artifact = artifacts[id];\n } else {\n const ep = entrypoints[id];\n if (!ep) {\n throw util.CLIError(\n `artifact with id '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n errMsg = `incorrect artifact reference in entrypoint '${id}'`;\n\n if (ep.asset) {\n artifact =\n typeof ep.asset === \"string\"\n ? artifacts[ep.asset]\n : ({ type: \"asset\", ...ep.asset } as artifacts.assetType);\n } else if (ep.binary && type !== \"docker\") {\n // single entrypoint can keep both binary and docker\n const a = ep.binary.artifact;\n artifact = typeof a === \"string\" ? artifacts[a] : a;\n } else if (ep.conda && type !== \"docker\") {\n // single entrypoint can keep both conda and docker\n const a = ep.conda.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"conda\", ...a } as artifacts.condaType);\n } else if (ep.environment) {\n const a = ep.environment.artifact;\n artifact =\n typeof a === \"string\"\n ? artifacts[a]\n : ({ type: \"environment\", ...a } as artifacts.environmentType);\n } else if (ep.docker) {\n const a = ep.docker.artifact;\n artifact =\n typeof a === \"string\" ? artifacts[a] : ({ type: \"docker\", ...a } as artifacts.dockerType);\n }\n }\n\n if (!artifact) {\n throw util.CLIError(\n `artifact '${id}' not found neither in 'entrypoints', nor in 'artifacts'`,\n );\n }\n\n switch (type) {\n case \"docker\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"docker\", errMsg),\n };\n }\n case \"asset\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"asset\", errMsg),\n };\n }\n case \"environment\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"environment\", errMsg),\n };\n }\n case \"binary\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"binary\", errMsg),\n };\n }\n case \"java\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"java\", errMsg),\n };\n }\n case \"python\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"python\", errMsg),\n };\n }\n case \"R\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"R\", errMsg),\n };\n }\n case \"conda\": {\n return {\n id: id,\n ...requireArtifactType(artifact, \"conda\", errMsg),\n };\n }\n case \"any\": {\n return {\n id: id,\n ...artifact,\n };\n }\n default: {\n util.assertNever(type);\n throw util.CLIError(`invalid artifact type`); // calm down the linter\n }\n }\n }\n\n public set version(v: string | undefined) {\n this._versionOverride = v;\n }\n\n public artifactName(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (artifact.type !== \"docker\") {\n if (artifact.name) {\n return artifact.name;\n }\n }\n\n return util.trimPrefix(this.pkgJson.name, \"@\") + \"/\" + artifact.id;\n }\n\n public artifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n const base = this.baseArtifactVersion(artifact);\n\n if (util.isDevMode(this.buildMode) && artifact.type !== \"docker\") {\n const hash = this.devContentHash(artifact);\n if (hash) {\n return `${base}-${hash}`;\n }\n }\n\n return base;\n }\n\n private baseArtifactVersion(artifact: artifacts.withId<artifacts.anyArtifactType>): string {\n if (this._versionOverride) {\n return this._versionOverride;\n }\n\n if (process.env[envs.PL_PKG_VERSION]) {\n return process.env[envs.PL_PKG_VERSION];\n }\n\n if (artifact.type !== \"docker\" && artifact.version) {\n return artifact.version;\n }\n\n return this.pkgJson.version;\n }\n\n /**\n * Short content hash of the artifact's content root(s), used as the dev version suffix.\n */\n private readonly devContentHashCache = new Map<string, string | undefined>();\n\n private devContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n // Content roots are stable for the lifetime of this builder, so hash each artifact once.\n if (this.devContentHashCache.has(artifact.id)) {\n return this.devContentHashCache.get(artifact.id);\n }\n\n const hash = this.computeDevContentHash(artifact);\n this.devContentHashCache.set(artifact.id, hash);\n return hash;\n }\n\n private computeDevContentHash(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string | undefined {\n const hasher = createHash(\"sha256\");\n let hashedAny = false;\n\n let platforms: util.PlatformType[];\n try {\n // Sorted so the hash is independent of package.json root-key order.\n platforms = this.artifactPlatforms(artifact).toSorted();\n } catch {\n return undefined; // no content roots at all — leave the version without a suffix\n }\n\n for (const platform of platforms) {\n let root: string;\n try {\n root = this.artifactContentRoot(artifact, platform);\n } catch {\n continue; // platform without a defined/present root — skip\n }\n if (!fs.existsSync(root)) {\n continue;\n }\n // Hash the platform name too, so the same files under a different platform yield a different\n // hash.\n hasher.update(platform);\n util.hashDirSync(root, hasher);\n hashedAny = true;\n }\n\n return hashedAny ? hasher.digest(\"hex\").slice(0, 12) : undefined;\n }\n\n public artifactRegistrySettings(artifact: artifacts.anyArtifactType): artifacts.registry {\n if (artifact.type === \"docker\") {\n return {\n name: artifact.registry,\n };\n }\n\n const registry = artifact.registry;\n const registries = this.binaryRegistries;\n\n const result: artifacts.registry = {\n name: \"default\",\n downloadURL: registries.default?.downloadURL,\n storageURL: registries.default?.storageURL,\n };\n\n if (registry) {\n if (typeof registry === \"string\") {\n result.name = registry;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL = registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL = registries[result.name]?.storageURL ?? regDefault?.storageURL;\n } else {\n result.name = registry.name;\n const regDefault = wellKnownRegistries[result.name];\n result.downloadURL =\n registry.downloadURL ?? registries[result.name]?.downloadURL ?? regDefault?.downloadURL;\n result.storageURL =\n registry.storageURL ?? registries[result.name]?.storageURL ?? regDefault?.storageURL;\n }\n }\n\n const regNameUpper = result.name.toUpperCase().replaceAll(/[^A-Z0-9_]/g, \"_\");\n\n const uploadTo = process.env[`PL_REGISTRY_${regNameUpper}_UPLOAD_URL`];\n if (uploadTo) {\n result.storageURL = uploadTo;\n }\n\n const downloadFrom = process.env[`PL_REGISTRY_${regNameUpper}_DOWNLOAD_URL`];\n if (downloadFrom) {\n result.downloadURL = downloadFrom;\n }\n\n // Dev channel: the embedded binary registry is the built-in `midev` uploading to its built-in\n // endpoint, flipping to `dev` and `PL_DEV_BINARY_UPLOAD_URL` when that is set.\n if (util.isDevMode(this.buildMode)) {\n const devUpload = process.env[envs.PL_DEV_BINARY_UPLOAD_URL];\n result.name = devUpload\n ? defaults.DEV_BIN_REGISTRY_NAME_OVERRIDDEN\n : defaults.DEV_BIN_REGISTRY_NAME;\n result.storageURL = devUpload ?? defaults.DEV_BINARY_UPLOAD_TARGET;\n } else {\n const releaseUpload = process.env[envs.PL_RELEASE_BINARY_UPLOAD_URL];\n if (releaseUpload) {\n result.storageURL = releaseUpload;\n }\n }\n\n if (result.downloadURL) {\n const u = new URL(result.downloadURL, \"file:/nonexistent\"); // check download URL is valid URL\n if (![\"https:\", \"http:\"].includes(u.protocol)) {\n throw util.CLIError(\n `registry ${result.name} download URL is not valid. Only 'https://' and 'http://' schemes are supported for now`,\n );\n }\n }\n\n return result;\n }\n\n public artifactContentRoot(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n if (\"root\" in artifact && artifact.root) {\n return path.resolve(this.packageRoot, artifact.root);\n }\n if (\"roots\" in artifact && artifact.roots[platform]) {\n return path.resolve(this.packageRoot, artifact.roots[platform]);\n }\n\n throw util.CLIError(\n `root path of software archive on ${platform} is undefined for binary package`,\n );\n }\n\n public artifactPlatforms(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): util.PlatformType[] {\n if (artifact.type === \"docker\") {\n return [util.currentPlatform()];\n }\n\n if (\"root\" in artifact && artifact.root) {\n return [util.currentPlatform()];\n }\n\n if (\"roots\" in artifact) {\n return Object.keys(artifact.roots) as util.PlatformType[];\n }\n\n throw util.CLIError(\n `no platforms are defined as supported for artifact '${artifact.id}' in binary mode ` +\n `(no 'roots' are defined)`,\n );\n }\n\n public artifactArchiveFullName(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n platform: util.PlatformType,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n const { os, arch } = util.splitPlatform(platform);\n return `${group}/${name}/${version}-${os}-${arch}.${extension}`;\n }\n\n public artifactArchiveAddressPattern(\n artifact: artifacts.withId<artifacts.anyArtifactType>,\n ): string {\n const group = artifact.type === \"asset\" ? \"assets\" : \"software\";\n const extension = artifact.type === \"asset\" ? \"zip\" : \"tgz\";\n const name = this.artifactName(artifact);\n const version = this.artifactVersion(artifact);\n\n if (artifacts.isCrossPlatform(artifact.type)) {\n return `${group}/${name}/${version}.${extension}`;\n }\n\n return `${group}/${name}/${version}-{os}-{arch}.${extension}`;\n }\n\n private validateConfig() {\n let hasErrors: boolean = false;\n\n const blockSoftware = this.pkgJson[\"block-software\"];\n\n const as = blockSoftware.artifacts ?? {};\n const entrypoints = blockSoftware.entrypoints ?? {};\n\n for (const [epName, ep] of Object.entries(entrypoints)) {\n if (ep.binary) {\n const artifactID = typeof ep.binary.artifact === \"string\" ? ep.binary.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (!artifacts.isBuildable(artifact.type)) {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' is not buildable to binary package`,\n );\n hasErrors = true;\n }\n\n if (artifact.type === \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' artifact type '${artifact.type}' cannot be build into software pacakge. Use 'environment' entrypoint`,\n );\n hasErrors = true;\n }\n }\n\n if (ep.environment) {\n const artifactID =\n typeof ep.environment.artifact === \"string\" ? ep.environment.artifact : epName;\n const artifact = this.getArtifact(artifactID, \"any\");\n\n if (!artifact) {\n this.logger.error(\n `entrypoint '${epName}' refers to artifact '${artifactID}' which is not defined in '${util.softwareConfigName}'`,\n );\n hasErrors = true;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n if (artifact.type !== \"environment\") {\n this.logger.error(\n `entrypoint '${epName}' with 'environment' settings should refer to 'environment' artifact type`,\n );\n hasErrors = true;\n }\n }\n\n // TODO: add docker validation here\n // TODO(rfiskov)[MILAB-3163]: Carefully handle docker artifacts, as some (e.g., for Python) may be autogenerated dynamically rather than explicitly defined.\n }\n\n const uniquePackageNames = new Set<string>();\n\n for (const [artifactID, artifact] of Object.entries(as)) {\n if (!artifacts.isBuildable(artifact.type)) {\n continue;\n }\n\n if (!this.validateArtifact(artifactID, artifact)) {\n hasErrors = true;\n }\n\n const withId = { id: artifactID, ...artifact };\n const name = this.artifactName(withId);\n const version = this.artifactVersion(withId);\n const uniqueName = `${name}-${version}`;\n if (uniquePackageNames.has(uniqueName)) {\n this.logger.error(\n `found two packages with the same name '${name}' and version '${version}'`,\n );\n hasErrors = true;\n }\n\n uniquePackageNames.add(uniqueName);\n }\n\n if (hasErrors) {\n throw util.CLIError(\n `${util.softwareConfigName} has xconfiguration errors in 'block-software' section. See error log messages above for details`,\n );\n }\n }\n\n private validateArtifact(artifactName: string, artifact: artifacts.anyArtifactType): boolean {\n if (artifacts.isBuildable(artifact.type)) {\n // Validate that root is not equal to package root\n const resolvedRoots: string[] = [];\n const aType = artifact.type;\n switch (aType) {\n case \"asset\":\n case \"java\":\n case \"R\":\n case \"python\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.root));\n break;\n }\n case \"docker\": {\n resolvedRoots.push(path.resolve(this.packageRoot, artifact.context));\n break;\n }\n case \"environment\":\n case \"conda\":\n case \"binary\": {\n resolvedRoots.push(\n ...Object.values(artifact.roots).map((root) => path.resolve(this.packageRoot, root)),\n );\n break;\n }\n default:\n util.assertNever(aType);\n }\n\n for (const root of resolvedRoots) {\n if (root === this.packageRoot) {\n this.logger.error(\n `Invalid configuration: '${artifact.type}' artifact '${artifactName}' has 'root' set to the package root, which is not allowed`,\n );\n return false;\n }\n }\n }\n\n return true;\n }\n}\n\nfunction parsePackageJson(data: string): z.ZodSafeParseResult<packageJson> {\n const parsedData: unknown = JSON.parse(data);\n return packageJsonSchema.safeParse(parsedData);\n}\n\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"asset\",\n errMsg: string,\n): artifacts.withType<\"asset\", artifacts.assetType>;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"environment\",\n errMsg: string,\n): artifacts.environmentType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"java\",\n errMsg: string,\n): artifacts.javaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"python\",\n errMsg: string,\n): artifacts.pythonType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"R\",\n errMsg: string,\n): artifacts.rType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"binary\",\n errMsg: string,\n): artifacts.binaryType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"docker\",\n errMsg: string,\n): artifacts.dockerType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: \"conda\",\n errMsg: string,\n): artifacts.condaType;\nfunction requireArtifactType(\n artifact: artifacts.anyArtifactType,\n type: artifacts.artifactType,\n errMsg: string,\n): artifacts.anyArtifactType {\n if (artifact.type === type) {\n return artifact;\n }\n\n if (errMsg) {\n errMsg = `${errMsg}: `;\n }\n\n throw util.CLIError(`${errMsg}wrong artifact type: expected '${type}', got '${artifact.type}'`);\n}\n"],"mappings":"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"}