@polishd/next 0.2.3-dev.1 → 0.2.3-dev.3
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/CHANGELOG.md +52 -0
- package/README.md +7 -5
- package/bin/init.mjs +4 -1
- package/dist/dashboard/chrome.d.ts +15 -0
- package/dist/dashboard/chrome.d.ts.map +1 -1
- package/dist/dashboard/chrome.js +5 -1
- package/dist/dashboard/chrome.js.map +1 -1
- package/dist/dashboard/data.d.ts +18 -0
- package/dist/dashboard/data.d.ts.map +1 -0
- package/dist/dashboard/data.js +70 -0
- package/dist/dashboard/data.js.map +1 -0
- package/dist/dashboard/index.d.ts +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +209 -85
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/snapshot-actions.d.ts +15 -5
- package/dist/dashboard/snapshot-actions.d.ts.map +1 -1
- package/dist/dashboard/snapshot-actions.js +64 -24
- package/dist/dashboard/snapshot-actions.js.map +1 -1
- package/dist/dashboard/snapshots.d.ts.map +1 -1
- package/dist/dashboard/snapshots.js +58 -8
- package/dist/dashboard/snapshots.js.map +1 -1
- package/dist/dashboard.css +4 -0
- package/dist/server/snapshots.d.ts +44 -11
- package/dist/server/snapshots.d.ts.map +1 -1
- package/dist/server/snapshots.js +288 -142
- package/dist/server/snapshots.js.map +1 -1
- package/docs/SETUP.md +10 -0
- package/package.json +1 -1
package/dist/server/snapshots.js
CHANGED
|
@@ -19,9 +19,17 @@
|
|
|
19
19
|
* optional dependencies, so a standard install needs no extra wiring. Every
|
|
20
20
|
* failure degrades to a message, never a crash — the same contract as the
|
|
21
21
|
* rest of the server layer.
|
|
22
|
+
*
|
|
23
|
+
* Capture is chunked into one server call per route: begin → one
|
|
24
|
+
* `captureSnapshotRoute` per route → finish, with the in-flight state parked
|
|
25
|
+
* in the store between calls. A whole-site capture in a single request would
|
|
26
|
+
* have to outlive a serverless host's function time limit — which the package
|
|
27
|
+
* cannot raise on the host's behalf (`maxDuration` must be declared inline in
|
|
28
|
+
* the host's own page module), and which kills the function mid-shoot with no
|
|
29
|
+
* result at all. One route per request keeps every call short enough to fit.
|
|
22
30
|
*/
|
|
23
31
|
import { isAbsolute, join } from "node:path";
|
|
24
|
-
import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises";
|
|
32
|
+
import { copyFile, mkdir, mkdtemp, readFile, rm } from "node:fs/promises";
|
|
25
33
|
import { tmpdir } from "node:os";
|
|
26
34
|
import { getMeta, setMeta, storeReady } from "./store";
|
|
27
35
|
const INDEX_KEY = "design_snapshots";
|
|
@@ -96,43 +104,74 @@ export async function readSnapshotImage(snapshotId, file) {
|
|
|
96
104
|
}
|
|
97
105
|
// ── Storage ──────────────────────────────────────────────────────────────────
|
|
98
106
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
107
|
+
* Move one route's staged PNGs to their real home — Vercel Blob when a token
|
|
108
|
+
* is present, the snapshots directory otherwise — under a per-route filename
|
|
109
|
+
* prefix: allpages slugs are only unique within a single run, and each route
|
|
110
|
+
* is its own run now. Blob pathnames get a random suffix on top —
|
|
111
|
+
* public-but-unguessable is the only access model Blob offers, and the
|
|
112
|
+
* dashboard still serves images through the auth-gated action rather than
|
|
113
|
+
* handing these URLs to the browser. On a failed upload the pieces already
|
|
114
|
+
* uploaded are deleted, so a half-stored route never survives.
|
|
105
115
|
*/
|
|
106
|
-
async function
|
|
116
|
+
async function storeRouteShots(id, routeIndex, stageDir, captured) {
|
|
117
|
+
const prefix = `r${routeIndex}-`;
|
|
118
|
+
const shots = [];
|
|
119
|
+
const toShot = (s, file, url) => ({
|
|
120
|
+
route: s.route.path,
|
|
121
|
+
device: s.device.name,
|
|
122
|
+
theme: s.theme,
|
|
123
|
+
file,
|
|
124
|
+
...(url ? { url } : {}),
|
|
125
|
+
...(s.skipped ? { skipped: s.skipped } : {}),
|
|
126
|
+
});
|
|
127
|
+
if (!blobConfigured()) {
|
|
128
|
+
const shotsDir = join(snapshotsRoot(), id, "shots");
|
|
129
|
+
await mkdir(shotsDir, { recursive: true });
|
|
130
|
+
for (const s of captured) {
|
|
131
|
+
if (!s.file) {
|
|
132
|
+
shots.push(toShot(s, ""));
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
await copyFile(join(stageDir, "shots", s.file), join(shotsDir, prefix + s.file));
|
|
136
|
+
shots.push(toShot(s, prefix + s.file));
|
|
137
|
+
}
|
|
138
|
+
return { shots };
|
|
139
|
+
}
|
|
107
140
|
let blob;
|
|
108
141
|
try {
|
|
109
142
|
blob = await import("@vercel/blob");
|
|
110
143
|
}
|
|
111
144
|
catch {
|
|
112
|
-
return
|
|
113
|
-
"
|
|
114
|
-
|
|
145
|
+
return {
|
|
146
|
+
message: "Blob storage is configured (BLOB_READ_WRITE_TOKEN is set) but @vercel/blob " +
|
|
147
|
+
"isn't installed. It ships as an optional dependency of @polishd/next — " +
|
|
148
|
+
"reinstall without `--omit=optional`.",
|
|
149
|
+
};
|
|
115
150
|
}
|
|
116
151
|
const uploaded = [];
|
|
117
152
|
try {
|
|
118
|
-
for (const
|
|
119
|
-
if (!
|
|
153
|
+
for (const s of captured) {
|
|
154
|
+
if (!s.file) {
|
|
155
|
+
shots.push(toShot(s, ""));
|
|
120
156
|
continue;
|
|
121
|
-
|
|
122
|
-
const
|
|
157
|
+
}
|
|
158
|
+
const bytes = await readFile(join(stageDir, "shots", s.file));
|
|
159
|
+
const { url } = await blob.put(`polishd/snapshots/${id}/${prefix}${s.file}`, bytes, {
|
|
123
160
|
access: "public",
|
|
124
161
|
contentType: "image/png",
|
|
125
162
|
addRandomSuffix: true,
|
|
126
163
|
});
|
|
127
|
-
shot.url = url;
|
|
128
164
|
uploaded.push(url);
|
|
165
|
+
shots.push(toShot(s, prefix + s.file, url));
|
|
129
166
|
}
|
|
130
|
-
return
|
|
167
|
+
return { shots };
|
|
131
168
|
}
|
|
132
169
|
catch (err) {
|
|
133
170
|
if (uploaded.length > 0)
|
|
134
171
|
await blob.del(uploaded).catch(() => { });
|
|
135
|
-
return
|
|
172
|
+
return {
|
|
173
|
+
message: `Couldn't upload screenshots to Vercel Blob: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
174
|
+
};
|
|
136
175
|
}
|
|
137
176
|
}
|
|
138
177
|
/**
|
|
@@ -154,6 +193,211 @@ async function deleteSnapshotImages(snapshot) {
|
|
|
154
193
|
}
|
|
155
194
|
await rm(join(snapshotsRoot(), snapshot.id), { recursive: true, force: true }).catch(() => { });
|
|
156
195
|
}
|
|
196
|
+
const PENDING_KEY = "design_snapshot_pending";
|
|
197
|
+
async function loadPending() {
|
|
198
|
+
const raw = await getMeta(PENDING_KEY);
|
|
199
|
+
if (!raw)
|
|
200
|
+
return null;
|
|
201
|
+
try {
|
|
202
|
+
const parsed = JSON.parse(raw);
|
|
203
|
+
if (parsed?.v === 1 && typeof parsed.id === "string")
|
|
204
|
+
return parsed;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// A corrupt pending record is simply abandoned.
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
/** Persist the in-flight capture; null clears it. */
|
|
212
|
+
async function savePending(pending) {
|
|
213
|
+
return setMeta(PENDING_KEY, pending ? JSON.stringify(pending) : "");
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Start a capture: run the environment preflight, sweep any unfinished
|
|
217
|
+
* predecessor's images, and park the plan in the store. The returned routes
|
|
218
|
+
* are what the caller should then feed to `captureSnapshotRoute`, one call
|
|
219
|
+
* each, before `finishSnapshot` records the run.
|
|
220
|
+
*/
|
|
221
|
+
export async function beginSnapshot(input) {
|
|
222
|
+
if (!(await storeReady())) {
|
|
223
|
+
return {
|
|
224
|
+
ok: false,
|
|
225
|
+
message: "The analytics store isn't writable here, so a snapshot couldn't be recorded. " +
|
|
226
|
+
"Run locally or configure a database — see DATABASE.md.",
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// The same preflight the dashboard runs before enabling the capture button.
|
|
230
|
+
// Actions are reachable without the dashboard ever rendering, so a doomed
|
|
231
|
+
// environment must fail here too — with the diagnosis, not a minute of
|
|
232
|
+
// capture ending in an EROFS.
|
|
233
|
+
const issue = await snapshotCaptureIssue();
|
|
234
|
+
if (issue)
|
|
235
|
+
return { ok: false, message: issue };
|
|
236
|
+
const routes = input.routes.slice(0, MAX_SNAPSHOT_ROUTES);
|
|
237
|
+
if (routes.length === 0)
|
|
238
|
+
return { ok: false, message: "No routes to capture." };
|
|
239
|
+
// A predecessor that never finished (tab closed mid-run) left images
|
|
240
|
+
// behind; sweep them before its record is overwritten.
|
|
241
|
+
const stale = await loadPending();
|
|
242
|
+
if (stale)
|
|
243
|
+
await deleteSnapshotImages(stale);
|
|
244
|
+
const pending = {
|
|
245
|
+
v: 1,
|
|
246
|
+
id: Date.now().toString(36),
|
|
247
|
+
origin: input.origin,
|
|
248
|
+
fingerprint: input.fingerprint,
|
|
249
|
+
startedAt: Date.now(),
|
|
250
|
+
routes,
|
|
251
|
+
done: [],
|
|
252
|
+
shots: [],
|
|
253
|
+
authWalled: [],
|
|
254
|
+
noDarkMode: true,
|
|
255
|
+
};
|
|
256
|
+
if (!(await savePending(pending))) {
|
|
257
|
+
return { ok: false, message: "The store refused to record the capture in progress." };
|
|
258
|
+
}
|
|
259
|
+
return { ok: true, id: pending.id, routes };
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Shoot one route of the capture `beginSnapshot` started — both devices, both
|
|
263
|
+
* themes — store its images, and append the results to the pending record.
|
|
264
|
+
* Bounded work per call by design: this is the request that has to fit inside
|
|
265
|
+
* a serverless host's function time limit.
|
|
266
|
+
*/
|
|
267
|
+
export async function captureSnapshotRoute(id, route) {
|
|
268
|
+
const pending = await loadPending();
|
|
269
|
+
if (!pending || pending.id !== id) {
|
|
270
|
+
return {
|
|
271
|
+
ok: false,
|
|
272
|
+
message: "This capture is no longer in progress — start a new one.",
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
if (!pending.routes.includes(route)) {
|
|
276
|
+
return { ok: false, message: `${route} isn't part of this capture.` };
|
|
277
|
+
}
|
|
278
|
+
if (pending.done.includes(route)) {
|
|
279
|
+
// A retry after a lost response — the shots are already recorded.
|
|
280
|
+
return { ok: true, shots: pending.shots.filter((s) => s.route === route) };
|
|
281
|
+
}
|
|
282
|
+
let run;
|
|
283
|
+
try {
|
|
284
|
+
({ allpages: run } = await import("allpages"));
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
return {
|
|
288
|
+
ok: false,
|
|
289
|
+
message: `The allpages screenshot engine failed to load: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
const launched = await launchBrowser();
|
|
293
|
+
if ("message" in launched)
|
|
294
|
+
return { ok: false, message: launched.message };
|
|
295
|
+
// Every route stages into its own temp directory — the one location
|
|
296
|
+
// serverless hosts keep writable — and the files only exist for the moments
|
|
297
|
+
// between capture and `storeRouteShots` moving them home.
|
|
298
|
+
let stageDir;
|
|
299
|
+
try {
|
|
300
|
+
stageDir = await mkdtemp(join(tmpdir(), "polishd-snapshot-"));
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
await launched.browser.close().catch(() => { });
|
|
304
|
+
return {
|
|
305
|
+
ok: false,
|
|
306
|
+
message: `Couldn't create the snapshot staging directory (${err instanceof Error ? err.message : "unknown error"}) — is the filesystem writable?`,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
const result = await run({
|
|
311
|
+
url: pending.origin,
|
|
312
|
+
routes: [route],
|
|
313
|
+
outDir: stageDir,
|
|
314
|
+
devices: [...SNAPSHOT_DEVICES],
|
|
315
|
+
themes: [...SNAPSHOT_THEMES],
|
|
316
|
+
// The dashboard composes its own grid; the stitched contact sheet would
|
|
317
|
+
// only duplicate every image on disk.
|
|
318
|
+
skipSheet: true,
|
|
319
|
+
browser: launched.browser,
|
|
320
|
+
});
|
|
321
|
+
const stored = await storeRouteShots(id, pending.routes.indexOf(route), stageDir, result.shots);
|
|
322
|
+
if ("message" in stored)
|
|
323
|
+
return { ok: false, message: stored.message };
|
|
324
|
+
pending.done.push(route);
|
|
325
|
+
pending.shots.push(...stored.shots);
|
|
326
|
+
for (const walled of result.authWalled) {
|
|
327
|
+
if (!pending.authWalled.includes(walled))
|
|
328
|
+
pending.authWalled.push(walled);
|
|
329
|
+
}
|
|
330
|
+
// A route that produced no images says nothing about dark mode.
|
|
331
|
+
if (stored.shots.some((s) => s.file)) {
|
|
332
|
+
pending.noDarkMode = pending.noDarkMode && result.noDarkMode;
|
|
333
|
+
}
|
|
334
|
+
if (!(await savePending(pending))) {
|
|
335
|
+
await deleteSnapshotImages({ id, shots: stored.shots });
|
|
336
|
+
return { ok: false, message: "The route was shot but the store refused to record it." };
|
|
337
|
+
}
|
|
338
|
+
return { ok: true, shots: stored.shots };
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
return {
|
|
342
|
+
ok: false,
|
|
343
|
+
message: `Screenshot capture failed: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
await launched.browser.close().catch(() => { });
|
|
348
|
+
await rm(stageDir, { recursive: true, force: true }).catch(() => { });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Close out the capture: record the accumulated shots in the snapshot index
|
|
353
|
+
* and prune old snapshots past `MAX_SNAPSHOTS`, images included. Called once
|
|
354
|
+
* every route has been attempted — routes whose calls failed outright are
|
|
355
|
+
* simply absent from the snapshot.
|
|
356
|
+
*/
|
|
357
|
+
export async function finishSnapshot(id) {
|
|
358
|
+
const pending = await loadPending();
|
|
359
|
+
if (!pending || pending.id !== id) {
|
|
360
|
+
return {
|
|
361
|
+
ok: false,
|
|
362
|
+
message: "This capture is no longer in progress — start a new one.",
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
const snapshot = {
|
|
366
|
+
id: pending.id,
|
|
367
|
+
capturedAt: Date.now(),
|
|
368
|
+
origin: pending.origin,
|
|
369
|
+
fingerprint: pending.fingerprint,
|
|
370
|
+
shots: pending.shots,
|
|
371
|
+
authWalled: pending.authWalled,
|
|
372
|
+
noDarkMode: pending.noDarkMode,
|
|
373
|
+
};
|
|
374
|
+
if (snapshot.shots.every((s) => !s.file)) {
|
|
375
|
+
await deleteSnapshotImages(snapshot);
|
|
376
|
+
await savePending(null);
|
|
377
|
+
return {
|
|
378
|
+
ok: false,
|
|
379
|
+
message: "Every page failed to capture — is the site reachable at " +
|
|
380
|
+
`${pending.origin} from its own server?`,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
const index = await loadIndex();
|
|
384
|
+
index.snapshots.unshift(snapshot);
|
|
385
|
+
const pruned = index.snapshots.slice(MAX_SNAPSHOTS);
|
|
386
|
+
index.snapshots = index.snapshots.slice(0, MAX_SNAPSHOTS);
|
|
387
|
+
if (!(await setMeta(INDEX_KEY, JSON.stringify(index)))) {
|
|
388
|
+
await deleteSnapshotImages(snapshot);
|
|
389
|
+
await savePending(null);
|
|
390
|
+
return {
|
|
391
|
+
ok: false,
|
|
392
|
+
message: "The snapshot was shot but the store refused to record it.",
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
await savePending(null);
|
|
396
|
+
for (const old of pruned) {
|
|
397
|
+
await deleteSnapshotImages(old);
|
|
398
|
+
}
|
|
399
|
+
return { ok: true, snapshot };
|
|
400
|
+
}
|
|
157
401
|
/**
|
|
158
402
|
* Launch a Chromium the way the allpages CLI does — the user's own Chrome or
|
|
159
403
|
* Edge first, Playwright's downloaded Chromium next — but never auto-download
|
|
@@ -164,7 +408,15 @@ async function deleteSnapshotImages(snapshot) {
|
|
|
164
408
|
* dependency so production needs no setup step.
|
|
165
409
|
*/
|
|
166
410
|
async function launchBrowser() {
|
|
167
|
-
|
|
411
|
+
let chromium;
|
|
412
|
+
try {
|
|
413
|
+
({ chromium } = await import("playwright-core"));
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
return {
|
|
417
|
+
message: `The browser driver (playwright-core) failed to load: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
168
420
|
const args = ["--force-color-profile=srgb", "--hide-scrollbars"];
|
|
169
421
|
for (const channel of ["chrome", "msedge", undefined]) {
|
|
170
422
|
try {
|
|
@@ -215,13 +467,25 @@ async function launchBrowser() {
|
|
|
215
467
|
}
|
|
216
468
|
/**
|
|
217
469
|
* A problem that will make the next capture fail, detectable from the
|
|
218
|
-
* environment alone — or null when none is.
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* a minute into a doomed capture
|
|
470
|
+
* environment alone — or null when none is. Covers the two setup gaps a
|
|
471
|
+
* serverless deploy can have: no Blob store connected (nowhere for images to
|
|
472
|
+
* live when the filesystem is read-only), and the `--omit=optional` install
|
|
473
|
+
* missing a dependency the environment says will be needed. Either way the
|
|
474
|
+
* dashboard can say so up front rather than a minute into a doomed capture,
|
|
475
|
+
* and `captureSnapshot` runs the same check for callers that never rendered
|
|
476
|
+
* the dashboard.
|
|
223
477
|
*/
|
|
224
478
|
export async function snapshotCaptureIssue() {
|
|
479
|
+
// On Vercel the filesystem is read-only and reset between invocations, so
|
|
480
|
+
// disk storage — the fallback when no Blob token is present — cannot work.
|
|
481
|
+
// Without a connected store every capture is doomed before it starts.
|
|
482
|
+
if (process.env.VERCEL && !blobConfigured()) {
|
|
483
|
+
return ("Snapshot images have nowhere to live on this deployment: the filesystem " +
|
|
484
|
+
"is read-only and no Blob store is connected. Connect a Vercel Blob store " +
|
|
485
|
+
"to the project (Storage → Blob in the Vercel dashboard) — the " +
|
|
486
|
+
"BLOB_READ_WRITE_TOKEN it injects switches snapshot storage over " +
|
|
487
|
+
"automatically — then redeploy.");
|
|
488
|
+
}
|
|
225
489
|
if (blobConfigured()) {
|
|
226
490
|
try {
|
|
227
491
|
await import("@vercel/blob");
|
|
@@ -250,122 +514,4 @@ export async function snapshotCaptureIssue() {
|
|
|
250
514
|
}
|
|
251
515
|
return null;
|
|
252
516
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Shoot the given routes and record the run in the snapshot index. Old
|
|
255
|
-
* snapshots past `MAX_SNAPSHOTS` are pruned, images included.
|
|
256
|
-
*/
|
|
257
|
-
export async function captureSnapshot(input) {
|
|
258
|
-
if (!(await storeReady())) {
|
|
259
|
-
return {
|
|
260
|
-
ok: false,
|
|
261
|
-
message: "The analytics store isn't writable here, so a snapshot couldn't be recorded. " +
|
|
262
|
-
"Run locally or configure a database — see DATABASE.md.",
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
let run;
|
|
266
|
-
try {
|
|
267
|
-
({ allpages: run } = await import("allpages"));
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
return {
|
|
271
|
-
ok: false,
|
|
272
|
-
message: `The allpages screenshot engine failed to load: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
const launched = await launchBrowser();
|
|
276
|
-
if ("message" in launched)
|
|
277
|
-
return { ok: false, message: launched.message };
|
|
278
|
-
const id = `${Date.now().toString(36)}`;
|
|
279
|
-
const toBlob = blobConfigured();
|
|
280
|
-
// In Blob mode allpages still writes to disk first, but into the system
|
|
281
|
-
// temp directory — the one location serverless hosts keep writable — and
|
|
282
|
-
// the files only exist for the moments between capture and upload.
|
|
283
|
-
let outDir;
|
|
284
|
-
try {
|
|
285
|
-
if (toBlob) {
|
|
286
|
-
outDir = await mkdtemp(join(tmpdir(), "polishd-snapshot-"));
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
outDir = join(snapshotsRoot(), id);
|
|
290
|
-
await mkdir(outDir, { recursive: true });
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
catch (err) {
|
|
294
|
-
await launched.browser.close().catch(() => { });
|
|
295
|
-
return {
|
|
296
|
-
ok: false,
|
|
297
|
-
message: `Couldn't create the snapshot directory (${err instanceof Error ? err.message : "unknown error"}) — is the filesystem writable?`,
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
try {
|
|
301
|
-
const result = await run({
|
|
302
|
-
url: input.origin,
|
|
303
|
-
routes: input.routes.slice(0, MAX_SNAPSHOT_ROUTES),
|
|
304
|
-
outDir,
|
|
305
|
-
devices: [...SNAPSHOT_DEVICES],
|
|
306
|
-
themes: [...SNAPSHOT_THEMES],
|
|
307
|
-
// The dashboard composes its own grid; the stitched contact sheet would
|
|
308
|
-
// only duplicate every image on disk.
|
|
309
|
-
skipSheet: true,
|
|
310
|
-
browser: launched.browser,
|
|
311
|
-
});
|
|
312
|
-
const snapshot = {
|
|
313
|
-
id,
|
|
314
|
-
capturedAt: Date.now(),
|
|
315
|
-
origin: input.origin,
|
|
316
|
-
fingerprint: input.fingerprint,
|
|
317
|
-
shots: result.shots.map((s) => ({
|
|
318
|
-
route: s.route.path,
|
|
319
|
-
device: s.device.name,
|
|
320
|
-
theme: s.theme,
|
|
321
|
-
file: s.file ?? "",
|
|
322
|
-
...(s.skipped ? { skipped: s.skipped } : {}),
|
|
323
|
-
})),
|
|
324
|
-
authWalled: result.authWalled,
|
|
325
|
-
noDarkMode: result.noDarkMode,
|
|
326
|
-
};
|
|
327
|
-
if (snapshot.shots.every((s) => !s.file)) {
|
|
328
|
-
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
329
|
-
return {
|
|
330
|
-
ok: false,
|
|
331
|
-
message: "Every page failed to capture — is the site reachable at " +
|
|
332
|
-
`${input.origin} from this process?`,
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
if (toBlob) {
|
|
336
|
-
const failure = await uploadShots(id, outDir, snapshot.shots);
|
|
337
|
-
if (failure)
|
|
338
|
-
return { ok: false, message: failure };
|
|
339
|
-
}
|
|
340
|
-
const index = await loadIndex();
|
|
341
|
-
index.snapshots.unshift(snapshot);
|
|
342
|
-
const pruned = index.snapshots.slice(MAX_SNAPSHOTS);
|
|
343
|
-
index.snapshots = index.snapshots.slice(0, MAX_SNAPSHOTS);
|
|
344
|
-
if (!(await setMeta(INDEX_KEY, JSON.stringify(index)))) {
|
|
345
|
-
await deleteSnapshotImages(snapshot);
|
|
346
|
-
return {
|
|
347
|
-
ok: false,
|
|
348
|
-
message: "The snapshot was shot but the store refused to record it.",
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
for (const old of pruned) {
|
|
352
|
-
await deleteSnapshotImages(old);
|
|
353
|
-
}
|
|
354
|
-
return { ok: true, snapshot };
|
|
355
|
-
}
|
|
356
|
-
catch (err) {
|
|
357
|
-
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
358
|
-
return {
|
|
359
|
-
ok: false,
|
|
360
|
-
message: `Screenshot capture failed: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
finally {
|
|
364
|
-
await launched.browser.close().catch(() => { });
|
|
365
|
-
// The temp staging directory never outlives the capture; the disk-mode
|
|
366
|
-
// directory is the storage itself and stays.
|
|
367
|
-
if (toBlob)
|
|
368
|
-
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
517
|
//# sourceMappingURL=snapshots.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/server/snapshots.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/server/snapshots.ts"],"names":[],"mappings":"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"}
|
package/docs/SETUP.md
CHANGED
|
@@ -196,6 +196,9 @@ import { createPolishdPage } from "@polishd/next/dashboard";
|
|
|
196
196
|
|
|
197
197
|
export const runtime = "nodejs";
|
|
198
198
|
export const dynamic = "force-dynamic";
|
|
199
|
+
// Server actions inherit this page's time limit; 300s gives site-snapshot
|
|
200
|
+
// capture headroom on hosts with strict function limits.
|
|
201
|
+
export const maxDuration = 300;
|
|
199
202
|
|
|
200
203
|
export default createPolishdPage();
|
|
201
204
|
```
|
|
@@ -437,6 +440,13 @@ SQLite file cannot persist there. Production capture needs Postgres.
|
|
|
437
440
|
3. Set your host's Node version to 22.x or later.
|
|
438
441
|
4. Deploy. Tables are created automatically on first use.
|
|
439
442
|
|
|
443
|
+
For **site snapshots** in production on Vercel, connect a
|
|
444
|
+
[Blob store](https://vercel.com/docs/vercel-blob) — its `BLOB_READ_WRITE_TOKEN`
|
|
445
|
+
switches image storage over automatically. Capture runs as one short server
|
|
446
|
+
call per page so it fits inside function time limits; keeping
|
|
447
|
+
`export const maxDuration = 300` on the dashboard's `page.tsx` adds headroom
|
|
448
|
+
for heavy pages.
|
|
449
|
+
|
|
440
450
|
See [DATABASE.md](../DATABASE.md) for schema, pooling notes, and retention.
|
|
441
451
|
|
|
442
452
|
Until a database URL is set, Polishd runs as a safe no-op in production: a
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polishd/next",
|
|
3
|
-
"version": "0.2.3-dev.
|
|
3
|
+
"version": "0.2.3-dev.3",
|
|
4
4
|
"description": "Drop-in product analytics for Next.js — capture real user behavioral signals (rage/dead clicks, scroll depth, errors, web vitals) and explore them on a built-in dashboard. What gets measured gets improved.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|