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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/core/core.cjs +35 -0
  2. package/dist/core/core.cjs.map +1 -1
  3. package/dist/core/core.d.ts +32 -6
  4. package/dist/core/core.d.ts.map +1 -1
  5. package/dist/core/core.js +35 -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/envs.d.ts +27 -27
  14. package/dist/core/envs.d.ts.map +1 -1
  15. package/dist/core/package-info.cjs +6 -1
  16. package/dist/core/package-info.cjs.map +1 -1
  17. package/dist/core/package-info.d.ts +6 -6
  18. package/dist/core/package-info.d.ts.map +1 -1
  19. package/dist/core/package-info.js +6 -1
  20. package/dist/core/package-info.js.map +1 -1
  21. package/dist/core/push-guard.cjs +17 -0
  22. package/dist/core/push-guard.cjs.map +1 -0
  23. package/dist/core/push-guard.d.ts +15 -0
  24. package/dist/core/push-guard.d.ts.map +1 -0
  25. package/dist/core/push-guard.js +17 -0
  26. package/dist/core/push-guard.js.map +1 -0
  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 +6 -0
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.ts +6 -5
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -1
  44. package/dist/index.js.map +1 -1
  45. package/package.json +6 -6
  46. package/src/core/__tests__/docker-coverage.test.ts +319 -0
  47. package/src/core/__tests__/publish-docker-images.test.ts +63 -0
  48. package/src/core/__tests__/push-guard.test.ts +62 -0
  49. package/src/core/core.ts +51 -0
  50. package/src/core/docker-coverage.ts +112 -0
  51. package/src/core/package-info.ts +11 -0
  52. package/src/core/push-guard.ts +42 -0
  53. package/src/core/sw-json-render.ts +25 -0
  54. package/src/index.ts +9 -0
@@ -0,0 +1,42 @@
1
+ // Guard against the silent "image built, never pushed" outcome.
2
+ //
3
+ // Docker auto-push defaults to `isCI() && !isPrivate`, but the entrypoint
4
+ // descriptor is written with the image tag either way. A stray
5
+ // `"private": true` on a software package therefore yields a green CI run and
6
+ // a published block that 404s pulling its image at runtime — the failure only
7
+ // surfaces when a user runs the block (MILAB-6714).
8
+ //
9
+ // So: in CI, building docker images without pushing them is an error unless
10
+ // the caller says it meant to, via `--docker-no-autopush` /
11
+ // `PL_DOCKER_NO_AUTOPUSH=1`.
12
+
13
+ import * as envs from "./envs";
14
+ import * as util from "./util";
15
+
16
+ export type PushIntent = {
17
+ /** Docker images were built in this run. */
18
+ buildDocker: boolean;
19
+ /** Resolved auto-push decision. */
20
+ pushDocker: boolean;
21
+ /** Caller passed `--docker-no-autopush` / `PL_DOCKER_NO_AUTOPUSH=1`. */
22
+ pushDisabledExplicitly: boolean;
23
+ /** How many entrypoints produce a docker image. */
24
+ dockerPackageCount: number;
25
+ };
26
+
27
+ /** Throws when a CI run is about to reference docker images it never pushed. */
28
+ export function assertDockerPushIntent(intent: PushIntent): void {
29
+ if (!envs.isCI()) return;
30
+ if (!intent.buildDocker || intent.pushDocker) return;
31
+ if (intent.dockerPackageCount === 0) return;
32
+ if (intent.pushDisabledExplicitly) return;
33
+
34
+ throw util.CLIError(
35
+ `This CI run would build docker images without pushing them, while still writing ` +
36
+ `entrypoint descriptors that reference them. Consumers would fail to pull the images.\n` +
37
+ ` The usual cause is "private": true in package.json: auto-push is gated on ` +
38
+ `!isPrivate, and software packages must never be private.\n` +
39
+ ` If this package really must build images without publishing them, say so with ` +
40
+ `--docker-no-autopush (or ${envs.PL_DOCKER_NO_AUTOPUSH}=1).`,
41
+ );
42
+ }
@@ -7,6 +7,7 @@ import type * as swJson from "./schemas/sw-json";
7
7
  import type * as entrypoint from "./schemas/entrypoints";
8
8
  import * as util from "./util";
9
9
  import * as docker from "./docker";
10
+ import * as dockerCoverage from "./docker-coverage";
10
11
  import * as defaults from "../defaults";
11
12
  import { descriptorFilePath } from "./resolver";
12
13
  import { resolveRunEnvironment } from "./resolver";
@@ -179,6 +180,30 @@ export class SwJsonRenderer {
179
180
  const dstSwInfoPath = descriptorFilePath(this.pkgInfo.packageRoot, epType, epName);
180
181
  util.ensureDirsExist(path.dirname(dstSwInfoPath));
181
182
  fs.copyFileSync(srcFile, dstSwInfoPath);
183
+
184
+ if (epType === "software") this.warnIfNoDockerVariant(epName, srcFile);
185
+ }
186
+
187
+ /**
188
+ * A reference re-exports another package's descriptor verbatim, so the docker-coverage
189
+ * check cannot judge it from this package's declaration — and must not fail on it: the
190
+ * owning package may have declared itself binary-only on purpose, and that waiver does
191
+ * not travel inside the descriptor. Warn, naming what to fix and where.
192
+ */
193
+ private warnIfNoDockerVariant(epName: string, srcFile: string) {
194
+ let descriptor: unknown;
195
+ try {
196
+ descriptor = JSON.parse(fs.readFileSync(srcFile, "utf-8"));
197
+ } catch {
198
+ return; // an unreadable descriptor is the copy's problem to report, not this warning's
199
+ }
200
+
201
+ if (!dockerCoverage.descriptorHasNoDockerVariant(descriptor)) return;
202
+
203
+ this.logger.warn(
204
+ `referenced entrypoint '${epName}' carries no docker image, so no kubernetes ` +
205
+ `installation can run it. Fix it in the package that owns ${srcFile}.`,
206
+ );
182
207
  }
183
208
 
184
209
  private renderLocalPackage(
package/src/index.ts CHANGED
@@ -4,6 +4,13 @@ import { Core } from "./core/core";
4
4
  export * as util from "./core/util";
5
5
  export * as envs from "./core/envs";
6
6
  export * as defaults from "./defaults";
7
+ export { assertDockerPushIntent, type PushIntent } from "./core/push-guard";
8
+ export {
9
+ assertDockerCoverage,
10
+ softwareEntrypointsWithoutDocker,
11
+ descriptorHasNoDockerVariant,
12
+ type DockerCoverage,
13
+ } from "./core/docker-coverage";
7
14
 
8
15
  /** The logger the engine and its callers pass around. */
9
16
  export type Logger = winston.Logger;
@@ -22,6 +29,8 @@ export type Builder = Pick<
22
29
  | "fullDirHash"
23
30
  | "version"
24
31
  | "isPrivate"
32
+ | "selectedDockerPackages"
33
+ | "assertDockerCoverage"
25
34
  | "buildDockerImages"
26
35
  | "buildSoftwareArchives"
27
36
  | "buildSwJsonFiles"