@packtory/cli 0.0.8 → 0.0.9

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 (45) hide show
  1. package/command-line-interface/config-loader.js +7 -5
  2. package/command-line-interface/config-loader.js.map +1 -1
  3. package/command-line-interface/one-time-password-prompt.js +29 -0
  4. package/command-line-interface/one-time-password-prompt.js.map +1 -0
  5. package/command-line-interface/preview-io-shared.js +75 -0
  6. package/command-line-interface/preview-io-shared.js.map +1 -0
  7. package/command-line-interface/preview-io.js +15 -0
  8. package/command-line-interface/preview-io.js.map +1 -0
  9. package/command-line-interface/runner.js +211 -76
  10. package/command-line-interface/runner.js.map +1 -1
  11. package/command-line-interface/spinner-boot.entry-point.js +25 -0
  12. package/command-line-interface/spinner-boot.entry-point.js.map +1 -0
  13. package/command-line-interface/spinner-boot.js +9 -0
  14. package/command-line-interface/spinner-boot.js.map +1 -0
  15. package/command-line-interface/spinner-shared-state.js +167 -0
  16. package/command-line-interface/spinner-shared-state.js.map +1 -0
  17. package/command-line-interface/spinner-worker-backend.js +62 -0
  18. package/command-line-interface/spinner-worker-backend.js.map +1 -0
  19. package/command-line-interface/terminal-spinner-renderer.js +21 -15
  20. package/command-line-interface/terminal-spinner-renderer.js.map +1 -1
  21. package/common/typed-diff.js +5 -0
  22. package/common/typed-diff.js.map +1 -0
  23. package/package.json +6 -6
  24. package/packages/command-line-interface/command-line-interface.entry-point.d.ts.map +1 -1
  25. package/packages/command-line-interface/command-line-interface.entry-point.js +61 -7
  26. package/packages/command-line-interface/command-line-interface.entry-point.js.map +1 -1
  27. package/readme.md +33 -1
  28. package/report/changed-artifacts.js +10 -0
  29. package/report/changed-artifacts.js.map +1 -0
  30. package/report/html-escaping.js +9 -0
  31. package/report/html-escaping.js.map +1 -0
  32. package/report/html-renderer.js +337 -0
  33. package/report/html-renderer.js.map +1 -0
  34. package/report/preview-document-diff.js +17 -0
  35. package/report/preview-document-diff.js.map +1 -0
  36. package/report/preview-document-helpers.js +173 -0
  37. package/report/preview-document-helpers.js.map +1 -0
  38. package/report/preview-document-tree.js +13 -0
  39. package/report/preview-document-tree.js.map +1 -0
  40. package/report/preview-document.js +97 -0
  41. package/report/preview-document.js.map +1 -0
  42. package/report/terminal-preview-renderer-shared.js +41 -0
  43. package/report/terminal-preview-renderer-shared.js.map +1 -0
  44. package/report/terminal-preview-renderer.js +94 -0
  45. package/report/terminal-preview-renderer.js.map +1 -0
@@ -0,0 +1,337 @@
1
+ /* eslint-disable @stylistic/max-len, complexity -- the HTML report renderer is intentionally template-heavy */
2
+ /* cspell:words Palatino Menlo */
3
+ import { artifactBadgeLabel, artifactStatusLabel } from "./preview-document.js";
4
+ import { collectChangedArtifacts } from "./changed-artifacts.js";
5
+ import { escapeHtml } from "./html-escaping.js";
6
+ const jsonIndentSpaces = 2;
7
+ function renderJsonBlock(value) {
8
+ return `<pre>${escapeHtml(JSON.stringify(value, undefined, jsonIndentSpaces))}</pre>`;
9
+ }
10
+ function renderSection(title, value) {
11
+ return `<details class="diagnostic secondary"><summary>${escapeHtml(title)}</summary>${renderJsonBlock(value)}</details>`;
12
+ }
13
+ function formatBytes(bytes) {
14
+ return `${bytes} B`;
15
+ }
16
+ function renderBadge(text, className) {
17
+ return `<span class="badge ${className}">${escapeHtml(text)}</span>`;
18
+ }
19
+ 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
+ function renderIssues(issueItems) {
23
+ return `<section class="issues"><h2>Issues</h2><ul>${issueItems}</ul></section>`;
24
+ }
25
+ function renderArtifactNode(node) {
26
+ if (node.type === 'directory') {
27
+ return `<li class="tree-row directory" style="--depth:${node.depth}"><span class="tree-name">${escapeHtml(node.name)}/</span></li>`;
28
+ }
29
+ const { artifact } = node;
30
+ const badges = [
31
+ renderBadge(artifactStatusLabel(artifact.status), `status-${artifact.status}`),
32
+ ...artifact.badges.map((badge) => {
33
+ return renderBadge(artifactBadgeLabel(badge), 'secondary');
34
+ })
35
+ ].join('');
36
+ return `<li class="tree-row file" style="--depth:${node.depth}">
37
+ <span class="tree-name">${escapeHtml(node.name)}</span>
38
+ <span class="tree-meta">${escapeHtml(artifact.kind)} · ${escapeHtml(formatBytes(artifact.sizeBytes))}</span>
39
+ <span class="tree-badges">${badges}</span>
40
+ </li>`;
41
+ }
42
+ function renderDiffLine(line) {
43
+ return `<div class="diff-line ${line.type}">${escapeHtml(line.text)}</div>`;
44
+ }
45
+ function renderDiffHunk(header, lines) {
46
+ let renderedLines = '';
47
+ for (const line of lines) {
48
+ renderedLines += renderDiffLine(line);
49
+ }
50
+ return `<div class="diff-hunk"><div class="diff-header">${escapeHtml(header)}</div>${renderedLines}</div>`;
51
+ }
52
+ function renderArtifactDiff(artifact) {
53
+ let hunks = '';
54
+ for (const hunk of artifact.diff) {
55
+ hunks += renderDiffHunk(hunk.header, hunk.lines);
56
+ }
57
+ return `<details class="diff" open><summary>${escapeHtml(artifact.path)}</summary>${hunks}</details>`;
58
+ }
59
+ function renderDiffs(pkg) {
60
+ const changedFiles = collectChangedArtifacts(pkg.tree);
61
+ if (changedFiles.length === 0) {
62
+ return '';
63
+ }
64
+ let sections = '';
65
+ for (const artifact of changedFiles) {
66
+ sections += renderArtifactDiff(artifact);
67
+ }
68
+ return `<section class="package-block"><h3>Changed files</h3>${sections}</section>`;
69
+ }
70
+ function renderEliminatedFiles(pkg) {
71
+ if (pkg.eliminatedSourceFiles.length === 0) {
72
+ return '';
73
+ }
74
+ let items = '';
75
+ for (const file of pkg.eliminatedSourceFiles) {
76
+ items += `<li><code>${escapeHtml(file.path)}</code> <span class="tree-meta">${escapeHtml(formatBytes(file.sourceBytes))}</span></li>`;
77
+ }
78
+ return `<section class="package-block">
79
+ <h3>Eliminated source files</h3>
80
+ <ul class="eliminated-list">${items}</ul>
81
+ </section>`;
82
+ }
83
+ function renderDiagnostics(pkg) {
84
+ const sections = [
85
+ pkg.diagnostics.inputs === undefined ? '' : renderSection('Inputs', pkg.diagnostics.inputs),
86
+ Object.keys(pkg.diagnostics.decisions).length === 0
87
+ ? ''
88
+ : renderSection('Decisions', pkg.diagnostics.decisions),
89
+ pkg.diagnostics.outputs === undefined ? '' : renderSection('Outputs', pkg.diagnostics.outputs),
90
+ Object.keys(pkg.diagnostics.timings).length === 0 ? '' : renderSection('Timings (ms)', pkg.diagnostics.timings),
91
+ pkg.diagnostics.failure === undefined ? '' : renderSection('Failure', pkg.diagnostics.failure)
92
+ ].join('');
93
+ if (sections === '') {
94
+ return '';
95
+ }
96
+ return `<section class="package-block diagnostics"><h3>Diagnostics</h3>${sections}</section>`;
97
+ }
98
+ function renderFailure(pkg) {
99
+ if (pkg.failure === undefined) {
100
+ return '';
101
+ }
102
+ return `<p class="failure">Failed in stage <strong>${escapeHtml(pkg.failure.stage)}</strong>: ${escapeHtml(pkg.failure.message)}</p>`;
103
+ }
104
+ function renderPackage(pkg) {
105
+ const badges = [
106
+ renderBadge(pkg.hasChanges ? 'changed' : 'unchanged', pkg.hasChanges ? 'status-changed' : 'status-unchanged'),
107
+ ...(pkg.versionTransition === undefined ? [] : [renderBadge(pkg.versionTransition, 'secondary')])
108
+ ].join('');
109
+ return `<details class="package"${pkg.openByDefault ? ' open' : ''}>
110
+ <summary><span class="package-title">${escapeHtml(pkg.name)}</span><span class="package-summary">${badges}</span></summary>
111
+ ${renderFailure(pkg)}
112
+ <section class="package-block">
113
+ <h3>Artifacts</h3>
114
+ <ul class="tree">${pkg.tree.map(renderArtifactNode).join('')}</ul>
115
+ </section>
116
+ ${renderEliminatedFiles(pkg)}
117
+ ${renderDiffs(pkg)}
118
+ ${renderDiagnostics(pkg)}
119
+ </details>`;
120
+ }
121
+ const styles = `
122
+ :root {
123
+ color-scheme: light;
124
+ --bg: #f4f0e8;
125
+ --panel: #fffdf8;
126
+ --line: #d8cfc2;
127
+ --text: #2c2924;
128
+ --muted: #6b645a;
129
+ --changed: #b6540d;
130
+ --generated: #0b6e4f;
131
+ --unchanged: #4f6d7a;
132
+ --danger: #b42318;
133
+ --danger-bg: #fff1ef;
134
+ --diff-add: #e7f6ec;
135
+ --diff-remove: #fdecec;
136
+ --diff-header: #efe7da;
137
+ --shadow: 0 18px 50px rgba(63, 48, 29, 0.08);
138
+ }
139
+ * { box-sizing: border-box; }
140
+ body {
141
+ margin: 0;
142
+ background:
143
+ radial-gradient(circle at top left, rgba(193, 143, 71, 0.15), transparent 28rem),
144
+ linear-gradient(180deg, #f6f2e8 0%, var(--bg) 100%);
145
+ color: var(--text);
146
+ font-family: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
147
+ }
148
+ main { max-width: 72rem; margin: 0 auto; padding: 2.5rem 1.25rem 4rem; }
149
+ h1 { margin: 0 0 0.25rem; font-size: 2rem; }
150
+ h2, h3 { margin: 0 0 0.75rem; }
151
+ .meta { color: var(--muted); margin: 0; }
152
+ .header {
153
+ background: rgba(255, 253, 248, 0.82);
154
+ backdrop-filter: blur(14px);
155
+ border: 1px solid rgba(216, 207, 194, 0.85);
156
+ border-radius: 1.25rem;
157
+ padding: 1.5rem;
158
+ box-shadow: var(--shadow);
159
+ }
160
+ .mode-label {
161
+ display: inline-block;
162
+ font-size: 0.78rem;
163
+ letter-spacing: 0.08em;
164
+ text-transform: uppercase;
165
+ color: var(--muted);
166
+ margin-bottom: 0.65rem;
167
+ }
168
+ .summary {
169
+ display: grid;
170
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
171
+ gap: 0.75rem;
172
+ margin: 1.5rem 0;
173
+ }
174
+ .summary-card {
175
+ background: var(--panel);
176
+ border: 1px solid var(--line);
177
+ border-radius: 0.9rem;
178
+ padding: 0.95rem 1rem;
179
+ box-shadow: var(--shadow);
180
+ }
181
+ .summary-label {
182
+ display: block;
183
+ color: var(--muted);
184
+ font-size: 0.82rem;
185
+ margin-bottom: 0.35rem;
186
+ }
187
+ .issues {
188
+ background: var(--danger-bg);
189
+ border: 1px solid rgba(180, 35, 24, 0.22);
190
+ border-radius: 0.9rem;
191
+ padding: 1rem 1.1rem;
192
+ margin: 1rem 0 0;
193
+ }
194
+ .packages { display: grid; gap: 1rem; }
195
+ details.package {
196
+ background: var(--panel);
197
+ border: 1px solid var(--line);
198
+ border-radius: 1rem;
199
+ box-shadow: var(--shadow);
200
+ overflow: hidden;
201
+ }
202
+ details.package > summary {
203
+ cursor: pointer;
204
+ list-style: none;
205
+ display: flex;
206
+ align-items: center;
207
+ justify-content: space-between;
208
+ gap: 1rem;
209
+ padding: 1rem 1.25rem;
210
+ font-weight: 700;
211
+ background: rgba(255, 250, 241, 0.85);
212
+ }
213
+ details.package > summary::-webkit-details-marker { display: none; }
214
+ .package-title { font-size: 1.05rem; }
215
+ .package-summary { display: flex; gap: 0.4rem; flex-wrap: wrap; justify-content: flex-end; }
216
+ .package-block { padding: 0 1.25rem 1.25rem; }
217
+ .tree { list-style: none; padding: 0; margin: 0; }
218
+ .tree-row {
219
+ display: grid;
220
+ grid-template-columns: minmax(0, 1fr) auto auto;
221
+ gap: 0.65rem;
222
+ padding: 0.32rem 0;
223
+ padding-left: calc(var(--depth) * 1rem);
224
+ border-bottom: 1px solid rgba(216, 207, 194, 0.35);
225
+ align-items: baseline;
226
+ }
227
+ .tree-row:last-child { border-bottom: 0; }
228
+ .tree-row.directory { grid-template-columns: minmax(0, 1fr); color: var(--muted); font-weight: 700; }
229
+ .tree-name { word-break: break-all; }
230
+ .tree-meta { color: var(--muted); font-size: 0.84rem; }
231
+ .tree-badges { display: flex; gap: 0.35rem; flex-wrap: wrap; justify-content: flex-end; }
232
+ .badge {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ border-radius: 999px;
236
+ padding: 0.15rem 0.5rem;
237
+ font-size: 0.76rem;
238
+ font-family: ui-sans-serif, system-ui, sans-serif;
239
+ border: 1px solid currentColor;
240
+ }
241
+ .badge.secondary { color: var(--muted); }
242
+ .badge.status-changed { color: var(--changed); }
243
+ .badge.status-generated { color: var(--generated); }
244
+ .badge.status-unchanged { color: var(--unchanged); }
245
+ .failure {
246
+ margin: 0 1.25rem 1rem;
247
+ padding: 0.9rem 1rem;
248
+ background: var(--danger-bg);
249
+ border-radius: 0.8rem;
250
+ color: var(--danger);
251
+ }
252
+ .eliminated-list { margin: 0; padding-left: 1.25rem; }
253
+ details.diff, details.diagnostic {
254
+ border: 1px solid rgba(216, 207, 194, 0.7);
255
+ border-radius: 0.8rem;
256
+ margin-top: 0.75rem;
257
+ overflow: hidden;
258
+ background: #fffdfa;
259
+ }
260
+ details.diff > summary, details.diagnostic > summary {
261
+ cursor: pointer;
262
+ list-style: none;
263
+ padding: 0.75rem 0.9rem;
264
+ font-weight: 600;
265
+ }
266
+ details.diff > summary::-webkit-details-marker, details.diagnostic > summary::-webkit-details-marker { display: none; }
267
+ .diff-hunk { border-top: 1px solid rgba(216, 207, 194, 0.5); }
268
+ .diff-header {
269
+ padding: 0.45rem 0.75rem;
270
+ background: var(--diff-header);
271
+ color: var(--muted);
272
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
273
+ font-size: 0.8rem;
274
+ }
275
+ .diff-line {
276
+ white-space: pre-wrap;
277
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
278
+ font-size: 0.83rem;
279
+ padding: 0.08rem 0.75rem;
280
+ }
281
+ .diff-line.add { background: var(--diff-add); }
282
+ .diff-line.remove { background: var(--diff-remove); }
283
+ pre {
284
+ margin: 0;
285
+ padding: 0.95rem 1rem 1rem;
286
+ overflow-x: auto;
287
+ background: #faf6ef;
288
+ font-size: 0.82rem;
289
+ }
290
+ @media (max-width: 720px) {
291
+ .tree-row { grid-template-columns: minmax(0, 1fr); }
292
+ .tree-badges, .package-summary { justify-content: flex-start; }
293
+ }
294
+ `;
295
+ export function renderHtmlReport(document) {
296
+ const rawJson = JSON.stringify(document.report, undefined, jsonIndentSpaces);
297
+ let issueItems = '';
298
+ for (const issue of document.issues) {
299
+ issueItems += `<li>${escapeHtml(issue)}</li>`;
300
+ }
301
+ const issueSection = document.issues.length === 0 ? '' : renderIssues(issueItems);
302
+ let packageSections = '';
303
+ for (const pkg of document.packages) {
304
+ packageSections += renderPackage(pkg);
305
+ }
306
+ return `<!doctype html>
307
+ <html lang="en">
308
+ <head>
309
+ <meta charset="utf-8">
310
+ <meta name="viewport" content="width=device-width, initial-scale=1">
311
+ <title>Packtory build report</title>
312
+ <style>${styles}</style>
313
+ </head>
314
+ <body>
315
+ <main>
316
+ <section class="header">
317
+ <div class="mode-label">${escapeHtml(document.modeLabel)}</div>
318
+ <h1>${escapeHtml(document.title)}</h1>
319
+ <p class="meta">Schema version: ${escapeHtml(String(document.report.schemaVersion))} · Generated at: ${escapeHtml(document.report.generatedAt)}</p>
320
+ </section>
321
+ <section class="summary">
322
+ ${renderSummaryCard('Packages', document.summary.totalPackages)}
323
+ ${renderSummaryCard('Changed', document.summary.changedPackages)}
324
+ ${renderSummaryCard('Unchanged', document.summary.unchangedPackages)}
325
+ ${renderSummaryCard('Failed', document.summary.failedPackages)}
326
+ ${renderSummaryCard('Artifacts', document.summary.emittedArtifacts)}
327
+ ${renderSummaryCard('Changed files', document.summary.changedArtifacts)}
328
+ ${renderSummaryCard('Eliminated', document.summary.eliminatedSourceFiles)}
329
+ </section>
330
+ ${issueSection}
331
+ <section class="packages">${packageSections}</section>
332
+ <script type="application/json" id="packtory-report-data">${escapeHtml(rawJson)}</script>
333
+ </main>
334
+ </body>
335
+ </html>`;
336
+ }
337
+ //# sourceMappingURL=html-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-renderer.js","sourceRoot":"","sources":["../../../../source/report/html-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { isCodeFile } from "packtory/common/code-files.js";
2
+ export function isDiffableArtifact(entry) {
3
+ return (entry.sourcePath !== undefined &&
4
+ entry.status === 'changed' &&
5
+ entry.kind === 'source' &&
6
+ isCodeFile(entry.path));
7
+ }
8
+ export function toDiffLineType(line) {
9
+ if (line.startsWith('+')) {
10
+ return 'add';
11
+ }
12
+ if (line.startsWith('-')) {
13
+ return 'remove';
14
+ }
15
+ return 'context';
16
+ }
17
+ //# sourceMappingURL=preview-document-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-document-diff.js","sourceRoot":"","sources":["../../../../source/report/preview-document-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAKrD,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACnD,OAAO,CACH,KAAK,CAAC,UAAU,KAAK,SAAS;QAC9B,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CACzB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -0,0 +1,173 @@
1
+ import path from 'node:path';
2
+ import { createStructuredPatch } from "../common/typed-diff.js";
3
+ import { isDiffableArtifact, toDiffLineType } from "./preview-document-diff.js";
4
+ import { compareTreeNodes, treeNodeSortKey } from "./preview-document-tree.js";
5
+ const diffContextLines = 3;
6
+ const diffHunkLimit = 2;
7
+ export function isPreviewableResult(result) {
8
+ return result.isOk || (result.error.type === 'partial' && result.error.succeeded.length > 0);
9
+ }
10
+ export function getSucceededResults(result) {
11
+ if (result.isOk) {
12
+ return result.value;
13
+ }
14
+ if (result.error.type === 'partial') {
15
+ return result.error.succeeded;
16
+ }
17
+ return [];
18
+ }
19
+ export function getIssues(result) {
20
+ if (result.isOk) {
21
+ return [];
22
+ }
23
+ if (result.error.type === 'partial') {
24
+ return result.error.failures.map((failure) => {
25
+ return failure.message;
26
+ });
27
+ }
28
+ return result.error.issues;
29
+ }
30
+ export function getResultType(result) {
31
+ if (result.isOk) {
32
+ return 'success';
33
+ }
34
+ return result.error.type;
35
+ }
36
+ export function buildBundleArtifactIndex(results) {
37
+ return new Map(results.map((result) => {
38
+ const entries = new Map([
39
+ ['package.json', { content: result.bundle.manifestFile.content }]
40
+ ]);
41
+ for (const entry of result.bundle.contents) {
42
+ entries.set(entry.fileDescription.targetFilePath, {
43
+ content: entry.fileDescription.content,
44
+ sourcePath: entry.fileDescription.sourceFilePath
45
+ });
46
+ }
47
+ return [result.bundle.name, entries];
48
+ }));
49
+ }
50
+ // eslint-disable-next-line max-statements -- diff construction intentionally validates, loads, and shapes hunks in one place
51
+ export async function buildDiffForArtifact(packageName, artifact, bundleArtifactIndex, readWorkspaceFile) {
52
+ if (!isDiffableArtifact(artifact)) {
53
+ return undefined;
54
+ }
55
+ const packageArtifacts = bundleArtifactIndex.get(packageName);
56
+ const finalArtifact = packageArtifacts?.get(artifact.path);
57
+ if (finalArtifact?.sourcePath !== artifact.sourcePath) {
58
+ return undefined;
59
+ }
60
+ const originalContent = await readWorkspaceFile(artifact.sourcePath);
61
+ if (originalContent === finalArtifact.content) {
62
+ return undefined;
63
+ }
64
+ const patchFile = createStructuredPatch(artifact.path, artifact.path, originalContent, finalArtifact.content, undefined, undefined, {
65
+ context: diffContextLines
66
+ });
67
+ return patchFile.hunks.slice(0, diffHunkLimit).map((hunk) => {
68
+ return {
69
+ header: `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`,
70
+ lines: hunk.lines
71
+ .filter((line) => {
72
+ return !line.startsWith('\\');
73
+ })
74
+ .map((line) => {
75
+ return {
76
+ type: toDiffLineType(line),
77
+ text: line
78
+ };
79
+ })
80
+ };
81
+ });
82
+ }
83
+ function createDirectory(pathname, name, depth) {
84
+ return {
85
+ name,
86
+ path: pathname,
87
+ depth,
88
+ directories: new Map(),
89
+ files: []
90
+ };
91
+ }
92
+ function insertArtifact(root, artifact) {
93
+ const parts = artifact.path.split('/');
94
+ let current = root;
95
+ for (const part of parts.slice(0, -1)) {
96
+ const nextPath = path.posix.join(current.path, part);
97
+ const next = current.directories.get(part) ?? createDirectory(nextPath, part, current.depth + 1);
98
+ current.directories.set(part, next);
99
+ current = next;
100
+ }
101
+ current.files.push(artifact);
102
+ }
103
+ function flattenTree(directory) {
104
+ const nodes = [];
105
+ const directoryEntries = Array.from(directory.directories.values());
106
+ const directoryChildren = directoryEntries.map((entry) => {
107
+ const node = {
108
+ path: entry.path,
109
+ name: entry.name,
110
+ depth: entry.depth,
111
+ type: 'directory'
112
+ };
113
+ return {
114
+ node,
115
+ directory: entry,
116
+ sortKey: treeNodeSortKey(node)
117
+ };
118
+ });
119
+ const fileChildren = directory.files.map((artifact) => {
120
+ const node = {
121
+ path: artifact.path,
122
+ name: path.posix.basename(artifact.path),
123
+ depth: directory.depth,
124
+ type: 'file',
125
+ artifact
126
+ };
127
+ return {
128
+ node,
129
+ sortKey: treeNodeSortKey(node)
130
+ };
131
+ });
132
+ const children = [...directoryChildren, ...fileChildren].toSorted((left, right) => {
133
+ return compareTreeNodes(left.node, right.node);
134
+ });
135
+ for (const child of children) {
136
+ nodes.push(child.node);
137
+ if (child.directory !== undefined) {
138
+ nodes.push(...flattenTree(child.directory));
139
+ }
140
+ }
141
+ return nodes;
142
+ }
143
+ export function buildArtifactTree(artifacts) {
144
+ const root = {
145
+ path: '',
146
+ depth: 0,
147
+ directories: new Map(),
148
+ files: []
149
+ };
150
+ for (const artifact of artifacts) {
151
+ insertArtifact(root, artifact);
152
+ }
153
+ return flattenTree(root);
154
+ }
155
+ export function buildVersionTransition(packageReport) {
156
+ const { version } = packageReport.decisions;
157
+ if (version === undefined) {
158
+ return undefined;
159
+ }
160
+ if (version.previousVersion === undefined) {
161
+ return version.chosenVersion;
162
+ }
163
+ return `${version.previousVersion} -> ${version.chosenVersion}`;
164
+ }
165
+ export function hasMeaningfulChanges(artifacts, eliminatedSourceFiles) {
166
+ if (eliminatedSourceFiles.length > 0) {
167
+ return true;
168
+ }
169
+ return artifacts.some((artifact) => {
170
+ return artifact.status === 'changed';
171
+ });
172
+ }
173
+ //# sourceMappingURL=preview-document-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-document-helpers.js","sourceRoot":"","sources":["../../../../source/report/preview-document-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export function treeNodeSortKey(node) {
2
+ if (node.type === 'file' && node.name === 'package.json') {
3
+ return `0:${node.name}`;
4
+ }
5
+ if (node.type === 'directory') {
6
+ return `1:${node.name}`;
7
+ }
8
+ return `2:${node.name}`;
9
+ }
10
+ export function compareTreeNodes(left, right) {
11
+ return treeNodeSortKey(left).localeCompare(treeNodeSortKey(right));
12
+ }
13
+ //# sourceMappingURL=preview-document-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-document-tree.js","sourceRoot":"","sources":["../../../../source/report/preview-document-tree.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,IAA6B;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACvD,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAA6B,EAAE,KAA8B;IAC1F,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,97 @@
1
+ /* eslint-disable max-statements, complexity -- preview document construction intentionally combines reporting, diffing, and tree shaping */
2
+ import { readFile } from 'node:fs/promises';
3
+ import { buildArtifactTree, buildBundleArtifactIndex, buildDiffForArtifact, buildVersionTransition, getIssues, getResultType, getSucceededResults, hasMeaningfulChanges, isPreviewableResult } from "./preview-document-helpers.js";
4
+ export async function buildPreviewDocument(params) {
5
+ const readWorkspaceFile = params.readWorkspaceFile ??
6
+ (async (filePath) => {
7
+ return readFile(filePath, 'utf8');
8
+ });
9
+ const bundleArtifactIndex = buildBundleArtifactIndex(getSucceededResults(params.result));
10
+ const packageEntries = Object.entries(params.report.packages);
11
+ const packages = [];
12
+ for (const [packageName, packageReport] of packageEntries) {
13
+ const emittedArtifacts = packageReport.outputs?.tarball.entries ?? [];
14
+ const artifacts = await Promise.all(emittedArtifacts.map(async (artifact) => {
15
+ const diff = await buildDiffForArtifact(packageName, artifact, bundleArtifactIndex, readWorkspaceFile);
16
+ return {
17
+ ...artifact,
18
+ ...(diff === undefined ? {} : { diff })
19
+ };
20
+ }));
21
+ const eliminatedSourceFiles = packageReport.eliminatedSourceFiles ?? [];
22
+ const hasChanges = hasMeaningfulChanges(artifacts, eliminatedSourceFiles);
23
+ packages.push({
24
+ name: packageName,
25
+ versionTransition: buildVersionTransition(packageReport),
26
+ hasChanges,
27
+ openByDefault: hasChanges || packageReport.failure !== undefined,
28
+ tree: buildArtifactTree(artifacts),
29
+ eliminatedSourceFiles,
30
+ failure: packageReport.failure,
31
+ diagnostics: packageReport
32
+ });
33
+ }
34
+ let totalPackages = 0;
35
+ let changedPackages = 0;
36
+ let unchangedPackages = 0;
37
+ let failedPackages = 0;
38
+ let emittedArtifacts = 0;
39
+ let changedArtifacts = 0;
40
+ let eliminatedSourceFiles = 0;
41
+ for (const pkg of packages) {
42
+ totalPackages += 1;
43
+ if (pkg.hasChanges) {
44
+ changedPackages += 1;
45
+ }
46
+ else if (pkg.failure === undefined) {
47
+ unchangedPackages += 1;
48
+ }
49
+ if (pkg.failure !== undefined) {
50
+ failedPackages += 1;
51
+ }
52
+ eliminatedSourceFiles += pkg.eliminatedSourceFiles.length;
53
+ for (const entry of pkg.tree) {
54
+ if (entry.type === 'file') {
55
+ emittedArtifacts += 1;
56
+ if (entry.artifact.status === 'changed') {
57
+ changedArtifacts += 1;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ const summary = {
63
+ totalPackages,
64
+ changedPackages,
65
+ unchangedPackages,
66
+ failedPackages,
67
+ emittedArtifacts,
68
+ changedArtifacts,
69
+ eliminatedSourceFiles
70
+ };
71
+ return {
72
+ title: 'Packtory preview',
73
+ modeLabel: params.dryRun ? 'Dry run' : 'Publish',
74
+ previewable: isPreviewableResult(params.result),
75
+ resultType: getResultType(params.result),
76
+ summary,
77
+ packages,
78
+ issues: getIssues(params.result),
79
+ report: params.report
80
+ };
81
+ }
82
+ export function artifactStatusLabel(status) {
83
+ if (status === 'generated') {
84
+ return 'generated';
85
+ }
86
+ if (status === 'changed') {
87
+ return 'changed';
88
+ }
89
+ return 'unchanged';
90
+ }
91
+ export function artifactBadgeLabel(badge) {
92
+ if (badge === 'dead-code-elimination') {
93
+ return 'DCE';
94
+ }
95
+ return 'rewrite';
96
+ }
97
+ //# sourceMappingURL=preview-document.js.map