diff --git a/.changeset/ninety-planets-search.md b/.changeset/ninety-planets-search.md new file mode 100644 index 00000000000..77a35dd0e1a --- /dev/null +++ b/.changeset/ninety-planets-search.md @@ -0,0 +1,6 @@ +--- +'@builder.io/qwik-city': patch +'@builder.io/qwik': patch +--- + +FIX: `vite` is now a peer dependency of `qwik` and `qwik-city`, so that there can be no duplicate imports. This should not have consequences, since all apps also directly depend on `vite`. diff --git a/flake.lock b/flake.lock index a1e73124bbe..0594f4d0447 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1721138476, - "narHash": "sha256-+W5eZOhhemLQxelojLxETfbFbc19NWawsXBlapYpqIA=", + "lastModified": 1728888510, + "narHash": "sha256-nsNdSldaAyu6PE3YUA+YQLqUDJh+gRbBooMMekZJwvI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ad0b5eed1b6031efaed382844806550c3dcb4206", + "rev": "a3c0b3b21515f74fd2665903d4ce6bc4dc81c77c", "type": "github" }, "original": { @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1721355572, - "narHash": "sha256-I4TQ2guV9jTmZsXeWt5HMojcaqNZHII4zu0xIKZEovM=", + "lastModified": 1728959392, + "narHash": "sha256-fp4he1QQjE+vasDMspZYeXrwTm9otwEqLwEN6FKZ5v0=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "d5bc7b1b21cf937fb8ff108ae006f6776bdb163d", + "rev": "4c6e317300f05b8871f585b826b6f583e7dc4a9b", "type": "github" }, "original": { diff --git a/package.json b/package.json index ab488d85ac9..e424719a072 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "dependencies": [ "@playwright/test" ], - "pinVersion": "1.40.0" + "pinVersion": "1.47.0" }, { "label": "Undici should always be * until we remove it", @@ -109,7 +109,7 @@ "@napi-rs/triples": "1.2.0", "@node-rs/helper": "1.6.0", "@octokit/action": "6.1.0", - "@playwright/test": "1.40.0", + "@playwright/test": "1.47.0", "@types/brotli": "1.3.4", "@types/bun": "1.1.6", "@types/cross-spawn": "6.0.6", diff --git a/packages/docs/src/repl/repl-console.tsx b/packages/docs/src/repl/repl-console.tsx index a733cf791b9..a61d5e44ac4 100644 --- a/packages/docs/src/repl/repl-console.tsx +++ b/packages/docs/src/repl/repl-console.tsx @@ -7,7 +7,7 @@ export interface ReplConsoleProps { export const ReplConsole = component$(({ store }: ReplConsoleProps) => { return (
- {store.events.map((ev) => ( + {store.events.filter(Boolean).map((ev) => ( ))}
diff --git a/packages/docs/src/repl/repl-output-modules.tsx b/packages/docs/src/repl/repl-output-modules.tsx index 7c1468358fc..4cdf156fba0 100644 --- a/packages/docs/src/repl/repl-output-modules.tsx +++ b/packages/docs/src/repl/repl-output-modules.tsx @@ -26,6 +26,7 @@ export const ReplOutputModules = component$(({ outputs, headerText }: ReplOutput class={{ 'in-view': selectedPath.value === o.path }} preventdefault:click key={o.path} + title={o.path} > {o.path} diff --git a/packages/docs/src/repl/repl-output-panel.tsx b/packages/docs/src/repl/repl-output-panel.tsx index 06385eb677f..5c2ba35c156 100644 --- a/packages/docs/src/repl/repl-output-panel.tsx +++ b/packages/docs/src/repl/repl-output-panel.tsx @@ -1,4 +1,4 @@ -import { component$ } from '@builder.io/qwik'; +import { component$, useComputed$ } from '@builder.io/qwik'; import { CodeBlock } from '../components/code-block/code-block'; import { ReplOutputModules } from './repl-output-modules'; import { ReplOutputSymbols } from './repl-output-symbols'; @@ -8,6 +8,10 @@ import type { ReplAppInput, ReplStore } from './types'; export const ReplOutputPanel = component$(({ input, store }: ReplOutputPanelProps) => { const diagnosticsLen = store.diagnostics.length + store.monacoDiagnostics.length; + const clientBundlesNoCore = useComputed$(() => + // Qwik Core is not interesting and is large, slowing down the UI + store.clientBundles.filter((b) => !b.path.endsWith('qwikCore.js')) + ); return (
@@ -111,7 +115,7 @@ export const ReplOutputPanel = component$(({ input, store }: ReplOutputPanelProp ) : null} {store.selectedOutputPanel === 'clientBundles' ? ( - + ) : null} {store.selectedOutputPanel === 'serverModules' ? ( diff --git a/packages/docs/src/repl/repl-output-symbols.tsx b/packages/docs/src/repl/repl-output-symbols.tsx index 0457c21a2a7..47846d85e6e 100644 --- a/packages/docs/src/repl/repl-output-symbols.tsx +++ b/packages/docs/src/repl/repl-output-symbols.tsx @@ -27,6 +27,7 @@ export const ReplOutputSymbols = component$(({ outputs }: ReplOutputSymbolsProps }} class={{ 'in-view': selectedPath.value === o.path }} preventdefault:click + title={o.segment?.canonicalFilename} > {o.segment?.canonicalFilename} diff --git a/packages/docs/src/repl/repl-output-update.ts b/packages/docs/src/repl/repl-output-update.ts index 4cc4f38039c..1fe666a0dc6 100644 --- a/packages/docs/src/repl/repl-output-update.ts +++ b/packages/docs/src/repl/repl-output-update.ts @@ -24,7 +24,12 @@ export const updateReplOutput = async (store: ReplStore, result: ReplResult) => deepUpdate(store.transformedModules, result.transformedModules); deepUpdate(store.clientBundles, result.clientBundles); deepUpdate(store.ssrModules, result.ssrModules); - deepUpdate(store.events, result.events); + if ( + result.events.length !== store.events.length || + result.events.some((ev, i) => ev?.start !== store.events[i]?.start) + ) { + store.events = result.events; + } if (store.selectedOutputPanel === 'diagnostics' && store.monacoDiagnostics.length === 0) { store.selectedOutputPanel = 'app'; diff --git a/packages/docs/src/repl/worker/app-bundle-client.ts b/packages/docs/src/repl/worker/app-bundle-client.ts index 7c8cbf4befd..6bc1dcbd5a1 100644 --- a/packages/docs/src/repl/worker/app-bundle-client.ts +++ b/packages/docs/src/repl/worker/app-bundle-client.ts @@ -36,7 +36,6 @@ export const appBundleClient = async ( const rollupInputOpts: InputOptions = { input: entry.path, - cache: self.rollupCache, plugins: [ replCss(options), self.qwikOptimizer?.qwikRollup(qwikRollupClientOpts), @@ -71,8 +70,6 @@ export const appBundleClient = async ( const bundle = await self.rollup?.rollup(rollupInputOpts); if (bundle) { - self.rollupCache = bundle.cache; - const generated = await bundle.generate({ sourcemap: false, }); @@ -96,7 +93,7 @@ export const appBundleClient = async ( }) ); - // clear out old cache + // clear out old results cache // no need to wait cache.keys().then((keys) => { if (keys.length > 500) { diff --git a/packages/docs/src/repl/worker/repl-plugins.ts b/packages/docs/src/repl/worker/repl-plugins.ts index a4e8a8fa9f6..2e9cd574f9a 100644 --- a/packages/docs/src/repl/worker/repl-plugins.ts +++ b/packages/docs/src/repl/worker/repl-plugins.ts @@ -15,6 +15,7 @@ export const replResolver = (options: ReplInputOptions, buildMode: 'client' | 's name: 'repl-resolver', resolveId(id, importer) { + // Entry point if (!importer) { return id; } @@ -25,12 +26,10 @@ export const replResolver = (options: ReplInputOptions, buildMode: 'client' | 's ) { return '\0qwikCore'; } - if (id === '@builder.io/qwik/build') { - return '\0qwikBuild'; - } if (id === '@builder.io/qwik/server') { return '\0qwikServer'; } + // Simple relative file resolution if (id.startsWith('./')) { const extensions = ['', '.tsx', '.ts']; id = id.slice(1); @@ -41,10 +40,6 @@ export const replResolver = (options: ReplInputOptions, buildMode: 'client' | 's } } } - return { - id, - external: true, - }; }, async load(id) { @@ -59,20 +54,6 @@ export const replResolver = (options: ReplInputOptions, buildMode: 'client' | 's if (id === '\0qwikServer') { return getRuntimeBundle('qwikServer'); } - if (id === '\0qwikBuild') { - return ` - export const isServer = true; - export const isBrowser = false; - export const isDev = false; - `; - } - } - if (id === '\0qwikBuild') { - return ` - export const isServer = false; - export const isBrowser = true; - export const isDev = false; - `; } if (id === '\0qwikCore') { if (options.buildMode === 'production') { @@ -88,7 +69,11 @@ export const replResolver = (options: ReplInputOptions, buildMode: 'client' | 's } throw new Error(`Unable to load Qwik core`); } - return null; + + // We're the fallback, we know all the files + if (/\.[jt]sx?$/.test(id)) { + throw new Error(`load: unknown module ${id}`); + } }, }; }; diff --git a/packages/qwik-city/package.json b/packages/qwik-city/package.json index 2c487321dde..c176ca6d5bf 100644 --- a/packages/qwik-city/package.json +++ b/packages/qwik-city/package.json @@ -11,7 +11,6 @@ "undici": "*", "valibot": ">=0.36.0 <2", "vfile": "6.0.1", - "vite": "^5", "vite-imagetools": "^7", "zod": "3.22.4" }, @@ -174,6 +173,9 @@ "homepage": "https://qwik.dev/", "license": "MIT", "main": "./lib/index.qwik.mjs", + "peerDependencies": { + "vite": "^5" + }, "publishConfig": { "access": "public" }, diff --git a/packages/qwik/package.json b/packages/qwik/package.json index f913a5b3139..5df5d129eb6 100644 --- a/packages/qwik/package.json +++ b/packages/qwik/package.json @@ -25,8 +25,7 @@ } ], "dependencies": { - "csstype": "^3.1", - "vite": "^5" + "csstype": "^3.1" }, "devDependencies": { "@builder.io/qwik": "workspace:^", @@ -156,6 +155,14 @@ ], "license": "MIT", "main": "./dist/core.mjs", + "peerDependencies": { + "vite": "^5" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + }, "repository": { "type": "git", "url": "https://github.com/QwikDev/qwik.git", diff --git a/packages/qwik/src/core/qrl/qrl-class.ts b/packages/qwik/src/core/qrl/qrl-class.ts index 870cfa12a70..228226dd8d8 100644 --- a/packages/qwik/src/core/qrl/qrl-class.ts +++ b/packages/qwik/src/core/qrl/qrl-class.ts @@ -12,7 +12,7 @@ import { type InvokeTuple, } from '../use/use-core'; import { getQFuncs, QInstance } from '../util/markers'; -import { maybeThen } from '../util/promises'; +import { isPromise, maybeThen } from '../util/promises'; import { qDev, qSerialize, qTest, seal } from '../util/qdev'; import { isArray, isFunction, type ValueOrPromise } from '../util/types'; import type { QRLDev } from './qrl'; @@ -106,7 +106,6 @@ export const createQRL = ( if (context.$event$ === undefined) { context.$event$ = this as Event; } - // const result = invoke.call(this, context, f, ...(args as Parameters)); try { return fn.apply(this, args); } finally { @@ -147,7 +146,17 @@ export const createQRL = ( const imported = getPlatform().importSymbol(_containerEl, chunk, symbol); symbolRef = maybeThen(imported, (ref) => (qrl.resolved = symbolRef = wrapFn(ref))); } - (symbolRef as Promise).finally(() => emitUsedSymbol(symbol, ctx?.$element$, start)); + if (typeof symbolRef === 'object' && isPromise(symbolRef)) { + symbolRef.then( + () => emitUsedSymbol(symbol, ctx?.$element$, start), + (err) => { + console.error(`qrl ${symbol} failed to load`, err); + // We shouldn't cache rejections, we can try again later + symbolRef = null; + throw err; + } + ); + } return symbolRef; }; diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.ts b/packages/qwik/src/optimizer/src/plugins/plugin.ts index 9f4bda68335..5a89109b640 100644 --- a/packages/qwik/src/optimizer/src/plugins/plugin.ts +++ b/packages/qwik/src/optimizer/src/plugins/plugin.ts @@ -18,7 +18,7 @@ import type { TransformOutput, } from '../types'; import { createLinter, type QwikLinter } from './eslint-plugin'; -import type { LoadResult, OutputBundle, TransformResult } from 'rollup'; +import type { LoadResult, OutputBundle, ResolveIdResult, TransformResult } from 'rollup'; import { isWin } from './vite-utils'; const REG_CTX_NAME = ['server']; @@ -84,7 +84,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { const serverResults = new Map(); const serverTransformedOutputs = new Map(); - const foundQrls = new Map(); + const parentIds = new Map(); let internalOptimizer: Optimizer | null = null; let linter: QwikLinter | undefined = undefined; @@ -369,13 +369,14 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { } }; - const buildStart = async (ctx: Rollup.PluginContext) => { - debug(`buildStart()`, opts.buildMode, opts.scope, opts.target); - const optimizer = getOptimizer(); + let optimizer: Optimizer; + const buildStart = async (_ctx: Rollup.PluginContext) => { + debug(`buildStart()`, opts.buildMode, opts.scope, opts.target, opts.rootDir, opts.srcDir); + optimizer = getOptimizer(); if (optimizer.sys.env === 'node' && opts.target === 'ssr' && opts.lint) { try { linter = await createLinter(optimizer.sys, opts.rootDir, opts.tsconfigFileNames); - } catch (err) { + } catch { // Nothing } } @@ -391,7 +392,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { }; return relInput; }); - debug(`buildStart() opts.srcInputs (${opts.srcInputs.length})`); + debug(`buildStart() opts.srcInputs (${opts.srcInputs.length} files)`); } debug(`transformedOutputs.clear()`); @@ -403,159 +404,144 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { return devServer ? !!viteOpts?.ssr : opts.target === 'ssr' || opts.target === 'test'; }; - const getParentId = (id: string, isServer: boolean) => { - const transformedOutputs = isServer ? serverTransformedOutputs : clientTransformedOutputs; - const segment = transformedOutputs.get(id); - if (segment) { - return segment[1]; - } - const hash = getSymbolHash(id); - return foundQrls.get(hash); - }; - let resolveIdCount = 0; - /** This resolves special names and QRL segments/entries. All the rest falls through */ - const resolveId = async ( + /** + * This resolves virtual names and QRL segments/entries. All the rest falls through. We must + * always return a value for QRL segments because they don't exist on disk. + */ + const resolveId = ( ctx: Rollup.PluginContext, id: string, importerId: string | undefined, resolveOpts?: Parameters>[2] ) => { - const count = resolveIdCount++; - const isServer = getIsServer(resolveOpts); - debug(`resolveId(${count})`, 'Start', id, { - from: importerId, - for: isServer ? 'server' : 'client', - }); if (id.startsWith('\0')) { return; } + const count = resolveIdCount++; + const isServer = getIsServer(resolveOpts); + debug(`resolveId(${count})`, `begin ${id} | ${isServer ? 'server' : 'client'} | ${importerId}`); + + /** + * During development, the QRL filenames will be of the form `${parentId}_${name}_${hash}.js`, + * and we might get requests for QRLs from the client before the parent was built. + * + * Furthermore, the client requests come in via HTTP and they are encoded in a lossy way. + * + * So, first we need to recover the real requested id, then we need to make it an absolute path, + * and then we can start matching. + */ + const parsedImporterId = importerId && parseId(importerId); + importerId = parsedImporterId && normalizePath(parsedImporterId.pathId); + const path = getPath(); + const importerDir = parsedImporterId && path.dirname(parsedImporterId.pathId); + + /** + * A request possibly from the browser. It could be our own QRLs requests, which we uri encode, + * or an import generated by vite. So we have to be careful. + */ + if (devServer && id.startsWith('/') && importerId?.endsWith('.html')) { + const maybeQrl = decodeURIComponent(id); + // We encode absolute paths like this, due to e.g. pnpm linking + if (maybeQrl.startsWith('/@fs/')) { + id = maybeQrl.slice(5); + } else { + /** + * This path could still be absolute, when encoded by Vite. If the first path segment is the + * same as that of the importer dir, we assume it's absolute. + */ + if (!maybeQrl.startsWith(importerDir!.slice(0, importerDir!.indexOf('/', 1)))) { + id = path.join(importerDir!, maybeQrl); + } + } + // Now we hopefully removed the influence of the http encoding + } - if (opts.target === 'lib' && id.startsWith(QWIK_CORE_ID)) { - // For library code, we must retain the qwik imports as-is. They all start with /qwik. - return { - external: true, - id, - }; + // Relative paths must be resolved vs the importer + if (id.startsWith('.') && importerDir) { + id = path.resolve(importerDir, id); } - if (opts.resolveQwikBuild && id.endsWith(QWIK_BUILD_ID)) { - debug(`resolveId(${count})`, 'Resolved', QWIK_BUILD_ID); - return { - id: normalizePath(getPath().resolve(opts.rootDir, QWIK_BUILD_ID)), + // Split query, remove windows path encoding etc + const parsedId = parseId(id); + const pathId = normalizePath(parsedId.pathId); + + let result: ResolveIdResult; + + // During regular builds, we'll encounter parents before QRLs, so this will match + if (parentIds.get(pathId)) { + debug(`resolveId(${count}) Resolved already known ${pathId}`); + result = { + id: pathId + parsedId.query, moduleSideEffects: false, }; - } - - if (id.endsWith(QWIK_CLIENT_MANIFEST_ID)) { - debug(`resolveId(${count})`, 'Resolved', QWIK_CLIENT_MANIFEST_ID); - if (opts.target === 'lib') { - return { - id: id, - external: true, + } else if ( + // We test with endsWith because the dev server might add a / + pathId.endsWith(QWIK_BUILD_ID) + ) { + /** + * Now we're in the case where we have a QRL segment that hasn't been transformed yet or one + * of the virtual modules. + */ + if (opts.resolveQwikBuild) { + debug(`resolveId(${count})`, 'Resolved', QWIK_BUILD_ID); + result = { + // We use / because \0 gives errors + id: `/${QWIK_BUILD_ID}`, moduleSideEffects: false, }; } - - const firstInput = opts.input && Object.values(opts.input)[0]; - return { - id: normalizePath(getPath().resolve(firstInput, QWIK_CLIENT_MANIFEST_ID)), + } else if (pathId.endsWith(QWIK_CLIENT_MANIFEST_ID)) { + debug(`resolveId(${count})`, 'Resolved', QWIK_CLIENT_MANIFEST_ID); + result = { + id: `/${QWIK_CLIENT_MANIFEST_ID}`, moduleSideEffects: false, }; - } - const optimizer = getOptimizer(); - const path = getPath(); - - // Requests originating from another file, or the browser - if (importerId) { - const looksLikePath = id.startsWith('.') || id.startsWith('/'); - if (!looksLikePath) { - // Rollup can ask us to resolve imports from QRL segments - // It seems like importers need to exist on disk for this to work automatically, - // so for segments we resolve via the parent instead - debug(`resolveId(${count})`, 'falling back to default resolver'); - const parentId = getParentId(importerId, isServer); - if (parentId) { - return ctx.resolve(id, parentId, { skipSelf: true }); - } - return; - } - importerId = normalizePath(importerId); - const parsedImporterId = parseId(importerId); - const dir = path.dirname(parsedImporterId.pathId); - const outputs = isServer ? serverTransformedOutputs : clientTransformedOutputs; - if ( - // vite dev mode - devServer && - // client code - !isServer && - // browser requests - importerId.endsWith('.html') && - // looks like a url pathname - id.startsWith('/') && - // not a known output - !outputs.has(id) - ) { - // This is a request from a dev-mode browser - // we uri-encode chunk paths in dev mode, and other imported files don't have % in their paths (hopefully) - // These will be individual source files and their QRL segments - id = decodeURIComponent(id); - // Support absolute paths for qrl segments, due to e.g. pnpm linking - if (id.startsWith('/@fs/')) { - // remove `/@fs/` prefix for Windows - // remove `/@fs` prefix for Unix - id = id.slice(isWin(optimizer.sys.os) ? 5 : 4); - } else { - // Now paths could be either relative or absolute, we're not sure. - // If the first path segment is the same as that of the importer dir, we assume it's absolute - if (!id.startsWith(dir.slice(0, dir.indexOf('/', 1)))) { - id = path.join(dir, id); + } else { + /** + * If this looks like a dev qrl filename, it doesn't matter who imports, we have the parentId + * embedded. + */ + const match = /^(.*\.[mc]?[jt]sx?)_([^/]+)\.js($|\?)/.exec(pathId); + if (match) { + const [, parentId, name] = match; + return ctx.resolve(parentId, importerId, { skipSelf: true }).then((resolved) => { + if (resolved) { + debug(`resolveId(${count})`, `resolved to QRL ${name} of ${parentId}`); + // Save for quick lookup + parentIds.set(pathId, resolved.id); + return { + id: pathId + parsedId.query, + // QRL segments can't have side effects. Probably never useful, but it's here for consistency + moduleSideEffects: false, + }; + } else { + debug(`resolveId(${count})`, `${parentId} does not exist`); } - } - id = normalizePath(id); - // Check for parent passed via QRL - const match = /^([^?]*)\?_qrl_parent=(.*)/.exec(id); - if (match) { - id = match[1]; - // The parent is in the same directory as the requested segment - const parentId = id.slice(0, id.lastIndexOf('/') + 1) + match[2]; - const hash = getSymbolHash(id); - // Register the parent in case we don't have it (restart etc) - foundQrls.set(hash, parentId); - } - } - const parsedId = parseId(id); - let importeePathId = normalizePath(parsedId.pathId); - const ext = path.extname(importeePathId).toLowerCase(); - if (ext in RESOLVE_EXTS) { - // resolve relative paths - importeePathId = normalizePath(path.resolve(dir, importeePathId)); - const parentId = getParentId(importeePathId, isServer); - if (parentId) { - debug(`resolveId(${count}) Resolved ${importeePathId} from transformedOutputs`); - return { - id: importeePathId + parsedId.query, - }; + }); + } else if (importerId) { + /** + * When we get here it's neither a virtual module nor a QRL segment. However, Rollup can ask + * us to resolve imports from QRL segments. It seems like importers need to exist on disk + * for this to work automatically, so for segments we resolve via the parent instead. + * + * Note that when a this happens, the segment was already resolved and transformed, so we + * know about it. + */ + const importerParentId = parentIds.get(importerId); + if (importerParentId) { + debug(`resolveId(${count})`, `resolving via ${importerParentId}`); + // This returns a promise that we can't await because of deadlocking + return ctx.resolve(id, importerParentId, { skipSelf: true }); } } - } else if (path.isAbsolute(id)) { - const parsedId = parseId(id); - const importeePathId = normalizePath(parsedId.pathId); - const ext = path.extname(importeePathId).toLowerCase(); - if (ext in RESOLVE_EXTS && getParentId(importeePathId, isServer)) { - debug( - `resolveId(${count}) Resolved ${importeePathId} from transformedOutputs (no importer)` - ); - return { - id: importeePathId + parsedId.query, - }; - } } - // We don't (yet) know this id - debug(`resolveId(${count})`, 'Not resolved', id, importerId); - return null; + + debug(`resolveId(${count}) end`, (result as any)?.id || result); + return result; }; + let loadCount = 0; const load = async ( ctx: Rollup.PluginContext, id: string, @@ -564,62 +550,58 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { if (id.startsWith('\0') || id.startsWith('/@fs/')) { return; } + const count = loadCount++; const isServer = getIsServer(loadOpts); - if (opts.resolveQwikBuild && id.endsWith(QWIK_BUILD_ID)) { - debug(`load()`, QWIK_BUILD_ID, opts.buildMode); + + // Virtual modules + if (opts.resolveQwikBuild && id === `/${QWIK_BUILD_ID}`) { + debug(`load(${count})`, QWIK_BUILD_ID, opts.buildMode); return { moduleSideEffects: false, code: getQwikBuildModule(isServer, opts.target), }; } - - if (id.endsWith(QWIK_CLIENT_MANIFEST_ID)) { - debug(`load()`, QWIK_CLIENT_MANIFEST_ID, opts.buildMode); + if (id === `/${QWIK_CLIENT_MANIFEST_ID}`) { + debug(`load(${count})`, QWIK_CLIENT_MANIFEST_ID, opts.buildMode); return { moduleSideEffects: false, code: await getQwikServerManifestModule(isServer), }; } + + // QRL segments const parsedId = parseId(id); - const path = getPath(); id = normalizePath(parsedId.pathId); - const outputs = isServer ? serverTransformedOutputs : clientTransformedOutputs; if (devServer && !outputs.has(id)) { // in dev mode, it could be that the id is a QRL segment that wasn't transformed yet - const parentId = getParentId(id, isServer); + const parentId = parentIds.get(id); if (parentId) { // building here via ctx.load doesn't seem to work (no transform), instead we use the devserver directly - debug(`load()`, 'transforming QRL parent', parentId); + debug(`load(${count})`, 'transforming QRL parent', parentId); // We need to encode it as an absolute path - await devServer.transformRequest(`/@fs${parentId.startsWith('/') ? '' : '/'}${parentId}`); + await devServer.transformRequest(`/@fs${parentId}`); // The QRL segment should exist now + if (!outputs.has(id)) { + debug(`load(${count})`, `QRL segment ${id} not found in ${parentId}`); + return null; + } } } const transformedModule = outputs.get(id); if (transformedModule) { - debug(`load()`, 'Found', id); - let { code } = transformedModule[0]; - const { map, segment } = transformedModule[0]; - const firstInput = opts.input && Object.values(opts.input)[0]; - - if (devServer && firstInput) { - // doing this because vite will not use resolveId() when "noExternal" is false - // so we need to turn the @qwik-client-manifest import into a relative import - code = code.replace( - /@qwik-client-manifest/g, - normalizePath(path.resolve(firstInput, QWIK_CLIENT_MANIFEST_ID)) - ); - } + debug(`load(${count})`, 'Found', id); + const { code, map, segment } = transformedModule[0]; return { code, map, meta: { segment } }; } - debug('load()', 'Not found', id); + debug(`load(${count})`, 'Not a QRL or virtual module', id); return null; }; + let transformCount = 0; const transform = async function ( ctx: Rollup.PluginContext, code: string, @@ -629,6 +611,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { if (id.startsWith('\0')) { return; } + const count = transformCount++; const isServer = getIsServer(transformOpts); const currentOutputs = isServer ? serverTransformedOutputs : clientTransformedOutputs; if (currentOutputs.has(id)) { @@ -649,7 +632,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { const strip = opts.target === 'client' || opts.target === 'ssr'; const normalizedID = normalizePath(pathId); debug( - `transform()`, + `transform(${count})`, `Transforming ${id} (for: ${isServer ? 'server' : 'client'}${strip ? ', strip' : ''})` ); @@ -703,14 +686,6 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { const newOutput = optimizer.transformModulesSync(transformOpts); const module = newOutput.modules.find((mod) => !isAdditionalFile(mod))!; - if (devServer && isServer) { - // we're in dev mode. All QRLs that might be emitted in SSR HTML are defined here. - // register them so that they can be resolved by the dev server - const matches = module.code.matchAll(/_([a-zA-Z0-9]{11,11})['"][,)]/g); - for (const [, symbol] of matches) { - foundQrls.set(symbol, id); - } - } // uncomment to show transform results // debug({ isServer, strip }, transformOpts, newOutput); @@ -728,7 +703,8 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { for (const mod of newOutput.modules) { if (mod !== module) { const key = normalizePath(path.join(srcDir, mod.path)); - debug(`transform()`, `segment ${key}`, mod.segment?.displayName); + debug(`transform(${count})`, `segment ${key}`, mod.segment!.displayName); + parentIds.set(key, id); currentOutputs.set(key, [mod, id]); deps.add(key); if (opts.target === 'client') { @@ -770,7 +746,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { }; } - debug(`transform()`, 'Not transforming', id); + debug(`transform(${count})`, 'Not transforming', id); return null; }; @@ -848,7 +824,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) { const normalizePath = (id: string) => lazyNormalizePath(id); - function getQwikBuildModule(isServer: boolean, target: QwikBuildTarget) { + function getQwikBuildModule(isServer: boolean, _target: QwikBuildTarget) { const isDev = opts.buildMode === 'development'; return `// @builder.io/qwik/build export const isServer = ${JSON.stringify(isServer)}; @@ -877,14 +853,17 @@ export const manifest = ${JSON.stringify(manifest)};\n`; debug('handleHotUpdate()', `invalidate ${id}`); serverResults.delete(id); clientResults.delete(id); - } - for (const dep of mod.info?.meta?.qwikdeps || []) { - debug('handleHotUpdate()', `invalidate segment ${dep}`); - serverTransformedOutputs.delete(dep); - clientTransformedOutputs.delete(dep); - const mod = ctx.server.moduleGraph.getModuleById(dep); - if (mod) { - ctx.server.moduleGraph.invalidateModule(mod); + for (const outputs of [clientTransformedOutputs, serverTransformedOutputs]) { + for (const [key, [_, parentId]] of outputs) { + if (parentId === id) { + debug('handleHotUpdate()', `invalidate ${id} segment ${key}`); + outputs.delete(key); + const mod = ctx.server.moduleGraph.getModuleById(key); + if (mod) { + ctx.server.moduleGraph.invalidateModule(mod); + } + } + } } } } @@ -919,7 +898,6 @@ export const manifest = ${JSON.stringify(manifest)};\n`; transform, validateSource, setSourceMapSupport, - foundQrls, configureServer, handleHotUpdate, manualChunks, @@ -963,13 +941,8 @@ export function parseId(originalId: string) { }; } -export function getSymbolHash(symbolName: string) { - const index = symbolName.lastIndexOf('_'); - if (index > -1) { - return symbolName.slice(index + 1); - } - return symbolName; -} +export const getSymbolHash = (symbolName: string) => + /_([a-z0-9]+)($|\.js($|\?))/.exec(symbolName)?.[1]; const TRANSFORM_EXTS = { '.jsx': true, @@ -977,15 +950,6 @@ const TRANSFORM_EXTS = { '.tsx': true, } as const; -const RESOLVE_EXTS = { - '.tsx': true, - '.ts': true, - '.jsx': true, - '.js': true, - '.mjs': true, - '.cjs': true, -} as const; - /** * Any file that matches this needs to be processed by Qwik to extract QRL segments etc. Used in * libraries. diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts b/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts index 360e41fe5ad..1547bbb06fe 100644 --- a/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts +++ b/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts @@ -1,5 +1,5 @@ import path, { resolve } from 'node:path'; -import { assert, test } from 'vitest'; +import { assert, describe, expect, test } from 'vitest'; import type { QwikManifest } from '../types'; import { ExperimentalFeatures, createPlugin } from './plugin'; import { normalizePath } from '../../../testing/util'; @@ -218,12 +218,80 @@ test('experimental[]', async () => { assert.deepEqual(opts.experimental, { [flag]: true } as any); }); -async function mockPlugin() { +describe('resolveId', () => { + test('qrls', async () => { + const plugin = await mockPlugin(); + expect(plugin.resolveId(null!, 'foo', undefined)).toBeFalsy(); + const ctx = { resolve: async () => ({ id: 'Yey' }) } as any; + await expect( + plugin.resolveId( + ctx, + '/root/src/routes/layout.tsx_layout_component_usetask_1_7xk04rim0vu.js', + undefined + ) + ).resolves.toHaveProperty( + 'id', + '/root/src/routes/layout.tsx_layout_component_usetask_1_7xk04rim0vu.js' + ); + expect( + await plugin.resolveId(ctx, '/root/src/routes/layout.tsx_s_7xk04rim0vu.js', undefined) + ).toHaveProperty('id', '/root/src/routes/layout.tsx_s_7xk04rim0vu.js'); + expect(plugin.resolveId(null!, './foo', '/root/src/routes/layout.tsx')).toBeFalsy(); + expect( + await plugin.resolveId( + ctx, + './layout.tsx_layout_component_usetask_1_7xk04rim0vu.js', + '/root/src/routes/layout.tsx' + ) + ).toHaveProperty('id', '/root/src/routes/layout.tsx_layout_component_usetask_1_7xk04rim0vu.js'); + // this uses the already populated id we created above + expect( + await plugin.resolveId( + { + resolve: (id: string, importer: string) => { + expect(id).toBe('/root/src/routes/foo'); + expect(importer).toBe('Yey'); + return { id: 'hi' }; + }, + } as any, + './foo', + '/root/src/routes/layout.tsx_layout_component_usetask_1_7xk04rim0vu.js' + ) + ).toEqual({ id: 'hi' }); + }); + test('win32', async () => { + const plugin = await mockPlugin('win32'); + expect( + await plugin.resolveId( + { resolve: async () => 'Yey' } as any, + 'C:\\src\\routes\\layout.tsx_s_7xk04rim0vu.js', + undefined + ) + ).toHaveProperty('id', 'C:/src/routes/layout.tsx_s_7xk04rim0vu.js'); + }); + test('libs', async () => { + const plugin = await mockPlugin(); + expect(plugin.resolveId(null!, '@builder.io/qwik/build', undefined)).toHaveProperty( + 'id', + '/@builder.io/qwik/build' + ); + expect(plugin.resolveId(null!, '/@builder.io/qwik/build', undefined)).toHaveProperty( + 'id', + '/@builder.io/qwik/build' + ); + expect(plugin.resolveId(null!, '@qwik-client-manifest', '/foo/bar')).toHaveProperty( + 'id', + '/@qwik-client-manifest' + ); + }); +}); + +async function mockPlugin(os = process.platform) { const plugin = createPlugin({ sys: { cwd: () => process.cwd(), env: 'node', - os: process.platform, + os, dynamicImport: async (path) => import(path), strictDynamicImport: async (path) => import(path), path: path as any, diff --git a/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts b/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts index 04cafa4b542..fc2dcfafa58 100644 --- a/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts +++ b/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts @@ -5,14 +5,9 @@ import type { IncomingMessage, ServerResponse } from 'http'; import type { Connect, ViteDevServer } from 'vite'; import type { OptimizerSystem, Path, QwikManifest, SymbolMapper, SymbolMapperFn } from '../types'; -import { - type NormalizedQwikPluginOptions, - parseId, - getSymbolHash, - makeNormalizePath, -} from './plugin'; +import { type NormalizedQwikPluginOptions, parseId, makeNormalizePath } from './plugin'; import type { QwikViteDevResponse } from './vite'; -import { formatError, isWin } from './vite-utils'; +import { formatError } from './vite-utils'; import { VITE_ERROR_OVERLAY_STYLES } from './vite-error'; import imageDevTools from './image-size-runtime.html?raw'; import clickToComponent from './click-to-component.html?raw'; @@ -34,8 +29,13 @@ function getOrigin(req: IncomingMessage) { // We must encode the chunk so that e.g. + doesn't get converted to space etc const encode = (url: string) => - encodeURIComponent(url).replaceAll('%2F', '/').replaceAll('%40', '@').replaceAll('%3A', ':'); - + encodeURIComponent(url) + .replaceAll('%2F', '/') + .replaceAll('%40', '@') + .replaceAll('%3A', ':') + .replaceAll('%5B', '[') + .replaceAll('%5D', ']') + .replaceAll('%2C', ','); function createSymbolMapper( base: string, opts: NormalizedQwikPluginOptions, @@ -45,21 +45,13 @@ function createSymbolMapper( const normalizePath = makeNormalizePath(sys); return ( symbolName: string, - mapper: SymbolMapper | undefined, + _mapper: SymbolMapper | undefined, parent: string | undefined ): [string, string] => { if (symbolName === SYNC_QRL) { return [symbolName, '']; } - const hash = getSymbolHash(symbolName); if (!parent) { - console.warn( - `qwik vite-dev-server symbolMapper: parent not provided for ${symbolName}, falling back to mapper.` - ); - const chunk = mapper && mapper[hash]; - if (chunk) { - return [chunk[0], chunk[1]]; - } console.error( 'qwik vite-dev-server symbolMapper: unknown qrl requested without parent:', symbolName @@ -67,13 +59,12 @@ function createSymbolMapper( return [symbolName, `${base}${symbolName.toLowerCase()}.js`]; } // on windows, absolute paths don't start with a slash - const maybeSlash = isWin(sys.os) ? '/' : ''; const parentPath = normalizePath(path.dirname(parent)); const parentFile = path.basename(parent); const qrlPath = parentPath.startsWith(opts.rootDir) ? normalizePath(path.relative(opts.rootDir, parentPath)) - : `@fs${maybeSlash}${parentPath}`; - const qrlFile = `${encode(qrlPath)}/${parentFile.toLowerCase()}_${symbolName.toLowerCase()}.js?_qrl_parent=${encode(parentFile)}`; + : `@fs/${parentPath}`; + const qrlFile = encode(`${qrlPath}/${parentFile.toLowerCase()}_${symbolName.toLowerCase()}.js`); return [symbolName, `${base}${qrlFile}`]; }; } diff --git a/packages/qwik/src/optimizer/src/plugins/vite.ts b/packages/qwik/src/optimizer/src/plugins/vite.ts index d5c809b42cd..158188f6836 100644 --- a/packages/qwik/src/optimizer/src/plugins/vite.ts +++ b/packages/qwik/src/optimizer/src/plugins/vite.ts @@ -392,6 +392,14 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { } else if (opts.target === 'lib') { // Library Build updatedViteConfig.build!.minify = false; + updatedViteConfig.build!.rollupOptions.external = [ + QWIK_CORE_ID, + QWIK_CORE_SERVER, + QWIK_JSX_RUNTIME_ID, + QWIK_JSX_DEV_RUNTIME_ID, + QWIK_BUILD_ID, + QWIK_CLIENT_MANIFEST_ID, + ]; } else { // Test Build updatedViteConfig.define = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf3e9732ad4..08dce889bdd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,8 +68,8 @@ importers: specifier: 6.1.0 version: 6.1.0 '@playwright/test': - specifier: 1.40.0 - version: 1.40.0 + specifier: 1.47.0 + version: 1.47.0 '@types/brotli': specifier: 1.3.4 version: 1.3.4 @@ -558,9 +558,6 @@ importers: csstype: specifier: ^3.1 version: 3.1.3 - vite: - specifier: ^5 - version: 5.3.5(@types/node@20.14.11)(terser@5.31.3) devDependencies: '@builder.io/qwik': specifier: workspace:^ @@ -613,13 +610,10 @@ importers: version: 6.6.2 valibot: specifier: '>=0.36.0 <2' - version: 0.39.0(typescript@5.4.5) + version: 0.42.1(typescript@5.4.5) vfile: specifier: 6.0.1 version: 6.0.1 - vite: - specifier: ^5 - version: 5.3.5(@types/node@20.14.11)(terser@5.31.3) vite-imagetools: specifier: ^7 version: 7.0.4(rollup@4.19.0) @@ -1168,9 +1162,11 @@ packages: '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' '@esbuild-kit/esm-loader@2.6.5': resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' '@esbuild-plugins/node-globals-polyfill@0.2.3': resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} @@ -2154,8 +2150,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -2930,9 +2926,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.40.0': - resolution: {integrity: sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==} - engines: {node: '>=16'} + '@playwright/test@1.47.0': + resolution: {integrity: sha512-SgAdlSwYVpToI4e/IH19IHHWvoijAYH5hu2MWSXptRypLSnzj51PcGD+rsOXFayde4P9ZLi+loXVwArg6IUkCA==} + engines: {node: '>=18'} hasBin: true '@pnpm/config.env-replace@1.1.0': @@ -3266,9 +3262,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -3305,11 +3298,11 @@ packages: '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - '@types/qs@6.9.11': - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3335,8 +3328,8 @@ packages: '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/set-cookie-parser@2.4.10': resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} @@ -4522,8 +4515,8 @@ packages: supports-color: optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -5161,21 +5154,22 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -5984,8 +5978,8 @@ packages: resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} image-meta@0.2.0: @@ -6574,6 +6568,7 @@ packages: libsql@0.3.18: resolution: {integrity: sha512-lvhKr7WV3NLWRbXkjn/MeKqXOAqWKU0PX9QYrvDh7fneukapj+iUQ4qgJASrQyxcCrEsClXCQiiK5W6OoYPAlA==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] light-my-request@5.11.1: @@ -7266,8 +7261,8 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true node-releases@2.0.14: @@ -7742,14 +7737,14 @@ packages: pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - playwright-core@1.40.0: - resolution: {integrity: sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==} - engines: {node: '>=16'} + playwright-core@1.47.0: + resolution: {integrity: sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==} + engines: {node: '>=18'} hasBin: true - playwright@1.40.0: - resolution: {integrity: sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==} - engines: {node: '>=16'} + playwright@1.47.0: + resolution: {integrity: sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==} + engines: {node: '>=18'} hasBin: true possible-typed-array-names@1.0.0: @@ -8018,10 +8013,6 @@ packages: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} - qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -8488,16 +8479,11 @@ packages: shikiji-core@0.9.19: resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} - deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates shikiji@0.9.19: resolution: {integrity: sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg==} deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates - side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} - engines: {node: '>= 0.4'} - side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -9196,8 +9182,8 @@ packages: unenv-nightly@1.10.0-1717606461.a117952: resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} - unenv@1.9.0: - resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} @@ -9358,8 +9344,8 @@ packages: valibot@0.33.3: resolution: {integrity: sha512-/fuY1DlX8uiQ7aphlzrrI2DbG0YJk84JMgvz2qKpUIdXRNsS53varfo4voPjSrjUr5BSV2K0miSEJUOlA5fQFg==} - valibot@0.39.0: - resolution: {integrity: sha512-d+vE8SDRNy9zKg6No5MHz2tdz8H6CW8X3OdqYdmlhnoqQmEoM6Hu0hJUrZv3tPSVrzZkIIMCtdCQtMzcM6NCWw==} + valibot@0.42.1: + resolution: {integrity: sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==} peerDependencies: typescript: 5.4.5 peerDependenciesMeta: @@ -10841,15 +10827,15 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.11.1': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -10860,10 +10846,10 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@9.4.0) - espree: 10.1.0 + debug: 4.3.7(supports-color@9.4.0) + espree: 10.2.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -10931,7 +10917,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -11153,7 +11139,7 @@ snapshots: '@mapbox/node-pre-gyp@1.0.11(supports-color@9.4.0)': dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 https-proxy-agent: 5.0.1(supports-color@9.4.0) make-dir: 3.1.0 node-fetch: 2.7.0 @@ -11339,7 +11325,7 @@ snapshots: dependencies: '@babel/runtime': 7.23.9 '@mui/types': 7.2.15(@types/react@18.3.3) - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 @@ -11881,9 +11867,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.40.0': + '@playwright/test@1.47.0': dependencies: - playwright: 1.40.0 + playwright: 1.47.0 '@pnpm/config.env-replace@1.1.0': {} @@ -11903,7 +11889,7 @@ snapshots: '@puppeteer/browsers@2.2.4': dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.4.0 @@ -12176,7 +12162,7 @@ snapshots: '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 20.14.11 - '@types/qs': 6.9.11 + '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -12184,8 +12170,8 @@ snapshots: dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.11 - '@types/serve-static': 1.15.5 + '@types/qs': 6.9.16 + '@types/serve-static': 1.15.7 '@types/geojson@7946.0.14': {} @@ -12229,8 +12215,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/mime@3.0.4': {} - '@types/ms@0.7.34': {} '@types/node-fetch@2.6.11': @@ -12267,9 +12251,9 @@ snapshots: '@types/node': 20.14.11 kleur: 3.0.3 - '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.13': {} - '@types/qs@6.9.11': {} + '@types/qs@6.9.16': {} '@types/range-parser@1.2.7': {} @@ -12283,7 +12267,7 @@ snapshots: '@types/react@18.3.3': dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 '@types/refractor@3.4.1': @@ -12299,11 +12283,11 @@ snapshots: '@types/mime': 1.3.5 '@types/node': 20.14.11 - '@types/serve-static@1.15.5': + '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 '@types/node': 20.14.11 + '@types/send': 0.17.4 '@types/set-cookie-parser@2.4.10': dependencies: @@ -12344,7 +12328,7 @@ snapshots: '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.11.1 '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.16.1 '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.4.5) @@ -12352,7 +12336,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.16.1 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -12366,7 +12350,7 @@ snapshots: '@typescript-eslint/types': 7.16.1 '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 @@ -12400,7 +12384,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.4.5) '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -12418,7 +12402,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -12432,7 +12416,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.16.1 '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -12447,7 +12431,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.8.0 '@typescript-eslint/visitor-keys': 7.8.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -12531,7 +12515,7 @@ snapshots: glob: 7.2.3 graceful-fs: 4.2.11 micromatch: 4.0.5 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.2 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -12692,13 +12676,13 @@ snapshots: agent-base@6.0.2(supports-color@9.4.0): dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color agent-base@7.1.0: dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -12959,7 +12943,7 @@ snapshots: dependencies: '@fastify/error': 3.4.1 archy: 1.0.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) fastq: 1.17.1 transitivePeerDependencies: - supports-color @@ -13144,7 +13128,7 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.2 builtin-modules@3.3.0: {} @@ -13205,7 +13189,7 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -13678,9 +13662,9 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.6(supports-color@9.4.0): + debug@4.3.7(supports-color@9.4.0): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 9.4.0 @@ -14129,7 +14113,7 @@ snapshots: esbuild-register@3.5.0(esbuild@0.19.12): dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -14380,12 +14364,12 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.1.0: {} eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.11.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -14395,7 +14379,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14409,7 +14393,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -14432,11 +14416,11 @@ snapshots: event-emitter: 0.3.5 type: 2.7.2 - espree@10.1.0: + espree@10.2.0: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 + eslint-visitor-keys: 4.1.0 espree@9.6.1: dependencies: @@ -14658,7 +14642,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -15047,7 +15031,7 @@ snapshots: dependencies: basic-ftp: 5.0.4 data-uri-to-buffer: 6.0.2 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -15133,7 +15117,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -15141,7 +15125,7 @@ snapshots: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 4.0.0 @@ -15149,7 +15133,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -15201,7 +15185,7 @@ snapshots: radix3: 1.1.0 ufo: 1.5.4 uncrypto: 0.1.3 - unenv: 1.9.0 + unenv: 1.10.0 hanji@0.0.5: dependencies: @@ -15405,7 +15389,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -15439,14 +15423,14 @@ snapshots: https-proxy-agent@5.0.1(supports-color@9.4.0): dependencies: agent-base: 6.0.2(supports-color@9.4.0) - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -15472,7 +15456,7 @@ snapshots: dependencies: minimatch: 9.0.4 - ignore@5.3.1: {} + ignore@5.3.2: {} image-meta@0.2.0: {} @@ -15594,13 +15578,13 @@ snapshots: dependencies: es-errors: 1.3.0 hasown: 2.0.1 - side-channel: 1.0.5 + side-channel: 1.0.6 ioredis@5.3.2: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -16783,7 +16767,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.0 @@ -17128,7 +17112,7 @@ snapshots: node-fetch: 3.3.2 omit.js: 2.0.2 p-wait-for: 4.1.0 - qs: 6.11.2 + qs: 6.13.0 netmask@2.0.2: {} @@ -17162,7 +17146,7 @@ snapshots: node-forge@1.3.1: {} - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.2: {} node-releases@2.0.14: {} @@ -17523,7 +17507,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) get-uri: 6.0.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 @@ -17692,11 +17676,11 @@ snapshots: mlly: 1.6.1 pathe: 1.1.2 - playwright-core@1.40.0: {} + playwright-core@1.47.0: {} - playwright@1.40.0: + playwright@1.47.0: dependencies: - playwright-core: 1.40.0 + playwright-core: 1.47.0 optionalDependencies: fsevents: 2.3.2 @@ -17756,7 +17740,7 @@ snapshots: prebuild-install@7.1.1: dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 @@ -17832,7 +17816,7 @@ snapshots: dependencies: execa: 5.1.1 find-up: 5.0.0 - ignore: 5.3.1 + ignore: 5.3.2 mri: 1.2.0 picocolors: 1.0.1 picomatch: 3.0.1 @@ -17887,7 +17871,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 lru-cache: 7.18.3 @@ -17923,7 +17907,7 @@ snapshots: dependencies: '@puppeteer/browsers': 2.2.4 chromium-bidi: 0.6.1(devtools-protocol@0.0.1299070) - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) devtools-protocol: 0.0.1299070 ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -17947,11 +17931,7 @@ snapshots: qs@6.11.0: dependencies: - side-channel: 1.0.5 - - qs@6.11.2: - dependencies: - side-channel: 1.0.5 + side-channel: 1.0.6 qs@6.13.0: dependencies: @@ -18496,7 +18476,7 @@ snapshots: sharp@0.32.6: dependencies: color: 4.2.3 - detect-libc: 2.0.2 + detect-libc: 2.0.3 node-addon-api: 6.1.0 prebuild-install: 7.1.1 semver: 7.6.3 @@ -18557,13 +18537,6 @@ snapshots: dependencies: shikiji-core: 0.9.19 - side-channel@1.0.5: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -18626,7 +18599,7 @@ snapshots: socks-proxy-agent@8.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) socks: 2.8.1 transitivePeerDependencies: - supports-color @@ -18941,7 +18914,7 @@ snapshots: tabtab@3.0.2: dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) es6-promisify: 6.1.1 inquirer: 6.5.2 minimist: 1.2.8 @@ -19290,7 +19263,7 @@ snapshots: pathe: 1.1.2 ufo: 1.5.4 - unenv@1.9.0: + unenv@1.10.0: dependencies: consola: 3.2.3 defu: 6.1.4 @@ -19425,7 +19398,7 @@ snapshots: utf-8-validate@5.0.10: dependencies: - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.2 util-deprecate@1.0.2: {} @@ -19446,7 +19419,7 @@ snapshots: valibot@0.33.3: {} - valibot@0.39.0(typescript@5.4.5): + valibot@0.42.1(typescript@5.4.5): optionalDependencies: typescript: 5.4.5 @@ -19494,7 +19467,7 @@ snapshots: vite-node@0.32.4(@types/node@20.14.11)(terser@5.31.3): dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.1 @@ -19512,7 +19485,7 @@ snapshots: vite-node@2.0.5(@types/node@20.14.11)(terser@5.31.3): dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) pathe: 1.1.2 tinyrainbow: 1.2.0 vite: 5.3.5(@types/node@20.14.11)(terser@5.31.3) @@ -19531,7 +19504,7 @@ snapshots: '@microsoft/api-extractor': 7.43.0(@types/node@20.14.11) '@rollup/pluginutils': 5.1.0(rollup@4.19.0) '@vue/language-core': 1.8.27(typescript@5.4.5) - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) kolorist: 1.8.0 magic-string: 0.30.11 typescript: 5.4.5 @@ -19547,7 +19520,7 @@ snapshots: dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.19.0) - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) error-stack-parser-es: 0.1.5 fs-extra: 11.2.0 open: 10.1.0 @@ -19569,7 +19542,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.3)): dependencies: - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: @@ -19608,7 +19581,7 @@ snapshots: '@vitest/spy': 2.0.5 '@vitest/utils': 2.0.5 chai: 5.1.1 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) execa: 8.0.1 magic-string: 0.30.11 pathe: 1.1.2 @@ -19650,7 +19623,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.6(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color