@packtory/cli 0.0.15 → 0.0.16

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 (140) hide show
  1. package/command-line-interface/config-loader.js +3 -6
  2. package/command-line-interface/config-loader.js.map +1 -1
  3. package/command-line-interface/preview-io/preview-io-shared.js +32 -0
  4. package/command-line-interface/preview-io/preview-io-shared.js.map +1 -0
  5. package/command-line-interface/preview-io/preview-io.js +16 -0
  6. package/command-line-interface/preview-io/preview-io.js.map +1 -0
  7. package/command-line-interface/preview-io/preview-spawn.js +27 -0
  8. package/command-line-interface/preview-io/preview-spawn.js.map +1 -0
  9. package/command-line-interface/runner/command-parsing.js +11 -0
  10. package/command-line-interface/runner/command-parsing.js.map +1 -0
  11. package/command-line-interface/runner/failure-printing.js +42 -0
  12. package/command-line-interface/runner/failure-printing.js.map +1 -0
  13. package/command-line-interface/runner/pack-handler.js +107 -0
  14. package/command-line-interface/runner/pack-handler.js.map +1 -0
  15. package/command-line-interface/runner/preview-handler.js +47 -0
  16. package/command-line-interface/runner/preview-handler.js.map +1 -0
  17. package/command-line-interface/runner/progress-wiring.js +27 -0
  18. package/command-line-interface/runner/progress-wiring.js.map +1 -0
  19. package/command-line-interface/runner/publish-handler.js +34 -0
  20. package/command-line-interface/runner/publish-handler.js.map +1 -0
  21. package/command-line-interface/runner/release-diff-handler.js +37 -0
  22. package/command-line-interface/runner/release-diff-handler.js.map +1 -0
  23. package/command-line-interface/runner/report-persistence.js +25 -0
  24. package/command-line-interface/runner/report-persistence.js.map +1 -0
  25. package/command-line-interface/runner/runner-symbols.js +11 -0
  26. package/command-line-interface/runner/runner-symbols.js.map +1 -0
  27. package/command-line-interface/runner/runner.js +108 -0
  28. package/command-line-interface/runner/runner.js.map +1 -0
  29. package/command-line-interface/spinner/line-spinner-renderer.js +44 -0
  30. package/command-line-interface/spinner/line-spinner-renderer.js.map +1 -0
  31. package/command-line-interface/{spinner-boot.js → spinner/spinner-boot.js} +2 -1
  32. package/command-line-interface/spinner/spinner-boot.js.map +1 -0
  33. package/command-line-interface/spinner/spinner-glyphs.js +31 -0
  34. package/command-line-interface/spinner/spinner-glyphs.js.map +1 -0
  35. package/command-line-interface/spinner/spinner-render-sequence.js +31 -0
  36. package/command-line-interface/spinner/spinner-render-sequence.js.map +1 -0
  37. package/command-line-interface/spinner/spinner-runtime.js +31 -0
  38. package/command-line-interface/spinner/spinner-runtime.js.map +1 -0
  39. package/command-line-interface/{spinner-shared-state.js → spinner/spinner-shared-state.js} +73 -10
  40. package/command-line-interface/spinner/spinner-shared-state.js.map +1 -0
  41. package/command-line-interface/spinner/spinner-snapshots.js +12 -0
  42. package/command-line-interface/spinner/spinner-snapshots.js.map +1 -0
  43. package/command-line-interface/spinner/spinner-worker-backend.js +38 -0
  44. package/command-line-interface/spinner/spinner-worker-backend.js.map +1 -0
  45. package/command-line-interface/spinner/spinner-worker-loop.js +38 -0
  46. package/command-line-interface/spinner/spinner-worker-loop.js.map +1 -0
  47. package/command-line-interface/spinner/terminal-spinner-renderer.js.map +1 -0
  48. package/common/path-tree.js +79 -0
  49. package/common/path-tree.js.map +1 -0
  50. package/package.json +3 -4
  51. package/packages/command-line-interface/command-line-interface.entry-point.d.ts +2 -2
  52. package/packages/command-line-interface/command-line-interface.entry-point.d.ts.map +1 -1
  53. package/packages/command-line-interface/command-line-interface.entry-point.js +34 -14
  54. package/packages/command-line-interface/command-line-interface.entry-point.js.map +1 -1
  55. package/packages/command-line-interface/spinner-boot.entry-point.js +12 -6
  56. package/packages/command-line-interface/spinner-boot.entry-point.js.map +1 -1
  57. package/packages/command-line-interface/spinner-worker.entry-point.js +1 -1
  58. package/packages/command-line-interface/spinner-worker.entry-point.js.map +1 -1
  59. package/readme.md +34 -0
  60. package/report/html-renderer/artifact-tree-renderer.js +25 -0
  61. package/report/html-renderer/artifact-tree-renderer.js.map +1 -0
  62. package/report/html-renderer/diagnostics-renderer.js +26 -0
  63. package/report/html-renderer/diagnostics-renderer.js.map +1 -0
  64. package/report/html-renderer/diff-renderer.js +31 -0
  65. package/report/html-renderer/diff-renderer.js.map +1 -0
  66. package/report/html-renderer/eliminated-files-renderer.js +16 -0
  67. package/report/html-renderer/eliminated-files-renderer.js.map +1 -0
  68. package/report/html-renderer/html-escaping.js.map +1 -0
  69. package/report/html-renderer/html-primitives.js +25 -0
  70. package/report/html-renderer/html-primitives.js.map +1 -0
  71. package/report/html-renderer/html-renderer.js +57 -0
  72. package/report/html-renderer/html-renderer.js.map +1 -0
  73. package/report/html-renderer/html-styles.js +177 -0
  74. package/report/html-renderer/html-styles.js.map +1 -0
  75. package/report/html-renderer/package-renderer.js +26 -0
  76. package/report/html-renderer/package-renderer.js.map +1 -0
  77. package/report/preview/artifact-diff-builder.js +20 -0
  78. package/report/preview/artifact-diff-builder.js.map +1 -0
  79. package/report/preview/artifact-tree-builder.js +19 -0
  80. package/report/preview/artifact-tree-builder.js.map +1 -0
  81. package/report/preview/bundle-artifact-index.js +15 -0
  82. package/report/preview/bundle-artifact-index.js.map +1 -0
  83. package/report/preview/changed-artifacts.js.map +1 -0
  84. package/report/preview/preview-document-helpers.js +19 -0
  85. package/report/preview/preview-document-helpers.js.map +1 -0
  86. package/report/preview/preview-document.js +62 -0
  87. package/report/preview/preview-document.js.map +1 -0
  88. package/report/preview/preview-result-inspectors.js +30 -0
  89. package/report/preview/preview-result-inspectors.js.map +1 -0
  90. package/report/preview/preview-summary.js +52 -0
  91. package/report/preview/preview-summary.js.map +1 -0
  92. package/report/release-diff/release-diff-document.js +22 -0
  93. package/report/release-diff/release-diff-document.js.map +1 -0
  94. package/report/release-diff/release-diff-summary.js +39 -0
  95. package/report/release-diff/release-diff-summary.js.map +1 -0
  96. package/report/terminal-renderer/terminal-artifact-renderer.js +20 -0
  97. package/report/terminal-renderer/terminal-artifact-renderer.js.map +1 -0
  98. package/report/terminal-renderer/terminal-package-renderer.js +36 -0
  99. package/report/terminal-renderer/terminal-package-renderer.js.map +1 -0
  100. package/report/{terminal-preview-renderer-shared.js → terminal-renderer/terminal-preview-renderer-shared.js} +16 -0
  101. package/report/terminal-renderer/terminal-preview-renderer-shared.js.map +1 -0
  102. package/report/terminal-renderer/terminal-preview-renderer.js +33 -0
  103. package/report/terminal-renderer/terminal-preview-renderer.js.map +1 -0
  104. package/report/terminal-renderer/terminal-release-diff-package-renderer.js +125 -0
  105. package/report/terminal-renderer/terminal-release-diff-package-renderer.js.map +1 -0
  106. package/report/terminal-renderer/terminal-release-diff-renderer.js +53 -0
  107. package/report/terminal-renderer/terminal-release-diff-renderer.js.map +1 -0
  108. package/command-line-interface/preview-io-shared.js +0 -75
  109. package/command-line-interface/preview-io-shared.js.map +0 -1
  110. package/command-line-interface/preview-io.js +0 -15
  111. package/command-line-interface/preview-io.js.map +0 -1
  112. package/command-line-interface/runner.js +0 -244
  113. package/command-line-interface/runner.js.map +0 -1
  114. package/command-line-interface/spinner-boot.js.map +0 -1
  115. package/command-line-interface/spinner-shared-state.js.map +0 -1
  116. package/command-line-interface/spinner-worker-backend.js +0 -62
  117. package/command-line-interface/spinner-worker-backend.js.map +0 -1
  118. package/command-line-interface/spinner-worker-loop.js +0 -94
  119. package/command-line-interface/spinner-worker-loop.js.map +0 -1
  120. package/command-line-interface/terminal-spinner-renderer.js.map +0 -1
  121. package/common/typed-diff.js +0 -5
  122. package/common/typed-diff.js.map +0 -1
  123. package/report/changed-artifacts.js.map +0 -1
  124. package/report/html-escaping.js.map +0 -1
  125. package/report/html-renderer.js +0 -337
  126. package/report/html-renderer.js.map +0 -1
  127. package/report/preview-document-diff.js +0 -17
  128. package/report/preview-document-diff.js.map +0 -1
  129. package/report/preview-document-helpers.js +0 -173
  130. package/report/preview-document-helpers.js.map +0 -1
  131. package/report/preview-document-tree.js +0 -13
  132. package/report/preview-document-tree.js.map +0 -1
  133. package/report/preview-document.js +0 -97
  134. package/report/preview-document.js.map +0 -1
  135. package/report/terminal-preview-renderer-shared.js.map +0 -1
  136. package/report/terminal-preview-renderer.js +0 -94
  137. package/report/terminal-preview-renderer.js.map +0 -1
  138. /package/command-line-interface/{terminal-spinner-renderer.js → spinner/terminal-spinner-renderer.js} +0 -0
  139. /package/report/{html-escaping.js → html-renderer/html-escaping.js} +0 -0
  140. /package/report/{changed-artifacts.js → preview/changed-artifacts.js} +0 -0
@@ -7,27 +7,45 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
7
7
  }
8
8
  return path;
9
9
  };
10
- import fs from 'node:fs/promises';
10
+ import fs from 'node:fs';
11
11
  import readline from 'node:readline/promises';
12
12
  import { createClock } from "packtory/common/clock.js";
13
+ import { createLineSpinnerRenderer } from "../../command-line-interface/spinner/line-spinner-renderer.js";
13
14
  import { createOneTimePasswordPrompt } from "../../command-line-interface/one-time-password-prompt.js";
14
- import { createCommandLineInterfaceRunner } from "../../command-line-interface/runner.js";
15
- import { createTerminalSpinnerRenderer } from "../../command-line-interface/terminal-spinner-renderer.js";
16
- import { createWorkerSpinnerBackend } from "../../command-line-interface/spinner-worker-backend.js";
15
+ import { createFileManager } from "packtory/file-manager/file-manager.js";
16
+ import { createCommandLineInterfaceRunner } from "../../command-line-interface/runner/runner.js";
17
+ import { createTerminalSpinnerRenderer } from "../../command-line-interface/spinner/terminal-spinner-renderer.js";
18
+ import { createWorkerSpinnerBackend } from "../../command-line-interface/spinner/spinner-worker-backend.js";
17
19
  import { createConfigLoader } from "../../command-line-interface/config-loader.js";
18
- import { previewIo } from "../../command-line-interface/preview-io.js";
20
+ import { createDefaultPreviewIo } from "../../command-line-interface/preview-io/preview-io.js";
19
21
  import { createPacktory } from "packtory/packtory/packtory.js";
20
22
  import { createScheduler } from "packtory/packtory/scheduler.js";
21
23
  import { readCiEnvironment } from "packtory/bundle-emitter/repository-coherence.js";
22
24
  import { buildPackageProcessorComposition } from "packtory/packages/package-processor.composition.js";
23
- import { bootedSpinnerRuntime } from "./spinner-boot.entry-point.js";
25
+ import { createBootedSpinnerRuntime } from "./spinner-boot.entry-point.js";
24
26
  async function importModule(modulePath) {
25
27
  return import(__rewriteRelativeImportExtension(modulePath));
26
28
  }
27
- const spinnerRenderer = createTerminalSpinnerRenderer({
28
- backend: createWorkerSpinnerBackend({ runtime: bootedSpinnerRuntime })
29
- });
29
+ function createSpinnerRenderer() {
30
+ if (!process.stdout.isTTY) {
31
+ return createLineSpinnerRenderer({ log: console.log });
32
+ }
33
+ return createTerminalSpinnerRenderer({
34
+ backend: createWorkerSpinnerBackend({ runtime: createBootedSpinnerRuntime() })
35
+ });
36
+ }
37
+ const spinnerRenderer = createSpinnerRenderer();
30
38
  const clock = createClock();
39
+ const fileManager = createFileManager({ hostFileSystem: fs.promises });
40
+ const previewIo = createDefaultPreviewIo({
41
+ async openFile(filePath) {
42
+ const { default: open } = await import('open');
43
+ await open(filePath, { wait: false });
44
+ },
45
+ shell: process.env.SHELL,
46
+ pager: process.env.PAGER,
47
+ stdoutIsTTY: process.stdout.isTTY
48
+ });
31
49
  const promptForOneTimePassword = createOneTimePasswordPrompt({
32
50
  clock,
33
51
  isInteractiveTerminal: () => {
@@ -43,7 +61,7 @@ const promptForOneTimePassword = createOneTimePasswordPrompt({
43
61
  });
44
62
  }
45
63
  });
46
- const { packageProcessor, progressBroadcaster, deadCodeEliminator } = buildPackageProcessorComposition({
64
+ const { packageProcessor, progressBroadcaster, deadCodeEliminator, artifactsBuilder, versionManager, packEmitter, vendorMaterializer } = buildPackageProcessorComposition({
47
65
  promptForOneTimePassword,
48
66
  ciEnvironment: readCiEnvironment(process.env)
49
67
  });
@@ -54,16 +72,18 @@ const packtory = createPacktory({
54
72
  scheduler,
55
73
  packageProcessor,
56
74
  deadCodeEliminator,
57
- progressBroadcaster
75
+ progressBroadcaster,
76
+ artifactsBuilder,
77
+ versionManager,
78
+ packEmitter,
79
+ vendorMaterializer
58
80
  });
59
81
  const commandLinerInterfaceRunner = createCommandLineInterfaceRunner({
60
82
  packtory,
61
83
  progressBroadcaster: progressBroadcaster.consumer,
62
84
  spinnerRenderer,
63
85
  configLoader: createConfigLoader({ currentWorkingDirectory: process.cwd(), importModule }),
64
- writeReportFile: async (filePath, content) => {
65
- await fs.writeFile(filePath, content);
66
- },
86
+ fileManager,
67
87
  pageOutput: async (content) => {
68
88
  const didPage = await previewIo.pagePreviewOutput(content);
69
89
  if (!didPage) {
@@ -1 +1 @@
1
- {"version":3,"file":"command-line-interface.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/command-line-interface/command-line-interface.entry-point.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-line-interface.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/command-line-interface/command-line-interface.entry-point.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import path from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { Worker as WorkerThread } from 'node:worker_threads';
4
- import { bootSpinnerRuntime } from "../../command-line-interface/spinner-boot.js";
4
+ import { bootSpinnerRuntime } from "../../command-line-interface/spinner/spinner-boot.js";
5
5
  const bootModulePath = fileURLToPath(import.meta.url);
6
6
  const bootModuleExtension = path.extname(bootModulePath);
7
7
  const workerModulePath = path.join(path.dirname(bootModulePath), `spinner-worker.entry-point${bootModuleExtension}`);
8
+ const defaultStdoutColumns = 80;
8
9
  const workerExecArgv = bootModuleExtension === '.ts' ? ['--experimental-strip-types', '--enable-source-maps'] : ['--enable-source-maps'];
9
10
  function spawnWorker(request) {
10
11
  const worker = new WorkerThread(workerModulePath, {
@@ -17,9 +18,14 @@ function spawnWorker(request) {
17
18
  });
18
19
  worker.unref();
19
20
  }
20
- export const bootedSpinnerRuntime = bootSpinnerRuntime({
21
- spawnWorker,
22
- initialLabel: 'packtory',
23
- initialMessage: 'Starting …'
24
- });
21
+ export function createBootedSpinnerRuntime() {
22
+ return bootSpinnerRuntime({
23
+ spawnWorker,
24
+ stdoutFileDescriptor: process.stdout.fd,
25
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- process.stdout.columns is undefined at runtime when stdout is not a TTY, despite the type declaring it as number
26
+ stdoutColumns: process.stdout.columns ?? defaultStdoutColumns,
27
+ initialLabel: 'packtory',
28
+ initialMessage: 'Starting …'
29
+ });
30
+ }
25
31
  //# sourceMappingURL=spinner-boot.entry-point.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-boot.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/command-line-interface/spinner-boot.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAGlF,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,6BAA6B,mBAAmB,EAAE,CAAC,CAAC;AACrH,MAAM,cAAc,GAChB,mBAAmB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAEtH,SAAS,WAAW,CAAC,OAA2B;IAC5C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE;QAC9C,UAAU,EAAE;YACR,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SACrD;QACD,QAAQ,EAAE,cAAc;KAC3B,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAmB,kBAAkB,CAAC;IACnE,WAAW;IACX,YAAY,EAAE,UAAU;IACxB,cAAc,EAAE,YAAY;CAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"spinner-boot.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/command-line-interface/spinner-boot.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAC;AAG1F,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,6BAA6B,mBAAmB,EAAE,CAAC,CAAC;AACrH,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,cAAc,GAChB,mBAAmB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAEtH,SAAS,WAAW,CAAC,OAA2B;IAC5C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE;QAC9C,UAAU,EAAE;YACR,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SACrD;QACD,QAAQ,EAAE,cAAc;KAC3B,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,0BAA0B;IACtC,OAAO,kBAAkB,CAAC;QACtB,WAAW;QACX,oBAAoB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;QACvC,2LAA2L;QAC3L,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,oBAAoB;QAC7D,YAAY,EAAE,UAAU;QACxB,cAAc,EAAE,YAAY;KAC/B,CAAC,CAAC;AACP,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { writeSync } from 'node:fs';
2
2
  import { setInterval as scheduleInterval, clearInterval as cancelInterval } from 'node:timers';
3
3
  import { workerData } from 'node:worker_threads';
4
- import { isSpinnerWorkerInput, startSpinnerWorker } from "../../command-line-interface/spinner-worker-loop.js";
4
+ import { isSpinnerWorkerInput, startSpinnerWorker } from "../../command-line-interface/spinner/spinner-worker-loop.js";
5
5
  if (!isSpinnerWorkerInput(workerData)) {
6
6
  throw new TypeError('Spinner worker started with invalid workerData');
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-worker.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/command-line-interface/spinner-worker.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qDAAqD,CAAC;AAE/G,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;IACpC,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;AAC1E,CAAC;AAED,kBAAkB,CAAC,UAAU,EAAE;IAC3B,KAAK,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE;QAC7B,0IAA0I;QAC1I,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,WAAW,EAAE,gBAAgB;IAC7B,aAAa,EAAE,cAAc;CAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"spinner-worker.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/command-line-interface/spinner-worker.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAEvH,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;IACpC,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;AAC1E,CAAC;AAED,kBAAkB,CAAC,UAAU,EAAE;IAC3B,KAAK,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE;QAC7B,0IAA0I;QAC1I,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,WAAW,EAAE,gBAAgB;IAC7B,aAAa,EAAE,cAAc;CAChC,CAAC,CAAC"}
package/readme.md CHANGED
@@ -19,7 +19,9 @@ packtory <command> [options]
19
19
  **Commands:**
20
20
 
21
21
  - **preview:** Runs a fresh dry-run build with report collection enabled and shows a human-oriented preview of the emitted package contents, file statuses, and changed-file diffs.
22
+ - **release-diff:** Runs the same dry-run build as `preview` and shows, per package, the changes between the latest version currently published on the configured registry and the bundle the next run would publish.
22
23
  - **publish:** Bundles and publishes npm packages based on the configuration in `packtory.config.js`.
24
+ - **pack:** Builds a single configured package and writes it to disk as a zip archive, tarball, or expanded folder. Intended for ad-hoc artifact use cases such as AWS Lambda deployments, container builds, or local inspection — `pack` never talks to a registry.
23
25
 
24
26
  **Options:**
25
27
 
@@ -27,6 +29,9 @@ packtory <command> [options]
27
29
  - **preview --open:** Generates the same fresh preview report as `packtory preview`, writes a temporary HTML file, and opens it with the platform opener.
28
30
  - **publish --report-json:** Writes `packtory-report.json`, the machine-readable `BuildReport`.
29
31
  - **publish --report-html:** Writes `packtory-report.html`, the rich HTML report used by `packtory preview --open`.
32
+ - **pack &lt;package&gt; --format &lt;zip|tar|folder&gt; --out &lt;path&gt;:** Selects which package from the configuration to build and where to write it. `--format` and `--out` are required.
33
+ - **pack --version &lt;version&gt;:** Stamps the produced manifest with the given version. Defaults to `0.0.0` when omitted, since `pack` is decoupled from the registry-driven automatic versioning used by `publish`.
34
+ - **pack --vendor-dependencies:** Resolves every external (and bundle) dependency from the local `node_modules` and materializes them next to the package files inside the artifact. Use this for self-contained deployments where the runtime cannot run `npm install` (e.g. AWS Lambda zips). Without the flag, dependencies are recorded in the generated `package.json` only.
30
35
 
31
36
  **Preview behavior:**
32
37
 
@@ -37,6 +42,35 @@ packtory <command> [options]
37
42
  - `packtory preview` exits with code `0` on a clean run and `1` on config errors, check failures, or partial failures.
38
43
  - `packtory preview --open` still exits successfully if report generation worked but opening the file failed; in that case it prints the temporary file path.
39
44
 
45
+ **Release-diff behavior:**
46
+
47
+ - `packtory release-diff` runs the same fresh dry-run build as `preview`, then for each package fetches the tarball of the version currently tagged `latest` on the configured registry and computes the set of file changes between that tarball and the bundle the next run would publish.
48
+ - For each package, files are grouped as **Added**, **Removed**, or **Modified**, rendered as a directory tree. Modified files include line-level hunks for textual content (code files, `package.json`, JSON, Markdown, YAML, source maps, and common no-extension license files); other modifications render as `(binary, no text diff)` or as a mode-only change (executable bit flip).
49
+ - Packages that have never been published are rendered with a `[first publish]` chip and every bundled file in the **Added** group.
50
+ - Packages whose new build is byte-equal to the published version are rendered as a single dim `no changes` line.
51
+ - A package that fails earlier in the dry-run build appears in the document `Issues` section rather than as a per-package diff entry.
52
+ - Previewable runs are shown through `$PAGER` when possible, otherwise `less -R`, otherwise standard output. Failure-only runs go directly to standard output.
53
+ - `packtory release-diff` exits with code `0` on a clean run and `1` on config errors, check failures, or partial failures.
54
+ - `release-diff` is read-only: it never publishes and never writes to the registry. It is currently terminal-only; an HTML/`--open` variant and an `--against <version>` selector are not part of this release.
55
+
56
+ **Pack behavior:**
57
+
58
+ - `packtory pack` runs the same validate → resolve → link → checks pipeline as the other commands, then emits the selected package's bundle to the path given by `--out`. It never reads from or writes to the configured registry.
59
+ - Format choices:
60
+ - `zip` — single-file zip archive. The format AWS Lambda accepts directly. Uses static metadata (1980-01-01 entries, deterministic ordering) so byte-identical inputs yield byte-identical archives.
61
+ - `tar` — single-file gzipped tarball, the same shape `publish` would upload, but written to disk instead of the registry.
62
+ - `folder` — expanded directory; `--out` is treated as the directory path. Useful for inspecting the artifact, for `docker build` contexts, or for piping the contents through another tool.
63
+ - `--vendor-dependencies` walks the local `node_modules` (resolving symlinks with `fs.realpath`, so npm, yarn-classic, and pnpm layouts all work) and copies every transitive runtime dependency into `node_modules/` inside the artifact. Files are streamed by path rather than read into memory, so binary assets and executables survive intact. Anything declared in `bundleDependencies` is materialized the same way without import-path rewriting, so cross-package imports keep their original form.
64
+ - Strict peer-dependency check: when `--vendor-dependencies` is set, every `peerDependency` declared by a vendored package must be satisfied by another vendored package (or by the target package itself). An unsatisfied peer is reported as `peer-dependencies-unsatisfied` and pack exits with code 1.
65
+ - Without `--vendor-dependencies`, packages that declare `bundleDependencies` are rejected with `bundle-dependencies-unsupported`. The flag is the only path that knows how to put a sibling package inside the artifact.
66
+ - An unknown `<package>` argument is reported as `package-not-found`.
67
+
68
+ **Preview vs release-diff:**
69
+
70
+ - **What question does each answer?** `preview` answers _"what would the next publish actually bundle, and what did packtory's linker/DCE change about my source on the way?"_. `release-diff` answers _"what's in this release that wasn't in the previously published one?"_.
71
+ - **What is each comparing?** Both run the same fresh dry-run build. `preview` diffs **source on disk** against the **linker/DCE-processed artifacts**. `release-diff` diffs the **latest tarball on the registry** against the **bundle that next run would publish**.
72
+ - A careful release flow runs both: `preview` to validate that the bundle is what you intended to build, `release-diff` to validate that the change set against the last release is what you intended to ship.
73
+
40
74
  **Report outputs:**
41
75
 
42
76
  - `--report-json` keeps the durable structured `BuildReport` contract.
@@ -0,0 +1,25 @@
1
+ /* eslint-disable @stylistic/max-len -- HTML template literals are intentionally long */
2
+ import { artifactBadgeLabel, artifactStatusLabel } from "../preview/preview-document.js";
3
+ import { formatBytes, renderBadge } from "./html-primitives.js";
4
+ import { escapeHtml } from "./html-escaping.js";
5
+ function renderDirectoryNode(node) {
6
+ return `<li class="tree-row directory" style="--depth:${node.depth}"><span class="tree-name">${escapeHtml(node.name)}/</span></li>`;
7
+ }
8
+ function renderFileNode(node) {
9
+ const { artifact } = node;
10
+ const badges = [
11
+ renderBadge(artifactStatusLabel(artifact.status), `status-${artifact.status}`),
12
+ ...artifact.badges.map((badge) => {
13
+ return renderBadge(artifactBadgeLabel(badge), 'secondary');
14
+ })
15
+ ].join('');
16
+ return `<li class="tree-row file" style="--depth:${node.depth}">
17
+ <span class="tree-name">${escapeHtml(node.name)}</span>
18
+ <span class="tree-meta">${escapeHtml(artifact.kind)} · ${escapeHtml(formatBytes(artifact.sizeBytes))}</span>
19
+ <span class="tree-badges">${badges}</span>
20
+ </li>`;
21
+ }
22
+ export function renderArtifactNode(node) {
23
+ return node.type === 'directory' ? renderDirectoryNode(node) : renderFileNode(node);
24
+ }
25
+ //# sourceMappingURL=artifact-tree-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-tree-renderer.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/artifact-tree-renderer.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAEzF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,SAAS,mBAAmB,CAAC,IAAyD;IAClF,OAAO,iDAAiD,IAAI,CAAC,KAAK,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;AACxI,CAAC;AAED,SAAS,cAAc,CAAC,IAAoD;IACxE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG;QACX,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9E,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7B,OAAO,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC,CAAC;KACL,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,4CAA4C,IAAI,CAAC,KAAK;kCAC/B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;kCACrB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oCACxE,MAAM;UAChC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IACxD,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { escapeHtml } from "./html-escaping.js";
2
+ import { renderCollapsibleSection } from "./html-primitives.js";
3
+ export function renderDiagnostics(pkg) {
4
+ const sections = [
5
+ pkg.diagnostics.inputs === undefined ? '' : renderCollapsibleSection('Inputs', pkg.diagnostics.inputs),
6
+ Object.keys(pkg.diagnostics.decisions).length === 0
7
+ ? ''
8
+ : renderCollapsibleSection('Decisions', pkg.diagnostics.decisions),
9
+ pkg.diagnostics.outputs === undefined ? '' : renderCollapsibleSection('Outputs', pkg.diagnostics.outputs),
10
+ Object.keys(pkg.diagnostics.timings).length === 0
11
+ ? ''
12
+ : renderCollapsibleSection('Timings (ms)', pkg.diagnostics.timings),
13
+ pkg.diagnostics.failure === undefined ? '' : renderCollapsibleSection('Failure', pkg.diagnostics.failure)
14
+ ].join('');
15
+ if (sections === '') {
16
+ return '';
17
+ }
18
+ return `<section class="package-block diagnostics"><h3>Diagnostics</h3>${sections}</section>`;
19
+ }
20
+ export function renderFailureBanner(pkg) {
21
+ if (pkg.failure === undefined) {
22
+ return '';
23
+ }
24
+ return `<p class="failure">Failed in stage <strong>${escapeHtml(pkg.failure.stage)}</strong>: ${escapeHtml(pkg.failure.message)}</p>`;
25
+ }
26
+ //# sourceMappingURL=diagnostics-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics-renderer.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/diagnostics-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,UAAU,iBAAiB,CAAC,GAAmB;IACjD,MAAM,QAAQ,GAAG;QACb,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;QACtG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;YAC/C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,wBAAwB,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC;QACtE,GAAG,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;YAC7C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,wBAAwB,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;QACvE,GAAG,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5G,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,kEAAkE,QAAQ,YAAY,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAmB;IACnD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,8CAA8C,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAC1I,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { collectChangedArtifacts } from "../preview/changed-artifacts.js";
2
+ import { escapeHtml } from "./html-escaping.js";
3
+ function renderDiffLine(line) {
4
+ return `<div class="diff-line ${line.type}">${escapeHtml(line.text)}</div>`;
5
+ }
6
+ function renderDiffHunk(header, lines) {
7
+ let renderedLines = '';
8
+ for (const line of lines) {
9
+ renderedLines += renderDiffLine(line);
10
+ }
11
+ return `<div class="diff-hunk"><div class="diff-header">${escapeHtml(header)}</div>${renderedLines}</div>`;
12
+ }
13
+ function renderArtifactDiff(artifact) {
14
+ let hunks = '';
15
+ for (const hunk of artifact.diff) {
16
+ hunks += renderDiffHunk(hunk.header, hunk.lines);
17
+ }
18
+ return `<details class="diff" open><summary>${escapeHtml(artifact.path)}</summary>${hunks}</details>`;
19
+ }
20
+ export function renderPackageDiffs(pkg) {
21
+ const changedFiles = collectChangedArtifacts(pkg.tree);
22
+ if (changedFiles.length === 0) {
23
+ return '';
24
+ }
25
+ let sections = '';
26
+ for (const artifact of changedFiles) {
27
+ sections += renderArtifactDiff(artifact);
28
+ }
29
+ return `<section class="package-block"><h3>Changed files</h3>${sections}</section>`;
30
+ }
31
+ //# sourceMappingURL=diff-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-renderer.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/diff-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iCAAiC,CAAC;AAGvG,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,SAAS,cAAc,CAAC,IAAqB;IACzC,OAAO,yBAAyB,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,KAAiC;IACrE,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,aAAa,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,mDAAmD,UAAU,CAAC,MAAM,CAAC,SAAS,aAAa,QAAQ,CAAC;AAC/G,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgC;IACxD,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,uCAAuC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,KAAK,YAAY,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IAClD,MAAM,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QAClC,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,wDAAwD,QAAQ,YAAY,CAAC;AACxF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { escapeHtml } from "./html-escaping.js";
2
+ import { formatBytes } from "./html-primitives.js";
3
+ export function renderEliminatedFiles(pkg) {
4
+ if (pkg.eliminatedSourceFiles.length === 0) {
5
+ return '';
6
+ }
7
+ let items = '';
8
+ for (const file of pkg.eliminatedSourceFiles) {
9
+ items += `<li><code>${escapeHtml(file.path)}</code> <span class="tree-meta">${escapeHtml(formatBytes(file.sourceBytes))}</span></li>`;
10
+ }
11
+ return `<section class="package-block">
12
+ <h3>Eliminated source files</h3>
13
+ <ul class="eliminated-list">${items}</ul>
14
+ </section>`;
15
+ }
16
+ //# sourceMappingURL=eliminated-files-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eliminated-files-renderer.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/eliminated-files-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACrD,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC3C,KAAK,IAAI,aAAa,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC;IAC1I,CAAC;IACD,OAAO;;sCAE2B,KAAK;eAC5B,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-escaping.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/html-escaping.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAa;IACpC,OAAO,KAAK;SACP,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /* eslint-disable @stylistic/max-len -- HTML template literals are intentionally long */
2
+ import { escapeHtml } from "./html-escaping.js";
3
+ const jsonIndentSpaces = 2;
4
+ export function serializeJsonBlock(value) {
5
+ return JSON.stringify(value, undefined, jsonIndentSpaces);
6
+ }
7
+ function renderJsonBlock(value) {
8
+ return `<pre>${escapeHtml(serializeJsonBlock(value))}</pre>`;
9
+ }
10
+ export function renderCollapsibleSection(title, value) {
11
+ return `<details class="diagnostic secondary"><summary>${escapeHtml(title)}</summary>${renderJsonBlock(value)}</details>`;
12
+ }
13
+ export function formatBytes(bytes) {
14
+ return `${bytes} B`;
15
+ }
16
+ export function renderBadge(text, className) {
17
+ return `<span class="badge ${className}">${escapeHtml(text)}</span>`;
18
+ }
19
+ export function renderSummaryCard(label, value) {
20
+ return `<div class="summary-card"><span class="summary-label">${escapeHtml(label)}</span><strong>${escapeHtml(String(value))}</strong></div>`;
21
+ }
22
+ export function renderIssuesSection(issueItems) {
23
+ return `<section class="issues"><h2>Issues</h2><ul>${issueItems}</ul></section>`;
24
+ }
25
+ //# sourceMappingURL=html-primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-primitives.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/html-primitives.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACnC,OAAO,QAAQ,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa,EAAE,KAAc;IAClE,OAAO,kDAAkD,UAAU,CAAC,KAAK,CAAC,aAAa,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC;AAC9H,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACrC,OAAO,GAAG,KAAK,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,SAAiB;IACvD,OAAO,sBAAsB,SAAS,KAAK,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,KAAa;IAC1D,OAAO,yDAAyD,UAAU,CAAC,KAAK,CAAC,kBAAkB,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;AAClJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IAClD,OAAO,8CAA8C,UAAU,iBAAiB,CAAC;AACrF,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { escapeHtml } from "./html-escaping.js";
2
+ import { renderIssuesSection, renderSummaryCard, serializeJsonBlock } from "./html-primitives.js";
3
+ import { htmlReportStyles } from "./html-styles.js";
4
+ import { renderPackage } from "./package-renderer.js";
5
+ function renderIssues(document) {
6
+ if (document.issues.length === 0) {
7
+ return '';
8
+ }
9
+ let items = '';
10
+ for (const issue of document.issues) {
11
+ items += `<li>${escapeHtml(issue)}</li>`;
12
+ }
13
+ return renderIssuesSection(items);
14
+ }
15
+ function renderPackages(document) {
16
+ let result = '';
17
+ for (const pkg of document.packages) {
18
+ result += renderPackage(pkg);
19
+ }
20
+ return result;
21
+ }
22
+ function renderSummaryCards(document) {
23
+ return `
24
+ ${renderSummaryCard('Packages', document.summary.totalPackages)}
25
+ ${renderSummaryCard('Changed', document.summary.changedPackages)}
26
+ ${renderSummaryCard('Unchanged', document.summary.unchangedPackages)}
27
+ ${renderSummaryCard('Failed', document.summary.failedPackages)}
28
+ ${renderSummaryCard('Artifacts', document.summary.emittedArtifacts)}
29
+ ${renderSummaryCard('Changed files', document.summary.changedArtifacts)}
30
+ ${renderSummaryCard('Eliminated', document.summary.eliminatedSourceFiles)}`;
31
+ }
32
+ export function renderHtmlReport(document) {
33
+ return `<!doctype html>
34
+ <html lang="en">
35
+ <head>
36
+ <meta charset="utf-8">
37
+ <meta name="viewport" content="width=device-width, initial-scale=1">
38
+ <title>Packtory build report</title>
39
+ <style>${htmlReportStyles}</style>
40
+ </head>
41
+ <body>
42
+ <main>
43
+ <section class="header">
44
+ <div class="mode-label">${escapeHtml(document.modeLabel)}</div>
45
+ <h1>${escapeHtml(document.title)}</h1>
46
+ <p class="meta">Schema version: ${escapeHtml(String(document.report.schemaVersion))} · Generated at: ${escapeHtml(document.report.generatedAt)}</p>
47
+ </section>
48
+ <section class="summary">${renderSummaryCards(document)}
49
+ </section>
50
+ ${renderIssues(document)}
51
+ <section class="packages">${renderPackages(document)}</section>
52
+ <script type="application/json" id="packtory-report-data">${escapeHtml(serializeJsonBlock(document.report))}</script>
53
+ </main>
54
+ </body>
55
+ </html>`;
56
+ }
57
+ //# sourceMappingURL=html-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-renderer.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/html-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,SAAS,YAAY,CAAC,QAAyB;IAC3C,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,IAAI,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;IAC7C,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,QAAyB;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAyB;IACjD,OAAO;cACG,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;cAC7D,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;cAC9D,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;cAClE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;cAC5D,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;cACjE,iBAAiB,CAAC,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;cACrE,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAyB;IACtD,OAAO;;;;;;aAME,gBAAgB;;;;;sCAKS,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;kBAClD,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;8CACE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;;mCAEvH,kBAAkB,CAAC,QAAQ,CAAC;;UAErD,YAAY,CAAC,QAAQ,CAAC;oCACI,cAAc,CAAC,QAAQ,CAAC;oEACQ,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;;QAG3G,CAAC;AACT,CAAC"}
@@ -0,0 +1,177 @@
1
+ /* cspell:words Palatino Menlo */
2
+ /* eslint-disable @stylistic/max-len -- CSS literals are intentionally long */
3
+ export const htmlReportStyles = `
4
+ :root {
5
+ color-scheme: light;
6
+ --bg: #f4f0e8;
7
+ --panel: #fffdf8;
8
+ --line: #d8cfc2;
9
+ --text: #2c2924;
10
+ --muted: #6b645a;
11
+ --changed: #b6540d;
12
+ --generated: #0b6e4f;
13
+ --unchanged: #4f6d7a;
14
+ --danger: #b42318;
15
+ --danger-bg: #fff1ef;
16
+ --diff-add: #e7f6ec;
17
+ --diff-remove: #fdecec;
18
+ --diff-header: #efe7da;
19
+ --shadow: 0 18px 50px rgba(63, 48, 29, 0.08);
20
+ }
21
+ * { box-sizing: border-box; }
22
+ body {
23
+ margin: 0;
24
+ background:
25
+ radial-gradient(circle at top left, rgba(193, 143, 71, 0.15), transparent 28rem),
26
+ linear-gradient(180deg, #f6f2e8 0%, var(--bg) 100%);
27
+ color: var(--text);
28
+ font-family: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
29
+ }
30
+ main { max-width: 72rem; margin: 0 auto; padding: 2.5rem 1.25rem 4rem; }
31
+ h1 { margin: 0 0 0.25rem; font-size: 2rem; }
32
+ h2, h3 { margin: 0 0 0.75rem; }
33
+ .meta { color: var(--muted); margin: 0; }
34
+ .header {
35
+ background: rgba(255, 253, 248, 0.82);
36
+ backdrop-filter: blur(14px);
37
+ border: 1px solid rgba(216, 207, 194, 0.85);
38
+ border-radius: 1.25rem;
39
+ padding: 1.5rem;
40
+ box-shadow: var(--shadow);
41
+ }
42
+ .mode-label {
43
+ display: inline-block;
44
+ font-size: 0.78rem;
45
+ letter-spacing: 0.08em;
46
+ text-transform: uppercase;
47
+ color: var(--muted);
48
+ margin-bottom: 0.65rem;
49
+ }
50
+ .summary {
51
+ display: grid;
52
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
53
+ gap: 0.75rem;
54
+ margin: 1.5rem 0;
55
+ }
56
+ .summary-card {
57
+ background: var(--panel);
58
+ border: 1px solid var(--line);
59
+ border-radius: 0.9rem;
60
+ padding: 0.95rem 1rem;
61
+ box-shadow: var(--shadow);
62
+ }
63
+ .summary-label {
64
+ display: block;
65
+ color: var(--muted);
66
+ font-size: 0.82rem;
67
+ margin-bottom: 0.35rem;
68
+ }
69
+ .issues {
70
+ background: var(--danger-bg);
71
+ border: 1px solid rgba(180, 35, 24, 0.22);
72
+ border-radius: 0.9rem;
73
+ padding: 1rem 1.1rem;
74
+ margin: 1rem 0 0;
75
+ }
76
+ .packages { display: grid; gap: 1rem; }
77
+ details.package {
78
+ background: var(--panel);
79
+ border: 1px solid var(--line);
80
+ border-radius: 1rem;
81
+ box-shadow: var(--shadow);
82
+ overflow: hidden;
83
+ }
84
+ details.package > summary {
85
+ cursor: pointer;
86
+ list-style: none;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ gap: 1rem;
91
+ padding: 1rem 1.25rem;
92
+ font-weight: 700;
93
+ background: rgba(255, 250, 241, 0.85);
94
+ }
95
+ details.package > summary::-webkit-details-marker { display: none; }
96
+ .package-title { font-size: 1.05rem; }
97
+ .package-summary { display: flex; gap: 0.4rem; flex-wrap: wrap; justify-content: flex-end; }
98
+ .package-block { padding: 0 1.25rem 1.25rem; }
99
+ .tree { list-style: none; padding: 0; margin: 0; }
100
+ .tree-row {
101
+ display: grid;
102
+ grid-template-columns: minmax(0, 1fr) auto auto;
103
+ gap: 0.65rem;
104
+ padding: 0.32rem 0;
105
+ padding-left: calc(var(--depth) * 1rem);
106
+ border-bottom: 1px solid rgba(216, 207, 194, 0.35);
107
+ align-items: baseline;
108
+ }
109
+ .tree-row:last-child { border-bottom: 0; }
110
+ .tree-row.directory { grid-template-columns: minmax(0, 1fr); color: var(--muted); font-weight: 700; }
111
+ .tree-name { word-break: break-all; }
112
+ .tree-meta { color: var(--muted); font-size: 0.84rem; }
113
+ .tree-badges { display: flex; gap: 0.35rem; flex-wrap: wrap; justify-content: flex-end; }
114
+ .badge {
115
+ display: inline-flex;
116
+ align-items: center;
117
+ border-radius: 999px;
118
+ padding: 0.15rem 0.5rem;
119
+ font-size: 0.76rem;
120
+ font-family: ui-sans-serif, system-ui, sans-serif;
121
+ border: 1px solid currentColor;
122
+ }
123
+ .badge.secondary { color: var(--muted); }
124
+ .badge.status-changed { color: var(--changed); }
125
+ .badge.status-generated { color: var(--generated); }
126
+ .badge.status-unchanged { color: var(--unchanged); }
127
+ .failure {
128
+ margin: 0 1.25rem 1rem;
129
+ padding: 0.9rem 1rem;
130
+ background: var(--danger-bg);
131
+ border-radius: 0.8rem;
132
+ color: var(--danger);
133
+ }
134
+ .eliminated-list { margin: 0; padding-left: 1.25rem; }
135
+ details.diff, details.diagnostic {
136
+ border: 1px solid rgba(216, 207, 194, 0.7);
137
+ border-radius: 0.8rem;
138
+ margin-top: 0.75rem;
139
+ overflow: hidden;
140
+ background: #fffdfa;
141
+ }
142
+ details.diff > summary, details.diagnostic > summary {
143
+ cursor: pointer;
144
+ list-style: none;
145
+ padding: 0.75rem 0.9rem;
146
+ font-weight: 600;
147
+ }
148
+ details.diff > summary::-webkit-details-marker, details.diagnostic > summary::-webkit-details-marker { display: none; }
149
+ .diff-hunk { border-top: 1px solid rgba(216, 207, 194, 0.5); }
150
+ .diff-header {
151
+ padding: 0.45rem 0.75rem;
152
+ background: var(--diff-header);
153
+ color: var(--muted);
154
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
155
+ font-size: 0.8rem;
156
+ }
157
+ .diff-line {
158
+ white-space: pre-wrap;
159
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
160
+ font-size: 0.83rem;
161
+ padding: 0.08rem 0.75rem;
162
+ }
163
+ .diff-line.add { background: var(--diff-add); }
164
+ .diff-line.remove { background: var(--diff-remove); }
165
+ pre {
166
+ margin: 0;
167
+ padding: 0.95rem 1rem 1rem;
168
+ overflow-x: auto;
169
+ background: #faf6ef;
170
+ font-size: 0.82rem;
171
+ }
172
+ @media (max-width: 720px) {
173
+ .tree-row { grid-template-columns: minmax(0, 1fr); }
174
+ .tree-badges, .package-summary { justify-content: flex-start; }
175
+ }
176
+ `;
177
+ //# sourceMappingURL=html-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-styles.js","sourceRoot":"","sources":["../../../../../source/report/html-renderer/html-styles.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K/B,CAAC"}