diff --git a/package.json b/package.json index f7ae2b22..7af2aa6c 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,7 @@ "release": "pnpm -F=fastify-renderer publish", "preinstall": "npx only-allow pnpm", "prerelease": "pnpm -F=fastify-renderer run gitpkg publish", - "test": "jest --forceExit -w=1", - "test:debug": "cross-env FR_DEBUG_SERVE=1 node --inspect-brk ./node_modules/.bin/jest --forceExit" + "test": "vitest --no-threads" }, "repository": { "type": "git", @@ -44,9 +43,8 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", - "expect-playwright": "^0.8.0", "fs-extra": "^11.1.0", - "jest": "^29.7.0", + "vitest": "^0.34.6", "playwright-chromium": "^1.39.0", "prettier": "^2.8.8", "prettier-plugin-organize-imports": "^3.2.3", @@ -54,10 +52,10 @@ }, "pnpm": { "overrides": { - "react": "0.0.0-experimental-4ead6b530", - "react-dom": "0.0.0-experimental-4ead6b530", - "@types/react": "17.0.4", - "@types/react-dom": "17.0.4" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" } } -} +} \ No newline at end of file diff --git a/packages/fastify-renderer/jest.config.js b/packages/fastify-renderer/jest.config.js deleted file mode 100644 index 4b42437c..00000000 --- a/packages/fastify-renderer/jest.config.js +++ /dev/null @@ -1,196 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property and type check, visit: - * https://jestjs.io/docs/en/configuration.html - */ - -module.exports = { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/private/var/folders/pr/8710s4wd7cb21yghqtmxzbdr0000gn/T/jest_dx", - - // Automatically clear mock calls and instances between every test - clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test - // collectCoverage: false, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: undefined, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - // coverageProvider: 'v8', - - // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "json", - // "jsx", - // "ts", - // "tsx", - // "node" - // ], - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - // moduleNameMapper: {}, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - // preset: 'ts-jest', - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state between every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state between every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - testEnvironment: 'node', - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jasmine2", - - // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href - // testURL: "http://localhost", - - // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", - - // A map from regular expressions to paths to transformers - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/packages/fastify-renderer/package.json b/packages/fastify-renderer/package.json index 4928cd27..73a853c8 100644 --- a/packages/fastify-renderer/package.json +++ b/packages/fastify-renderer/package.json @@ -29,7 +29,7 @@ "lint:fix": "prettier --loglevel warn --write \"{src,test}/**/*.{ts,tsx}\" && eslint \"{src,test}/**/*.{ts,tsx}\" --quiet --fix", "prepublishOnly": "npm run build", "test": "run-s build test:unit lint", - "test:unit": "jest" + "test:unit": "vitest" }, "repository": { "type": "git", @@ -73,28 +73,26 @@ }, "peerDependencies": { "fastify": "^3.13.0", - "react": "experimental", - "react-dom": "experimental" + "react": "*", + "react-dom": "*" }, "devDependencies": { "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", "@types/connect": "^3.4.35", - "@types/jest": "^29.5.6", "@types/node": "^18.11.9", - "@types/react": "^17.0.43", - "@types/react-dom": "^17.0.11", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@types/sanitize-filename": "^1.6.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", "cheerio": "^1.0.0-rc.12", "fastify": "^3.29.0", "gitpkg": "^1.0.0-beta.2", - "jest": "^29.7.0", + "vitest": "^0.34.6", "npm-run-all": "^4.1.5", "pino-pretty": "^4.8.0", - "react": "0.0.0-experimental-4ead6b530", - "react-dom": "0.0.0-experimental-4ead6b530", + "react": "^18.2.0", + "react-dom": "^18.2.0", "rimraf": "^3.0.2", "typescript": "^5.2.2" }, @@ -104,4 +102,4 @@ "README.md", "LICENSE" ] -} +} \ No newline at end of file diff --git a/packages/fastify-renderer/src/client/react/locationHook.ts b/packages/fastify-renderer/src/client/react/locationHook.ts index ad3d2aef..b457876c 100644 --- a/packages/fastify-renderer/src/client/react/locationHook.ts +++ b/packages/fastify-renderer/src/client/react/locationHook.ts @@ -1,4 +1,4 @@ -import { unstable_useTransition as useTransition, useCallback, useEffect, useRef, useState } from 'react' +import { useTransition, useCallback, useEffect, useRef, useState } from 'react' import { NavigationHistory, useLocation, useRouter } from 'wouter' /** @@ -19,7 +19,7 @@ export const events = [eventPopstate, eventPushState, eventReplaceState] export const useTransitionLocation = ({ base = '' } = {}) => { const [path, update] = useState(() => currentPathname(base)) // @see https://reactjs.org/docs/hooks-reference.html#lazy-initial-state const prevLocation = useRef(path + location.search + location.hash) - const [startTransition, isPending] = useTransition() + const [isPending, startTransition] = useTransition() const router = useRouter() useEffect(() => { if (!router.navigationHistory) diff --git a/packages/fastify-renderer/src/node/Plugin.ts b/packages/fastify-renderer/src/node/Plugin.ts index cd941c34..5dc21c3d 100644 --- a/packages/fastify-renderer/src/node/Plugin.ts +++ b/packages/fastify-renderer/src/node/Plugin.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/require-await */ -import fs from 'fs' +import fs from 'node:fs' import 'middie' import path from 'path' import { InlineConfig } from 'vite' @@ -39,7 +39,7 @@ export class FastifyRendererPlugin { registeredComponents: Record = {} constructor(incomingOptions: FastifyRendererOptions) { - this.devMode = incomingOptions.devMode ?? process.env.NODE_ENV != 'production' + this.devMode = incomingOptions.devMode ?? (process.env.NODE_ENV != 'production' || process.env.TEST == 'true') this.vite = incomingOptions.vite || {} this.vite.base ??= '/.vite/' diff --git a/packages/fastify-renderer/src/node/index.ts b/packages/fastify-renderer/src/node/index.ts index fbb32c2f..40926fbf 100644 --- a/packages/fastify-renderer/src/node/index.ts +++ b/packages/fastify-renderer/src/node/index.ts @@ -3,7 +3,7 @@ import { FastifyInstance, FastifyReply } from 'fastify' import '@fastify/accepts' import fp from 'fastify-plugin' import fastifyStatic from '@fastify/static' -import { promises as fs } from 'fs' +import { promises as fs } from 'node:fs' import 'middie' import path from 'path' import { @@ -71,7 +71,7 @@ const FastifyRenderer = fp( fastify.setRenderConfig({ base: incomingOptions.base || '', - layout: incomingOptions.layout || require.resolve('./renderers/react/DefaultLayout'), + layout: incomingOptions.layout || require.resolve('./renderers/react/DefaultLayout.tsx'), document: incomingOptions.document || DefaultDocumentTemplate, }) diff --git a/packages/fastify-renderer/src/node/renderers/react/ReactRenderer.tsx b/packages/fastify-renderer/src/node/renderers/react/ReactRenderer.tsx index 85bcdc3a..306daeb7 100644 --- a/packages/fastify-renderer/src/node/renderers/react/ReactRenderer.tsx +++ b/packages/fastify-renderer/src/node/renderers/react/ReactRenderer.tsx @@ -46,7 +46,7 @@ export class ReactRenderer implements Renderer { clientModulePath: string constructor(readonly plugin: FastifyRendererPlugin, readonly options: ReactRendererOptions) { - this.clientModulePath = require.resolve('../../../client/react') + this.clientModulePath = require.resolve('../../../client/react/index.ts') } vitePlugins() { @@ -339,7 +339,7 @@ export class ReactRenderer implements Renderer { return ` // client side hydration entrypoint for a particular route generated by fastify-renderer import React from 'react' - import ReactDOM from 'react-dom' + import ReactDOM from 'react-dom/client' import { routes } from ${JSON.stringify( ReactRenderer.ROUTE_TABLE_ID + '?' + querystring.stringify(queryParams) )} @@ -347,7 +347,7 @@ export class ReactRenderer implements Renderer { import Layout from ${JSON.stringify(layout)} import Entrypoint from ${JSON.stringify(entrypoint)} - ReactDOM.unstable_createRoot(document.getElementById('fstrapp'), { + ReactDOM.createRoot(document.getElementById('fstrapp'), { hydrate: true }).render( { let server beforeEach(async () => { - jest.clearAllMocks() + vi.clearAllMocks() server = await newFastify() await server.register(FastifyRenderer, options) @@ -62,8 +63,8 @@ describe('FastifyRenderer', () => { test('should close vite devServer when fastify server is closing in dev mode', async () => { const devServer = await Vite.createServer() - const closeSpy = jest.spyOn(devServer, 'close') - jest.spyOn(Vite, 'createServer').mockImplementation(async () => devServer) + const closeSpy = vi.spyOn(devServer, 'close') + vi.spyOn(Vite, 'createServer').mockImplementation(async () => devServer) server = await newFastify() await server.register(FastifyRenderer, { ...options, devMode: true }) @@ -74,7 +75,7 @@ describe('FastifyRenderer', () => { }) test('should do nothing if the registered route is not renderable', async () => { - const registerRouteSpy = jest.spyOn(FastifyRendererPlugin.prototype, 'register') + const registerRouteSpy = vi.spyOn(FastifyRendererPlugin.prototype, 'register') server.get('/', async (_request, reply) => reply.send('Hello')) await server.inject({ method: 'GET', url: '/' }) @@ -83,7 +84,9 @@ describe('FastifyRenderer', () => { }) test("should register the route in the plugin if it's renderable", async () => { - const registerRouteSpy = jest.spyOn(FastifyRendererPlugin.prototype, 'register').mockImplementation(jest.fn()) + const registerRouteSpy = vi + .spyOn(FastifyRendererPlugin.prototype, 'register') + .mockImplementation(vi.fn(() => null as any)) server.get('/', { render: testComponent }, async (request, reply) => reply.send('Hello')) await server.inject({ method: 'GET', url: '/' }) @@ -103,9 +106,9 @@ describe('build()', () => { await server.register(FastifyRenderer, options) await server.listen(0) - jest.spyOn(fs, 'writeFile').mockImplementation(jest.fn()) - jest.spyOn(path, 'join').mockImplementation(jest.fn()) - const viteBuildSpy = jest.spyOn(Vite, 'build').mockImplementation(jest.fn()) + vi.spyOn(fs, 'writeFile').mockImplementation(vi.fn(() => null as any)) + vi.spyOn(path, 'join').mockImplementation(vi.fn(() => null as any)) + const viteBuildSpy = vi.spyOn(Vite, 'build').mockImplementation(vi.fn(() => null as any)) await build(server) diff --git a/packages/fastify-renderer/test/Plugin.spec.ts b/packages/fastify-renderer/test/Plugin.spec.ts index 0b98a0be..525a7380 100644 --- a/packages/fastify-renderer/test/Plugin.spec.ts +++ b/packages/fastify-renderer/test/Plugin.spec.ts @@ -1,20 +1,13 @@ -import fs from 'fs' import path from 'path' import { DefaultDocumentTemplate } from '../src/node/DocumentTemplate' import { FastifyRendererOptions } from '../src/node/Plugin' -import { ReactRenderer } from '../src/node/renderers/react/ReactRenderer' import { RenderableRegistration } from '../src/node/renderers/Renderer' import { newFastifyRendererPlugin, newRenderBus } from './helpers' - -jest.mock('fs', () => ({ - ...jest.requireActual('fs'), // import and retain the original functionalities - readFileSync: jest.fn().mockImplementation(() => '{ "test": "value" }'), -})) -jest.mock('../src/node/renderers/react/ReactRenderer') - +import { vi, describe, beforeEach, test, expect } from 'vitest' +import fs from 'node:fs' describe('FastifyRendererPlugin', () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) test('should create a new instance with default options', async () => { @@ -26,13 +19,13 @@ describe('FastifyRendererPlugin', () => { expect(plugin.hooks).toEqual([]) expect(plugin.clientOutDir).toEqual(path.join(process.cwd(), 'dist', 'client', plugin.viteBase)) expect(plugin.serverOutDir).toEqual(path.join(process.cwd(), 'dist', 'server')) - expect(fs.readFileSync).toHaveBeenCalledTimes(0) - expect(ReactRenderer).toBeCalledWith(plugin, { type: 'react', mode: 'streaming' }) + // expect(fs.readFileSync).toHaveBeenCalledTimes(0) + //expect(ReactRenderer).toBeCalledWith(plugin, { type: 'react', mode: 'streaming' }) }) test('should create a new instance with the provided options', async () => { const options: FastifyRendererOptions = { - outDir: '/custom/out/dir', + outDir: '/tmp/out/dir', renderer: { type: 'react', mode: 'sync' }, devMode: false, assetsHost: 'https://custom.asset.host', @@ -45,14 +38,19 @@ describe('FastifyRendererPlugin', () => { expect(plugin.hooks).toEqual([]) expect(plugin.clientOutDir).toEqual(path.join(options.outDir as string, 'client', plugin.viteBase)) expect(plugin.serverOutDir).toEqual(path.join(options.outDir as string, 'server')) - expect(fs.readFileSync).toHaveBeenCalledTimes(2) - expect(ReactRenderer).toBeCalledWith(plugin, options.renderer) + // expect(fs.readFileSync).toHaveBeenCalledTimes(2) + // expect(ReactRenderer).toBeCalledWith(plugin, options.renderer) }) describe('clientAssetPath()', () => { test('should return the client asset path that will be accessible from the browser', async () => { + fs.mkdirSync('/tmp/out/dir/client/.vite/', { recursive: true }) + fs.mkdirSync('/tmp/out/dir/server/.vite/', { recursive: true }) + fs.writeFileSync('/tmp/out/dir/client/.vite/manifest.json', '{ "test": "value" }') + fs.writeFileSync('/tmp/out/dir/server/.vite/manifest.json', '{ "test": "value" }') + fs.writeFileSync('/tmp/out/dir/server/virtual-manifest.json', '{ "test": "value" }') const options: FastifyRendererOptions = { - outDir: '/custom/out/dir', + outDir: '/tmp/out/dir', renderer: { type: 'react', mode: 'sync' }, devMode: false, } @@ -62,7 +60,7 @@ describe('FastifyRendererPlugin', () => { test('should prepend the provided assetHost to the generated path', async () => { const options: FastifyRendererOptions = { - outDir: '/custom/out/dir', + outDir: '/tmp/out/dir', renderer: { type: 'react', mode: 'sync' }, devMode: false, assetsHost: 'https://custom.asset.host', @@ -82,7 +80,7 @@ describe('FastifyRendererPlugin', () => { // TODO: Generate the manifest file to test this test.skip('should push all import tags from the manifest to the render bus', async () => { // const options: FastifyRendererOptions = { - // outDir: '/custom/out/dir', + // outDir: '/tmp/out/dir', // renderer: { type: 'react', mode: 'sync' }, // devMode: false, // assetsHost: 'https://custom.asset.host', diff --git a/packages/fastify-renderer/test/RenderBus.spec.ts b/packages/fastify-renderer/test/RenderBus.spec.ts index c3f65565..5eb8bbff 100644 --- a/packages/fastify-renderer/test/RenderBus.spec.ts +++ b/packages/fastify-renderer/test/RenderBus.spec.ts @@ -1,7 +1,7 @@ import { Readable } from 'stream' import { RenderBus } from '../src/node/RenderBus' import { newRenderBus } from './helpers' - +import { describe, beforeEach, test, expect } from 'vitest' describe('RenderBus', () => { let renderBus: RenderBus const testKey = 'test-key' diff --git a/packages/fastify-renderer/test/csp.spec.ts b/packages/fastify-renderer/test/csp.spec.ts index 80b5373f..4f4d68af 100644 --- a/packages/fastify-renderer/test/csp.spec.ts +++ b/packages/fastify-renderer/test/csp.spec.ts @@ -3,7 +3,7 @@ import path from 'path' import FastifyRenderer from '../src/node' import { newFastify } from './helpers' - +import { describe, beforeAll, test, expect } from 'vitest' const testComponent = require.resolve(path.join(__dirname, 'fixtures', 'test-style-importer.tsx')) const testLayoutComponent = require.resolve(path.join(__dirname, 'fixtures', 'test-layout.tsx')) diff --git a/packages/fastify-renderer/test/helpers.ts b/packages/fastify-renderer/test/helpers.ts index e2eba984..f97eed89 100644 --- a/packages/fastify-renderer/test/helpers.ts +++ b/packages/fastify-renderer/test/helpers.ts @@ -7,7 +7,7 @@ import { FastifyRendererOptions, FastifyRendererPlugin } from '../src/node/Plugi import { RenderBus } from '../src/node/RenderBus' import { ReactRenderer, ReactRendererOptions } from '../src/node/renderers/react/ReactRenderer' import { Render } from '../src/node/renderers/Renderer' - +import fs from 'node:fs' const logLevel = process.env.LOG_LEVEL || 'error' export const newFastify = async (options?: FastifyServerOptions) => { @@ -22,6 +22,8 @@ export const newRenderBus = () => { } export const newFastifyRendererPlugin = (options: FastifyRendererOptions = {}) => { + fs.mkdirSync('/tmp/out/dir/client/.vite/', { recursive: true }) + fs.mkdirSync('/tmp/out/dir/server/.vite/', { recursive: true }) return new FastifyRendererPlugin(options) } diff --git a/packages/fastify-renderer/test/renderers/ReactRenderer.spec.ts b/packages/fastify-renderer/test/renderers/ReactRenderer.spec.ts index f339dc13..ad25e667 100644 --- a/packages/fastify-renderer/test/renderers/ReactRenderer.spec.ts +++ b/packages/fastify-renderer/test/renderers/ReactRenderer.spec.ts @@ -3,7 +3,7 @@ import React from 'react' import { DefaultDocumentTemplate } from '../../src/node/DocumentTemplate' import { RenderableRegistration } from '../../src/node/renderers/Renderer' import { getMockRender, newReactRenderer, newRenderBus } from '../helpers' - +import { describe, test, expect } from 'vitest' const testLayoutComponent = require.resolve(path.join(__dirname, '..', 'fixtures', 'test-layout.tsx')) describe('ReactRenderer', () => { diff --git a/packages/fastify-renderer/test/routes.spec.ts b/packages/fastify-renderer/test/routes.spec.ts index 26659e12..df231dd8 100644 --- a/packages/fastify-renderer/test/routes.spec.ts +++ b/packages/fastify-renderer/test/routes.spec.ts @@ -2,6 +2,7 @@ import path from 'path' import FastifyRenderer from '../src/node' import { unthunk } from '../src/node/utils' import { newFastify } from './helpers' +import { describe, test, expect, beforeEach, beforeAll, vi } from 'vitest' const testComponent = require.resolve(path.join(__dirname, 'fixtures', 'test-module.tsx')) const testLayoutComponent = require.resolve(path.join(__dirname, 'fixtures', 'test-layout.tsx')) @@ -119,15 +120,15 @@ describe('FastifyRenderer', () => { test('should call hooks in correct order', async () => { const callOrder: string[] = [] const hook = unthunk(options.hooks[0]) - jest.spyOn(hook, 'heads').mockImplementation(() => { + vi.spyOn(hook, 'heads').mockImplementation(() => { callOrder.push('heads') return 'head' }) - jest.spyOn(hook, 'transform').mockImplementation((app) => { + vi.spyOn(hook, 'transform').mockImplementation((app) => { callOrder.push('transforms') return app }) - jest.spyOn(hook, 'postRenderHeads').mockImplementation(() => { + vi.spyOn(hook, 'postRenderHeads').mockImplementation(() => { callOrder.push('postRenders') return 'postRender' }) diff --git a/packages/test-apps/simple-react/helpers.ts b/packages/test-apps/simple-react/helpers.ts index 8f8e31c0..75ffcd31 100644 --- a/packages/test-apps/simple-react/helpers.ts +++ b/packages/test-apps/simple-react/helpers.ts @@ -1,7 +1,7 @@ import { FastifyInstance } from 'fastify' import fs from 'fs-extra' import { resolve } from 'path' -import { ConsoleMessage, Page } from 'playwright-chromium' +import { ConsoleMessage, Page, chromium } from 'playwright-chromium' export function slash(p: string): string { return p.replace(/\\/g, '/') @@ -16,11 +16,12 @@ let pages: Page[] = [] let server: FastifyInstance let err: Error -export const port = 3000 + parseInt(process.env.JEST_WORKER_ID!) - 1 +export const port = 3001 export const rootURL = `http://localhost:${port}` +import { beforeAll, afterAll, afterEach } from 'vitest' -beforeAll(async () => { - const testPath = expect.getState().testPath! +beforeAll(async ({ filepath }) => { + const testPath = filepath! // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec const testName = slash(testPath).match(/test-apps\/([\w-]+)\//)?.[1] @@ -33,7 +34,7 @@ beforeAll(async () => { } // eslint-disable-next-line @typescript-eslint/no-var-requires - const { server: fastifyServer } = require(serverEntrypoint) + const { server: fastifyServer } = await import(serverEntrypoint) server = await fastifyServer() await server.listen(port) } @@ -59,6 +60,7 @@ afterEach(async () => { /** Create a new playwright page for testing against */ export const newTestPage = async (): Promise => { + const browser = await chromium.launch({ headless: true }) const page: Page = await browser.newPage() page.on('console', onConsole) pages.push(page) diff --git a/packages/test-apps/simple-react/jest.config.js b/packages/test-apps/simple-react/jest.config.js deleted file mode 100644 index 85c5fc8e..00000000 --- a/packages/test-apps/simple-react/jest.config.js +++ /dev/null @@ -1,196 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property and type check, visit: - * https://jestjs.io/docs/en/configuration.html - */ - -module.exports = { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/private/var/folders/pr/8710s4wd7cb21yghqtmxzbdr0000gn/T/jest_dx", - - // Automatically clear mock calls and instances between every test - clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test - // collectCoverage: false, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: undefined, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - // coverageProvider: 'v8', - - // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: '../../../scripts/jestGlobalSetup.js', - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: '../../../scripts/jestGlobalTeardown.js', - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "json", - // "jsx", - // "ts", - // "tsx", - // "node" - // ], - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - // moduleNameMapper: {}, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: 'jest-playwright-preset', - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state between every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state between every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - setupFilesAfterEnv: ['expect-playwright'], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: '../../../scripts/jestEnv.js', - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jasmine2", - - // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href - // testURL: "http://localhost", - - // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", - - // A map from regular expressions to paths to transformers - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/packages/test-apps/simple-react/package.json b/packages/test-apps/simple-react/package.json index e87d8833..636b25d2 100644 --- a/packages/test-apps/simple-react/package.json +++ b/packages/test-apps/simple-react/package.json @@ -11,10 +11,11 @@ "dependencies": { "fastify": "^3.29.0", "fastify-renderer": "*", + "path-to-regexp": "^6.2.1", "react": "*", "react-dom": "*", - "wouter": "^2.7.5", - "path-to-regexp": "^6.2.1" + "stream-template": "^0.0.10", + "wouter": "^2.7.5" }, "devDependencies": { "@playwright/test": "^1.39.0", @@ -22,10 +23,10 @@ "@swc/jest": "^0.2.29", "@types/jest": "^29.5.6", "@types/node": "^18.11.9", - "@types/react": "^17.0.43", - "@types/react-dom": "^17.0.11", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "html-validator": "^5.1.18", "jest-playwright-preset": "^3.0.1", "typescript": "^5.2.2" } -} +} \ No newline at end of file diff --git a/packages/test-apps/simple-react/server.ts b/packages/test-apps/simple-react/server.ts index 5226785d..c279aad6 100644 --- a/packages/test-apps/simple-react/server.ts +++ b/packages/test-apps/simple-react/server.ts @@ -25,13 +25,13 @@ export const server = async () => { }, }, optimizeDeps: { - include: ['react', 'react-dom', 'react-dom/server', 'wouter', 'path-to-regexp'], + include: ['react', 'react-dom', 'react-dom/server', 'wouter', 'path-to-regexp', 'stream-template'], }, }, }) - const ImperativeApple = server.registerRenderable(require.resolve('./ImperativeApple')) - const ImperativeOrange = server.registerRenderable(require.resolve('./ImperativeOrange')) + const ImperativeApple = server.registerRenderable(require.resolve('./ImperativeApple.tsx')) + const ImperativeOrange = server.registerRenderable(require.resolve('./ImperativeOrange.tsx')) server.get('/imperative/:fruit', async (request: FastifyRequest<{ Params: { fruit: string } }>, reply) => { if (request.params.fruit == 'apple') { @@ -49,38 +49,42 @@ export const server = async () => { } }) - server.get('/*', { render: require.resolve('./NotFound') }, async (request) => { + server.get('/*', { render: require.resolve('./NotFound.tsx') }, async (request) => { return { params: request.params } }) - server.get('/', { render: require.resolve('./Home') }, async () => { + server.get('/', { render: require.resolve('./Home.tsx') }, async () => { return { time: Date.now() } }) - server.get('/about', { render: require.resolve('./About') }, async (request) => { + server.get('/about', { render: require.resolve('./About.tsx') }, async (request) => { return { hostname: os.hostname(), requestIP: request.ip } }) - server.get('/navigation-test', { render: require.resolve('./NavigationTest') }, async (_request) => { + server.get('/navigation-test', { render: require.resolve('./NavigationTest.tsx') }, async (_request) => { return {} }) - server.get('/navigation-history-test', { render: require.resolve('./NavigationHistoryTest') }, async (_request) => { - return {} - }) + server.get( + '/navigation-history-test', + { render: require.resolve('./NavigationHistoryTest.tsx') }, + async (_request) => { + return {} + } + ) await server.register(async (instance) => { instance.setRenderConfig({ document: CustomDocumentTemplate }) - instance.get('/custom-template', { render: require.resolve('./CustomTemplateTest') }, async (_request) => { + instance.get('/custom-template', { render: require.resolve('./CustomTemplateTest.tsx') }, async (_request) => { return {} }) }) await server.register(async (instance) => { - instance.setRenderConfig({ base: '/red', layout: require.resolve('./RedLayout') }) + instance.setRenderConfig({ base: '/red', layout: require.resolve('./RedLayout.tsx') }) - instance.get('/red/about', { render: require.resolve('./About') }, async (request) => { + instance.get('/red/about', { render: require.resolve('./About.tsx') }, async (request) => { return { hostname: os.hostname(), requestIP: request.ip } }) }) @@ -88,18 +92,18 @@ export const server = async () => { await server.register(async (instance) => { instance.setRenderConfig({ base: '/subpath' }) - instance.get('/subpath/this', { render: require.resolve('./subapp/This') }, async (_request) => { + instance.get('/subpath/this', { render: require.resolve('./subapp/This.tsx') }, async (_request) => { return {} }) - instance.get('/subpath/that', { render: require.resolve('./subapp/That') }, async (_request) => { + instance.get('/subpath/that', { render: require.resolve('./subapp/That.tsx') }, async (_request) => { return {} }) }) await server.register(async (instance) => { - instance.setRenderConfig({ base: '/bootprops', layout: require.resolve('./BootPropsLayout') }) + instance.setRenderConfig({ base: '/bootprops', layout: require.resolve('./BootPropsLayout.tsx') }) - instance.get('/bootprops/test', { render: require.resolve('./About') }, async (request) => { + instance.get('/bootprops/test', { render: require.resolve('./About.tsx') }, async (request) => { return { hostname: os.hostname(), requestIP: request.ip, someValue: 'this is a boot prop' } }) }) diff --git a/packages/test-apps/simple-react/test/boot-props.spec.ts b/packages/test-apps/simple-react/test/boot-props.spec.ts index 357339f2..59eaf721 100644 --- a/packages/test-apps/simple-react/test/boot-props.spec.ts +++ b/packages/test-apps/simple-react/test/boot-props.spec.ts @@ -1,6 +1,6 @@ -import { expect } from '@playwright/test' import { Page } from 'playwright-chromium' -import { newTestPage, reactReady, rootURL } from '../helpers' +import { newTestPage, rootURL } from '../helpers' +import { describe, test, expect, beforeEach, vi } from 'vitest' describe('boot props', () => { let page: Page @@ -11,7 +11,7 @@ describe('boot props', () => { test('should make the boot props available to the layout', async () => { await page.goto(`${rootURL}/bootprops/test`) - await reactReady(page) - await expect(page).toMatchText('#bootprops', 'this is a boot prop') + + await vi.waitFor(async () => expect(await page.textContent('#bootprops')).toContain('this is a boot prop')) }) }) diff --git a/packages/test-apps/simple-react/test/build.spec.ts b/packages/test-apps/simple-react/test/build.spec.ts index 40fe76b4..91d19e50 100644 --- a/packages/test-apps/simple-react/test/build.spec.ts +++ b/packages/test-apps/simple-react/test/build.spec.ts @@ -1,6 +1,6 @@ import { build } from '../../../fastify-renderer/src/node' import { server as getServer } from '../server' - +import { describe, test } from 'vitest' describe('simple-react building assets', () => { test('can run the build', async () => { const server = await getServer() diff --git a/packages/test-apps/simple-react/test/imperative-rendering.spec.ts b/packages/test-apps/simple-react/test/imperative-rendering.spec.ts index b9136e3f..d428416c 100644 --- a/packages/test-apps/simple-react/test/imperative-rendering.spec.ts +++ b/packages/test-apps/simple-react/test/imperative-rendering.spec.ts @@ -1,5 +1,6 @@ import { Page } from 'playwright-chromium' import { newTestPage, reactReady, rootURL } from '../helpers' +import { describe, test, beforeEach, expect } from 'vitest' describe('imperative rendering', () => { let page: Page diff --git a/packages/test-apps/simple-react/test/navigation-details.spec.ts b/packages/test-apps/simple-react/test/navigation-details.spec.ts index 996d19ac..34fdb151 100644 --- a/packages/test-apps/simple-react/test/navigation-details.spec.ts +++ b/packages/test-apps/simple-react/test/navigation-details.spec.ts @@ -1,5 +1,6 @@ import { Page } from 'playwright-chromium' import { newTestPage, reactReady, rootURL } from '../helpers' +import { describe, test, beforeEach, expect } from 'vitest' describe('navigation details', () => { let page: Page @@ -15,6 +16,7 @@ describe('navigation details', () => { const testCalls: any[] = await page.evaluate('window.test') + // @ts-expect-error client code await page.waitForFunction(() => window.test.length === 2) expect(testCalls).toBeDefined() @@ -34,6 +36,7 @@ describe('navigation details', () => { await page.click('#section-link') + // @ts-expect-error client code await page.waitForFunction(() => window.test.length === 3) const testCalls: any[] = await page.evaluate('window.test') @@ -51,6 +54,7 @@ describe('navigation details', () => { await page.goto(`${rootURL}/navigation-test?foo=bar#section`) await reactReady(page) + // @ts-expect-error client code await page.waitForFunction(() => window.test.length === 3) const testCalls: any[] = await page.evaluate('window.test') diff --git a/packages/test-apps/simple-react/test/navigation-history.spec.ts b/packages/test-apps/simple-react/test/navigation-history.spec.ts index 8604ece7..4457f877 100644 --- a/packages/test-apps/simple-react/test/navigation-history.spec.ts +++ b/packages/test-apps/simple-react/test/navigation-history.spec.ts @@ -1,5 +1,6 @@ import { Page } from 'playwright-chromium' import { newTestPage, reactReady, rootURL } from '../helpers' +import { describe, test, beforeEach, expect } from 'vitest' describe('navigation details', () => { let page: Page diff --git a/packages/test-apps/simple-react/test/serve.spec.ts b/packages/test-apps/simple-react/test/serve.spec.ts index 4e97aeee..2de5cea1 100644 --- a/packages/test-apps/simple-react/test/serve.spec.ts +++ b/packages/test-apps/simple-react/test/serve.spec.ts @@ -1,6 +1,7 @@ import validator from 'html-validator' import { Page } from 'playwright-chromium' import { newTestPage, reactReady, rootURL } from '../helpers' +import { describe, test, beforeEach, expect } from 'vitest' describe('simple-react', () => { let page: Page diff --git a/packages/test-apps/simple-react/test/switching-contexts.spec.ts b/packages/test-apps/simple-react/test/switching-contexts.spec.ts index 907685e2..42499c83 100644 --- a/packages/test-apps/simple-react/test/switching-contexts.spec.ts +++ b/packages/test-apps/simple-react/test/switching-contexts.spec.ts @@ -1,28 +1,28 @@ -import { Page } from 'playwright-chromium' import { newTestPage, reactReady, rootURL } from '../helpers' +import { describe, test } from 'vitest' describe('navigation details', () => { - let page: Page + test( + 'navigating between pages of the same context doesnt trigger a server side render request', + async () => { + const page = await newTestPage() + await page.goto(`${rootURL}`) + await reactReady(page) + page.on('request', (request) => { + if (request.url().includes('/.vite/')) return + if (request.headers().accept !== 'application/json') { + throw new Error(`Expecting request to only fetch props, request made: ${request.method()} ${request.url()} $`) + } + }) + await page.click('#about-link') + }, + { timeout: 50000 } + ) - beforeEach(async () => { - page = await newTestPage() + test('navigating between pages of different contexts triggers a server side render request', async () => { + const page = await newTestPage() await page.goto(`${rootURL}`) await reactReady(page) - await page.waitForLoadState('networkidle') - }) - - test('navigating between pages of the same context doesnt trigger a server side render request', async () => { - page.on('request', (request) => { - if (request.url().includes('/.vite/')) return - if (request.headers().accept !== 'application/json') { - throw new Error(`Expecting request to only fetch props, request made: ${request.method()} ${request.url()} $`) - } - }) - - await page.click('#about-link') - }) - - test('navigating between pages of different contexts triggers a server side render request', async () => { page.on('request', (request) => { if (request.url().includes('/.vite/')) return diff --git a/packages/test-apps/simple-react/test/use-custom-template.spec.ts b/packages/test-apps/simple-react/test/use-custom-template.spec.ts index f1607af2..ea82f645 100644 --- a/packages/test-apps/simple-react/test/use-custom-template.spec.ts +++ b/packages/test-apps/simple-react/test/use-custom-template.spec.ts @@ -1,5 +1,6 @@ import { Page } from 'playwright-chromium' import { newTestPage, reactReady, rootURL } from '../helpers' +import { describe, test, beforeEach, expect } from 'vitest' describe('Custom Template', () => { let page: Page diff --git a/packages/test-apps/simple-react/tsconfig.json b/packages/test-apps/simple-react/tsconfig.json index d4fcd741..62fbcf67 100644 --- a/packages/test-apps/simple-react/tsconfig.json +++ b/packages/test-apps/simple-react/tsconfig.json @@ -1,18 +1,22 @@ { "extends": "../../../tsconfig.json", - "include": ["."], - "exclude": ["**/node_modules", "**/dist/**"], + "include": [ + "." + ], + "exclude": [ + "**/node_modules", + "**/dist/**" + ], "compilerOptions": { "target": "ES2019", "module": "commonjs", - "lib": ["ES2020", "dom"], + "lib": [ + "ES2020", + "dom" + ], "sourceMap": true, "types": [ - "jest", - "node", - "jest-playwright-preset", - "expect-playwright", - "../../fastify-renderer/src/node/stream-template.d.ts" + "node" ] } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab435f6c..bb7b812a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,10 +5,10 @@ settings: excludeLinksFromLockfile: false overrides: - react: 0.0.0-experimental-4ead6b530 - react-dom: 0.0.0-experimental-4ead6b530 - '@types/react': 17.0.4 - '@types/react-dom': 17.0.4 + react: ^18.2.0 + react-dom: ^18.2.0 + '@types/react': ^18.2.0 + '@types/react-dom': ^18.2.0 importers: @@ -39,15 +39,9 @@ importers: eslint-plugin-react-hooks: specifier: ^4.6.0 version: 4.6.0(eslint@8.52.0) - expect-playwright: - specifier: ^0.8.0 - version: 0.8.0 fs-extra: specifier: ^11.1.0 version: 11.1.1 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.7) playwright-chromium: specifier: ^1.39.0 version: 1.39.0 @@ -57,6 +51,9 @@ importers: prettier-plugin-organize-imports: specifier: ^3.2.3 version: 3.2.3(prettier@2.8.8)(typescript@5.2.2) + vitest: + specifier: ^0.34.6 + version: 0.34.6 wds: specifier: ^0.18.1 version: 0.18.1 @@ -101,29 +98,23 @@ importers: version: 2.9.15 wouter: specifier: ^2.7.5 - version: 2.7.5(react@0.0.0-experimental-4ead6b530) + version: 2.7.5(react@18.2.0) devDependencies: '@swc/core': specifier: ^1.3.95 version: 1.3.95 - '@swc/jest': - specifier: ^0.2.29 - version: 0.2.29(@swc/core@1.3.95) '@types/connect': specifier: ^3.4.35 version: 3.4.36 - '@types/jest': - specifier: ^29.5.6 - version: 29.5.6 '@types/node': specifier: ^18.11.9 version: 18.18.7 '@types/react': - specifier: 17.0.4 - version: 17.0.4 + specifier: ^18.2.0 + version: 18.2.37 '@types/react-dom': - specifier: 17.0.4 - version: 17.0.4 + specifier: ^18.2.0 + version: 18.2.15 '@types/sanitize-filename': specifier: ^1.6.3 version: 1.6.3 @@ -142,9 +133,6 @@ importers: gitpkg: specifier: ^1.0.0-beta.2 version: 1.0.0-beta.4 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.7) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -152,17 +140,20 @@ importers: specifier: ^4.8.0 version: 4.8.0 react: - specifier: 0.0.0-experimental-4ead6b530 - version: 0.0.0-experimental-4ead6b530 + specifier: ^18.2.0 + version: 18.2.0 react-dom: - specifier: 0.0.0-experimental-4ead6b530 - version: 0.0.0-experimental-4ead6b530(react@0.0.0-experimental-4ead6b530) + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) rimraf: specifier: ^3.0.2 version: 3.0.2 typescript: specifier: ^5.2.2 version: 5.2.2 + vitest: + specifier: ^0.34.6 + version: 0.34.6 packages/test-apps/simple-react: dependencies: @@ -176,14 +167,17 @@ importers: specifier: ^6.2.1 version: 6.2.1 react: - specifier: 0.0.0-experimental-4ead6b530 - version: 0.0.0-experimental-4ead6b530 + specifier: ^18.2.0 + version: 18.2.0 react-dom: - specifier: 0.0.0-experimental-4ead6b530 - version: 0.0.0-experimental-4ead6b530(react@0.0.0-experimental-4ead6b530) + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + stream-template: + specifier: ^0.0.10 + version: 0.0.10 wouter: specifier: ^2.7.5 - version: 2.7.5(react@0.0.0-experimental-4ead6b530) + version: 2.7.5(react@18.2.0) devDependencies: '@playwright/test': specifier: ^1.39.0 @@ -201,11 +195,11 @@ importers: specifier: ^18.11.9 version: 18.18.7 '@types/react': - specifier: 17.0.4 - version: 17.0.4 + specifier: ^18.2.0 + version: 18.2.37 '@types/react-dom': - specifier: 17.0.4 - version: 17.0.4 + specifier: ^18.2.0 + version: 18.2.15 html-validator: specifier: ^5.1.18 version: 5.1.18 @@ -600,6 +594,204 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@esbuild/android-arm64@0.19.5: + resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.5: + resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.5: + resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.5: + resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.5: + resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.5: + resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.5: + resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.5: + resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.5: + resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.5: + resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.5: + resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.5: + resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.5: + resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.5: + resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.5: + resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.5: + resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.5: + resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.5: + resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.5: + resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.5: + resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.5: + resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.5: + resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1007,6 +1199,10 @@ packages: /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + /@jridgewell/trace-mapping@0.3.14: resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} dependencies: @@ -1017,7 +1213,7 @@ packages: resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@jridgewell/trace-mapping@0.3.9: @@ -1090,6 +1286,102 @@ packages: picomatch: 2.3.0 dev: false + /@rollup/rollup-android-arm-eabi@4.5.0: + resolution: {integrity: sha512-OINaBGY+Wc++U0rdr7BLuFClxcoWaVW3vQYqmQq6B3bqQ/2olkaoz+K8+af/Mmka/C2yN5j+L9scBkv4BtKsDA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.5.0: + resolution: {integrity: sha512-UdMf1pOQc4ZmUA/NTmKhgJTBimbSKnhPS2zJqucqFyBRFPnPDtwA8MzrGNTjDeQbIAWfpJVAlxejw+/lQyBK/w==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.5.0: + resolution: {integrity: sha512-L0/CA5p/idVKI+c9PcAPGorH6CwXn6+J0Ys7Gg1axCbTPgI8MeMlhA6fLM9fK+ssFhqogMHFC8HDvZuetOii7w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.5.0: + resolution: {integrity: sha512-QZCbVqU26mNlLn8zi/XDDquNmvcr4ON5FYAHQQsyhrHx8q+sQi/6xduoznYXwk/KmKIXG5dLfR0CvY+NAWpFYQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.5.0: + resolution: {integrity: sha512-VpSQ+xm93AeV33QbYslgf44wc5eJGYfYitlQzAi3OObu9iwrGXEnmu5S3ilkqE3Pr/FkgOiJKV/2p0ewf4Hrtg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.5.0: + resolution: {integrity: sha512-OrEyIfpxSsMal44JpEVx9AEcGpdBQG1ZuWISAanaQTSMeStBW+oHWwOkoqR54bw3x8heP8gBOyoJiGg+fLY8qQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.5.0: + resolution: {integrity: sha512-1H7wBbQuE6igQdxMSTjtFfD+DGAudcYWhp106z/9zBA8OQhsJRnemO4XGavdzHpGhRtRxbgmUGdO3YQgrWf2RA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.5.0: + resolution: {integrity: sha512-FVyFI13tXw5aE65sZdBpNjPVIi4Q5mARnL/39UIkxvSgRAIqCo5sCpCELk0JtXHGee2owZz5aNLbWNfBHzr71Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.5.0: + resolution: {integrity: sha512-eBPYl2sLpH/o8qbSz6vPwWlDyThnQjJfcDOGFbNjmjb44XKC1F5dQfakOsADRVrXCNzM6ZsSIPDG5dc6HHLNFg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.5.0: + resolution: {integrity: sha512-xaOHIfLOZypoQ5U2I6rEaugS4IYtTgP030xzvrBf5js7p9WI9wik07iHmsKaej8Z83ZDxN5GyypfoyKV5O5TJA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.5.0: + resolution: {integrity: sha512-Al6quztQUrHwcOoU2TuFblUQ5L+/AmPBXFR6dUvyo4nRj2yQRK0WIUaGMF/uwKulvRcXkpHe3k9A8Vf93VDktA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.5.0: + resolution: {integrity: sha512-8kdW+brNhI/NzJ4fxDufuJUjepzINqJKLGHuxyAtpPG9bMbn8P5mtaCcbOm0EzLJ+atg+kF9dwg8jpclkVqx5w==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: @@ -1297,6 +1589,16 @@ packages: '@babel/types': 7.22.19 dev: true + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.10 + dev: true + + /@types/chai@4.3.10: + resolution: {integrity: sha512-of+ICnbqjmFCiixUnqRulbylyXQrPqIGf/B3Jax1wIF3DvSheysQxAWvqHhZiW3IQrycvokcLcFQlveGp+vyNg==} + dev: true + /@types/connect@3.4.36: resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} dependencies: @@ -1350,14 +1652,14 @@ packages: resolution: {integrity: sha512-RK/kBbYOQQHLYj9Z95eh7S6t7gq4Ojt/NT8HTk8bWVhA5DaF+5SMnxHKkP4gPNN3wAZkKP+VjAf0ebtYzf+fxg==} dev: true - /@types/react-dom@17.0.4: - resolution: {integrity: sha512-Wb6rlnPJfqbhpkvYN39y1NM/pOGGPzzIRquu0RdUMvTwgXNvASFO7pdtrtvyxGTQNb9wzBaQxXAWDdEqegZw2A==} + /@types/react-dom@18.2.15: + resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==} dependencies: - '@types/react': 17.0.4 + '@types/react': 18.2.37 dev: true - /@types/react@17.0.4: - resolution: {integrity: sha512-onz2BqScSFMoTRdJUZUDD/7xrusM8hBA2Fktk2qgaTYPCgPvWnDEgkrOs8hhPUf2jfcIXkJ5yK6VfYormJS3Jw==} + /@types/react@18.2.37: + resolution: {integrity: sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==} dependencies: '@types/prop-types': 15.7.6 '@types/scheduler': 0.16.3 @@ -1553,6 +1855,44 @@ packages: - supports-color dev: false + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + dependencies: + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.3.10 + dev: true + + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + dependencies: + '@vitest/utils': 0.34.6 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + dependencies: + magic-string: 0.30.5 + pathe: 1.1.1 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + dependencies: + tinyspy: 2.2.0 + dev: true + + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} @@ -1786,6 +2126,10 @@ packages: engines: {node: '>=0.8'} dev: true + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -2007,6 +2351,11 @@ packages: engines: {node: '>= 0.8'} dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} @@ -2050,6 +2399,19 @@ packages: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2075,6 +2437,12 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + /cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: @@ -2111,7 +2479,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: @@ -2399,6 +2767,13 @@ packages: optional: true dev: true + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -2891,6 +3266,36 @@ packages: esbuild-windows-arm64: 0.14.47 dev: false + /esbuild@0.19.5: + resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.5 + '@esbuild/android-arm64': 0.19.5 + '@esbuild/android-x64': 0.19.5 + '@esbuild/darwin-arm64': 0.19.5 + '@esbuild/darwin-x64': 0.19.5 + '@esbuild/freebsd-arm64': 0.19.5 + '@esbuild/freebsd-x64': 0.19.5 + '@esbuild/linux-arm': 0.19.5 + '@esbuild/linux-arm64': 0.19.5 + '@esbuild/linux-ia32': 0.19.5 + '@esbuild/linux-loong64': 0.19.5 + '@esbuild/linux-mips64el': 0.19.5 + '@esbuild/linux-ppc64': 0.19.5 + '@esbuild/linux-riscv64': 0.19.5 + '@esbuild/linux-s390x': 0.19.5 + '@esbuild/linux-x64': 0.19.5 + '@esbuild/netbsd-x64': 0.19.5 + '@esbuild/openbsd-x64': 0.19.5 + '@esbuild/sunos-x64': 0.19.5 + '@esbuild/win32-arm64': 0.19.5 + '@esbuild/win32-ia32': 0.19.5 + '@esbuild/win32-x64': 0.19.5 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -3632,6 +4037,14 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true optional: true /function-bind@1.1.1: @@ -3668,6 +4081,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -4572,7 +4989,7 @@ packages: micromatch: 4.0.4 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-leak-detector@29.7.0: @@ -5047,6 +5464,11 @@ packages: strip-bom: 3.0.0 dev: true + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -5091,12 +5513,25 @@ packages: dependencies: js-tokens: 4.0.0 + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -5208,6 +5643,15 @@ packages: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: true + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.2 + dev: true + /mri@1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} @@ -5233,6 +5677,12 @@ packages: hasBin: true dev: false + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -5350,6 +5800,7 @@ packages: /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + dev: true /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -5488,6 +5939,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -5621,6 +6079,14 @@ packages: engines: {node: '>=8'} dev: true + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true @@ -5695,6 +6161,14 @@ packages: find-up: 5.0.0 dev: true + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: true + /playwright-chromium@1.39.0: resolution: {integrity: sha512-0WVmvn9ppPbcyb2PQherIpzsvJlyjqziCZiAiexTEYSz8k6/+/3wljmFaMRMP1lcv2xKyHDn9yWd/lHb7IzYyA==} engines: {node: '>=16'} @@ -5729,6 +6203,15 @@ packages: source-map-js: 1.0.2 dev: false + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5867,15 +6350,14 @@ packages: unpipe: 1.0.0 dev: false - /react-dom@0.0.0-experimental-4ead6b530(react@0.0.0-experimental-4ead6b530): - resolution: {integrity: sha512-a03ptS8lhhEENNgne6zQMXQWX/Z6WMEBGJQY0laOC0NgJywidePYpgkiE72fUAaj/r7t9a6XsdVyqx4UsEZijg==} + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: 0.0.0-experimental-4ead6b530 + react: ^18.2.0 dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 0.0.0-experimental-4ead6b530 - scheduler: 0.0.0-experimental-4ead6b530 + react: 18.2.0 + scheduler: 0.23.0 /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -5890,12 +6372,11 @@ packages: engines: {node: '>=0.10.0'} dev: false - /react@0.0.0-experimental-4ead6b530: - resolution: {integrity: sha512-tpbYm6FEuC1L6tCVXIKYAhgGAkS8DShzKpmXosowZvLqeByeLQQe77Ef6bi5HdEkFm2v0lZffLWckSM8R4TToA==} + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} @@ -6093,9 +6574,29 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false + /rollup@4.5.0: + resolution: {integrity: sha512-41xsWhzxqjMDASCxH5ibw1mXk+3c4TNI2UjKbLxe6iEzrSQnqOzmmK8/3mufCPbzHNJ2e04Fc1ddI35hHy+8zg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.5.0 + '@rollup/rollup-android-arm64': 4.5.0 + '@rollup/rollup-darwin-arm64': 4.5.0 + '@rollup/rollup-darwin-x64': 4.5.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.5.0 + '@rollup/rollup-linux-arm64-gnu': 4.5.0 + '@rollup/rollup-linux-arm64-musl': 4.5.0 + '@rollup/rollup-linux-x64-gnu': 4.5.0 + '@rollup/rollup-linux-x64-musl': 4.5.0 + '@rollup/rollup-win32-arm64-msvc': 4.5.0 + '@rollup/rollup-win32-ia32-msvc': 4.5.0 + '@rollup/rollup-win32-x64-msvc': 4.5.0 + fsevents: 2.3.3 + dev: true + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -6151,11 +6652,10 @@ packages: dependencies: truncate-utf8-bytes: 1.0.2 - /scheduler@0.0.0-experimental-4ead6b530: - resolution: {integrity: sha512-AzUR6EiDuY32oAnfELgVFPasfovJw4+NtRy7RIam0IUOSgNZKcazqcHzsoW1zDw3AzIBlD1VlRvl5SPJRSlTPg==} + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -6293,6 +6793,10 @@ packages: get-intrinsic: 1.2.1 object-inspect: 1.12.3 + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -6324,7 +6828,6 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: false /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -6416,6 +6919,10 @@ packages: escape-string-regexp: 2.0.0 dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -6426,6 +6933,10 @@ packages: engines: {node: '>= 0.8'} dev: false + /std-env@3.5.0: + resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} + dev: true + /stream-template@0.0.10: resolution: {integrity: sha512-whIqf/ljJ88dr0z6iNFtJq09rs4R6JxJOnIqGthC3rHFEMYq6ssm4sPYILXEPrFYncMjF39An6MBys1o5BC19w==} engines: {node: '>=4.0.0'} @@ -6541,6 +7052,12 @@ packages: engines: {node: '>=8'} dev: true + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.2 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6617,6 +7134,20 @@ packages: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} + /tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + dev: true + + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -6780,6 +7311,10 @@ packages: hasBin: true dev: true + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -6878,6 +7413,28 @@ packages: extsprintf: 1.3.0 dev: true + /vite-node@0.34.6(@types/node@18.18.7): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.2 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 5.0.0(@types/node@18.18.7) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite@2.9.15: resolution: {integrity: sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==} engines: {node: '>=12.2.0'} @@ -6899,9 +7456,110 @@ packages: resolve: 1.22.0 rollup: 2.77.3 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false + /vite@5.0.0(@types/node@18.18.7): + resolution: {integrity: sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.18.7 + esbuild: 0.19.5 + postcss: 8.4.31 + rollup: 4.5.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.10 + '@types/chai-subset': 1.3.5 + '@types/node': 18.18.7 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.11.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.10 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.5 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.5.0 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.7.0 + vite: 5.0.0(@types/node@18.18.7) + vite-node: 0.34.6(@types/node@18.18.7) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /wait-on@5.3.0: resolution: {integrity: sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==} engines: {node: '>=8.9.0'} @@ -7025,12 +7683,21 @@ packages: isexe: 2.0.0 dev: true - /wouter@2.7.5(react@0.0.0-experimental-4ead6b530): + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /wouter@2.7.5(react@18.2.0): resolution: {integrity: sha512-TOI9gD1wa7a8wW+lh3rjg0C+MjYGKMV3eC+++6D+7n1z36ZJIBPWe2G9Hs1jYNPsV7oKiPTI3UFC5TGhZjQfrQ==} peerDependencies: - react: 0.0.0-experimental-4ead6b530 + react: ^18.2.0 dependencies: - react: 0.0.0-experimental-4ead6b530 + react: 18.2.0 dev: false /wrap-ansi@6.2.0: @@ -7147,3 +7814,8 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true