@polishd/next 0.2.3-dev.3 → 0.2.3-dev.4
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 +39 -23
- package/README.md +5 -7
- package/bin/init.mjs +1 -4
- package/dist/ai/actions.d.ts +7 -1
- package/dist/ai/actions.d.ts.map +1 -1
- package/dist/ai/actions.js +10 -0
- package/dist/ai/actions.js.map +1 -1
- package/dist/ai/fix.d.ts +14 -0
- package/dist/ai/fix.d.ts.map +1 -0
- package/dist/ai/fix.js +254 -0
- package/dist/ai/fix.js.map +1 -0
- package/dist/ai/issues.d.ts +12 -0
- package/dist/ai/issues.d.ts.map +1 -1
- package/dist/ai/issues.js +16 -2
- package/dist/ai/issues.js.map +1 -1
- package/dist/ai/types.d.ts +49 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +4 -2
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/issue-list.d.ts +11 -0
- package/dist/dashboard/issue-list.d.ts.map +1 -0
- package/dist/dashboard/issue-list.js +159 -0
- package/dist/dashboard/issue-list.js.map +1 -0
- package/dist/dashboard/issues.d.ts +31 -2
- package/dist/dashboard/issues.d.ts.map +1 -1
- package/dist/dashboard/issues.js +4 -71
- package/dist/dashboard/issues.js.map +1 -1
- package/dist/dashboard/markdown-parse.d.ts +87 -0
- package/dist/dashboard/markdown-parse.d.ts.map +1 -0
- package/dist/dashboard/markdown-parse.js +244 -0
- package/dist/dashboard/markdown-parse.js.map +1 -0
- package/dist/dashboard/markdown.d.ts +5 -0
- package/dist/dashboard/markdown.d.ts.map +1 -0
- package/dist/dashboard/markdown.js +65 -0
- package/dist/dashboard/markdown.js.map +1 -0
- package/dist/dashboard/snapshot-actions.d.ts +5 -15
- package/dist/dashboard/snapshot-actions.d.ts.map +1 -1
- package/dist/dashboard/snapshot-actions.js +24 -64
- package/dist/dashboard/snapshot-actions.js.map +1 -1
- package/dist/dashboard/snapshots.d.ts.map +1 -1
- package/dist/dashboard/snapshots.js +8 -58
- package/dist/dashboard/snapshots.js.map +1 -1
- package/dist/dashboard.css +70 -18
- package/dist/server/snapshots.d.ts +6 -37
- package/dist/server/snapshots.d.ts.map +1 -1
- package/dist/server/snapshots.js +144 -271
- package/dist/server/snapshots.js.map +1 -1
- package/docs/SETUP.md +0 -10
- package/package.json +1 -1
package/dist/server/snapshots.js
CHANGED
|
@@ -19,17 +19,9 @@
|
|
|
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.
|
|
30
22
|
*/
|
|
31
23
|
import { isAbsolute, join } from "node:path";
|
|
32
|
-
import {
|
|
24
|
+
import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises";
|
|
33
25
|
import { tmpdir } from "node:os";
|
|
34
26
|
import { getMeta, setMeta, storeReady } from "./store";
|
|
35
27
|
const INDEX_KEY = "design_snapshots";
|
|
@@ -104,74 +96,43 @@ export async function readSnapshotImage(snapshotId, file) {
|
|
|
104
96
|
}
|
|
105
97
|
// ── Storage ──────────────────────────────────────────────────────────────────
|
|
106
98
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
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.
|
|
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.
|
|
115
105
|
*/
|
|
116
|
-
async function
|
|
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
|
-
}
|
|
106
|
+
async function uploadShots(id, outDir, shots) {
|
|
140
107
|
let blob;
|
|
141
108
|
try {
|
|
142
109
|
blob = await import("@vercel/blob");
|
|
143
110
|
}
|
|
144
111
|
catch {
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
"reinstall without `--omit=optional`.",
|
|
149
|
-
};
|
|
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`.");
|
|
150
115
|
}
|
|
151
116
|
const uploaded = [];
|
|
152
117
|
try {
|
|
153
|
-
for (const
|
|
154
|
-
if (!
|
|
155
|
-
shots.push(toShot(s, ""));
|
|
118
|
+
for (const shot of shots) {
|
|
119
|
+
if (!shot.file)
|
|
156
120
|
continue;
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
const { url } = await blob.put(`polishd/snapshots/${id}/${prefix}${s.file}`, bytes, {
|
|
121
|
+
const bytes = await readFile(join(outDir, "shots", shot.file));
|
|
122
|
+
const { url } = await blob.put(`polishd/snapshots/${id}/${shot.file}`, bytes, {
|
|
160
123
|
access: "public",
|
|
161
124
|
contentType: "image/png",
|
|
162
125
|
addRandomSuffix: true,
|
|
163
126
|
});
|
|
127
|
+
shot.url = url;
|
|
164
128
|
uploaded.push(url);
|
|
165
|
-
shots.push(toShot(s, prefix + s.file, url));
|
|
166
129
|
}
|
|
167
|
-
return
|
|
130
|
+
return null;
|
|
168
131
|
}
|
|
169
132
|
catch (err) {
|
|
170
133
|
if (uploaded.length > 0)
|
|
171
134
|
await blob.del(uploaded).catch(() => { });
|
|
172
|
-
return {
|
|
173
|
-
message: `Couldn't upload screenshots to Vercel Blob: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
174
|
-
};
|
|
135
|
+
return `Couldn't upload screenshots to Vercel Blob: ${err instanceof Error ? err.message : "unknown error"}`;
|
|
175
136
|
}
|
|
176
137
|
}
|
|
177
138
|
/**
|
|
@@ -193,211 +154,6 @@ async function deleteSnapshotImages(snapshot) {
|
|
|
193
154
|
}
|
|
194
155
|
await rm(join(snapshotsRoot(), snapshot.id), { recursive: true, force: true }).catch(() => { });
|
|
195
156
|
}
|
|
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
|
-
}
|
|
401
157
|
/**
|
|
402
158
|
* Launch a Chromium the way the allpages CLI does — the user's own Chrome or
|
|
403
159
|
* Edge first, Playwright's downloaded Chromium next — but never auto-download
|
|
@@ -408,15 +164,7 @@ export async function finishSnapshot(id) {
|
|
|
408
164
|
* dependency so production needs no setup step.
|
|
409
165
|
*/
|
|
410
166
|
async function launchBrowser() {
|
|
411
|
-
|
|
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
|
-
}
|
|
167
|
+
const { chromium } = await import("playwright-core");
|
|
420
168
|
const args = ["--force-color-profile=srgb", "--hide-scrollbars"];
|
|
421
169
|
for (const channel of ["chrome", "msedge", undefined]) {
|
|
422
170
|
try {
|
|
@@ -514,4 +262,129 @@ export async function snapshotCaptureIssue() {
|
|
|
514
262
|
}
|
|
515
263
|
return null;
|
|
516
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Shoot the given routes and record the run in the snapshot index. Old
|
|
267
|
+
* snapshots past `MAX_SNAPSHOTS` are pruned, images included.
|
|
268
|
+
*/
|
|
269
|
+
export async function captureSnapshot(input) {
|
|
270
|
+
if (!(await storeReady())) {
|
|
271
|
+
return {
|
|
272
|
+
ok: false,
|
|
273
|
+
message: "The analytics store isn't writable here, so a snapshot couldn't be recorded. " +
|
|
274
|
+
"Run locally or configure a database — see DATABASE.md.",
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
// The same preflight the dashboard runs before enabling the capture button.
|
|
278
|
+
// Actions are reachable without the dashboard ever rendering, so a doomed
|
|
279
|
+
// environment must fail here too — with the diagnosis, not a minute of
|
|
280
|
+
// capture ending in an EROFS.
|
|
281
|
+
const issue = await snapshotCaptureIssue();
|
|
282
|
+
if (issue)
|
|
283
|
+
return { ok: false, message: issue };
|
|
284
|
+
let run;
|
|
285
|
+
try {
|
|
286
|
+
({ allpages: run } = await import("allpages"));
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
return {
|
|
290
|
+
ok: false,
|
|
291
|
+
message: `The allpages screenshot engine failed to load: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const launched = await launchBrowser();
|
|
295
|
+
if ("message" in launched)
|
|
296
|
+
return { ok: false, message: launched.message };
|
|
297
|
+
const id = `${Date.now().toString(36)}`;
|
|
298
|
+
const toBlob = blobConfigured();
|
|
299
|
+
// In Blob mode allpages still writes to disk first, but into the system
|
|
300
|
+
// temp directory — the one location serverless hosts keep writable — and
|
|
301
|
+
// the files only exist for the moments between capture and upload.
|
|
302
|
+
let outDir;
|
|
303
|
+
try {
|
|
304
|
+
if (toBlob) {
|
|
305
|
+
outDir = await mkdtemp(join(tmpdir(), "polishd-snapshot-"));
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
outDir = join(snapshotsRoot(), id);
|
|
309
|
+
await mkdir(outDir, { recursive: true });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
await launched.browser.close().catch(() => { });
|
|
314
|
+
return {
|
|
315
|
+
ok: false,
|
|
316
|
+
message: `Couldn't create the snapshot directory (${err instanceof Error ? err.message : "unknown error"}) — is the filesystem writable?`,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
const result = await run({
|
|
321
|
+
url: input.origin,
|
|
322
|
+
routes: input.routes.slice(0, MAX_SNAPSHOT_ROUTES),
|
|
323
|
+
outDir,
|
|
324
|
+
devices: [...SNAPSHOT_DEVICES],
|
|
325
|
+
themes: [...SNAPSHOT_THEMES],
|
|
326
|
+
// The dashboard composes its own grid; the stitched contact sheet would
|
|
327
|
+
// only duplicate every image on disk.
|
|
328
|
+
skipSheet: true,
|
|
329
|
+
browser: launched.browser,
|
|
330
|
+
});
|
|
331
|
+
const snapshot = {
|
|
332
|
+
id,
|
|
333
|
+
capturedAt: Date.now(),
|
|
334
|
+
origin: input.origin,
|
|
335
|
+
fingerprint: input.fingerprint,
|
|
336
|
+
shots: result.shots.map((s) => ({
|
|
337
|
+
route: s.route.path,
|
|
338
|
+
device: s.device.name,
|
|
339
|
+
theme: s.theme,
|
|
340
|
+
file: s.file ?? "",
|
|
341
|
+
...(s.skipped ? { skipped: s.skipped } : {}),
|
|
342
|
+
})),
|
|
343
|
+
authWalled: result.authWalled,
|
|
344
|
+
noDarkMode: result.noDarkMode,
|
|
345
|
+
};
|
|
346
|
+
if (snapshot.shots.every((s) => !s.file)) {
|
|
347
|
+
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
348
|
+
return {
|
|
349
|
+
ok: false,
|
|
350
|
+
message: "Every page failed to capture — is the site reachable at " +
|
|
351
|
+
`${input.origin} from this process?`,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
if (toBlob) {
|
|
355
|
+
const failure = await uploadShots(id, outDir, snapshot.shots);
|
|
356
|
+
if (failure)
|
|
357
|
+
return { ok: false, message: failure };
|
|
358
|
+
}
|
|
359
|
+
const index = await loadIndex();
|
|
360
|
+
index.snapshots.unshift(snapshot);
|
|
361
|
+
const pruned = index.snapshots.slice(MAX_SNAPSHOTS);
|
|
362
|
+
index.snapshots = index.snapshots.slice(0, MAX_SNAPSHOTS);
|
|
363
|
+
if (!(await setMeta(INDEX_KEY, JSON.stringify(index)))) {
|
|
364
|
+
await deleteSnapshotImages(snapshot);
|
|
365
|
+
return {
|
|
366
|
+
ok: false,
|
|
367
|
+
message: "The snapshot was shot but the store refused to record it.",
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
for (const old of pruned) {
|
|
371
|
+
await deleteSnapshotImages(old);
|
|
372
|
+
}
|
|
373
|
+
return { ok: true, snapshot };
|
|
374
|
+
}
|
|
375
|
+
catch (err) {
|
|
376
|
+
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
377
|
+
return {
|
|
378
|
+
ok: false,
|
|
379
|
+
message: `Screenshot capture failed: ${err instanceof Error ? err.message : "unknown error"}`,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
finally {
|
|
383
|
+
await launched.browser.close().catch(() => { });
|
|
384
|
+
// The temp staging directory never outlives the capture; the disk-mode
|
|
385
|
+
// directory is the storage itself and stays.
|
|
386
|
+
if (toBlob)
|
|
387
|
+
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
388
|
+
}
|
|
389
|
+
}
|
|
517
390
|
//# 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":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAiDvD,MAAM,SAAS,GAAG,kBAAkB,CAAC;AAErC,+EAA+E;AAC/E,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC;AACvD,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,CAAU,CAAC;AAEnD;;;;;GAKG;AACH,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACpD,CAAC;AAED,qFAAqF;AACrF,SAAS,aAAa;IACpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACpD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;YAChD,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;gBAAE,OAAO,MAAM,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACjC,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,IAAY;IAEZ,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACnD,OAAO,yBAAyB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,OAAO,yBAAyB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,gEAAgE;IAC/E,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH,KAAK,UAAU,WAAW,CACxB,EAAU,EACV,MAAc,EACd,KAA4B;IAE5B,IAAI,IAAmC,CAAC;IACxC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CACL,6EAA6E;YAC7E,yEAAyE;YACzE,sCAAsC,CACvC,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACzB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE;gBAC5E,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,WAAW;gBACxB,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,OAAO,+CACL,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACvC,EAAE,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,oBAAoB,CAAC,QAAyB;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAClF,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;AACJ,CAAC;AAiBD;;;;;;;;GAQG;AACH,KAAK,UAAU,aAAa;IAC1B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;IACjE,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,SAAmE,CAAC;QACxE,IAAI,CAAC;YACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,IAAI,CAAC,CAAC,yDAAyD;QAC7E,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC;wBAC7B,mEAAmE;wBACnE,gEAAgE;wBAChE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;wBAClC,cAAc,EAAE,MAAM,SAAS,CAAC,cAAc,EAAE;qBACjD,CAAC;iBACH,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,mEACP,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACvC,EAAE;iBACH,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;YACL,OAAO,EACL,4EAA4E;gBAC5E,4EAA4E;gBAC5E,2EAA2E;gBAC3E,2EAA2E;gBAC3E,0EAA0E;SAC7E,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EACL,8EAA8E;YAC9E,+EAA+E;YAC/E,2BAA2B;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,0EAA0E;IAC1E,2EAA2E;IAC3E,sEAAsE;IACtE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5C,OAAO,CACL,0EAA0E;YAC1E,2EAA2E;YAC3E,gEAAgE;YAChE,kEAAkE;YAClE,gCAAgC,CACjC,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CACL,8EAA8E;gBAC9E,0EAA0E;gBAC1E,yEAAyE;gBACzE,+DAA+D,CAChE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,4EAA4E;IAC5E,yEAAyE;IACzE,kEAAkE;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CACL,8DAA8D;gBAC9D,sEAAsE;gBACtE,mEAAmE;gBACnE,qEAAqE;gBACrE,gBAAgB,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,IAAI,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EACL,+EAA+E;gBAC/E,wDAAwD;SAC3D,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,8BAA8B;IAC9B,MAAM,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC3C,IAAI,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEhD,IAAI,GAAuC,CAAC;IAC5C,IAAI,CAAC;QACH,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,kDACP,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACvC,EAAE;SACH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IACvC,IAAI,SAAS,IAAI,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAE3E,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAEhC,wEAAwE;IACxE,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,2CACP,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACvC,iCAAiC;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC;YACvB,GAAG,EAAE,KAAK,CAAC,MAAM;YACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;YAClD,MAAM;YACN,OAAO,EAAE,CAAC,GAAG,gBAAgB,CAAC;YAC9B,MAAM,EAAE,CAAC,GAAG,eAAe,CAAC;YAC5B,wEAAwE;YACxE,sCAAsC;YACtC,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAoB;YAChC,EAAE;YACF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;gBACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;gBACrB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;gBAClB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC,CAAC;YACH,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnE,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EACL,0DAA0D;oBAC1D,GAAG,KAAK,CAAC,MAAM,qBAAqB;aACvC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,OAAO;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,2DAA2D;aACrE,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,8BACP,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACvC,EAAE;SACH,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/C,uEAAuE;QACvE,6CAA6C;QAC7C,IAAI,MAAM;YAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
package/docs/SETUP.md
CHANGED
|
@@ -196,9 +196,6 @@ 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;
|
|
202
199
|
|
|
203
200
|
export default createPolishdPage();
|
|
204
201
|
```
|
|
@@ -440,13 +437,6 @@ SQLite file cannot persist there. Production capture needs Postgres.
|
|
|
440
437
|
3. Set your host's Node version to 22.x or later.
|
|
441
438
|
4. Deploy. Tables are created automatically on first use.
|
|
442
439
|
|
|
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
|
-
|
|
450
440
|
See [DATABASE.md](../DATABASE.md) for schema, pooling notes, and retention.
|
|
451
441
|
|
|
452
442
|
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.4",
|
|
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",
|