@extenshi/cli 0.20.0 → 0.22.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.
Files changed (122) hide show
  1. package/README.md +4 -0
  2. package/dist/amo-source-detect.d.ts +18 -0
  3. package/dist/amo-source-detect.d.ts.map +1 -0
  4. package/dist/amo-source-detect.js +41 -0
  5. package/dist/amo-source-detect.js.map +1 -0
  6. package/dist/amo-source.d.ts +41 -0
  7. package/dist/amo-source.d.ts.map +1 -0
  8. package/dist/amo-source.js +240 -0
  9. package/dist/amo-source.js.map +1 -0
  10. package/dist/amowebstore-md.d.ts +38 -0
  11. package/dist/amowebstore-md.d.ts.map +1 -0
  12. package/dist/amowebstore-md.js +118 -0
  13. package/dist/amowebstore-md.js.map +1 -0
  14. package/dist/auto-evidence.d.ts +100 -0
  15. package/dist/auto-evidence.d.ts.map +1 -0
  16. package/dist/auto-evidence.js +197 -0
  17. package/dist/auto-evidence.js.map +1 -0
  18. package/dist/cli.js +320 -8
  19. package/dist/cli.js.map +1 -1
  20. package/dist/edgewebstore-md.d.ts +26 -0
  21. package/dist/edgewebstore-md.d.ts.map +1 -0
  22. package/dist/edgewebstore-md.js +95 -0
  23. package/dist/edgewebstore-md.js.map +1 -0
  24. package/dist/evidence-ingest.d.ts +60 -0
  25. package/dist/evidence-ingest.d.ts.map +1 -0
  26. package/dist/evidence-ingest.js +141 -0
  27. package/dist/evidence-ingest.js.map +1 -0
  28. package/dist/expected-error.d.ts +9 -0
  29. package/dist/expected-error.d.ts.map +1 -1
  30. package/dist/expected-error.js +16 -1
  31. package/dist/expected-error.js.map +1 -1
  32. package/dist/firefox-rdp.d.ts +55 -0
  33. package/dist/firefox-rdp.d.ts.map +1 -0
  34. package/dist/firefox-rdp.js +203 -0
  35. package/dist/firefox-rdp.js.map +1 -0
  36. package/dist/gecko-id.d.ts +55 -0
  37. package/dist/gecko-id.d.ts.map +1 -0
  38. package/dist/gecko-id.js +132 -0
  39. package/dist/gecko-id.js.map +1 -0
  40. package/dist/generate-listing.d.ts +19 -8
  41. package/dist/generate-listing.d.ts.map +1 -1
  42. package/dist/generate-listing.js +66 -18
  43. package/dist/generate-listing.js.map +1 -1
  44. package/dist/icon.d.ts +18 -0
  45. package/dist/icon.d.ts.map +1 -1
  46. package/dist/icon.js +29 -20
  47. package/dist/icon.js.map +1 -1
  48. package/dist/json-ld.d.ts +89 -0
  49. package/dist/json-ld.d.ts.map +1 -0
  50. package/dist/json-ld.js +118 -0
  51. package/dist/json-ld.js.map +1 -0
  52. package/dist/landing-page.d.ts +123 -0
  53. package/dist/landing-page.d.ts.map +1 -0
  54. package/dist/landing-page.js +405 -0
  55. package/dist/landing-page.js.map +1 -0
  56. package/dist/media.d.ts +42 -0
  57. package/dist/media.d.ts.map +1 -0
  58. package/dist/media.js +96 -0
  59. package/dist/media.js.map +1 -0
  60. package/dist/package.d.ts +163 -0
  61. package/dist/package.d.ts.map +1 -0
  62. package/dist/package.js +500 -0
  63. package/dist/package.js.map +1 -0
  64. package/dist/page.d.ts +141 -0
  65. package/dist/page.d.ts.map +1 -0
  66. package/dist/page.js +227 -0
  67. package/dist/page.js.map +1 -0
  68. package/dist/pay-contract.d.ts +20 -13
  69. package/dist/pay-contract.d.ts.map +1 -1
  70. package/dist/pay-contract.js +20 -11
  71. package/dist/pay-contract.js.map +1 -1
  72. package/dist/pay-test-cycle.d.ts +40 -0
  73. package/dist/pay-test-cycle.d.ts.map +1 -0
  74. package/dist/pay-test-cycle.js +207 -0
  75. package/dist/pay-test-cycle.js.map +1 -0
  76. package/dist/pay.d.ts +1 -1
  77. package/dist/pay.d.ts.map +1 -1
  78. package/dist/pay.js +1 -0
  79. package/dist/pay.js.map +1 -1
  80. package/dist/project.d.ts +39 -1
  81. package/dist/project.d.ts.map +1 -1
  82. package/dist/project.js +231 -20
  83. package/dist/project.js.map +1 -1
  84. package/dist/publish.d.ts +33 -0
  85. package/dist/publish.d.ts.map +1 -1
  86. package/dist/publish.js +113 -2
  87. package/dist/publish.js.map +1 -1
  88. package/dist/review-checks.d.ts +13 -0
  89. package/dist/review-checks.d.ts.map +1 -1
  90. package/dist/review-checks.js.map +1 -1
  91. package/dist/review-risk.d.ts +10 -1
  92. package/dist/review-risk.d.ts.map +1 -1
  93. package/dist/review-risk.js +1 -0
  94. package/dist/review-risk.js.map +1 -1
  95. package/dist/scan.d.ts +3 -2
  96. package/dist/scan.d.ts.map +1 -1
  97. package/dist/scan.js +4 -2
  98. package/dist/scan.js.map +1 -1
  99. package/dist/screenshots-scenes.d.ts +1383 -0
  100. package/dist/screenshots-scenes.d.ts.map +1 -0
  101. package/dist/screenshots-scenes.js +276 -0
  102. package/dist/screenshots-scenes.js.map +1 -0
  103. package/dist/screenshots.d.ts +145 -0
  104. package/dist/screenshots.d.ts.map +1 -0
  105. package/dist/screenshots.js +557 -0
  106. package/dist/screenshots.js.map +1 -0
  107. package/dist/smoke.d.ts +81 -0
  108. package/dist/smoke.d.ts.map +1 -0
  109. package/dist/smoke.js +491 -0
  110. package/dist/smoke.js.map +1 -0
  111. package/dist/store-assets.d.ts +139 -0
  112. package/dist/store-assets.d.ts.map +1 -0
  113. package/dist/store-assets.js +582 -0
  114. package/dist/store-assets.js.map +1 -0
  115. package/dist/telemetry.d.ts.map +1 -1
  116. package/dist/telemetry.js +3 -0
  117. package/dist/telemetry.js.map +1 -1
  118. package/dist/zip.d.ts +57 -0
  119. package/dist/zip.d.ts.map +1 -0
  120. package/dist/zip.js +134 -0
  121. package/dist/zip.js.map +1 -0
  122. package/package.json +4 -3
@@ -0,0 +1,557 @@
1
+ /**
2
+ * `extenshi screenshots <unpacked-dir|zip> --scenes scenes.json` — store
3
+ * screenshots per locale, without a human.
4
+ *
5
+ * Loads the build into Chromium (Playwright, resolved lazily from the project or
6
+ * the CLI's own install — never bundled), runs the declarative scenes from
7
+ * screenshots-scenes.ts once per locale, and writes each store's screenshot size
8
+ * (store-assets.ts STORE_SCREENSHOT_SPECS) with stable names:
9
+ *
10
+ * <out>/<store>/<locale>/01-popup-1280x800.png
11
+ * <out>/screenshots.json (index: files, sha256, verified locales)
12
+ *
13
+ * Locale switching is the part that silently goes wrong elsewhere, so it is
14
+ * verified, not assumed: each locale gets a fresh Chromium whose UI language is
15
+ * set per platform (--lang; LANGUAGE on Linux; -AppleLanguages on macOS, where
16
+ * --lang is ignored), then `chrome.i18n` inside the extension must report that
17
+ * locale AND render a message from `_locales/<locale>`. A mismatch fails the run
18
+ * instead of producing English screenshots labelled German.
19
+ *
20
+ * Determinism: fixed viewport and device scale factor, `reducedMotion`,
21
+ * animations/transitions/caret disabled, UTC timezone, optional fixed clock,
22
+ * fonts + images awaited before every capture, and the store canvas composed
23
+ * with resvg (no browser scaling). The source directory is never modified — the
24
+ * build is staged into a temporary copy (a zip is extracted there).
25
+ *
26
+ * TODO(evidence): `--evidence` (record `screenshots` evidence per locale) is
27
+ * deliberately not implemented here — it belongs to the shared `--evidence`
28
+ * mechanism being added for `package` / `test smoke`. screenshots.json already
29
+ * carries per-locale file lists and hashes for it to consume.
30
+ */
31
+ import { createHash } from 'node:crypto';
32
+ import { existsSync, realpathSync } from 'node:fs';
33
+ import { chmod, cp, mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
34
+ import { createServer } from 'node:http';
35
+ import { createRequire } from 'node:module';
36
+ import os from 'node:os';
37
+ import path from 'node:path';
38
+ import JSZip from 'jszip';
39
+ import { InvalidInputError } from './expected-error.js';
40
+ import { chromeLang, extensionIdForKey, extensionIdForPath, macLocaleWrapper, parseLocales, parseScenes, pickSampleMessage, placeCapture, pngDimensions, resolveCatalogLocale, screenshotFileName, } from './screenshots-scenes.js';
41
+ import { parseStores, renderSvg, STORE_SCREENSHOT_SPECS } from './store-assets.js';
42
+ export const PROBE_PAGE = '__extenshi_screenshots__.html';
43
+ const INSTALL_HINT = 'Install it next to your extension: npm i -D playwright && npx playwright install chromium ' +
44
+ '(the full Chromium build — the headless shell cannot load extensions).';
45
+ /** Resolve Playwright from the project first, then from the CLI's own install. */
46
+ export function loadPlaywright(cwd = process.cwd(), bases = [path.join(cwd, 'package.json'), import.meta.url]) {
47
+ for (const base of bases) {
48
+ const req = createRequire(base);
49
+ for (const name of ['playwright', 'playwright-core', '@playwright/test']) {
50
+ try {
51
+ const mod = req(name);
52
+ if (mod?.chromium)
53
+ return mod;
54
+ }
55
+ catch {
56
+ // not installed here — try the next candidate
57
+ }
58
+ }
59
+ }
60
+ throw new InvalidInputError(`extenshi screenshots needs Playwright, which the CLI does not bundle. ${INSTALL_HINT}`);
61
+ }
62
+ const MAX_ZIP_ENTRIES = 5000;
63
+ const MAX_UNZIPPED_BYTES = 300 * 1024 * 1024;
64
+ async function extractZip(file, into) {
65
+ const zip = await JSZip.loadAsync(await readFile(file));
66
+ const entries = Object.values(zip.files);
67
+ if (entries.length > MAX_ZIP_ENTRIES)
68
+ throw new InvalidInputError(`${file} has more than ${MAX_ZIP_ENTRIES} entries`);
69
+ let total = 0;
70
+ for (const entry of entries) {
71
+ const target = path.resolve(into, entry.name);
72
+ if (!target.startsWith(into + path.sep) && target !== into)
73
+ throw new InvalidInputError(`Refusing zip entry outside the archive root: ${entry.name}`);
74
+ if (entry.dir) {
75
+ await mkdir(target, { recursive: true });
76
+ continue;
77
+ }
78
+ const bytes = await entry.async('nodebuffer');
79
+ total += bytes.length;
80
+ if (total > MAX_UNZIPPED_BYTES)
81
+ throw new InvalidInputError(`${file} unpacks to more than 300 MB`);
82
+ await mkdir(path.dirname(target), { recursive: true });
83
+ await writeFile(target, bytes);
84
+ }
85
+ }
86
+ async function readJson(file) {
87
+ try {
88
+ return JSON.parse((await readFile(file, 'utf8')).replace(/^/, ''));
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Copy (or unzip) the build into `work/extension`, never touching the source.
96
+ * The copy gets one extra, empty page — the probe the runner uses to reach
97
+ * chrome.i18n / chrome.storage in the extension's own context.
98
+ */
99
+ export async function stageExtension(input, work) {
100
+ const source = path.resolve(process.cwd(), input);
101
+ const info = await stat(source).catch(() => null);
102
+ if (!info)
103
+ throw new InvalidInputError(`Not found: ${input}`);
104
+ const dir = path.join(work, 'extension');
105
+ await mkdir(dir, { recursive: true });
106
+ if (info.isDirectory())
107
+ await cp(source, dir, { recursive: true, filter: (p) => !p.includes(`${path.sep}node_modules`) });
108
+ else if (/\.(zip|xpi)$/i.test(source))
109
+ await extractZip(source, dir);
110
+ else
111
+ throw new InvalidInputError(`${input}: pass an unpacked extension directory or a .zip`);
112
+ let root = dir;
113
+ if (!existsSync(path.join(root, 'manifest.json'))) {
114
+ // A zip of the folder rather than of its contents.
115
+ const children = (await readdir(dir, { withFileTypes: true })).filter((d) => d.isDirectory());
116
+ const nested = children.find((d) => existsSync(path.join(dir, d.name, 'manifest.json')));
117
+ if (!nested)
118
+ throw new InvalidInputError(`${input} has no manifest.json at its root`);
119
+ root = path.join(dir, nested.name);
120
+ }
121
+ const manifestPath = path.join(root, 'manifest.json');
122
+ const manifest = await readJson(manifestPath);
123
+ if (!manifest)
124
+ throw new InvalidInputError(`${input}: manifest.json is not valid JSON`);
125
+ const warnings = [];
126
+ // Firefox-style MV3 background scripts make Chromium refuse the whole
127
+ // extension; the UI renders without them, so drop them from the COPY only.
128
+ if (manifest.manifest_version === 3 &&
129
+ manifest.background?.scripts &&
130
+ !manifest.background?.service_worker) {
131
+ delete manifest.background;
132
+ warnings.push('background.scripts (Firefox MV3) is not supported by Chromium — shot without the background script');
133
+ await writeFile(manifestPath, JSON.stringify(manifest, null, 2));
134
+ }
135
+ await writeFile(path.join(root, PROBE_PAGE), '<!doctype html><meta charset="utf-8"><title>extenshi</title>');
136
+ const localesDir = path.join(root, '_locales');
137
+ const locales = existsSync(localesDir)
138
+ ? (await readdir(localesDir, { withFileTypes: true }))
139
+ .filter((d) => d.isDirectory() && existsSync(path.join(localesDir, d.name, 'messages.json')))
140
+ .map((d) => d.name)
141
+ .sort()
142
+ : [];
143
+ const messages = {};
144
+ for (const locale of locales)
145
+ messages[locale] = await readJson(path.join(localesDir, locale, 'messages.json'));
146
+ const real = realpathSync(root);
147
+ const id = typeof manifest.key === 'string' ? extensionIdForKey(manifest.key) : extensionIdForPath(real);
148
+ return { dir: real, id, manifest, locales, defaultLocale: manifest.default_locale, messages, warnings };
149
+ }
150
+ // ── Fixture server ─────────────────────────────────────────────────────────
151
+ const CONTENT_TYPES = {
152
+ '.html': 'text/html; charset=utf-8',
153
+ '.htm': 'text/html; charset=utf-8',
154
+ '.css': 'text/css; charset=utf-8',
155
+ '.js': 'text/javascript; charset=utf-8',
156
+ '.mjs': 'text/javascript; charset=utf-8',
157
+ '.json': 'application/json',
158
+ '.svg': 'image/svg+xml',
159
+ '.png': 'image/png',
160
+ '.jpg': 'image/jpeg',
161
+ '.jpeg': 'image/jpeg',
162
+ '.webp': 'image/webp',
163
+ '.gif': 'image/gif',
164
+ '.woff2': 'font/woff2',
165
+ '.woff': 'font/woff',
166
+ '.ttf': 'font/ttf',
167
+ '.txt': 'text/plain; charset=utf-8',
168
+ };
169
+ /** Static server for fixture pages on 127.0.0.1 — content scripts do not run on file://. */
170
+ export async function startFixtureServer(root) {
171
+ const base = realpathSync(root);
172
+ const server = createServer(async (req, res) => {
173
+ try {
174
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
175
+ res.writeHead(405).end();
176
+ return;
177
+ }
178
+ const pathname = decodeURIComponent(new URL(req.url ?? '/', 'http://127.0.0.1').pathname);
179
+ const file = path.resolve(base, `.${pathname}`);
180
+ if (!file.startsWith(base + path.sep)) {
181
+ res.writeHead(403).end();
182
+ return;
183
+ }
184
+ const real = realpathSync(file);
185
+ if (!real.startsWith(base + path.sep) || !(await stat(real)).isFile()) {
186
+ res.writeHead(404).end();
187
+ return;
188
+ }
189
+ res.writeHead(200, {
190
+ 'content-type': CONTENT_TYPES[path.extname(real).toLowerCase()] ?? 'application/octet-stream',
191
+ 'cache-control': 'no-store',
192
+ });
193
+ res.end(req.method === 'HEAD' ? undefined : await readFile(real));
194
+ }
195
+ catch {
196
+ res.writeHead(404).end();
197
+ }
198
+ });
199
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
200
+ const address = server.address();
201
+ const port = typeof address === 'object' && address ? address.port : 0;
202
+ return {
203
+ origin: `http://127.0.0.1:${port}`,
204
+ close: () => new Promise((resolve) => server.close(() => resolve())),
205
+ };
206
+ }
207
+ // ── Browser ────────────────────────────────────────────────────────────────
208
+ async function launch(pw, opts) {
209
+ const executable = pw.chromium.executablePath();
210
+ if (!executable || !existsSync(executable))
211
+ throw new InvalidInputError(`Playwright's Chromium is not installed (${executable || 'no path'}). ${INSTALL_HINT}`);
212
+ const profile = await mkdtemp(path.join(opts.work, `profile-${opts.lang}-`));
213
+ const launchOpts = {
214
+ headless: !opts.headed,
215
+ locale: opts.lang,
216
+ timezoneId: 'UTC',
217
+ viewport: opts.file.viewport,
218
+ deviceScaleFactor: opts.file.deviceScaleFactor,
219
+ colorScheme: opts.file.colorScheme,
220
+ reducedMotion: 'reduce',
221
+ args: [
222
+ `--lang=${opts.lang}`,
223
+ `--disable-extensions-except=${opts.ext.dir}`,
224
+ `--load-extension=${opts.ext.dir}`,
225
+ ...(process.platform === 'linux' ? ['--font-render-hinting=none'] : []),
226
+ ],
227
+ };
228
+ if (process.platform === 'darwin') {
229
+ const wrapper = path.join(opts.work, `chromium-${opts.lang}.sh`);
230
+ await writeFile(wrapper, macLocaleWrapper(executable, opts.lang));
231
+ await chmod(wrapper, 0o700);
232
+ launchOpts.executablePath = wrapper;
233
+ }
234
+ else {
235
+ // Full Chromium (new headless) — chromium-headless-shell has no extension support.
236
+ launchOpts.channel = 'chromium';
237
+ if (process.platform === 'linux') {
238
+ const posix = opts.lang.replace('-', '_');
239
+ launchOpts.env = { ...process.env, LANGUAGE: posix, LANG: `${posix}.UTF-8`, LC_ALL: `${posix}.UTF-8` };
240
+ }
241
+ }
242
+ return pw.chromium.launchPersistentContext(profile, launchOpts);
243
+ }
244
+ async function settle(page) {
245
+ await page.evaluate(async () => {
246
+ await document.fonts?.ready;
247
+ await Promise.all([...document.images]
248
+ .filter((img) => !img.complete)
249
+ .map((img) => new Promise((resolve) => {
250
+ img.addEventListener('load', resolve, { once: true });
251
+ img.addEventListener('error', resolve, { once: true });
252
+ })));
253
+ await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));
254
+ });
255
+ }
256
+ const NO_MOTION_CSS = '*,*::before,*::after{animation-duration:0s!important;animation-delay:0s!important;' +
257
+ 'transition-duration:0s!important;transition-delay:0s!important;caret-color:transparent!important}';
258
+ async function runStep(step, page, probe) {
259
+ const timeout = 10_000;
260
+ if ('click' in step)
261
+ await page.locator(step.click).first().click({ timeout });
262
+ else if ('hover' in step)
263
+ await page.locator(step.hover).first().hover({ timeout });
264
+ else if ('type' in step)
265
+ await page.locator(step.type).first().fill(step.text, { timeout });
266
+ else if ('press' in step)
267
+ await page.keyboard.press(step.press);
268
+ else if ('mouse' in step)
269
+ await page.mouse.move(step.mouse.x, step.mouse.y);
270
+ else if ('scroll' in step)
271
+ await page.mouse.wheel(step.scroll.x, step.scroll.y);
272
+ else if ('wait' in step)
273
+ await page.waitForTimeout(step.wait);
274
+ else if ('waitFor' in step)
275
+ await page.locator(step.waitFor).first().waitFor({ state: step.state, timeout });
276
+ else if ('storage' in step)
277
+ await probe.evaluate(async (s) => {
278
+ const area = chrome.storage[s.area];
279
+ if (s.clear)
280
+ await area.clear();
281
+ if (s.remove?.length)
282
+ await area.remove(s.remove);
283
+ if (s.set)
284
+ await area.set(s.set);
285
+ }, step.storage);
286
+ else if ('eval' in step)
287
+ await page.evaluate(step.eval);
288
+ }
289
+ function sceneUrl(scene, ext, fixtures, locale) {
290
+ const open = scene.open.replaceAll('{locale}', locale).replaceAll('{lang}', chromeLang(locale));
291
+ const m = ext.manifest;
292
+ const extUrl = (p) => `chrome-extension://${ext.id}/${p.replace(/^\/+/, '')}`;
293
+ if (open === 'popup') {
294
+ const popup = m.action?.default_popup ?? m.browser_action?.default_popup ?? m.page_action?.default_popup;
295
+ if (!popup)
296
+ throw new InvalidInputError(`Scene "${scene.name}": the manifest declares no popup (action.default_popup)`);
297
+ return extUrl(popup);
298
+ }
299
+ if (open === 'options') {
300
+ const options = m.options_ui?.page ?? m.options_page;
301
+ if (!options)
302
+ throw new InvalidInputError(`Scene "${scene.name}": the manifest declares no options page`);
303
+ return extUrl(options);
304
+ }
305
+ if (open.startsWith('page:')) {
306
+ const rel = open.slice(5);
307
+ const file = path.resolve(ext.dir, rel.split(/[?#]/)[0]);
308
+ if (!file.startsWith(ext.dir + path.sep) || !existsSync(file))
309
+ throw new InvalidInputError(`Scene "${scene.name}": ${rel} is not a file in the extension`);
310
+ return extUrl(rel);
311
+ }
312
+ if (open.startsWith('fixture:')) {
313
+ const rel = open.slice(8);
314
+ const file = path.resolve(fixtures.root, rel.split(/[?#]/)[0]);
315
+ if (!file.startsWith(fixtures.root + path.sep) || !existsSync(file))
316
+ throw new InvalidInputError(`Scene "${scene.name}": fixture ${rel} not found under ${fixtures.root}`);
317
+ return `${fixtures.origin}/${rel.replace(/^\/+/, '')}`;
318
+ }
319
+ return open.slice(4); // url:https://…
320
+ }
321
+ async function captureScene(ctx, probe, scene, file, url) {
322
+ const page = await ctx.newPage();
323
+ try {
324
+ const viewport = scene.viewport ?? (scene.open === 'popup' ? { width: 800, height: 600 } : file.viewport);
325
+ await page.setViewportSize(viewport);
326
+ await page.emulateMedia({ colorScheme: scene.colorScheme ?? file.colorScheme, reducedMotion: 'reduce' });
327
+ if (file.time && page.clock)
328
+ await page.clock.setFixedTime(new Date(file.time));
329
+ if (file.animations === 'disabled')
330
+ await page.addInitScript({
331
+ content: `document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement('style');s.textContent=${JSON.stringify(NO_MOTION_CSS)};document.documentElement.append(s)})`,
332
+ });
333
+ if (scene.init)
334
+ await page.addInitScript({ content: scene.init });
335
+ await page.goto(url, { waitUntil: 'load', timeout: 30_000 });
336
+ await settle(page);
337
+ for (const step of scene.steps)
338
+ await runStep(step, page, probe);
339
+ await settle(page);
340
+ const crop = scene.crop ?? (scene.open === 'popup' ? 'content' : 'viewport');
341
+ const dsf = file.deviceScaleFactor;
342
+ if (crop === 'viewport')
343
+ return { png: await page.screenshot({ type: 'png' }), css: viewport };
344
+ if (crop === 'fullPage') {
345
+ const png = await page.screenshot({ type: 'png', fullPage: true });
346
+ const px = pngDimensions(png);
347
+ return { png, css: { width: px.width / dsf, height: px.height / dsf } };
348
+ }
349
+ let box;
350
+ if (crop === 'content') {
351
+ box = await page.evaluate(() => {
352
+ const body = document.body;
353
+ const r = body.getBoundingClientRect();
354
+ const style = getComputedStyle(body);
355
+ const width = Math.ceil(r.right + Number.parseFloat(style.marginRight || '0'));
356
+ const height = Math.ceil(Math.max(r.bottom + Number.parseFloat(style.marginBottom || '0'), body.scrollHeight));
357
+ return { x: 0, y: 0, width: Math.min(width, innerWidth), height: Math.min(height, innerHeight) };
358
+ });
359
+ }
360
+ else {
361
+ const el = page.locator(crop.selector).first();
362
+ await el.scrollIntoViewIfNeeded({ timeout: 10_000 });
363
+ const r = await el.boundingBox();
364
+ if (!r)
365
+ throw new InvalidInputError(`Scene "${scene.name}": ${crop.selector} is not visible`);
366
+ const p = crop.padding;
367
+ const x = Math.max(0, Math.floor(r.x - p));
368
+ const y = Math.max(0, Math.floor(r.y - p));
369
+ box = {
370
+ x,
371
+ y,
372
+ width: Math.min(viewport.width - x, Math.ceil(r.width + 2 * p)),
373
+ height: Math.min(viewport.height - y, Math.ceil(r.height + 2 * p)),
374
+ };
375
+ }
376
+ if (!box || box.width < 1 || box.height < 1)
377
+ throw new InvalidInputError(`Scene "${scene.name}": nothing to capture`);
378
+ return {
379
+ png: await page.screenshot({ type: 'png', clip: box }),
380
+ css: { width: box.width, height: box.height },
381
+ };
382
+ }
383
+ finally {
384
+ await page.close();
385
+ }
386
+ }
387
+ /** Compose a capture onto a store-size canvas with resvg (exact pixels, no browser scaling). */
388
+ export async function composeOnCanvas(capture, canvas, opts) {
389
+ const px = pngDimensions(capture.png);
390
+ if (opts.fit === 'contain' && px.width === canvas.width && px.height === canvas.height)
391
+ return capture.png;
392
+ const place = placeCapture(capture.css, canvas, { fit: opts.fit, margin: opts.margin, scale: opts.dsf });
393
+ const n = (v) => Number(v.toFixed(3));
394
+ const framed = opts.fit === 'contain' && (place.width < canvas.width || place.height < canvas.height);
395
+ const radius = framed ? opts.radius : 0;
396
+ const defs = [
397
+ opts.backgroundTo
398
+ ? `<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="${opts.background}"/><stop offset="1" stop-color="${opts.backgroundTo}"/></linearGradient>`
399
+ : '',
400
+ `<clipPath id="r"><rect x="${n(place.x)}" y="${n(place.y)}" width="${n(place.width)}" height="${n(place.height)}" rx="${radius}"/></clipPath>`,
401
+ framed && opts.shadow
402
+ ? '<filter id="s" x="-20%" y="-20%" width="140%" height="140%"><feDropShadow dx="0" dy="12" stdDeviation="18" flood-color="#0f172a" flood-opacity="0.22"/></filter>'
403
+ : '',
404
+ ].join('');
405
+ const image = `<image href="data:image/png;base64,${capture.png.toString('base64')}" x="${n(place.x)}" y="${n(place.y)}" width="${n(place.width)}" height="${n(place.height)}" preserveAspectRatio="none" clip-path="url(#r)"/>`;
406
+ const shadow = framed && opts.shadow
407
+ ? `<rect x="${n(place.x)}" y="${n(place.y)}" width="${n(place.width)}" height="${n(place.height)}" rx="${radius}" fill="#fff" filter="url(#s)"/>`
408
+ : '';
409
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${canvas.width}" height="${canvas.height}" viewBox="0 0 ${canvas.width} ${canvas.height}">` +
410
+ `<defs>${defs}</defs><rect width="${canvas.width}" height="${canvas.height}" fill="${opts.backgroundTo ? 'url(#bg)' : opts.background}"/>` +
411
+ `${shadow}${image}</svg>`;
412
+ const raster = await renderSvg(svg, canvas.width);
413
+ return Buffer.from(raster.png);
414
+ }
415
+ const sha256 = (b) => createHash('sha256').update(b).digest('hex');
416
+ async function verifyLocale(probe, ext, locale) {
417
+ const got = await probe.evaluate(() => ({
418
+ ui: chrome.i18n.getUILanguage(),
419
+ locale: chrome.i18n.getMessage('@@ui_locale'),
420
+ }));
421
+ const uiLocale = got.locale || got.ui.replace('-', '_');
422
+ if (!ext.locales.length) {
423
+ // No catalogs: only the browser language can be checked.
424
+ if (uiLocale.split('_')[0].toLowerCase() !== locale.split('_')[0].toLowerCase())
425
+ throw new InvalidInputError(`Chromium did not switch to ${locale} (its UI language is ${got.ui}); refusing to label the screenshots ${locale}.`);
426
+ return { uiLocale, catalog: null, sample: null };
427
+ }
428
+ const catalog = resolveCatalogLocale(uiLocale, ext.locales, ext.defaultLocale);
429
+ if (catalog !== locale)
430
+ throw new InvalidInputError(`Asked for ${locale}, but Chromium runs in ${got.ui} and the extension renders _locales/${catalog ?? '(none)'}. ` +
431
+ 'Chromium may not ship this UI language; the screenshots would be in the wrong language.');
432
+ const sample = pickSampleMessage(ext.messages[locale], ext.defaultLocale && ext.defaultLocale !== locale ? ext.messages[ext.defaultLocale] : null);
433
+ if (sample) {
434
+ const actual = await probe.evaluate((key) => chrome.i18n.getMessage(key), sample.key);
435
+ if (actual !== sample.message)
436
+ throw new InvalidInputError(`Locale ${locale}: chrome.i18n.getMessage("${sample.key}") returned "${actual}", expected "${sample.message}".`);
437
+ }
438
+ return { uiLocale, catalog, sample: sample?.key ?? null };
439
+ }
440
+ export async function runScreenshots(input, opts) {
441
+ const scenesPath = path.resolve(process.cwd(), opts.scenes);
442
+ const raw = await readFile(scenesPath, 'utf8').catch(() => {
443
+ throw new InvalidInputError(`Scenes file not found: ${opts.scenes}`);
444
+ });
445
+ const file = parseScenes(raw);
446
+ const stores = parseStores(opts.store);
447
+ const pw = loadPlaywright();
448
+ const work = await mkdtemp(path.join(os.tmpdir(), 'extenshi-shots-'));
449
+ const outDir = path.resolve(process.cwd(), opts.out ?? 'store-screenshots');
450
+ const warnings = [];
451
+ const files = [];
452
+ const verified = [];
453
+ let fixtures = null;
454
+ try {
455
+ const ext = await stageExtension(input, work);
456
+ warnings.push(...ext.warnings);
457
+ const locales = parseLocales(opts.locales, ext.locales, ext.defaultLocale);
458
+ const fixtureRoot = realpathSync(path.resolve(path.dirname(scenesPath), file.fixtures ?? '.'));
459
+ fixtures = await startFixtureServer(fixtureRoot);
460
+ const sizes = new Map(stores.map((s) => [s, opts.small ? STORE_SCREENSHOT_SPECS[s].small : STORE_SCREENSHOT_SPECS[s].large]));
461
+ for (const store of stores) {
462
+ const max = STORE_SCREENSHOT_SPECS[store].max;
463
+ const count = file.scenes.filter((s) => !s.stores || s.stores.includes(store)).length;
464
+ if (max && count > max)
465
+ warnings.push(`${store} accepts at most ${max} screenshots; ${count} scenes target it`);
466
+ }
467
+ for (const locale of locales) {
468
+ const lang = chromeLang(locale);
469
+ const ctx = await launch(pw, { ext, lang, work, file, headed: Boolean(opts.headed) });
470
+ try {
471
+ if (ext.manifest.background?.service_worker && !ctx.serviceWorkers().length)
472
+ await ctx.waitForEvent('serviceworker', { timeout: 10_000 }).catch(() => { });
473
+ const probe = await ctx.newPage();
474
+ try {
475
+ await probe.goto(`chrome-extension://${ext.id}/${PROBE_PAGE}`, { timeout: 15_000 });
476
+ }
477
+ catch {
478
+ throw new InvalidInputError('Chromium did not load the extension (manifest error?). Load the folder in chrome://extensions to see why.');
479
+ }
480
+ verified.push({ locale, ...(await verifyLocale(probe, ext, locale)) });
481
+ // Tabs the extension opened on install (welcome pages) and the startup page.
482
+ await probe.waitForTimeout(300);
483
+ for (const page of ctx.pages())
484
+ if (page !== probe)
485
+ await page.close().catch(() => { });
486
+ for (const step of file.setup)
487
+ await runStep(step, probe, probe);
488
+ for (const [index, scene] of file.scenes.entries()) {
489
+ const capture = await captureScene(ctx, probe, scene, file, sceneUrl(scene, ext, { origin: fixtures.origin, root: fixtureRoot }, locale));
490
+ const frame = { ...file.frame, ...scene.frame };
491
+ const rendered = new Map();
492
+ for (const store of stores) {
493
+ if (scene.stores && !scene.stores.includes(store))
494
+ continue;
495
+ const size = sizes.get(store);
496
+ const key = `${size.width}x${size.height}`;
497
+ let png = rendered.get(key);
498
+ if (!png) {
499
+ png = await composeOnCanvas(capture, size, {
500
+ fit: scene.fit,
501
+ dsf: file.deviceScaleFactor,
502
+ background: frame.background ?? '#f1f5f9',
503
+ backgroundTo: frame.backgroundTo,
504
+ margin: frame.margin ?? 48,
505
+ shadow: frame.shadow ?? true,
506
+ radius: frame.radius ?? 12,
507
+ });
508
+ const dims = pngDimensions(png);
509
+ if (dims.width !== size.width || dims.height !== size.height)
510
+ throw new Error(`Composed ${scene.name} at ${dims.width}×${dims.height}, expected ${key}`);
511
+ rendered.set(key, png);
512
+ }
513
+ const dir = path.join(outDir, store, locale);
514
+ await mkdir(dir, { recursive: true });
515
+ const target = path.join(dir, screenshotFileName(index, scene.name, size));
516
+ await writeFile(target, png);
517
+ files.push({ store, locale, scene: scene.name, path: target, ...size, sha256: sha256(png) });
518
+ }
519
+ }
520
+ }
521
+ finally {
522
+ await ctx.close().catch(() => { });
523
+ }
524
+ process.stderr.write(` ${locale}: ${file.scenes.length} scene(s) captured\n`);
525
+ }
526
+ const browserVersion = pw.chromium.executablePath().match(/chromium[-_](\d+)/i)?.[1];
527
+ await writeFile(path.join(outDir, 'screenshots.json'), `${JSON.stringify({
528
+ schemaVersion: 1,
529
+ generator: 'extenshi screenshots',
530
+ extension: { name: ext.manifest.name, version: ext.manifest.version },
531
+ browser: { name: 'Chromium', revision: browserVersion ?? null },
532
+ stores,
533
+ locales: verified,
534
+ files: files.map((f) => ({ ...f, path: path.relative(outDir, f.path) })),
535
+ warnings,
536
+ }, null, 2)}\n`);
537
+ }
538
+ finally {
539
+ await fixtures?.close();
540
+ await rm(work, { recursive: true, force: true }).catch(() => { });
541
+ }
542
+ return { outDir, files, locales: verified, warnings };
543
+ }
544
+ export async function runScreenshotsCommand(input, opts) {
545
+ const result = await runScreenshots(input, opts);
546
+ if (opts.json) {
547
+ console.log(JSON.stringify(result, null, 2));
548
+ return;
549
+ }
550
+ process.stderr.write(`Screenshots written to ${result.outDir}\n`);
551
+ for (const l of result.locales)
552
+ process.stderr.write(` ${l.locale.padEnd(6)} verified (Chromium UI ${l.uiLocale}${l.sample ? `, message "${l.sample}"` : ''})\n`);
553
+ process.stderr.write(` ${result.files.length} file(s); index: ${path.join(result.outDir, 'screenshots.json')}\n`);
554
+ for (const w of result.warnings)
555
+ process.stderr.write(` warning: ${w}\n`);
556
+ }
557
+ //# sourceMappingURL=screenshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"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"}