diff --git a/CHANGELOG.md b/CHANGELOG.md index b67240d85..a28f6cd34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ ## [Unreleased] +## [0.21.10] - 2024-12-22 + +### Changed + +- Bug fixes + +## [0.21.9] - 2024-12-15 + +### Changed + +- Support for progressive enhancement +- Various bug fixes + ## [0.21.8] - 2024-12-10 ### Changed diff --git a/docs/guides/monorepo.mdx b/docs/guides/monorepo.mdx new file mode 100644 index 000000000..d0c93966e --- /dev/null +++ b/docs/guides/monorepo.mdx @@ -0,0 +1,33 @@ +--- +slug: guides/monorepo +title: Waku in a Monorepo Setup +description: Tips for Using Waku in a Monorepo Setup +--- + +## Issues with Two Instances of React + +Example error: + +``` +TypeError: Cannot read properties of null (reading 'use') +``` + +This issue can sometimes occur in `pnpm` workspaces. In such cases, configuring Vite may resolve the problem. + +`vite.config.ts`: + +```ts +import { defineConfig } from 'vite'; + +export default defineConfig({ + resolve: { + dedupe: ['react', 'react-dom'], + }, +}); +``` + +Ref: https://github.com/dai-shi/waku/issues/676 + +--- + +If you encounter other issues while using Waku in a monorepo setup, please report them. diff --git a/e2e/21_create-pages_standalone.spec.ts b/e2e/21_create-pages_standalone.spec.ts deleted file mode 100644 index b6d2a4606..000000000 --- a/e2e/21_create-pages_standalone.spec.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { fileURLToPath } from 'node:url'; -import { cp, mkdtemp } from 'node:fs/promises'; -import { exec, execSync } from 'node:child_process'; -import { expect } from '@playwright/test'; -import type { Page } from '@playwright/test'; -import waitPort from 'wait-port'; -import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { createRequire } from 'node:module'; - -const testMatrix = [{ withSSR: false }, { withSSR: true }] as const; - -let standaloneDir: string; -const exampleDir = fileURLToPath( - new URL('../examples/21_create-pages', import.meta.url), -); -const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); -const { version } = createRequire(import.meta.url)( - join(wakuDir, 'package.json'), -); - -async function testRouterExample(page: Page, port: number) { - await waitPort({ port }); - - await page.goto(`http://localhost:${port}`); - await expect(page.getByRole('heading', { name: 'Home' })).toBeVisible(); - - await page.click("a[href='/foo']"); - - await expect(page.getByRole('heading', { name: 'Foo' })).toBeVisible(); - - await page.goto(`http://localhost:${port}/foo`); - await expect(page.getByRole('heading', { name: 'Foo' })).toBeVisible(); - - await page.goto(`http://localhost:${port}/nested/baz`); - await expect( - page.getByRole('heading', { name: 'Nested Layout' }), - ).toBeVisible(); - - const backgroundColor = await page.evaluate(() => - window.getComputedStyle(document.body).getPropertyValue('background-color'), - ); - expect(backgroundColor).toBe('rgb(254, 254, 254)'); -} - -test.describe('21_create-pages standalone', () => { - test.beforeAll('copy code', async () => { - // GitHub Action on Windows doesn't support mkdtemp on global temp dir, - // Which will cause files in `src` folder to be empty. - // I don't know why - const tmpDir = process.env.TEMP_DIR ? process.env.TEMP_DIR : tmpdir(); - standaloneDir = await mkdtemp(join(tmpDir, 'waku-07-router-')); - await cp(exampleDir, standaloneDir, { - filter: (src) => { - return !src.includes('node_modules') && !src.includes('dist'); - }, - recursive: true, - }); - execSync(`pnpm pack --pack-destination ${standaloneDir}`, { - cwd: wakuDir, - stdio: 'inherit', - }); - const name = `waku-${version}.tgz`; - execSync(`npm install ${join(standaloneDir, name)}`, { - cwd: standaloneDir, - stdio: 'inherit', - }); - }); - - testMatrix.forEach(({ withSSR }) => { - test(`should prod work ${withSSR ? 'with SSR' : ''}`, async ({ page }) => { - test.fixme(withSSR, 'SSR is not working in standalone'); - execSync( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} build`, - { - cwd: standaloneDir, - stdio: 'inherit', - }, - ); - const port = await getFreePort(); - const cp = exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} start --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await testRouterExample(page, port); - await terminate(cp.pid!); - }); - - test(`should dev work ${withSSR ? 'with SSR' : ''}`, async ({ page }) => { - test.fixme(withSSR, 'SSR is not working in standalone'); - const port = await getFreePort(); - const cp = exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} dev --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - /WebSocket server error: Port is already in use/, - ]); - await testRouterExample(page, port); - await terminate(cp.pid!); - }); - }); -}); diff --git a/e2e/broken-link.spec.ts b/e2e/broken-link.spec.ts deleted file mode 100644 index 80cdce22a..000000000 --- a/e2e/broken-link.spec.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { fileURLToPath } from 'node:url'; -import { cp, mkdtemp } from 'node:fs/promises'; -import { exec, execSync } from 'node:child_process'; -import { expect } from '@playwright/test'; -import waitPort from 'wait-port'; -import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { createRequire } from 'node:module'; - -let standaloneDir: string; -const exampleDir = fileURLToPath( - new URL('./fixtures/broken-links', import.meta.url), -); -const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); -const { version } = createRequire(import.meta.url)( - join(wakuDir, 'package.json'), -); - -async function start(staticServe: boolean) { - const port = await getFreePort(); - const cp = exec( - staticServe - ? `node ${join(standaloneDir, './node_modules/serve/build/main.js')} dist/public -p ${port}` - : `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} start --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - - await waitPort({ port }); - return [port, cp.pid] as const; -} - -test.beforeEach(async () => { - // GitHub Action on Windows doesn't support mkdtemp on global temp dir, - // Which will cause files in `src` folder to be empty. - // I don't know why - const tmpDir = process.env.TEMP_DIR ? process.env.TEMP_DIR : tmpdir(); - standaloneDir = await mkdtemp(join(tmpDir, 'waku-broken-link-')); - await cp(exampleDir, standaloneDir, { - filter: (src) => { - return !src.includes('node_modules') && !src.includes('dist'); - }, - recursive: true, - }); - execSync(`pnpm pack --pack-destination ${standaloneDir}`, { - cwd: wakuDir, - stdio: 'inherit', - }); - const name = `waku-${version}.tgz`; - execSync(`npm install ${join(standaloneDir, name)}`, { - cwd: standaloneDir, - stdio: 'inherit', - }); - execSync( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} build`, - { - cwd: standaloneDir, - stdio: 'inherit', - }, - ); -}); - -test.describe('server side navigation', () => { - test('existing page', async ({ page }) => { - const [port, pid] = await start(false); - - // Go to an existing page - await page.goto(`http://localhost:${port}/exists`); - // The page renders its header - await expect(page.getByRole('heading')).toHaveText('Existing page'); - // The page URL is correct - expect(page.url()).toBe(`http://localhost:${port}/exists`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); - - test('missing page', async ({ page }) => { - const [port, pid] = await start(false); - - // Navigate to a non-existing page - await page.goto(`http://localhost:${port}/broken`); - // The page renders the custom 404.tsx - await expect(page.getByRole('heading')).toHaveText('Custom not found'); - // The browsers URL remains the one that was navigated to - expect(page.url()).toBe(`http://localhost:${port}/broken`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); - - test('redirect', async ({ page }) => { - const [port, pid] = await start(false); - - // Navigate to a page that redirects to an existing page - await page.goto(`http://localhost:${port}/redirect`); - // The page renders the target page - await expect(page.getByRole('heading')).toHaveText('Existing page'); - // The browsers URL is the one of the target page - expect(page.url()).toBe(`http://localhost:${port}/exists`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); - - test('broken redirect', async ({ page }) => { - const [port, pid] = await start(false); - - // Navigate to a page that redirects to a non-existing page - await page.goto(`http://localhost:${port}/broken-redirect`); - // The page renders the custom 404.tsx - await expect(page.getByRole('heading')).toHaveText('Custom not found'); - // The browsers URL remains the one that was redirected to - expect(page.url()).toBe(`http://localhost:${port}/broken`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); -}); - -test.describe('client side navigation', () => { - test('correct link', async ({ page }) => { - const [port, pid] = await start(true); - - await page.goto(`http://localhost:${port}`); - // Click on a link to an existing page - await page.getByRole('link', { name: 'Existing page' }).click(); - // The page renders the target page - await expect(page.getByRole('heading')).toHaveText('Existing page'); - // The browsers URL is the one of the target page - expect(page.url()).toBe(`http://localhost:${port}/exists`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); - - test('broken link', async ({ page }) => { - const [port, pid] = await start(true); - - await page.goto(`http://localhost:${port}`); - - // Click on a link to a non-existing page - await page.getByRole('link', { name: 'Broken link' }).click(); - // The page renders the custom 404.tsx - await expect(page.getByRole('heading')).toHaveText('Custom not found'); - // The browsers URL remains the one that was navigated to - expect(page.url()).toBe(`http://localhost:${port}/broken`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); - - test('redirect', async ({ page }) => { - const [port, pid] = await start(true); - await page.goto(`http://localhost:${port}`); - - // Click on a link to a redirect - await page.getByRole('link', { name: 'Correct redirect' }).click(); - - // The page renders the target page - await expect(page.getByRole('heading')).toHaveText('Existing page'); - // The browsers URL is the one of the target page - expect(page.url()).toBe(`http://localhost:${port}/exists`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); - - test('broken redirect', async ({ page }) => { - const [port, pid] = await start(true); - await page.goto(`http://localhost:${port}`); - - // Click on a link to a broken redirect - await page.getByRole('link', { name: 'Broken redirect' }).click(); - - // The page renders the custom 404.tsx - await expect(page.getByRole('heading')).toHaveText('Custom not found'); - // The browsers URL remains the link href - // NOTE: This is inconsistent with server side navigation, but - // there is no way to tell where the RSC request was redirected - // to before failing with 404. - expect(page.url()).toBe(`http://localhost:${port}/broken-redirect`); - - // Go back to the index page - await page.getByRole('link', { name: 'Back' }).click(); - await expect(page.getByRole('heading')).toHaveText('Index'); - - await terminate(pid!); - }); -}); diff --git a/e2e/broken-links.spec.ts b/e2e/broken-links.spec.ts new file mode 100644 index 000000000..014110d87 --- /dev/null +++ b/e2e/broken-links.spec.ts @@ -0,0 +1,134 @@ +import { expect } from '@playwright/test'; + +import { test, prepareStandaloneSetup } from './utils.js'; + +const startApp = prepareStandaloneSetup('broken-links'); + +test.describe('broken-links: normal server', async () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp('PRD')); + }); + test.afterAll(async () => { + await stopApp(); + }); + + test.describe('server side navigation', () => { + test('existing page', async ({ page }) => { + // Go to an existing page + await page.goto(`http://localhost:${port}/exists`); + // The page renders its header + await expect(page.getByRole('heading')).toHaveText('Existing page'); + // The page URL is correct + expect(page.url()).toBe(`http://localhost:${port}/exists`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + + test('missing page', async ({ page }) => { + // Navigate to a non-existing page + await page.goto(`http://localhost:${port}/broken`); + // The page renders the custom 404.tsx + await expect(page.getByRole('heading')).toHaveText('Custom not found'); + // The browsers URL remains the one that was navigated to + expect(page.url()).toBe(`http://localhost:${port}/broken`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + + test('redirect', async ({ page }) => { + // Navigate to a page that redirects to an existing page + await page.goto(`http://localhost:${port}/redirect`); + // The page renders the target page + await expect(page.getByRole('heading')).toHaveText('Existing page'); + // The browsers URL is the one of the target page + expect(page.url()).toBe(`http://localhost:${port}/exists`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + + test('broken redirect', async ({ page }) => { + // Navigate to a page that redirects to a non-existing page + await page.goto(`http://localhost:${port}/broken-redirect`); + // The page renders the custom 404.tsx + await expect(page.getByRole('heading')).toHaveText('Custom not found'); + // The browsers URL remains the one that was redirected to + expect(page.url()).toBe(`http://localhost:${port}/broken`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + }); +}); + +test.describe('broken-links: static server', () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp('STATIC')); + }); + test.afterAll(async () => { + await stopApp(); + }); + + test.describe('client side navigation', () => { + test('correct link', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + // Click on a link to an existing page + await page.getByRole('link', { name: 'Existing page' }).click(); + // The page renders the target page + await expect(page.getByRole('heading')).toHaveText('Existing page'); + // The browsers URL is the one of the target page + expect(page.url()).toBe(`http://localhost:${port}/exists`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + + test('broken link', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + // Click on a link to a non-existing page + await page.getByRole('link', { name: 'Broken link' }).click(); + // The page renders the custom 404.tsx + await expect(page.getByRole('heading')).toHaveText('Custom not found'); + // The browsers URL remains the one that was navigated to + expect(page.url()).toBe(`http://localhost:${port}/broken`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + + test('redirect', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + // Click on a link to a redirect + await page.getByRole('link', { name: 'Correct redirect' }).click(); + // The page renders the target page + await expect(page.getByRole('heading')).toHaveText('Existing page'); + // The browsers URL is the one of the target page + expect(page.url()).toBe(`http://localhost:${port}/exists`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + + test('broken redirect', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + // Click on a link to a broken redirect + await page.getByRole('link', { name: 'Broken redirect' }).click(); + // The page renders the custom 404.tsx + await expect(page.getByRole('heading')).toHaveText('Custom not found'); + // The browsers URL remains the link href + // NOTE: This is inconsistent with server side navigation, but + // there is no way to tell where the RSC request was redirected + // to before failing with 404. + expect(page.url()).toBe(`http://localhost:${port}/broken-redirect`); + // Go back to the index page + await page.getByRole('link', { name: 'Back' }).click(); + await expect(page.getByRole('heading')).toHaveText('Index'); + }); + }); +}); diff --git a/e2e/create-pages.spec.ts b/e2e/create-pages.spec.ts new file mode 100644 index 000000000..7a3dd4a73 --- /dev/null +++ b/e2e/create-pages.spec.ts @@ -0,0 +1,69 @@ +import { expect } from '@playwright/test'; + +import { test, prepareStandaloneSetup } from './utils.js'; + +const startApp = prepareStandaloneSetup('create-pages'); + +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`create-pages: ${mode}`, () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp(mode)); + }); + test.afterAll(async () => { + await stopApp(); + }); + + test('home', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + await expect(page.getByRole('heading', { name: 'Home' })).toBeVisible(); + const backgroundColor = await page.evaluate(() => + window + .getComputedStyle(document.body) + .getPropertyValue('background-color'), + ); + expect(backgroundColor).toBe('rgb(254, 254, 254)'); + }); + + test('foo', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + await page.click("a[href='/foo']"); + await expect(page.getByRole('heading', { name: 'Foo' })).toBeVisible(); + + await page.goto(`http://localhost:${port}/foo`); + await expect(page.getByRole('heading', { name: 'Foo' })).toBeVisible(); + }); + + test('nested/foo', async ({ page }) => { + // /nested/foo is defined as a staticPath of /nested/[id] which matches this layout + await page.goto(`http://localhost:${port}/nested/foo`); + await expect( + page.getByRole('heading', { name: 'Deeply Nested Layout' }), + ).toBeVisible(); + }); + + test('wild/hello/world', async ({ page }) => { + await page.goto(`http://localhost:${port}/wild/hello/world`); + await expect( + page.getByRole('heading', { name: 'Slug: hello/world' }), + ).toBeVisible(); + }); + + test('nested/baz', async ({ page }) => { + await page.goto(`http://localhost:${port}/nested/baz`); + await expect( + page.getByRole('heading', { name: 'Nested Layout' }), + ).toBeVisible(); + }); + + test('jump', async ({ page }) => { + await page.goto(`http://localhost:${port}`); + await page.click("a[href='/foo']"); + await expect(page.getByRole('heading', { name: 'Foo' })).toBeVisible(); + await page.click('text=Jump to random page'); + await page.waitForTimeout(500); // need to wait not to error + await expect(page.getByRole('heading', { level: 2 })).toBeVisible(); + }); + }); +} diff --git a/e2e/create-waku.spec.ts b/e2e/create-waku.spec.ts index 66d839fd4..a5618d224 100644 --- a/e2e/create-waku.spec.ts +++ b/e2e/create-waku.spec.ts @@ -2,9 +2,10 @@ import { exec, spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; import crypto from 'node:crypto'; import { mkdir, readdir, cp, readFile, writeFile } from 'node:fs/promises'; -import { test, debugChildProcess } from './utils.js'; import { expect } from '@playwright/test'; +import { test, debugChildProcess } from './utils.js'; + test('should create waku with default setup work', async () => { const cliPath = fileURLToPath( new URL('../packages/create-waku/dist/index.js', import.meta.url), diff --git a/e2e/define-router.spec.ts b/e2e/define-router.spec.ts new file mode 100644 index 000000000..15a98d070 --- /dev/null +++ b/e2e/define-router.spec.ts @@ -0,0 +1,30 @@ +import { expect } from '@playwright/test'; + +import { test, prepareNormalSetup } from './utils.js'; + +const startApp = prepareNormalSetup('define-router'); + +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`define-router: ${mode}`, () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp(mode)); + }); + test.afterAll(async () => { + await stopApp(); + }); + + test('home', async ({ page }) => { + await page.goto(`http://localhost:${port}/`); + await expect(page.getByTestId('home-title')).toHaveText('Home'); + await page.getByText('Foo').click(); + await expect(page.getByTestId('foo-title')).toHaveText('Foo'); + }); + + test('foo', async ({ page }) => { + await page.goto(`http://localhost:${port}/foo`); + await expect(page.getByTestId('foo-title')).toHaveText('Foo'); + }); + }); +} diff --git a/e2e/fixtures/broken-links/package.json b/e2e/fixtures/broken-links/package.json index c151bd356..8ca33168c 100644 --- a/e2e/fixtures/broken-links/package.json +++ b/e2e/fixtures/broken-links/package.json @@ -16,8 +16,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/create-pages/package.json b/e2e/fixtures/create-pages/package.json new file mode 100644 index 000000000..d1c343842 --- /dev/null +++ b/e2e/fixtures/create-pages/package.json @@ -0,0 +1,23 @@ +{ + "name": "create-pages", + "version": "0.1.0", + "type": "module", + "private": true, + "scripts": { + "dev": "waku dev", + "build": "waku build", + "start": "waku start" + }, + "dependencies": { + "react": "19.0.0", + "react-dom": "19.0.0", + "react-server-dom-webpack": "19.0.0", + "waku": "workspace:*" + }, + "devDependencies": { + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "server-only": "^0.0.1", + "typescript": "^5.7.2" + } +} diff --git a/e2e/fixtures/create-pages/src/components/Counter.tsx b/e2e/fixtures/create-pages/src/components/Counter.tsx new file mode 100644 index 000000000..54f71893e --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/Counter.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { useState, useTransition } from 'react'; +import { Link, useRouter_UNSTABLE as useRouter } from 'waku/router/client'; + +import { jump } from './funcs.js'; + +export const Counter = () => { + const { path } = useRouter(); + const [count, setCount] = useState(0); + const [isPending, startTransition] = useTransition(); + return ( +
+

Count: {count}

+ +

This is a client component.

+ path: {path} +

+ Go to Home +

+

+ +

+
+ ); +}; diff --git a/e2e/fixtures/create-pages/src/components/DeeplyNestedLayout.tsx b/e2e/fixtures/create-pages/src/components/DeeplyNestedLayout.tsx new file mode 100644 index 000000000..05a2380c7 --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/DeeplyNestedLayout.tsx @@ -0,0 +1,12 @@ +export const DeeplyNestedLayout = ({ + children, +}: { + children: React.ReactNode; +}) => { + return ( +
+

Deeply Nested Layout

+ {children} +
+ ); +}; diff --git a/e2e/fixtures/create-pages/src/components/FooPage.tsx b/e2e/fixtures/create-pages/src/components/FooPage.tsx new file mode 100644 index 000000000..02b174163 --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/FooPage.tsx @@ -0,0 +1,12 @@ +import 'server-only'; + +import { Counter } from './Counter.js'; + +const Foo = () => ( +
+

Foo

+ +
+); + +export default Foo; diff --git a/e2e/fixtures/create-pages/src/components/HomeLayout.tsx b/e2e/fixtures/create-pages/src/components/HomeLayout.tsx new file mode 100644 index 000000000..55e77435f --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/HomeLayout.tsx @@ -0,0 +1,65 @@ +import type { ReactNode } from 'react'; + +import { Link } from 'waku/router/client'; + +import '../styles.css'; + +const Pending = ({ isPending }: { isPending: boolean }) => ( + + Pending... + +); + +const HomeLayout = ({ children }: { children: ReactNode }) => ( +
+
    +
  • + } + notPending={} + > + Home + +
  • +
  • + } + notPending={} + > + Foo + +
  • +
  • + + Bar + +
  • +
  • + Baz +
  • +
  • + Nested / Foo +
  • +
  • + Nested / Bar +
  • +
  • + Nested / Baz +
  • +
  • + Nested / Qux +
  • +
+ {children} +
+); + +export default HomeLayout; diff --git a/e2e/fixtures/create-pages/src/components/HomePage.tsx b/e2e/fixtures/create-pages/src/components/HomePage.tsx new file mode 100644 index 000000000..5de06aa05 --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/HomePage.tsx @@ -0,0 +1,8 @@ +const Home = () => ( +
+

Home

+

This is the home page.

+
+); + +export default Home; diff --git a/e2e/fixtures/create-pages/src/components/NestedBazPage.tsx b/e2e/fixtures/create-pages/src/components/NestedBazPage.tsx new file mode 100644 index 000000000..96f6ddd10 --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/NestedBazPage.tsx @@ -0,0 +1,9 @@ +const Baz = () => ( +
+

Nested

+

Baz

+

{new Date().toISOString()}

+
+); + +export default Baz; diff --git a/e2e/fixtures/create-pages/src/components/NestedLayout.tsx b/e2e/fixtures/create-pages/src/components/NestedLayout.tsx new file mode 100644 index 000000000..b852631b3 --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/NestedLayout.tsx @@ -0,0 +1,10 @@ +const NestedLayout = ({ children }: { children: React.ReactNode }) => { + return ( +
+

Nested Layout

+ {children} +
+ ); +}; + +export default NestedLayout; diff --git a/e2e/fixtures/create-pages/src/components/Root.tsx b/e2e/fixtures/create-pages/src/components/Root.tsx new file mode 100644 index 000000000..3dc1162c8 --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/Root.tsx @@ -0,0 +1,12 @@ +import type { ReactNode } from 'react'; + +export default function Root({ children }: { children: ReactNode }) { + return ( + + + Waku + + {children} + + ); +} diff --git a/e2e/fixtures/create-pages/src/components/funcs.ts b/e2e/fixtures/create-pages/src/components/funcs.ts new file mode 100644 index 000000000..c8c6c25db --- /dev/null +++ b/e2e/fixtures/create-pages/src/components/funcs.ts @@ -0,0 +1,11 @@ +'use server'; + +import { unstable_rerenderRoute } from 'waku/router/server'; + +const PAGES = ['/nested/foo', '/nested/bar', '/nested/aaa', '/nested/bbb']; + +export const jump = async () => { + const page = PAGES[Math.floor(Math.random() * PAGES.length)] as string; + console.log(`Jumping to ${page}`); + unstable_rerenderRoute(page); +}; diff --git a/e2e/fixtures/create-pages/src/entries.tsx b/e2e/fixtures/create-pages/src/entries.tsx new file mode 100644 index 000000000..dfc308b48 --- /dev/null +++ b/e2e/fixtures/create-pages/src/entries.tsx @@ -0,0 +1,113 @@ +import { createPages } from 'waku/router/server'; +import type { PathsForPages } from 'waku/router'; + +import FooPage from './components/FooPage.js'; +import HomeLayout from './components/HomeLayout.js'; +import HomePage from './components/HomePage.js'; +import NestedBazPage from './components/NestedBazPage.js'; +import Root from './components/Root.js'; +import NestedLayout from './components/NestedLayout.js'; +import { DeeplyNestedLayout } from './components/DeeplyNestedLayout.js'; + +const pages: ReturnType = createPages( + async ({ createPage, createLayout, createRoot }) => [ + createRoot({ + render: 'static', + component: Root, + }), + + createLayout({ + render: 'static', + path: '/', + component: HomeLayout, + }), + + createPage({ + render: 'static', + path: '/', + component: HomePage, + }), + + createPage({ + render: 'static', + path: '/foo', + component: FooPage, + }), + + createPage({ + render: 'dynamic', + path: '/nested/baz', + component: NestedBazPage, + }), + + createLayout({ + render: 'static', + path: '/nested', + component: NestedLayout, + }), + + createPage({ + render: 'static', + path: '/nested/[id]', + staticPaths: ['foo', 'bar'], + component: ({ id }) => ( + <> +

Nested

+

Static: {id}

+ + ), + }), + + createPage({ + render: 'dynamic', + path: '/wild/[...id]', + component: ({ id }) => ( + <> +

Wildcard

+

Slug: {id.join('/')}

+ + ), + }), + + createLayout({ + render: 'static', + path: '/nested/[id]', + component: DeeplyNestedLayout, + }), + + createPage({ + render: 'dynamic', + path: '/nested/[id]', + component: ({ id }) => ( + <> +

Nested

+

Dynamic: {id}

+ + ), + }), + + createPage({ + render: 'dynamic', + path: '/any/[...all]', + component: ({ all }) =>

Catch-all: {all.join('/')}

, + }), + + // Custom Not Found page + createPage({ + render: 'static', + path: '/404', + component: () =>

Not Found

, + }), + ], +); + +declare module 'waku/router' { + interface RouteConfig { + paths: PathsForPages; + } + interface CreatePagesConfig { + pages: typeof pages; + } +} + +export default pages; diff --git a/e2e/fixtures/create-pages/src/main.tsx b/e2e/fixtures/create-pages/src/main.tsx new file mode 100644 index 000000000..bddb502d5 --- /dev/null +++ b/e2e/fixtures/create-pages/src/main.tsx @@ -0,0 +1,15 @@ +import { StrictMode } from 'react'; +import { createRoot, hydrateRoot } from 'react-dom/client'; +import { Router } from 'waku/router/client'; + +const rootElement = ( + + + +); + +if ((globalThis as any).__WAKU_HYDRATE__) { + hydrateRoot(document, rootElement); +} else { + createRoot(document as any).render(rootElement); +} diff --git a/e2e/fixtures/create-pages/src/styles.css b/e2e/fixtures/create-pages/src/styles.css new file mode 100644 index 000000000..5eb2b9cae --- /dev/null +++ b/e2e/fixtures/create-pages/src/styles.css @@ -0,0 +1,3 @@ +body { + background-color: #fefefe; +} diff --git a/e2e/fixtures/create-pages/tsconfig.json b/e2e/fixtures/create-pages/tsconfig.json new file mode 100644 index 000000000..2590e13de --- /dev/null +++ b/e2e/fixtures/create-pages/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "composite": true, + "strict": true, + "target": "esnext", + "downlevelIteration": true, + "esModuleInterop": true, + "module": "nodenext", + "skipLibCheck": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "types": ["react/experimental"], + "jsx": "react-jsx", + "rootDir": "./src", + "outDir": "./dist" + } +} diff --git a/e2e/fixtures/rsc-router/README.md b/e2e/fixtures/define-router/README.md similarity index 100% rename from e2e/fixtures/rsc-router/README.md rename to e2e/fixtures/define-router/README.md diff --git a/e2e/fixtures/rsc-router/package.json b/e2e/fixtures/define-router/package.json similarity index 79% rename from e2e/fixtures/rsc-router/package.json rename to e2e/fixtures/define-router/package.json index ec363be48..cd05e6bde 100644 --- a/e2e/fixtures/rsc-router/package.json +++ b/e2e/fixtures/define-router/package.json @@ -1,5 +1,5 @@ { - "name": "rsc-router", + "name": "define-router", "version": "0.1.0", "type": "module", "private": true, @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/rsc-router/src/entries.tsx b/e2e/fixtures/define-router/src/entries.tsx similarity index 100% rename from e2e/fixtures/rsc-router/src/entries.tsx rename to e2e/fixtures/define-router/src/entries.tsx diff --git a/e2e/fixtures/rsc-router/src/main.tsx b/e2e/fixtures/define-router/src/main.tsx similarity index 100% rename from e2e/fixtures/rsc-router/src/main.tsx rename to e2e/fixtures/define-router/src/main.tsx diff --git a/e2e/fixtures/rsc-router/src/routes/foo/page.tsx b/e2e/fixtures/define-router/src/routes/foo/page.tsx similarity index 100% rename from e2e/fixtures/rsc-router/src/routes/foo/page.tsx rename to e2e/fixtures/define-router/src/routes/foo/page.tsx diff --git a/e2e/fixtures/rsc-router/src/routes/layout.tsx b/e2e/fixtures/define-router/src/routes/layout.tsx similarity index 100% rename from e2e/fixtures/rsc-router/src/routes/layout.tsx rename to e2e/fixtures/define-router/src/routes/layout.tsx diff --git a/e2e/fixtures/rsc-router/src/routes/page.tsx b/e2e/fixtures/define-router/src/routes/page.tsx similarity index 100% rename from e2e/fixtures/rsc-router/src/routes/page.tsx rename to e2e/fixtures/define-router/src/routes/page.tsx diff --git a/e2e/fixtures/rsc-router/tsconfig.json b/e2e/fixtures/define-router/tsconfig.json similarity index 100% rename from e2e/fixtures/rsc-router/tsconfig.json rename to e2e/fixtures/define-router/tsconfig.json diff --git a/e2e/fixtures/hot-reload/package.json b/e2e/fixtures/hot-reload/package.json index 4bebfa16c..d560a892c 100644 --- a/e2e/fixtures/hot-reload/package.json +++ b/e2e/fixtures/hot-reload/package.json @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/partial-build/package.json b/e2e/fixtures/partial-build/package.json index 32c94d6ea..4a1efaa21 100644 --- a/e2e/fixtures/partial-build/package.json +++ b/e2e/fixtures/partial-build/package.json @@ -17,8 +17,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/render-type/package.json b/e2e/fixtures/render-type/package.json index c1e078947..e9961e2ff 100644 --- a/e2e/fixtures/render-type/package.json +++ b/e2e/fixtures/render-type/package.json @@ -17,8 +17,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/rsc-basic/package.json b/e2e/fixtures/rsc-basic/package.json index 55d895971..69fc78ae9 100644 --- a/e2e/fixtures/rsc-basic/package.json +++ b/e2e/fixtures/rsc-basic/package.json @@ -16,8 +16,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/rsc-css-modules/package.json b/e2e/fixtures/rsc-css-modules/package.json index f61826182..4139516b9 100644 --- a/e2e/fixtures/rsc-css-modules/package.json +++ b/e2e/fixtures/rsc-css-modules/package.json @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssg-performance/package.json b/e2e/fixtures/ssg-performance/package.json index 2583d839d..4b01830e7 100644 --- a/e2e/fixtures/ssg-performance/package.json +++ b/e2e/fixtures/ssg-performance/package.json @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssg-wildcard/package.json b/e2e/fixtures/ssg-wildcard/package.json index 56e081d32..564248ab0 100644 --- a/e2e/fixtures/ssg-wildcard/package.json +++ b/e2e/fixtures/ssg-wildcard/package.json @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssr-basic/package.json b/e2e/fixtures/ssr-basic/package.json index a74633dc4..cee4af870 100644 --- a/e2e/fixtures/ssr-basic/package.json +++ b/e2e/fixtures/ssr-basic/package.json @@ -9,15 +9,15 @@ "start": "waku start" }, "dependencies": { - "ai": "^4.0.13", + "ai": "^4.0.22", "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssr-catch-error/package.json b/e2e/fixtures/ssr-catch-error/package.json index 4993002af..cd5536a77 100644 --- a/e2e/fixtures/ssr-catch-error/package.json +++ b/e2e/fixtures/ssr-catch-error/package.json @@ -11,13 +11,13 @@ "dependencies": { "react": "19.0.0", "react-dom": "19.0.0", - "react-error-boundary": "^4.1.2", + "react-error-boundary": "^5.0.0", "react-server-dom-webpack": "19.0.0", "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssr-context-provider/package.json b/e2e/fixtures/ssr-context-provider/package.json index 3b582143b..c5c0997f0 100644 --- a/e2e/fixtures/ssr-context-provider/package.json +++ b/e2e/fixtures/ssr-context-provider/package.json @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssr-swr/package.json b/e2e/fixtures/ssr-swr/package.json index 8827fb2ee..acd015f49 100644 --- a/e2e/fixtures/ssr-swr/package.json +++ b/e2e/fixtures/ssr-swr/package.json @@ -16,8 +16,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/ssr-target-bundle/package.json b/e2e/fixtures/ssr-target-bundle/package.json index 4780911b8..fa4761133 100644 --- a/e2e/fixtures/ssr-target-bundle/package.json +++ b/e2e/fixtures/ssr-target-bundle/package.json @@ -12,12 +12,12 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "react-textarea-autosize": "^8.5.5", + "react-textarea-autosize": "^8.5.6", "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/fixtures/use-router/package.json b/e2e/fixtures/use-router/package.json index 19eac9422..82822da11 100644 --- a/e2e/fixtures/use-router/package.json +++ b/e2e/fixtures/use-router/package.json @@ -15,8 +15,8 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "typescript": "^5.7.2" } } diff --git a/e2e/hot-reload.spec.ts b/e2e/hot-reload.spec.ts index c46ba39c0..7e24b3161 100644 --- a/e2e/hot-reload.spec.ts +++ b/e2e/hot-reload.spec.ts @@ -1,30 +1,18 @@ -import { expect } from '@playwright/test'; -import { execSync, exec } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import { cp, mkdtemp, readFile, writeFile } from 'node:fs/promises'; +import { execSync } from 'node:child_process'; +import { readFile, writeFile } from 'node:fs/promises'; import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { createRequire } from 'node:module'; -import waitPort from 'wait-port'; +import { expect } from '@playwright/test'; import { - debugChildProcess, - getFreePort, isPortAvailable, terminate, test, + prepareStandaloneSetup, } from './utils.js'; -let standaloneDir: string; -const fixtureDir = fileURLToPath( - new URL('./fixtures/hot-reload', import.meta.url), -); -const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); -const { version } = createRequire(import.meta.url)( - join(wakuDir, 'package.json'), -); +const startApp = prepareStandaloneSetup('hot-reload'); -async function run() { +async function startAppDev() { const HMR_PORT = 24678; if (!(await isPortAvailable(HMR_PORT))) { if (process.platform === 'win32') { @@ -46,70 +34,67 @@ async function run() { } } } - const port = await getFreePort(); - const cp = exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} dev --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); - return [port, cp.pid] as const; + return startApp('DEV'); } -async function modifyFile(file: string, search: string, replace: string) { +async function modifyFile( + standaloneDir: string, + file: string, + search: string, + replace: string, +) { const content = await readFile(join(standaloneDir, file), 'utf-8'); await writeFile(join(standaloneDir, file), content.replace(search, replace)); } test.describe('hot reload', () => { - test.beforeEach(async () => { - // GitHub Action on Windows doesn't support mkdtemp on global temp dir, - // Which will cause files in `src` folder to be empty. - // I don't know why - const tmpDir = process.env.TEMP_DIR ? process.env.TEMP_DIR : tmpdir(); - standaloneDir = await mkdtemp(join(tmpDir, 'waku-hot-reload-')); - await cp(fixtureDir, standaloneDir, { - filter: (src) => { - return !src.includes('node_modules') && !src.includes('dist'); - }, - recursive: true, - }); - execSync(`pnpm pack --pack-destination ${standaloneDir}`, { - cwd: wakuDir, - stdio: 'inherit', - }); - const name = `waku-${version}.tgz`; - execSync(`npm install --force ${join(standaloneDir, name)}`, { - cwd: standaloneDir, - stdio: 'inherit', - }); + let port: number; + let stopApp: () => Promise; + let standaloneDir: string; + test.beforeAll(async () => { + ({ port, stopApp, standaloneDir } = await startAppDev()); + }); + test.afterAll(async () => { + await stopApp(); }); test('server and client', async ({ page }) => { - const [port, pid] = await run(); await page.goto(`http://localhost:${port}/`); await expect(page.getByText('Home Page')).toBeVisible(); await expect(page.getByTestId('count')).toHaveText('0'); await page.getByTestId('increment').click(); await expect(page.getByTestId('count')).toHaveText('1'); // Server component hot reload - await modifyFile('src/pages/index.tsx', 'Home Page', 'Modified Page'); + await modifyFile( + standaloneDir, + 'src/pages/index.tsx', + 'Home Page', + 'Modified Page', + ); await expect(page.getByText('Modified Page')).toBeVisible(); await page.waitForTimeout(500); // need to wait not to full reload await expect(page.getByTestId('count')).toHaveText('1'); await page.getByTestId('increment').click(); await expect(page.getByTestId('count')).toHaveText('2'); // Client component HMR - await modifyFile('src/components/counter.tsx', 'Increment', 'Plus One'); + await modifyFile( + standaloneDir, + 'src/components/counter.tsx', + 'Increment', + 'Plus One', + ); await expect(page.getByText('Plus One')).toBeVisible(); await page.waitForTimeout(500); // need to wait not to full reload await expect(page.getByTestId('count')).toHaveText('2'); await page.getByTestId('increment').click(); await expect(page.getByTestId('count')).toHaveText('3'); // Server component hot reload again - await modifyFile('src/pages/index.tsx', 'Modified Page', 'Edited Page'); + await modifyFile( + standaloneDir, + 'src/pages/index.tsx', + 'Modified Page', + 'Edited Page', + ); await expect(page.getByText('Edited Page')).toBeVisible(); await page.waitForTimeout(500); // need to wait not to full reload await expect(page.getByTestId('count')).toHaveText('3'); @@ -118,10 +103,14 @@ test.describe('hot reload', () => { // Jump to another page and back await page.getByTestId('about').click(); await expect(page.getByText('About Page')).toBeVisible(); - await modifyFile('src/pages/about.tsx', 'About Page', 'About2 Page'); + await modifyFile( + standaloneDir, + 'src/pages/about.tsx', + 'About Page', + 'About2 Page', + ); await expect(page.getByText('About2 Page')).toBeVisible(); await page.getByTestId('home').click(); await expect(page.getByText('Edited Page')).toBeVisible(); - await terminate(pid!); }); }); diff --git a/e2e/multi-platform.spec.ts b/e2e/multi-platform.spec.ts index 83ff62281..e2be863d4 100644 --- a/e2e/multi-platform.spec.ts +++ b/e2e/multi-platform.spec.ts @@ -1,19 +1,20 @@ import { execSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; -import { test } from './utils.js'; import { rm } from 'node:fs/promises'; import { expect } from '@playwright/test'; +import { test } from './utils.js'; + const dryRunList = [ // without entries.tsx { - cwd: fileURLToPath(new URL('../examples/01_template', import.meta.url)), - project: '01_template', + cwd: fileURLToPath(new URL('./fixtures/partial-build', import.meta.url)), + project: 'partial-build', }, // with entries.tsx { - cwd: fileURLToPath(new URL('../examples/31_minimal', import.meta.url)), - project: '31_minimal', + cwd: fileURLToPath(new URL('./fixtures/ssr-basic', import.meta.url)), + project: 'ssr-basic', }, ]; diff --git a/e2e/partial-builds.spec.ts b/e2e/partial-build.spec.ts similarity index 96% rename from e2e/partial-builds.spec.ts rename to e2e/partial-build.spec.ts index 141f8606b..af6cd6e66 100644 --- a/e2e/partial-builds.spec.ts +++ b/e2e/partial-build.spec.ts @@ -20,12 +20,8 @@ test.describe(`partial builds`, () => { let cp: ChildProcess; let port: number; - test.beforeEach(async ({ page }) => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); + await rm(`${cwd}/dist`, { recursive: true, force: true }); execSync(`node ${waku} build`, { cwd, env: { ...process.env, PAGES: 'a' }, @@ -36,6 +32,9 @@ test.describe(`partial builds`, () => { await page.goto(`http://localhost:${port}/page/a`); expect(await page.getByTestId('title').textContent()).toBe('a'); }); + test.afterEach(async () => { + await terminate(cp.pid!); + }); test('does not change pages that already exist', async () => { const htmlBefore = statSync(`${cwd}/dist/public/page/a/index.html`); @@ -69,8 +68,4 @@ test.describe(`partial builds`, () => { await page.goto(`http://localhost:${port}/page/c`); expect(await page.getByTestId('title').textContent()).toBe('c'); }); - - test.afterEach(async () => { - await terminate(cp.pid!); - }); }); diff --git a/e2e/render-type.spec.ts b/e2e/render-type.spec.ts index 2ad63e075..5ff825356 100644 --- a/e2e/render-type.spec.ts +++ b/e2e/render-type.spec.ts @@ -1,39 +1,23 @@ -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; import { expect } from '@playwright/test'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const cwd = fileURLToPath(new URL('./fixtures/render-type', import.meta.url)); +const startApp = prepareNormalSetup('render-type'); -test.describe(`render type`, () => { +test.describe('render type', () => { test.skip( ({ browserName }) => browserName !== 'chromium', 'Browsers are not relevant for this test. One is enough.', ); - let cp: ChildProcess; - let port: number; - - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - execSync(`node ${waku} build`, { cwd }); - }); - test.describe('static', () => { - test.beforeEach(async () => { - port = await getFreePort(); - // Use a static http server to make sure its not accidentally SSR. - cp = exec(`pnpm serve -l ${port} dist/public`, { cwd }); - await waitPort({ port }); + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp('STATIC')); + }); + test.afterAll(async () => { + await stopApp(); }); test('renders static content', async ({ page }) => { @@ -72,13 +56,13 @@ test.describe(`render type`, () => { }); test.describe('dynamic', () => { - test.beforeEach(async () => { - port = await getFreePort(); - cp = exec(`node ${waku} start --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp('PRD')); + }); + test.afterAll(async () => { + await stopApp(); }); test('renders dynamic content', async ({ page }) => { @@ -98,6 +82,7 @@ test.describe(`render type`, () => { timestamp, ); }); + test('hydrates client components', async ({ page }) => { await page.goto(`http://localhost:${port}/client/dynamic/dynamic-echo`); expect(await page.getByTestId('echo').innerText()).toEqual( @@ -116,10 +101,7 @@ test.describe(`render type`, () => { timestamp, ); }); - // TODO: Add test case for cached RSC payload that should not re-render. - }); - test.afterEach(async () => { - await terminate(cp.pid!); + // TODO: Add test case for cached RSC payload that should not re-render. }); }); diff --git a/e2e/rsc-basic.spec.ts b/e2e/rsc-basic.spec.ts index a2c19a078..405e20af3 100644 --- a/e2e/rsc-basic.spec.ts +++ b/e2e/rsc-basic.spec.ts @@ -1,51 +1,18 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; +const startApp = prepareNormalSetup('rsc-basic'); -const cwd = fileURLToPath(new URL('./fixtures/rsc-basic', import.meta.url)); - -for (const { build, command } of commands) { - test.describe(`rsc-basic: ${command}`, () => { - let cp: ChildProcess; +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`rsc-basic: ${mode}`, () => { let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - + let stopApp: () => Promise; test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + ({ port, stopApp } = await startApp(mode)); }); - test.afterAll(async () => { - await terminate(cp.pid!); + await stopApp(); }); test('basic', async ({ page }) => { diff --git a/e2e/rsc-css-modules.spec.ts b/e2e/rsc-css-modules.spec.ts index 721259593..e58168464 100644 --- a/e2e/rsc-css-modules.spec.ts +++ b/e2e/rsc-css-modules.spec.ts @@ -1,53 +1,18 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; +const startApp = prepareNormalSetup('rsc-css-modules'); -const cwd = fileURLToPath( - new URL('./fixtures/rsc-css-modules', import.meta.url), -); - -for (const { build, command } of commands) { - test.describe(`rsc-css-modules: ${command}`, () => { - let cp: ChildProcess; +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`rsc-css-modules: ${mode}`, () => { let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - + let stopApp: () => Promise; test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + ({ port, stopApp } = await startApp(mode)); }); - test.afterAll(async () => { - await terminate(cp.pid!); + await stopApp(); }); test('css-modules classes', async ({ page }) => { diff --git a/e2e/rsc-router.spec.ts b/e2e/rsc-router.spec.ts deleted file mode 100644 index 0e1192012..000000000 --- a/e2e/rsc-router.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; - -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); - -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; - -const cwd = fileURLToPath(new URL('./fixtures/rsc-router', import.meta.url)); - -for (const { build, command } of commands) { - test.describe(`rsc-router: ${command}`, () => { - let cp: ChildProcess; - let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - - test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); - }); - - test.afterAll(async () => { - await terminate(cp.pid!); - }); - - test('home', async ({ page }) => { - await page.goto(`http://localhost:${port}/`); - await expect(page.getByTestId('home-title')).toHaveText('Home'); - await page.getByText('Foo').click(); - await expect(page.getByTestId('foo-title')).toHaveText('Foo'); - }); - - test('foo', async ({ page }) => { - await page.goto(`http://localhost:${port}/foo`); - await expect(page.getByTestId('foo-title')).toHaveText('Foo'); - }); - }); -} diff --git a/e2e/ssg-performance.spec.ts b/e2e/ssg-performance.spec.ts index 7b50f516a..f9b1dc4e8 100644 --- a/e2e/ssg-performance.spec.ts +++ b/e2e/ssg-performance.spec.ts @@ -1,17 +1,8 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareStandaloneSetup } from './utils.js'; -const cwd = fileURLToPath( - new URL('./fixtures/ssg-performance', import.meta.url), -); +const startApp = prepareStandaloneSetup('ssg-performance'); test.describe(`high volume static site generation`, () => { test.skip( @@ -19,27 +10,11 @@ test.describe(`high volume static site generation`, () => { 'Browsers are not relevant for this test. One is enough.', ); - let cp: ChildProcess; - let port: number; - - test.afterAll(async () => { - await terminate(cp.pid!); - }); - test('build and verify', async ({ page }) => { test.setTimeout(60000); - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - execSync(`node ${waku} build`, { cwd }); - port = await getFreePort(); - cp = exec(`node ${waku} start --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + const { port, stopApp } = await startApp('PRD'); await page.goto(`http://localhost:${port}/path-3`); await expect(page.getByRole('heading')).toHaveText('/path-3'); + await stopApp(); }); }); diff --git a/e2e/ssg-wildcard.spec.ts b/e2e/ssg-wildcard.spec.ts index a2399b118..d046b61a0 100644 --- a/e2e/ssg-wildcard.spec.ts +++ b/e2e/ssg-wildcard.spec.ts @@ -1,74 +1,31 @@ -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { fileURLToPath } from 'node:url'; -import { cp, mkdtemp } from 'node:fs/promises'; -import { exec, execSync } from 'node:child_process'; import { expect } from '@playwright/test'; -import waitPort from 'wait-port'; -import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { createRequire } from 'node:module'; -let standaloneDir: string; -const exampleDir = fileURLToPath( - new URL('./fixtures/ssg-wildcard', import.meta.url), -); -const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); -const { version } = createRequire(import.meta.url)( - join(wakuDir, 'package.json'), -); +import { test, prepareStandaloneSetup } from './utils.js'; -test.describe('ssg wildcard', async () => { - test.beforeEach(async () => { - // GitHub Action on Windows doesn't support mkdtemp on global temp dir, - // Which will cause files in `src` folder to be empty. - // I don't know why - const tmpDir = process.env.TEMP_DIR ? process.env.TEMP_DIR : tmpdir(); - standaloneDir = await mkdtemp(join(tmpDir, 'waku-ssg-wildcard-')); - await cp(exampleDir, standaloneDir, { - filter: (src) => { - return !src.includes('node_modules') && !src.includes('dist'); - }, - recursive: true, - }); - execSync(`pnpm pack --pack-destination ${standaloneDir}`, { - cwd: wakuDir, - stdio: 'inherit', +const startApp = prepareStandaloneSetup('ssg-wildcard'); + +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`ssg wildcard: ${mode}`, async () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp(mode)); }); - const name = `waku-${version}.tgz`; - execSync(`npm install ${join(standaloneDir, name)}`, { - cwd: standaloneDir, - stdio: 'inherit', + test.afterAll(async () => { + await stopApp(); }); - }); - - test(`works`, async ({ page }) => { - execSync( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} build`, - { - cwd: standaloneDir, - stdio: 'inherit', - }, - ); - const port = await getFreePort(); - const cp = exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} start --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + test(`works`, async ({ page }) => { + await page.goto(`http://localhost:${port}`); + await expect(page.getByRole('heading', { name: '/' })).toBeVisible(); - await page.goto(`http://localhost:${port}`); - await expect(page.getByRole('heading', { name: '/' })).toBeVisible(); + await page.goto(`http://localhost:${port}/foo`); + await expect(page.getByRole('heading', { name: '/foo' })).toBeVisible(); - await page.goto(`http://localhost:${port}/foo`); - await expect(page.getByRole('heading', { name: '/foo' })).toBeVisible(); - - await page.goto(`http://localhost:${port}/bar/baz`); - await expect(page.getByRole('heading', { name: '/bar/baz' })).toBeVisible(); - - await terminate(cp.pid!); + await page.goto(`http://localhost:${port}/bar/baz`); + await expect( + page.getByRole('heading', { name: '/bar/baz' }), + ).toBeVisible(); + }); }); -}); +} diff --git a/e2e/ssr-basic.spec.ts b/e2e/ssr-basic.spec.ts index 730b786f2..6f2b488ef 100644 --- a/e2e/ssr-basic.spec.ts +++ b/e2e/ssr-basic.spec.ts @@ -1,51 +1,18 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; +const startApp = prepareNormalSetup('ssr-basic'); -const cwd = fileURLToPath(new URL('./fixtures/ssr-basic', import.meta.url)); - -for (const { build, command } of commands) { - test.describe(`ssr-basic: ${command}`, () => { - let cp: ChildProcess; +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`ssr-basic: ${mode}`, () => { let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - + let stopApp: () => Promise; test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + ({ port, stopApp } = await startApp(mode)); }); - test.afterAll(async () => { - await terminate(cp.pid!); + await stopApp(); }); test('increase counter', async ({ page }) => { diff --git a/e2e/ssr-catch-error.spec.ts b/e2e/ssr-catch-error.spec.ts index 3a1dcfbbe..acbc34f14 100644 --- a/e2e/ssr-catch-error.spec.ts +++ b/e2e/ssr-catch-error.spec.ts @@ -1,86 +1,34 @@ import { expect } from '@playwright/test'; -import { execSync, exec } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import { cp, mkdtemp } from 'node:fs/promises'; -import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { createRequire } from 'node:module'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; +import { test, prepareStandaloneSetup } from './utils.js'; -let standaloneDir: string; -const fixtureDir = fileURLToPath( - new URL('./fixtures/ssr-catch-error', import.meta.url), -); -const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); -const { version } = createRequire(import.meta.url)( - join(wakuDir, 'package.json'), -); +const startApp = prepareStandaloneSetup('ssr-catch-error'); -async function run(isDev: boolean) { - const port = await getFreePort(); - const cp = isDev - ? exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} dev --port ${port}`, - { cwd: standaloneDir }, - ) - : exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} build && node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} start --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); - return [port, cp.pid] as const; -} - -for (const isDev of [true, false]) { - test.describe(`ssr-catch-error: ${isDev ? 'DEV' : 'PRD'}`, () => { - test.beforeEach(async () => { - // GitHub Action on Windows doesn't support mkdtemp on global temp dir, - // Which will cause files in `src` folder to be empty. - // I don't know why - const tmpDir = process.env.TEMP_DIR ? process.env.TEMP_DIR : tmpdir(); - standaloneDir = await mkdtemp(join(tmpDir, 'waku-ssr-catch-error-')); - await cp(fixtureDir, standaloneDir, { - filter: (src) => { - return !src.includes('node_modules') && !src.includes('dist'); - }, - recursive: true, - }); - execSync(`pnpm pack --pack-destination ${standaloneDir}`, { - cwd: wakuDir, - stdio: 'inherit', - }); - const name = `waku-${version}.tgz`; - execSync(`npm install --force ${join(standaloneDir, name)}`, { - cwd: standaloneDir, - stdio: 'inherit', - }); +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`ssr-catch-error: ${mode}`, () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp(mode)); + }); + test.afterAll(async () => { + await stopApp(); }); test('access top page', async ({ page }) => { - const [port, pid] = await run(isDev); await page.goto(`http://localhost:${port}/`); await expect(page.getByText('Home Page')).toBeVisible(); - await terminate(pid!); }); test('access invalid page through client router', async ({ page }) => { - const [port, pid] = await run(isDev); await page.goto(`http://localhost:${port}/`); await page.getByText('Invalid page').click(); await expect(page.getByText('401')).toBeVisible(); - await terminate(pid!); }); test('access invalid page directly', async ({ page }) => { - const [port, pid] = await run(isDev); await page.goto(`http://localhost:${port}/invalid`); await expect(page.getByText('Unauthorized')).toBeVisible(); - await terminate(pid!); }); }); } diff --git a/e2e/ssr-context-provider.spec.ts b/e2e/ssr-context-provider.spec.ts index 29c97acab..8f0014bbb 100644 --- a/e2e/ssr-context-provider.spec.ts +++ b/e2e/ssr-context-provider.spec.ts @@ -1,53 +1,18 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; +const startApp = prepareNormalSetup('ssr-context-provider'); -const cwd = fileURLToPath( - new URL('./fixtures/ssr-context-provider', import.meta.url), -); - -for (const { build, command } of commands) { - test.describe(`ssr-context-provider: ${command}`, () => { - let cp: ChildProcess; +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`ssr-context-provider: ${mode}`, () => { let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - + let stopApp: () => Promise; test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + ({ port, stopApp } = await startApp(mode)); }); - test.afterAll(async () => { - await terminate(cp.pid!); + await stopApp(); }); test('show context value', async ({ page }) => { diff --git a/e2e/ssr-swr.spec.ts b/e2e/ssr-swr.spec.ts index dc5e64052..5589d5ea8 100644 --- a/e2e/ssr-swr.spec.ts +++ b/e2e/ssr-swr.spec.ts @@ -1,51 +1,18 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { rm } from 'node:fs/promises'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; +const startApp = prepareNormalSetup('ssr-swr'); -const cwd = fileURLToPath(new URL('./fixtures/ssr-swr', import.meta.url)); - -for (const { build, command } of commands) { - test.describe(`ssr-swr: ${command}`, () => { - let cp: ChildProcess; +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`ssr-swr: ${mode}`, () => { let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - + let stopApp: () => Promise; test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + ({ port, stopApp } = await startApp(mode)); }); - test.afterAll(async () => { - await terminate(cp.pid!); + await stopApp(); }); test('increase counter', async ({ page }) => { diff --git a/e2e/ssr-target-bundle.spec.ts b/e2e/ssr-target-bundle.spec.ts index 8eb5110e0..5f5954846 100644 --- a/e2e/ssr-target-bundle.spec.ts +++ b/e2e/ssr-target-bundle.spec.ts @@ -1,59 +1,26 @@ import { expect } from '@playwright/test'; -import { execSync, exec, ChildProcess } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import waitPort from 'wait-port'; -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { readdir, rm } from 'node:fs/promises'; +import { readdir } from 'node:fs/promises'; import path from 'node:path'; -const waku = fileURLToPath( - new URL('../packages/waku/dist/cli.js', import.meta.url), -); +import { test, prepareNormalSetup } from './utils.js'; -const commands = [ - { - command: 'dev', - }, - { - build: 'build', - command: 'start', - }, -]; +const startApp = prepareNormalSetup('ssr-target-bundle'); -const cwd = fileURLToPath( - new URL('./fixtures/ssr-target-bundle', import.meta.url), -); - -for (const { build, command } of commands) { - test.describe(`ssr-target-bundle: ${command}`, () => { - let cp: ChildProcess; +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`ssr-target-bundle: ${mode}`, () => { let port: number; - test.beforeAll('remove cache', async () => { - await rm(`${cwd}/dist`, { - recursive: true, - force: true, - }); - }); - + let stopApp: () => Promise; + let fixtureDir: string; test.beforeAll(async () => { - if (build) { - execSync(`node ${waku} ${build}`, { cwd }); - } - port = await getFreePort(); - cp = exec(`node ${waku} ${command} --port ${port}`, { cwd }); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - await waitPort({ port }); + ({ port, stopApp, fixtureDir } = await startApp(mode)); }); - test.afterAll(async () => { - await terminate(cp.pid!); + await stopApp(); }); test('image exists in folder public/assets', async () => { - test.skip(command.startsWith('dev')); - const imagePath = path.join(cwd, 'dist', 'public', 'assets'); + test.skip(mode === 'DEV'); + const imagePath = path.join(fixtureDir, 'dist', 'public', 'assets'); const files = await readdir(imagePath); const imageExists = files.some((file) => file.startsWith('image-not-inlined-'), @@ -62,8 +29,8 @@ for (const { build, command } of commands) { }); test('json public linked exists in folder public/assets', async () => { - test.skip(command.startsWith('dev')); - const imagePath = path.join(cwd, 'dist', 'public', 'assets'); + test.skip(mode === 'DEV'); + const imagePath = path.join(fixtureDir, 'dist', 'public', 'assets'); const files = await readdir(imagePath); const imageExists = files.some((file) => file.startsWith('json-public-linked-'), @@ -72,8 +39,8 @@ for (const { build, command } of commands) { }); test('json private NOT exists in folder public/assets', async () => { - test.skip(command.startsWith('dev')); - const imagePath = path.join(cwd, 'dist', 'public', 'assets'); + test.skip(mode === 'DEV'); + const imagePath = path.join(fixtureDir, 'dist', 'public', 'assets'); const files = await readdir(imagePath); const imageExists = files.some((file) => file.startsWith('json-private-'), diff --git a/e2e/use-router.spec.ts b/e2e/use-router.spec.ts index 17bc17131..1f7eb7e1f 100644 --- a/e2e/use-router.spec.ts +++ b/e2e/use-router.spec.ts @@ -1,186 +1,125 @@ -import { debugChildProcess, getFreePort, terminate, test } from './utils.js'; -import { fileURLToPath } from 'node:url'; -import { cp, mkdtemp } from 'node:fs/promises'; -import { exec, execSync } from 'node:child_process'; import { expect } from '@playwright/test'; -import waitPort from 'wait-port'; -import { join } from 'node:path'; -import { tmpdir } from 'node:os'; -import { createRequire } from 'node:module'; - -let standaloneDir: string; -const exampleDir = fileURLToPath( - new URL('./fixtures/use-router', import.meta.url), -); -const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); -const { version } = createRequire(import.meta.url)( - join(wakuDir, 'package.json'), -); - -async function start() { - const port = await getFreePort(); - const cp = exec( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} start --port ${port}`, - { cwd: standaloneDir }, - ); - debugChildProcess(cp, fileURLToPath(import.meta.url), [ - /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, - ]); - - await waitPort({ port }); - return [port, cp.pid] as const; -} -test.describe('useRouter', async () => { - test.beforeEach(async () => { - // GitHub Action on Windows doesn't support mkdtemp on global temp dir, - // Which will cause files in `src` folder to be empty. - // I don't know why - const tmpDir = process.env.TEMP_DIR ? process.env.TEMP_DIR : tmpdir(); - standaloneDir = await mkdtemp(join(tmpDir, 'waku-use-router-')); - await cp(exampleDir, standaloneDir, { - filter: (src) => { - return !src.includes('node_modules') && !src.includes('dist'); - }, - recursive: true, - }); - execSync(`pnpm pack --pack-destination ${standaloneDir}`, { - cwd: wakuDir, - stdio: 'inherit', +import { test, prepareStandaloneSetup } from './utils.js'; + +const startApp = prepareStandaloneSetup('use-router'); + +for (const mode of ['DEV', 'PRD'] as const) { + test.describe(`useRouter: ${mode}`, async () => { + let port: number; + let stopApp: () => Promise; + test.beforeAll(async () => { + ({ port, stopApp } = await startApp(mode)); }); - const name = `waku-${version}.tgz`; - execSync(`npm install ${join(standaloneDir, name)}`, { - cwd: standaloneDir, - stdio: 'inherit', + test.afterAll(async () => { + await stopApp(); }); - execSync( - `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} build`, - { - cwd: standaloneDir, - stdio: 'inherit', - }, - ); - }); - test.describe('returns the current path', () => { - test(`on dynamic pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic`); - await expect( - page.getByRole('heading', { name: 'Dynamic' }), - ).toBeVisible(); - await expect(page.getByTestId('path')).toHaveText('Path: /dynamic'); + test.describe('returns the current path', () => { + test(`on dynamic pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic`); + await expect( + page.getByRole('heading', { name: 'Dynamic' }), + ).toBeVisible(); + await expect(page.getByTestId('path')).toHaveText('Path: /dynamic'); + }); - await terminate(pid!); + test(`on static pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/static`); + await expect( + page.getByRole('heading', { name: 'Static' }), + ).toBeVisible(); + await expect(page.getByTestId('path')).toHaveText('Path: /static'); + }); }); - test(`on static pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/static`); - await expect(page.getByRole('heading', { name: 'Static' })).toBeVisible(); - await expect(page.getByTestId('path')).toHaveText('Path: /static'); - await terminate(pid!); - }); - }); + test.describe('updates path on link navigation', () => { + test(`on dynamic pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic`); + await page.click('text=Go to static'); + await expect( + page.getByRole('heading', { name: 'Static' }), + ).toBeVisible(); + await expect(page.getByTestId('path')).toHaveText('Path: /static'); + }); - test.describe('updates path on link navigation', () => { - test(`on dynamic pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic`); - await page.click('text=Go to static'); - await expect(page.getByRole('heading', { name: 'Static' })).toBeVisible(); - await expect(page.getByTestId('path')).toHaveText('Path: /static'); - await terminate(pid!); - }); - test(`on static pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/static`); - await page.click('text=Go to dynamic'); - await expect( - page.getByRole('heading', { name: 'Dynamic' }), - ).toBeVisible(); - await expect(page.getByTestId('path')).toHaveText('Path: /dynamic'); - await terminate(pid!); - }); - test('router.push changes the page', async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic`); - await page.click('text=Static router.push button'); - await expect(page.getByRole('heading', { name: 'Static' })).toBeVisible(); - await expect(page.getByTestId('path')).toHaveText('Path: /static'); - await terminate(pid!); - }); - }); + test(`on static pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/static`); + await page.click('text=Go to dynamic'); + await expect( + page.getByRole('heading', { name: 'Dynamic' }), + ).toBeVisible(); + await expect(page.getByTestId('path')).toHaveText('Path: /dynamic'); + }); - test.describe('retrieves query variables', () => { - test(`on dynamic pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic?count=42`); - await expect(page.getByTestId('query')).toHaveText('Query: 42'); - await terminate(pid!); - }); - test(`on static pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/static?count=42`); - await expect(page.getByTestId('query')).toHaveText('Query: 42'); - await terminate(pid!); + test('router.push changes the page', async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic`); + await page.click('text=Static router.push button'); + await expect( + page.getByRole('heading', { name: 'Static' }), + ).toBeVisible(); + await expect(page.getByTestId('path')).toHaveText('Path: /static'); + }); }); - }); - test.describe('updates query variables', () => { - test(`on dynamic pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic`); - await page.click('text=Increment query'); - await expect(page.getByTestId('query')).toHaveText('Query: 1'); - await page.click('text=Increment query (push)'); - await expect(page.getByTestId('query')).toHaveText('Query: 2'); - await terminate(pid!); - }); - test(`on static pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/static`); - await page.click('text=Increment query'); - await expect(page.getByTestId('query')).toHaveText('Query: 1'); - await page.click('text=Increment query (push)'); - await expect(page.getByTestId('query')).toHaveText('Query: 2'); - await terminate(pid!); - }); - }); + test.describe('retrieves query variables', () => { + test(`on dynamic pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic?count=42`); + await expect(page.getByTestId('query')).toHaveText('Query: 42'); + }); - test.describe('retrieves hashes', () => { - test(`on dynamic pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic#42`); - await expect(page.getByTestId('hash')).toHaveText('Hash: 42'); - await terminate(pid!); + test(`on static pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/static?count=42`); + await expect(page.getByTestId('query')).toHaveText('Query: 42'); + }); }); - test(`on static pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/static#42`); - await expect(page.getByTestId('hash')).toHaveText('Hash: 42'); - await terminate(pid!); + + test.describe('updates query variables', () => { + test(`on dynamic pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic`); + await page.click('text=Increment query'); + await expect(page.getByTestId('query')).toHaveText('Query: 1'); + await page.click('text=Increment query (push)'); + await expect(page.getByTestId('query')).toHaveText('Query: 2'); + }); + + test(`on static pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/static`); + await page.click('text=Increment query'); + await expect(page.getByTestId('query')).toHaveText('Query: 1'); + await page.click('text=Increment query (push)'); + await expect(page.getByTestId('query')).toHaveText('Query: 2'); + }); }); - }); - test.describe('updates hashes', () => { - test(`on dynamic pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/dynamic`); - await page.click('text=Increment hash'); - await expect(page.getByTestId('hash')).toHaveText('Hash: 1'); - await page.click('text=Increment hash (push)'); - await expect(page.getByTestId('hash')).toHaveText('Hash: 2'); - await terminate(pid!); + test.describe('retrieves hashes', () => { + test(`on dynamic pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic#42`); + await expect(page.getByTestId('hash')).toHaveText('Hash: 42'); + }); + + test(`on static pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/static#42`); + await expect(page.getByTestId('hash')).toHaveText('Hash: 42'); + }); }); - test(`on static pages`, async ({ page }) => { - const [port, pid] = await start(); - await page.goto(`http://localhost:${port}/static`); - await page.click('text=Increment hash'); - await expect(page.getByTestId('hash')).toHaveText('Hash: 1'); - await page.click('text=Increment hash (push)'); - await expect(page.getByTestId('hash')).toHaveText('Hash: 2'); - await terminate(pid!); + + test.describe('updates hashes', () => { + test(`on dynamic pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/dynamic`); + await page.click('text=Increment hash'); + await expect(page.getByTestId('hash')).toHaveText('Hash: 1'); + await page.click('text=Increment hash (push)'); + await expect(page.getByTestId('hash')).toHaveText('Hash: 2'); + }); + + test(`on static pages`, async ({ page }) => { + await page.goto(`http://localhost:${port}/static`); + await page.click('text=Increment hash'); + await expect(page.getByTestId('hash')).toHaveText('Hash: 1'); + await page.click('text=Increment hash (push)'); + await expect(page.getByTestId('hash')).toHaveText('Hash: 2'); + }); }); }); -}); +} diff --git a/e2e/utils.ts b/e2e/utils.ts index 6c8993e84..0b4df5fb8 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -1,9 +1,15 @@ import net from 'node:net'; +import { execSync, exec } from 'node:child_process'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; +import { cpSync, rmSync, mkdtempSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import type { ChildProcess } from 'node:child_process'; import { expect, test as basicTest } from '@playwright/test'; import type { ConsoleMessage, Page } from '@playwright/test'; -import type { ChildProcess } from 'node:child_process'; import { error, info } from '@actions/core'; -import { createRequire } from 'node:module'; +import waitPort from 'wait-port'; // Upstream doesn't support ES module // Related: https://github.com/dwyl/terminate/pull/85 @@ -91,3 +97,108 @@ export const test = basicTest.extend<{ page: Page }>({ page.off('console', callback); }, }); + +export const prepareNormalSetup = (fixtureName: string) => { + const waku = fileURLToPath( + new URL('../packages/waku/dist/cli.js', import.meta.url), + ); + const fixtureDir = fileURLToPath( + new URL('./fixtures/' + fixtureName, import.meta.url), + ); + let built = false; + const startApp = async (mode: 'DEV' | 'PRD' | 'STATIC') => { + if (mode !== 'DEV' && !built) { + rmSync(`${fixtureDir}/dist`, { recursive: true, force: true }); + execSync(`node ${waku} build`, { cwd: fixtureDir }); + built = true; + } + const port = await getFreePort(); + let cmd: string; + switch (mode) { + case 'DEV': + cmd = `node ${waku} dev --port ${port}`; + break; + case 'PRD': + cmd = `node ${waku} start --port ${port}`; + break; + case 'STATIC': + cmd = `pnpm serve -l ${port} dist/public`; + break; + } + const cp = exec(cmd, { cwd: fixtureDir }); + debugChildProcess(cp, fileURLToPath(import.meta.url), [ + /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, + ]); + await waitPort({ port }); + const stopApp = async () => { + await terminate(cp.pid!); + }; + return { port, stopApp, fixtureDir }; + }; + return startApp; +}; + +export const prepareStandaloneSetup = (fixtureName: string) => { + const wakuDir = fileURLToPath(new URL('../packages/waku', import.meta.url)); + const { version } = createRequire(import.meta.url)( + join(wakuDir, 'package.json'), + ); + const fixtureDir = fileURLToPath( + new URL('./fixtures/' + fixtureName, import.meta.url), + ); + // GitHub Action on Windows doesn't support mkdtemp on global temp dir, + // Which will cause files in `src` folder to be empty. I don't know why + const tmpDir = process.env.TEMP_DIR || tmpdir(); + let standaloneDir: string | undefined; + let built = false; + const startApp = async (mode: 'DEV' | 'PRD' | 'STATIC') => { + if (!standaloneDir) { + standaloneDir = mkdtempSync(join(tmpDir, fixtureName)); + cpSync(fixtureDir, standaloneDir, { + filter: (src) => { + return !src.includes('node_modules') && !src.includes('dist'); + }, + recursive: true, + }); + execSync(`pnpm pack --pack-destination ${standaloneDir}`, { + cwd: wakuDir, + stdio: 'inherit', + }); + execSync( + `npm install --force ${join(standaloneDir, `waku-${version}.tgz`)}`, + { cwd: standaloneDir, stdio: 'inherit' }, + ); + } + if (mode !== 'DEV' && !built) { + rmSync(`${standaloneDir}/dist`, { recursive: true, force: true }); + execSync( + `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} build`, + { cwd: standaloneDir }, + ); + built = true; + } + const port = await getFreePort(); + let cmd: string; + switch (mode) { + case 'DEV': + cmd = `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} dev --port ${port}`; + break; + case 'PRD': + cmd = `node ${join(standaloneDir, './node_modules/waku/dist/cli.js')} start --port ${port}`; + break; + case 'STATIC': + cmd = `node ${join(standaloneDir, './node_modules/serve/build/main.js')} dist/public -p ${port}`; + break; + } + const cp = exec(cmd, { cwd: standaloneDir }); + debugChildProcess(cp, fileURLToPath(import.meta.url), [ + /ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time/, + ]); + await waitPort({ port }); + const stopApp = async () => { + await terminate(cp.pid!); + }; + return { port, stopApp, standaloneDir }; + }; + return startApp; +}; diff --git a/examples/01_template/package.json b/examples/01_template/package.json index efd834623..2280633a7 100644 --- a/examples/01_template/package.json +++ b/examples/01_template/package.json @@ -12,13 +12,13 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "autoprefixer": "10.4.20", - "tailwindcss": "3.4.16", + "tailwindcss": "3.4.17", "typescript": "5.7.2" } } diff --git a/examples/02_template_js/package.json b/examples/02_template_js/package.json index 0067cef83..9fe82f84f 100644 --- a/examples/02_template_js/package.json +++ b/examples/02_template_js/package.json @@ -12,10 +12,10 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { "autoprefixer": "10.4.20", - "tailwindcss": "3.4.16" + "tailwindcss": "3.4.17" } } diff --git a/examples/03_demo/package.json b/examples/03_demo/package.json index 8c2e896ee..c3abdadfe 100644 --- a/examples/03_demo/package.json +++ b/examples/03_demo/package.json @@ -12,13 +12,13 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "autoprefixer": "10.4.20", - "tailwindcss": "3.4.16", + "tailwindcss": "3.4.17", "typescript": "5.7.2" } } diff --git a/examples/04_cssmodules/package.json b/examples/04_cssmodules/package.json index 8eb4795ca..20fc5cb89 100644 --- a/examples/04_cssmodules/package.json +++ b/examples/04_cssmodules/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/11_fs-router/package.json b/examples/11_fs-router/package.json index 1dc434642..6bb76fade 100644 --- a/examples/11_fs-router/package.json +++ b/examples/11_fs-router/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/12_nossr/package.json b/examples/12_nossr/package.json index f49cf41b3..79b358c29 100644 --- a/examples/12_nossr/package.json +++ b/examples/12_nossr/package.json @@ -12,13 +12,13 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "autoprefixer": "10.4.20", - "tailwindcss": "3.4.16", + "tailwindcss": "3.4.17", "typescript": "5.7.2", "vite": "5.4.10" } diff --git a/examples/21_create-pages/package.json b/examples/21_create-pages/package.json index d392c849e..949da1fb9 100644 --- a/examples/21_create-pages/package.json +++ b/examples/21_create-pages/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "server-only": "0.0.1", "typescript": "5.7.2" } diff --git a/examples/21_create-pages/src/components/DeeplyNestedLayout.tsx b/examples/21_create-pages/src/components/DeeplyNestedLayout.tsx new file mode 100644 index 000000000..05a2380c7 --- /dev/null +++ b/examples/21_create-pages/src/components/DeeplyNestedLayout.tsx @@ -0,0 +1,12 @@ +export const DeeplyNestedLayout = ({ + children, +}: { + children: React.ReactNode; +}) => { + return ( +
+

Deeply Nested Layout

+ {children} +
+ ); +}; diff --git a/examples/21_create-pages/src/components/funcs.ts b/examples/21_create-pages/src/components/funcs.ts index 1d4499b15..1f0682be0 100644 --- a/examples/21_create-pages/src/components/funcs.ts +++ b/examples/21_create-pages/src/components/funcs.ts @@ -2,14 +2,7 @@ import { unstable_rerenderRoute } from 'waku/router/server'; -const PAGES = [ - '/foo', - '/bar', - '/baz', - '/nested/qux', - '/nested/aaa', - '/nested/bbb', -]; +const PAGES = ['/bar', '/baz', '/nested/qux', '/nested/aaa', '/nested/bbb']; export const jump = async () => { const page = PAGES[Math.floor(Math.random() * PAGES.length)] as string; diff --git a/examples/21_create-pages/src/entries.tsx b/examples/21_create-pages/src/entries.tsx index ccebc3829..f778290d7 100644 --- a/examples/21_create-pages/src/entries.tsx +++ b/examples/21_create-pages/src/entries.tsx @@ -9,6 +9,7 @@ import NestedBazPage from './components/NestedBazPage'; import NestedQuxPage from './components/NestedQuxPage'; import Root from './components/Root'; import NestedLayout from './components/NestedLayout'; +import { DeeplyNestedLayout } from './components/DeeplyNestedLayout'; const pages = createPages(async ({ createPage, createLayout, createRoot }) => [ createRoot({ @@ -77,6 +78,23 @@ const pages = createPages(async ({ createPage, createLayout, createRoot }) => [ ), }), + createPage({ + render: 'dynamic', + path: '/wild/[...id]', + component: ({ id }) => ( + <> +

Wildcard

+

Slug: {id.join('/')}

+ + ), + }), + + createLayout({ + render: 'static', + path: '/nested/[id]', + component: DeeplyNestedLayout, + }), + createPage({ render: 'dynamic', path: '/nested/[id]', diff --git a/examples/22_define-router/package.json b/examples/22_define-router/package.json index 18b75a3d7..f5eff94bf 100644 --- a/examples/22_define-router/package.json +++ b/examples/22_define-router/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/31_minimal/package.json b/examples/31_minimal/package.json index c4fb4b807..3b5b6ae8a 100644 --- a/examples/31_minimal/package.json +++ b/examples/31_minimal/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/32_minimal_js/package.json b/examples/32_minimal_js/package.json index a7ba834c8..3531a2086 100644 --- a/examples/32_minimal_js/package.json +++ b/examples/32_minimal_js/package.json @@ -12,6 +12,6 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" } } diff --git a/examples/33_promise/package.json b/examples/33_promise/package.json index 0c1672b41..c6f7509e1 100644 --- a/examples/33_promise/package.json +++ b/examples/33_promise/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/34_functions/package.json b/examples/34_functions/package.json index f6316bdfe..9236e58e6 100644 --- a/examples/34_functions/package.json +++ b/examples/34_functions/package.json @@ -13,11 +13,11 @@ "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", "react-wrap-balancer": "1.1.1", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/35_nesting/package.json b/examples/35_nesting/package.json index ac3a49f5f..2cbd9e2a7 100644 --- a/examples/35_nesting/package.json +++ b/examples/35_nesting/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/36_form/package.json b/examples/36_form/package.json index 8b821cb86..3a9de61ef 100644 --- a/examples/36_form/package.json +++ b/examples/36_form/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/37_css/package.json b/examples/37_css/package.json index f221b641a..67dea031f 100644 --- a/examples/37_css/package.json +++ b/examples/37_css/package.json @@ -10,16 +10,16 @@ }, "dependencies": { "@stylexjs/stylex": "0.9.3", - "@vanilla-extract/css": "1.16.1", + "@vanilla-extract/css": "1.17.0", "classnames": "2.3.2", "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "@vanilla-extract/vite-plugin": "4.0.18", "typescript": "5.7.2", "vite": "5.4.10", diff --git a/examples/38_cookies/package.json b/examples/38_cookies/package.json index 595b2bff2..645a74002 100644 --- a/examples/38_cookies/package.json +++ b/examples/38_cookies/package.json @@ -10,17 +10,17 @@ }, "dependencies": { "cookie": "1.0.2", - "hono": "4.6.13", + "hono": "4.6.14", "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { "@types/cookie": "1.0.0", - "@types/node": "22.10.1", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/node": "22.10.2", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/39_api/package.json b/examples/39_api/package.json index eeb3d999e..1ab87e82a 100644 --- a/examples/39_api/package.json +++ b/examples/39_api/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2" } } diff --git a/examples/41_path-alias/package.json b/examples/41_path-alias/package.json index b0d037aed..740a0fd1f 100644 --- a/examples/41_path-alias/package.json +++ b/examples/41_path-alias/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "typescript": "5.7.2", "vite": "5.4.10", "vite-tsconfig-paths": "5.1.4" diff --git a/examples/42_react-tweet/package.json b/examples/42_react-tweet/package.json index b01f1ec52..c6076a40a 100644 --- a/examples/42_react-tweet/package.json +++ b/examples/42_react-tweet/package.json @@ -13,13 +13,13 @@ "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", "react-tweet": "^3.2.1", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "autoprefixer": "10.4.20", - "tailwindcss": "3.4.16", + "tailwindcss": "3.4.17", "typescript": "5.7.2" } } diff --git a/examples/43_weave-render/package.json b/examples/43_weave-render/package.json index 2da58cb4a..097820494 100644 --- a/examples/43_weave-render/package.json +++ b/examples/43_weave-render/package.json @@ -12,11 +12,11 @@ "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8" + "waku": "0.21.10" }, "devDependencies": { - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", "server-only": "0.0.1", "typescript": "5.7.2" } diff --git a/examples/44_cloudflare/package.json b/examples/44_cloudflare/package.json index 9ad3efa82..fcc71eaf7 100644 --- a/examples/44_cloudflare/package.json +++ b/examples/44_cloudflare/package.json @@ -10,18 +10,18 @@ "start": "waku start" }, "dependencies": { - "hono": "4.6.13", + "hono": "4.6.14", "react": "19.0.0", "react-dom": "19.0.0", "react-server-dom-webpack": "19.0.0", - "waku": "0.21.8", - "wrangler": "3.93.0" + "waku": "0.21.10", + "wrangler": "3.99.0" }, "devDependencies": { - "@types/node": "22.10.1", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", - "miniflare": "3.20241205.0", + "@types/node": "22.10.2", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", + "miniflare": "3.20241218.0", "typescript": "5.7.2" } } diff --git a/package.json b/package.json index ce1c76a2a..14bb514cd 100644 --- a/package.json +++ b/package.json @@ -28,13 +28,13 @@ }, "devDependencies": { "@actions/core": "^1.11.1", - "@playwright/test": "^1.49.0", + "@playwright/test": "^1.49.1", "@types/babel__core": "^7.20.5", - "@types/node": "^22.10.1", - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", + "@types/node": "^22.10.2", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "@typescript-eslint/eslint-plugin": "^8.18.1", + "@typescript-eslint/parser": "^8.18.1", "eslint": "8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.7.0", diff --git a/packages/create-waku/package.json b/packages/create-waku/package.json index baddbffbb..65533802b 100644 --- a/packages/create-waku/package.json +++ b/packages/create-waku/package.json @@ -1,6 +1,6 @@ { "name": "create-waku", - "version": "0.10.7", + "version": "0.11.0-0.21.10-0", "author": "Daishi Kato", "type": "module", "contributors": [ diff --git a/packages/waku/package.json b/packages/waku/package.json index 14cf447ca..86d42684e 100644 --- a/packages/waku/package.json +++ b/packages/waku/package.json @@ -1,7 +1,7 @@ { "name": "waku", "description": "⛩️ The minimal React framework", - "version": "0.21.8", + "version": "0.21.10", "type": "module", "author": "Daishi Kato", "homepage": "https://waku.gg", @@ -87,17 +87,17 @@ }, "dependencies": { "@hono/node-server": "1.13.7", - "@swc/core": "1.10.0", + "@swc/core": "1.10.1", "@vitejs/plugin-react": "4.3.4", "dotenv": "16.4.7", - "hono": "4.6.13", + "hono": "4.6.14", "rsc-html-stream": "0.0.4", "vite": "5.4.10" }, "devDependencies": { - "@netlify/functions": "^2.8.2", + "@netlify/functions": "^3.0.0", "@swc/cli": "^0.5.2", - "rollup": "^4.28.1", + "rollup": "^4.29.1", "ts-expect": "^1.3.0", "vitest": "^2.1.8" }, diff --git a/packages/waku/src/lib/builder/build.ts b/packages/waku/src/lib/builder/build.ts index 16a0bb1d8..38d7cd788 100644 --- a/packages/waku/src/lib/builder/build.ts +++ b/packages/waku/src/lib/builder/build.ts @@ -431,15 +431,16 @@ const willEmitPublicIndexHtml = async ( return false; } const utils = { - renderRsc: () => { + renderRsc: async () => { throw new Error('Cannot render RSC in HTML build'); }, - renderHtml: () => { + renderHtml: async () => { + const body: ReadableStream & { allReady: Promise } = + // HACK this might not work in an edge case + stringToStream('DUMMY') as never; + body.allReady = Promise.resolve(); const headers = { 'content-type': 'text/html; charset=utf-8' }; - return { - body: stringToStream('DUMMY'), // HACK this might not work in an edge case - headers, - }; + return { body, headers }; }, }; const input = { @@ -604,12 +605,12 @@ const emitStaticFiles = async ( const utils = { renderRsc: (elements: Record) => renderRsc(config, { unstable_modules }, elements), - renderHtml: ( + renderHtml: async ( elements: Record, html: ReactNode, rscPath: string, ) => { - const readable = renderHtml( + const body = await renderHtml( config, { unstable_modules }, htmlHead, @@ -617,11 +618,9 @@ const emitStaticFiles = async ( html, rscPath, ); + await body.allReady; // always wait for all contents for static files const headers = { 'content-type': 'text/html; charset=utf-8' }; - return { - body: readable, - headers, - }; + return { body, headers }; }, }; const input = { diff --git a/packages/waku/src/lib/hono/ctx.ts b/packages/waku/src/lib/hono/ctx.ts index 416d6127c..00f8d2420 100644 --- a/packages/waku/src/lib/hono/ctx.ts +++ b/packages/waku/src/lib/hono/ctx.ts @@ -1,7 +1,6 @@ import type { Context, Env } from 'hono'; -// This can't be relative import -import { getContextData } from 'waku/middleware/context'; +import { getContextData } from '../middleware/context.js'; // Internal context key const HONO_CONTEXT = '__hono_context'; diff --git a/packages/waku/src/lib/middleware/context.ts b/packages/waku/src/lib/middleware/context.ts index 2e2b582dc..a1de4ff3f 100644 --- a/packages/waku/src/lib/middleware/context.ts +++ b/packages/waku/src/lib/middleware/context.ts @@ -8,11 +8,17 @@ type Context = { readonly data: Record; }; -let contextStorage: AsyncLocalStorageType | undefined; +const setContextStorage = (storage: AsyncLocalStorageType) => { + (globalThis as any).__WAKU_MIDDLEWARE_CONTEXT_STORAGE__ ||= storage; +}; + +const getContextStorage = (): AsyncLocalStorageType => { + return (globalThis as any).__WAKU_MIDDLEWARE_CONTEXT_STORAGE__; +}; try { const { AsyncLocalStorage } = await import('node:async_hooks'); - contextStorage = new AsyncLocalStorage(); + setContextStorage(new AsyncLocalStorage()); } catch { console.warn('AsyncLocalStorage is not available'); } @@ -21,6 +27,7 @@ let previousContext: Context | undefined; let currentContext: Context | undefined; const runWithContext = (context: Context, fn: () => T): T => { + const contextStorage = getContextStorage(); if (contextStorage) { return contextStorage.run(context, fn); } @@ -44,6 +51,7 @@ export const context: Middleware = () => { }; export function getContext() { + const contextStorage = getContextStorage(); const context = contextStorage?.getStore() ?? currentContext; if (!context) { throw new Error( @@ -54,6 +62,7 @@ export function getContext() { } export function getContextData(): Record { + const contextStorage = getContextStorage(); const context = contextStorage?.getStore() ?? currentContext; if (!context) { return {}; diff --git a/packages/waku/src/lib/middleware/dev-server-impl.ts b/packages/waku/src/lib/middleware/dev-server-impl.ts index 22f8852d5..f08cb7994 100644 --- a/packages/waku/src/lib/middleware/dev-server-impl.ts +++ b/packages/waku/src/lib/middleware/dev-server-impl.ts @@ -245,7 +245,6 @@ const createRscViteServer = ( conditions: ['react-server'], externalConditions: ['react-server'], }, - external: ['waku/middleware/context'], noExternal: /^(?!node:)/, optimizeDeps: { include: [ diff --git a/packages/waku/src/lib/middleware/handler.ts b/packages/waku/src/lib/middleware/handler.ts index 5bbce1525..fc443fb13 100644 --- a/packages/waku/src/lib/middleware/handler.ts +++ b/packages/waku/src/lib/middleware/handler.ts @@ -125,13 +125,13 @@ export const handler: Middleware = (options) => { const utils = { renderRsc: (elements: Record) => renderRsc(config, ctx, elements), - renderHtml: ( + renderHtml: async ( elements: Record, html: ReactNode, rscPath: string, actionResult?: unknown, ) => { - const readable = renderHtml( + const readable = await renderHtml( config, ctx, htmlHead, @@ -141,12 +141,12 @@ export const handler: Middleware = (options) => { actionResult, ); const headers = { 'content-type': 'text/html; charset=utf-8' }; - return { - body: transformIndexHtml - ? readable.pipeThrough(transformIndexHtml) - : readable, - headers, - }; + let body = readable; + if (transformIndexHtml) { + body = readable.pipeThrough(transformIndexHtml) as never; + body.allReady = readable.allReady; + } + return { body, headers }; }, }; const input = await getInput(config, ctx, loadServerModule); diff --git a/packages/waku/src/lib/plugins/vite-plugin-rsc-hmr.ts b/packages/waku/src/lib/plugins/vite-plugin-rsc-hmr.ts index eea3daf85..adaeee796 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-rsc-hmr.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-rsc-hmr.ts @@ -124,8 +124,8 @@ export function rscHmrPlugin(): Plugin { ` { const refetchRoute = () => { - cachedIdSet.clear(); staticPathSet.clear(); + routerData[2].clear(); // cacheIdSet const rscPath = encodeRoutePath(route.path); const rscParams = createRscParams(route.query, []); refetch(rscPath, rscParams); @@ -225,28 +225,17 @@ async function generateInitialScripts( const scripts: HtmlTagDescriptor[] = []; for (const result of sources.values()) { - if (result.id.endsWith('.module.css')) { - // CSS modules do not support result.source (empty) since ssr-transforming them gives the css keys and client-transforming them gives the script tag for injecting them. - // Since we use the client-transformed script tag, we need to avoid FOUC by blocking render - scripts.push({ - tag: 'script', - attrs: { - type: 'module', - async: true, - blocking: 'render', - 'waku-module-id': result.id, - }, - children: result.code, - injectTo: 'head', - }); - } else { - scripts.push({ - tag: 'style', - attrs: { type: 'text/css', 'waku-module-id': result.id }, - children: result.source, - injectTo: 'head', - }); - } + scripts.push({ + tag: 'script', + attrs: { + type: 'module', + async: true, + blocking: 'render', + 'waku-module-id': result.id, + }, + children: result.code, + injectTo: 'head', + }); } return scripts; } diff --git a/packages/waku/src/lib/plugins/vite-plugin-rsc-index.ts b/packages/waku/src/lib/plugins/vite-plugin-rsc-index.ts index 46b20feb3..b239df7cf 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-rsc-index.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-rsc-index.ts @@ -2,7 +2,8 @@ import type { Plugin } from 'vite'; import { SRC_MAIN } from '../constants.js'; -export const DEFAULT_HTML_HEAD = ` +// This should be consistent with the one in renderers/html.ts +const DEFAULT_HTML_HEAD = ` diff --git a/packages/waku/src/lib/renderers/html.ts b/packages/waku/src/lib/renderers/html.ts index 29a52d942..23b7ae321 100644 --- a/packages/waku/src/lib/renderers/html.ts +++ b/packages/waku/src/lib/renderers/html.ts @@ -7,15 +7,22 @@ import { injectRSCPayload } from 'rsc-html-stream/server'; import type * as WakuMinimalClientType from '../../minimal/client.js'; import type { PureConfig } from '../config.js'; import { SRC_MAIN } from '../constants.js'; -import { concatUint8Arrays, streamFromPromise } from '../utils/stream.js'; +import { concatUint8Arrays } from '../utils/stream.js'; import { filePathToFileURL } from '../utils/path.js'; import { encodeRscPath } from './utils.js'; import { renderRsc, renderRscElement, getExtractFormState } from './rsc.js'; // TODO move types somewhere import type { HandlerContext } from '../middleware/types.js'; -// HACK depending on these constants is not ideal -import { DEFAULT_HTML_HEAD } from '../plugins/vite-plugin-rsc-index.js'; +// This should be consistent with the one in vite-plugin-rsc-index.ts +const DEFAULT_HTML_HEAD = [ + createElement('meta', { charSet: 'utf-8' }), + createElement('meta', { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }), + createElement('meta', { name: 'generator', content: 'Waku' }), +]; type Elements = Record; @@ -56,11 +63,7 @@ const injectHtmlHead = ( data.slice(0, closingHeadIndex + CLOSING_HEAD.length), data.slice(closingHeadIndex + CLOSING_HEAD.length), ]; - head = - head.slice(0, -CLOSING_HEAD.length) + - DEFAULT_HTML_HEAD + - htmlHead + - CLOSING_HEAD; + head = head.slice(0, -CLOSING_HEAD.length) + htmlHead + CLOSING_HEAD; const matchPrefetched = head.match( // HACK This is very brittle /(.*]*>\nglobalThis\.__WAKU_PREFETCHED__ = {\n)(.*?)(\n};.*)/s, @@ -158,7 +161,7 @@ const rectifyHtml = () => { }); }; -export function renderHtml( +export async function renderHtml( config: PureConfig, ctx: Pick, htmlHead: string, @@ -166,7 +169,7 @@ export function renderHtml( html: ReactNode, rscPath: string, actionResult?: unknown, -): ReadableStream { +): Promise }> { const modules = ctx.unstable_modules; if (!modules) { throw new Error('handler middleware required (missing modules)'); @@ -180,7 +183,7 @@ export function renderHtml( const { ServerRootInternal: ServerRoot } = modules.wakuMinimalClient as typeof WakuMinimalClientType; - const stream = renderRsc(config, ctx, elements); + const stream = await renderRsc(config, ctx, elements); const htmlStream = renderRscElement(config, ctx, html); const isDev = !!ctx.unstable_devServer; const moduleMap = new Proxy( @@ -220,28 +223,26 @@ export function renderHtml( const htmlNode: Promise = createFromReadableStream(htmlStream, { serverConsumerManifest: { moduleMap, moduleLoading: null }, }); - const readable = streamFromPromise( - (actionResult === undefined - ? Promise.resolve(null) - : getExtractFormState(ctx)(actionResult) - ).then((formState) => - renderToReadableStream( - createElement( - ServerRoot as FunctionComponent< - Omit, 'children'> - >, - { elements: elementsPromise }, - htmlNode as any, - ), - { - formState, - onError(err: unknown) { - console.error(err); - }, - }, - ), + const readable = await renderToReadableStream( + createElement( + ServerRoot as FunctionComponent< + Omit, 'children'> + >, + { elements: elementsPromise }, + ...DEFAULT_HTML_HEAD, + htmlNode as any, ), - ) + { + formState: + actionResult === undefined + ? null + : await getExtractFormState(ctx)(actionResult), + onError(err: unknown) { + console.error(err); + }, + }, + ); + const injected: ReadableStream & { allReady?: Promise } = readable .pipeThrough(rectifyHtml()) .pipeThrough( injectHtmlHead( @@ -251,5 +252,6 @@ export function renderHtml( ), ) .pipeThrough(injectRSCPayload(stream2)); - return readable; + injected.allReady = readable.allReady; + return injected as never; } diff --git a/packages/waku/src/lib/renderers/rsc.ts b/packages/waku/src/lib/renderers/rsc.ts index d48fc8271..4716dfcc3 100644 --- a/packages/waku/src/lib/renderers/rsc.ts +++ b/packages/waku/src/lib/renderers/rsc.ts @@ -12,12 +12,12 @@ const resolveClientEntryForPrd = (id: string, config: { basePath: string }) => { return config.basePath + id + '.js'; }; -export function renderRsc( +export async function renderRsc( config: PureConfig, ctx: Pick, elements: Record, moduleIdCallback?: (id: string) => void, -): ReadableStream { +): Promise { const modules = ctx.unstable_modules; if (!modules) { throw new Error('handler middleware required (missing modules)'); diff --git a/packages/waku/src/lib/types.ts b/packages/waku/src/lib/types.ts index e55e7e759..e96b50d80 100644 --- a/packages/waku/src/lib/types.ts +++ b/packages/waku/src/lib/types.ts @@ -24,16 +24,16 @@ export type HandleRequest = ( req: HandlerReq; }, utils: { - renderRsc: (elements: Record) => ReadableStream; + renderRsc: (elements: Record) => Promise; renderHtml: ( elements: Elements, html: ReactNode, rscPath: string, actionResult?: unknown, - ) => { - body: ReadableStream; + ) => Promise<{ + body: ReadableStream & { allReady: Promise }; headers: Record<'content-type', string>; - }; + }>; }, ) => Promise; diff --git a/packages/waku/src/lib/utils/path.ts b/packages/waku/src/lib/utils/path.ts index ff8842b4b..5aaf52ee3 100644 --- a/packages/waku/src/lib/utils/path.ts +++ b/packages/waku/src/lib/utils/path.ts @@ -105,6 +105,24 @@ export const path2regexp = (path: PathSpec) => { return `^/${parts.join('/')}$`; }; +/** Convert a path spec to a string for the path */ +export const pathSpecAsString = (path: PathSpec) => { + return ( + '/' + + path + .map(({ type, name }) => { + if (type === 'literal') { + return name; + } else if (type === 'group') { + return `[${name}]`; + } else { + return `[...${name}]`; + } + }) + .join('/') + ); +}; + /** * Helper function to get the path mapping from the path spec and the pathname. * diff --git a/packages/waku/src/lib/utils/stream.ts b/packages/waku/src/lib/utils/stream.ts index 1e32da6cc..5dfa4f152 100644 --- a/packages/waku/src/lib/utils/stream.ts +++ b/packages/waku/src/lib/utils/stream.ts @@ -66,23 +66,3 @@ export const stringToStream = (str: string): ReadableStream => { }, }); }; - -export const streamFromPromise = (promise: Promise) => - new ReadableStream({ - async start(controller) { - try { - const stream = await promise; - const reader = stream.getReader(); - let result: ReadableStreamReadResult; - do { - result = await reader.read(); - if (result.value) { - controller.enqueue(result.value); - } - } while (!result.done); - controller.close(); - } catch (err) { - controller.error(err); - } - }, - }); diff --git a/packages/waku/src/minimal/client.ts b/packages/waku/src/minimal/client.ts index f80de088c..17a85dbe5 100644 --- a/packages/waku/src/minimal/client.ts +++ b/packages/waku/src/minimal/client.ts @@ -77,6 +77,7 @@ const mergeElements = (a: Elements, b: Elements): Elements => { }; type SetElements = (updater: (prev: Elements) => Elements) => void; +type EnhanceFetch = (fetchFn: typeof fetch) => typeof fetch; type EnhanceCreateData = ( createData: ( responsePromise: Promise, @@ -85,11 +86,13 @@ type EnhanceCreateData = ( const ENTRY = 'e'; const SET_ELEMENTS = 's'; +const ENHANCE_FETCH = 'f'; const ENHANCE_CREATE_DATA = 'd'; type FetchCache = { [ENTRY]?: [rscPath: string, rscParams: unknown, elements: Elements]; [SET_ELEMENTS]?: SetElements; + [ENHANCE_FETCH]?: EnhanceFetch | undefined; [ENHANCE_CREATE_DATA]?: EnhanceCreateData | undefined; }; @@ -104,6 +107,7 @@ export const callServerRsc = async ( args: unknown[], fetchCache = defaultFetchCache, ) => { + const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f) => f); const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d) => d); const createData = (responsePromise: Promise) => createFromFetch>(checkStatus(responsePromise), { @@ -113,8 +117,10 @@ export const callServerRsc = async ( const url = BASE_PATH + encodeRscPath(encodeFuncId(funcId)); const responsePromise = args.length === 1 && args[0] instanceof URLSearchParams - ? fetch(url + '?' + args[0]) - : encodeReply(args).then((body) => fetch(url, { method: 'POST', body })); + ? enhanceFetch(fetch)(url + '?' + args[0]) + : encodeReply(args).then((body) => + enhanceFetch(fetch)(url, { method: 'POST', body }), + ); const data = enhanceCreateData(createData)(responsePromise); // FIXME this causes rerenders even if data is empty fetchCache[SET_ELEMENTS]?.((prev) => mergeElements(prev, data)); @@ -123,14 +129,20 @@ export const callServerRsc = async ( const prefetchedParams = new WeakMap, unknown>(); -const fetchRscInternal = (url: string, rscParams: unknown) => - rscParams === undefined - ? fetch(url) +const fetchRscInternal = ( + url: string, + rscParams: unknown, + fetchCache: FetchCache, +) => { + const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f) => f); + return rscParams === undefined + ? enhanceFetch(fetch)(url) : rscParams instanceof URLSearchParams - ? fetch(url + '?' + rscParams) + ? enhanceFetch(fetch)(url + '?' + rscParams) : encodeReply(rscParams).then((body) => - fetch(url, { method: 'POST', body }), + enhanceFetch(fetch)(url, { method: 'POST', body }), ); +}; export const fetchRsc = ( rscPath: string, @@ -157,7 +169,7 @@ export const fetchRsc = ( prefetchedParams.get(prefetched[url]) === rscParams); const responsePromise = hasValidPrefetchedResponse ? prefetched[url] - : fetchRscInternal(url, rscParams); + : fetchRscInternal(url, rscParams, fetchCache); delete prefetched[url]; const data = enhanceCreateData(createData)(responsePromise); // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -165,11 +177,15 @@ export const fetchRsc = ( return data; }; -export const prefetchRsc = (rscPath: string, rscParams?: unknown): void => { +export const prefetchRsc = ( + rscPath: string, + rscParams?: unknown, + fetchCache = defaultFetchCache, +): void => { const prefetched = ((globalThis as any).__WAKU_PREFETCHED__ ||= {}); const url = BASE_PATH + encodeRscPath(rscPath); if (!(url in prefetched)) { - prefetched[url] = fetchRscInternal(url, rscParams); + prefetched[url] = fetchRscInternal(url, rscParams, fetchCache); prefetchedParams.set(prefetched[url], rscParams); } }; @@ -185,15 +201,18 @@ export const Root = ({ initialRscPath, initialRscParams, fetchCache = defaultFetchCache, + unstable_enhanceFetch, unstable_enhanceCreateData, children, }: { initialRscPath?: string; initialRscParams?: unknown; fetchCache?: FetchCache; + unstable_enhanceFetch?: EnhanceFetch; unstable_enhanceCreateData?: EnhanceCreateData; children: ReactNode; }) => { + fetchCache[ENHANCE_FETCH] = unstable_enhanceFetch; fetchCache[ENHANCE_CREATE_DATA] = unstable_enhanceCreateData; const [elements, setElements] = useState(() => fetchRsc(initialRscPath || '', initialRscParams, fetchCache), diff --git a/packages/waku/src/router/client.ts b/packages/waku/src/router/client.ts index eb645d38e..6d8ced9ed 100644 --- a/packages/waku/src/router/client.ts +++ b/packages/waku/src/router/client.ts @@ -34,6 +34,7 @@ import { ROUTE_ID, IS_STATIC_ID, HAS404_ID, + SKIP_HEADER, } from './common.js'; import type { RouteProps } from './common.js'; import type { RouteConfig } from './base-types.js'; @@ -75,21 +76,14 @@ const parseRouteFromLocation = (): RouteProps => { return parseRoute(new URL(window.location.href)); }; -let savedRscParams: - | [query: string, skipStr: string, rscParams: URLSearchParams] - | undefined; - -const createRscParams = (query: string, skip: string[]): URLSearchParams => { - const skipStr = JSON.stringify(skip); - if ( - savedRscParams && - savedRscParams[0] === query && - savedRscParams[1] === skipStr - ) { - return savedRscParams[2]; +let savedRscParams: [query: string, rscParams: URLSearchParams] | undefined; + +const createRscParams = (query: string): URLSearchParams => { + if (savedRscParams && savedRscParams[0] === query) { + return savedRscParams[1]; } - const rscParams = new URLSearchParams({ query, skip: skipStr }); - savedRscParams = [query, skipStr, rscParams]; + const rscParams = new URLSearchParams({ query }); + savedRscParams = [query, rscParams]; return rscParams; }; @@ -326,7 +320,7 @@ const InnerRouter = ({ routerData: Required; initialRoute: RouteProps; }) => { - const [cachedIdSet, staticPathSet, locationListeners] = routerData; + const [locationListeners, staticPathSet] = routerData; const refetch = useRefetch(); const [route, setRoute] = useState(() => ({ // This is the first initialization of the route, and it has @@ -355,15 +349,14 @@ const InnerRouter = ({ const { skipRefetch } = options || {}; startTransition(() => { if (!staticPathSet.has(route.path) && !skipRefetch) { - const skip = Array.from(cachedIdSet); const rscPath = encodeRoutePath(route.path); - const rscParams = createRscParams(route.query, skip); + const rscParams = createRscParams(route.query); refetch(rscPath, rscParams); } setRoute(route); }); }, - [refetch, cachedIdSet, staticPathSet], + [refetch, staticPathSet], ); const prefetchRoute: PrefetchRoute = useCallback( @@ -371,13 +364,12 @@ const InnerRouter = ({ if (staticPathSet.has(route.path)) { return; } - const skip = Array.from(cachedIdSet); const rscPath = encodeRoutePath(route.path); - const rscParams = createRscParams(route.query, skip); + const rscParams = createRscParams(route.query); prefetchRsc(rscPath, rscParams); (globalThis as any).__WAKU_ROUTER_PREFETCH__?.(route.path); }, - [cachedIdSet, staticPathSet], + [staticPathSet], ); useEffect(() => { @@ -446,9 +438,9 @@ const InnerRouter = ({ // Note: The router data must be a stable mutable object (array). type RouterData = [ - cachedIdSet?: Set, - staticPathSet?: Set, locationListeners?: Set<(path: string, query: string) => void>, + staticPathSet?: Set, + cachedIdSet?: Set, has404?: boolean, ]; @@ -459,10 +451,22 @@ export function Router({ initialRoute = parseRouteFromLocation(), }) { const initialRscPath = encodeRoutePath(initialRoute.path); - const cachedIdSet = (routerData[0] ||= new Set()); + const locationListeners = (routerData[0] ||= new Set()); const staticPathSet = (routerData[1] ||= new Set()); - const locationListeners = (routerData[2] ||= new Set()); + const cachedIdSet = (routerData[2] ||= new Set()); const has404 = (routerData[3] ||= false); + const unstable_enhanceFetch = + (fetchFn: typeof fetch) => + (input: RequestInfo | URL, init: RequestInit = {}) => { + const skipStr = JSON.stringify(Array.from(cachedIdSet)); + const headers = (init.headers ||= {}); + if (Array.isArray(headers)) { + headers.push([SKIP_HEADER, skipStr]); + } else { + (headers as Record)[SKIP_HEADER] = skipStr; + } + return fetchFn(input, init); + }; const unstable_enhanceCreateData = ( createData: ( @@ -511,13 +515,18 @@ export function Router({ .catch(() => {}); return data; }; - const initialRscParams = createRscParams(initialRoute.query, []); + const initialRscParams = createRscParams(initialRoute.query); return createElement( ErrorBoundary, null, createElement( Root as FunctionComponent, 'children'>>, - { initialRscPath, initialRscParams, unstable_enhanceCreateData }, + { + initialRscPath, + initialRscParams, + unstable_enhanceFetch, + unstable_enhanceCreateData, + }, createElement(InnerRouter, { routerData: routerData as Required, initialRoute, diff --git a/packages/waku/src/router/common.ts b/packages/waku/src/router/common.ts index 37b426ce1..c5f9e490e 100644 --- a/packages/waku/src/router/common.ts +++ b/packages/waku/src/router/common.ts @@ -40,11 +40,9 @@ export function decodeRoutePath(rscPath: string): string { return rscPath.slice(ROUTE_PREFIX.length); } -// It starts with "/" to avoid conflicting with normal component ids. -export const ROUTE_ID = '/ROUTE'; +export const ROUTE_ID = 'ROUTE'; +export const IS_STATIC_ID = 'IS_STATIC'; +export const HAS404_ID = 'HAS404'; -// It starts with "/" to avoid conflicting with normal component ids. -export const IS_STATIC_ID = '/IS_STATIC'; - -// It starts with "/" to avoid conflicting with normal component ids. -export const HAS404_ID = '/HAS404'; +// For HTTP header +export const SKIP_HEADER = 'X-Waku-Router-Skip'; diff --git a/packages/waku/src/router/create-pages.ts b/packages/waku/src/router/create-pages.ts index f71b12c3d..418984457 100644 --- a/packages/waku/src/router/create-pages.ts +++ b/packages/waku/src/router/create-pages.ts @@ -8,6 +8,7 @@ import { parsePathWithSlug, getPathMapping, path2regexp, + pathSpecAsString, } from '../lib/utils/path.js'; import type { PathSpec } from '../lib/utils/path.js'; import type { @@ -135,14 +136,14 @@ export type CreateLayout = ( layout: | { render: 'dynamic'; - path: PathWithoutSlug; + path: Path; component: FunctionComponent< Pick & { children: ReactNode } >; } | { render: 'static'; - path: PathWithoutSlug; + path: Path; component: FunctionComponent<{ children: ReactNode }>; }, ) => void; @@ -231,6 +232,14 @@ export const createPages = < } }; + /** helper to get original static slug path */ + const getOriginalStaticPathSpec = (path: string) => { + const staticPathSpec = staticPathMap.get(path); + if (staticPathSpec) { + return staticPathSpec.originalSpec ?? staticPathSpec.literalSpec; + } + }; + const registerStaticComponent = ( id: string, component: FunctionComponent, @@ -371,12 +380,8 @@ export const createPages = < const getLayouts = (spec: PathSpec): string[] => { const pathSegments = spec.reduce( - (acc, segment, index) => { - if (index === 0) { - acc.push('/' + segment.name); - } else { - acc.push(acc[index - 1] + '/' + segment.name); - } + (acc, _segment, index) => { + acc.push(pathSpecAsString(spec.slice(0, index + 1))); return acc; }, ['/'], @@ -408,7 +413,7 @@ export const createPages = < ? path2regexp(originalSpec) : path2regexp(literalSpec); - const layoutPaths = getLayouts(literalSpec); + const layoutPaths = getLayouts(originalSpec ?? literalSpec); const elements = { ...layoutPaths.reduce>( @@ -494,9 +499,14 @@ export const createPages = < throw new Error('Route not found: ' + path); } - const pageComponent = (staticComponentMap.get( - joinPath(routePath, 'page').slice(1), // feels like a hack - ) ?? dynamicPagePathMap.get(routePath)?.[1])!; + const pageComponent = + staticComponentMap.get(joinPath(routePath, 'page').slice(1)) ?? + dynamicPagePathMap.get(routePath)?.[1] ?? + wildcardPagePathMap.get(routePath)?.[1]; + + if (!pageComponent) { + throw new Error('Page not found: ' + path); + } const pathSpec = parsePathWithSlug(routePath); const mapping = getPathMapping(pathSpec, path); @@ -513,7 +523,9 @@ export const createPages = < ), }; - const layoutPaths = getLayouts(pathSpec); + const layoutPaths = getLayouts( + getOriginalStaticPathSpec(path) ?? pathSpec, + ); for (const segment of layoutPaths) { const layout = diff --git a/packages/waku/src/router/define-router.ts b/packages/waku/src/router/define-router.ts index 9bcd8c5e4..a9447f685 100644 --- a/packages/waku/src/router/define-router.ts +++ b/packages/waku/src/router/define-router.ts @@ -9,13 +9,12 @@ import { ROUTE_ID, IS_STATIC_ID, HAS404_ID, + SKIP_HEADER, } from './common.js'; import { getPathMapping } from '../lib/utils/path.js'; import type { PathSpec } from '../lib/utils/path.js'; import { ServerRouter } from './client.js'; - -// This can't be relative import -import { getContext } from 'waku/middleware/context'; +import { getContext } from '../middleware/context.js'; const isStringArray = (x: unknown): x is string[] => Array.isArray(x) && x.every((y) => typeof y === 'string'); @@ -24,20 +23,12 @@ const parseRscParams = ( rscParams: unknown, ): { query: string; - skip: string[]; } => { if (!(rscParams instanceof URLSearchParams)) { - return { query: '', skip: [] }; + return { query: '' }; } const query = rscParams.get('query') || ''; - let skipParam: unknown; - try { - skipParam = JSON.parse(rscParams.get('skip')!); - } catch { - // ignore - } - const skip = isStringArray(skipParam) ? skipParam : []; - return { query, skip }; + return { query }; }; const RERENDER_SYMBOL = Symbol('RERENDER'); @@ -171,13 +162,24 @@ export function unstable_defineRouter(fns: { return !!found && found.staticElementIds.includes(slotId); }); }; - const getEntries = async (rscPath: string, rscParams: unknown) => { + const getEntries = async ( + rscPath: string, + rscParams: unknown, + headers: Readonly>, + ) => { const pathname = decodeRoutePath(rscPath); const pathStatus = await existsPath(pathname); if (!pathStatus.found) { return null; } - const { query, skip } = parseRscParams(rscParams); + let skipParam: unknown; + try { + skipParam = JSON.parse(headers[SKIP_HEADER.toLowerCase()] || ''); + } catch { + // ignore + } + const skip = isStringArray(skipParam) ? skipParam : []; + const { query } = parseRscParams(rscParams); const { routeElement, elements, fallbackElement } = await fns.renderRoute( pathname, pathStatus.isStatic ? {} : { query }, @@ -221,7 +223,7 @@ export function unstable_defineRouter(fns: { } const pathname = '/' + pathSpec.map(({ name }) => name).join('/'); const rscPath = encodeRoutePath(pathname); - const entries = await getEntries(rscPath, undefined); + const entries = await getEntries(rscPath, undefined, {}); if (entries) { path2moduleIds[pattern] = await unstable_collectClientModules(entries); @@ -265,7 +267,11 @@ globalThis.__WAKU_ROUTER_PREFETCH__ = (path) => { return defineEntries({ handleRequest: async (input, { renderRsc, renderHtml }) => { if (input.type === 'component') { - const entries = await getEntries(input.rscPath, input.rscParams); + const entries = await getEntries( + input.rscPath, + input.rscParams, + input.req.headers, + ); if (!entries) { return null; } @@ -281,7 +287,7 @@ globalThis.__WAKU_ROUTER_PREFETCH__ = (path) => { } elementsPromise = Promise.all([ elementsPromise, - getEntries(rscPath, rscParams), + getEntries(rscPath, rscParams, input.req.headers), ]).then(([oldElements, newElements]) => { if (newElements === null) { console.warn('getEntries returned null'); @@ -313,7 +319,7 @@ globalThis.__WAKU_ROUTER_PREFETCH__ = (path) => { } const rscPath = encodeRoutePath(pathname); const rscParams = new URLSearchParams({ query }); - const entries = await getEntries(rscPath, rscParams); + const entries = await getEntries(rscPath, rscParams, input.req.headers); if (!entries) { return null; } diff --git a/packages/waku/src/server.ts b/packages/waku/src/server.ts index d2885976c..eca38392d 100644 --- a/packages/waku/src/server.ts +++ b/packages/waku/src/server.ts @@ -1,5 +1,4 @@ -// This can't be relative import -import { getContext } from 'waku/middleware/context'; +import { getContext } from './middleware/context.js'; /** * This is an internal function and not for public use. diff --git a/packages/waku/tests/create-pages.test.ts b/packages/waku/tests/create-pages.test.ts index 641d1f0ff..c8c455955 100644 --- a/packages/waku/tests/create-pages.test.ts +++ b/packages/waku/tests/create-pages.test.ts @@ -647,6 +647,7 @@ describe('createPages', () => { elements: { root: { isStatic: true }, 'page:/test/nested': { isStatic: true }, + 'layout:/test/nested': { isStatic: true }, }, routeElement: { isStatic: true }, noSsr: false, @@ -668,7 +669,11 @@ describe('createPages', () => { }); expect(route).toBeDefined(); expect(route.routeElement).toBeDefined(); - expect(Object.keys(route.elements)).toEqual(['root', 'page:/test/nested']); + expect(Object.keys(route.elements)).toEqual([ + 'root', + 'page:/test/nested', + 'layout:/test/nested', + ]); }); it('creates a nested dynamic page', async () => { diff --git a/packages/website/package.json b/packages/website/package.json index b634591e1..750721399 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -12,8 +12,8 @@ "dependencies": { "@sindresorhus/slugify": "^2.2.1", "classnames": "2.3.2", - "framer-motion": "^11.13.1", - "jotai": "^2.10.3", + "framer-motion": "^11.15.0", + "jotai": "^2.10.4", "next-mdx-remote": "^5.0.0", "react": "19.0.0", "react-dom": "19.0.0", @@ -21,13 +21,13 @@ "waku": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "autoprefixer": "^10.4.20", "prettier": "^3.4.2", "prettier-plugin-tailwindcss": "^0.6.9", - "shiki": "^1.24.0", - "tailwindcss": "^3.4.16", + "shiki": "^1.24.4", + "tailwindcss": "^3.4.17", "typescript": "^5.7.2", "vite": "5.4.10" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 16d7cdd1a..f439279fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,26 +15,26 @@ importers: specifier: ^1.11.1 version: 1.11.1 '@playwright/test': - specifier: ^1.49.0 - version: 1.49.0 + specifier: ^1.49.1 + version: 1.49.1 '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 '@types/node': - specifier: ^22.10.1 - version: 22.10.1 + specifier: ^22.10.2 + version: 22.10.2 '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) '@typescript-eslint/eslint-plugin': - specifier: ^8.17.0 - version: 8.17.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) + specifier: ^8.18.1 + version: 8.18.1(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/parser': - specifier: ^8.17.0 - version: 8.17.0(eslint@8.57.0)(typescript@5.7.2) + specifier: ^8.18.1 + version: 8.18.1(eslint@8.57.0)(typescript@5.7.2) eslint: specifier: 8.57.0 version: 8.57.0 @@ -46,7 +46,7 @@ importers: version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + version: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) eslint-plugin-react: specifier: ^7.37.2 version: 7.37.2(eslint@8.57.0) @@ -91,16 +91,16 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 - e2e/fixtures/hot-reload: + e2e/fixtures/create-pages: dependencies: react: specifier: 19.0.0 @@ -116,16 +116,19 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) + server-only: + specifier: ^0.0.1 + version: 0.0.1 typescript: specifier: ^5.7.2 version: 5.7.2 - e2e/fixtures/partial-build: + e2e/fixtures/define-router: dependencies: react: specifier: 19.0.0 @@ -136,24 +139,46 @@ importers: react-server-dom-webpack: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) - serve: - specifier: ^14.2.4 - version: 14.2.4 waku: specifier: workspace:* version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 - e2e/fixtures/render-type: + e2e/fixtures/hot-reload: + dependencies: + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) + react-server-dom-webpack: + specifier: 19.0.0 + version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) + waku: + specifier: workspace:* + version: link:../../../packages/waku + devDependencies: + '@types/react': + specifier: ^19.0.2 + version: 19.0.2 + '@types/react-dom': + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) + typescript: + specifier: ^5.7.2 + version: 5.7.2 + + e2e/fixtures/partial-build: dependencies: react: specifier: 19.0.0 @@ -172,20 +197,17 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 - e2e/fixtures/rsc-basic: + e2e/fixtures/render-type: dependencies: - ai: - specifier: link:modules/ai - version: link:modules/ai react: specifier: 19.0.0 version: 19.0.0 @@ -195,22 +217,28 @@ importers: react-server-dom-webpack: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) + serve: + specifier: ^14.2.4 + version: 14.2.4 waku: specifier: workspace:* version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 - e2e/fixtures/rsc-css-modules: + e2e/fixtures/rsc-basic: dependencies: + ai: + specifier: link:modules/ai + version: link:modules/ai react: specifier: 19.0.0 version: 19.0.0 @@ -225,16 +253,16 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 - e2e/fixtures/rsc-router: + e2e/fixtures/rsc-css-modules: dependencies: react: specifier: 19.0.0 @@ -250,11 +278,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -275,11 +303,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -300,11 +328,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -312,8 +340,8 @@ importers: e2e/fixtures/ssr-basic: dependencies: ai: - specifier: ^4.0.13 - version: 4.0.13(react@19.0.0)(zod@3.23.8) + specifier: ^4.0.22 + version: 4.0.22(react@19.0.0)(zod@3.24.1) react: specifier: 19.0.0 version: 19.0.0 @@ -328,11 +356,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -346,8 +374,8 @@ importers: specifier: 19.0.0 version: 19.0.0(react@19.0.0) react-error-boundary: - specifier: ^4.1.2 - version: 4.1.2(react@19.0.0) + specifier: ^5.0.0 + version: 5.0.0(react@19.0.0) react-server-dom-webpack: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) @@ -356,11 +384,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -381,11 +409,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -409,11 +437,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -430,18 +458,18 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) react-textarea-autosize: - specifier: ^8.5.5 - version: 8.5.5(@types/react@19.0.1)(react@19.0.0) + specifier: ^8.5.6 + version: 8.5.6(@types/react@19.0.2)(react@19.0.0) waku: specifier: workspace:* version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -462,11 +490,11 @@ importers: version: link:../../../packages/waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -483,21 +511,21 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.49) tailwindcss: - specifier: 3.4.16 - version: 3.4.16 + specifier: 3.4.17 + version: 3.4.17 typescript: specifier: 5.7.2 version: 5.7.2 @@ -514,15 +542,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.49) tailwindcss: - specifier: 3.4.16 - version: 3.4.16 + specifier: 3.4.17 + version: 3.4.17 examples/03_demo: dependencies: @@ -536,21 +564,21 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.49) tailwindcss: - specifier: 3.4.16 - version: 3.4.16 + specifier: 3.4.17 + version: 3.4.17 typescript: specifier: 5.7.2 version: 5.7.2 @@ -567,15 +595,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -592,15 +620,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -617,27 +645,27 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.49) tailwindcss: - specifier: 3.4.16 - version: 3.4.16 + specifier: 3.4.17 + version: 3.4.17 typescript: specifier: 5.7.2 version: 5.7.2 vite: specifier: 5.4.10 - version: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.10(@types/node@22.10.2)(terser@5.37.0) examples/21_create-pages: dependencies: @@ -651,15 +679,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) server-only: specifier: 0.0.1 version: 0.0.1 @@ -679,15 +707,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -704,15 +732,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -729,7 +757,7 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku examples/33_promise: @@ -744,15 +772,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -772,15 +800,15 @@ importers: specifier: 1.1.1 version: 1.1.1(react@19.0.0) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -797,15 +825,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -822,15 +850,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -841,8 +869,8 @@ importers: specifier: 0.9.3 version: 0.9.3 '@vanilla-extract/css': - specifier: 1.16.1 - version: 1.16.1 + specifier: 1.17.0 + version: 1.17.0 classnames: specifier: 2.3.2 version: 2.3.2 @@ -856,27 +884,27 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) '@vanilla-extract/vite-plugin': specifier: 4.0.18 - version: 4.0.18(@types/node@22.10.1)(terser@5.37.0)(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0)) + version: 4.0.18(@types/node@22.10.2)(terser@5.37.0)(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0)) typescript: specifier: 5.7.2 version: 5.7.2 vite: specifier: 5.4.10 - version: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.10(@types/node@22.10.2)(terser@5.37.0) vite-plugin-stylex-dev: specifier: 0.7.5 - version: 0.7.5(rollup@4.28.1) + version: 0.7.5(rollup@4.29.1) examples/38_cookies: dependencies: @@ -884,8 +912,8 @@ importers: specifier: 1.0.2 version: 1.0.2 hono: - specifier: 4.6.13 - version: 4.6.13 + specifier: 4.6.14 + version: 4.6.14 react: specifier: 19.0.0 version: 19.0.0 @@ -896,21 +924,21 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/cookie': specifier: 1.0.0 version: 1.0.0 '@types/node': - specifier: 22.10.1 - version: 22.10.1 + specifier: 22.10.2 + version: 22.10.2 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -927,15 +955,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 @@ -952,24 +980,24 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) typescript: specifier: 5.7.2 version: 5.7.2 vite: specifier: 5.4.10 - version: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.10(@types/node@22.10.2)(terser@5.37.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.7.2)(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0)) + version: 5.1.4(typescript@5.7.2)(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0)) examples/42_react-tweet: dependencies: @@ -986,21 +1014,21 @@ importers: specifier: ^3.2.1 version: 3.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.49) tailwindcss: - specifier: 3.4.16 - version: 3.4.16 + specifier: 3.4.17 + version: 3.4.17 typescript: specifier: 5.7.2 version: 5.7.2 @@ -1017,15 +1045,15 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku devDependencies: '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) server-only: specifier: 0.0.1 version: 0.0.1 @@ -1036,8 +1064,8 @@ importers: examples/44_cloudflare: dependencies: hono: - specifier: 4.6.13 - version: 4.6.13 + specifier: 4.6.14 + version: 4.6.14 react: specifier: 19.0.0 version: 19.0.0 @@ -1048,24 +1076,24 @@ importers: specifier: 19.0.0 version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1(esbuild@0.17.19)) waku: - specifier: 0.21.8 + specifier: 0.21.10 version: link:../../packages/waku wrangler: - specifier: 3.93.0 - version: 3.93.0 + specifier: 3.99.0 + version: 3.99.0 devDependencies: '@types/node': - specifier: 22.10.1 - version: 22.10.1 + specifier: 22.10.2 + version: 22.10.2 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.2) miniflare: - specifier: 3.20241205.0 - version: 3.20241205.0 + specifier: 3.20241218.0 + version: 3.20241218.0 typescript: specifier: 5.7.2 version: 5.7.2 @@ -1095,7 +1123,7 @@ importers: version: 7.4.3 tsup: specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.10.0)(jiti@2.4.1)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.6.1) + version: 8.3.5(@swc/core@1.10.1)(jiti@2.4.2)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.6.1) update-check: specifier: ^1.5.4 version: 1.5.4 @@ -1104,19 +1132,19 @@ importers: dependencies: '@hono/node-server': specifier: 1.13.7 - version: 1.13.7(hono@4.6.13) + version: 1.13.7(hono@4.6.14) '@swc/core': - specifier: 1.10.0 - version: 1.10.0(@swc/helpers@0.5.15) + specifier: 1.10.1 + version: 1.10.1(@swc/helpers@0.5.15) '@vitejs/plugin-react': specifier: 4.3.4 - version: 4.3.4(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0)) + version: 4.3.4(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0)) dotenv: specifier: 16.4.7 version: 16.4.7 hono: - specifier: 4.6.13 - version: 4.6.13 + specifier: 4.6.14 + version: 4.6.14 react: specifier: ~19.0.0 version: 19.0.0 @@ -1125,29 +1153,29 @@ importers: version: 19.0.0(react@19.0.0) react-server-dom-webpack: specifier: ~19.0.0 - version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15))) + version: 19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15))) rsc-html-stream: specifier: 0.0.4 version: 0.0.4 vite: specifier: 5.4.10 - version: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.10(@types/node@22.10.2)(terser@5.37.0) devDependencies: '@netlify/functions': - specifier: ^2.8.2 - version: 2.8.2 + specifier: ^3.0.0 + version: 3.0.0 '@swc/cli': specifier: ^0.5.2 - version: 0.5.2(@swc/core@1.10.0(@swc/helpers@0.5.15))(chokidar@3.6.0) + version: 0.5.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(chokidar@3.6.0) rollup: - specifier: ^4.28.1 - version: 4.28.1 + specifier: ^4.29.1 + version: 4.29.1 ts-expect: specifier: ^1.3.0 version: 1.3.0 vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.10.1)(terser@5.37.0) + version: 2.1.8(@types/node@22.10.2)(terser@5.37.0) packages/website: dependencies: @@ -1158,14 +1186,14 @@ importers: specifier: 2.3.2 version: 2.3.2 framer-motion: - specifier: ^11.13.1 - version: 11.13.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^11.15.0 + version: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) jotai: - specifier: ^2.10.3 - version: 2.10.3(@types/react@19.0.1)(react@19.0.0) + specifier: ^2.10.4 + version: 2.10.4(@types/react@19.0.2)(react@19.0.0) next-mdx-remote: specifier: ^5.0.0 - version: 5.0.0(@types/react@19.0.1)(acorn@8.14.0)(react@19.0.0) + version: 5.0.0(@types/react@19.0.2)(acorn@8.14.0)(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1180,11 +1208,11 @@ importers: version: link:../waku devDependencies: '@types/react': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2 '@types/react-dom': - specifier: ^19.0.1 - version: 19.0.1 + specifier: ^19.0.2 + version: 19.0.2(@types/react@19.0.2) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.49) @@ -1195,17 +1223,17 @@ importers: specifier: ^0.6.9 version: 0.6.9(prettier@3.4.2) shiki: - specifier: ^1.24.0 - version: 1.24.0 + specifier: ^1.24.4 + version: 1.24.4 tailwindcss: - specifier: ^3.4.16 - version: 3.4.16 + specifier: ^3.4.17 + version: 3.4.17 typescript: specifier: ^5.7.2 version: 5.7.2 vite: specifier: 5.4.10 - version: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.10(@types/node@22.10.2)(terser@5.37.0) packages: @@ -1221,8 +1249,8 @@ packages: '@actions/io@1.1.3': resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} - '@ai-sdk/provider-utils@2.0.3': - resolution: {integrity: sha512-Cyk7GlFEse2jQ4I3FWYuZ1Zhr5w1mD9SHMJTYm/in1rd7r89nmEoQiOy3h8YV2ZvTa2/6aR10xZ4M0k4B3BluA==} + '@ai-sdk/provider-utils@2.0.5': + resolution: {integrity: sha512-2M7vLhYN0ThGjNlzow7oO/lsL+DyMxvGMIYmVQvEYaCWhDzxH5dOp78VNjJIVwHzVLMbBDigX3rJuzAs853idw==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -1230,12 +1258,12 @@ packages: zod: optional: true - '@ai-sdk/provider@1.0.1': - resolution: {integrity: sha512-mV+3iNDkzUsZ0pR2jG0sVzU6xtQY5DtSCBy3JFycLp6PwjyLw/iodfL3MwdmMCRJWgs3dadcHejRnMvF9nGTBg==} + '@ai-sdk/provider@1.0.3': + resolution: {integrity: sha512-WiuJEpHTrltOIzv3x2wx4gwksAHW0h6nK3SoDzjqCOJLu/2OJ1yASESTIX+f07ChFykHElVoP80Ol/fe9dw6tQ==} engines: {node: '>=18'} - '@ai-sdk/react@1.0.5': - resolution: {integrity: sha512-OPqYhltJE9dceWxw5pTXdYtAhs1Ca6Ly8xR7z/T+JZ0lrcgembFIMvnJ0dMBkba07P4GQBmuvd5DVTeAqPM9SQ==} + '@ai-sdk/react@1.0.7': + resolution: {integrity: sha512-j2/of4iCNq+r2Bjx0O9vdRhn5C/02t2Esenis71YtnsoynPz74eQlJ3N0RYYPheThiJes50yHdfdVdH9ulxs1A==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -1246,8 +1274,8 @@ packages: zod: optional: true - '@ai-sdk/ui-utils@1.0.4': - resolution: {integrity: sha512-P2vDvASaGsD+lmbsQ5WYjELxJBQgse3CpxyLSA+usZiZxspwYbLFsSWiYz3zhIemcnS0T6/OwQdU6UlMB4N5BQ==} + '@ai-sdk/ui-utils@1.0.6': + resolution: {integrity: sha512-ZP6Vjj+VCnSPBIAvWAdKj2olQONJ/f4aZpkVCGkzprdhv8TjHwB6CTlXFS3zypuEGy4asg84dc1dvXKooQXFvg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -1427,40 +1455,36 @@ packages: resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} - '@cloudflare/workerd-darwin-64@1.20241205.0': - resolution: {integrity: sha512-TArEZkSZkHJyEwnlWWkSpCI99cF6lJ14OVeEoI9Um/+cD9CKZLM9vCmsLeKglKheJ0KcdCnkA+DbeD15t3VaWg==} + '@cloudflare/workerd-darwin-64@1.20241218.0': + resolution: {integrity: sha512-8rveQoxtUvlmORKqTWgjv2ycM8uqWox0u9evn3zd2iWKdou5sncFwH517ZRLI3rq9P31ZLmCQBZ0gloFsTeY6w==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20241205.0': - resolution: {integrity: sha512-u5eqKa9QRdA8MugfgCoD+ADDjY6EpKbv3hSYJETmmUh17l7WXjWBzv4pUvOKIX67C0UzMUy4jZYwC53MymhX3w==} + '@cloudflare/workerd-darwin-arm64@1.20241218.0': + resolution: {integrity: sha512-be59Ad9nmM9lCkhHqmTs/uZ3JVZt8NJ9Z0PY+B0xnc5z6WwmV2lj0RVLtq7xJhQsQJA189zt5rXqDP6J+2mu7Q==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20241205.0': - resolution: {integrity: sha512-OYA7S5zpumMamWEW+IhhBU6YojIEocyE5X/YFPiTOCrDE3dsfr9t6oqNE7hxGm1VAAu+Irtl+a/5LwmBOU681w==} + '@cloudflare/workerd-linux-64@1.20241218.0': + resolution: {integrity: sha512-MzpSBcfZXRxrYWxQ4pVDYDrUbkQuM62ssl4ZtHH8J35OAeGsWFAYji6MkS2SpVwVcvacPwJXIF4JSzp4xKImKw==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20241205.0': - resolution: {integrity: sha512-qAzecONjFJGIAVJZKExQ5dlbic0f3d4A+GdKa+H6SoUJtPaWiE3K6WuePo4JOT7W3/Zfh25McmX+MmpMUUcM5Q==} + '@cloudflare/workerd-linux-arm64@1.20241218.0': + resolution: {integrity: sha512-RIuJjPxpNqvwIs52vQsXeRMttvhIjgg9NLjjFa3jK8Ijnj8c3ZDru9Wqi48lJP07yDFIRr4uDMMqh/y29YQi2A==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20241205.0': - resolution: {integrity: sha512-BEab+HiUgCdl6GXAT7EI2yaRtDPiRJlB94XLvRvXi1ZcmQqsrq6awGo6apctFo4WUL29V7c09LxmN4HQ3X2Tvg==} + '@cloudflare/workerd-windows-64@1.20241218.0': + resolution: {integrity: sha512-tO1VjlvK3F6Yb2d1jgEy/QBYl//9Pyv3K0j+lq8Eu7qdfm0IgKwSRgDWLept84/qmNsQfausZ4JdNGxTf9xsxQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-shared@0.10.0': - resolution: {integrity: sha512-j3EwZBc9ctavmFVOQT1gqztRO/Plx4ZR0LMEEOif+5YoCcuD1P7/NEjlODPMc5a1w+8+7A/H+Ci8Ihd55+x0Zw==} - engines: {node: '>=16.7.0'} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1490,8 +1514,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1514,8 +1538,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1538,8 +1562,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1562,8 +1586,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1586,8 +1610,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1610,8 +1634,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1634,8 +1658,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1658,8 +1682,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1682,8 +1706,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1706,8 +1730,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1730,8 +1754,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1754,8 +1778,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1778,8 +1802,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1802,8 +1826,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1826,8 +1850,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1850,8 +1874,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1874,12 +1898,18 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -1898,8 +1928,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -1910,8 +1940,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1934,8 +1964,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1958,8 +1988,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1982,8 +2012,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2006,8 +2036,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2030,8 +2060,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2099,6 +2129,10 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -2228,16 +2262,16 @@ packages: resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==} engines: {node: '>= 10'} - '@netlify/functions@2.8.2': - resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==} - engines: {node: '>=14.0.0'} + '@netlify/functions@3.0.0': + resolution: {integrity: sha512-XXf9mNw4+fkxUzukDpJtzc32bl1+YlXZwEhc5ZgMcTbJPLpgRLDs5WWSPJ4eY/Mv1ZFvtxmMwmfgoQYVt68Qog==} + engines: {node: '>=18.0.0'} '@netlify/node-cookies@0.1.0': resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} engines: {node: ^14.16.0 || >=16.0.0} - '@netlify/serverless-functions-api@1.26.1': - resolution: {integrity: sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==} + '@netlify/serverless-functions-api@1.30.1': + resolution: {integrity: sha512-JkbaWFeydQdeDHz1mAy4rw+E3bl9YtbCgkntfTxq+IlNX/aIMv2/b1kZnQZcil4/sPoZGL831Dq6E374qRpU1A==} engines: {node: '>=18.0.0'} '@nodelib/fs.scandir@2.1.5': @@ -2264,8 +2298,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.49.0': - resolution: {integrity: sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==} + '@playwright/test@1.49.1': + resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} engines: {node: '>=18'} hasBin: true @@ -2283,8 +2317,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.29.1': + resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} cpu: [arm] os: [android] @@ -2293,8 +2327,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.29.1': + resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} cpu: [arm64] os: [android] @@ -2303,8 +2337,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.29.1': + resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} cpu: [arm64] os: [darwin] @@ -2313,8 +2347,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.29.1': + resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} cpu: [x64] os: [darwin] @@ -2323,8 +2357,8 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.29.1': + resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} cpu: [arm64] os: [freebsd] @@ -2333,8 +2367,8 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.29.1': + resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} cpu: [x64] os: [freebsd] @@ -2343,8 +2377,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} cpu: [arm] os: [linux] @@ -2353,8 +2387,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.29.1': + resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} cpu: [arm] os: [linux] @@ -2363,8 +2397,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.29.1': + resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} cpu: [arm64] os: [linux] @@ -2373,13 +2407,13 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.29.1': + resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} cpu: [loong64] os: [linux] @@ -2388,8 +2422,8 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} cpu: [ppc64] os: [linux] @@ -2398,8 +2432,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.29.1': + resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} cpu: [riscv64] os: [linux] @@ -2408,8 +2442,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-s390x-gnu@4.29.1': + resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} cpu: [s390x] os: [linux] @@ -2418,8 +2452,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.29.1': + resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} cpu: [x64] os: [linux] @@ -2428,8 +2462,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.29.1': + resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} cpu: [x64] os: [linux] @@ -2438,8 +2472,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-win32-arm64-msvc@4.29.1': + resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} cpu: [arm64] os: [win32] @@ -2448,8 +2482,8 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.29.1': + resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} cpu: [ia32] os: [win32] @@ -2458,8 +2492,8 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-msvc@4.29.1': + resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} cpu: [x64] os: [win32] @@ -2469,20 +2503,20 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@1.24.0': - resolution: {integrity: sha512-6pvdH0KoahMzr6689yh0QJ3rCgF4j1XsXRHNEeEN6M4xJTfQ6QPWrmHzIddotg+xPJUPEPzYzYCKzpYyhTI6Gw==} + '@shikijs/core@1.24.4': + resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} - '@shikijs/engine-javascript@1.24.0': - resolution: {integrity: sha512-ZA6sCeSsF3Mnlxxr+4wGEJ9Tto4RHmfIS7ox8KIAbH0MTVUkw3roHPHZN+LlJMOHJJOVupe6tvuAzRpN8qK1vA==} + '@shikijs/engine-javascript@1.24.4': + resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} - '@shikijs/engine-oniguruma@1.24.0': - resolution: {integrity: sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==} + '@shikijs/engine-oniguruma@1.24.4': + resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} - '@shikijs/types@1.24.0': - resolution: {integrity: sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==} + '@shikijs/types@1.24.4': + resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@shikijs/vscode-textmate@9.3.1': + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} @@ -2525,68 +2559,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.10.0': - resolution: {integrity: sha512-wCeUpanqZyzvgqWRtXIyhcFK3CqukAlYyP+fJpY2gWc/+ekdrenNIfZMwY7tyTFDkXDYEKzvn3BN/zDYNJFowQ==} + '@swc/core-darwin-arm64@1.10.1': + resolution: {integrity: sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.10.0': - resolution: {integrity: sha512-0CZPzqTynUBO+SHEl/qKsFSahp2Jv/P2ZRjFG0gwZY5qIcr1+B/v+o74/GyNMBGz9rft+F2WpU31gz2sJwyF4A==} + '@swc/core-darwin-x64@1.10.1': + resolution: {integrity: sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.10.0': - resolution: {integrity: sha512-oq+DdMu5uJOFPtRkeiITc4kxmd+QSmK+v+OBzlhdGkSgoH3yRWZP+H2ao0cBXo93ZgCr2LfjiER0CqSKhjGuNA==} + '@swc/core-linux-arm-gnueabihf@1.10.1': + resolution: {integrity: sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.10.0': - resolution: {integrity: sha512-Y6+PC8knchEViRxiCUj3j8wsGXaIhuvU+WqrFqV834eiItEMEI9+Vh3FovqJMBE3L7d4E4ZQtgImHCXjrHfxbw==} + '@swc/core-linux-arm64-gnu@1.10.1': + resolution: {integrity: sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.10.0': - resolution: {integrity: sha512-EbrX9A5U4cECCQQfky7945AW9GYnTXtCUXElWTkTYmmyQK87yCyFfY8hmZ9qMFIwxPOH6I3I2JwMhzdi8Qoz7g==} + '@swc/core-linux-arm64-musl@1.10.1': + resolution: {integrity: sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.10.0': - resolution: {integrity: sha512-TaxpO6snTjjfLXFYh5EjZ78se69j2gDcqEM8yB9gguPYwkCHi2Ylfmh7iVaNADnDJFtjoAQp0L41bTV/Pfq9Cg==} + '@swc/core-linux-x64-gnu@1.10.1': + resolution: {integrity: sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.10.0': - resolution: {integrity: sha512-IEGvDd6aEEKEyZFZ8oCKuik05G5BS7qwG5hO5PEMzdGeh8JyFZXxsfFXbfeAqjue4UaUUrhnoX+Ze3M2jBVMHw==} + '@swc/core-linux-x64-musl@1.10.1': + resolution: {integrity: sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.10.0': - resolution: {integrity: sha512-UkQ952GSpY+Z6XONj9GSW8xGSkF53jrCsuLj0nrcuw7Dvr1a816U/9WYZmmcYS8tnG2vHylhpm6csQkyS8lpCw==} + '@swc/core-win32-arm64-msvc@1.10.1': + resolution: {integrity: sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.10.0': - resolution: {integrity: sha512-a2QpIZmTiT885u/mUInpeN2W9ClCnqrV2LnMqJR1/Fgx1Afw/hAtiDZPtQ0SqS8yDJ2VR5gfNZo3gpxWMrqdVA==} + '@swc/core-win32-ia32-msvc@1.10.1': + resolution: {integrity: sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.10.0': - resolution: {integrity: sha512-tZcCmMwf483nwsEBfUk5w9e046kMa1iSik4bP9Kwi2FGtOfHuDfIcwW4jek3hdcgF5SaBW1ktnK/lgQLDi5AtA==} + '@swc/core-win32-x64-msvc@1.10.1': + resolution: {integrity: sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.10.0': - resolution: {integrity: sha512-+CuuTCmQFfzaNGg1JmcZvdUVITQXJk9sMnl1C2TiDLzOSVOJRwVD4dNo5dljX/qxpMAN+2BIYlwjlSkoGi6grg==} + '@swc/core@1.10.1': + resolution: {integrity: sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -2677,17 +2711,19 @@ packages: '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@22.10.1': - resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - '@types/react-dom@19.0.1': - resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==} + '@types/react-dom@19.0.2': + resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} + peerDependencies: + '@types/react': ^19.0.0 - '@types/react@19.0.1': - resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/react@19.0.2': + resolution: {integrity: sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==} '@types/tar@6.1.13': resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} @@ -2698,66 +2734,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.17.0': - resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} + '@typescript-eslint/eslint-plugin@8.18.1': + resolution: {integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.17.0': - resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} + '@typescript-eslint/parser@8.18.1': + resolution: {integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.17.0': - resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} + '@typescript-eslint/scope-manager@8.18.1': + resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.17.0': - resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} + '@typescript-eslint/type-utils@8.18.1': + resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.17.0': - resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} + '@typescript-eslint/types@8.18.1': + resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.17.0': - resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} + '@typescript-eslint/typescript-estree@8.18.1': + resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.17.0': - resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} + '@typescript-eslint/utils@8.18.1': + resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.17.0': - resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} + '@typescript-eslint/visitor-keys@8.18.1': + resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -2769,8 +2790,8 @@ packages: '@vanilla-extract/babel-plugin-debug-ids@1.1.0': resolution: {integrity: sha512-Zy9bKjaL2P5zsrFYQJ8IjWGlFODmZrpvFmjFE0Zv8om55Pz1JtpJtL6DvlxlWUxbVaP1HKCqsmEfFOZN8fX/ZQ==} - '@vanilla-extract/css@1.16.1': - resolution: {integrity: sha512-3jKxH5ty/ZjmGoLAx8liY7e87FRCIJfnuufX/K9fQklu0YHP3ClrNisU++LkZuD+GZleqMSAQMF0r8Otln+OPQ==} + '@vanilla-extract/css@1.17.0': + resolution: {integrity: sha512-W6FqVFDD+C71ZlKsuj0MxOXSvHb1tvQ9h/+79aYfi097wLsALrnnBzd0by8C///iurrpQ3S+SH74lXd7Lr9MvA==} '@vanilla-extract/integration@7.1.11': resolution: {integrity: sha512-IGRaLrpkjyVHTHDZQBQvFBl399yRfSMJoVI2KaocEZB33aP+H4Qup83od2hc6R5IxGWdvbiiCOJCYsnmFiy85Q==} @@ -2934,8 +2955,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ai@4.0.13: - resolution: {integrity: sha512-ic+qEVPQhfLpGPnZ2M55ErofeuKaD/TQebeh0qSPwv2PF+dQwsPr2Pw+JNYXahezAOaxFNdrDPz0EF1kKcSFSw==} + ai@4.0.22: + resolution: {integrity: sha512-yvcjWtofI2HZwgT3jMkoNnDUhAY+S9cOvZ6xbbOzrS0ZeFl1/gcbasFnwAqUJ7uL/t72/3a0Vy/pKg6N19A2Mw==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -2946,17 +2967,33 @@ packages: zod: optional: true + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -2999,8 +3036,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -3015,20 +3052,20 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} as-table@1.0.55: @@ -3107,6 +3144,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -3138,14 +3180,18 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} - call-bind-apply-helpers@1.0.0: - resolution: {integrity: sha512-CCKAP2tkPau7D3GE8+V8R6sQubA9R5foIzGp+85EXCVSCivuxBNAWqcpn72PKYiIcqoViv/kcUDpaEIMBVi1lQ==} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3158,8 +3204,11 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001687: - resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==} + caniuse-lite@1.0.30001688: + resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==} + + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -3187,8 +3236,8 @@ packages: resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} character-entities-html4@2.1.0: @@ -3211,8 +3260,8 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} chownr@3.0.0: @@ -3293,8 +3342,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + consola@3.3.0: + resolution: {integrity: sha512-kxltocVQCwQNFvw40dlVRYeAkAvtYjMFZYNlOcsF5wExPpGwPxMwgx4IfDJvBRPtBpnQwItd5WkTaR0ZwT/TmQ==} engines: {node: ^14.18.0 || >=16.10.0} content-disposition@0.5.2: @@ -3342,16 +3391,16 @@ packages: data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} date-fns@4.1.0: @@ -3471,8 +3520,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - dunder-proto@1.0.0: - resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} duplexer@0.1.2: @@ -3487,6 +3536,9 @@ packages: electron-to-chromium@1.5.71: resolution: {integrity: sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==} + electron-to-chromium@1.5.75: + resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -3496,12 +3548,12 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + es-abstract@1.23.7: + resolution: {integrity: sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -3512,8 +3564,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} es-module-lexer@1.5.4: @@ -3555,8 +3607,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true @@ -3768,6 +3820,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -3828,12 +3883,12 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@11.13.1: - resolution: {integrity: sha512-F40tpGTHByhn9h3zdBQPcEro+pSLtzARcocbNqAyfBI+u9S+KZuHH/7O9+z+GEkoF3eqFxfvVw0eBDytohwqmQ==} + framer-motion@11.15.0: + resolution: {integrity: sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==} peerDependencies: '@emotion/is-prop-valid': '*' - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/is-prop-valid': optional: true @@ -3865,8 +3920,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -3876,8 +3931,8 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-intrinsic@1.2.5: - resolution: {integrity: sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==} + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} get-source@2.0.12: @@ -3891,8 +3946,8 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} get-tsconfig@4.8.1: @@ -3946,8 +4001,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -3979,8 +4035,8 @@ packages: hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} - hast-util-to-html@9.0.3: - resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} hast-util-to-jsx-runtime@2.3.2: resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} @@ -3988,8 +4044,8 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hono@4.6.13: - resolution: {integrity: sha512-haV0gaMdSjy9URCRN9hxBPlqHa7fMm/T72kAImIxvw4eQLbNz1rgjN4hHElLJSieDiNuiIAXC//cC6YGz2KCbg==} + hono@4.6.14: + resolution: {integrity: sha512-j4VkyUp2xazGJ8eCCLN1Vm/bxdvm/j5ZuU9AIjLu9vapn2M44p9L3Ktr9Vnb2RN2QtcR/wVjZVMlT5k7GJQgPw==} engines: {node: '>=16.9.0'} html-void-elements@3.0.0: @@ -4040,8 +4096,8 @@ packages: inspect-with-kind@1.0.5: resolution: {integrity: sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} invariant@2.2.4: @@ -4053,8 +4109,8 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-async-function@2.0.0: @@ -4069,8 +4125,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.0: - resolution: {integrity: sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} is-bun-module@1.3.0: @@ -4080,16 +4136,16 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-decimal@2.0.1: @@ -4104,8 +4160,8 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: @@ -4127,12 +4183,8 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.0: - resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -4155,16 +4207,16 @@ packages: resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-regex@1.2.0: - resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} is-stream@2.0.1: @@ -4175,27 +4227,28 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-string@1.1.0: - resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.1.0: - resolution: {integrity: sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} is-wsl@2.2.0: @@ -4208,8 +4261,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + iterator.prototype@1.1.4: + resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} engines: {node: '>= 0.4'} itty-time@1.0.6: @@ -4225,16 +4278,16 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.4.1: - resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jotai@2.10.3: - resolution: {integrity: sha512-Nnf4IwrLhNfuz2JOQLI0V/AgwcpxvVy8Ec8PidIIDeRi4KCFpwTFIpHAAcU+yCgnw/oASYElq9UY0YdUUegsSA==} + jotai@2.10.4: + resolution: {integrity: sha512-/T4ofyMSkAybEs2OvR8S4HACa+/ASUEPLz86SUjFXJqU9RdJKLvZDJrag398suvHC5CR0+Cs4P5m/gtVcryzlw==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -4366,8 +4419,8 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -4380,6 +4433,10 @@ packages: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -4542,8 +4599,8 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - miniflare@3.20241205.0: - resolution: {integrity: sha512-Z0cTtIf6ZrcAJ3SrOI9EUM3s4dkGhNeU6Ubl8sroYhsPVD+rtz3m5+p6McHFWCkcMff1o60X5XEKVTmkz0gbpA==} + miniflare@3.20241218.0: + resolution: {integrity: sha512-spYFDArH0wd+wJSTrzBrWrXJrbyJhRMJa35mat947y1jYhVV8I5V8vnD3LwjfpLr0SaEilojz1OIW7ekmnRe+w==} engines: {node: '>=16.13'} hasBin: true @@ -4580,11 +4637,11 @@ packages: modern-ahocorasick@1.1.0: resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} - motion-dom@11.13.0: - resolution: {integrity: sha512-Oc1MLGJQ6nrvXccXA89lXtOqFyBmvHtaDcTRGT66o8Czl7nuA8BeHAd9MQV1pQKX0d2RHFBFaw5g3k23hQJt0w==} + motion-dom@11.14.3: + resolution: {integrity: sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==} - motion-utils@11.13.0: - resolution: {integrity: sha512-lq6TzXkH5c/ysJQBxgLXgM01qwBH1b4goTPh57VvZWJbVJZF/0SB31UWEn4EIqbVPf3au88n2rvK17SpDTja1A==} + motion-utils@11.14.3: + resolution: {integrity: sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -4632,6 +4689,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4664,8 +4724,8 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -4680,8 +4740,8 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} ohash@1.1.4: @@ -4698,8 +4758,8 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - oniguruma-to-es@0.7.0: - resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} + oniguruma-to-es@0.8.1: + resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -4724,8 +4784,8 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -4797,13 +4857,13 @@ packages: pkg-types@1.2.1: resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} - playwright-core@1.49.0: - resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} + playwright-core@1.49.1: + resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==} engines: {node: '>=18'} hasBin: true - playwright@1.49.0: - resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} + playwright@1.49.1: + resolution: {integrity: sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==} engines: {node: '>=18'} hasBin: true @@ -4986,8 +5046,8 @@ packages: peerDependencies: react: ^19.0.0 - react-error-boundary@4.1.2: - resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} + react-error-boundary@5.0.0: + resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} peerDependencies: react: '>=16.13.1' @@ -5006,11 +5066,11 @@ packages: react-dom: ^19.0.0 webpack: ^5.59.0 - react-textarea-autosize@8.5.5: - resolution: {integrity: sha512-CVA94zmfp8m4bSHtWwmANaBR8EPsKy2aZ7KwqhoS4Ftib87F9Kvi7XQhOixypPLMc6kVYgOXvKFuuzZDpHGRPg==} + react-textarea-autosize@8.5.6: + resolution: {integrity: sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw==} engines: {node: '>=10'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-tweet@3.2.1: resolution: {integrity: sha512-dktP3RMuwRB4pnSDocKpSsW5Hq1IXRW6fONkHhxT5EBIXsKZzdQuI70qtub1XN2dtZdkJWWxfBm/Q+kN+vRYFA==} @@ -5050,15 +5110,15 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - reflect.getprototypeof@1.0.8: - resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} + reflect.getprototypeof@1.0.9: + resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@4.3.0: - resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} + regex-recursion@5.0.0: + resolution: {integrity: sha512-UwyOqeobrCCqTXPcsSqH4gDhOjD5cI/b8kjngWgSZbxYh5yVjAwTjO5+hAuPRNiuR70+5RlWSs+U9PVcVcW9Lw==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} @@ -5110,8 +5170,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: @@ -5150,8 +5211,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.29.1: + resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5161,8 +5222,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -5171,8 +5232,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} scheduler@0.25.0: @@ -5182,6 +5243,10 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -5240,11 +5305,23 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.24.0: - resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==} + shiki@1.24.4: + resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -5320,8 +5397,8 @@ packages: stream-combiner@0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - streamx@2.21.0: - resolution: {integrity: sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==} + streamx@2.21.1: + resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -5331,19 +5408,20 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -5421,8 +5499,8 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - tailwindcss@3.4.16: - resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==} + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true @@ -5441,8 +5519,8 @@ packages: resolution: {integrity: sha512-bcbjJEg0wY5nuJXvGxxHfmoEPkyHLCctUKO6suwtxy7jVSgGcgPeGwpbLDLELFhIaxCGRr3dPvyNg1yuz2V0eg==} engines: {node: '>=12'} - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -5462,8 +5540,8 @@ packages: engines: {node: '>=10'} hasBin: true - text-decoder@1.2.2: - resolution: {integrity: sha512-/MDslo7ZyWTA2vnk1j7XoDVfXsGk3tp+zFEJHJGm0UjIlQifonVFwlVbQDFh8KJzTBnT8ie115TYqir6bclddA==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5592,16 +5670,16 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} typed-array-length@1.0.7: @@ -5620,8 +5698,9 @@ packages: resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} engines: {node: '>=18'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} @@ -5685,10 +5764,14 @@ packages: urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - use-composed-ref@1.3.0: - resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + use-composed-ref@1.4.0: + resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true use-isomorphic-layout-effect@1.2.0: resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} @@ -5699,11 +5782,11 @@ packages: '@types/react': optional: true - use-latest@1.2.1: - resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + use-latest@1.3.0: + resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -5835,20 +5918,20 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.0: - resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.2.0: - resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.16: - resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -5869,17 +5952,17 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20241205.0: - resolution: {integrity: sha512-vso/2n0c5SdBDWiD+Sx5gM7unA6SiZXRVUHDqH1euoP/9mFVHZF8icoYsNLB87b/TX8zNgpae+I5N/xFpd9v0g==} + workerd@1.20241218.0: + resolution: {integrity: sha512-7Z3D4vOVChMz9mWDffE299oQxUWm/pbkeAWx1btVamPcAK/2IuoNBhwflWo3jyuKuxvYuFAdIucgYxc8ICqXiA==} engines: {node: '>=16'} hasBin: true - wrangler@3.93.0: - resolution: {integrity: sha512-+wfxjOrtm6YgDS+NdJkB6aiBIS3ED97mNRQmfrEShRJW4pVo4sWY6oQ1FsGT+j4tGHplrTbWCE6U5yTgjNW/lw==} + wrangler@3.99.0: + resolution: {integrity: sha512-k0x4rT3G/QCbxcoZY7CHRVlAIS8WMmKdga6lf4d2c3gXFqssh44vwlTDuARA9QANBxKJTcA7JPTJRfUDhd9QBA==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20241205.0 + '@cloudflare/workers-types': ^4.20241218.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -5933,13 +6016,13 @@ packages: youch@3.3.4: resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} - zod-to-json-schema@3.23.5: - resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} peerDependencies: - zod: ^3.23.3 + zod: ^3.24.1 - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -5962,36 +6045,36 @@ snapshots: '@actions/io@1.1.3': {} - '@ai-sdk/provider-utils@2.0.3(zod@3.23.8)': + '@ai-sdk/provider-utils@2.0.5(zod@3.24.1)': dependencies: - '@ai-sdk/provider': 1.0.1 + '@ai-sdk/provider': 1.0.3 eventsource-parser: 3.0.0 nanoid: 3.3.8 secure-json-parse: 2.7.0 optionalDependencies: - zod: 3.23.8 + zod: 3.24.1 - '@ai-sdk/provider@1.0.1': + '@ai-sdk/provider@1.0.3': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@1.0.5(react@19.0.0)(zod@3.23.8)': + '@ai-sdk/react@1.0.7(react@19.0.0)(zod@3.24.1)': dependencies: - '@ai-sdk/provider-utils': 2.0.3(zod@3.23.8) - '@ai-sdk/ui-utils': 1.0.4(zod@3.23.8) + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) swr: 2.2.5(react@19.0.0) throttleit: 2.1.0 optionalDependencies: react: 19.0.0 - zod: 3.23.8 + zod: 3.24.1 - '@ai-sdk/ui-utils@1.0.4(zod@3.23.8)': + '@ai-sdk/ui-utils@1.0.6(zod@3.24.1)': dependencies: - '@ai-sdk/provider': 1.0.1 - '@ai-sdk/provider-utils': 2.0.3(zod@3.23.8) - zod-to-json-schema: 3.23.5(zod@3.23.8) + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + zod-to-json-schema: 3.24.1(zod@3.24.1) optionalDependencies: - zod: 3.23.8 + zod: 3.24.1 '@alloc/quick-lru@5.2.0': {} @@ -6235,26 +6318,21 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/workerd-darwin-64@1.20241205.0': + '@cloudflare/workerd-darwin-64@1.20241218.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20241205.0': + '@cloudflare/workerd-darwin-arm64@1.20241218.0': optional: true - '@cloudflare/workerd-linux-64@1.20241205.0': + '@cloudflare/workerd-linux-64@1.20241218.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20241205.0': + '@cloudflare/workerd-linux-arm64@1.20241218.0': optional: true - '@cloudflare/workerd-windows-64@1.20241205.0': + '@cloudflare/workerd-windows-64@1.20241218.0': optional: true - '@cloudflare/workers-shared@0.10.0': - dependencies: - mime: 3.0.0 - zod: 3.23.8 - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -6277,7 +6355,7 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/aix-ppc64@0.24.0': + '@esbuild/aix-ppc64@0.24.2': optional: true '@esbuild/android-arm64@0.17.19': @@ -6289,7 +6367,7 @@ snapshots: '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.24.0': + '@esbuild/android-arm64@0.24.2': optional: true '@esbuild/android-arm@0.17.19': @@ -6301,7 +6379,7 @@ snapshots: '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.24.0': + '@esbuild/android-arm@0.24.2': optional: true '@esbuild/android-x64@0.17.19': @@ -6313,7 +6391,7 @@ snapshots: '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.24.0': + '@esbuild/android-x64@0.24.2': optional: true '@esbuild/darwin-arm64@0.17.19': @@ -6325,7 +6403,7 @@ snapshots: '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.24.0': + '@esbuild/darwin-arm64@0.24.2': optional: true '@esbuild/darwin-x64@0.17.19': @@ -6337,7 +6415,7 @@ snapshots: '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.24.0': + '@esbuild/darwin-x64@0.24.2': optional: true '@esbuild/freebsd-arm64@0.17.19': @@ -6349,7 +6427,7 @@ snapshots: '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.24.0': + '@esbuild/freebsd-arm64@0.24.2': optional: true '@esbuild/freebsd-x64@0.17.19': @@ -6361,7 +6439,7 @@ snapshots: '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.24.0': + '@esbuild/freebsd-x64@0.24.2': optional: true '@esbuild/linux-arm64@0.17.19': @@ -6373,7 +6451,7 @@ snapshots: '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.24.0': + '@esbuild/linux-arm64@0.24.2': optional: true '@esbuild/linux-arm@0.17.19': @@ -6385,7 +6463,7 @@ snapshots: '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.24.0': + '@esbuild/linux-arm@0.24.2': optional: true '@esbuild/linux-ia32@0.17.19': @@ -6397,7 +6475,7 @@ snapshots: '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.24.0': + '@esbuild/linux-ia32@0.24.2': optional: true '@esbuild/linux-loong64@0.17.19': @@ -6409,7 +6487,7 @@ snapshots: '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.24.0': + '@esbuild/linux-loong64@0.24.2': optional: true '@esbuild/linux-mips64el@0.17.19': @@ -6421,7 +6499,7 @@ snapshots: '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/linux-mips64el@0.24.2': optional: true '@esbuild/linux-ppc64@0.17.19': @@ -6433,7 +6511,7 @@ snapshots: '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/linux-ppc64@0.24.2': optional: true '@esbuild/linux-riscv64@0.17.19': @@ -6445,7 +6523,7 @@ snapshots: '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-riscv64@0.24.2': optional: true '@esbuild/linux-s390x@0.17.19': @@ -6457,7 +6535,7 @@ snapshots: '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-s390x@0.24.2': optional: true '@esbuild/linux-x64@0.17.19': @@ -6469,7 +6547,10 @@ snapshots: '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.24.0': + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': optional: true '@esbuild/netbsd-x64@0.17.19': @@ -6481,13 +6562,13 @@ snapshots: '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.24.0': + '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/openbsd-arm64@0.24.2': optional: true '@esbuild/openbsd-x64@0.17.19': @@ -6499,7 +6580,7 @@ snapshots: '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/openbsd-x64@0.24.2': optional: true '@esbuild/sunos-x64@0.17.19': @@ -6511,7 +6592,7 @@ snapshots: '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.24.0': + '@esbuild/sunos-x64@0.24.2': optional: true '@esbuild/win32-arm64@0.17.19': @@ -6523,7 +6604,7 @@ snapshots: '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.24.0': + '@esbuild/win32-arm64@0.24.2': optional: true '@esbuild/win32-ia32@0.17.19': @@ -6535,7 +6616,7 @@ snapshots: '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-ia32@0.24.2': optional: true '@esbuild/win32-x64@0.17.19': @@ -6547,7 +6628,7 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.24.2': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': @@ -6582,9 +6663,9 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@hono/node-server@1.13.7(hono@4.6.13)': + '@hono/node-server@1.13.7(hono@4.6.14)': dependencies: - hono: 4.6.13 + hono: 4.6.14 '@humanwhocodes/config-array@0.11.14': dependencies: @@ -6617,13 +6698,19 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.5.0': {} @@ -6668,10 +6755,10 @@ snapshots: - acorn - supports-color - '@mdx-js/react@3.1.0(@types/react@19.0.1)(react@19.0.0)': + '@mdx-js/react@3.1.0(@types/react@19.0.2)(react@19.0.0)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.0.1 + '@types/react': 19.0.2 react: 19.0.0 '@napi-rs/nice-android-arm-eabi@1.0.1': @@ -6742,13 +6829,13 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.0.1 optional: true - '@netlify/functions@2.8.2': + '@netlify/functions@3.0.0': dependencies: - '@netlify/serverless-functions-api': 1.26.1 + '@netlify/serverless-functions-api': 1.30.1 '@netlify/node-cookies@0.1.0': {} - '@netlify/serverless-functions-api@1.26.1': + '@netlify/serverless-functions-api@1.30.1': dependencies: '@netlify/node-cookies': 0.1.0 urlpattern-polyfill: 8.0.2 @@ -6772,159 +6859,159 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.49.0': + '@playwright/test@1.49.1': dependencies: - playwright: 1.49.0 + playwright: 1.49.1 - '@rollup/pluginutils@5.1.2(rollup@4.28.1)': + '@rollup/pluginutils@5.1.2(rollup@4.29.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.28.1 + rollup: 4.29.1 '@rollup/rollup-android-arm-eabi@4.25.0': optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-android-arm-eabi@4.29.1': optional: true '@rollup/rollup-android-arm64@4.25.0': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-android-arm64@4.29.1': optional: true '@rollup/rollup-darwin-arm64@4.25.0': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-darwin-arm64@4.29.1': optional: true '@rollup/rollup-darwin-x64@4.25.0': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-darwin-x64@4.29.1': optional: true '@rollup/rollup-freebsd-arm64@4.25.0': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.29.1': optional: true '@rollup/rollup-freebsd-x64@4.25.0': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-freebsd-x64@4.29.1': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.25.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': optional: true '@rollup/rollup-linux-arm-musleabihf@4.25.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.29.1': optional: true '@rollup/rollup-linux-arm64-gnu@4.25.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.29.1': optional: true '@rollup/rollup-linux-arm64-musl@4.25.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.29.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.25.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': optional: true '@rollup/rollup-linux-riscv64-gnu@4.25.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.29.1': optional: true '@rollup/rollup-linux-s390x-gnu@4.25.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.29.1': optional: true '@rollup/rollup-linux-x64-gnu@4.25.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.29.1': optional: true '@rollup/rollup-linux-x64-musl@4.25.0': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-linux-x64-musl@4.29.1': optional: true '@rollup/rollup-win32-arm64-msvc@4.25.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.29.1': optional: true '@rollup/rollup-win32-ia32-msvc@4.25.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.29.1': optional: true '@rollup/rollup-win32-x64-msvc@4.25.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true '@rtsao/scc@1.1.0': {} '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@1.24.0': + '@shikijs/core@1.24.4': dependencies: - '@shikijs/engine-javascript': 1.24.0 - '@shikijs/engine-oniguruma': 1.24.0 - '@shikijs/types': 1.24.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-javascript': 1.24.4 + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.3 + hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.24.0': + '@shikijs/engine-javascript@1.24.4': dependencies: - '@shikijs/types': 1.24.0 - '@shikijs/vscode-textmate': 9.3.0 - oniguruma-to-es: 0.7.0 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.8.1 - '@shikijs/engine-oniguruma@1.24.0': + '@shikijs/engine-oniguruma@1.24.4': dependencies: - '@shikijs/types': 1.24.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 - '@shikijs/types@1.24.0': + '@shikijs/types@1.24.4': dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/vscode-textmate@9.3.1': {} '@sindresorhus/is@5.6.0': {} @@ -6976,9 +7063,9 @@ snapshots: invariant: 2.2.4 styleq: 0.1.3 - '@swc/cli@0.5.2(@swc/core@1.10.0(@swc/helpers@0.5.15))(chokidar@3.6.0)': + '@swc/cli@0.5.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(chokidar@3.6.0)': dependencies: - '@swc/core': 1.10.0(@swc/helpers@0.5.15) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.0.5 commander: 8.3.0 @@ -6991,51 +7078,51 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - '@swc/core-darwin-arm64@1.10.0': + '@swc/core-darwin-arm64@1.10.1': optional: true - '@swc/core-darwin-x64@1.10.0': + '@swc/core-darwin-x64@1.10.1': optional: true - '@swc/core-linux-arm-gnueabihf@1.10.0': + '@swc/core-linux-arm-gnueabihf@1.10.1': optional: true - '@swc/core-linux-arm64-gnu@1.10.0': + '@swc/core-linux-arm64-gnu@1.10.1': optional: true - '@swc/core-linux-arm64-musl@1.10.0': + '@swc/core-linux-arm64-musl@1.10.1': optional: true - '@swc/core-linux-x64-gnu@1.10.0': + '@swc/core-linux-x64-gnu@1.10.1': optional: true - '@swc/core-linux-x64-musl@1.10.0': + '@swc/core-linux-x64-musl@1.10.1': optional: true - '@swc/core-win32-arm64-msvc@1.10.0': + '@swc/core-win32-arm64-msvc@1.10.1': optional: true - '@swc/core-win32-ia32-msvc@1.10.0': + '@swc/core-win32-ia32-msvc@1.10.1': optional: true - '@swc/core-win32-x64-msvc@1.10.0': + '@swc/core-win32-x64-msvc@1.10.1': optional: true - '@swc/core@1.10.0(@swc/helpers@0.5.15)': + '@swc/core@1.10.1(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.17 optionalDependencies: - '@swc/core-darwin-arm64': 1.10.0 - '@swc/core-darwin-x64': 1.10.0 - '@swc/core-linux-arm-gnueabihf': 1.10.0 - '@swc/core-linux-arm64-gnu': 1.10.0 - '@swc/core-linux-arm64-musl': 1.10.0 - '@swc/core-linux-x64-gnu': 1.10.0 - '@swc/core-linux-x64-musl': 1.10.0 - '@swc/core-win32-arm64-msvc': 1.10.0 - '@swc/core-win32-ia32-msvc': 1.10.0 - '@swc/core-win32-x64-msvc': 1.10.0 + '@swc/core-darwin-arm64': 1.10.1 + '@swc/core-darwin-x64': 1.10.1 + '@swc/core-linux-arm-gnueabihf': 1.10.1 + '@swc/core-linux-arm64-gnu': 1.10.1 + '@swc/core-linux-arm64-musl': 1.10.1 + '@swc/core-linux-x64-gnu': 1.10.1 + '@swc/core-linux-x64-musl': 1.10.1 + '@swc/core-win32-arm64-msvc': 1.10.1 + '@swc/core-win32-ia32-msvc': 1.10.1 + '@swc/core-win32-x64-msvc': 1.10.1 '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} @@ -7108,7 +7195,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/hast@3.0.4': dependencies: @@ -7122,7 +7209,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/mdast@4.0.4': dependencies: @@ -7134,114 +7221,109 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 - '@types/node@22.10.1': + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 '@types/prompts@2.4.9': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 kleur: 3.0.3 - '@types/react-dom@19.0.1': + '@types/react-dom@19.0.2(@types/react@19.0.2)': dependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.2 - '@types/react@19.0.1': + '@types/react@19.0.2': dependencies: csstype: 3.1.3 '@types/tar@6.1.13': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 minipass: 4.2.8 '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.17.0(eslint@8.57.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/type-utils': 8.17.0(eslint@8.57.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@8.57.0)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/parser': 8.18.1(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.1(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.1 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.1 debug: 4.4.0 eslint: 8.57.0 - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.17.0': + '@typescript-eslint/scope-manager@8.18.1': dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/visitor-keys': 8.18.1 - '@typescript-eslint/type-utils@8.17.0(eslint@8.57.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.18.1(eslint@8.57.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.1(eslint@8.57.0)(typescript@5.7.2) debug: 4.4.0 eslint: 8.57.0 ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.17.0': {} + '@typescript-eslint/types@8.18.1': {} - '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/visitor-keys': 8.18.1 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.17.0(eslint@8.57.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.18.1(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) eslint: 8.57.0 - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.17.0': + '@typescript-eslint/visitor-keys@8.18.1': dependencies: - '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/types': 8.18.1 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.2.0': {} @@ -7254,7 +7336,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vanilla-extract/css@1.16.1': + '@vanilla-extract/css@1.17.0': dependencies: '@emotion/hash': 0.9.2 '@vanilla-extract/private': 1.0.6 @@ -7271,20 +7353,20 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@7.1.11(@types/node@22.10.1)(terser@5.37.0)': + '@vanilla-extract/integration@7.1.11(@types/node@22.10.2)(terser@5.37.0)': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.26.0) '@vanilla-extract/babel-plugin-debug-ids': 1.1.0 - '@vanilla-extract/css': 1.16.1 + '@vanilla-extract/css': 1.17.0 dedent: 1.5.3 esbuild: 0.23.1 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 mlly: 1.7.2 - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) - vite-node: 1.6.0(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) + vite-node: 1.6.0(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -7299,10 +7381,10 @@ snapshots: '@vanilla-extract/private@1.0.6': {} - '@vanilla-extract/vite-plugin@4.0.18(@types/node@22.10.1)(terser@5.37.0)(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0))': + '@vanilla-extract/vite-plugin@4.0.18(@types/node@22.10.2)(terser@5.37.0)(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0))': dependencies: - '@vanilla-extract/integration': 7.1.11(@types/node@22.10.1)(terser@5.37.0) - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + '@vanilla-extract/integration': 7.1.11(@types/node@22.10.2)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -7315,14 +7397,14 @@ snapshots: - supports-color - terser - '@vitejs/plugin-react@4.3.4(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - supports-color @@ -7333,13 +7415,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0))': + '@vitest/mocker@2.1.8(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.17 optionalDependencies: - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) '@vitest/pretty-format@2.1.8': dependencies: @@ -7353,7 +7435,7 @@ snapshots: '@vitest/snapshot@2.1.8': dependencies: '@vitest/pretty-format': 2.1.8 - magic-string: 0.30.14 + magic-string: 0.30.17 pathe: 1.1.2 '@vitest/spy@2.1.8': @@ -7535,23 +7617,32 @@ snapshots: acorn@8.14.0: {} - ai@4.0.13(react@19.0.0)(zod@3.23.8): + ai@4.0.22(react@19.0.0)(zod@3.24.1): dependencies: - '@ai-sdk/provider': 1.0.1 - '@ai-sdk/provider-utils': 2.0.3(zod@3.23.8) - '@ai-sdk/react': 1.0.5(react@19.0.0)(zod@3.23.8) - '@ai-sdk/ui-utils': 1.0.4(zod@3.23.8) + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + '@ai-sdk/react': 1.0.7(react@19.0.0)(zod@3.24.1) + '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.24.1) optionalDependencies: react: 19.0.0 - zod: 3.23.8 + zod: 3.24.1 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7566,6 +7657,13 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -7599,25 +7697,25 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 array-includes@3.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.5 - is-string: 1.1.0 + get-intrinsic: 1.2.6 + is-string: 1.1.1 array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -7626,43 +7724,42 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-errors: 1.3.0 - get-intrinsic: 1.2.5 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.6 + is-array-buffer: 3.0.5 as-table@1.0.55: dependencies: @@ -7674,8 +7771,8 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.49): dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001687 + browserslist: 4.24.3 + caniuse-lite: 1.0.30001690 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -7738,18 +7835,25 @@ snapshots: browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001687 + caniuse-lite: 1.0.30001688 electron-to-chromium: 1.5.41 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001687 + caniuse-lite: 1.0.30001690 electron-to-chromium: 1.5.71 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.75 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + buffer-crc32@0.2.13: {} buffer-from@1.1.2: {} @@ -7759,9 +7863,9 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-require@5.0.0(esbuild@0.24.0): + bundle-require@5.0.0(esbuild@0.24.2): dependencies: - esbuild: 0.24.0 + esbuild: 0.24.2 load-tsconfig: 0.2.5 bytes@3.0.0: {} @@ -7780,25 +7884,32 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 - call-bind-apply-helpers@1.0.0: + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.0 + call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + callsites@3.1.0: {} camelcase-css@2.0.1: {} camelcase@7.0.1: {} - caniuse-lite@1.0.30001687: {} + caniuse-lite@1.0.30001688: {} + + caniuse-lite@1.0.30001690: {} capnp-ts@0.7.0: dependencies: @@ -7834,7 +7945,7 @@ snapshots: chalk@5.0.1: {} - chalk@5.3.0: {} + chalk@5.4.1: {} character-entities-html4@2.1.0: {} @@ -7858,7 +7969,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.1: + chokidar@4.0.3: dependencies: readdirp: 4.0.2 @@ -7926,7 +8037,7 @@ snapshots: confbox@0.1.8: {} - consola@3.2.3: {} + consola@3.3.0: {} content-disposition@0.5.2: {} @@ -7962,23 +8073,23 @@ snapshots: data-uri-to-buffer@2.0.2: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 date-fns@4.1.0: {} @@ -8058,9 +8169,9 @@ snapshots: dotenv@16.4.7: {} - dunder-proto@1.0.0: + dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.0 + call-bind-apply-helpers: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 @@ -8072,87 +8183,91 @@ snapshots: electron-to-chromium@1.5.71: {} + electron-to-chromium@1.5.75: {} + emoji-regex-xs@1.0.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - es-abstract@1.23.5: + es-abstract@1.23.7: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.5 - get-symbol-description: 1.0.2 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.6 + get-symbol-description: 1.1.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.2.0 - is-shared-array-buffer: 1.0.3 - is-string: 1.1.0 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 + object.assign: 4.1.7 regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + safe-array-concat: 1.1.3 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.3 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.16 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 + internal-slot: 1.1.0 + iterator.prototype: 1.1.4 + safe-array-concat: 1.1.3 es-module-lexer@1.5.4: {} @@ -8162,7 +8277,7 @@ snapshots: es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -8173,8 +8288,8 @@ snapshots: es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.1.0 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esast-util-from-estree@2.0.0: dependencies: @@ -8268,32 +8383,33 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - esbuild@0.24.0: + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 escalade@3.2.0: {} @@ -8310,8 +8426,8 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color @@ -8319,7 +8435,7 @@ snapshots: dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 eslint: 8.57.0 fast-glob: 3.3.2 get-tsconfig: 4.8.1 @@ -8327,45 +8443,45 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.17.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.17.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.17.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.1(eslint@8.57.0)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8379,10 +8495,10 @@ snapshots: dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 + es-iterator-helpers: 1.2.1 eslint: 8.57.0 estraverse: 5.3.0 hasown: 2.0.2 @@ -8390,11 +8506,11 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 eslint-scope@5.1.1: @@ -8513,7 +8629,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 require-like: 0.1.2 event-stream@3.3.4: @@ -8573,6 +8689,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.0.3: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -8632,10 +8750,10 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@11.13.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - motion-dom: 11.13.0 - motion-utils: 11.13.0 + motion-dom: 11.14.3 + motion-utils: 11.14.3 tslib: 2.8.1 optionalDependencies: react: 19.0.0 @@ -8659,27 +8777,31 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} gensync@1.0.0-beta.2: {} - get-intrinsic@1.2.5: + get-intrinsic@1.2.6: dependencies: - call-bind-apply-helpers: 1.0.0 - dunder-proto: 1.0.0 + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.0.0 function-bind: 1.1.2 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 get-source@2.0.12: dependencies: @@ -8693,11 +8815,11 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 get-tsconfig@4.8.1: dependencies: @@ -8764,7 +8886,7 @@ snapshots: graphemer@1.4.0: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -8776,7 +8898,7 @@ snapshots: has-proto@1.2.0: dependencies: - dunder-proto: 1.0.0 + dunder-proto: 1.0.1 has-symbols@1.1.0: {} @@ -8809,7 +8931,7 @@ snapshots: transitivePeerDependencies: - supports-color - hast-util-to-html@9.0.3: + hast-util-to-html@9.0.4: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -8847,7 +8969,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hono@4.6.13: {} + hono@4.6.14: {} html-void-elements@3.0.0: {} @@ -8888,11 +9010,11 @@ snapshots: dependencies: kind-of: 6.0.3 - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 invariant@2.2.4: dependencies: @@ -8905,10 +9027,11 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.2.5 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 is-async-function@2.0.0: dependencies: @@ -8916,15 +9039,15 @@ snapshots: is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.0: + is-boolean-object@1.2.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-bun-module@1.3.0: @@ -8933,16 +9056,19 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.15.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-decimal@2.0.1: {} @@ -8951,9 +9077,9 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} @@ -8969,11 +9095,9 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.1.0: + is-number-object@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -8986,48 +9110,48 @@ snapshots: is-port-reachable@4.0.0: {} - is-regex@1.2.0: + is-regex@1.2.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-stream@2.0.1: {} is-stream@4.0.1: {} - is-string@1.1.0: + is-string@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.1.0: + is-symbol@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-symbols: 1.1.0 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.2.5 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 is-wsl@2.2.0: dependencies: @@ -9037,12 +9161,13 @@ snapshots: isexe@2.0.0: {} - iterator.prototype@1.1.3: + iterator.prototype@1.1.4: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.5 + define-data-property: 1.1.4 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 has-symbols: 1.1.0 - reflect.getprototypeof: 1.0.8 + reflect.getprototypeof: 1.0.9 set-function-name: 2.0.2 itty-time@1.0.6: {} @@ -9057,18 +9182,18 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.6: {} + jiti@1.21.7: {} - jiti@2.4.1: + jiti@2.4.2: optional: true - jotai@2.10.3(@types/react@19.0.1)(react@19.0.0): + jotai@2.10.4(@types/react@19.0.2)(react@19.0.0): optionalDependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.2 react: 19.0.0 joycon@3.1.1: {} @@ -9102,7 +9227,7 @@ snapshots: jsondiffpatch@0.6.0: dependencies: '@types/diff-match-patch': 1.0.36 - chalk: 5.3.0 + chalk: 5.4.1 diff-match-patch: 1.0.5 jsonfile@6.1.0: @@ -9114,9 +9239,9 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 keyv@4.5.4: dependencies: @@ -9169,7 +9294,7 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.14: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -9181,6 +9306,8 @@ snapshots: markdown-extensions@2.0.0: {} + math-intrinsics@1.1.0: {} + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -9219,7 +9346,7 @@ snapshots: devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.1 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -9523,7 +9650,7 @@ snapshots: mimic-response@4.0.0: {} - miniflare@3.20241205.0: + miniflare@3.20241218.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -9533,10 +9660,10 @@ snapshots: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20241205.0 + workerd: 1.20241218.0 ws: 8.18.0 youch: 3.3.4 - zod: 3.23.8 + zod: 3.24.1 transitivePeerDependencies: - bufferutil - supports-color @@ -9572,9 +9699,9 @@ snapshots: modern-ahocorasick@1.1.0: {} - motion-dom@11.13.0: {} + motion-dom@11.14.3: {} - motion-utils@11.13.0: {} + motion-utils@11.14.3: {} ms@2.0.0: {} @@ -9598,11 +9725,11 @@ snapshots: neo-async@2.6.2: {} - next-mdx-remote@5.0.0(@types/react@19.0.1)(acorn@8.14.0)(react@19.0.0): + next-mdx-remote@5.0.0(@types/react@19.0.2)(acorn@8.14.0)(react@19.0.0): dependencies: '@babel/code-frame': 7.26.2 '@mdx-js/mdx': 3.1.0(acorn@8.14.0) - '@mdx-js/react': 3.1.0(@types/react@19.0.1)(react@19.0.0) + '@mdx-js/react': 3.1.0(@types/react@19.0.2)(react@19.0.0) react: 19.0.0 unist-util-remove: 3.1.1 vfile: 6.0.3 @@ -9616,6 +9743,8 @@ snapshots: node-releases@2.0.18: {} + node-releases@2.0.19: {} + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -9634,10 +9763,12 @@ snapshots: object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 + es-object-atoms: 1.0.0 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -9651,18 +9782,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 - object.values@1.2.0: + object.values@1.2.1: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -9678,11 +9810,11 @@ snapshots: dependencies: mimic-fn: 2.1.0 - oniguruma-to-es@0.7.0: + oniguruma-to-es@0.8.1: dependencies: emoji-regex-xs: 1.0.0 regex: 5.0.2 - regex-recursion: 4.3.0 + regex-recursion: 5.0.0 optionator@0.9.4: dependencies: @@ -9709,10 +9841,9 @@ snapshots: dependencies: callsites: 3.1.0 - parse-entities@4.0.1: + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 - character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.0.2 @@ -9771,11 +9902,11 @@ snapshots: mlly: 1.7.2 pathe: 1.1.2 - playwright-core@1.49.0: {} + playwright-core@1.49.1: {} - playwright@1.49.0: + playwright@1.49.1: dependencies: - playwright-core: 1.49.0 + playwright-core: 1.49.1 optionalDependencies: fsevents: 2.3.2 @@ -9786,7 +9917,7 @@ snapshots: postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.10 postcss-js@4.0.1(postcss@8.4.49): dependencies: @@ -9800,11 +9931,11 @@ snapshots: optionalDependencies: postcss: 8.4.49 - postcss-load-config@6.0.1(jiti@2.4.1)(postcss@8.4.49)(yaml@2.6.1): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.6.1): dependencies: lilconfig: 3.1.3 optionalDependencies: - jiti: 2.4.1 + jiti: 2.4.2 postcss: 8.4.49 yaml: 2.6.1 @@ -9885,7 +10016,7 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 - react-error-boundary@4.1.2(react@19.0.0): + react-error-boundary@5.0.0(react@19.0.0): dependencies: '@babel/runtime': 7.26.0 react: 19.0.0 @@ -9894,13 +10025,13 @@ snapshots: react-refresh@0.14.2: {} - react-server-dom-webpack@19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15))): + react-server-dom-webpack@19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15))): dependencies: acorn-loose: 8.4.0 neo-async: 2.6.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - webpack: 5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15)) + webpack: 5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15)) webpack-sources: 3.2.3 react-server-dom-webpack@19.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(webpack@5.97.1(esbuild@0.17.19)): @@ -9921,12 +10052,12 @@ snapshots: webpack: 5.97.1 webpack-sources: 3.2.3 - react-textarea-autosize@8.5.5(@types/react@19.0.1)(react@19.0.0): + react-textarea-autosize@8.5.6(@types/react@19.0.2)(react@19.0.0): dependencies: '@babel/runtime': 7.26.0 react: 19.0.0 - use-composed-ref: 1.3.0(react@19.0.0) - use-latest: 1.2.1(@types/react@19.0.1)(react@19.0.0) + use-composed-ref: 1.4.0(@types/react@19.0.2)(react@19.0.0) + use-latest: 1.3.0(@types/react@19.0.2)(react@19.0.0) transitivePeerDependencies: - '@types/react' @@ -9984,20 +10115,20 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - reflect.getprototypeof@1.0.8: + reflect.getprototypeof@1.0.9: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.0 - es-abstract: 1.23.5 + dunder-proto: 1.0.1 + es-abstract: 1.23.7 es-errors: 1.3.0 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 gopd: 1.2.0 - which-builtin-type: 1.2.0 + which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} - regex-recursion@4.3.0: + regex-recursion@5.0.0: dependencies: regex-utilities: 2.3.0 @@ -10067,15 +10198,15 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -10131,29 +10262,29 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.25.0 fsevents: 2.3.3 - rollup@4.28.1: + rollup@4.29.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.29.1 + '@rollup/rollup-android-arm64': 4.29.1 + '@rollup/rollup-darwin-arm64': 4.29.1 + '@rollup/rollup-darwin-x64': 4.29.1 + '@rollup/rollup-freebsd-arm64': 4.29.1 + '@rollup/rollup-freebsd-x64': 4.29.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 + '@rollup/rollup-linux-arm-musleabihf': 4.29.1 + '@rollup/rollup-linux-arm64-gnu': 4.29.1 + '@rollup/rollup-linux-arm64-musl': 4.29.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 + '@rollup/rollup-linux-riscv64-gnu': 4.29.1 + '@rollup/rollup-linux-s390x-gnu': 4.29.1 + '@rollup/rollup-linux-x64-gnu': 4.29.1 + '@rollup/rollup-linux-x64-musl': 4.29.1 + '@rollup/rollup-win32-arm64-msvc': 4.29.1 + '@rollup/rollup-win32-ia32-msvc': 4.29.1 + '@rollup/rollup-win32-x64-msvc': 4.29.1 fsevents: 2.3.3 rsc-html-stream@0.0.4: {} @@ -10162,10 +10293,11 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.2.5 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 has-symbols: 1.1.0 isarray: 2.0.5 @@ -10173,11 +10305,11 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-regex: 1.2.0 + is-regex: 1.2.1 scheduler@0.25.0: {} @@ -10187,6 +10319,13 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + secure-json-parse@2.7.0: {} seek-bzip@2.0.0: @@ -10245,7 +10384,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -10262,22 +10401,43 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.24.0: + shiki@1.24.4: dependencies: - '@shikijs/core': 1.24.0 - '@shikijs/engine-javascript': 1.24.0 - '@shikijs/engine-oniguruma': 1.24.0 - '@shikijs/types': 1.24.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/core': 1.24.4 + '@shikijs/engine-javascript': 1.24.4 + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.5 object-inspect: 1.13.3 + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -10336,11 +10496,11 @@ snapshots: dependencies: duplexer: 0.1.2 - streamx@2.21.0: + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.2.2 + text-decoder: 1.2.3 optionalDependencies: bare-events: 2.5.0 @@ -10356,36 +10516,41 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 gopd: 1.2.0 has-symbols: 1.1.0 - internal-slot: 1.0.7 + internal-slot: 1.1.0 regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.7 es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -10440,7 +10605,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -10468,7 +10633,7 @@ snapshots: react: 19.0.0 use-sync-external-store: 1.4.0(react@19.0.0) - tailwindcss@3.4.16: + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10478,7 +10643,7 @@ snapshots: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.6 + jiti: 1.21.7 lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 @@ -10490,7 +10655,7 @@ snapshots: postcss-load-config: 4.0.2(postcss@8.4.49) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 - resolve: 1.22.8 + resolve: 1.22.10 sucrase: 3.35.0 transitivePeerDependencies: - ts-node @@ -10501,7 +10666,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.0 + streamx: 2.21.1 tar@7.4.3: dependencies: @@ -10516,33 +10681,33 @@ snapshots: dependencies: ps-tree: 1.2.0 - terser-webpack-plugin@5.3.10(@swc/core@1.10.0(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15))): + terser-webpack-plugin@5.3.11(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 - webpack: 5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15)) + webpack: 5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15)) optionalDependencies: - '@swc/core': 1.10.0(@swc/helpers@0.5.15) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) - terser-webpack-plugin@5.3.10(esbuild@0.17.19)(webpack@5.97.1(esbuild@0.17.19)): + terser-webpack-plugin@5.3.11(esbuild@0.17.19)(webpack@5.97.1(esbuild@0.17.19)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 webpack: 5.97.1(esbuild@0.17.19) optionalDependencies: esbuild: 0.17.19 - terser-webpack-plugin@5.3.10(webpack@5.97.1): + terser-webpack-plugin@5.3.11(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 webpack: 5.97.1 @@ -10554,7 +10719,7 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.2.2: + text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -10629,26 +10794,26 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(@swc/core@1.10.0)(jiti@2.4.1)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.6.1): + tsup@8.3.5(@swc/core@1.10.1)(jiti@2.4.2)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.6.1): dependencies: - bundle-require: 5.0.0(esbuild@0.24.0) + bundle-require: 5.0.0(esbuild@0.24.2) cac: 6.7.14 - chokidar: 4.0.1 - consola: 3.2.3 + chokidar: 4.0.3 + consola: 3.3.0 debug: 4.4.0 - esbuild: 0.24.0 + esbuild: 0.24.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.1)(postcss@8.4.49)(yaml@2.6.1) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.6.1) resolve-from: 5.0.0 - rollup: 4.28.1 + rollup: 4.29.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.1 tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.10.0(@swc/helpers@0.5.15) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) postcss: 8.4.49 typescript: 5.7.2 transitivePeerDependencies: @@ -10667,38 +10832,38 @@ snapshots: type-fest@2.19.0: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.3: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 - reflect.getprototypeof: 1.0.8 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.9 typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.8 + reflect.getprototypeof: 1.0.9 typescript@5.7.2: {} @@ -10706,12 +10871,12 @@ snapshots: uint8array-extras@1.4.0: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.8 - has-bigints: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 has-symbols: 1.1.0 - which-boxed-primitive: 1.1.0 + which-boxed-primitive: 1.1.1 unbzip2-stream@1.4.3: dependencies: @@ -10797,6 +10962,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -10808,22 +10979,24 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-composed-ref@1.3.0(react@19.0.0): + use-composed-ref@1.4.0(@types/react@19.0.2)(react@19.0.0): dependencies: react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.2 - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.2)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.2 - use-latest@1.2.1(@types/react@19.0.1)(react@19.0.0): + use-latest@1.3.0(@types/react@19.0.2)(react@19.0.0): dependencies: react: 19.0.0 - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.1)(react@19.0.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.2)(react@19.0.0) optionalDependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.2 use-sync-external-store@1.4.0(react@19.0.0): dependencies: @@ -10848,13 +11021,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@1.6.0(@types/node@22.10.1)(terser@5.37.0): + vite-node@1.6.0(@types/node@22.10.2)(terser@5.37.0): dependencies: cac: 6.7.14 debug: 4.4.0 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -10866,13 +11039,13 @@ snapshots: - supports-color - terser - vite-node@2.1.8(@types/node@22.10.1)(terser@5.37.0): + vite-node@2.1.8(@types/node@22.10.2)(terser@5.37.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -10884,41 +11057,41 @@ snapshots: - supports-color - terser - vite-plugin-stylex-dev@0.7.5(rollup@4.28.1): + vite-plugin-stylex-dev@0.7.5(rollup@4.29.1): dependencies: '@babel/core': 7.25.8 - '@rollup/pluginutils': 5.1.2(rollup@4.28.1) + '@rollup/pluginutils': 5.1.2(rollup@4.29.1) '@stylex-extend/babel-plugin': 0.3.1 '@stylexjs/babel-plugin': 0.6.1 transitivePeerDependencies: - rollup - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0)): + vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.7.2) optionalDependencies: - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.10(@types/node@22.10.1)(terser@5.37.0): + vite@5.4.10(@types/node@22.10.2)(terser@5.37.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.25.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 fsevents: 2.3.3 terser: 5.37.0 - vitest@2.1.8(@types/node@22.10.1)(terser@5.37.0): + vitest@2.1.8(@types/node@22.10.2)(terser@5.37.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.10(@types/node@22.10.1)(terser@5.37.0)) + '@vitest/mocker': 2.1.8(vite@5.4.10(@types/node@22.10.2)(terser@5.37.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -10927,18 +11100,18 @@ snapshots: chai: 5.1.2 debug: 4.4.0 expect-type: 1.1.0 - magic-string: 0.30.14 + magic-string: 0.30.17 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@22.10.1)(terser@5.37.0) - vite-node: 2.1.8(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.10(@types/node@22.10.2)(terser@5.37.0) + vite-node: 2.1.8(@types/node@22.10.2)(terser@5.37.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 transitivePeerDependencies: - less - lightningcss @@ -10975,9 +11148,9 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - browserslist: 4.24.2 + browserslist: 4.24.3 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 @@ -10989,7 +11162,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.97.1) + terser-webpack-plugin: 5.3.11(webpack@5.97.1) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10997,7 +11170,7 @@ snapshots: - esbuild - uglify-js - webpack@5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15)): + webpack@5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -11005,9 +11178,9 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - browserslist: 4.24.2 + browserslist: 4.24.3 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 @@ -11019,7 +11192,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.10.0(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.0(@swc/helpers@0.5.15))) + terser-webpack-plugin: 5.3.11(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.1(@swc/helpers@0.5.15))) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11035,9 +11208,9 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - browserslist: 4.24.2 + browserslist: 4.24.3 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 @@ -11049,7 +11222,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.17.19)(webpack@5.97.1(esbuild@0.17.19)) + terser-webpack-plugin: 5.3.11(esbuild@0.17.19)(webpack@5.97.1(esbuild@0.17.19)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11063,41 +11236,42 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.0: + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.0 - is-number-object: 1.1.0 - is-string: 1.1.0 - is-symbol: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-builtin-type@1.2.0: + which-builtin-type@1.2.1: dependencies: - call-bind: 1.0.8 - function.prototype.name: 1.1.6 + call-bound: 1.0.3 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 is-generator-function: 1.0.10 - is-regex: 1.2.0 - is-weakref: 1.0.2 + is-regex: 1.2.1 + is-weakref: 1.1.0 isarray: 2.0.5 - which-boxed-primitive: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 - which-typed-array@1.1.16: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -11117,33 +11291,32 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20241205.0: + workerd@1.20241218.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20241205.0 - '@cloudflare/workerd-darwin-arm64': 1.20241205.0 - '@cloudflare/workerd-linux-64': 1.20241205.0 - '@cloudflare/workerd-linux-arm64': 1.20241205.0 - '@cloudflare/workerd-windows-64': 1.20241205.0 + '@cloudflare/workerd-darwin-64': 1.20241218.0 + '@cloudflare/workerd-darwin-arm64': 1.20241218.0 + '@cloudflare/workerd-linux-64': 1.20241218.0 + '@cloudflare/workerd-linux-arm64': 1.20241218.0 + '@cloudflare/workerd-windows-64': 1.20241218.0 - wrangler@3.93.0: + wrangler@3.99.0: dependencies: '@cloudflare/kv-asset-handler': 0.3.4 - '@cloudflare/workers-shared': 0.10.0 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 - chokidar: 4.0.1 + chokidar: 4.0.3 date-fns: 4.1.0 esbuild: 0.17.19 itty-time: 1.0.6 - miniflare: 3.20241205.0 + miniflare: 3.20241218.0 nanoid: 3.3.8 path-to-regexp: 6.3.0 - resolve: 1.22.8 + resolve: 1.22.10 selfsigned: 2.4.1 source-map: 0.6.1 unenv: unenv-nightly@2.0.0-20241204-140205-a5d5190 - workerd: 1.20241205.0 + workerd: 1.20241218.0 xxhash-wasm: 1.1.0 optionalDependencies: fsevents: 2.3.3 @@ -11189,10 +11362,10 @@ snapshots: mustache: 4.2.0 stacktracey: 2.1.8 - zod-to-json-schema@3.23.5(zod@3.23.8): + zod-to-json-schema@3.24.1(zod@3.24.1): dependencies: - zod: 3.23.8 + zod: 3.24.1 - zod@3.23.8: {} + zod@3.24.1: {} zwitch@2.0.4: {} diff --git a/tsconfig.e2e.json b/tsconfig.e2e.json index 66d82d064..9ec7e2831 100644 --- a/tsconfig.e2e.json +++ b/tsconfig.e2e.json @@ -16,7 +16,7 @@ "path": "./e2e/fixtures/ssr-basic/tsconfig.json" }, { - "path": "./e2e/fixtures/rsc-router/tsconfig.json" + "path": "./e2e/fixtures/define-router/tsconfig.json" }, { "path": "./e2e/fixtures/ssr-target-bundle/tsconfig.json" @@ -50,6 +50,9 @@ }, { "path": "./e2e/fixtures/hot-reload/tsconfig.json" + }, + { + "path": "./e2e/fixtures/create-pages/tsconfig.json" } ] }