@juangadm/pre-post 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -182
- package/dist/baseline.d.ts +122 -3
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +491 -46
- package/dist/baseline.js.map +1 -1
- package/dist/bin/cli.js +41 -17
- package/dist/bin/cli.js.map +1 -1
- package/dist/browser.d.ts +38 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +132 -11
- package/dist/browser.js.map +1 -1
- package/dist/commands/compare.d.ts.map +1 -1
- package/dist/commands/compare.js +5 -5
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/detect.d.ts +5 -0
- package/dist/commands/detect.d.ts.map +1 -1
- package/dist/commands/detect.js +3 -0
- package/dist/commands/detect.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +9 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/pr.d.ts +13 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +222 -107
- package/dist/commands/pr.js.map +1 -1
- package/dist/comparison.d.ts +14 -0
- package/dist/comparison.d.ts.map +1 -1
- package/dist/comparison.js +48 -25
- package/dist/comparison.js.map +1 -1
- package/dist/diff-worker.d.ts +1 -0
- package/dist/diff-worker.d.ts.map +1 -1
- package/dist/diff-worker.js +1 -0
- package/dist/diff-worker.js.map +1 -1
- package/dist/diff.d.ts +42 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +142 -24
- package/dist/diff.js.map +1 -1
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +5 -1
- package/dist/doctor.js.map +1 -1
- package/dist/drift.d.ts +29 -0
- package/dist/drift.d.ts.map +1 -0
- package/dist/drift.js +106 -0
- package/dist/drift.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -1
- package/dist/github.d.ts +34 -3
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +102 -11
- package/dist/github.js.map +1 -1
- package/dist/report.d.ts +27 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +144 -38
- package/dist/report.js.map +1 -1
- package/dist/routes/imports.d.ts +21 -1
- package/dist/routes/imports.d.ts.map +1 -1
- package/dist/routes/imports.js +32 -2
- package/dist/routes/imports.js.map +1 -1
- package/dist/routes.d.ts +18 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +110 -29
- package/dist/routes.js.map +1 -1
- package/dist/run.d.ts +46 -12
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +138 -17
- package/dist/run.js.map +1 -1
- package/dist/sheet.d.ts +24 -0
- package/dist/sheet.d.ts.map +1 -0
- package/dist/sheet.js +94 -0
- package/dist/sheet.js.map +1 -0
- package/dist/timings.d.ts +46 -0
- package/dist/timings.d.ts.map +1 -0
- package/dist/timings.js +108 -0
- package/dist/timings.js.map +1 -0
- package/dist/types.d.ts +86 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/skill/SKILL.md +34 -10
package/dist/commands/pr.js
CHANGED
|
@@ -4,19 +4,22 @@
|
|
|
4
4
|
import fs from 'fs';
|
|
5
5
|
import os from 'os';
|
|
6
6
|
import path from 'path';
|
|
7
|
-
import { ARTIFACT_KINDS, artifactSuffix } from '../types.js';
|
|
7
|
+
import { ARTIFACT_KINDS, artifactSuffix, isBrokenVerdict } from '../types.js';
|
|
8
8
|
import { loadConfig, resolveSettings, updateConfig } from '../config.js';
|
|
9
9
|
import { currentBranch, headSha, repoRoot, resolveOwnerRepo } from '../git.js';
|
|
10
|
-
import { detectRoutesForRepo, resolveSample } from '../routes.js';
|
|
10
|
+
import { capNotice, detectRoutesForRepo, resolveSample } from '../routes.js';
|
|
11
11
|
import { closeBrowser } from '../browser.js';
|
|
12
12
|
import { parseViewport } from '../viewport.js';
|
|
13
13
|
import { authHint, detectDevServer, ensureBrowser, NeedsHumanError, probeUrl } from '../doctor.js';
|
|
14
|
-
import { cannotPublishHint, checkWriteAccess, findOpenPr, findToken, getPr, GitHub,
|
|
15
|
-
import { buildComment, STICKY_MARKER } from '../report.js';
|
|
14
|
+
import { API_BASE, cannotPublishHint, checkWriteAccess, findOpenPr, findOpenPrForCommit, findToken, getPr, GitHub, GitHubError, loginHint, publishAssets, upsertPrDescription, upsertStickyComment } from '../github.js';
|
|
15
|
+
import { buildComment, groupChanges, STICKY_MARKER } from '../report.js';
|
|
16
16
|
import { resolveAuth } from '../sessions.js';
|
|
17
|
-
import { routeSlug, runTasks } from '../run.js';
|
|
17
|
+
import { routeSlug, runTasks, throwIfBlocked } from '../run.js';
|
|
18
18
|
import { joinUrl } from '../url.js';
|
|
19
19
|
import { describeComparison, resolveComparison } from '../comparison.js';
|
|
20
|
+
import { Stopwatch } from '../timings.js';
|
|
21
|
+
import { driftNotes } from '../drift.js';
|
|
22
|
+
import { buildSheet } from '../sheet.js';
|
|
20
23
|
/**
|
|
21
24
|
* What ends up on the assets branch. The diff overlay is an intermediate used
|
|
22
25
|
* to locate the changed region; Pre beside Post is the comparison a reviewer
|
|
@@ -26,17 +29,31 @@ const PUBLISHED_KINDS = ARTIFACT_KINDS.filter(kind => kind !== 'diff');
|
|
|
26
29
|
function headersFor(config, opts) {
|
|
27
30
|
return resolveAuth({ configHeaders: config.headers, headers: opts.headers, urls: [] })?.headers ?? {};
|
|
28
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* The Post URL the caller fixed, if any.
|
|
34
|
+
*
|
|
35
|
+
* `--local` promises Post is built from this checkout. A `.pre-post.json`
|
|
36
|
+
* `after` is usually the author's own localhost, which a CI runner cannot
|
|
37
|
+
* reach, so in local mode only a flag on this very command overrides it.
|
|
38
|
+
*/
|
|
39
|
+
export function afterFor(opts, config) {
|
|
40
|
+
return opts.after ?? (opts.local ? undefined : config.after);
|
|
41
|
+
}
|
|
29
42
|
function runId(now) {
|
|
30
43
|
return now.toISOString().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);
|
|
31
44
|
}
|
|
32
45
|
export async function runPr(opts = {}) {
|
|
33
46
|
const started = Date.now();
|
|
47
|
+
const timings = new Stopwatch();
|
|
34
48
|
const log = opts.log ?? (() => undefined);
|
|
35
49
|
const root = repoRoot(opts.cwd);
|
|
36
50
|
const config = loadConfig(root);
|
|
37
51
|
const settings = resolveSettings(config, opts);
|
|
38
52
|
const ownerRepo = resolveOwnerRepo(root);
|
|
39
|
-
|
|
53
|
+
// A pull_request job checks out a merge commit with no branch, but names the
|
|
54
|
+
// PR's branch in GITHUB_HEAD_REF.
|
|
55
|
+
const branch = currentBranch(root) ?? (process.env.GITHUB_HEAD_REF?.trim() || null);
|
|
56
|
+
const head = headSha(root);
|
|
40
57
|
/** Tears down anything resolution started (a local dev server). */
|
|
41
58
|
let cleanupComparison = async () => undefined;
|
|
42
59
|
// --- GitHub access (checked before any time is spent) -----------------------
|
|
@@ -45,25 +62,18 @@ export async function runPr(opts = {}) {
|
|
|
45
62
|
// entirely made --dry-run the one mode that could never use a deployment,
|
|
46
63
|
// so it always demanded a dev server — from the person least likely to have
|
|
47
64
|
// one. Reads use `gh`; publishing and commenting use `writeGh`.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
* what makes it work — `closeBrowser()` drops a pending launch and closes
|
|
61
|
-
* nothing, and the launch then resolves into an orphan.
|
|
62
|
-
*/
|
|
63
|
-
const stopEverything = async () => {
|
|
64
|
-
await browserReady.catch(() => undefined);
|
|
65
|
-
await closeBrowser();
|
|
66
|
-
await cleanupComparison();
|
|
65
|
+
//
|
|
66
|
+
// A real run without working GitHub access still captures. Refusing up front
|
|
67
|
+
// was right for someone at a laptop, who can log in and re-run; in a hosted
|
|
68
|
+
// agent sandbox nobody is at the machine and the platform's own token is the
|
|
69
|
+
// one refused, so stopping left the user with nothing to look at. The run now
|
|
70
|
+
// captures, publishes nothing, and ends with the one sentence that fixes it.
|
|
71
|
+
const found = findToken();
|
|
72
|
+
let gh = found ? new GitHub(found.token) : null;
|
|
73
|
+
let writeGh = opts.dryRun ? null : gh;
|
|
74
|
+
/** Why nothing will be published, one per way of finding out; the most specific wins. */
|
|
75
|
+
const notPublished = {
|
|
76
|
+
noToken: !opts.dryRun && !found ? `GitHub access is needed to publish screenshots. ${loginHint()}` : undefined,
|
|
67
77
|
};
|
|
68
78
|
// Whether the token may write, asked at the same time as the PR lookup so it
|
|
69
79
|
// costs no wall clock, and answered before anything expensive begins. A token
|
|
@@ -74,44 +84,185 @@ export async function runPr(opts = {}) {
|
|
|
74
84
|
const writeAccess = writeGh && found
|
|
75
85
|
? checkWriteAccess(writeGh, ownerRepo).then(access => ({ access, source: found.source }))
|
|
76
86
|
: null;
|
|
87
|
+
// Without a branch name (a detached checkout, as a deployment-triggered job
|
|
88
|
+
// has) the PR is found from the commit it is headed by.
|
|
77
89
|
const lookup = gh
|
|
78
|
-
? opts.pr ? getPr(gh, ownerRepo, opts.pr)
|
|
90
|
+
? opts.pr ? getPr(gh, ownerRepo, opts.pr)
|
|
91
|
+
: branch ? findOpenPr(gh, ownerRepo, branch)
|
|
92
|
+
: head ? findOpenPrForCommit(gh, ownerRepo, head) : Promise.resolve(null)
|
|
79
93
|
: Promise.resolve(null);
|
|
80
94
|
// A dry run used to touch GitHub not at all, and must still work when it
|
|
81
95
|
// cannot: it is what someone runs before anything is set up. A stale token or
|
|
82
96
|
// an unreachable API degrades it to "no PR", never ends the run. A real run
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
97
|
+
// degrades the same way and records why, so it can say so at the end.
|
|
98
|
+
let lookupFailed = false;
|
|
99
|
+
const prLookup = lookup.catch(err => {
|
|
100
|
+
lookupFailed = true;
|
|
101
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
102
|
+
if (opts.dryRun) {
|
|
103
|
+
log(`GitHub lookup failed (${message}); continuing without it.`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// A refused token already carries its fix; an answer from GitHub names
|
|
107
|
+
// itself; anything else never reached GitHub at all.
|
|
108
|
+
notPublished.lookup = err instanceof NeedsHumanError || err instanceof GitHubError
|
|
109
|
+
? message
|
|
110
|
+
: `GitHub could not be reached (${message}), so nothing was published: check that this environment can reach ${API_BASE}, then re-run.`;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
});
|
|
114
|
+
// A deployment-triggered job fires for pushes to main and for branches with
|
|
115
|
+
// no PR, too. Capturing there would add images to the assets branch that no
|
|
116
|
+
// PR will ever show. Asked before detection, which can fetch history and
|
|
117
|
+
// fail on its own, because none of it matters when there is nothing to post
|
|
118
|
+
// to. Only an answer from GitHub counts as "no PR": a lookup that failed
|
|
119
|
+
// says nothing either way, and neither does one never made for want of a
|
|
120
|
+
// token, so those runs carry on and end on the instruction that fixes them.
|
|
121
|
+
if (opts.requirePr && gh && !(await prLookup) && !lookupFailed) {
|
|
122
|
+
log('No open PR for this commit; nothing to do.');
|
|
123
|
+
return {
|
|
124
|
+
repo: ownerRepo, beforeBase: '', afterBase: '', outcomes: [], skippedDynamic: [],
|
|
125
|
+
durationMs: Date.now() - started, markdown: '', outputDir: '',
|
|
126
|
+
delivery: { status: 'no-pr' },
|
|
127
|
+
};
|
|
128
|
+
}
|
|
87
129
|
// Local detection runs regardless: it is cheap, and it is the fallback when
|
|
88
130
|
// the PR has no preview deployment.
|
|
89
|
-
const explicitAfter = opts
|
|
131
|
+
const explicitAfter = afterFor(opts, config);
|
|
90
132
|
const devServer = explicitAfter ? Promise.resolve(explicitAfter) : detectDevServer();
|
|
133
|
+
// A skill copy or a pinned range from another release is why an agent
|
|
134
|
+
// follows instructions for a CLI that no longer exists. Say so up front.
|
|
135
|
+
for (const note of driftNotes({ version: opts.version, repoRoot: root }))
|
|
136
|
+
log(`Note: ${note}`);
|
|
91
137
|
// Detection is synchronous git + fs work, so run it while the PR lookup is in
|
|
92
138
|
// flight rather than after it.
|
|
93
139
|
const detection = detectRoutesForRepo({ cwd: root, config, maxRoutes: settings.maxRoutes, framework: opts.framework, diffTarget: opts.base, log });
|
|
140
|
+
timings.add('detect', detection.durationMs);
|
|
94
141
|
const appPrefix = path.relative(root, detection.appRoot) || undefined;
|
|
95
|
-
|
|
96
|
-
|
|
142
|
+
// --- Routes --------------------------------------------------------------------
|
|
143
|
+
// Settled before anything slow starts: a branch whose only affected page
|
|
144
|
+
// still needs a sample URL gets that answer in a second, not after a browser
|
|
145
|
+
// and two dev servers have started for nothing.
|
|
146
|
+
const explicitRoutes = Boolean(opts.routes?.length);
|
|
147
|
+
const routes = explicitRoutes ? opts.routes : detection.routes.map(r => r.path);
|
|
148
|
+
const skippedDynamic = explicitRoutes ? [] : detection.skippedDynamic;
|
|
149
|
+
const omitted = !explicitRoutes && detection.omitted.length
|
|
150
|
+
? { routes: detection.omitted.map(r => r.path), cap: settings.maxRoutes }
|
|
151
|
+
: undefined;
|
|
152
|
+
if (!explicitRoutes) {
|
|
153
|
+
log(`Routes (${detection.framework}, ${detection.durationMs}ms): ${routes.length ? routes.join(', ') : 'none detected'}`);
|
|
154
|
+
for (const r of detection.routes)
|
|
155
|
+
log(` ${r.path.padEnd(28)} ${r.confidence.padEnd(6)} ${r.reason}`);
|
|
156
|
+
if (omitted)
|
|
157
|
+
log(` ${capNotice(omitted.routes, omitted.cap)}`);
|
|
158
|
+
if (!routes.length) {
|
|
159
|
+
log(skippedDynamic.length
|
|
160
|
+
? `Nothing to capture until ${skippedDynamic.join(', ')} ${skippedDynamic.length === 1 ? 'has' : 'have'} a sample URL.`
|
|
161
|
+
: 'Nothing this branch changed renders on a page; nothing to capture.');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// --- Start the slow, independent things now; they overlap resolution -------
|
|
165
|
+
// Only after the --require-pr answer and only with a page to capture: a
|
|
166
|
+
// fresh runner would otherwise download and launch Chromium for nothing.
|
|
167
|
+
const browserReady = routes.length ? timings.time('browser', ensureBrowser(), { background: true }) : Promise.resolve();
|
|
168
|
+
/**
|
|
169
|
+
* Everything this run started, in a form every early exit can call.
|
|
170
|
+
*
|
|
171
|
+
* The browser is launched from here rather than at the capture, so any throw
|
|
172
|
+
* before that block owns closing it: the CLI's `process.exit` hides the
|
|
173
|
+
* difference, but a caller using `runPr()` as a library catches the error and
|
|
174
|
+
* is left with a Chromium nothing references. Awaiting the launch first is
|
|
175
|
+
* what makes it work — `closeBrowser()` drops a pending launch and closes
|
|
176
|
+
* nothing, and the launch then resolves into an orphan.
|
|
177
|
+
*/
|
|
178
|
+
const stopEverything = async () => {
|
|
179
|
+
// Independent, so side by side: the browser and the servers each take
|
|
180
|
+
// their own time to go, and neither needs the other gone first.
|
|
181
|
+
await Promise.all([
|
|
182
|
+
browserReady.catch(() => undefined).then(() => closeBrowser()),
|
|
183
|
+
cleanupComparison(),
|
|
184
|
+
]);
|
|
185
|
+
};
|
|
186
|
+
const pr = await timings.time('github', prLookup);
|
|
187
|
+
// Whatever refused the lookup refuses every later read too: resolution would
|
|
188
|
+
// only spend time asking GitHub for deployments it cannot see.
|
|
189
|
+
if (lookupFailed)
|
|
190
|
+
gh = null;
|
|
97
191
|
// Before the local baseline, which can install and build a whole app, and
|
|
98
192
|
// long before the captures. An answer that is not about access — a 500, a
|
|
99
193
|
// dropped connection — is not evidence of anything, so it says so and the run
|
|
100
194
|
// continues to fail wherever it really fails.
|
|
101
195
|
const write = await writeAccess;
|
|
102
196
|
if (write && !write.access.writable) {
|
|
103
|
-
if (write.access.reason === 'rejected')
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
197
|
+
if (write.access.reason === 'rejected')
|
|
198
|
+
notPublished.write = cannotPublishHint(ownerRepo, write.source);
|
|
199
|
+
else
|
|
200
|
+
log(`Could not check whether the token can publish (${write.access.detail}); continuing.`);
|
|
201
|
+
}
|
|
202
|
+
// The write probe knows which credential was refused, so its sentence is the
|
|
203
|
+
// most precise; a failed lookup is next; a missing token is the fallback.
|
|
204
|
+
const skipReason = notPublished.write ?? notPublished.lookup ?? notPublished.noToken;
|
|
205
|
+
if (skipReason) {
|
|
206
|
+
writeGh = null;
|
|
207
|
+
log('GitHub will not accept this run\'s screenshots; capturing anyway, nothing will be published.');
|
|
108
208
|
}
|
|
209
|
+
const now = new Date();
|
|
210
|
+
const id = runId(now);
|
|
211
|
+
/** Assemble the result from whatever was captured, write it to the PR, and time it. */
|
|
212
|
+
const finish = async (captured) => {
|
|
213
|
+
const result = {
|
|
214
|
+
repo: ownerRepo,
|
|
215
|
+
prNumber: pr?.number,
|
|
216
|
+
...captured,
|
|
217
|
+
skippedDynamic,
|
|
218
|
+
omitted,
|
|
219
|
+
durationMs: Date.now() - started,
|
|
220
|
+
markdown: '',
|
|
221
|
+
timings: timings.toJSON(),
|
|
222
|
+
delivery: opts.dryRun ? { status: 'dry-run' } : skipReason ? { status: 'skipped', hint: skipReason } : { status: 'published' },
|
|
223
|
+
};
|
|
224
|
+
result.markdown = buildComment(result, { version: opts.version, headSha: head, now, filesDir: result.outputDir });
|
|
225
|
+
if (writeGh && (opts.comment ?? true))
|
|
226
|
+
await timings.time('describe', async () => {
|
|
227
|
+
if (pr) {
|
|
228
|
+
// The description is what a reviewer reads first, so put the images there
|
|
229
|
+
// and fall back to a comment only when the PR cannot be edited.
|
|
230
|
+
const described = await upsertPrDescription(writeGh, ownerRepo, pr.number, result.markdown, 'pre-post');
|
|
231
|
+
if (described.updated) {
|
|
232
|
+
result.commentUrl = described.html_url;
|
|
233
|
+
result.commentKind = 'description';
|
|
234
|
+
log(`Updated PR description: ${described.html_url}`);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const comment = await upsertStickyComment(writeGh, ownerRepo, pr.number, result.markdown, STICKY_MARKER);
|
|
238
|
+
result.commentUrl = comment.html_url;
|
|
239
|
+
result.commentKind = 'comment';
|
|
240
|
+
log(`Cannot edit the PR description; ${comment.created ? 'posted' : 'updated'} a comment instead: ${comment.html_url}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
log(`No open PR for branch "${branch}". Open one and re-run, or paste the markdown below.`);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// Measured again after the description update, so the summary's total and
|
|
248
|
+
// the Timings line below describe the same span. The markdown above keeps
|
|
249
|
+
// the earlier figure: it had to be written before this step could run.
|
|
250
|
+
result.durationMs = Date.now() - started;
|
|
251
|
+
result.timings = timings.toJSON();
|
|
252
|
+
const [first, ...rest] = timings.summary(result.durationMs);
|
|
253
|
+
log(`Timings: ${first}`);
|
|
254
|
+
for (const line of rest)
|
|
255
|
+
log(line);
|
|
256
|
+
return result;
|
|
257
|
+
};
|
|
258
|
+
if (!routes.length)
|
|
259
|
+
return finish({ outcomes: [], beforeBase: '', afterBase: '', outputDir: '' });
|
|
109
260
|
// --- What are we comparing? ---------------------------------------------------
|
|
110
261
|
const headers = headersFor(config, opts);
|
|
111
262
|
// Resolution can throw (no baseline, an install that failed): the browser was
|
|
112
263
|
// launched before this and nothing else would close it, so its teardown has
|
|
113
264
|
// to cover the throw as well as the happy path.
|
|
114
|
-
const comparison = await resolveComparison({
|
|
265
|
+
const comparison = await timings.time('resolve', resolveComparison({
|
|
115
266
|
gh, ownerRepo, pr, repoRoot: root, appPrefix, config,
|
|
116
267
|
// Detection already established this; the baseline must be built from the
|
|
117
268
|
// same commit, or Pre and the route list disagree about what changed.
|
|
@@ -123,8 +274,8 @@ export async function runPr(opts = {}) {
|
|
|
123
274
|
headSha: head ?? undefined,
|
|
124
275
|
before: opts.before, after: explicitAfter,
|
|
125
276
|
devServer, probe: url => probeUrl(url, headers),
|
|
126
|
-
allowLocalBaseline: opts.localBaseline, log,
|
|
127
|
-
}).catch(async (err) => { await stopEverything(); throw err; });
|
|
277
|
+
allowLocalBaseline: opts.localBaseline, localOnly: opts.local, log, timings,
|
|
278
|
+
}), { contains: ['pre', 'post'] }).catch(async (err) => { await stopEverything(); throw err; });
|
|
128
279
|
cleanupComparison = comparison.stop;
|
|
129
280
|
for (const line of describeComparison(comparison))
|
|
130
281
|
log(line);
|
|
@@ -134,24 +285,6 @@ export async function runPr(opts = {}) {
|
|
|
134
285
|
updateConfig(root, { before });
|
|
135
286
|
log('Saved production URL to .pre-post.json');
|
|
136
287
|
}
|
|
137
|
-
// --- Routes (sync: git + import graph) ----------------------------------------
|
|
138
|
-
const samples = config.samples || {};
|
|
139
|
-
let routes;
|
|
140
|
-
let skippedDynamic = [];
|
|
141
|
-
if (opts.routes?.length) {
|
|
142
|
-
routes = opts.routes;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
routes = detection.routes.map(r => r.path);
|
|
146
|
-
skippedDynamic = detection.skippedDynamic;
|
|
147
|
-
log(`Routes (${detection.framework}, ${detection.durationMs}ms): ${routes.length ? routes.join(', ') : 'none detected'}`);
|
|
148
|
-
for (const r of detection.routes)
|
|
149
|
-
log(` ${r.path.padEnd(28)} ${r.confidence.padEnd(6)} ${r.reason}`);
|
|
150
|
-
if (routes.length === 0) {
|
|
151
|
-
routes = ['/'];
|
|
152
|
-
log('No routes detected from the diff; capturing / only.');
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
288
|
// --- Reachability ---------------------------------------------------------------
|
|
156
289
|
// Resolution already probed whatever it chose; this catches a side that died
|
|
157
290
|
// in between, and names which one so the message is actionable.
|
|
@@ -173,10 +306,9 @@ export async function runPr(opts = {}) {
|
|
|
173
306
|
await fail(authHint({ url: after, vercel: afterProbe.vercel }));
|
|
174
307
|
const auth = resolveAuth({ configHeaders: config.headers, headers: opts.headers, cookies: opts.cookies, cookieUrl: before, urls: [before, after] });
|
|
175
308
|
// --- Capture -------------------------------------------------------------------
|
|
176
|
-
const now = new Date();
|
|
177
|
-
const id = runId(now);
|
|
178
309
|
const outputDir = opts.output || path.join(os.tmpdir(), 'pre-post', ownerRepo.replace('/', '__'), id);
|
|
179
310
|
const viewports = settings.viewports.map(parseViewport);
|
|
311
|
+
const samples = config.samples || {};
|
|
180
312
|
const tasks = [];
|
|
181
313
|
for (const route of routes) {
|
|
182
314
|
const resolved = resolveSample(route, samples);
|
|
@@ -187,25 +319,37 @@ export async function runPr(opts = {}) {
|
|
|
187
319
|
log(`Capturing ${tasks.length * 2} screenshots (${routes.length} route(s) × ${viewports.length} viewport(s)) ...`);
|
|
188
320
|
await browserReady;
|
|
189
321
|
let run;
|
|
322
|
+
let sheetPath;
|
|
190
323
|
try {
|
|
191
|
-
run = await runTasks(tasks, {
|
|
324
|
+
run = await timings.time('capture', runTasks(tasks, {
|
|
192
325
|
outputDir, ...settings, wait: opts.wait, auth, log,
|
|
193
326
|
// So the verdict can name how Pre was chosen, not just where it points.
|
|
194
327
|
sides: { before: comparison.before, after: comparison.after },
|
|
195
|
-
});
|
|
328
|
+
}));
|
|
329
|
+
// Drawn while the browser is still open. A convenience, so a failure to
|
|
330
|
+
// draw it is logged and never costs the run its result.
|
|
331
|
+
if (!run.verdict) {
|
|
332
|
+
sheetPath = await timings.time('sheet', buildSheet(run.outcomes, outputDir))
|
|
333
|
+
.then(p => p ?? undefined)
|
|
334
|
+
.catch(err => { log(`Could not draw the summary sheet (${err instanceof Error ? err.message : err}).`); return undefined; });
|
|
335
|
+
}
|
|
196
336
|
}
|
|
197
337
|
finally {
|
|
198
|
-
|
|
338
|
+
// Timed on its own: stopping the servers and the browser is real wall
|
|
339
|
+
// clock that used to show up under no step at all.
|
|
340
|
+
await timings.time('cleanup', stopEverything());
|
|
199
341
|
}
|
|
200
|
-
const { outcomes } = run;
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
|
|
206
|
-
throw new NeedsHumanError(run.verdict.hint);
|
|
342
|
+
const { outcomes, verdict } = run;
|
|
343
|
+
// A wall or a wrong baseline means there is no honest result to publish, so
|
|
344
|
+
// stop with the one thing a human has to do. A broken page is not thrown: it
|
|
345
|
+
// is a finding about the code, and the PR says so in one sentence with no
|
|
346
|
+
// images — no picture of an error page is ever published.
|
|
347
|
+
throwIfBlocked(verdict);
|
|
207
348
|
// --- Publish -------------------------------------------------------------------
|
|
208
|
-
|
|
349
|
+
// A change shown on several routes is published once, for the route that
|
|
350
|
+
// leads its group in the PR; the rest would be images nothing links to.
|
|
351
|
+
const leads = new Set(groupChanges(outcomes).map(g => g.lead));
|
|
352
|
+
const changed = isBrokenVerdict(verdict) ? [] : outcomes.filter(o => (leads.has(o) || o.status === 'added' || o.status === 'removed') && o.files);
|
|
209
353
|
if (writeGh && changed.length) {
|
|
210
354
|
const folder = pr ? `pr-${pr.number}/${id}` : `branch/${routeSlug(branch || 'detached')}/${id}`;
|
|
211
355
|
const keyFor = (o, kind) => `${folder}/${routeSlug(o.route)}-${o.viewport}-${artifactSuffix(kind)}.png`;
|
|
@@ -218,7 +362,7 @@ export async function runPr(opts = {}) {
|
|
|
218
362
|
}
|
|
219
363
|
}
|
|
220
364
|
log(`Publishing ${files.length} image(s) to ${ownerRepo}@${settings.assetsBranch} ...`);
|
|
221
|
-
const published = await publishAssets(writeGh, ownerRepo, settings.assetsBranch, files, pr ? `Screenshots for #${pr.number} (${id})` : `Screenshots for ${branch || 'detached'} (${id})`);
|
|
365
|
+
const published = await timings.time('publish', () => publishAssets(writeGh, ownerRepo, settings.assetsBranch, files, pr ? `Screenshots for #${pr.number} (${id})` : `Screenshots for ${branch || 'detached'} (${id})`));
|
|
222
366
|
for (const o of changed) {
|
|
223
367
|
const urls = {};
|
|
224
368
|
for (const kind of PUBLISHED_KINDS)
|
|
@@ -227,39 +371,10 @@ export async function runPr(opts = {}) {
|
|
|
227
371
|
o.urls = urls;
|
|
228
372
|
}
|
|
229
373
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
outcomes,
|
|
236
|
-
skippedDynamic,
|
|
237
|
-
durationMs: Date.now() - started,
|
|
238
|
-
markdown: '',
|
|
239
|
-
outputDir,
|
|
240
|
-
};
|
|
241
|
-
result.markdown = buildComment(result, { version: opts.version, headSha: head, now });
|
|
242
|
-
if (writeGh && (opts.comment ?? true)) {
|
|
243
|
-
if (pr) {
|
|
244
|
-
// The description is what a reviewer reads first, so put the images there
|
|
245
|
-
// and fall back to a comment only when the PR cannot be edited.
|
|
246
|
-
const described = await upsertPrDescription(writeGh, ownerRepo, pr.number, result.markdown, 'pre-post');
|
|
247
|
-
if (described.updated) {
|
|
248
|
-
result.commentUrl = described.html_url;
|
|
249
|
-
result.commentKind = 'description';
|
|
250
|
-
log(`Updated PR description: ${described.html_url}`);
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
const comment = await upsertStickyComment(writeGh, ownerRepo, pr.number, result.markdown, STICKY_MARKER);
|
|
254
|
-
result.commentUrl = comment.html_url;
|
|
255
|
-
result.commentKind = 'comment';
|
|
256
|
-
log(`Cannot edit the PR description; ${comment.created ? 'posted' : 'updated'} a comment instead: ${comment.html_url}`);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
log(`No open PR for branch "${branch}". Open one and re-run, or paste the markdown below.`);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
return result;
|
|
374
|
+
return finish({
|
|
375
|
+
outcomes, beforeBase: before, afterBase: after,
|
|
376
|
+
beforeLabel: comparison.before.label, afterLabel: comparison.after.label,
|
|
377
|
+
outputDir, sheetPath, verdict: verdict ?? undefined,
|
|
378
|
+
});
|
|
264
379
|
}
|
|
265
380
|
//# sourceMappingURL=pr.js.map
|
package/dist/commands/pr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAgB,cAAc,EAAe,cAAc,EAAyC,MAAM,aAAa,CAAC;AAC/H,OAAO,EAAE,UAAU,EAAE,eAAe,EAAY,YAAY,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnG,OAAO,EAAa,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC3L,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAe,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAc,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAyBrF;;;;GAIG;AACH,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAEvE,SAAS,UAAU,CAAC,MAAqB,EAAE,IAAsB;IAC/D,OAAO,WAAW,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AACxG,CAAC;AAED,SAAS,KAAK,CAAC,GAAS;IACtB,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAyB,EAAE;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,mEAAmE;IACnE,IAAI,iBAAiB,GAAwB,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAEnE,+EAA+E;IAC/E,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACzD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAExC,gFAAgF;IAChF,MAAM,YAAY,GAAG,aAAa,EAAE,CAAC;IACrC;;;;;;;;;OASG;IACH,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;QAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,iBAAiB,EAAE,CAAC;IAC5B,CAAC,CAAC;IACF,6EAA6E;IAC7E,8EAA8E;IAC9E,8EAA8E;IAC9E,8EAA8E;IAC9E,6EAA6E;IAC7E,wBAAwB;IACxB,MAAM,WAAW,GAAG,OAAO,IAAI,KAAK;QAClC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,EAAE;QACf,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9G,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,yEAAyE;IACzE,8EAA8E;IAC9E,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;QAC1B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1I,CAAC,CAAC,MAAM,CAAC;IACX,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAErF,8EAA8E;IAC9E,+BAA+B;IAC/B,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnJ,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC;IAE1B,0EAA0E;IAC1E,0EAA0E;IAC1E,8EAA8E;IAC9E,8CAA8C;IAC9C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;IAChC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,GAAG,CAAC,kDAAkD,KAAK,CAAC,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAC7F,CAAC;IAED,iFAAiF;IACjF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,8EAA8E;IAC9E,4EAA4E;IAC5E,gDAAgD;IAChD,MAAM,UAAU,GAAe,MAAM,iBAAiB,CAAC;QACrD,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;QACpD,0EAA0E;QAC1E,sEAAsE;QACtE,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG;QAC5B,sEAAsE;QACtE,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU;QACnD,yEAAyE;QACzE,oDAAoD;QACpD,OAAO,EAAE,IAAI,IAAI,SAAS;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa;QACzC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;QAC/C,kBAAkB,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG;KAC5C,CAAC,CAAC,KAAK,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,UAAU,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;IACrC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAChD,CAAC;IAED,iFAAiF;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,IAAI,MAAgB,CAAC;IACrB,IAAI,cAAc,GAAa,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACxB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC;QAC1C,GAAG,CAAC,WAAW,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,UAAU,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC1H,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM;YAAE,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,GAAG,CAAC,qDAAqD,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,6EAA6E;IAC7E,gEAAgE;IAChE,MAAM,IAAI,GAAG,KAAK,EAAE,OAAe,EAAkB,EAAE;QACrD,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACpD,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;KACnD,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,MAAM,IAAI,CAAC,gBAAgB,MAAM,WAAW,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACrG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9G,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI;QAAE,MAAM,IAAI,CAAC,gBAAgB,KAAK,YAAY,UAAU,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACzG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE5H,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAEpJ,kFAAkF;IAClF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACtG,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9J,CAAC;IACH,CAAC;IACD,GAAG,CAAC,aAAa,KAAK,CAAC,MAAM,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,eAAe,SAAS,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAEnH,MAAM,YAAY,CAAC;IACnB,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE;YAC1B,SAAS,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG;YAClD,wEAAwE;YACxE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAEzB,8EAA8E;IAC9E,4EAA4E;IAC5E,4EAA4E;IAC5E,mCAAmC;IACnC,IAAI,GAAG,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D,kFAAkF;IAClF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5H,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QAChG,MAAM,MAAM,GAAG,CAAC,CAAyB,EAAE,IAAkB,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9I,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAM,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,KAAK;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,GAAG,CAAC,cAAc,KAAK,CAAC,MAAM,gBAAgB,SAAS,IAAI,QAAQ,CAAC,YAAY,MAAM,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,MAAM,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB,MAAM,IAAI,UAAU,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1L,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAyB,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,eAAe;gBAAE,IAAI,CAAC,CAAC,KAAM,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YACzG,CAAC,CAAC,IAAI,GAAG,IAAmB,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAgB;QAC1B,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,EAAE,EAAE,MAAM;QACpB,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,KAAK;QAChB,QAAQ;QACR,cAAc;QACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;QAChC,QAAQ,EAAE,EAAE;QACZ,SAAS;KACV,CAAC;IACF,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtF,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,EAAE,EAAE,CAAC;YACP,0EAA0E;YAC1E,gEAAgE;YAChE,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACxG,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC;gBACvC,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC;gBACnC,GAAG,CAAC,2BAA2B,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBACzG,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACrC,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC/B,GAAG,CAAC,mCAAmC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,uBAAuB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1H,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,0BAA0B,MAAM,sDAAsD,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
|
package/dist/comparison.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { GitHub, PullRequestRef } from './github.js';
|
|
|
15
15
|
import { serveBaseCommit, serveWorkingTree } from './baseline.js';
|
|
16
16
|
import { NeedsHumanError, ProbeResult } from './doctor.js';
|
|
17
17
|
import { PrePostConfig } from './types.js';
|
|
18
|
+
import { Stopwatch } from './timings.js';
|
|
18
19
|
export type StrategyName = 'explicit' | 'deployed' | 'local';
|
|
19
20
|
export interface Side {
|
|
20
21
|
url: string;
|
|
@@ -22,6 +23,11 @@ export interface Side {
|
|
|
22
23
|
detail: string;
|
|
23
24
|
/** The probe resolution already took, so callers need not repeat it. */
|
|
24
25
|
probe?: ProbeResult;
|
|
26
|
+
/**
|
|
27
|
+
* What a reviewer should call this side, when the URL would not tell them:
|
|
28
|
+
* "base `38d9f0b`" rather than the throwaway port it was served on.
|
|
29
|
+
*/
|
|
30
|
+
label?: string;
|
|
25
31
|
}
|
|
26
32
|
export interface Comparison {
|
|
27
33
|
strategy: StrategyName;
|
|
@@ -61,11 +67,19 @@ export interface ResolveContext {
|
|
|
61
67
|
headSha?: string;
|
|
62
68
|
/** Skip building the base commit locally. */
|
|
63
69
|
allowLocalBaseline?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Build both sides on this machine and never look for deployments. For CI,
|
|
72
|
+
* where a preview is often behind a login the job cannot pass, and where the
|
|
73
|
+
* runner can build the app anyway.
|
|
74
|
+
*/
|
|
75
|
+
localOnly?: boolean;
|
|
64
76
|
/** Injectable for tests; defaults to a real git worktree + dev server. */
|
|
65
77
|
serveBaseline?: typeof serveBaseCommit;
|
|
66
78
|
/** Injectable for tests; defaults to booting this checkout's dev server. */
|
|
67
79
|
servePost?: typeof serveWorkingTree;
|
|
68
80
|
log: (msg: string) => void;
|
|
81
|
+
/** Where the local servers record how long each of their steps took. */
|
|
82
|
+
timings?: Stopwatch;
|
|
69
83
|
}
|
|
70
84
|
/**
|
|
71
85
|
* Resolve both sides together, cheapest strategy first.
|
package/dist/comparison.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../src/comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,
|
|
1
|
+
{"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../src/comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,cAAc,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,eAAe,CAAC;IACvC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,gBAAgB,CAAC;IACpC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAoMD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAMhF;AAED,qBAAa,WAAY,SAAQ,eAAe;;CAK/C;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,SAAQ,eAAe;gBAC9C,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE;CAIrF;AAaD,qBAAa,eAAgB,SAAQ,eAAe;;CAKnD;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAU1D"}
|