@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.
@@ -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
- * Upload every captured PNG to Vercel Blob and annotate each shot with its
100
- * URL. The pathnames get a random suffix: public-but-unguessable is the only
101
- * access model Blob offers, and the dashboard still serves images through the
102
- * auth-gated action rather than handing these URLs to the browser. Returns an
103
- * error message, or null when every image landed; on failure the ones already
104
- * uploaded are deleted, so a half-stored snapshot never survives.
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 uploadShots(id, outDir, shots) {
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 ("Blob storage is configured (BLOB_READ_WRITE_TOKEN is set) but @vercel/blob " +
113
- "isn't installed. It ships as an optional dependency of @polishd/next — " +
114
- "reinstall without `--omit=optional`.");
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 shot of shots) {
119
- if (!shot.file)
153
+ for (const s of captured) {
154
+ if (!s.file) {
155
+ shots.push(toShot(s, ""));
120
156
  continue;
121
- const bytes = await readFile(join(outDir, "shots", shot.file));
122
- const { url } = await blob.put(`polishd/snapshots/${id}/${shot.file}`, bytes, {
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 null;
167
+ return { shots };
131
168
  }
132
169
  catch (err) {
133
170
  if (uploaded.length > 0)
134
171
  await blob.del(uploaded).catch(() => { });
135
- return `Couldn't upload screenshots to Vercel Blob: ${err instanceof Error ? err.message : "unknown error"}`;
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
- const { chromium } = await import("playwright-core");
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. Both extra dependencies install
219
- * by default (they're `optionalDependencies`), so this exists for the
220
- * `--omit=optional` install: when the environment says a dependency will be
221
- * needed but the import misses, the dashboard can say so up front rather than
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.1",
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",