@juxtapose/core 0.2.0 → 0.5.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 (141) hide show
  1. package/dist/agent/handoff.d.ts +8 -1
  2. package/dist/agent/handoff.js +75 -7
  3. package/dist/agent/handoff.js.map +1 -1
  4. package/dist/analysis/affected.d.ts +58 -0
  5. package/dist/analysis/affected.js +134 -22
  6. package/dist/analysis/affected.js.map +1 -1
  7. package/dist/analysis/cause.d.ts +32 -0
  8. package/dist/analysis/cause.js +187 -0
  9. package/dist/analysis/cause.js.map +1 -0
  10. package/dist/baseline/approve.d.ts +24 -0
  11. package/dist/baseline/approve.js +54 -0
  12. package/dist/baseline/approve.js.map +1 -0
  13. package/dist/baseline/git-store.d.ts +4 -0
  14. package/dist/baseline/git-store.js +22 -0
  15. package/dist/baseline/git-store.js.map +1 -1
  16. package/dist/browser/acquire.d.ts +11 -0
  17. package/dist/browser/acquire.js +15 -0
  18. package/dist/browser/acquire.js.map +1 -0
  19. package/dist/browser/browser.d.ts +53 -0
  20. package/dist/browser/browser.js +122 -0
  21. package/dist/browser/browser.js.map +1 -0
  22. package/dist/browser/cdp.d.ts +81 -0
  23. package/dist/browser/cdp.js +230 -0
  24. package/dist/browser/cdp.js.map +1 -0
  25. package/dist/browser/index.d.ts +9 -0
  26. package/dist/browser/index.js +10 -0
  27. package/dist/browser/index.js.map +1 -0
  28. package/dist/browser/install.d.ts +33 -0
  29. package/dist/browser/install.js +167 -0
  30. package/dist/browser/install.js.map +1 -0
  31. package/dist/browser/launch.d.ts +37 -0
  32. package/dist/browser/launch.js +265 -0
  33. package/dist/browser/launch.js.map +1 -0
  34. package/dist/browser/page.d.ts +125 -0
  35. package/dist/browser/page.js +564 -0
  36. package/dist/browser/page.js.map +1 -0
  37. package/dist/browser/pins.d.ts +12 -0
  38. package/dist/browser/pins.js +57 -0
  39. package/dist/browser/pins.js.map +1 -0
  40. package/dist/browser/resolve.d.ts +25 -0
  41. package/dist/browser/resolve.js +115 -0
  42. package/dist/browser/resolve.js.map +1 -0
  43. package/dist/browser/selectors.d.ts +10 -0
  44. package/dist/browser/selectors.js +60 -0
  45. package/dist/browser/selectors.js.map +1 -0
  46. package/dist/browser/transport.d.ts +39 -0
  47. package/dist/browser/transport.js +99 -0
  48. package/dist/browser/transport.js.map +1 -0
  49. package/dist/browser/zip.d.ts +27 -0
  50. package/dist/browser/zip.js +241 -0
  51. package/dist/browser/zip.js.map +1 -0
  52. package/dist/capture/capture.d.ts +7 -1
  53. package/dist/capture/capture.js +27 -3
  54. package/dist/capture/capture.js.map +1 -1
  55. package/dist/capture/env.d.ts +8 -0
  56. package/dist/capture/env.js +38 -0
  57. package/dist/capture/env.js.map +1 -0
  58. package/dist/capture/launch.d.ts +19 -1
  59. package/dist/capture/launch.js +91 -1
  60. package/dist/capture/launch.js.map +1 -1
  61. package/dist/capture/pool.d.ts +1 -1
  62. package/dist/capture/pool.js +41 -8
  63. package/dist/capture/pool.js.map +1 -1
  64. package/dist/capture/settle.d.ts +1 -1
  65. package/dist/capture/settle.js +2 -0
  66. package/dist/capture/settle.js.map +1 -1
  67. package/dist/capture/snap.d.ts +43 -0
  68. package/dist/capture/snap.js +103 -0
  69. package/dist/capture/snap.js.map +1 -0
  70. package/dist/capture/structure.d.ts +77 -0
  71. package/dist/capture/structure.js +498 -0
  72. package/dist/capture/structure.js.map +1 -0
  73. package/dist/diff/compare.d.ts +19 -0
  74. package/dist/diff/compare.js +19 -0
  75. package/dist/diff/compare.js.map +1 -0
  76. package/dist/diff/crops.d.ts +26 -0
  77. package/dist/diff/crops.js +92 -0
  78. package/dist/diff/crops.js.map +1 -0
  79. package/dist/diff/structural/classify.d.ts +29 -0
  80. package/dist/diff/structural/classify.js +113 -0
  81. package/dist/diff/structural/classify.js.map +1 -0
  82. package/dist/diff/structural/coverage.d.ts +11 -0
  83. package/dist/diff/structural/coverage.js +37 -0
  84. package/dist/diff/structural/coverage.js.map +1 -0
  85. package/dist/diff/structural/deltas.d.ts +29 -0
  86. package/dist/diff/structural/deltas.js +218 -0
  87. package/dist/diff/structural/deltas.js.map +1 -0
  88. package/dist/diff/structural/disambiguate.d.ts +3 -0
  89. package/dist/diff/structural/disambiguate.js +89 -0
  90. package/dist/diff/structural/disambiguate.js.map +1 -0
  91. package/dist/diff/structural/label.d.ts +15 -0
  92. package/dist/diff/structural/label.js +64 -0
  93. package/dist/diff/structural/label.js.map +1 -0
  94. package/dist/diff/structural/match.d.ts +13 -0
  95. package/dist/diff/structural/match.js +135 -0
  96. package/dist/diff/structural/match.js.map +1 -0
  97. package/dist/diff/structural/shift.d.ts +2 -0
  98. package/dist/diff/structural/shift.js +144 -0
  99. package/dist/diff/structural/shift.js.map +1 -0
  100. package/dist/diff/structural/summary.d.ts +31 -0
  101. package/dist/diff/structural/summary.js +420 -0
  102. package/dist/diff/structural/summary.js.map +1 -0
  103. package/dist/diff/structural.d.ts +40 -0
  104. package/dist/diff/structural.js +219 -0
  105. package/dist/diff/structural.js.map +1 -0
  106. package/dist/index.d.ts +34 -12
  107. package/dist/index.js +55 -11
  108. package/dist/index.js.map +1 -1
  109. package/dist/platform.d.ts +1 -1
  110. package/dist/platforms/urls.d.ts +3 -0
  111. package/dist/platforms/urls.js +89 -0
  112. package/dist/platforms/urls.js.map +1 -0
  113. package/dist/report/comment.d.ts +2 -1
  114. package/dist/report/comment.js +305 -57
  115. package/dist/report/comment.js.map +1 -1
  116. package/dist/report/format.d.ts +20 -0
  117. package/dist/report/format.js +32 -0
  118. package/dist/report/format.js.map +1 -0
  119. package/dist/report/github.d.ts +12 -0
  120. package/dist/report/github.js +21 -0
  121. package/dist/report/github.js.map +1 -1
  122. package/dist/report/html.d.ts +12 -0
  123. package/dist/report/html.js +202 -0
  124. package/dist/report/html.js.map +1 -0
  125. package/dist/run/groups.d.ts +2 -0
  126. package/dist/run/groups.js +45 -0
  127. package/dist/run/groups.js.map +1 -0
  128. package/dist/run/phases.d.ts +19 -0
  129. package/dist/run/phases.js +50 -0
  130. package/dist/run/phases.js.map +1 -0
  131. package/dist/run/run.d.ts +10 -2
  132. package/dist/run/run.js +97 -9
  133. package/dist/run/run.js.map +1 -1
  134. package/dist/shell-quote.d.ts +2 -0
  135. package/dist/shell-quote.js +10 -0
  136. package/dist/shell-quote.js.map +1 -0
  137. package/dist/types.d.ts +234 -3
  138. package/dist/url-platform.d.ts +2 -2
  139. package/dist/url-platform.js +2 -2
  140. package/dist/url-platform.js.map +1 -1
  141. package/package.json +14 -10
@@ -1,4 +1,4 @@
1
- import type { ChangedRegion, DiffStatus, Viewport } from '../types.js';
1
+ import type { Cause, ChangedRegion, DiffStatus, StructuralVerdict, Viewport } from '../types.js';
2
2
  export interface HandoffPayload {
3
3
  storyId: string;
4
4
  storyTitle: string;
@@ -11,6 +11,10 @@ export interface HandoffPayload {
11
11
  componentPath: string;
12
12
  /** Absolute path to the machine-readable sidecar for this diff. */
13
13
  diffDataPath?: string;
14
+ /** Tier-0 verdict from the run, when the capture had structure. */
15
+ structural?: StructuralVerdict;
16
+ /** `jux diff <baseline.webp> <current.webp> --crops`, when both files exist. */
17
+ cropsCommand?: string;
14
18
  images: {
15
19
  baseline?: string;
16
20
  current?: string;
@@ -28,3 +32,6 @@ export declare function buildHandoffPrompt(p: HandoffPayload): string;
28
32
  * Both are given.
29
33
  */
30
34
  export declare function describeRegion(r: ChangedRegion, viewport: Viewport): string;
35
+ /** The one wording of a cause, shared by the handoff and the CLI's review
36
+ * list (which skips `unknown`). One or two sentences, no heading. */
37
+ export declare function describeCause(c: Cause): string;
@@ -7,6 +7,7 @@
7
7
  //
8
8
  // Pure function. No I/O, no clipboard — string in, string out, so it is
9
9
  // trivially testable and callable from both the CLI and a server.
10
+ import { describeDeltas } from '../diff/structural/summary.js';
10
11
  export function buildHandoffPrompt(p) {
11
12
  const lines = [];
12
13
  lines.push(`# Visual change: ${p.storyTitle}`);
@@ -24,7 +25,45 @@ export function buildHandoffPrompt(p) {
24
25
  if (p.diffDataPath) {
25
26
  lines.push(`Read \`${p.diffDataPath}\` for the full machine-readable diff.`, '');
26
27
  }
27
- lines.push('## What changed');
28
+ const v = p.structural;
29
+ // Missing data is not a verdict: with no snapshot on one side and nothing
30
+ // to list, a structure section would be empty and misleading.
31
+ const missing = v && v.deltas.length === 0
32
+ ? v.flags.includes('no-baseline-structure')
33
+ ? 'baseline'
34
+ : v.flags.includes('no-current-structure')
35
+ ? 'current'
36
+ : undefined
37
+ : undefined;
38
+ if (v?.cause)
39
+ lines.push('## Why', '', describeCause(v.cause), '');
40
+ if (v && missing) {
41
+ lines.push(missing === 'baseline'
42
+ ? 'No structure snapshot for the baseline (approved before juxtapose recorded structure). Re-approve after this change to get structural diffs next time.'
43
+ : 'No structure snapshot for the current capture (structure capture failed or was unavailable). Re-run the capture to get structural diffs.', '');
44
+ }
45
+ else if (v) {
46
+ lines.push('## What changed (structure)');
47
+ lines.push('');
48
+ lines.push(v.summary);
49
+ lines.push('');
50
+ if (v.deltas.length > 0) {
51
+ lines.push(...describeDeltas(v.deltas, v.deltaCount));
52
+ if (v.deltaCount > v.deltas.length) {
53
+ lines.push(` …and ${v.deltaCount - v.deltas.length} more (see the diff data file)`);
54
+ }
55
+ lines.push('');
56
+ lines.push('Check these deltas against the change you intended. If they are all intended,', `the change is expected: approve it (\`jux approve --story ${p.storyId}\`). If any`, 'delta is one you did not intend, fix that before approving.');
57
+ }
58
+ if (v.flags.length > 0) {
59
+ lines.push('', `Flags: ${v.flags.join(', ')}`);
60
+ }
61
+ if (v.explained !== 'full') {
62
+ lines.push('', 'Part of the pixel change has no matching DOM or style delta (canvas, images, or', 'rendering). Look at the diff image for those regions.');
63
+ }
64
+ lines.push('');
65
+ }
66
+ lines.push(v && !missing ? '## Pixels' : '## What changed');
28
67
  lines.push('');
29
68
  lines.push('```json');
30
69
  lines.push(JSON.stringify({
@@ -49,13 +88,15 @@ export function buildHandoffPrompt(p) {
49
88
  }
50
89
  lines.push('## Assessment');
51
90
  lines.push('');
52
- lines.push(magnitudeHint(p.mismatchPercent));
91
+ lines.push(magnitudeHint(p.mismatchPercent, p.structural?.deltaCount ?? 0));
53
92
  lines.push('');
54
93
  lines.push(...actions(p, { approveVerb: 'accept the new rendering' }));
55
- if (p.images.baseline || p.images.current || p.images.diff) {
56
- lines.push('');
57
- lines.push('## Images (inspect only if the data above is insufficient)');
58
- lines.push('');
94
+ if (p.cropsCommand || p.images.baseline || p.images.current || p.images.diff) {
95
+ lines.push('', '## If still unsure', '');
96
+ if (p.cropsCommand) {
97
+ lines.push(`Side-by-side crops of each changed region, unexplained first — run \`${p.cropsCommand}\` and open the files it lists.`, '');
98
+ }
99
+ lines.push('Full images, last resort:');
59
100
  if (p.images.baseline)
60
101
  lines.push(`- baseline: \`${p.images.baseline}\``);
61
102
  if (p.images.current)
@@ -71,6 +112,12 @@ export function buildHandoffPrompt(p) {
71
112
  const MAX_REGIONS = 12;
72
113
  function actions(p, opts) {
73
114
  const out = ['## What to do', ''];
115
+ // A partial trace names the changed files it could see; the one that
116
+ // changed the pixels may be one it could not. Pointing the agent at the
117
+ // listed file sent it to the story's label edit for a bundled token change.
118
+ if (p.structural?.cause?.partial) {
119
+ out.push('The files under "Why" changed and are imported, but are not necessarily the cause: other imports could not be traced. Check every file changed since the base, not only those.', '');
120
+ }
74
121
  if (p.componentPath) {
75
122
  out.push(`1. Inspect the component: \`${p.componentPath}\``, `2. Check recent history: \`git log -p -- ${p.componentPath}\``, '3. Decide: intentional change, or regression?');
76
123
  }
@@ -99,14 +146,35 @@ export function describeRegion(r, viewport) {
99
146
  const horizontal = cx < viewport.width / 3 ? 'left' : cx > (viewport.width * 2) / 3 ? 'right' : 'center';
100
147
  return `(${r.x}, ${r.y}) ${r.width}×${r.height}px — ${vertical}-${horizontal}, ${round(areaPct)}% of viewport`;
101
148
  }
149
+ /** The one wording of a cause, shared by the handoff and the CLI's review
150
+ * list (which skips `unknown`). One or two sentences, no heading. */
151
+ export function describeCause(c) {
152
+ const away = (d) => d === 0 ? 'the story file itself' : `${d} import${d === 1 ? '' : 's'} away`;
153
+ switch (c.kind) {
154
+ case 'in-closure':
155
+ return `Changed files this story imports, nearest first: ${c.files
156
+ .map((f) => `\`${f.path}\` (${away(f.distance)})`)
157
+ .join(', ')}${c.partial ? '; other imports could not be traced' : ''}.`;
158
+ case 'config':
159
+ return `A change that reaches every story: ${c.files.map((f) => `\`${f.path}\``).join(', ')}. Expect other stories to fail the same way; the run's \`groups\` lists which.`;
160
+ case 'none-in-closure':
161
+ return "No changed file appears in this story's traced imports. The cause is likely outside your diff: a dependency, an asset, the environment, or render drift.";
162
+ case 'unknown':
163
+ return "Cause unknown: this build doesn't expose every changed file's place in the story's imports, so nothing can be inferred from it.";
164
+ }
165
+ }
102
166
  /**
103
167
  * Calibrate the agent's suspicion to the size of the change.
104
168
  *
105
169
  * Without this, agents treat a 0.02% antialiasing shift and a 40% layout
106
170
  * collapse as equally alarming.
107
171
  */
108
- function magnitudeHint(pct) {
172
+ function magnitudeHint(pct, deltaCount) {
109
173
  if (pct < 0.1) {
174
+ // A sub-threshold colour change marks no pixels at all; calling it
175
+ // antialiasing noise beside a real delta argued with the section above.
176
+ if (deltaCount > 0)
177
+ return `Pixels are below tolerance, but structure records ${deltaCount} delta(s); judge those, not the pixel count.`;
110
178
  return 'Under 0.1% — consistent with sub-pixel antialiasing noise. Usually safe to approve, but confirm the changed regions are not on meaningful content.';
111
179
  }
112
180
  if (pct < 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/agent/handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/agent/handoff.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,sEAAsE;AACtE,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AASlE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AA2B/D,MAAM,UAAU,kBAAkB,CAAC,CAAiB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,6EAA6E,EAC7E,yEAAyE,EACzE,sCAAsC,EACtC,EAAE,EACF,GAAG,OAAO,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC,CACjE,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CACR,8EAA8E,EAC9E,8EAA8E,EAC9E,wCAAwC,EACxC,EAAE,EACF,0EAA0E,EAC1E,kCAAkC,EAClC,EAAE,EACF,GAAG,OAAO,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC,CACzD,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,YAAY,wCAAwC,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACvB,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,OAAO,GACX,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACzC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACxC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS;QACf,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CACR,OAAO,KAAK,UAAU;YACpB,CAAC,CAAC,wJAAwJ;YAC1J,CAAC,CAAC,0IAA0I,EAC9I,EAAE,CACH,CAAC;IACJ,CAAC;SAAM,IAAI,CAAC,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CACR,UAAU,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,gCAAgC,CACzE,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CACR,+EAA+E,EAC/E,6DAA6D,CAAC,CAAC,OAAO,aAAa,EACnF,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CACR,EAAE,EACF,iFAAiF,EACjF,uDAAuD,CACxD,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,SAAS,CACZ;QACE,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC;QACzC,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM;KACrC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CACR,UAAU,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,WAAW,gCAAgC,CAChF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;IAEvE,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CACR,wEAAwE,CAAC,CAAC,YAAY,iCAAiC,EACvH,EAAE,CACH,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CACR,mBAAmB,CAAC,CAAC,WAAW,4FAA4F,CAC7H,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,SAAS,OAAO,CAAC,CAAiB,EAAE,IAA6B;IAC/D,MAAM,GAAG,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAClC,qEAAqE;IACrE,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CACN,gLAAgL,EAChL,EAAE,CACH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CACN,+BAA+B,CAAC,CAAC,aAAa,IAAI,EAClD,4CAA4C,CAAC,CAAC,aAAa,IAAI,EAC/D,+CAA+C,CAChD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CACN,4CAA4C,EAC5C,iDAAiD,EACjD,+CAA+C,CAChD,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,IAAI,CACN,EAAE,EACF,6CAA6C,CAAC,CAAC,OAAO,SAAS,IAAI,CAAC,WAAW,GAAG,EAClF,yEAAyE,CAC1E,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,CAAgB,EAAE,QAAkB;IACjE,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;IAClF,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,QAAQ,GACZ,EAAE,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;YAC9B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,CAAC;IACjB,MAAM,UAAU,GACd,EAAE,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxF,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,QAAQ,QAAQ,IAAI,UAAU,KAAK,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;AACjH,CAAC;AAED;sEACsE;AACtE,MAAM,UAAU,aAAa,CAAC,CAAQ;IACpC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CACzB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAC9E,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,YAAY;YACf,OAAO,oDAAoD,CAAC,CAAC,KAAK;iBAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;iBACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5E,KAAK,QAAQ;YACX,OAAO,sCAAsC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gFAAgF,CAAC;QAC9K,KAAK,iBAAiB;YACpB,OAAO,0JAA0J,CAAC;QACpK,KAAK,SAAS;YACZ,OAAO,iIAAiI,CAAC;IAC7I,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,UAAkB;IACpD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,mEAAmE;QACnE,wEAAwE;QACxE,IAAI,UAAU,GAAG,CAAC;YAChB,OAAO,qDAAqD,UAAU,8CAA8C,CAAC;QACvH,OAAO,oJAAoJ,CAAC;IAC9J,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,wGAAwG,CAAC;IAClH,CAAC;IACD,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;QACb,OAAO,iFAAiF,CAAC;IAC3F,CAAC;IACD,OAAO,+IAA+I,CAAC;AACzJ,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC"}
@@ -1,4 +1,11 @@
1
1
  import type { StoryManifest } from '../types.js';
2
+ interface ViteManifestEntry {
3
+ file: string;
4
+ src?: string;
5
+ imports?: string[];
6
+ dynamicImports?: string[];
7
+ }
8
+ export type ViteManifest = Record<string, ViteManifestEntry>;
2
9
  export interface AffectedOptions {
3
10
  projectRoot: string;
4
11
  /** Directories whose contents invalidate everything, from the platform
@@ -16,4 +23,55 @@ export interface AffectedResult {
16
23
  * mysterious. */
17
24
  reason: 'no-baseline' | 'config-changed' | 'dependency-changed' | 'graph-walk' | 'no-match-fallback' | 'git-unavailable' | 'no-changes';
18
25
  }
26
+ /** A root lockfile: dependencies changed, so every story may render
27
+ * differently. A nested package.json (a fixture) is not one. */
28
+ export declare function isLockfileChange(file: string): boolean;
29
+ /** A root `tsconfig*.json`: compiler options reach every module, and the
30
+ * manifest never names it, so without this a tsconfig edit beside a
31
+ * component edit narrowed the run to that component's stories. */
32
+ export declare function isTsconfigChange(file: string): boolean;
33
+ /** Anything under a platform config dir (`.storybook`, `.ladle`) reaches
34
+ * every story. */
35
+ export declare function isConfigChange(file: string, configDirs: string[]): boolean;
19
36
  export declare function resolveAffected(stories: StoryManifest[], sinceCommit: string | null, opts: AffectedOptions): Promise<AffectedResult>;
37
+ /**
38
+ * Which stories a set of source files could affect, without consulting git.
39
+ *
40
+ * This is the watch-mode entry point, and it inverts the fail-safe that
41
+ * `resolveAffected` uses. There, an uncertain answer escalates to capturing
42
+ * everything, because a missed story ships a regression. Here the trigger is a
43
+ * developer typing: escalating would recapture the whole suite on every
44
+ * keystroke-pause, which is not a safety net, it is a hang. An uncertain answer
45
+ * narrows to the files we know changed, and the CI run remains the backstop
46
+ * that cannot be fooled.
47
+ *
48
+ * The bundler graph is best-effort. Storybook's dev server has no build
49
+ * manifest, so when `buildDir` is absent or unbuilt we fall back to matching
50
+ * stories by their own component path — edit `Button.tsx` and every Button
51
+ * story recaptures. That misses a `Card` that imports `Button`; a build lying
52
+ * around upgrades the answer for free.
53
+ */
54
+ export declare function resolveAffectedFromPaths(stories: StoryManifest[], changedFiles: string[], opts: {
55
+ projectRoot: string;
56
+ buildDir?: string;
57
+ }): Promise<StoryManifest[]>;
58
+ /** Vite's `imports[]` holds chunk keys, not source paths; this is the map
59
+ * both graph directions resolve an edge through. A chunk with no `src` (a
60
+ * bundled component chunk in a Storybook build) has no entry. */
61
+ export declare function keyToSrc(manifest: ViteManifest): Map<string, string>;
62
+ export declare function loadViteManifest(buildDir: string): Promise<ViteManifest | null>;
63
+ /** The files changed since `sinceCommit`, as git prints them: relative to
64
+ * the repository top level, forward slashes. The working tree counts (an
65
+ * agent asks before it commits), and so do untracked files that are not
66
+ * ignored. Null when git cannot say. NUL-separated with no trimming, so a
67
+ * name with a space, a newline or a non-ASCII character is read exactly;
68
+ * without `-z` git quotes such names and the quoted form matches nothing. */
69
+ export declare function gitChangedFiles(sinceCommit: string, cwd: string): string[] | null;
70
+ /** Whether `ref` names a commit, for checking `--since` before a run leans
71
+ * on it. A leading dash is refused: git would read it as an option. */
72
+ export declare function gitIsCommit(ref: string, cwd: string): boolean;
73
+ /** The repository root, which git's paths are relative to. Null outside a
74
+ * repository or without git. */
75
+ export declare function gitTopLevel(cwd: string): string | null;
76
+ export declare function toPosixRelative(root: string, abs: string): string;
77
+ export {};
@@ -19,6 +19,23 @@ const LOCKFILES = new Set([
19
19
  'pnpm-lock.yaml',
20
20
  'bun.lockb',
21
21
  ]);
22
+ /** A root lockfile: dependencies changed, so every story may render
23
+ * differently. A nested package.json (a fixture) is not one. */
24
+ export function isLockfileChange(file) {
25
+ const base = file.split('/').pop() ?? file;
26
+ return LOCKFILES.has(base) && !file.includes('/');
27
+ }
28
+ /** A root `tsconfig*.json`: compiler options reach every module, and the
29
+ * manifest never names it, so without this a tsconfig edit beside a
30
+ * component edit narrowed the run to that component's stories. */
31
+ export function isTsconfigChange(file) {
32
+ return !file.includes('/') && /^tsconfig(\..+)?\.json$/.test(file);
33
+ }
34
+ /** Anything under a platform config dir (`.storybook`, `.ladle`) reaches
35
+ * every story. */
36
+ export function isConfigChange(file, configDirs) {
37
+ return configDirs.some((dir) => file === dir || file.startsWith(dir + '/'));
38
+ }
22
39
  export async function resolveAffected(stories, sinceCommit, opts) {
23
40
  // No point of comparison — everything is affected.
24
41
  if (sinceCommit === null && !opts.changedFiles) {
@@ -30,13 +47,12 @@ export async function resolveAffected(stories, sinceCommit, opts) {
30
47
  if (changed.length === 0)
31
48
  return { stories: [], reason: 'no-changes' };
32
49
  for (const file of changed) {
33
- const base = file.split('/').pop() ?? file;
34
- if (LOCKFILES.has(base) && !file.includes('/')) {
50
+ if (isLockfileChange(file))
35
51
  return { stories, reason: 'dependency-changed' };
36
- }
37
- if (opts.configDirs.some((dir) => file === dir || file.startsWith(dir + '/'))) {
52
+ if (isTsconfigChange(file))
53
+ return { stories, reason: 'config-changed' };
54
+ if (isConfigChange(file, opts.configDirs))
38
55
  return { stories, reason: 'config-changed' };
39
- }
40
56
  }
41
57
  const manifest = opts.buildDir ? await loadViteManifest(opts.buildDir) : null;
42
58
  if (!manifest) {
@@ -56,6 +72,54 @@ export async function resolveAffected(stories, sinceCommit, opts) {
56
72
  return { stories, reason: 'no-match-fallback' };
57
73
  return { stories: matched, reason: 'graph-walk' };
58
74
  }
75
+ /**
76
+ * Which stories a set of source files could affect, without consulting git.
77
+ *
78
+ * This is the watch-mode entry point, and it inverts the fail-safe that
79
+ * `resolveAffected` uses. There, an uncertain answer escalates to capturing
80
+ * everything, because a missed story ships a regression. Here the trigger is a
81
+ * developer typing: escalating would recapture the whole suite on every
82
+ * keystroke-pause, which is not a safety net, it is a hang. An uncertain answer
83
+ * narrows to the files we know changed, and the CI run remains the backstop
84
+ * that cannot be fooled.
85
+ *
86
+ * The bundler graph is best-effort. Storybook's dev server has no build
87
+ * manifest, so when `buildDir` is absent or unbuilt we fall back to matching
88
+ * stories by their own component path — edit `Button.tsx` and every Button
89
+ * story recaptures. That misses a `Card` that imports `Button`; a build lying
90
+ * around upgrades the answer for free.
91
+ */
92
+ export async function resolveAffectedFromPaths(stories, changedFiles, opts) {
93
+ if (changedFiles.length === 0)
94
+ return [];
95
+ const changed = changedFiles.map((f) => toPosixRelative(opts.projectRoot, path.resolve(opts.projectRoot, f)));
96
+ if (opts.buildDir) {
97
+ const manifest = await loadViteManifest(opts.buildDir);
98
+ if (manifest) {
99
+ const affected = walkDependents(buildReverseGraph(manifest), changed);
100
+ const matched = stories.filter((s) => affected.has(toPosixRelative(opts.projectRoot, s.componentPath)));
101
+ // An empty result means the graph does not know these files, not that
102
+ // nothing depends on them — fall through rather than reporting none.
103
+ if (matched.length > 0)
104
+ return matched;
105
+ }
106
+ }
107
+ return stories.filter((s) => {
108
+ const rel = toPosixRelative(opts.projectRoot, s.componentPath);
109
+ return changed.some((c) => rel === c || rel.endsWith('/' + c) || c.endsWith('/' + rel));
110
+ });
111
+ }
112
+ /** Vite's `imports[]` holds chunk keys, not source paths; this is the map
113
+ * both graph directions resolve an edge through. A chunk with no `src` (a
114
+ * bundled component chunk in a Storybook build) has no entry. */
115
+ export function keyToSrc(manifest) {
116
+ const map = new Map();
117
+ for (const [key, entry] of Object.entries(manifest)) {
118
+ if (entry.src)
119
+ map.set(key, entry.src);
120
+ }
121
+ return map;
122
+ }
59
123
  /**
60
124
  * Build `imported → importers` from Vite's manifest.
61
125
  *
@@ -63,18 +127,14 @@ export async function resolveAffected(stories, sinceCommit, opts) {
63
127
  * means mapping key → src first.
64
128
  */
65
129
  function buildReverseGraph(manifest) {
66
- const keyToSrc = new Map();
67
- for (const [key, entry] of Object.entries(manifest)) {
68
- if (entry.src)
69
- keyToSrc.set(key, entry.src);
70
- }
130
+ const srcOf = keyToSrc(manifest);
71
131
  const reverse = new Map();
72
132
  for (const entry of Object.values(manifest)) {
73
133
  const importer = entry.src;
74
134
  if (!importer)
75
135
  continue;
76
136
  for (const key of [...(entry.imports ?? []), ...(entry.dynamicImports ?? [])]) {
77
- const imported = keyToSrc.get(key) ?? key;
137
+ const imported = srcOf.get(key) ?? key;
78
138
  let set = reverse.get(imported);
79
139
  if (!set)
80
140
  reverse.set(imported, (set = new Set()));
@@ -100,7 +160,7 @@ function walkDependents(reverse, seeds) {
100
160
  }
101
161
  return seen;
102
162
  }
103
- async function loadViteManifest(buildDir) {
163
+ export async function loadViteManifest(buildDir) {
104
164
  for (const rel of ['.vite/manifest.json', 'manifest.json']) {
105
165
  try {
106
166
  return JSON.parse(await readFile(path.join(buildDir, rel), 'utf8'));
@@ -111,22 +171,74 @@ async function loadViteManifest(buildDir) {
111
171
  }
112
172
  return null;
113
173
  }
114
- function gitChangedFiles(sinceCommit, cwd) {
174
+ /** The files changed since `sinceCommit`, as git prints them: relative to
175
+ * the repository top level, forward slashes. The working tree counts (an
176
+ * agent asks before it commits), and so do untracked files that are not
177
+ * ignored. Null when git cannot say. NUL-separated with no trimming, so a
178
+ * name with a space, a newline or a non-ASCII character is read exactly;
179
+ * without `-z` git quotes such names and the quoted form matches nothing. */
180
+ export function gitChangedFiles(sinceCommit, cwd) {
181
+ // A leading dash would be read as an option (`--output=<file>` writes one).
182
+ if (sinceCommit.startsWith('-'))
183
+ return null;
184
+ try {
185
+ // --no-renames: with rename detection (a user setting, `diff.renames`)
186
+ // git lists only the new name, and a story whose file was moved away
187
+ // lost its change. Both sides are listed instead.
188
+ const tracked = git(['diff', '--name-only', '--no-renames', '-z', sinceCommit, '--'], cwd);
189
+ // `:/` and `--full-name`: the whole repository, top-level-relative, even
190
+ // when cwd is a subdirectory, matching `git diff`'s paths.
191
+ const untracked = git(['ls-files', '--others', '--exclude-standard', '-z', '--full-name', '--', ':/'], cwd);
192
+ return [...new Set([...tracked.split('\0'), ...untracked.split('\0')])].filter((f) => f.length > 0);
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ /** Whether `ref` names a commit, for checking `--since` before a run leans
199
+ * on it. A leading dash is refused: git would read it as an option. */
200
+ export function gitIsCommit(ref, cwd) {
201
+ if (ref.startsWith('-'))
202
+ return false;
115
203
  try {
116
- const out = execFileSync('git', ['diff', '--name-only', `${sinceCommit}..HEAD`], {
117
- cwd,
118
- encoding: 'utf8',
119
- });
120
- return out
121
- .split('\n')
122
- .map((s) => s.trim())
123
- .filter(Boolean);
204
+ git(['rev-parse', '--verify', '--quiet', `${ref}^{commit}`], cwd);
205
+ return true;
206
+ }
207
+ catch {
208
+ return false;
209
+ }
210
+ }
211
+ /** The repository root, which git's paths are relative to. Null outside a
212
+ * repository or without git. */
213
+ export function gitTopLevel(cwd) {
214
+ try {
215
+ // Only the line end: a directory name may itself end in a space.
216
+ return git(['rev-parse', '--show-toplevel'], cwd).replace(/\n$/, '');
124
217
  }
125
218
  catch {
126
219
  return null;
127
220
  }
128
221
  }
129
- function toPosixRelative(root, abs) {
222
+ const GIT_TIMEOUT_MS = 10_000;
223
+ const GIT_MAX_BUFFER = 64 * 1024 * 1024;
224
+ /** Every git call goes through here. Git's stderr is dropped: outside a
225
+ * repository it printed "fatal: not a git repository" and `git diff`'s full
226
+ * usage text to the user's terminal, for a failure the caller already
227
+ * handles. The timeout bounds a git that hangs (a lock, a network
228
+ * filesystem); a timeout is a failure like any other. */
229
+ function git(args, cwd) {
230
+ return execFileSync('git', ['-c', 'core.quotePath=false', ...args], {
231
+ cwd,
232
+ encoding: 'utf8',
233
+ stdio: ['ignore', 'pipe', 'ignore'],
234
+ timeout: GIT_TIMEOUT_MS,
235
+ // The 1 MiB default holds about 15,000 changed paths of 70 bytes; a
236
+ // vendored tree or a repo-wide rename passes that, and an overflow throws. Past this
237
+ // larger cap the caller's catch still degrades (unknown, or a full run).
238
+ maxBuffer: GIT_MAX_BUFFER,
239
+ });
240
+ }
241
+ export function toPosixRelative(root, abs) {
130
242
  return path.relative(root, abs).split(path.sep).join('/');
131
243
  }
132
244
  //# sourceMappingURL=affected.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"affected.js","sourceRoot":"","sources":["../../src/analysis/affected.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,kDAAkD;AAClD,EAAE;AACF,qDAAqD;AACrD,+CAA+C;AAC/C,EAAE;AACF,+EAA+E;AAC/E,oBAAoB;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAsC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc;IACd,mBAAmB;IACnB,WAAW;IACX,gBAAgB;IAChB,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAwB,EACxB,WAA0B,EAC1B,IAAqB;IAErB,mDAAmD;IACnD,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,eAAe,CAAC,WAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAErF,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;QAC3C,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,0EAA0E;QAC1E,0CAA0C;QAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,yEAAyE;IACzE,uEAAuE;IACvE,8CAA8C;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAE1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,QAAsB;IAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,GAAG;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YAC1C,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;YACnD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;2CAC2C;AAC3C,SAAS,cAAc,CAAC,OAAiC,EAAE,KAAe;IACxE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAiB,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB,EAAE,GAAW;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,WAAW,QAAQ,CAAC,EAAE;YAC/E,GAAG;YACH,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,OAAO,GAAG;aACP,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,GAAW;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"affected.js","sourceRoot":"","sources":["../../src/analysis/affected.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Cause } from '../types.js';
2
+ import { type ViteManifest } from './affected.js';
3
+ export interface CauseIndex {
4
+ /** The cause for one story's component path. Never throws, never reads
5
+ * anything before the first call. */
6
+ causeFor(componentPath: string): Promise<Cause>;
7
+ }
8
+ /** One changed file, in both forms the rules need. */
9
+ export interface ChangedFile {
10
+ /** Posix, relative to the project root: what a manifest `src` holds. */
11
+ path: string;
12
+ /** As git prints it, relative to the repository top level. In a monorepo
13
+ * only this form shows that `../../pnpm-lock.yaml` is the root lockfile. */
14
+ repoPath: string;
15
+ }
16
+ export interface CauseSources {
17
+ projectRoot: string;
18
+ configDirs: string[];
19
+ /** Null when git could not say. */
20
+ changedFiles: ChangedFile[] | null;
21
+ manifest: ViteManifest | null;
22
+ }
23
+ /** The index from already-loaded inputs. Pure. */
24
+ export declare function buildCauseIndex(src: CauseSources): CauseIndex;
25
+ /** The index for `jux run --since`. Lazy and memoized, so the manifest and
26
+ * git are read once, and only if some story fails. */
27
+ export declare function prepareCause(opts: {
28
+ projectRoot: string;
29
+ buildDir?: string;
30
+ sinceCommit: string;
31
+ configDirs: string[];
32
+ }): CauseIndex;