diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index a73a68f..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: CI -on: - - push - - pull_request - -jobs: - test: - name: Test ${{ matrix.example }} on ${{ matrix.os }} - - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - example: - - examples/hono-app - - examples/vike-app - - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - - run: pnpm install - - - name: Build vike-solid - run: pnpm run build - - - name: Test building example - run: pnpm run build - working-directory: ./${{ matrix.example }} - - - name: Test TypeScript example - run: pnpm run test - working-directory: ./${{ matrix.example }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..04c494a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,44 @@ +name: CI +on: [ push, pull_request ] + +jobs: + test: + # Prevent workflow being run twice, https://github.com/orgs/community/discussions/57827#discussioncomment-6579237 + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + + name: ${{ matrix.cmd }} (${{ matrix.os }}) + + runs-on: ${{ matrix.os }} + + strategy: + # Don't cancel other matrix operations if one fails + fail-fast: false + matrix: + os: + - ubuntu-latest + - windows-latest + cmd: + - pnpm run test:e2e + - pnpm run test:units + - pnpm run test:types + # `exclude` docs & alternatives: + # - https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrixexclude + # - https://stackoverflow.com/questions/68994484/how-to-skip-a-configuration-of-a-matrix-with-github-actions/68994907#68994907 + # - https://stackoverflow.com/questions/66025220/paired-values-in-github-actions-matrix/68940067#68940067 + exclude: + - os: windows-latest + cmd: pnpm run test:types + + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: "pnpm" + + - run: pnpm install + - run: pnpm exec playwright install chromium + - run: pnpm run build + + - run: ${{ matrix.cmd }} diff --git a/.gitignore b/.gitignore index 8fe6b26..44624cf 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,6 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + +# Cloudflare +.wrangler/ diff --git a/.npmrc b/.npmrc index e941d13..6852d8a 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ package-manager-strict=false +link-workspace-packages=deep diff --git a/examples/hono-app/.test-dev.test.ts b/examples/hono-app/.test-dev.test.ts new file mode 100644 index 0000000..fbafdbb --- /dev/null +++ b/examples/hono-app/.test-dev.test.ts @@ -0,0 +1,2 @@ +import { testRun } from './.testRun' +testRun('pnpm run dev') diff --git a/examples/hono-app/.test-preview.test.ts b/examples/hono-app/.test-preview.test.ts new file mode 100644 index 0000000..66e60b6 --- /dev/null +++ b/examples/hono-app/.test-preview.test.ts @@ -0,0 +1,8 @@ +import { testRun } from "./.testRun"; + +testRun("pnpm run preview --port 3000", { + doNotFailOnWarning: true, + serverIsReadyMessage: "Starting local server", + serverIsReadyDelay: 2000, + serverUrl: "http://127.0.0.1:3000", +}); diff --git a/examples/hono-app/.testRun.ts b/examples/hono-app/.testRun.ts new file mode 100644 index 0000000..55e3118 --- /dev/null +++ b/examples/hono-app/.testRun.ts @@ -0,0 +1,63 @@ +import { expect, fetchHtml, getServerUrl, page, run, test } from "@brillout/test-e2e"; + +export { testRun }; + +let isProd: boolean; + +function testRun(cmd: `pnpm run ${"dev" | "preview"}${string}`, options?: Parameters[1]) { + run(cmd, options); + + isProd = cmd !== "pnpm run dev"; + + testUrl({ + url: "/", + title: "My Vike App", + text: "built with https://github.com/vikejs/vike-solid", + textHydration: "Rendered to HTML", + }); + + testUrl({ + url: "/star-wars", + title: "6 Star Wars Movies", + text: "A New Hope", + }); + + testUrl({ + url: "/star-wars/3", + title: "Return of the Jedi", + text: "1983-05-25", + }); +} + +function testUrl({ + url, + title, + text, + textHydration, + noSSR, +}: { + url: string; + title: string; + text: string; + textHydration?: string; + counter?: true; + noSSR?: true; +}) { + test(url + " (HTML)", async () => { + const html = await fetchHtml(url); + if (!noSSR) { + expect(html).toContain(text); + } + expect(getTitle(html)).toBe(title); + }); + test(url + " (Hydration)", async () => { + await page.goto(getServerUrl() + url); + const body = await page.textContent("body"); + expect(body).toContain(textHydration ?? text); + }); +} + +function getTitle(html: string) { + const title = html.match(/(.*?)<\/title>/i)?.[1]; + return title; +} diff --git a/examples/hono-app/package.json b/examples/hono-app/package.json index c49ed6a..86e9cd1 100644 --- a/examples/hono-app/package.json +++ b/examples/hono-app/package.json @@ -7,8 +7,8 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "wrangler pages dev", - "deploy": "wrangler pages deploy", + "preview": "vite build && wrangler pages dev", + "deploy": "vite build && wrangler pages deploy", "test": "tsc --noEmit" }, "keywords": [], @@ -19,7 +19,7 @@ "@hono/vite-dev-server": "^0.12.2", "@types/node": "^18.19.14", "typescript": "^5.5.2", - "vike-cloudflare": "workspace:*", + "vike-cloudflare": "^0.0.2", "wrangler": "^3.61.0" }, "dependencies": { diff --git a/examples/hono-app/pages/+config.ts b/examples/hono-app/pages/+config.ts index 7a16499..fdb9049 100644 --- a/examples/hono-app/pages/+config.ts +++ b/examples/hono-app/pages/+config.ts @@ -9,6 +9,5 @@ export default { Head, // <title> title: "My Vike App", - stream: "web", extends: vikeSolid, } satisfies Config; diff --git a/examples/hono-app/pages/star-wars/+config.ts b/examples/hono-app/pages/star-wars/+config.ts new file mode 100644 index 0000000..0e1c71e --- /dev/null +++ b/examples/hono-app/pages/star-wars/+config.ts @@ -0,0 +1,6 @@ +import type { Config } from "vike/types"; + +// Default config (can be overridden by pages) +export default { + stream: "web", +} satisfies Config; diff --git a/examples/vike-app/.test-dev.test.ts b/examples/vike-app/.test-dev.test.ts new file mode 100644 index 0000000..fbafdbb --- /dev/null +++ b/examples/vike-app/.test-dev.test.ts @@ -0,0 +1,2 @@ +import { testRun } from './.testRun' +testRun('pnpm run dev') diff --git a/examples/vike-app/.test-preview.test.ts b/examples/vike-app/.test-preview.test.ts new file mode 100644 index 0000000..66e60b6 --- /dev/null +++ b/examples/vike-app/.test-preview.test.ts @@ -0,0 +1,8 @@ +import { testRun } from "./.testRun"; + +testRun("pnpm run preview --port 3000", { + doNotFailOnWarning: true, + serverIsReadyMessage: "Starting local server", + serverIsReadyDelay: 2000, + serverUrl: "http://127.0.0.1:3000", +}); diff --git a/examples/vike-app/.testRun.ts b/examples/vike-app/.testRun.ts new file mode 100644 index 0000000..55e3118 --- /dev/null +++ b/examples/vike-app/.testRun.ts @@ -0,0 +1,63 @@ +import { expect, fetchHtml, getServerUrl, page, run, test } from "@brillout/test-e2e"; + +export { testRun }; + +let isProd: boolean; + +function testRun(cmd: `pnpm run ${"dev" | "preview"}${string}`, options?: Parameters<typeof run>[1]) { + run(cmd, options); + + isProd = cmd !== "pnpm run dev"; + + testUrl({ + url: "/", + title: "My Vike App", + text: "built with https://github.com/vikejs/vike-solid", + textHydration: "Rendered to HTML", + }); + + testUrl({ + url: "/star-wars", + title: "6 Star Wars Movies", + text: "A New Hope", + }); + + testUrl({ + url: "/star-wars/3", + title: "Return of the Jedi", + text: "1983-05-25", + }); +} + +function testUrl({ + url, + title, + text, + textHydration, + noSSR, +}: { + url: string; + title: string; + text: string; + textHydration?: string; + counter?: true; + noSSR?: true; +}) { + test(url + " (HTML)", async () => { + const html = await fetchHtml(url); + if (!noSSR) { + expect(html).toContain(text); + } + expect(getTitle(html)).toBe(title); + }); + test(url + " (Hydration)", async () => { + await page.goto(getServerUrl() + url); + const body = await page.textContent("body"); + expect(body).toContain(textHydration ?? text); + }); +} + +function getTitle(html: string) { + const title = html.match(/<title>(.*?)<\/title>/i)?.[1]; + return title; +} diff --git a/examples/vike-app/package.json b/examples/vike-app/package.json index 437d68b..ee8f3d8 100644 --- a/examples/vike-app/package.json +++ b/examples/vike-app/package.json @@ -7,8 +7,8 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "wrangler pages dev", - "deploy": "wrangler pages deploy", + "preview": "vite build && wrangler pages dev", + "deploy": "vite build && wrangler pages deploy", "test": "tsc --noEmit" }, "keywords": [], @@ -17,7 +17,7 @@ "@auth/core": "^0.34.1", "@types/node": "^18.19.14", "typescript": "^5.5.2", - "vike-cloudflare": "workspace:*", + "vike-cloudflare": "^0.0.2", "wrangler": "^3.61.0" }, "dependencies": { diff --git a/package.json b/package.json index 7c053f0..3698506 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,11 @@ "scripts": { "build": "cd packages/vike-cloudflare && pnpm run build", "release": "cd packages/vike-cloudflare && pnpm run release", + "========= Test": "", + "test": "pnpm run test:units && pnpm run test:e2e && pnpm run test:types", + "test:e2e": "test-e2e", + "test:units": "pnpm --recursive --sequential --filter {packages/*} run test", + "test:types": "test-types", "========= Formatting": "", "format": "git ls-files | egrep '\\.(json|js|jsx|css|ts|tsx|vue|mjs|cjs)$' | grep --invert-match package.json | xargs pnpm exec prettier --write", "lint": "eslint .", @@ -13,13 +18,21 @@ }, "keywords": [], "author": "", + "pnpm": { + "overrides": { + "vike-cloudflare": "link:./packages/vike-cloudflare/" + } + }, "devDependencies": { "@ianvs/prettier-plugin-sort-imports": "^4.2.1", "@typescript-eslint/eslint-plugin": "^7.13.1", "@typescript-eslint/parser": "^7.13.1", "eslint": "^8.57.0", "eslint-plugin-solid": "^0.14.1", - "prettier": "^3.3.2" + "prettier": "^3.3.2", + "@brillout/test-e2e": "^0.5.33", + "@brillout/test-types": "^0.1.15", + "playwright": "^1.42.1" }, "packageManager": "pnpm@9.4.0" } diff --git a/packages/vike-cloudflare/README.md b/packages/vike-cloudflare/README.md index 04047f4..12478dd 100644 --- a/packages/vike-cloudflare/README.md +++ b/packages/vike-cloudflare/README.md @@ -8,3 +8,6 @@ - Docs at [`vike.dev/vike-cloudflare`](https://vike.dev/vike-cloudflare) - [Examples](https://github.com/vikejs/vike-cloudflare/tree/main/examples) - [CHANGELOG.md](https://github.com/vikejs/vike-cloudflare/tree/main/CHANGELOG.md) +- Demos: + - [Hono + Streaming](https://vike-clouflare-hono-demo.pages.dev/) ([code](https://github.com/vikejs/vike-cloudflare/tree/main/examples/hono-app)) + - [Plain Vike](https://vike-clouflare-vike-demo.pages.dev/) ([code](https://github.com/vikejs/vike-cloudflare/tree/main/examples/vike-app)) diff --git a/packages/vike-cloudflare/assets/vike.js b/packages/vike-cloudflare/assets/vike.js index 34f55e6..cc931a2 100644 --- a/packages/vike-cloudflare/assets/vike.js +++ b/packages/vike-cloudflare/assets/vike.js @@ -1,3 +1,4 @@ +/// <reference lib="webworker" /> import { renderPage } from "vike/server"; /** @@ -15,8 +16,15 @@ async function handleSsr(url) { return new Response("Something went wrong", { status: 500 }); } else { const { statusCode: status, headers } = httpResponse; - const stream = httpResponse.getReadableWebStream(); - return new Response(stream, { headers, status }); + + const { readable, writable } = new TransformStream(); + + httpResponse.pipe(writable); + + return new Response(readable, { + status, + headers, + }); } } diff --git a/packages/vike-cloudflare/src/index.ts b/packages/vike-cloudflare/src/index.ts index 6dc3857..780f124 100644 --- a/packages/vike-cloudflare/src/index.ts +++ b/packages/vike-cloudflare/src/index.ts @@ -1,5 +1,5 @@ -import { mkdir, rm, symlink, writeFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; +import { cp, mkdir, rm, symlink, writeFile } from "node:fs/promises"; +import { dirname, join, resolve } from "node:path"; import { normalizePath, Plugin, ResolvedConfig } from "vite"; import honoAsset from "../assets/hono.js?raw"; import vikeAsset from "../assets/vike.js?raw"; @@ -8,6 +8,8 @@ const NAME = "vike-cloudflare"; const WORKER_JS_NAME = "_worker.js"; const WORKER_NAME = "cloudflare-worker"; const ROUTES_JSON_NAME = "_routes.json"; +const isWin = process.platform === "win32"; +const isCI = Boolean(process.env.CI); export interface VikeCloudflarePagesOptions { server?: { @@ -77,10 +79,10 @@ export const pages = (options?: VikeCloudflarePagesOptions): Plugin => { await mkdir(outCloudflare, { recursive: true }); // 2. Symlink `dist/client/assets` to `dist/cloudflare/assets` - await symlink(join("..", "client", "assets"), join(outCloudflare, "assets")); + await symlinkOrCopy(join("..", "client", "assets"), join(outCloudflare, "assets")); // 3. Symlink `dist/server` to `dist/cloudflare/server` - await symlink(join("..", "server"), join(outCloudflare, "server")); + await symlinkOrCopy(join("..", "server"), join(outCloudflare, "server")); // 4. Create _routes.json await writeFile( @@ -114,6 +116,18 @@ export default handler; }; }; +async function symlinkOrCopy(target: string, path: string) { + if (isWin || isCI) { + await cp(resolve(path, "..", target), path, { + dereference: true, + force: true, + recursive: true, + }); + } else { + await symlink(target, path); + } +} + function getOutDir(config: ResolvedConfig, force?: "client" | "server" | "cloudflare"): string { const p = join(config.root, normalizePath(config.build.outDir)); if (!force) return p; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5787cd..b0f484f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,10 +4,19 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + vike-cloudflare: link:./packages/vike-cloudflare/ + importers: .: devDependencies: + '@brillout/test-e2e': + specifier: ^0.5.33 + version: 0.5.33 + '@brillout/test-types': + specifier: ^0.1.15 + version: 0.1.15(typescript@5.5.2) '@ianvs/prettier-plugin-sort-imports': specifier: ^4.2.1 version: 4.2.1(prettier@3.3.2) @@ -23,6 +32,9 @@ importers: eslint-plugin-solid: specifier: ^0.14.1 version: 0.14.1(eslint@8.57.0)(typescript@5.5.2) + playwright: + specifier: ^1.42.1 + version: 1.45.0 prettier: specifier: ^3.3.2 version: 3.3.2 @@ -67,7 +79,7 @@ importers: specifier: ^5.5.2 version: 5.5.2 vike-cloudflare: - specifier: workspace:* + specifier: link:../../packages/vike-cloudflare version: link:../../packages/vike-cloudflare wrangler: specifier: ^3.61.0 @@ -104,7 +116,7 @@ importers: specifier: ^5.5.2 version: 5.5.2 vike-cloudflare: - specifier: workspace:* + specifier: link:../../packages/vike-cloudflare version: link:../../packages/vike-cloudflare wrangler: specifier: ^3.61.0 @@ -261,6 +273,9 @@ packages: '@brillout/json-serializer@0.5.10': resolution: {integrity: sha512-3bh/MS5pudu3H9l3a0KAE1RBfy/L95JWAEo8b2mPBN3H98wzCHYzgjQb9xRl58y+Kc7FgkjApgCFJV+zR06P5Q==} + '@brillout/part-regex@0.1.3': + resolution: {integrity: sha512-ZyqtOYHvQs3Ca0xt9fb2OlGzCrKwXtMcAATDObkFmI4jKuObEORjWrqAslWTelquXlyEYLz7h1nt6jp50LDyJA==} + '@brillout/picocolors@1.0.13': resolution: {integrity: sha512-LblvMKItHbvkaIMI+Awsk1EEjmReE8E8Mgjtj3Pdn/qBvwQ6e+ts5uEqG6iTrK6JWndcxrQgSe664KfoteN6fA==} @@ -271,6 +286,16 @@ packages: '@brillout/require-shim@0.1.2': resolution: {integrity: sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==} + '@brillout/test-e2e@0.5.33': + resolution: {integrity: sha512-CAhZQSGYVeMelcxbjFHZwZDT1Jk2BnNVS8JYYKkizin3ZoxQDdMYWskjO7jU+XN9xrjkvEUMlnXGXSO4E8/WjA==} + hasBin: true + + '@brillout/test-types@0.1.15': + resolution: {integrity: sha512-3akYLhRnuZoK0GLoLzFG1CJb7PMixIgdXnYEABlsOMfQDPEOmXwI6FGoQ6PwgVWc/J9HS8iY7bhED53T26qplw==} + hasBin: true + peerDependencies: + typescript: '>=4.0.0' + '@brillout/vite-plugin-server-entry@0.4.6': resolution: {integrity: sha512-VmnbkEVNY9pGnr2ICu+5lFnT3Zz4oblWxKZ1D4kutkzljxDOOBld8oWQI1RVup7c5OiG7XOHFJYYZS38BAXiLw==} @@ -334,6 +359,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.16.17': + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -352,6 +383,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.16.17': + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -370,6 +407,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.16.17': + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -388,6 +431,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.16.17': + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -406,6 +455,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.16.17': + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -424,6 +479,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.16.17': + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -442,6 +503,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.16.17': + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -460,6 +527,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.16.17': + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -478,6 +551,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.16.17': + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -496,6 +575,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.16.17': + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -514,6 +599,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.16.17': + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -532,6 +623,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.16.17': + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -550,6 +647,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.16.17': + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -568,6 +671,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.16.17': + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -586,6 +695,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.16.17': + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -604,6 +719,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.16.17': + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -622,6 +743,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/netbsd-x64@0.16.17': + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -640,6 +767,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/openbsd-x64@0.16.17': + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -658,6 +791,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.16.17': + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -676,6 +815,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.16.17': + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -694,6 +839,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.16.17': + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -712,6 +863,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.16.17': + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -1073,6 +1230,9 @@ packages: as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + babel-plugin-jsx-dom-expressions@0.37.22: resolution: {integrity: sha512-MN+B8oV7O6v1MizPaZve5uknpsRGFuMKauGAgtNccmh8fxSyXRLuzqklfN+H1naiSr1+aSpBS1TiKj7XxgRc2g==} peerDependencies: @@ -1131,6 +1291,10 @@ packages: capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1139,6 +1303,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1276,6 +1443,10 @@ packages: supports-color: optional: true + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1317,6 +1488,11 @@ packages: peerDependencies: esbuild: ^0.14.36 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0 + esbuild@0.16.17: + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -1440,6 +1616,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1452,6 +1633,9 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} @@ -1709,6 +1893,9 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} @@ -1900,6 +2087,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -1911,6 +2101,29 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pixelmatch@5.3.0: + resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} + hasBin: true + + playwright-chromium@1.45.0: + resolution: {integrity: sha512-wKZ1NeRZSXp25bYL00X4REv/3mgZQ6QUC6OGTfYZY/YZyorbC/3Fr1WATCB/yF9SCd79gSWBzRCYv4Bf7DzW7g==} + engines: {node: '>=18'} + hasBin: true + + playwright-core@1.45.0: + resolution: {integrity: sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.45.0: + resolution: {integrity: sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==} + engines: {node: '>=18'} + hasBin: true + + pngjs@6.0.0: + resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: '>=12.13.0'} + postcss-load-config@4.0.2: resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -2234,6 +2447,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -2600,6 +2817,8 @@ snapshots: '@brillout/json-serializer@0.5.10': {} + '@brillout/part-regex@0.1.3': {} + '@brillout/picocolors@1.0.13': {} '@brillout/release-me@0.3.9': @@ -2612,6 +2831,29 @@ snapshots: '@brillout/require-shim@0.1.2': {} + '@brillout/test-e2e@0.5.33': + dependencies: + '@brillout/part-regex': 0.1.3 + '@brillout/picocolors': 1.0.13 + chai: 4.4.1 + esbuild: 0.16.17 + fast-glob: 3.3.2 + node-fetch: 2.7.0 + pixelmatch: 5.3.0 + playwright-chromium: 1.45.0 + pngjs: 6.0.0 + source-map-support: 0.5.21 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - encoding + + '@brillout/test-types@0.1.15(typescript@5.5.2)': + dependencies: + '@brillout/picocolors': 1.0.13 + fast-glob: 3.3.2 + source-map-support: 0.5.21 + typescript: 5.5.2 + '@brillout/vite-plugin-server-entry@0.4.6': dependencies: '@brillout/import': 0.2.3 @@ -2655,6 +2897,9 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/android-arm64@0.16.17': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true @@ -2664,6 +2909,9 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm@0.16.17': + optional: true + '@esbuild/android-arm@0.17.19': optional: true @@ -2673,6 +2921,9 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-x64@0.16.17': + optional: true + '@esbuild/android-x64@0.17.19': optional: true @@ -2682,6 +2933,9 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.16.17': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true @@ -2691,6 +2945,9 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-x64@0.16.17': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true @@ -2700,6 +2957,9 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.16.17': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true @@ -2709,6 +2969,9 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.16.17': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true @@ -2718,6 +2981,9 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/linux-arm64@0.16.17': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true @@ -2727,6 +2993,9 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm@0.16.17': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true @@ -2736,6 +3005,9 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-ia32@0.16.17': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true @@ -2745,6 +3017,9 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-loong64@0.16.17': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true @@ -2754,6 +3029,9 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-mips64el@0.16.17': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true @@ -2763,6 +3041,9 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-ppc64@0.16.17': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true @@ -2772,6 +3053,9 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.16.17': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true @@ -2781,6 +3065,9 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-s390x@0.16.17': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true @@ -2790,6 +3077,9 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-x64@0.16.17': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true @@ -2799,6 +3089,9 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.16.17': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true @@ -2808,6 +3101,9 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.16.17': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true @@ -2817,6 +3113,9 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.16.17': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true @@ -2826,6 +3125,9 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/win32-arm64@0.16.17': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true @@ -2835,6 +3137,9 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-ia32@0.16.17': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true @@ -2844,6 +3149,9 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-x64@0.16.17': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true @@ -3192,6 +3500,8 @@ snapshots: dependencies: printable-characters: 1.0.42 + assertion-error@1.1.0: {} + babel-plugin-jsx-dom-expressions@0.37.22(@babel/core@7.24.7): dependencies: '@babel/core': 7.24.7 @@ -3252,6 +3562,16 @@ snapshots: transitivePeerDependencies: - supports-color + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -3263,6 +3583,10 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3401,6 +3725,10 @@ snapshots: dependencies: ms: 2.1.2 + deep-eql@4.1.4: + dependencies: + type-detect: 4.0.8 + deep-is@0.1.4: {} defu@6.1.4: {} @@ -3435,6 +3763,31 @@ snapshots: dependencies: esbuild: 0.21.5 + esbuild@0.16.17: + optionalDependencies: + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -3666,6 +4019,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -3673,6 +4029,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-func-name@2.0.2: {} + get-source@2.0.12: dependencies: data-uri-to-buffer: 2.0.2 @@ -3890,6 +4248,10 @@ snapshots: lodash.sortby@4.7.0: {} + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + lru-cache@10.2.2: {} lru-cache@5.1.1: @@ -4062,12 +4424,32 @@ snapshots: pathe@1.1.2: {} + pathval@1.1.1: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} pirates@4.0.6: {} + pixelmatch@5.3.0: + dependencies: + pngjs: 6.0.0 + + playwright-chromium@1.45.0: + dependencies: + playwright-core: 1.45.0 + + playwright-core@1.45.0: {} + + playwright@1.45.0: + dependencies: + playwright-core: 1.45.0 + optionalDependencies: + fsevents: 2.3.2 + + pngjs@6.0.0: {} + postcss-load-config@4.0.2(postcss@8.4.38): dependencies: lilconfig: 3.1.2 @@ -4383,6 +4765,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-fest@0.20.2: {} type-fest@3.13.1: {}