@lovo/matter-cli 0.4.1 → 0.6.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/CHANGELOG.md +16 -0
- package/README.md +68 -4
- package/dist/add-T7IRU2NK.js +11 -0
- package/dist/{chunk-4XUN2PKU.js → chunk-53DI7V2J.js} +22 -21
- package/dist/chunk-53DI7V2J.js.map +1 -0
- package/dist/chunk-D4HDZEJT.js +37 -0
- package/dist/chunk-D4HDZEJT.js.map +1 -0
- package/dist/{chunk-OJWKSIZ5.js → chunk-FHRQIHCN.js} +32 -25
- package/dist/chunk-FHRQIHCN.js.map +1 -0
- package/dist/chunk-Q7CQW6AH.js +27 -0
- package/dist/chunk-Q7CQW6AH.js.map +1 -0
- package/dist/{chunk-M6S6HYHE.js → chunk-R7OX6KUP.js} +48 -44
- package/dist/chunk-R7OX6KUP.js.map +1 -0
- package/dist/chunk-RRL35RGP.js +104 -0
- package/dist/chunk-RRL35RGP.js.map +1 -0
- package/dist/chunk-TBB7CTPP.js +77 -0
- package/dist/chunk-TBB7CTPP.js.map +1 -0
- package/dist/chunk-YADIAD35.js +16322 -0
- package/dist/chunk-YADIAD35.js.map +1 -0
- package/dist/chunk-YAWX2IU3.js +46 -0
- package/dist/chunk-YAWX2IU3.js.map +1 -0
- package/dist/chunk-YSFTOGZX.js +119 -0
- package/dist/chunk-YSFTOGZX.js.map +1 -0
- package/dist/commands/poster.d.ts +19 -0
- package/dist/commands/poster.js +15 -0
- package/dist/commands/poster.js.map +1 -0
- package/dist/dist-I76TGDBX.js +547 -0
- package/dist/dist-I76TGDBX.js.map +1 -0
- package/dist/harness/frameReady.ts +35 -0
- package/dist/harness/index.html +20 -0
- package/dist/harness/index.tsx +41 -0
- package/dist/index.js +50 -21
- package/dist/index.js.map +1 -1
- package/dist/{init-W43YVGBI.js → init-NB5EOU5H.js} +3 -2
- package/dist/init-NB5EOU5H.js.map +1 -0
- package/dist/{list-S626E7NZ.js → list-L725RQM3.js} +6 -5
- package/dist/list-L725RQM3.js.map +1 -0
- package/dist/magic-string.es-DKS3S7WW.js +1310 -0
- package/dist/magic-string.es-DKS3S7WW.js.map +1 -0
- package/dist/poster/bundle.d.ts +12 -0
- package/dist/poster/bundle.js +9 -0
- package/dist/poster/bundle.js.map +1 -0
- package/dist/poster/bundle.test.d.ts +2 -0
- package/dist/poster/bundle.test.js +49 -0
- package/dist/poster/bundle.test.js.map +1 -0
- package/dist/poster/e2e.test.d.ts +2 -0
- package/dist/poster/e2e.test.js +103 -0
- package/dist/poster/e2e.test.js.map +1 -0
- package/dist/poster/playwright.d.ts +19 -0
- package/dist/poster/playwright.js +11 -0
- package/dist/poster/playwright.js.map +1 -0
- package/dist/poster/playwright.test.d.ts +2 -0
- package/dist/poster/playwright.test.js +28 -0
- package/dist/poster/playwright.test.js.map +1 -0
- package/dist/poster/projectRoot.d.ts +3 -0
- package/dist/poster/projectRoot.js +9 -0
- package/dist/poster/projectRoot.js.map +1 -0
- package/dist/poster/projectRoot.test.d.ts +2 -0
- package/dist/poster/projectRoot.test.js +47 -0
- package/dist/poster/projectRoot.test.js.map +1 -0
- package/dist/poster/server.d.ts +18 -0
- package/dist/poster/server.js +9 -0
- package/dist/poster/server.js.map +1 -0
- package/dist/poster/server.test.d.ts +2 -0
- package/dist/poster/server.test.js +54 -0
- package/dist/poster/server.test.js.map +1 -0
- package/dist/{update-3BHHOUCS.js → update-WK7CA42P.js} +26 -17
- package/dist/update-WK7CA42P.js.map +1 -0
- package/package.json +19 -3
- package/dist/add-ABC455QH.js +0 -10
- package/dist/chunk-4XUN2PKU.js.map +0 -1
- package/dist/chunk-M6S6HYHE.js.map +0 -1
- package/dist/chunk-OJWKSIZ5.js.map +0 -1
- package/dist/init-W43YVGBI.js.map +0 -1
- package/dist/list-S626E7NZ.js.map +0 -1
- package/dist/update-3BHHOUCS.js.map +0 -1
- /package/dist/{add-ABC455QH.js.map → add-T7IRU2NK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/poster/playwright.ts"],"sourcesContent":["import { access } from 'node:fs/promises';\nimport { writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type * as Playwright from 'playwright';\n\n/**\n * Walk up the directory tree from `startDir` looking for a `playwright`\n * package directory. Avoids NODE_PATH leakage from the host process.\n */\nasync function findPlaywrightDir(startDir: string): Promise<string | null> {\n let dir = startDir;\n\n for (;;) {\n const candidate = join(dir, 'node_modules', 'playwright');\n\n try {\n await access(join(candidate, 'package.json'));\n\n return candidate;\n } catch {\n // not here; keep walking up\n }\n const parent = dirname(dir);\n\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isPlaywrightNamespace(value: unknown): value is typeof Playwright {\n if (!isRecord(value)) return false;\n\n const chromium = value.chromium;\n\n if (!isRecord(chromium)) return false;\n\n return typeof chromium.launch === 'function';\n}\n\nfunction getDefaultExport(value: unknown): unknown {\n if (!isRecord(value)) return undefined;\n\n return value.default;\n}\n\nexport async function resolvePlaywright(projectRoot: string): Promise<typeof Playwright> {\n const playwrightDir = await findPlaywrightDir(projectRoot);\n\n if (playwrightDir === null) {\n throw new Error(\n `Install playwright to use this command: pnpm add -D playwright && pnpm exec playwright install chromium`,\n );\n }\n // Prefer ESM entry; fall back to CJS with .default unwrap.\n for (const entryFilename of ['index.mjs', 'index.js']) {\n const filePath = join(playwrightDir, entryFilename);\n\n try {\n await access(filePath);\n\n const rawModule: unknown = await import(pathToFileURL(filePath).href);\n const playwrightNamespace = isPlaywrightNamespace(rawModule)\n ? rawModule\n : getDefaultExport(rawModule);\n\n if (!isPlaywrightNamespace(playwrightNamespace)) {\n throw new Error(`Resolved ${filePath} but it does not expose chromium.launch`);\n }\n\n return playwrightNamespace;\n } catch (caughtError) {\n if (entryFilename === 'index.js') throw caughtError;\n // else: try the next entry\n }\n }\n throw new Error(`Unable to import playwright from ${playwrightDir}`);\n}\n\nexport interface ScreenshotOpts {\n url: string;\n width: number;\n height: number;\n timeSeconds: number;\n readyTimeoutMs: number;\n outPath: string;\n projectRoot: string;\n format: 'jpeg' | 'png';\n quality: number | undefined;\n}\n\nexport async function launchAndScreenshot(opts: ScreenshotOpts): Promise<{ bytes: number }> {\n const playwright = await resolvePlaywright(opts.projectRoot);\n const browser = await playwright.chromium.launch({ headless: true });\n\n try {\n const browserContext = await browser.newContext({\n viewport: { width: opts.width, height: opts.height },\n deviceScaleFactor: 1,\n });\n const page = await browserContext.newPage();\n const consoleErrors: string[] = [];\n\n page.on('pageerror', (pageError) => consoleErrors.push(`pageerror: ${pageError.message}`));\n page.on('console', (msg) => {\n if (msg.type() === 'error') consoleErrors.push(`console: ${msg.text()}`);\n });\n await page.goto(opts.url, { waitUntil: 'load' });\n try {\n await page.waitForFunction(() => Reflect.get(globalThis, '__matterReady') === true, {\n timeout: opts.readyTimeoutMs,\n });\n } catch {\n if (consoleErrors.length > 0) {\n throw new Error(\n `Poster render failed before producing a frame:\\n ${consoleErrors.join('\\n ')}`,\n );\n }\n throw new Error(\n `no canvas content detected within ${\n opts.readyTimeoutMs / 1000\n }s; does your component render a ShaderScene with a visible base layer?`,\n );\n }\n if (opts.timeSeconds > 0) {\n await page.waitForTimeout(opts.timeSeconds * 1000);\n }\n const canvas = page.locator('canvas').first();\n const imageBuffer =\n opts.format === 'jpeg'\n ? await canvas.screenshot({ type: 'jpeg', quality: opts.quality })\n : await canvas.screenshot({ type: 'png' });\n\n await writeFile(opts.outPath, imageBuffer);\n\n return { bytes: imageBuffer.length };\n } finally {\n await browser.close();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/poster/bundle.ts
|
|
4
|
+
import { build } from "esbuild";
|
|
5
|
+
import { access, readFile } from "fs/promises";
|
|
6
|
+
import { dirname, join } from "path";
|
|
7
|
+
import { fileURLToPath } from "url";
|
|
8
|
+
var harnessDirPromise;
|
|
9
|
+
async function locateHarnessDir() {
|
|
10
|
+
if (harnessDirPromise) return harnessDirPromise;
|
|
11
|
+
harnessDirPromise = (async () => {
|
|
12
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
for (; ; ) {
|
|
14
|
+
try {
|
|
15
|
+
const packageJsonRaw = await readFile(join(dir, "package.json"), "utf-8");
|
|
16
|
+
const parsed = JSON.parse(packageJsonRaw);
|
|
17
|
+
const packageJson = typeof parsed === "object" && parsed !== null ? parsed : {};
|
|
18
|
+
if (packageJson.name === "@lovo/matter-cli") {
|
|
19
|
+
for (const candidate of ["dist/harness", "src/harness"]) {
|
|
20
|
+
const harnessPath = join(dir, candidate);
|
|
21
|
+
try {
|
|
22
|
+
await access(join(harnessPath, "index.html"));
|
|
23
|
+
return harnessPath;
|
|
24
|
+
} catch {
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new Error(
|
|
28
|
+
`Found @lovo/matter-cli at ${dir} but neither dist/harness nor src/harness contains index.html`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
} catch (caughtError) {
|
|
32
|
+
if (caughtError instanceof Error && caughtError.message.startsWith("Found @lovo/matter-cli")) {
|
|
33
|
+
throw caughtError;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const parent = dirname(dir);
|
|
37
|
+
if (parent === dir) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
"Could not locate @lovo/matter-cli package root from " + fileURLToPath(import.meta.url)
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
dir = parent;
|
|
43
|
+
}
|
|
44
|
+
})();
|
|
45
|
+
return harnessDirPromise;
|
|
46
|
+
}
|
|
47
|
+
async function bundlePoster(opts) {
|
|
48
|
+
const harnessDir = await locateHarnessDir();
|
|
49
|
+
const harnessEntry = join(harnessDir, "index.tsx");
|
|
50
|
+
const result = await build({
|
|
51
|
+
entryPoints: [harnessEntry],
|
|
52
|
+
bundle: true,
|
|
53
|
+
format: "esm",
|
|
54
|
+
platform: "browser",
|
|
55
|
+
target: "es2022",
|
|
56
|
+
jsx: "automatic",
|
|
57
|
+
loader: { ".tsx": "tsx", ".ts": "ts" },
|
|
58
|
+
absWorkingDir: opts.projectRoot,
|
|
59
|
+
nodePaths: [join(opts.projectRoot, "node_modules")],
|
|
60
|
+
define: {
|
|
61
|
+
__MATTER_USER_MODULE_PATH: JSON.stringify(opts.from),
|
|
62
|
+
__MATTER_EXPORT_NAME: JSON.stringify(opts.exportName)
|
|
63
|
+
},
|
|
64
|
+
write: false,
|
|
65
|
+
sourcemap: "inline",
|
|
66
|
+
logLevel: "silent"
|
|
67
|
+
});
|
|
68
|
+
const indexOutput = result.outputFiles.find((outputFile) => outputFile.path.endsWith("index.js")) ?? result.outputFiles[0];
|
|
69
|
+
if (!indexOutput) throw new Error("bundlePoster: esbuild produced no output");
|
|
70
|
+
const html = await readFile(join(harnessDir, "index.html"), "utf-8");
|
|
71
|
+
return { js: indexOutput.text, html };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export {
|
|
75
|
+
bundlePoster
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=chunk-TBB7CTPP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/poster/bundle.ts"],"sourcesContent":["import { build } from 'esbuild';\nimport { access, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface BundlePosterOpts {\n from: string;\n exportName: string;\n projectRoot: string;\n}\n\nexport interface BundlePosterResult {\n js: string;\n html: string;\n}\n\n// HARNESS_DIR resolution is intentionally async and memoized.\n//\n// The old synchronous approach used a regex replace on `import.meta.url` to derive the harness\n// path. That worked when the file was at `src/poster/bundle.ts` (dev) or `dist/poster/bundle.js`\n// (a per-directory dist layout), but tsup's code-splitting emits the actual implementation into\n// `dist/chunk-XXXX.js` at the dist root — not under `dist/poster/` — so the `/poster$/` regex\n// never matched and HARNESS_DIR collapsed to `<pkg>/dist`, causing esbuild to look for\n// `dist/index.tsx` instead of `dist/harness/index.tsx`.\n//\n// The fix: walk up the directory tree from `import.meta.url` until we find a `package.json`\n// with `name === '@lovo/matter-cli'`, then try `dist/harness` then `src/harness` in order.\n// This is robust to any output chunk location tsup chooses.\n\nlet harnessDirPromise: Promise<string> | undefined;\n\nasync function locateHarnessDir(): Promise<string> {\n if (harnessDirPromise) return harnessDirPromise;\n harnessDirPromise = (async () => {\n let dir = dirname(fileURLToPath(import.meta.url));\n\n for (;;) {\n try {\n const packageJsonRaw = await readFile(join(dir, 'package.json'), 'utf-8');\n const parsed: unknown = JSON.parse(packageJsonRaw);\n const packageJson = (typeof parsed === 'object' && parsed !== null ? parsed : {}) as {\n name?: string;\n };\n\n if (packageJson.name === '@lovo/matter-cli') {\n for (const candidate of ['dist/harness', 'src/harness']) {\n const harnessPath = join(dir, candidate);\n\n try {\n await access(join(harnessPath, 'index.html'));\n\n return harnessPath;\n } catch {\n // try next candidate\n }\n }\n throw new Error(\n `Found @lovo/matter-cli at ${dir} but neither dist/harness nor src/harness contains index.html`,\n );\n }\n } catch (caughtError) {\n // Re-throw if we found the package but harness is missing\n if (\n caughtError instanceof Error &&\n caughtError.message.startsWith('Found @lovo/matter-cli')\n ) {\n throw caughtError;\n }\n // Otherwise, package.json missing or wrong name; walk up\n }\n const parent = dirname(dir);\n\n if (parent === dir) {\n throw new Error(\n 'Could not locate @lovo/matter-cli package root from ' + fileURLToPath(import.meta.url),\n );\n }\n dir = parent;\n }\n })();\n\n return harnessDirPromise;\n}\n\nexport async function bundlePoster(opts: BundlePosterOpts): Promise<BundlePosterResult> {\n const harnessDir = await locateHarnessDir();\n const harnessEntry = join(harnessDir, 'index.tsx');\n const result = await build({\n entryPoints: [harnessEntry],\n bundle: true,\n format: 'esm',\n platform: 'browser',\n target: 'es2022',\n jsx: 'automatic',\n loader: { '.tsx': 'tsx', '.ts': 'ts' },\n absWorkingDir: opts.projectRoot,\n nodePaths: [join(opts.projectRoot, 'node_modules')],\n define: {\n __MATTER_USER_MODULE_PATH: JSON.stringify(opts.from),\n __MATTER_EXPORT_NAME: JSON.stringify(opts.exportName),\n },\n write: false,\n sourcemap: 'inline',\n logLevel: 'silent',\n });\n\n const indexOutput =\n result.outputFiles.find((outputFile) => outputFile.path.endsWith('index.js')) ??\n result.outputFiles[0];\n\n if (!indexOutput) throw new Error('bundlePoster: esbuild produced no output');\n const html = await readFile(join(harnessDir, 'index.html'), 'utf-8');\n\n return { js: indexOutput.text, html };\n}\n"],"mappings":";;;AAAA,SAAS,aAAa;AACtB,SAAS,QAAQ,gBAAgB;AACjC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AA0B9B,IAAI;AAEJ,eAAe,mBAAoC;AACjD,MAAI,kBAAmB,QAAO;AAC9B,uBAAqB,YAAY;AAC/B,QAAI,MAAM,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEhD,eAAS;AACP,UAAI;AACF,cAAM,iBAAiB,MAAM,SAAS,KAAK,KAAK,cAAc,GAAG,OAAO;AACxE,cAAM,SAAkB,KAAK,MAAM,cAAc;AACjD,cAAM,cAAe,OAAO,WAAW,YAAY,WAAW,OAAO,SAAS,CAAC;AAI/E,YAAI,YAAY,SAAS,oBAAoB;AAC3C,qBAAW,aAAa,CAAC,gBAAgB,aAAa,GAAG;AACvD,kBAAM,cAAc,KAAK,KAAK,SAAS;AAEvC,gBAAI;AACF,oBAAM,OAAO,KAAK,aAAa,YAAY,CAAC;AAE5C,qBAAO;AAAA,YACT,QAAQ;AAAA,YAER;AAAA,UACF;AACA,gBAAM,IAAI;AAAA,YACR,6BAA6B,GAAG;AAAA,UAClC;AAAA,QACF;AAAA,MACF,SAAS,aAAa;AAEpB,YACE,uBAAuB,SACvB,YAAY,QAAQ,WAAW,wBAAwB,GACvD;AACA,gBAAM;AAAA,QACR;AAAA,MAEF;AACA,YAAM,SAAS,QAAQ,GAAG;AAE1B,UAAI,WAAW,KAAK;AAClB,cAAM,IAAI;AAAA,UACR,yDAAyD,cAAc,YAAY,GAAG;AAAA,QACxF;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF,GAAG;AAEH,SAAO;AACT;AAEA,eAAsB,aAAa,MAAqD;AACtF,QAAM,aAAa,MAAM,iBAAiB;AAC1C,QAAM,eAAe,KAAK,YAAY,WAAW;AACjD,QAAM,SAAS,MAAM,MAAM;AAAA,IACzB,aAAa,CAAC,YAAY;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ,EAAE,QAAQ,OAAO,OAAO,KAAK;AAAA,IACrC,eAAe,KAAK;AAAA,IACpB,WAAW,CAAC,KAAK,KAAK,aAAa,cAAc,CAAC;AAAA,IAClD,QAAQ;AAAA,MACN,2BAA2B,KAAK,UAAU,KAAK,IAAI;AAAA,MACnD,sBAAsB,KAAK,UAAU,KAAK,UAAU;AAAA,IACtD;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,cACJ,OAAO,YAAY,KAAK,CAAC,eAAe,WAAW,KAAK,SAAS,UAAU,CAAC,KAC5E,OAAO,YAAY,CAAC;AAEtB,MAAI,CAAC,YAAa,OAAM,IAAI,MAAM,0CAA0C;AAC5E,QAAM,OAAO,MAAM,SAAS,KAAK,YAAY,YAAY,GAAG,OAAO;AAEnE,SAAO,EAAE,IAAI,YAAY,MAAM,KAAK;AACtC;","names":[]}
|