@archastro/react-shot 0.1.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/LICENSE +21 -0
- package/README.md +183 -0
- package/bin/react-shot.mjs +2 -0
- package/dist/batch-paths.d.ts +4 -0
- package/dist/batch-paths.d.ts.map +1 -0
- package/dist/batch-paths.js +34 -0
- package/dist/batch-paths.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +217 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/create-server.d.ts +13 -0
- package/dist/create-server.d.ts.map +1 -0
- package/dist/create-server.js +254 -0
- package/dist/create-server.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/meta.d.ts +9 -0
- package/dist/meta.d.ts.map +1 -0
- package/dist/meta.js +23 -0
- package/dist/meta.js.map +1 -0
- package/dist/shot.d.ts +4 -0
- package/dist/shot.d.ts.map +1 -0
- package/dist/shot.js +259 -0
- package/dist/shot.js.map +1 -0
- package/dist/stubs.d.ts +6 -0
- package/dist/stubs.d.ts.map +1 -0
- package/dist/stubs.js +49 -0
- package/dist/stubs.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/host/index.html +22 -0
- package/package.json +81 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
import react from "@vitejs/plugin-react";
|
|
6
|
+
import { createServer as createViteServer, } from "vite";
|
|
7
|
+
import { nextDynamicStub, nextImageStub, nextLinkStub, nextNavigationStub, serverOnlyStub, } from "./stubs.js";
|
|
8
|
+
const TOOL_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
9
|
+
const HOST_DIR = path.join(TOOL_ROOT, "host");
|
|
10
|
+
const FIXTURE_ID = "virtual:react-shot-fixture";
|
|
11
|
+
const STYLES_ID = "virtual:react-shot-styles";
|
|
12
|
+
const ENTRY_ID = "virtual:react-shot-entry";
|
|
13
|
+
const ENTRY_URL = "/@react-shot/entry.tsx";
|
|
14
|
+
export function resolveInstalledPackage(packageRoot, name) {
|
|
15
|
+
const entry = resolveInstalledModule(packageRoot, name);
|
|
16
|
+
if (!entry)
|
|
17
|
+
return null;
|
|
18
|
+
let directory = path.dirname(entry);
|
|
19
|
+
while (true) {
|
|
20
|
+
const packagePath = path.join(directory, "package.json");
|
|
21
|
+
if (fs.existsSync(packagePath)) {
|
|
22
|
+
const manifest = JSON.parse(fs.readFileSync(packagePath, "utf8"));
|
|
23
|
+
if (manifest.name === name)
|
|
24
|
+
return directory;
|
|
25
|
+
}
|
|
26
|
+
const parent = path.dirname(directory);
|
|
27
|
+
if (parent === directory)
|
|
28
|
+
return null;
|
|
29
|
+
directory = parent;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function resolveInstalledModule(packageRoot, moduleName) {
|
|
33
|
+
for (const base of [path.resolve(packageRoot), TOOL_ROOT]) {
|
|
34
|
+
const resolver = createRequire(path.join(base, "__react_shot_resolver__.cjs"));
|
|
35
|
+
try {
|
|
36
|
+
return resolver.resolve(moduleName);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.code !== "MODULE_NOT_FOUND") {
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
async function loadTailwindVitePlugin(packageRoot) {
|
|
47
|
+
const entry = resolveInstalledModule(packageRoot, "@tailwindcss/vite");
|
|
48
|
+
if (!entry)
|
|
49
|
+
return null;
|
|
50
|
+
const module = await import(pathToFileURL(entry).href);
|
|
51
|
+
const tailwind = (module.default ?? module);
|
|
52
|
+
return tailwind();
|
|
53
|
+
}
|
|
54
|
+
function reactShotPlugin(options) {
|
|
55
|
+
const fixturePath = path.resolve(options.fixturePath);
|
|
56
|
+
const styleFiles = options.config.styles ?? [];
|
|
57
|
+
return {
|
|
58
|
+
name: "react-shot",
|
|
59
|
+
enforce: "pre",
|
|
60
|
+
resolveId(id) {
|
|
61
|
+
if (id === FIXTURE_ID)
|
|
62
|
+
return `\0${FIXTURE_ID}`;
|
|
63
|
+
if (id === STYLES_ID)
|
|
64
|
+
return `\0${STYLES_ID}`;
|
|
65
|
+
if (id === ENTRY_ID ||
|
|
66
|
+
id === ENTRY_URL ||
|
|
67
|
+
id.endsWith(ENTRY_URL)) {
|
|
68
|
+
return `\0${ENTRY_ID}`;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
},
|
|
72
|
+
load(id) {
|
|
73
|
+
if (id === `\0${FIXTURE_ID}`) {
|
|
74
|
+
return `export { default } from ${JSON.stringify(fixturePath.replaceAll("\\", "/"))};\n`;
|
|
75
|
+
}
|
|
76
|
+
if (id === `\0${STYLES_ID}`) {
|
|
77
|
+
return styleFiles.length === 0
|
|
78
|
+
? "export {};\n"
|
|
79
|
+
: styleFiles
|
|
80
|
+
.map((file) => `import ${JSON.stringify(file.replaceAll("\\", "/"))};`)
|
|
81
|
+
.join("\n");
|
|
82
|
+
}
|
|
83
|
+
if (id === `\0${ENTRY_ID}`) {
|
|
84
|
+
return `
|
|
85
|
+
import React from "react";
|
|
86
|
+
import { createRoot } from "react-dom/client";
|
|
87
|
+
import fixture from ${JSON.stringify(FIXTURE_ID)};
|
|
88
|
+
import ${JSON.stringify(STYLES_ID)};
|
|
89
|
+
|
|
90
|
+
const width = fixture.width ?? 1280;
|
|
91
|
+
const height = fixture.height ?? 800;
|
|
92
|
+
const background = fixture.background ?? "transparent";
|
|
93
|
+
const win = window;
|
|
94
|
+
|
|
95
|
+
win.__REACT_SHOT_META__ = {
|
|
96
|
+
width: fixture.width,
|
|
97
|
+
height: fixture.height,
|
|
98
|
+
background: fixture.background,
|
|
99
|
+
selector: fixture.selector,
|
|
100
|
+
waitFor: fixture.waitFor,
|
|
101
|
+
settleMs: fixture.settleMs,
|
|
102
|
+
fullPage: fixture.fullPage,
|
|
103
|
+
stripOverlay: fixture.stripOverlay,
|
|
104
|
+
omitBackground: fixture.omitBackground,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
document.documentElement.style.width = width + "px";
|
|
108
|
+
document.documentElement.style.height = height + "px";
|
|
109
|
+
document.body.style.width = width + "px";
|
|
110
|
+
document.body.style.height = height + "px";
|
|
111
|
+
document.body.style.background = background;
|
|
112
|
+
document.body.style.overflow = "hidden";
|
|
113
|
+
|
|
114
|
+
const root = document.getElementById("root");
|
|
115
|
+
if (!root) throw new Error("#root missing");
|
|
116
|
+
root.setAttribute("data-react-shot-root", "true");
|
|
117
|
+
root.style.minHeight = height + "px";
|
|
118
|
+
root.style.width = width + "px";
|
|
119
|
+
root.style.background = background;
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
createRoot(root).render(React.createElement(React.StrictMode, null, fixture.component));
|
|
123
|
+
requestAnimationFrame(function () { win.__REACT_SHOT_READY__ = true; });
|
|
124
|
+
} catch (error) {
|
|
125
|
+
win.__REACT_SHOT_ERROR__ = error && error.stack ? error.stack : String(error);
|
|
126
|
+
win.__REACT_SHOT_READY__ = true;
|
|
127
|
+
root.textContent = win.__REACT_SHOT_ERROR__;
|
|
128
|
+
}
|
|
129
|
+
`;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
},
|
|
133
|
+
configureServer(server) {
|
|
134
|
+
server.middlewares.use((request, response, next) => {
|
|
135
|
+
if (request.url !== "/" && !request.url?.startsWith("/?")) {
|
|
136
|
+
next();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const html = fs.readFileSync(path.join(HOST_DIR, "index.html"), "utf8");
|
|
140
|
+
server
|
|
141
|
+
.transformIndexHtml("/", html)
|
|
142
|
+
.then((transformed) => {
|
|
143
|
+
response.setHeader("Content-Type", "text/html");
|
|
144
|
+
response.end(transformed);
|
|
145
|
+
})
|
|
146
|
+
.catch(next);
|
|
147
|
+
});
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function stubPlugin(stubs) {
|
|
152
|
+
return {
|
|
153
|
+
name: "react-shot-stubs",
|
|
154
|
+
enforce: "pre",
|
|
155
|
+
resolveId(id) {
|
|
156
|
+
return id in stubs ? `\0react-shot-stub:${id}` : null;
|
|
157
|
+
},
|
|
158
|
+
load(id) {
|
|
159
|
+
if (!id.startsWith("\0react-shot-stub:"))
|
|
160
|
+
return null;
|
|
161
|
+
const name = id.slice("\0react-shot-stub:".length);
|
|
162
|
+
return stubs[name] ?? "export {};";
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export async function startShotServer(options) {
|
|
167
|
+
const packageRoot = path.resolve(options.packageRoot);
|
|
168
|
+
const aliases = { ...(options.config.alias ?? {}) };
|
|
169
|
+
if (!aliases["@"])
|
|
170
|
+
aliases["@"] = packageRoot;
|
|
171
|
+
const stubs = {
|
|
172
|
+
"next/navigation": nextNavigationStub,
|
|
173
|
+
"next/link": nextLinkStub,
|
|
174
|
+
"next/image": nextImageStub,
|
|
175
|
+
"next/dynamic": nextDynamicStub,
|
|
176
|
+
"server-only": serverOnlyStub,
|
|
177
|
+
};
|
|
178
|
+
for (const moduleName of options.config.stubModules ?? []) {
|
|
179
|
+
stubs[moduleName] = serverOnlyStub;
|
|
180
|
+
}
|
|
181
|
+
const alias = Object.entries(aliases)
|
|
182
|
+
.sort(([left], [right]) => right.length - left.length)
|
|
183
|
+
.map(([find, replacement]) => ({ find, replacement }));
|
|
184
|
+
const reactPackage = resolveInstalledPackage(packageRoot, "react");
|
|
185
|
+
const reactDomPackage = resolveInstalledPackage(packageRoot, "react-dom");
|
|
186
|
+
if (reactPackage)
|
|
187
|
+
alias.unshift({ find: "react", replacement: reactPackage });
|
|
188
|
+
if (reactDomPackage) {
|
|
189
|
+
alias.unshift({ find: "react-dom", replacement: reactDomPackage });
|
|
190
|
+
}
|
|
191
|
+
const tailwindPlugin = await loadTailwindVitePlugin(packageRoot);
|
|
192
|
+
const plugins = [
|
|
193
|
+
reactShotPlugin({
|
|
194
|
+
fixturePath: options.fixturePath,
|
|
195
|
+
config: options.config,
|
|
196
|
+
}),
|
|
197
|
+
stubPlugin(stubs),
|
|
198
|
+
react({ jsxRuntime: "automatic" }),
|
|
199
|
+
];
|
|
200
|
+
if (tailwindPlugin)
|
|
201
|
+
plugins.unshift(tailwindPlugin);
|
|
202
|
+
const allowedDirectories = new Set([
|
|
203
|
+
packageRoot,
|
|
204
|
+
TOOL_ROOT,
|
|
205
|
+
path.dirname(path.resolve(options.fixturePath)),
|
|
206
|
+
...Object.values(aliases),
|
|
207
|
+
...(options.config.styles ?? []).map(path.dirname),
|
|
208
|
+
]);
|
|
209
|
+
const server = await createViteServer({
|
|
210
|
+
configFile: false,
|
|
211
|
+
root: packageRoot,
|
|
212
|
+
server: {
|
|
213
|
+
host: "127.0.0.1",
|
|
214
|
+
port: 0,
|
|
215
|
+
strictPort: false,
|
|
216
|
+
fs: { allow: [...allowedDirectories] },
|
|
217
|
+
},
|
|
218
|
+
plugins,
|
|
219
|
+
resolve: {
|
|
220
|
+
alias,
|
|
221
|
+
dedupe: [
|
|
222
|
+
"react",
|
|
223
|
+
"react-dom",
|
|
224
|
+
"react/jsx-runtime",
|
|
225
|
+
...(options.config.dedupe ?? []),
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
css: tailwindPlugin || !options.config.postcssConfig
|
|
229
|
+
? undefined
|
|
230
|
+
: { postcss: options.config.postcssConfig },
|
|
231
|
+
optimizeDeps: {
|
|
232
|
+
include: [
|
|
233
|
+
"react",
|
|
234
|
+
"react-dom",
|
|
235
|
+
"react/jsx-runtime",
|
|
236
|
+
"react-dom/client",
|
|
237
|
+
],
|
|
238
|
+
// Fixtures are executable entry points, not an application tree for Vite
|
|
239
|
+
// to crawl. Discovery can otherwise walk unrelated HTML reachable from
|
|
240
|
+
// unusual host filesystems; declared imports still load on demand.
|
|
241
|
+
noDiscovery: true,
|
|
242
|
+
force: true,
|
|
243
|
+
},
|
|
244
|
+
logLevel: "warn",
|
|
245
|
+
});
|
|
246
|
+
await server.listen();
|
|
247
|
+
const address = server.httpServer?.address();
|
|
248
|
+
if (!address || typeof address === "string") {
|
|
249
|
+
await server.close();
|
|
250
|
+
throw new Error("Vite server did not bind a TCP port");
|
|
251
|
+
}
|
|
252
|
+
return { server, url: `http://127.0.0.1:${address.port}/` };
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=create-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/meta.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReactShotFixture } from "./types.js";
|
|
2
|
+
/** Capture controls from a fixture, excluding its React tree. */
|
|
3
|
+
export type ShotMeta = Omit<ReactShotFixture, "component">;
|
|
4
|
+
export declare function resolveShotMeta(nodeMeta: Partial<ShotMeta>, browserMeta: Partial<ShotMeta>, cli?: {
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
}): Required<Pick<ShotMeta, "width" | "height" | "selector" | "settleMs" | "fullPage" | "stripOverlay" | "omitBackground">> & ShotMeta;
|
|
8
|
+
export declare function isDialogSelector(selector: string): boolean;
|
|
9
|
+
//# sourceMappingURL=meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,iEAAiE;AACjE,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAI3D,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC3B,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC9B,GAAG,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,QAAQ,CACT,IAAI,CACF,QAAQ,EACN,OAAO,GACP,QAAQ,GACR,UAAU,GACV,UAAU,GACV,UAAU,GACV,cAAc,GACd,gBAAgB,CACnB,CACF,GACC,QAAQ,CAmBT;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|
package/dist/meta.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const DIALOG_SELECTOR_RE = /role\s*=\s*["']?dialog["']?/i;
|
|
2
|
+
export function resolveShotMeta(nodeMeta, browserMeta, cli = {}) {
|
|
3
|
+
const merged = { ...nodeMeta, ...browserMeta };
|
|
4
|
+
const selector = merged.selector ?? "[data-react-shot-root]";
|
|
5
|
+
const looksLikeDialog = DIALOG_SELECTOR_RE.test(selector);
|
|
6
|
+
return {
|
|
7
|
+
...merged,
|
|
8
|
+
width: cli.width ?? merged.width ?? 1280,
|
|
9
|
+
height: cli.height ?? merged.height ?? 800,
|
|
10
|
+
selector,
|
|
11
|
+
settleMs: merged.settleMs ?? 150,
|
|
12
|
+
fullPage: merged.fullPage ?? false,
|
|
13
|
+
stripOverlay: merged.stripOverlay ?? looksLikeDialog,
|
|
14
|
+
omitBackground: merged.omitBackground ??
|
|
15
|
+
Boolean(merged.stripOverlay ?? looksLikeDialog),
|
|
16
|
+
waitFor: merged.waitFor,
|
|
17
|
+
background: merged.background,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function isDialogSelector(selector) {
|
|
21
|
+
return DIALOG_SELECTOR_RE.test(selector);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=meta.js.map
|
package/dist/meta.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAKA,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAE1D,MAAM,UAAU,eAAe,CAC7B,QAA2B,EAC3B,WAA8B,EAC9B,MAA2C,EAAE;IAc7C,MAAM,MAAM,GAAsB,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,wBAAwB,CAAC;IAC7D,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1D,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI;QACxC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG;QAC1C,QAAQ;QACR,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG;QAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,eAAe;QACpD,cAAc,EACZ,MAAM,CAAC,cAAc;YACrB,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,eAAe,CAAC;QACjD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/shot.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shot.d.ts","sourceRoot":"","sources":["../src/shot.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAiChE,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD;AA6QD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D"}
|
package/dist/shot.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { chromium } from "playwright";
|
|
5
|
+
import { findConfigPath, loadConfig, resolvePackageRoot } from "./config.js";
|
|
6
|
+
import { startShotServer } from "./create-server.js";
|
|
7
|
+
import { resolveShotMeta } from "./meta.js";
|
|
8
|
+
let sharedBrowser = null;
|
|
9
|
+
let sharedBrowserHeaded = null;
|
|
10
|
+
let shotQueue = Promise.resolve();
|
|
11
|
+
async function getBrowser(headed) {
|
|
12
|
+
if (sharedBrowser?.isConnected() && sharedBrowserHeaded === headed) {
|
|
13
|
+
return sharedBrowser;
|
|
14
|
+
}
|
|
15
|
+
if (sharedBrowser)
|
|
16
|
+
await closeBrowserNow();
|
|
17
|
+
try {
|
|
18
|
+
sharedBrowser = await chromium.launch({ headless: !headed });
|
|
19
|
+
sharedBrowserHeaded = headed;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
23
|
+
throw new Error(`Could not launch Chromium. Install it with "npx --@archastro:registry=https://registry.npmjs.org @archastro/astroshot install-browser".\n${message}`);
|
|
24
|
+
}
|
|
25
|
+
return sharedBrowser;
|
|
26
|
+
}
|
|
27
|
+
async function closeBrowserNow() {
|
|
28
|
+
if (!sharedBrowser)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
await sharedBrowser.close();
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
sharedBrowser = null;
|
|
35
|
+
sharedBrowserHeaded = null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function closeSharedBrowser() {
|
|
39
|
+
const close = shotQueue.then(closeBrowserNow);
|
|
40
|
+
shotQueue = close.then(() => undefined, () => undefined);
|
|
41
|
+
return close;
|
|
42
|
+
}
|
|
43
|
+
async function readFixtureMeta(fixturePath) {
|
|
44
|
+
try {
|
|
45
|
+
const url = `${pathToFileURL(path.resolve(fixturePath)).href}?reactShot=${Date.now()}`;
|
|
46
|
+
const module = await import(url);
|
|
47
|
+
const fixture = (module.default ?? module.fixture);
|
|
48
|
+
if (!fixture || typeof fixture !== "object")
|
|
49
|
+
return {};
|
|
50
|
+
const { width, height, selector, waitFor, settleMs, background, fullPage, stripOverlay, omitBackground, } = fixture;
|
|
51
|
+
return {
|
|
52
|
+
width,
|
|
53
|
+
height,
|
|
54
|
+
selector,
|
|
55
|
+
waitFor,
|
|
56
|
+
settleMs,
|
|
57
|
+
background,
|
|
58
|
+
fullPage,
|
|
59
|
+
stripOverlay,
|
|
60
|
+
omitBackground,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// TSX and application imports often cannot execute in Node. The browser
|
|
65
|
+
// reports the same metadata after Vite transforms the fixture.
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function takeIsolatedShot(request) {
|
|
70
|
+
const fixturePath = path.resolve(request.fixturePath);
|
|
71
|
+
if (!fs.existsSync(fixturePath)) {
|
|
72
|
+
throw new Error(`Fixture not found: ${fixturePath}`);
|
|
73
|
+
}
|
|
74
|
+
if (path.extname(request.outPath).toLowerCase() !== ".png") {
|
|
75
|
+
throw new Error(`Output must use a .png extension: ${request.outPath}`);
|
|
76
|
+
}
|
|
77
|
+
for (const [name, value] of [
|
|
78
|
+
["width", request.width],
|
|
79
|
+
["height", request.height],
|
|
80
|
+
]) {
|
|
81
|
+
if (value !== undefined &&
|
|
82
|
+
(!Number.isInteger(value) || value < 1 || value > 10_000)) {
|
|
83
|
+
throw new Error(`${name} must be an integer between 1 and 10000`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const configPath = request.configPath ?? findConfigPath(path.dirname(fixturePath));
|
|
87
|
+
const config = await loadConfig(configPath);
|
|
88
|
+
const packageRoot = resolvePackageRoot(fixturePath, request.root, config);
|
|
89
|
+
const nodeMeta = await readFixtureMeta(fixturePath);
|
|
90
|
+
let width = request.width ?? nodeMeta.width ?? 1280;
|
|
91
|
+
let height = request.height ?? nodeMeta.height ?? 800;
|
|
92
|
+
const outPath = path.resolve(request.outPath);
|
|
93
|
+
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
94
|
+
const { server, url } = await startShotServer({
|
|
95
|
+
fixturePath,
|
|
96
|
+
packageRoot,
|
|
97
|
+
config,
|
|
98
|
+
});
|
|
99
|
+
let page;
|
|
100
|
+
try {
|
|
101
|
+
const browser = await getBrowser(Boolean(request.headed));
|
|
102
|
+
page = await browser.newPage({
|
|
103
|
+
viewport: { width, height },
|
|
104
|
+
deviceScaleFactor: 1,
|
|
105
|
+
});
|
|
106
|
+
const pageErrors = [];
|
|
107
|
+
page.on("pageerror", (error) => pageErrors.push(String(error)));
|
|
108
|
+
page.on("console", (message) => {
|
|
109
|
+
if (message.type() === "error")
|
|
110
|
+
pageErrors.push(message.text());
|
|
111
|
+
});
|
|
112
|
+
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60_000 });
|
|
113
|
+
try {
|
|
114
|
+
await page.waitForFunction(() => window
|
|
115
|
+
.__REACT_SHOT_READY__ === true, undefined, { timeout: 45_000 });
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const bootError = await page
|
|
119
|
+
.evaluate(() => window
|
|
120
|
+
.__REACT_SHOT_ERROR__ ?? null)
|
|
121
|
+
.catch(() => null);
|
|
122
|
+
const body = await page.locator("body").innerText().catch(() => "");
|
|
123
|
+
throw new Error([
|
|
124
|
+
`Fixture page never became ready: ${error instanceof Error ? error.message : error}`,
|
|
125
|
+
bootError ? `Boot error: ${bootError}` : null,
|
|
126
|
+
pageErrors.length
|
|
127
|
+
? `Browser errors:\n${[...new Set(pageErrors)].slice(0, 10).map((item) => ` - ${item}`).join("\n")}`
|
|
128
|
+
: null,
|
|
129
|
+
body ? `Rendered body:\n${body.slice(0, 800)}` : null,
|
|
130
|
+
]
|
|
131
|
+
.filter(Boolean)
|
|
132
|
+
.join("\n"));
|
|
133
|
+
}
|
|
134
|
+
const bootError = await page.evaluate(() => window
|
|
135
|
+
.__REACT_SHOT_ERROR__ ?? null);
|
|
136
|
+
if (bootError)
|
|
137
|
+
throw new Error(`Fixture threw while mounting:\n${bootError}`);
|
|
138
|
+
const browserMeta = (await page.evaluate(() => window
|
|
139
|
+
.__REACT_SHOT_META__ ?? {}));
|
|
140
|
+
const meta = resolveShotMeta(nodeMeta, browserMeta, {
|
|
141
|
+
width: request.width,
|
|
142
|
+
height: request.height,
|
|
143
|
+
});
|
|
144
|
+
width = meta.width;
|
|
145
|
+
height = meta.height;
|
|
146
|
+
if (!Number.isInteger(width) ||
|
|
147
|
+
!Number.isInteger(height) ||
|
|
148
|
+
width < 1 ||
|
|
149
|
+
height < 1 ||
|
|
150
|
+
width > 10_000 ||
|
|
151
|
+
height > 10_000) {
|
|
152
|
+
throw new Error(`Fixture dimensions must be integers between 1 and 10000; received ${width}x${height}`);
|
|
153
|
+
}
|
|
154
|
+
const viewport = page.viewportSize();
|
|
155
|
+
if (viewport && (viewport.width !== width || viewport.height !== height)) {
|
|
156
|
+
await page.setViewportSize({ width, height });
|
|
157
|
+
}
|
|
158
|
+
if (meta.waitFor) {
|
|
159
|
+
if (meta.waitFor.startsWith("text=") || meta.waitFor.startsWith("text/")) {
|
|
160
|
+
const text = meta.waitFor.replace(/^text[=/]/, "");
|
|
161
|
+
await page.getByText(text, { exact: false }).first().waitFor({
|
|
162
|
+
state: "visible",
|
|
163
|
+
timeout: 15_000,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
await page.waitForSelector(meta.waitFor, {
|
|
168
|
+
state: "visible",
|
|
169
|
+
timeout: 15_000,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
await page.waitForSelector(meta.selector, {
|
|
175
|
+
state: "visible",
|
|
176
|
+
timeout: 15_000,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (meta.settleMs > 0)
|
|
180
|
+
await page.waitForTimeout(meta.settleMs);
|
|
181
|
+
const seriousErrors = pageErrors.filter((error) => !/Download the React DevTools/i.test(error) &&
|
|
182
|
+
!/React does not recognize/i.test(error) &&
|
|
183
|
+
!/\[vite\]/i.test(error));
|
|
184
|
+
if (seriousErrors.length > 0) {
|
|
185
|
+
throw new Error(`Fixture rendered with browser errors:\n${[...new Set(seriousErrors)]
|
|
186
|
+
.slice(0, 8)
|
|
187
|
+
.map((error) => ` - ${error}`)
|
|
188
|
+
.join("\n")}`);
|
|
189
|
+
}
|
|
190
|
+
if (meta.stripOverlay) {
|
|
191
|
+
if ((await page.locator(meta.selector).count()) === 0) {
|
|
192
|
+
throw new Error(`stripOverlay is enabled but ${JSON.stringify(meta.selector)} matched nothing`);
|
|
193
|
+
}
|
|
194
|
+
await page.evaluate((selector) => {
|
|
195
|
+
const target = document.querySelector(selector);
|
|
196
|
+
if (!(target instanceof HTMLElement))
|
|
197
|
+
return;
|
|
198
|
+
const clone = target.cloneNode(true);
|
|
199
|
+
document.documentElement.style.cssText =
|
|
200
|
+
"background:transparent !important;";
|
|
201
|
+
document.body.replaceChildren();
|
|
202
|
+
document.body.style.cssText =
|
|
203
|
+
"margin:0;padding:0;background:transparent !important;display:block;width:fit-content;height:fit-content;";
|
|
204
|
+
for (const [property, value] of [
|
|
205
|
+
["position", "relative"],
|
|
206
|
+
["inset", "auto"],
|
|
207
|
+
["transform", "none"],
|
|
208
|
+
["margin", "0"],
|
|
209
|
+
["max-height", "none"],
|
|
210
|
+
["left", "auto"],
|
|
211
|
+
["top", "auto"],
|
|
212
|
+
["box-shadow", "none"],
|
|
213
|
+
["filter", "none"],
|
|
214
|
+
]) {
|
|
215
|
+
clone.style.setProperty(property, value, "important");
|
|
216
|
+
}
|
|
217
|
+
clone.setAttribute("data-react-shot-isolated", "true");
|
|
218
|
+
document.body.appendChild(clone);
|
|
219
|
+
}, meta.selector);
|
|
220
|
+
await page.waitForTimeout(80);
|
|
221
|
+
}
|
|
222
|
+
if (meta.fullPage) {
|
|
223
|
+
await page.screenshot({
|
|
224
|
+
path: outPath,
|
|
225
|
+
fullPage: true,
|
|
226
|
+
omitBackground: meta.omitBackground,
|
|
227
|
+
});
|
|
228
|
+
return outPath;
|
|
229
|
+
}
|
|
230
|
+
const target = page
|
|
231
|
+
.locator(meta.stripOverlay ? "[data-react-shot-isolated]" : meta.selector)
|
|
232
|
+
.first();
|
|
233
|
+
await target.waitFor({ state: "visible", timeout: 10_000 });
|
|
234
|
+
const box = await target.boundingBox();
|
|
235
|
+
if (!box || box.width < 2 || box.height < 2) {
|
|
236
|
+
throw new Error(`Screenshot target has an empty bounding box: ${meta.selector}`);
|
|
237
|
+
}
|
|
238
|
+
if (meta.stripOverlay &&
|
|
239
|
+
box.width >= width * 0.9 &&
|
|
240
|
+
box.height >= height * 0.9) {
|
|
241
|
+
throw new Error(`Overlay removal produced a viewport-sized target (${Math.round(box.width)}x${Math.round(box.height)}); check selector ${JSON.stringify(meta.selector)}`);
|
|
242
|
+
}
|
|
243
|
+
await target.screenshot({
|
|
244
|
+
path: outPath,
|
|
245
|
+
omitBackground: meta.omitBackground,
|
|
246
|
+
});
|
|
247
|
+
return outPath;
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
await page?.close();
|
|
251
|
+
await server.close();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export function takeShot(request) {
|
|
255
|
+
const shot = shotQueue.then(() => takeIsolatedShot(request));
|
|
256
|
+
shotQueue = shot.then(() => undefined, () => undefined);
|
|
257
|
+
return shot;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=shot.js.map
|
package/dist/shot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shot.js","sourceRoot":"","sources":["../src/shot.ts"],"names":[],"mappings":"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"}
|
package/dist/stubs.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const nextNavigationStub = "\nexport function useRouter() {\n return {\n push() {}, replace() {}, prefetch() {}, back() {},\n forward() {}, refresh() {},\n };\n}\nexport function usePathname() { return \"/\"; }\nexport function useSearchParams() { return new URLSearchParams(); }\nexport function useParams() { return {}; }\nexport function redirect() {}\nexport function notFound() {}\n";
|
|
2
|
+
export declare const nextLinkStub = "\nimport React from \"react\";\nexport default function Link({ href, children, ...rest }) {\n return React.createElement(\"a\", { href: typeof href === \"string\" ? href : \"#\", ...rest }, children);\n}\n";
|
|
3
|
+
export declare const nextImageStub = "\nimport React from \"react\";\nexport default function Image({ src, alt, width, height, ...rest }) {\n return React.createElement(\"img\", {\n src: typeof src === \"string\" ? src : \"\",\n alt: alt || \"\",\n width,\n height,\n ...rest,\n });\n}\n";
|
|
4
|
+
export declare const serverOnlyStub = "export {};";
|
|
5
|
+
export declare const nextDynamicStub = "\nimport React from \"react\";\nexport default function dynamic(loader, options) {\n const Lazy = React.lazy(loader);\n const fallback = options && options.loading\n ? React.createElement(options.loading)\n : null;\n return function DynamicComponent(props) {\n return React.createElement(\n React.Suspense,\n { fallback },\n React.createElement(Lazy, props),\n );\n };\n}\n";
|
|
6
|
+
//# sourceMappingURL=stubs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,oXAY9B,CAAC;AAEF,eAAO,MAAM,YAAY,mNAKxB,CAAC;AAEF,eAAO,MAAM,aAAa,+QAWzB,CAAC;AAEF,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,eAAO,MAAM,eAAe,yZAe3B,CAAC"}
|