diff --git a/app/bundler/events.ts b/app/bundler/events.ts new file mode 100644 index 000000000..a2bfd07e3 --- /dev/null +++ b/app/bundler/events.ts @@ -0,0 +1,6 @@ +import type { ProgressMessage } from './types' + +/** + * emitted during package initialization and bundling. + */ +export const progress = createEventHook() diff --git a/app/bundler/lib/bundler.ts b/app/bundler/lib/bundler.ts new file mode 100644 index 000000000..0108e43e0 --- /dev/null +++ b/app/bundler/lib/bundler.ts @@ -0,0 +1,266 @@ +import { encodeUtf8, getUtf8Length } from '@atcute/uint8array' +import type { PluginContext } from '@rolldown/browser' +import { rolldown } from '@rolldown/browser' +import { memfs } from '@rolldown/browser/experimental' +import * as zstdWasm from '@bokuweb/zstd-wasm' + +import { progress } from '../events' +import type { BundleChunk, BundleOptions, BundleResult } from '../types' + +import { BundleError } from './errors' +import { analyzeModule } from './module-type' + +const { volume } = memfs! + +// #region helpers + +const VIRTUAL_ENTRY_ID = '\0virtual:entry' + +/** + * get compressed size using a compression stream. + */ +async function getCompressedSize(code: string, format: CompressionFormat): Promise { + const stream = new Blob([code]).stream() + const compressed = stream.pipeThrough(new CompressionStream(format)) + const reader = compressed.getReader() + + let size = 0 + while (true) { + const { done, value } = await reader.read() + if (done) { + break + } + + size += value.byteLength + } + + return size +} + +/** + * get gzip size using compression stream. + */ +function getGzipSize(code: string): Promise { + return getCompressedSize(code, 'gzip') +} + +/** + * whether brotli compression is supported. + * - `undefined`: not yet checked + * - `true`: supported + * - `false`: not supported + */ +let isBrotliSupported: boolean | undefined + +/** + * get brotli size using compression stream, if supported. + * returns `undefined` if brotli is not supported by the browser. + */ +async function getBrotliSize(code: string): Promise { + if (isBrotliSupported === false) { + return undefined + } + + if (isBrotliSupported === undefined) { + try { + // @ts-expect-error 'brotli' is not in the type definition yet + const size = await getCompressedSize(code, 'brotli') + isBrotliSupported = true + return size + } catch { + isBrotliSupported = false + return undefined + } + } + + // @ts-expect-error 'brotli' is not in the type definition yet + return getCompressedSize(code, 'brotli') +} + +let zstdInitialized = false + +/** + * get zstd-compressed size using wasm. + * returns `undefined` if wasm failed to initialize. + */ +async function getZstdSize(code: string): Promise { + if (!zstdInitialized) { + try { + await zstdWasm.init() + zstdInitialized = true + } catch { + return undefined + } + } + + const encoded = encodeUtf8(code) + const compressed = zstdWasm.compress(encoded) + return compressed.byteLength +} + +// #endregion + +// #region core + +/** + * bundles a subpath from a package that's already loaded in rolldown's memfs. + * + * @param packageName the package name (e.g., "react") + * @param subpath the export subpath to bundle (e.g., ".", "./utils") + * @param selectedExports specific exports to include, or null for all + * @param options bundling options + * @returns bundle result with chunks, sizes, and exported names + */ +export async function bundlePackage( + packageName: string, + subpath: string, + selectedExports: string[] | null, + options: BundleOptions, +): Promise { + // track whether module is CJS (set in load hook) + let isCjs = false + + // bundle with rolldown + const bundle = await rolldown({ + input: { main: VIRTUAL_ENTRY_ID }, + cwd: '/', + external: options.rolldown?.external, + plugins: [ + { + name: 'virtual-entry', + resolveId(id: string) { + if (id === VIRTUAL_ENTRY_ID) { + return id + } + }, + async load(this: PluginContext, id: string) { + if (id !== VIRTUAL_ENTRY_ID) { + return + } + + const importPath = subpath === '.' ? packageName : `${packageName}${subpath.slice(1)}` + + // resolve the entry module + const resolved = await this.resolve(importPath) + if (!resolved) { + throw new BundleError(`failed to resolve entry module: ${importPath}`) + } + + // JSON files only have a default export + if (resolved.id.endsWith('.json')) { + return `export { default } from '${importPath}';\n` + } + + // read the source file + let source: string + try { + source = volume.readFileSync(resolved.id, 'utf8') as string + } catch { + throw new BundleError(`failed to read entry module: ${resolved.id}`) + } + + // parse and analyze the module + let ast + try { + ast = this.parse(source) + } catch { + throw new BundleError(`failed to parse entry module: ${resolved.id}`) + } + + const moduleInfo = analyzeModule(ast) + isCjs = moduleInfo.type === 'cjs' + + // CJS modules can't be tree-shaken effectively, just re-export default + if (moduleInfo.type === 'cjs') { + return `export { default } from '${importPath}';\n` + } + + // unknown/side-effects only modules have no exports + if (moduleInfo.type === 'unknown') { + return `export {} from '${importPath}';\n` + } + + // ESM module handling + if (selectedExports === null) { + // re-export everything + let code = `export * from '${importPath}';\n` + if (moduleInfo.hasDefaultExport) { + code += `export { default } from '${importPath}';\n` + } + return code + } + + // specific exports selected (empty array = export nothing) + // quote names to handle non-identifier exports + const quoted = selectedExports.map(e => JSON.stringify(e)) + return `export { ${quoted.join(', ')} } from '${importPath}';\n` + }, + }, + ], + }) + + const output = await bundle.generate({ + format: 'esm', + minify: options.rolldown?.minify ?? true, + }) + + // process all chunks + const rawChunks = output.output.filter(o => o.type === 'chunk') + + progress.trigger({ type: 'progress', kind: 'compress' }) + + const chunks: BundleChunk[] = await Promise.all( + rawChunks.map(async chunk => { + const code = chunk.code + const size = getUtf8Length(code) + const [gzipSize, brotliSize, zstdSize] = await Promise.all([ + getGzipSize(code), + getBrotliSize(code), + getZstdSize(code), + ]) + + return { + fileName: chunk.fileName, + code, + size, + gzipSize, + brotliSize, + zstdSize, + isEntry: chunk.isEntry, + exports: chunk.exports || [], + } + }), + ) + + // find entry chunk for exports + const entryChunk = chunks.find(c => c.isEntry) + if (!entryChunk) { + throw new BundleError('no entry chunk found in bundle output') + } + + // aggregate sizes + const totalSize = chunks.reduce((acc, c) => acc + c.size, 0) + const totalGzipSize = chunks.reduce((acc, c) => acc + c.gzipSize, 0) + const totalBrotliSize = + isBrotliSupported && chunks.every(c => c.brotliSize != null) + ? chunks.reduce((acc, c) => acc + c.brotliSize!, 0) + : undefined + const totalZstdSize = + zstdInitialized && chunks.every(c => c.zstdSize != null) + ? chunks.reduce((acc, c) => acc + c.zstdSize!, 0) + : undefined + + await bundle.close() + + return { + chunks, + size: totalSize, + gzipSize: totalGzipSize, + brotliSize: totalBrotliSize, + zstdSize: totalZstdSize, + exports: entryChunk.exports, + isCjs, + } +} + +// #endregion diff --git a/app/bundler/lib/errors.ts b/app/bundler/lib/errors.ts new file mode 100644 index 000000000..e13f02161 --- /dev/null +++ b/app/bundler/lib/errors.ts @@ -0,0 +1,81 @@ +/** + * base class for all teardown errors. + */ +class BundlerError extends Error { + constructor(message: string) { + super(message) + this.name = 'BundlerError' + } +} + +/** + * thrown when a package cannot be found in the registry. + */ +export class PackageNotFoundError extends BundlerError { + readonly packageName: string + readonly registry: string + + constructor(packageName: string, registry: string) { + super(`package not found: ${packageName}`) + this.name = 'PackageNotFoundError' + this.packageName = packageName + this.registry = registry + } +} + +/** + * thrown when no version of a package satisfies the requested range. + */ +export class NoMatchingVersionError extends BundlerError { + readonly packageName: string + readonly range: string + + constructor(packageName: string, range: string) { + super(`no version of ${packageName} satisfies ${range}`) + this.name = 'NoMatchingVersionError' + this.packageName = packageName + this.range = range + } +} + +/** + * thrown when a package specifier is malformed. + */ +export class InvalidSpecifierError extends BundlerError { + readonly specifier: string + + constructor(specifier: string, reason?: string) { + super( + reason ? `invalid specifier: ${specifier} (${reason})` : `invalid specifier: ${specifier}`, + ) + this.name = 'InvalidSpecifierError' + this.specifier = specifier + } +} + +/** + * thrown when a network request fails. + */ +export class FetchError extends BundlerError { + readonly url: string + readonly status: number + readonly statusText: string + + constructor(url: string, status: number, statusText: string) { + super(`fetch failed: ${status} ${statusText}`) + this.name = 'FetchError' + this.url = url + this.status = status + this.statusText = statusText + } +} + +/** + * thrown when bundling fails. + */ +export class BundleError extends BundlerError { + constructor(message: string) { + super(message) + this.name = 'BundleError' + } +} diff --git a/app/bundler/lib/fetch.ts b/app/bundler/lib/fetch.ts new file mode 100644 index 000000000..9ad348ae2 --- /dev/null +++ b/app/bundler/lib/fetch.ts @@ -0,0 +1,211 @@ +import { untar } from '@mary/tar' +import type { Volume } from 'memfs' + +import { progress } from '../events' + +import { FetchError } from './errors' +import type { HoistedNode, HoistedResult } from './types' + +/** + * options for fetching packages. + */ +export interface FetchOptions { + /** max concurrent fetches (default 6) */ + concurrency?: number + /** regex patterns for files to exclude (matched against path after "package/" prefix is stripped) */ + exclude?: RegExp[] +} + +/** + * default patterns for files that are not needed for bundling. + * matches against the file path within the package (e.g., "README.md", "docs/guide.md") + */ +const DEFAULT_EXCLUDE_PATTERNS: RegExp[] = [ + // docs and meta files + /^README(\..*)?$/i, + /^LICENSE(\..*)?$/i, + /^LICENCE(\..*)?$/i, + /^CHANGELOG(\..*)?$/i, + /^HISTORY(\..*)?$/i, + /^CONTRIBUTING(\..*)?$/i, + /^AUTHORS(\..*)?$/i, + /^SECURITY(\..*)?$/i, + /^CODE_OF_CONDUCT(\..*)?$/i, + /^\.github\//, + /^\.vscode\//, + /^\.idea\//, + /^docs?\//i, + + // test files + /^__tests__\//, + /^tests?\//i, + /^specs?\//i, + /\.(test|spec)\.[jt]sx?$/, + /\.stories\.[jt]sx?$/, + + // config files + /^\..+rc(\..*)?$/, + /^\.editorconfig$/, + /^\.gitignore$/, + /^\.npmignore$/, + /^\.eslint/, + /^\.prettier/, + /^tsconfig(\..+)?\.json$/, + /^jest\.config/, + /^vitest\.config/, + /^rollup\.config/, + /^webpack\.config/, + /^vite\.config/, + /^babel\.config/, + + // source maps (usually not needed in bundling) + /\.map$/, + + // typescript declaration files (not needed for bundling) + /\.d\.[cm]?ts$/, + + // flow type annotations + /\.js\.flow$/, + /\.flow$/, + + // example/demo directories + /^examples?\//i, +] + +/** + * fetches a tarball and writes its contents directly to a volume. + * handles gzip decompression and strips the "package/" prefix from paths. + * + * @param url the tarball URL + * @param destPath the destination path in the volume (e.g., "/node_modules/react") + * @param volume the volume to write to + * @param exclude regex patterns for files to skip + * @returns the total size of extracted files in bytes + */ +async function fetchTarballToVolume( + url: string, + destPath: string, + volume: Volume, + exclude: RegExp[] = [], +): Promise { + const response = await fetch(url) + if (!response.ok) { + throw new FetchError(url, response.status, response.statusText) + } + + const body = response.body + if (!body) { + throw new FetchError(url, 0, 'response has no body') + } + + // decompress gzip -> extract tar + const decompressed = body.pipeThrough(new DecompressionStream('gzip')) + + let totalSize = 0 + + for await (const entry of untar(decompressed)) { + // skip directories + if (entry.type !== 'file') { + continue + } + + // count size from tar header for all files (including excluded ones) + totalSize += entry.size + + // npm tarballs have files under "package/" prefix - strip it + let path = entry.name + if (path.startsWith('package/')) { + path = path.slice(8) + } + + // check if file should be excluded (skip extraction but size already counted) + if (exclude.some(pattern => pattern.test(path))) { + continue + } + + const content = await entry.bytes() + const fullPath = `${destPath}/${path}` + + // ensure parent directories exist + const parentDir = fullPath.slice(0, fullPath.lastIndexOf('/')) + if (!volume.existsSync(parentDir)) { + volume.mkdirSync(parentDir, { recursive: true }) + } + + volume.writeFileSync(fullPath, content) + } + + return totalSize +} + +/** + * fetches all packages in a hoisted result and writes them to a volume. + * uses default exclude patterns to skip unnecessary files. + * + * @param hoisted the hoisted package structure + * @param volume the volume to write to + * @param options fetch options + */ +export async function fetchPackagesToVolume( + hoisted: HoistedResult, + volume: Volume, + options: FetchOptions = {}, +): Promise { + const concurrency = options.concurrency ?? 6 + const exclude = options.exclude ?? DEFAULT_EXCLUDE_PATTERNS + const queue: Array<{ node: HoistedNode; basePath: string }> = [] + + // collect all nodes into a flat queue + function collectNodes(node: HoistedNode, basePath: string): void { + queue.push({ node, basePath }) + if (node.nested.size > 0) { + const nestedBasePath = `${basePath}/${node.name}/node_modules` + for (const nested of node.nested.values()) { + collectNodes(nested, nestedBasePath) + } + } + } + + for (const node of hoisted.root.values()) { + collectNodes(node, '/node_modules') + } + + // process queue with concurrency limit using a simple semaphore pattern + let index = 0 + let completed = 0 + const total = queue.length + + async function worker(): Promise { + while (true) { + const i = index++ + if (i >= queue.length) { + break + } + + const item = queue[i] + if (!item) continue + const { node, basePath } = item + const packagePath = `${basePath}/${node.name}` + + const extractedSize = await fetchTarballToVolume(node.tarball, packagePath, volume, exclude) + + // use extracted size if registry didn't provide unpackedSize (e.g., JSR packages) + if (node.unpackedSize === undefined) { + node.unpackedSize = extractedSize + } + + completed++ + progress.trigger({ + type: 'progress', + kind: 'fetch', + current: completed, + total, + name: node.name, + }) + } + } + + // start concurrent workers + const workers = Array.from({ length: Math.min(concurrency, queue.length) }, () => worker()) + await Promise.all(workers) +} diff --git a/app/bundler/lib/hoist.ts b/app/bundler/lib/hoist.ts new file mode 100644 index 000000000..de55247ae --- /dev/null +++ b/app/bundler/lib/hoist.ts @@ -0,0 +1,144 @@ +import type { HoistedNode, HoistedResult, ResolvedPackage } from './types' + +/** + * creates a hoisted node from a resolved package. + */ +function createNode(pkg: ResolvedPackage): HoistedNode { + return { + name: pkg.name, + version: pkg.version, + tarball: pkg.tarball, + integrity: pkg.integrity, + unpackedSize: pkg.unpackedSize, + dependencyCount: pkg.dependencies.size, + nested: new Map(), + } +} + +/** + * attempts to place a package at the root level. + * returns true if placement succeeded, false if there's a conflict. + * + * a conflict occurs when: + * - a different version of the same package is already at root + * + * @param root the current root node_modules map + * @param pkg the package to place + * @returns true if placed at root, false if needs nesting + */ +function tryPlaceAtRoot(root: Map, pkg: ResolvedPackage): boolean { + const existing = root.get(pkg.name) + + if (!existing) { + // no conflict, place at root + root.set(pkg.name, { + name: pkg.name, + version: pkg.version, + tarball: pkg.tarball, + integrity: pkg.integrity, + unpackedSize: pkg.unpackedSize, + dependencyCount: pkg.dependencies.size, + nested: new Map(), + }) + return true + } + + // same version already at root - reuse it + if (existing.version === pkg.version) { + return true + } + + // different version - conflict, needs nesting + return false +} + +/** + * hoists dependencies as high as possible in the tree. + * follows npm's placement algorithm: + * 1. explicitly requested (root) packages always get placed at root + * 2. transitive dependencies try to hoist to root + * 3. if conflict with a root package, nest under parent + * + * peer dependencies are handled by the resolver - they're added as regular + * dependencies of the package that requested them, so they naturally get + * hoisted to root if no conflict, or nested under the dependent if there's + * a version conflict. this ensures the bundler resolves peers correctly. + * + * @param roots the root packages from resolution + * @returns the hoisted node_modules structure + */ +export function hoist(roots: ResolvedPackage[]): HoistedResult { + const root = new Map() + + // track which packages we've visited to avoid infinite loops + const visited = new Set() + + // track which package names are explicitly requested (root packages) + // these take precedence over transitive dependencies + const rootPackageVersions = new Map() + for (const pkg of roots) { + rootPackageVersions.set(pkg.name, pkg.version) + } + + /** + * recursively process a package's dependencies. + * the package itself should already be placed. + */ + function processDependencies(pkg: ResolvedPackage, node: HoistedNode): void { + for (const dep of pkg.dependencies.values()) { + const depKey = `${dep.name}@${dep.version}` + + // skip if already processed + if (visited.has(depKey)) { + continue + } + visited.add(depKey) + + // check if this dep conflicts with a root package + const rootVersion = rootPackageVersions.get(dep.name) + if (rootVersion !== undefined && rootVersion !== dep.version) { + // conflict with explicit root package - must nest + const nestedNode = createNode(dep) + node.nested.set(dep.name, nestedNode) + processDependencies(dep, nestedNode) + continue + } + + // try to place at root + const placedAtRoot = tryPlaceAtRoot(root, dep) + if (placedAtRoot) { + const rootNode = root.get(dep.name)! + processDependencies(dep, rootNode) + } else { + // conflict at root with another transitive dep - nest + const nestedNode = createNode(dep) + node.nested.set(dep.name, nestedNode) + processDependencies(dep, nestedNode) + } + } + } + + // first pass: place all root packages at root level + // this ensures explicitly requested packages take precedence + for (const rootPkg of roots) { + const key = `${rootPkg.name}@${rootPkg.version}` + if (visited.has(key)) { + continue + } + visited.add(key) + + // root packages always go at root (overwrite if different version exists) + const node = createNode(rootPkg) + root.set(rootPkg.name, node) + } + + // second pass: process dependencies of all root packages + for (const rootPkg of roots) { + const node = root.get(rootPkg.name) + if (node) { + processDependencies(rootPkg, node) + } + } + + return { root } +} diff --git a/app/bundler/lib/installed-packages.ts b/app/bundler/lib/installed-packages.ts new file mode 100644 index 000000000..b08d97e34 --- /dev/null +++ b/app/bundler/lib/installed-packages.ts @@ -0,0 +1,126 @@ +import type { InstalledPackage, PackageRef } from '../types' + +import type { ResolvedPackage } from './types' + +/** + * builds the installed packages list from the resolved dependency tree. + * also identifies which packages are only reachable through peer dependencies. + * + * @param root the root resolved package + * @param peerDepNames names of the root package's peer dependencies + * @returns array of installed packages with peer status + */ +export function buildInstalledPackages( + root: ResolvedPackage, + peerDepNames: Set, +): InstalledPackage[] { + // collect all unique packages and compute levels + const packageMap = new Map< + string, + { + pkg: ResolvedPackage + level: number + dependents: PackageRef[] + dependencies: PackageRef[] + } + >() + + // track which packages are reachable without going through peer deps + const reachableWithoutPeers = new Set() + + // first pass: collect packages and compute levels + { + const visited = new Set() + + function walk(pkg: ResolvedPackage, level: number, inPeerSubtree: boolean): void { + const key = `${pkg.name}@${pkg.version}` + + // update level to shortest path + const existing = packageMap.get(key) + if (existing) { + if (level < existing.level) { + existing.level = level + } + } else { + packageMap.set(key, { pkg, level, dependents: [], dependencies: [] }) + } + + // track if reachable without peers + if (!inPeerSubtree) { + reachableWithoutPeers.add(key) + } + + // avoid infinite loops from cycles + if (visited.has(key)) { + return + } + visited.add(key) + + for (const [depName, dep] of pkg.dependencies) { + // check if this edge goes through a root peer dep + const isPeerEdge = pkg === root && peerDepNames.has(depName) + walk(dep, level + 1, inPeerSubtree || isPeerEdge) + } + + visited.delete(key) + } + + walk(root, 0, false) + } + + // second pass: build dependency/dependent relationships + // we need to read peerDependencies from each package's manifest + for (const [_key, entry] of packageMap) { + const pkg = entry.pkg + + for (const [depName, dep] of pkg.dependencies) { + const depKey = `${dep.name}@${dep.version}` + const depEntry = packageMap.get(depKey) + if (!depEntry) { + continue + } + + // check if this is a peer dependency edge by looking at the manifest + // note: during resolution, peer deps are added to dependencies map + // we need to check the original peerDependencies field + const isPeerDep = pkg === root && peerDepNames.has(depName) + + // add to this package's dependencies + entry.dependencies.push({ + name: dep.name, + version: dep.version, + isPeer: isPeerDep, + }) + + // add to the dependency's dependents + depEntry.dependents.push({ + name: pkg.name, + version: pkg.version, + isPeer: isPeerDep, + }) + } + } + + // build final array + const packages: InstalledPackage[] = [] + for (const [key, { pkg, level, dependents, dependencies }] of packageMap) { + // a package is a peer if: + // 1. it's a direct peer dependency of the root, OR + // 2. it's only reachable through peer dependency subtrees + const isDirectPeerOfRoot = peerDepNames.has(pkg.name) + const isOnlyReachableThroughPeers = !reachableWithoutPeers.has(key) + + packages.push({ + name: pkg.name, + version: pkg.version, + size: pkg.unpackedSize ?? 0, + path: `node_modules/${pkg.name}`, + level, + dependents, + dependencies, + isPeer: isDirectPeerOfRoot || isOnlyReachableThroughPeers, + }) + } + + return packages +} diff --git a/app/bundler/lib/module-type.ts b/app/bundler/lib/module-type.ts new file mode 100644 index 000000000..ffc8174ed --- /dev/null +++ b/app/bundler/lib/module-type.ts @@ -0,0 +1,393 @@ +import type { Expression, Program, Statement, StaticMemberExpression } from '@oxc-project/types' + +// #region types + +export type ModuleType = 'esm' | 'cjs' | 'unknown' + +/** + * information about a module's format and exports. + */ +export interface ModuleInfo { + /** detected module format */ + type: ModuleType + /** whether the module has a default export */ + hasDefaultExport: boolean + /** + * detected named exports. + * for ESM: export names from export statements. + * for CJS: static property assignments to exports/module.exports. + */ + namedExports: string[] +} + +// #endregion + +// #region helpers + +/** + * checks if a node is a string literal with type "Literal". + */ +function isStringLiteral(node: unknown): node is { type: 'Literal'; value: string } { + return ( + typeof node === 'object' && + node !== null && + (node as { type: string }).type === 'Literal' && + typeof (node as { value: unknown }).value === 'string' + ) +} + +/** + * checks if an expression is an identifier with the given name. + */ +function isIdentifier(node: Expression | null | undefined, name: string): boolean { + if (!node) { + return false + } + // IdentifierReference and IdentifierName both have type "Identifier" and name property + return node.type === 'Identifier' && (node as { name: string }).name === name +} + +/** + * checks if an expression is `exports` or `module.exports`. + */ +function isExportsObject(node: Expression): boolean { + if (isIdentifier(node, 'exports')) { + return true + } + + // module.exports + if (node.type === 'MemberExpression') { + const memberExpr = node as StaticMemberExpression + if (!memberExpr.computed) { + const obj = memberExpr.object + const prop = memberExpr.property + return isIdentifier(obj, 'module') && prop.type === 'Identifier' && prop.name === 'exports' + } + } + + return false +} + +/** + * gets the property name from a static member expression. + */ +function getStaticPropertyName(node: StaticMemberExpression): string | null { + if (node.computed) { + // computed property like exports["foo"] + const prop = node.property as unknown as Expression + if (isStringLiteral(prop)) { + return prop.value + } + return null + } + + // non-computed like exports.foo + const prop = node.property + if (prop.type === 'Identifier') { + return prop.name + } + + return null +} + +/** + * extracts property names from an object expression (for `module.exports = { a, b }`). + */ +function extractObjectPropertyNames(node: Expression): string[] { + if (node.type !== 'ObjectExpression') { + return [] + } + + const names: string[] = [] + for (const prop of node.properties) { + if (prop.type === 'SpreadElement') { + continue + } + + if (prop.type === 'Property') { + const key = prop.key + if (key.type === 'Identifier') { + names.push((key as { name: string }).name) + } else if (isStringLiteral(key)) { + names.push(key.value) + } + } + } + + return names +} + +// #endregion + +// #region detection + +/** + * checks if an expression is a require() call. + */ +function isRequireCall(expr: Expression): boolean { + return expr.type === 'CallExpression' && isIdentifier(expr.callee as Expression, 'require') +} + +/** + * checks an expression for CJS export patterns. + * returns the export names found, or null if not a CJS pattern. + */ +function checkCjsExpression(expr: Expression): string[] | null { + // assignment expressions: exports.foo = ... or module.exports = ... + if (expr.type === 'AssignmentExpression' && expr.operator === '=') { + const left = expr.left + + // exports.foo = ... or module.exports.foo = ... + if (left.type === 'MemberExpression') { + const memberExpr = left as unknown as StaticMemberExpression + const obj = memberExpr.object + + // direct assignment to exports.propertyName + if (isExportsObject(obj)) { + const propName = getStaticPropertyName(memberExpr) + if (propName !== null) { + return [propName] + } + return [] + } + + // module.exports = require('...') - CJS re-export + if (isExportsObject(left as unknown as Expression)) { + if (isRequireCall(expr.right)) { + // re-export, we can't know the exports statically + return [] + } + // module.exports = { a, b } + return extractObjectPropertyNames(expr.right) + } + } + } + + // Object.defineProperty(exports, 'name', ...) or Object.defineProperty(module.exports, 'name', ...) + if (expr.type === 'CallExpression') { + const callee = expr.callee + + if (callee.type === 'MemberExpression') { + const memberCallee = callee as StaticMemberExpression + if (!memberCallee.computed && isIdentifier(memberCallee.object, 'Object')) { + const prop = memberCallee.property + if (prop.type === 'Identifier' && prop.name === 'defineProperty') { + const args = expr.arguments + const target = args[0] + const propArg = args[1] + if ( + target && + propArg && + target.type !== 'SpreadElement' && + isExportsObject(target) && + propArg.type !== 'SpreadElement' && + isStringLiteral(propArg) + ) { + return [propArg.value] + } + } + } + } + } + + return null +} + +/** + * checks a statement for CJS patterns and extracts export info. + * returns the export names found, or null if not a CJS pattern. + */ +function checkCjsStatement(stmt: Statement): string[] | null { + // handle expression statements + if (stmt.type === 'ExpressionStatement') { + return checkCjsExpression(stmt.expression) + } + + // handle if statements - check both branches for CJS patterns + // e.g., if (process.env.NODE_ENV === 'production') module.exports = require('./prod') + if (stmt.type === 'IfStatement') { + let result: string[] | null = null + + // check consequent + if (stmt.consequent.type === 'ExpressionStatement') { + result = checkCjsExpression(stmt.consequent.expression) + } else if (stmt.consequent.type === 'BlockStatement') { + for (const s of stmt.consequent.body) { + const r = checkCjsStatement(s) + if (r !== null) { + result = result ? [...result, ...r] : r + } + } + } + + // check alternate + if (stmt.alternate) { + if (stmt.alternate.type === 'ExpressionStatement') { + const r = checkCjsExpression(stmt.alternate.expression) + if (r !== null) { + result = result ? [...result, ...r] : r + } + } else if (stmt.alternate.type === 'BlockStatement') { + for (const s of stmt.alternate.body) { + const r = checkCjsStatement(s) + if (r !== null) { + result = result ? [...result, ...r] : r + } + } + } else if (stmt.alternate.type === 'IfStatement') { + const r = checkCjsStatement(stmt.alternate) + if (r !== null) { + result = result ? [...result, ...r] : r + } + } + } + + return result + } + + return null +} + +/** + * analyzes an Oxc AST to determine the module format and exports. + * + * @param ast the parsed program AST + * @returns module info with type, default export flag, and named exports + */ +export function analyzeModule(ast: Program): ModuleInfo { + let type: ModuleType = 'unknown' + let hasDefaultExport = false + const namedExports: string[] = [] + + for (const node of ast.body) { + // ESM: import declarations + if (node.type === 'ImportDeclaration') { + type = 'esm' + continue + } + + // ESM: export default + if (node.type === 'ExportDefaultDeclaration') { + type = 'esm' + hasDefaultExport = true + continue + } + + // ESM: export all (export * from '...') + if (node.type === 'ExportAllDeclaration') { + type = 'esm' + // star exports don't add to namedExports since we can't know them statically + continue + } + + // ESM: named exports + if (node.type === 'ExportNamedDeclaration') { + type = 'esm' + + // export { a, b } or export { a } from '...' + for (const spec of node.specifiers) { + const exported = spec.exported + let name: string + + if (exported.type === 'Identifier') { + name = (exported as { name: string }).name + } else if (isStringLiteral(exported)) { + name = exported.value + } else { + continue + } + + if (name === 'default') { + hasDefaultExport = true + } else { + namedExports.push(name) + } + } + + // export const foo = ... or export function bar() {} + if (node.declaration) { + const decl = node.declaration + + if (decl.type === 'VariableDeclaration') { + for (const declarator of decl.declarations) { + if (declarator.id.type === 'Identifier') { + namedExports.push((declarator.id as { name: string }).name) + } + } + } else if (decl.type === 'FunctionDeclaration' || decl.type === 'ClassDeclaration') { + if (decl.id) { + namedExports.push((decl.id as { name: string }).name) + } + } + } + + continue + } + + // ESM: import.meta usage + if (node.type === 'ExpressionStatement') { + if (containsImportMeta(node.expression)) { + type = 'esm' + continue + } + } + + // CJS detection (only if not already ESM) + if (type !== 'esm') { + const cjsExports = checkCjsStatement(node) + if (cjsExports !== null) { + type = 'cjs' + namedExports.push(...cjsExports) + } + } + } + + return { type, hasDefaultExport, namedExports } +} + +/** + * recursively checks if an expression contains import.meta. + */ +function containsImportMeta(expr: Expression): boolean { + if (expr.type === 'MetaProperty') { + const meta = expr.meta + const prop = expr.property + return meta.name === 'import' && prop.name === 'meta' + } + + if (expr.type === 'MemberExpression') { + return containsImportMeta(expr.object as Expression) + } + + if (expr.type === 'CallExpression') { + // check callee and arguments + if (containsImportMeta(expr.callee as Expression)) { + return true + } + for (const arg of expr.arguments) { + if (arg.type !== 'SpreadElement' && containsImportMeta(arg)) { + return true + } + } + } + + if (expr.type === 'BinaryExpression' || expr.type === 'LogicalExpression') { + return containsImportMeta(expr.left as Expression) || containsImportMeta(expr.right) + } + + if (expr.type === 'UnaryExpression') { + return containsImportMeta(expr.argument) + } + + if (expr.type === 'ConditionalExpression') { + return ( + containsImportMeta(expr.test) || + containsImportMeta(expr.consequent) || + containsImportMeta(expr.alternate) + ) + } + + return false +} + +// #endregion diff --git a/app/bundler/lib/registry.ts b/app/bundler/lib/registry.ts new file mode 100644 index 000000000..0011b826b --- /dev/null +++ b/app/bundler/lib/registry.ts @@ -0,0 +1,109 @@ +import * as v from 'valibot' + +import { FetchError, InvalidSpecifierError, PackageNotFoundError } from './errors' +import { abbreviatedPackumentSchema, type AbbreviatedPackument, type Registry } from './types' + +const NPM_REGISTRY = 'https://registry.npmjs.org' +const JSR_REGISTRY = 'https://npm.jsr.io' + +/** + * cache for packuments to avoid refetching during resolution. + * key format: "registry:name" (e.g., "npm:react" or "jsr:@luca/flag") + */ +const packumentCache = new Map() + +/** + * transforms a JSR package name to the npm-compatible format. + * `@scope/name` becomes `@jsr/scope__name` + * + * @param name the JSR package name (must be scoped) + * @returns the transformed npm-compatible name + */ +function transformJsrName(name: string): string { + if (!name.startsWith('@')) { + throw new InvalidSpecifierError(name, 'JSR packages must be scoped') + } + // @scope/name -> @jsr/scope__name + const withoutAt = name.slice(1) // "scope/name" + const transformed = withoutAt.replace('/', '__') // "scope__name" + return `@jsr/${transformed}` +} + +/** + * reverses the JSR npm-compatible name back to the canonical format. + * `@jsr/scope__name` becomes `@scope/name` + * + * @param name the npm-compatible JSR package name + * @returns the canonical JSR package name + */ +export function reverseJsrName(name: string): string { + if (!name.startsWith('@jsr/')) { + throw new InvalidSpecifierError(name, 'not a JSR npm-compatible name') + } + // @jsr/scope__name -> @scope/name + const withoutPrefix = name.slice(5) // "scope__name" + const restored = withoutPrefix.replace('__', '/') // "scope/name" + return `@${restored}` +} + +/** + * fetches the abbreviated packument from a registry. + * the abbreviated format contains only installation-relevant metadata. + * + * @param name the package name (can be scoped like @scope/pkg) + * @param registry which registry to fetch from (defaults to 'npm') + * @returns the abbreviated packument with all versions + * @throws if the package doesn't exist, network fails, or response is invalid + */ +export async function fetchPackument( + name: string, + registry: Registry = 'npm', +): Promise { + const cacheKey = `${registry}:${name}` + const cached = packumentCache.get(cacheKey) + if (cached) { + return cached + } + + let registryUrl: string + let fetchName: string + + if (registry === 'jsr') { + registryUrl = JSR_REGISTRY + fetchName = transformJsrName(name) + } else { + registryUrl = NPM_REGISTRY + fetchName = name + } + + const encodedName = fetchName.startsWith('@') + ? `@${encodeURIComponent(fetchName.slice(1))}` + : encodeURIComponent(fetchName) + + const url = `${registryUrl}/${encodedName}` + + let response: Response + try { + response = await fetch(url, { + headers: { + // request abbreviated format (corgi) for smaller payloads + Accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8', + }, + }) + } catch (err) { + const message = err instanceof Error ? err.message : 'Network error' + throw new FetchError(url, 0, message) + } + + if (!response.ok) { + if (response.status === 404) { + throw new PackageNotFoundError(name, registry) + } + throw new FetchError(url, response.status, response.statusText) + } + + const json = await response.json() + const packument = v.parse(abbreviatedPackumentSchema, json) + packumentCache.set(cacheKey, packument) + return packument +} diff --git a/app/bundler/lib/resolve.ts b/app/bundler/lib/resolve.ts new file mode 100644 index 000000000..ca3a18535 --- /dev/null +++ b/app/bundler/lib/resolve.ts @@ -0,0 +1,309 @@ +import * as semver from 'semver' + +import { progress } from '../events' + +import { InvalidSpecifierError, NoMatchingVersionError } from './errors' +import { fetchPackument, reverseJsrName } from './registry' +import type { + AbbreviatedManifest, + PackageSpecifier, + Registry, + ResolvedPackage, + ResolutionResult, +} from './types' + +/** + * parses a package specifier string into name, range, and registry. + * handles scoped packages, JSR packages, and various formats: + * - "foo" -> { name: "foo", range: "latest", registry: "npm" } + * - "foo@^1.0.0" -> { name: "foo", range: "^1.0.0", registry: "npm" } + * - "@scope/foo@~2.0.0" -> { name: "@scope/foo", range: "~2.0.0", registry: "npm" } + * - "npm:foo@^1.0.0" -> { name: "foo", range: "^1.0.0", registry: "npm" } + * - "jsr:@luca/flag" -> { name: "@luca/flag", range: "latest", registry: "jsr" } + * - "jsr:@luca/flag@^1.0.0" -> { name: "@luca/flag", range: "^1.0.0", registry: "jsr" } + * + * @param spec the package specifier string + * @returns parsed specifier with name, range, and registry + */ +function parseSpecifier(spec: string): PackageSpecifier { + let registry: Registry = 'npm' + let rest = spec + + // check for registry prefixes + if (spec.startsWith('jsr:')) { + registry = 'jsr' + rest = spec.slice(4) // remove "jsr:" + } else if (spec.startsWith('npm:')) { + rest = spec.slice(4) // remove "npm:", registry already 'npm' + } + + // handle scoped packages: @scope/name or @scope/name@version + if (rest.startsWith('@')) { + const slashIdx = rest.indexOf('/') + if (slashIdx === -1) { + throw new InvalidSpecifierError(spec, 'scoped package missing slash') + } + const atIdx = rest.indexOf('@', slashIdx) + if (atIdx === -1) { + return { name: rest, range: 'latest', registry } + } + return { name: rest.slice(0, atIdx), range: rest.slice(atIdx + 1), registry } + } + + // JSR packages must be scoped + if (registry === 'jsr') { + throw new InvalidSpecifierError(spec, 'JSR packages must be scoped') + } + + // handle regular packages: name or name@version + const atIdx = rest.indexOf('@') + if (atIdx === -1) { + return { name: rest, range: 'latest', registry } + } + return { name: rest.slice(0, atIdx), range: rest.slice(atIdx + 1), registry } +} + +/** + * picks the best version from a packument that satisfies a range. + * follows npm/pnpm's algorithm: + * 1. if range is a dist-tag, use that version + * 2. if range is empty, treat as 'latest' + * 3. if range is a specific version (possibly with v prefix), use that + * 4. if 'latest' tag satisfies the range, prefer it over newer versions + * 5. otherwise, find highest non-deprecated version that satisfies the range + * 6. fall back to deprecated version if no non-deprecated match + * + * @param versions available versions (version string -> manifest) + * @param distTags dist-tags mapping (e.g., { latest: "1.2.3" }) + * @param range the version range to satisfy + * @returns the best matching manifest, or null if none match + */ +function pickVersion( + versions: Record, + distTags: Record, + range: string, +): AbbreviatedManifest | null { + // empty range means latest + if (range === '') { + const latest = distTags.latest + return latest ? (versions[latest] ?? null) : null + } + + // check if range is a dist-tag + if (range in distTags) { + const taggedVersion = distTags[range] + return taggedVersion ? (versions[taggedVersion] ?? null) : null + } + + // normalize loose version formats (v1.0.0, = 1.0.0) + const cleanedRange = semver.validRange(range, { loose: true }) ?? range + + // check if range is an exact version + if (versions[range]) { + return versions[range] + } + + // check cleaned version (handles v1.0.0 -> 1.0.0) + const cleanedVersion = semver.clean(range, { loose: true }) + if (cleanedVersion && versions[cleanedVersion]) { + return versions[cleanedVersion] + } + + // for wildcard ranges, use loose mode to include prereleases + const isWildcard = range === '*' || range === 'x' || range === '' + const satisfiesOptions = { loose: true, includePrerelease: isWildcard } + + // prefer 'latest' tag if it satisfies the range (pnpm behavior) + // publishers tag 'latest' intentionally, so respect that choice + const latestVersion = distTags.latest + if (latestVersion && versions[latestVersion]) { + if (semver.satisfies(latestVersion, cleanedRange, satisfiesOptions)) { + return versions[latestVersion] + } + } + + // find all versions satisfying the range + const validVersions = Object.keys(versions) + .filter(v => semver.satisfies(v, cleanedRange, satisfiesOptions)) + .sort(semver.rcompare) + + if (validVersions.length === 0) { + return null + } + + // prefer non-deprecated versions (pnpm behavior) + const firstNonDeprecated = validVersions.find(v => !versions[v]?.deprecated) + if (firstNonDeprecated) { + return versions[firstNonDeprecated] ?? null + } + + // fall back to deprecated if no alternatives + const firstValid = validVersions[0] + return firstValid ? (versions[firstValid] ?? null) : null +} + +/** + * options for dependency resolution. + */ +export interface ResolveOptions { + /** + * whether to auto-install peer dependencies. + * when true, required (non-optional) peer dependencies are resolved automatically. + * @default true + */ + installPeers?: boolean +} + +/** + * context for tracking resolution state across recursive calls. + */ +interface ResolutionContext { + /** all resolved packages by "registry:name@version" key for deduping */ + resolved: Map + /** packages currently being resolved (for cycle detection) */ + resolving: Set + /** resolution options */ + options: Required +} + +/** + * resolves a single package and its dependencies recursively. + * + * @param name package name + * @param range version range to satisfy + * @param registry which registry to fetch from + * @param ctx resolution context for deduping and cycle detection + * @returns the resolved package tree + */ +async function resolvePackage( + name: string, + range: string, + registry: Registry, + ctx: ResolutionContext, +): Promise { + const packument = await fetchPackument(name, registry) + const manifest = pickVersion(packument.versions, packument['dist-tags'], range) + + if (!manifest) { + throw new NoMatchingVersionError(name, range) + } + + progress.trigger({ type: 'progress', kind: 'resolve', name, version: manifest.version }) + + const key = `${registry}:${name}@${manifest.version}` + + // check if already resolved (deduplication) + const existing = ctx.resolved.get(key) + if (existing) { + return existing + } + + // cycle detection - if we're already resolving this, return a placeholder + // the actual dependencies will be filled in by the original resolution + if (ctx.resolving.has(key)) { + // create a minimal resolved package for the cycle + const cyclic: ResolvedPackage = { + name, + version: manifest.version, + tarball: manifest.dist.tarball, + integrity: manifest.dist.integrity, + dependencies: new Map(), + } + return cyclic + } + + ctx.resolving.add(key) + + // create the resolved package + const resolved: ResolvedPackage = { + name, + version: manifest.version, + tarball: manifest.dist.tarball, + integrity: manifest.dist.integrity, + unpackedSize: manifest.dist.unpackedSize, + dependencies: new Map(), + } + + // register early so cycles can find it + ctx.resolved.set(key, resolved) + + // collect all dependencies to resolve (regular deps + peer deps) + const depsToResolve: Array<[string, string]> = [] + + // add regular dependencies + const deps = manifest.dependencies ?? {} + for (const [depName, depRange] of Object.entries(deps)) { + depsToResolve.push([depName, depRange]) + } + + // add peer dependencies as regular dependencies of this package + // this ensures they get hoisted correctly - placed at root if no conflict, + // or nested under this package if there's a version conflict + if (ctx.options.installPeers && manifest.peerDependencies) { + const peerMeta = manifest.peerDependenciesMeta ?? {} + for (const [peerName, peerRange] of Object.entries(manifest.peerDependencies)) { + const isOptional = peerMeta[peerName]?.optional === true + if (!isOptional) { + // only add if not already in regular deps (regular deps take precedence) + if (!(peerName in deps)) { + depsToResolve.push([peerName, peerRange]) + } + } + } + } + + // resolve all dependencies in parallel + const resolvedDeps = await Promise.all( + depsToResolve.map(async ([depName, depRange]) => { + // when a JSR package depends on @jsr/*, reverse to canonical name and fetch from JSR + // otherwise use npm (even for @jsr/* from npm packages - that's what the author intended) + let resolvedName = depName + let depRegistry: Registry = 'npm' + if (registry === 'jsr' && depName.startsWith('@jsr/')) { + resolvedName = reverseJsrName(depName) + depRegistry = 'jsr' + } + const dep = await resolvePackage(resolvedName, depRange, depRegistry, ctx) + return [depName, dep] as const + }), + ) + + for (const [depName, dep] of resolvedDeps) { + resolved.dependencies.set(depName, dep) + } + + ctx.resolving.delete(key) + return resolved +} + +/** + * resolves one or more packages and all their dependencies. + * this is the main entry point for dependency resolution. + * + * @param specifiers package specifiers to resolve (e.g., ["react@^18.0.0", "jsr:@luca/flag"]) + * @param options resolution options + * @returns the full resolution result with all packages + */ +export async function resolve( + specifiers: string[], + options: ResolveOptions = {}, +): Promise { + const ctx: ResolutionContext = { + resolved: new Map(), + resolving: new Set(), + options: { + installPeers: options.installPeers ?? true, + }, + } + + const parsedSpecs = specifiers.map(parseSpecifier) + + const roots = await Promise.all( + parsedSpecs.map(({ name, range, registry }) => resolvePackage(name, range, registry, ctx)), + ) + + return { + roots, + packages: ctx.resolved, + } +} diff --git a/app/bundler/lib/subpaths.ts b/app/bundler/lib/subpaths.ts new file mode 100644 index 000000000..ad206083b --- /dev/null +++ b/app/bundler/lib/subpaths.ts @@ -0,0 +1,291 @@ +import type { Volume } from 'memfs' + +import type { DiscoveredSubpaths, Subpath } from '../types' + +import type { PackageExports, PackageJson } from './types' + +// #region condition resolution + +/** + * condition priority for ESM browser bundling. + * higher index = higher priority. + */ +const CONDITION_PRIORITY = ['default', 'module', 'import', 'browser'] as const + +/** + * resolves a conditional export to a file path. + * handles nested conditions and returns the best match for ESM browser. + */ +function resolveCondition(value: PackageExports): string | null { + if (value === null) { + return null + } + + if (typeof value === 'string') { + return value + } + + if (Array.isArray(value)) { + // array means "try in order", take first + for (const item of value) { + const resolved = resolveCondition(item) + if (resolved) { + return resolved + } + } + return null + } + + if (typeof value === 'object') { + // check if this is a conditions object or a subpath object + const keys = Object.keys(value) + + // if any key starts with '.', this is a subpath object, not conditions + if (keys.some(k => k.startsWith('.'))) { + return null + } + + // this is a conditions object, find best match + let bestMatch: string | null = null + let bestPriority = -1 + + for (const [condition, target] of Object.entries(value)) { + const priority = CONDITION_PRIORITY.indexOf(condition as (typeof CONDITION_PRIORITY)[number]) + + if (priority > bestPriority) { + const resolved = resolveCondition(target as PackageExports) + if (resolved) { + bestMatch = resolved + bestPriority = priority + } + } + } + + return bestMatch + } + + return null +} + +// #endregion + +// #region wildcard expansion + +/** + * recursively lists all files in a directory. + */ +function listFilesRecursive(volume: Volume, dir: string): string[] { + const files: string[] = [] + + try { + const entries = volume.readdirSync(dir, { withFileTypes: true }) as { + name: string + isDirectory(): boolean + isFile(): boolean + }[] + for (const entry of entries) { + const fullPath = `${dir}/${entry.name}` + if (entry.isDirectory()) { + files.push(...listFilesRecursive(volume, fullPath)) + } else if (entry.isFile()) { + files.push(fullPath) + } + } + } catch { + // directory doesn't exist or can't be read + } + + return files +} + +/** + * expands a wildcard pattern against the volume files. + * + * @param subpath the subpath pattern with wildcard (e.g., "./*") + * @param target the target pattern (e.g., "./*.js") + * @param packagePath the package path in volume (e.g., "/node_modules/pkg") + * @param volume the volume to search in + * @returns expanded subpath entries + */ +function expandWildcard( + subpath: string, + target: string, + packagePath: string, + volume: Volume, +): Subpath[] { + const entries: Subpath[] = [] + + // extract the parts before and after the wildcard + const targetParts = target.split('*') + if (targetParts.length !== 2) { + // invalid pattern, skip + return entries + } + + const prefix = targetParts[0]! + const suffix = targetParts[1]! + const subpathParts = subpath.split('*') + if (subpathParts.length !== 2) { + return entries + } + + const subpathPrefix = subpathParts[0]! + const subpathSuffix = subpathParts[1]! + + // normalize the prefix to match volume paths + // target like "./src/*.js" becomes "/node_modules/pkg/src" + const searchDir = `${packagePath}/${prefix.replace(/^\.\//, '').replace(/\/$/, '')}` + + // list all files in the search directory + const allFiles = listFilesRecursive(volume, searchDir) + + for (const filePath of allFiles) { + // check if file matches the pattern + const relativePath = filePath.slice(searchDir.length + 1) + + if (suffix && !filePath.endsWith(suffix)) { + continue + } + + // extract the wildcard match + const match = suffix ? relativePath.slice(0, relativePath.length - suffix.length) : relativePath + + // construct the subpath + const expandedSubpath = `${subpathPrefix}${match}${subpathSuffix}` + + // construct the relative target + const expandedTarget = `./${prefix.replace(/^\.\//, '')}${match}${suffix}` + + entries.push({ + subpath: expandedSubpath, + target: expandedTarget, + isWildcard: true, + }) + } + + return entries +} + +// #endregion + +// #region main discovery + +/** + * discovers all available subpaths from a package's exports field. + * + * @param packageJson the package.json content + * @param volume the volume containing package files + * @returns discovered subpaths with default selection + */ +export function discoverSubpaths(packageJson: PackageJson, volume: Volume): DiscoveredSubpaths { + const entries: Subpath[] = [] + const packagePath = `/node_modules/${packageJson.name}` + + // check for exports field first (takes precedence) + if (packageJson.exports !== undefined) { + const exportsField = packageJson.exports + + if (typeof exportsField === 'string') { + // simple string export: "exports": "./index.js" + entries.push({ + subpath: '.', + target: exportsField, + isWildcard: false, + }) + } else if (Array.isArray(exportsField)) { + // array export: "exports": ["./index.js", "./index.cjs"] + const resolved = resolveCondition(exportsField) + if (resolved) { + entries.push({ + subpath: '.', + target: resolved, + isWildcard: false, + }) + } + } else if (typeof exportsField === 'object' && exportsField !== null) { + // object export - could be conditions or subpaths + const keys = Object.keys(exportsField) + const hasSubpaths = keys.some(k => k.startsWith('.')) + + if (hasSubpaths) { + // subpath exports + for (const [subpath, value] of Object.entries(exportsField)) { + if (!subpath.startsWith('.')) { + continue + } + + if (subpath.includes('*')) { + // wildcard pattern + const target = resolveCondition(value as PackageExports) + if (target && target.includes('*')) { + const expanded = expandWildcard(subpath, target, packagePath, volume) + entries.push(...expanded) + } + } else { + // regular subpath + const target = resolveCondition(value as PackageExports) + if (target) { + entries.push({ + subpath, + target, + isWildcard: false, + }) + } + } + } + } else { + // top-level conditions (no subpaths means this is conditions for ".") + const target = resolveCondition(exportsField) + if (target) { + entries.push({ + subpath: '.', + target, + isWildcard: false, + }) + } + } + } + } else { + // fallback to legacy fields + // priority: module > main > index.js + let legacyMain = packageJson.module || packageJson.main + + if (!legacyMain) { + // check if index.js exists + try { + volume.statSync(`${packagePath}/index.js`) + legacyMain = './index.js' + } catch { + // no index.js + } + } + + if (legacyMain) { + entries.push({ + subpath: '.', + target: legacyMain.startsWith('.') ? legacyMain : `./${legacyMain}`, + isWildcard: false, + }) + } + } + + // determine default subpath + let defaultSubpath: string | null = null + + // prefer "." if it exists + const mainEntry = entries.find(e => e.subpath === '.') + if (mainEntry) { + defaultSubpath = '.' + } else if (entries.length > 0) { + // otherwise, pick first alphabetically + entries.sort((a, b) => a.subpath.localeCompare(b.subpath)) + defaultSubpath = entries[0]?.subpath ?? null + } + + return { + subpaths: entries, + defaultSubpath, + } +} + +// #endregion diff --git a/app/bundler/lib/types.ts b/app/bundler/lib/types.ts new file mode 100644 index 000000000..cb4e50e75 --- /dev/null +++ b/app/bundler/lib/types.ts @@ -0,0 +1,202 @@ +import * as v from 'valibot' + +// #region package.json schema + +/** + * package exports field - can be a string, array, object, or nested conditions. + * @see https://nodejs.org/api/packages.html#exports + */ +const packageExportsSchema: v.GenericSchema = v.union([ + v.null(), + v.string(), + v.array(v.string()), + v.record( + v.string(), + v.lazy(() => packageExportsSchema), + ), +]) + +export type PackageExports = string | string[] | { [key: string]: PackageExports } | null + +/** + * base package.json schema with all standard fields. + * other schemas pick from this to ensure consistency. + * @see https://docs.npmjs.com/cli/v10/configuring-npm/package-json + */ +export const packageJsonSchema = v.object({ + name: v.string(), + version: v.string(), + description: v.optional(v.string()), + keywords: v.optional(v.array(v.string())), + homepage: v.optional(v.string()), + license: v.optional(v.string()), + main: v.optional(v.string()), + module: v.optional(v.string()), + browser: v.optional( + v.union([v.string(), v.record(v.string(), v.union([v.string(), v.literal(false)]))]), + ), + types: v.optional(v.string()), + typings: v.optional(v.string()), + exports: v.optional(packageExportsSchema), + type: v.optional(v.picklist(['module', 'commonjs'])), + bin: v.optional(v.union([v.string(), v.record(v.string(), v.string())])), + directories: v.optional(v.record(v.string(), v.string())), + dependencies: v.optional(v.record(v.string(), v.string())), + devDependencies: v.optional(v.record(v.string(), v.string())), + peerDependencies: v.optional(v.record(v.string(), v.string())), + peerDependenciesMeta: v.optional( + v.record(v.string(), v.object({ optional: v.optional(v.boolean()) })), + ), + bundleDependencies: v.optional(v.union([v.boolean(), v.array(v.string())])), + optionalDependencies: v.optional(v.record(v.string(), v.string())), + engines: v.optional(v.record(v.string(), v.string())), + os: v.optional(v.array(v.string())), + cpu: v.optional(v.array(v.string())), + deprecated: v.optional(v.union([v.string(), v.boolean()])), + sideEffects: v.optional(v.union([v.boolean(), v.array(v.string())])), +}) + +export type PackageJson = v.InferOutput + +// #endregion + +// #region abbreviated packument schemas + +/** + * distribution metadata for a package version. + */ +const distSchema = v.object({ + tarball: v.string(), + shasum: v.string(), + integrity: v.optional(v.string()), + fileCount: v.optional(v.number()), + unpackedSize: v.optional(v.number()), + signatures: v.optional( + v.array( + v.object({ + keyid: v.string(), + sig: v.string(), + }), + ), + ), +}) + +/** + * abbreviated manifest for a specific version. + * picks installation-relevant fields from package.json and adds registry metadata. + * @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md#abbreviated-metadata-format + */ +export const abbreviatedManifestSchema = v.object({ + // pick installation-relevant fields from package.json + ...v.pick(packageJsonSchema, [ + 'name', + 'version', + 'deprecated', + 'dependencies', + 'devDependencies', + 'optionalDependencies', + 'bundleDependencies', + 'peerDependencies', + 'peerDependenciesMeta', + 'bin', + 'directories', + 'engines', + 'cpu', + 'os', + ]).entries, + // registry-specific fields + dist: distSchema, + hasInstallScript: v.optional(v.boolean()), + _hasShrinkwrap: v.optional(v.boolean()), +}) + +export type AbbreviatedManifest = v.InferOutput + +/** + * abbreviated packument - minimal metadata for package resolution. + * returned when requesting with Accept: application/vnd.npm.install-v1+json + * @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md#abbreviated-metadata-format + */ +export const abbreviatedPackumentSchema = v.object({ + 'name': v.string(), + // optional because some registries (e.g., JSR's npm mirror) may not include it + 'modified': v.optional(v.string()), + 'dist-tags': v.pipe( + v.record(v.string(), v.string()), + v.check(tags => 'latest' in tags, 'dist-tags must include "latest"'), + ), + 'versions': v.record(v.string(), abbreviatedManifestSchema), +}) + +export type AbbreviatedPackument = v.InferOutput + +// #endregion + +/** + * a resolved package with its dependencies. + * this is the output of the resolution step before hoisting. + */ +export interface ResolvedPackage { + name: string + version: string + /** the tarball URL for fetching */ + tarball: string + /** SRI integrity hash if available */ + integrity?: string + /** unpacked size in bytes (from registry) */ + unpackedSize?: number + /** resolved dependencies (name -> ResolvedPackage) */ + dependencies: Map +} + +/** + * supported package registries. + */ +export type Registry = 'npm' | 'jsr' + +/** + * the input to the resolver - a package specifier. + * can be just a name (uses latest) or name@version/range. + */ +export interface PackageSpecifier { + name: string + /** version, range, or dist-tag. defaults to 'latest' */ + range: string + /** which registry to fetch from. defaults to 'npm' */ + registry: Registry +} + +/** + * the full resolution result - a tree of resolved packages. + */ +export interface ResolutionResult { + /** the root package(s) that were requested */ + roots: ResolvedPackage[] + /** all unique packages in the resolution (for deduping) */ + packages: Map +} + +/** + * a node in the hoisted node_modules structure. + * represents what should be written to node_modules/{name} + */ +export interface HoistedNode { + name: string + version: string + tarball: string + integrity?: string + /** unpacked size in bytes (from registry) */ + unpackedSize?: number + /** number of direct dependencies */ + dependencyCount: number + /** nested node_modules for this package (when hoisting fails) */ + nested: Map +} + +/** + * the result of hoisting - a flat(ish) node_modules structure. + */ +export interface HoistedResult { + /** top-level node_modules entries */ + root: Map +} diff --git a/app/bundler/lib/worker-entry.ts b/app/bundler/lib/worker-entry.ts new file mode 100644 index 000000000..22e5dea09 --- /dev/null +++ b/app/bundler/lib/worker-entry.ts @@ -0,0 +1,196 @@ +/* eslint-disable unicorn/require-post-message-target-origin -- Worker.postMessage doesn't take targetOrigin */ +import { memfs } from '@rolldown/browser/experimental' +import * as v from 'valibot' + +import { stripAnsi } from '../strings' +import { progress } from '../events' +import { + workerRequestSchema, + type BundleOptions, + type InitOptions, + type InitResult, + type WorkerResponse, +} from '../types' + +import { bundlePackage } from './bundler' +import { fetchPackagesToVolume } from './fetch' +import { hoist } from './hoist' +import { buildInstalledPackages } from './installed-packages' +import { resolve } from './resolve' +import { discoverSubpaths } from './subpaths' +import type { PackageJson } from './types' + +const { volume } = memfs! + +// forward progress events to main thread +progress.on(msg => { + self.postMessage(msg satisfies WorkerResponse) +}) + +// #region state + +let packageName: string | null = null +let initResult: InitResult | null = null + +let bundleInProgress = false +let pendingBundleRequest: { + id: number + subpath: string + selectedExports: string[] | null + options: BundleOptions +} | null = null + +// #endregion + +// #region handlers + +async function handleInit( + id: number, + packageSpec: string, + options: InitOptions = {}, +): Promise { + // if already initialized, return cached result + if (initResult !== null) { + self.postMessage({ id, type: 'init', result: initResult } satisfies WorkerResponse) + return + } + + try { + volume.reset() + + const resolution = await resolve([packageSpec], options.resolve) + const hoisted = hoist(resolution.roots) + + await fetchPackagesToVolume(hoisted, volume, options.fetch) + + const mainPackage = resolution.roots[0] + if (!mainPackage) { + throw new Error(`Failed to resolve package: ${packageSpec}`) + } + + const pkgJsonPath = `/node_modules/${mainPackage.name}/package.json` + const pkgJsonContent = volume.readFileSync(pkgJsonPath, 'utf8') as string + const manifest = JSON.parse(pkgJsonContent) as PackageJson + + packageName = mainPackage.name + + const subpaths = discoverSubpaths(manifest, volume) + + // get peer dependency names from manifest + const peerDependencies = Object.keys(manifest.peerDependencies ?? {}) + const peerDepNames = new Set(peerDependencies) + + const packages = buildInstalledPackages(mainPackage, peerDepNames) + const installSize = packages.reduce((sum, pkg) => sum + pkg.size, 0) + + initResult = { + name: mainPackage.name, + version: mainPackage.version, + subpaths, + installSize, + packages, + peerDependencies, + } + + self.postMessage({ id, type: 'init', result: initResult } satisfies WorkerResponse) + } catch (error) { + self.postMessage({ + id, + type: 'error', + error: stripAnsi(String(error)), + } satisfies WorkerResponse) + } +} + +async function handleBundle( + id: number, + subpath: string, + selectedExports: string[] | null, + options: BundleOptions = {}, +): Promise { + if (!packageName) { + self.postMessage({ + id, + type: 'error', + error: 'not initialized - call init() first', + } satisfies WorkerResponse) + return + } + + // if a bundle is in progress, queue this one (replacing any previous pending) + if (bundleInProgress) { + // reject the previous pending request if any + if (pendingBundleRequest) { + self.postMessage({ + id: pendingBundleRequest.id, + type: 'error', + error: 'Superseded by newer request', + } satisfies WorkerResponse) + } + pendingBundleRequest = { id, subpath, selectedExports, options } + return + } + + await processBundleRequest(id, subpath, selectedExports, options) +} + +async function processBundleRequest( + id: number, + subpath: string, + selectedExports: string[] | null, + options: BundleOptions, +): Promise { + bundleInProgress = true + + try { + const result = await bundlePackage(packageName!, subpath, selectedExports, options) + self.postMessage({ id, type: 'bundle', result } satisfies WorkerResponse) + } catch (error) { + self.postMessage({ + id, + type: 'error', + error: stripAnsi(String(error)), + } satisfies WorkerResponse) + } finally { + bundleInProgress = false + + // process pending request if any + if (pendingBundleRequest) { + const pending = pendingBundleRequest + pendingBundleRequest = null + await processBundleRequest( + pending.id, + pending.subpath, + pending.selectedExports, + pending.options, + ) + } + } +} + +// #endregion + +// #region message handler + +self.addEventListener('message', (event: MessageEvent) => { + const parsed = v.safeParse(workerRequestSchema, event.data) + if (!parsed.success) { + return + } + + const request = parsed.output + + switch (request.type) { + case 'init': + handleInit(request.id, request.packageSpec, request.options) + break + case 'bundle': + handleBundle(request.id, request.subpath, request.selectedExports, request.options) + break + } +}) + +// signal to main thread that we're ready +self.postMessage({ type: 'ready' }) + +// #endregion diff --git a/app/bundler/strings.ts b/app/bundler/strings.ts new file mode 100644 index 000000000..260381376 --- /dev/null +++ b/app/bundler/strings.ts @@ -0,0 +1,13 @@ +// matches ANSI escape sequences (colors, cursor movement, etc.) +// oxlint-disable-next-line no-control-regex +const ANSI_REGEX = /\x1b\[[0-9;]*[a-z]/gi + +/** + * strips ANSI escape codes from a string. + * + * @param input string potentially containing ANSI codes + * @returns string with ANSI codes removed + */ +export function stripAnsi(input: string): string { + return input.replace(ANSI_REGEX, '') +} diff --git a/app/bundler/types.ts b/app/bundler/types.ts new file mode 100644 index 000000000..06c3df1d2 --- /dev/null +++ b/app/bundler/types.ts @@ -0,0 +1,188 @@ +import * as v from 'valibot' + +// #region option schemas + +const resolveOptionsSchema = v.object({ + installPeers: v.optional(v.boolean()), +}) + +const fetchOptionsSchema = v.object({ + concurrency: v.optional(v.number()), + exclude: v.optional(v.array(v.instance(RegExp))), +}) + +const initOptionsSchema = v.object({ + resolve: v.optional(resolveOptionsSchema), + fetch: v.optional(fetchOptionsSchema), +}) + +export type InitOptions = v.InferOutput + +const bundleOptionsSchema = v.object({ + rolldown: v.optional( + v.object({ + external: v.optional(v.array(v.string())), + minify: v.optional(v.boolean()), + }), + ), +}) + +export type BundleOptions = v.InferOutput + +// #endregion + +// #region result schemas + +const subpathSchema = v.object({ + subpath: v.string(), + target: v.string(), + isWildcard: v.boolean(), +}) + +export type Subpath = v.InferOutput + +const discoveredSubpathsSchema = v.object({ + subpaths: v.array(subpathSchema), + defaultSubpath: v.nullable(v.string()), +}) + +export type DiscoveredSubpaths = v.InferOutput + +const packageRefSchema = v.object({ + name: v.string(), + version: v.string(), + isPeer: v.boolean(), +}) + +export type PackageRef = v.InferOutput + +const installedPackageSchema = v.object({ + name: v.string(), + version: v.string(), + size: v.number(), + path: v.string(), + level: v.number(), + dependents: v.array(packageRefSchema), + dependencies: v.array(packageRefSchema), + isPeer: v.boolean(), +}) + +export type InstalledPackage = v.InferOutput + +const initResultSchema = v.object({ + name: v.string(), + version: v.string(), + subpaths: discoveredSubpathsSchema, + installSize: v.number(), + packages: v.array(installedPackageSchema), + peerDependencies: v.array(v.string()), +}) + +export type InitResult = v.InferOutput + +const bundleChunkSchema = v.object({ + fileName: v.string(), + code: v.string(), + size: v.number(), + gzipSize: v.number(), + brotliSize: v.optional(v.number()), + zstdSize: v.optional(v.number()), + isEntry: v.boolean(), + exports: v.array(v.string()), +}) + +export type BundleChunk = v.InferOutput + +const bundleResultSchema = v.object({ + chunks: v.array(bundleChunkSchema), + size: v.number(), + gzipSize: v.number(), + brotliSize: v.optional(v.number()), + zstdSize: v.optional(v.number()), + exports: v.array(v.string()), + isCjs: v.boolean(), +}) + +export type BundleResult = v.InferOutput + +// #endregion + +// #region request schemas (worker parses these) + +const initRequestSchema = v.object({ + id: v.number(), + type: v.literal('init'), + packageSpec: v.string(), + options: v.optional(initOptionsSchema), +}) + +const bundleRequestSchema = v.object({ + id: v.number(), + type: v.literal('bundle'), + subpath: v.string(), + selectedExports: v.nullable(v.array(v.string())), + options: v.optional(bundleOptionsSchema), +}) + +export const workerRequestSchema = v.variant('type', [initRequestSchema, bundleRequestSchema]) + +export type WorkerRequest = v.InferOutput + +// #endregion + +// #region response schemas (main thread parses these) + +const initResponseSchema = v.object({ + id: v.number(), + type: v.literal('init'), + result: initResultSchema, +}) + +const bundleResponseSchema = v.object({ + id: v.number(), + type: v.literal('bundle'), + result: bundleResultSchema, +}) + +const errorResponseSchema = v.object({ + id: v.number(), + type: v.literal('error'), + error: v.string(), +}) + +const progressResponseSchema = v.variant('kind', [ + v.object({ + type: v.literal('progress'), + kind: v.literal('resolve'), + name: v.string(), + version: v.string(), + }), + v.object({ + type: v.literal('progress'), + kind: v.literal('fetch'), + current: v.number(), + total: v.number(), + name: v.string(), + }), + v.object({ + type: v.literal('progress'), + kind: v.literal('bundle'), + }), + v.object({ + type: v.literal('progress'), + kind: v.literal('compress'), + }), +]) + +export type ProgressMessage = v.InferOutput + +export const workerResponseSchema = v.variant('type', [ + initResponseSchema, + bundleResponseSchema, + errorResponseSchema, + progressResponseSchema, +]) + +export type WorkerResponse = v.InferOutput + +// #endregion diff --git a/app/bundler/worker-client.ts b/app/bundler/worker-client.ts new file mode 100644 index 000000000..502fd3517 --- /dev/null +++ b/app/bundler/worker-client.ts @@ -0,0 +1,145 @@ +/* eslint-disable unicorn/require-post-message-target-origin -- Worker.postMessage doesn't take targetOrigin */ +import * as v from 'valibot' + +import { progress } from './events' +import { + workerResponseSchema, + type BundleOptions, + type BundleResult, + type InitOptions, + type InitResult, + type WorkerRequest, +} from './types' + +export type { InitResult } + +/** + * client for communicating with a bundler worker. + * each instance spawns a new worker, intended for one package. + */ +export class BundlerWorker { + private worker: Worker + private nextId = 0 + private latestBundleId: number | null = null + private pending = new Map>() + private ready: Promise + private resolveReady!: () => void + private rejectReady!: (error: Error) => void + + constructor() { + this.ready = new Promise((resolve, reject) => { + this.resolveReady = resolve + this.rejectReady = reject + }) + + this.worker = new Worker(new URL('./lib/worker-entry.ts', import.meta.url), { type: 'module' }) + this.worker.addEventListener('message', this.handleMessage.bind(this)) + this.worker.addEventListener('error', this.handleError.bind(this)) + } + + private handleMessage(event: MessageEvent): void { + // check for ready signal + if ( + event.data && + typeof event.data === 'object' && + 'type' in event.data && + event.data.type === 'ready' + ) { + this.resolveReady() + return + } + + const parsed = v.safeParse(workerResponseSchema, event.data) + if (!parsed.success) { + return + } + + const response = parsed.output + + // forward progress messages to global emitter + if (response.type === 'progress') { + progress.trigger(response) + return + } + + const deferred = this.pending.get(response.id) + if (!deferred) { + // response for a request we no longer care about (e.g., superseded bundle) + return + } + + this.pending.delete(response.id) + + if (response.type === 'error') { + deferred.reject(new Error(response.error)) + } else { + deferred.resolve(response.result) + } + } + + private handleError(_event: ErrorEvent): void { + this.rejectReady(new Error('Worker error')) + // reject all pending requests + for (const deferred of this.pending.values()) { + deferred.reject(new Error('Worker error')) + } + this.pending.clear() + } + + private async send(message: WorkerRequest): Promise { + // wait for worker to be ready before sending + await this.ready + + const deferred = Promise.withResolvers() + this.pending.set(message.id, deferred as PromiseWithResolvers) + this.worker.postMessage(message) + return deferred.promise + } + + /** + * initializes the worker with a package. + * only the first call does work; subsequent calls return cached result. + */ + init(packageSpec: string, options?: InitOptions): Promise { + return this.send({ id: this.nextId++, type: 'init', packageSpec, options }) + } + + /** + * bundles a subpath from the initialized package. + * uses "latest wins" - if called while a bundle is in progress, + * the previous pending request is superseded. + */ + bundle( + subpath: string, + selectedExports: string[] | null, + options?: BundleOptions, + ): Promise { + if (this.latestBundleId !== null) { + const previous = this.pending.get(this.latestBundleId) + if (previous) { + previous.reject(new DOMException('Superseded', 'AbortError')) + this.pending.delete(this.latestBundleId) + } + } + const id = this.nextId++ + this.latestBundleId = id + return this.send({ + id, + type: 'bundle', + subpath, + selectedExports, + options, + }) + } + + /** + * terminates the worker. + */ + terminate(): void { + this.worker.terminate() + for (const deferred of this.pending.values()) { + deferred.reject(new DOMException('Worker terminated', 'AbortError')) + } + this.pending.clear() + } +} diff --git a/app/components/ImpactAnalyzer.vue b/app/components/ImpactAnalyzer.vue new file mode 100644 index 000000000..e9d872648 --- /dev/null +++ b/app/components/ImpactAnalyzer.vue @@ -0,0 +1,319 @@ + + + diff --git a/app/components/ImpactDependencyBar.vue b/app/components/ImpactDependencyBar.vue new file mode 100644 index 000000000..7b5838d6d --- /dev/null +++ b/app/components/ImpactDependencyBar.vue @@ -0,0 +1,161 @@ + + + diff --git a/app/composables/useBundleAnalyzer.ts b/app/composables/useBundleAnalyzer.ts new file mode 100644 index 000000000..d8195c671 --- /dev/null +++ b/app/composables/useBundleAnalyzer.ts @@ -0,0 +1,125 @@ +import type { BundleResult, InitResult, ProgressMessage } from '~/bundler/types' +import { BundlerWorker } from '~/bundler/worker-client' +import { progress } from '~/bundler/events' + +export interface BundleAnalyzerState { + /** Initialization result (package info, subpaths, dependencies) */ + initResult: InitResult | null + /** Current bundle result */ + bundleResult: BundleResult | null + /** Loading/progress state */ + status: 'idle' | 'initializing' | 'bundling' | 'ready' | 'error' + /** Progress details during init/bundle */ + progress: ProgressMessage | null + /** Error if any */ + error: Error | null +} + +/** + * Composable for managing bundle size analysis using a Web Worker. + * Client-side only - worker can't run on server. + */ +export function useBundleAnalyzer() { + const state = reactive({ + initResult: null, + bundleResult: null, + status: 'idle', + progress: null, + error: null, + }) + + let worker: BundlerWorker | null = null + let cleanupProgress: { off: () => void } | null = null + + /** + * Initialize the analyzer with a package specifier. + * Resolves dependencies, fetches tarballs, and prepares for bundling. + */ + async function initPackage(packageSpec: string): Promise { + // Cleanup previous session + if (worker) { + worker.terminate() + worker = null + } + + state.status = 'initializing' + state.error = null + state.bundleResult = null + state.progress = null + state.initResult = null + + // Listen to progress events + cleanupProgress?.off() + cleanupProgress = progress.on(msg => { + state.progress = msg + }) + + try { + worker = new BundlerWorker() + const result = await worker.init(packageSpec) + state.initResult = result + state.status = 'ready' + return result + } catch (e) { + state.error = e instanceof Error ? e : new Error(String(e)) + state.status = 'error' + throw e + } + } + + /** + * Bundle a subpath with optional export selection. + * Must call initPackage first. + */ + async function bundle( + subpath: string, + selectedExports: string[] | null = null, + ): Promise { + if (!worker) { + throw new Error('No session initialized - call initPackage first') + } + + state.status = 'bundling' + state.error = null + + try { + const result = await worker.bundle(subpath, selectedExports) + state.bundleResult = result + state.status = 'ready' + return result + } catch (e) { + state.error = e instanceof Error ? e : new Error(String(e)) + state.status = 'error' + throw e + } + } + + /** + * Cleanup the worker and reset state. + */ + function cleanup() { + if (worker) { + worker.terminate() + worker = null + } + cleanupProgress?.off() + cleanupProgress = null + state.initResult = null + state.bundleResult = null + state.status = 'idle' + state.progress = null + state.error = null + } + + // Auto-cleanup on unmount + if (import.meta.client) { + onUnmounted(cleanup) + } + + return { + state: readonly(state), + initPackage, + bundle, + cleanup, + } +} diff --git a/app/middleware/cross-origin-isolation.global.ts b/app/middleware/cross-origin-isolation.global.ts new file mode 100644 index 000000000..c209a2699 --- /dev/null +++ b/app/middleware/cross-origin-isolation.global.ts @@ -0,0 +1,19 @@ +/** + * Forces a full-page load when navigating to or from /impact/ routes. + * + * The /impact/ routes require Cross-Origin-Opener-Policy and + * Cross-Origin-Embedder-Policy headers for SharedArrayBuffer support. + * These headers are only set on /impact/** responses (via routeRules), + * so client-side navigations across this boundary would either miss + * the headers (navigating in) or retain a stale context (navigating out). + */ +export default defineNuxtRouteMiddleware((to, from) => { + if (import.meta.server) return + + const toImpact = to.path.startsWith('/impact') + const fromImpact = from.path.startsWith('/impact') + + if (toImpact !== fromImpact) { + return navigateTo(to.fullPath, { external: true }) + } +}) diff --git a/app/pages/impact/[...path].vue b/app/pages/impact/[...path].vue new file mode 100644 index 000000000..6007bf2f7 --- /dev/null +++ b/app/pages/impact/[...path].vue @@ -0,0 +1,159 @@ + + + + + diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index c72b12030..b5ab057aa 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -326,6 +326,18 @@ const docsLink = computed(() => { } }) +// Impact URL: bundle size analysis +const impactLink = computed(() => { + if (!resolvedVersion.value) return null + + return { + name: 'impact' as const, + params: { + path: [pkg.value!.name, 'v', resolvedVersion.value] satisfies [string, string, string], + }, + } +}) + const fundingUrl = computed(() => { let funding = displayVersion.value?.funding if (Array.isArray(funding)) funding = funding[0] @@ -503,6 +515,16 @@ onKeyStroke( { dedupe: true }, ) +onKeyStroke( + e => isKeyWithoutModifiers(e, 'i') && !isEditableElement(e.target), + e => { + if (!impactLink.value) return + e.preventDefault() + navigateTo(impactLink.value) + }, + { dedupe: true }, +) + onKeyStroke( e => isKeyWithoutModifiers(e, 'c') && !isEditableElement(e.target), e => { @@ -666,7 +688,7 @@ onKeyStroke( - + {{ $t('package.links.code') }} + + {{ $t('package.links.impact') }} + - +
  • {{ $t('package.links.docs') }} @@ -784,6 +815,11 @@ onKeyStroke( {{ $t('package.links.code') }}
  • +
  • + + {{ $t('package.links.impact') }} + +
  • = 16'} + '@atcute/uint8array@1.1.0': + resolution: {integrity: sha512-JtHXIVW6LPU9FMWp7SgE4HbUs3uV2WdfkK/2RWdEGjr4EgMV50P3FdU6fPeGlTfDNBJVYMIsuD2wwaKRPV/Aqg==} + '@atproto-labs/did-resolver@0.2.6': resolution: {integrity: sha512-2K1bC04nI2fmgNcvof+yA28IhGlpWn2JKYlPa7To9JTKI45FINCGkQSGiL2nyXlyzDJJ34fZ1aq6/IRFIOIiqg==} @@ -389,8 +410,11 @@ packages: '@atproto/api@0.18.20': resolution: {integrity: sha512-BZYZkh2VJIFCXEnc/vzKwAwWjAQQTgbNJ8FBxpBK+z+KYh99O0uPCsRYKoCQsRrnkgrhzdU9+g2G+7zanTIGbw==} - '@atproto/common-web@0.4.15': - resolution: {integrity: sha512-A4l9gyqUNez8CjZp/Trypz/D3WIQsNj8dN05WR6+RoBbvwc9JhWjKPrm+WoVYc/F16RPdXHLkE3BEJlGIyYIiA==} + '@atproto/common-web@0.4.14': + resolution: {integrity: sha512-rMU8Q+kpyPpirUS9OqT7aOD1hxKa+diem3vc7BA0lOkj0tU6wcAxegxmbPZ8JaOsR7SSYhP/jCt/5wbT4qqkuQ==} + + '@atproto/common-web@0.4.16': + resolution: {integrity: sha512-Ufvaff5JgxUyUyTAG0/3o7ltpy3lnZ1DvLjyAnvAf+hHfiK7OMQg+8byr+orN+KP9MtIQaRTsCgYPX+PxMKUoA==} '@atproto/common@0.5.10': resolution: {integrity: sha512-A1+4W3JmjZIgmtJFLJBAaoVruZhRL0ANtyjZ91aJR4rjHcZuaQ+v4IFR1UcE6yyTATacLdBk6ADy8OtxXzq14g==} @@ -427,6 +451,9 @@ packages: '@atproto/lex-data@0.0.10': resolution: {integrity: sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==} + '@atproto/lex-data@0.0.11': + resolution: {integrity: sha512-4+KTtHdqwlhiTKA7D4SACea4jprsNpCQsNALW09wsZ6IHhCDGO5tr1cmV+QnLYe3G3mu1E1yXHXbPUHrUUDT/A==} + '@atproto/lex-data@0.0.9': resolution: {integrity: sha512-1slwe4sG0cyWtsq16+rBoWIxNDqGPkkvN+PV6JuzA7dgUK9bjUmXBGQU4eZlUPSS43X1Nhmr/9VjgKmEzU9vDw==} @@ -436,8 +463,8 @@ packages: '@atproto/lex-installer@0.0.13': resolution: {integrity: sha512-Uu9JsZBBTVel8qz+wgf/M46uimPMn4Ub3hToscngELa+C9+6amHAtcArVdJgv4UsDu13TneOj3I6bdkU0luLTw==} - '@atproto/lex-json@0.0.10': - resolution: {integrity: sha512-L6MyXU17C5ODMeob8myQ2F3xvgCTvJUtM0ew8qSApnN//iDasB/FDGgd7ty4UVNmx4NQ/rtvz8xV94YpG6kneQ==} + '@atproto/lex-json@0.0.11': + resolution: {integrity: sha512-2IExAoQ4KsR5fyPa1JjIvtR316PvdgRH/l3BVGLBd3cSxM3m5MftIv1B6qZ9HjNiK60SgkWp0mi9574bTNDhBQ==} '@atproto/lex-json@0.0.9': resolution: {integrity: sha512-Q2v1EVZcnd+ndyZj1r2UlGikA7q6It24CFPLbxokcf5Ba4RBupH8IkkQX7mqUDSRWPgQdmZYIdW9wUln+MKDqw==} @@ -475,6 +502,10 @@ packages: '@atproto/xrpc@0.7.7': resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==} + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -483,10 +514,18 @@ packages: resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} @@ -595,6 +634,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} @@ -677,8 +721,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.6': - resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -743,8 +787,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': - resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -821,8 +865,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -833,8 +877,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -905,8 +949,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.6': - resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -983,8 +1027,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.6': - resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} + '@babel/preset-env@7.29.0': + resolution: {integrity: sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1006,10 +1050,18 @@ packages: resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -1022,6 +1074,9 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@bokuweb/zstd-wasm@0.0.27': + resolution: {integrity: sha512-GDm2uOTK3ESjnYmSeLQifJnBsRCWajKLvN32D2ZcQaaCIJI/Hse9s74f7APXjHit95S10UImsRGkTsbwHmrtmg==} + '@bomb.sh/tab@0.0.12': resolution: {integrity: sha512-dYRwg4MqfHR5/BcTy285XOGRhjQFmNpaJBZ0tl2oU+RY595MQ5ApTF6j3OvauPAooHL6cfoOZMySQrOQztT8RQ==} hasBin: true @@ -1090,6 +1145,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} @@ -1102,6 +1163,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.27.3': resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} @@ -1114,6 +1181,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.27.3': resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} @@ -1126,6 +1199,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.27.3': resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} @@ -1138,6 +1217,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.27.3': resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} @@ -1150,6 +1235,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.27.3': resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} @@ -1162,6 +1253,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} @@ -1174,6 +1271,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} @@ -1186,6 +1289,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.27.3': resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} @@ -1198,6 +1307,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.27.3': resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} @@ -1210,6 +1325,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.27.3': resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} @@ -1222,6 +1343,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.27.3': resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} @@ -1234,6 +1361,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.27.3': resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} @@ -1246,6 +1379,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.27.3': resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} @@ -1258,6 +1397,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.27.3': resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} @@ -1270,6 +1415,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.27.3': resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} @@ -1282,6 +1433,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.27.3': resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} @@ -1294,6 +1451,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.27.3': resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} @@ -1306,6 +1469,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} @@ -1318,6 +1487,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.27.3': resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} @@ -1330,6 +1505,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} @@ -1342,6 +1523,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} @@ -1354,6 +1541,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.27.3': resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} @@ -1366,6 +1559,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.27.3': resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} @@ -1378,6 +1577,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.27.3': resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} @@ -1390,6 +1595,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.27.3': resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} @@ -1747,10 +1958,18 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -1777,6 +1996,126 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/base64@17.65.0': + resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@17.65.0': + resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@17.65.0': + resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.56.10': + resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.56.10': + resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.56.10': + resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.56.10': + resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.56.10': + resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.56.10': + resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.56.10': + resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.56.10': + resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@17.65.0': + resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@17.65.0': + resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@17.65.0': + resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsr/deno__cache-dir@0.25.0': resolution: {integrity: sha512-J5/kPR8sc+dsRyE8rnLPhqay7B4XgBmkv7QaeIV41sGibszQjIb8b599LssN1YWBbqPLakPRMVobg5u6LheWfg==, tarball: https://npm.jsr.io/~/11/@jsr/deno__cache-dir/0.25.0.tgz} @@ -1789,6 +2128,9 @@ packages: '@jsr/deno__graph@0.86.9': resolution: {integrity: sha512-+qrrma5/bL+hcG20mfaEeC8SLopqoyd1RjcKFMRu++3SAXyrTKuvuIjBJCn/NyN7X+kV+QrJG67BCHX38Rzw+g==, tarball: https://npm.jsr.io/~/11/@jsr/deno__graph/0.86.9.tgz} + '@jsr/mary__tar@0.3.2': + resolution: {integrity: sha512-tGVmuWdOvAmUEWH76m3C+rnXp1VSvZw9WXpNpaJnHabVGpqLAzg9pcRCsN7OBJwZylACEyUiUNQjiHeEu7SD8w==, tarball: https://npm.jsr.io/~/11/@jsr/mary__tar/0.3.2.tgz} + '@jsr/std__bytes@1.0.6': resolution: {integrity: sha512-St6yKggjFGhxS52IFLJWvkchRFbAKg2Xh8UxA4S1EGz7GJ2Ui+ssDDldj/w2c8vCxvl6qgR0HaYbKeFJNqujmA==, tarball: https://npm.jsr.io/~/11/@jsr/std__bytes/1.0.6.tgz} @@ -1814,7 +2156,7 @@ packages: resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} '@lunariajs/core@https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@f07e1a3': - resolution: {tarball: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@f07e1a3} + resolution: {integrity: sha512-gjrzNz3XLFOUrDcmBxgaaF8Flh2yDpn8/RQyt+kyQen3sCjT04BnqJXLweper+xWyfvpOFK4Cqmy3wHvTyC1ww==, tarball: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@f07e1a3} version: 0.1.1 engines: {node: '>=18.17.0'} @@ -1946,6 +2288,10 @@ packages: resolution: {integrity: sha512-KMTLK/dsGaQioZzkYUvgfN9le4grNW54aNcA1jqzgVZLcFVy4jJfrJr5WZio9NT2EMfajdoZ+V28aD7BRr4Zfw==} engines: {node: '>=18.12.0'} + '@nuxt/kit@4.3.0': + resolution: {integrity: sha512-cD/0UU9RQmlnTbmyJTDyzN8f6CzpziDLv3tFQCnwl0Aoxt3KmFu4k/XA4Sogxqj7jJ/3cdX1kL+Lnsh34sxcQQ==} + engines: {node: '>=18.12.0'} + '@nuxt/kit@4.3.1': resolution: {integrity: sha512-UjBFt72dnpc+83BV3OIbCT0YHLevJtgJCHpxMX0YRKWLDhhbcDdUse87GtsQBrjvOzK7WUNUYLDS/hQLYev5rA==} engines: {node: '>=18.12.0'} @@ -1956,6 +2302,10 @@ packages: peerDependencies: nuxt: ^4.3.1 + '@nuxt/schema@4.3.0': + resolution: {integrity: sha512-+Ps3exseMFH3MOapbBmDdpaHpPV7wqcB6+Ir9w8h91771HwMOWrQomAZpqDvw7FtFraoD5Xw7dhSKDhkwJRSmQ==} + engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/schema@4.3.1': resolution: {integrity: sha512-S+wHJdYDuyk9I43Ej27y5BeWMZgi7R/UVql3b3qtT35d0fbpXW7fUenzhLRCCDC6O10sjguc6fcMcR9sMKvV8g==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2846,33 +3196,33 @@ packages: cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.11.3': - resolution: {integrity: sha512-FU4e+w09D+2rkCVdL7I7zMuQOJ2tuapVhBGPGY66VAct2FUwFDVmgU+rNJ2hHIdc9uHg24v+FD8PcfFYpask8Q==} + '@oxlint-tsgolint/darwin-arm64@0.11.4': + resolution: {integrity: sha512-IhdhiC183s5wdFDZSQC8PaFFq1QROiVT5ahz7ysgEKVnkNDjy82ieM7ZKiUfm2ncXNX2RcFGSSZrQO6plR+VAQ==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.11.3': - resolution: {integrity: sha512-7sm1d920HfFsC3hIP7SJVm11WhYufA8qnLQQVk7odTpSzVUAT1jtG8LdfFigzgb38zHszQbsqJ7OjAgIW/OgmA==} + '@oxlint-tsgolint/darwin-x64@0.11.4': + resolution: {integrity: sha512-KJmBg10Z1uGpJqxDzETXOytYyeVrKUepo8rCXeVkRlZ2QzZqMElgalFN4BI3ccgIPkQpzzu4SVzWNFz7yiKavQ==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.11.3': - resolution: {integrity: sha512-eoJfdmHcpG9k8fufb8yL3rC3HC6QELoTEfs56lmGaRIHHmd1aj4MWDbGCqdRqPEp7oC5fVvFxi7wDkA1MDf99Q==} + '@oxlint-tsgolint/linux-arm64@0.11.4': + resolution: {integrity: sha512-P6I3dSSpoEnjFzTMlrbcBHNbErSxceZmcVUslBxrrIUH1NSVS1XfSz6S75vT2Gay7Jv6LI7zTTVAk4cSqkfe+w==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.11.3': - resolution: {integrity: sha512-t7jGK0vBApuAGvOnCPTxsdX+1e9nMdvqU3zHCJWQ7yUDaJxki0bCy4zbKfUgVo8ePeVRgIKWwqLFBOVTXQ5AMQ==} + '@oxlint-tsgolint/linux-x64@0.11.4': + resolution: {integrity: sha512-G0eAW3S7cp/vP7Kx6e7+Ze7WfNgSt1tc/rOexfLKnnIi+9BelyOa2wF9bWFPpxk3n3AdkBwKttU1/adDZlD87Q==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.11.3': - resolution: {integrity: sha512-6ellG0zcWnj2b6Mr7fl19x+nlFIWGWoKCBlYnqNZ4CaziRYGpYx7PLwHhPJq331w7zzRRSnYqhyTrVluYjZADQ==} + '@oxlint-tsgolint/win32-arm64@0.11.4': + resolution: {integrity: sha512-prgQEBiwp4TAxarh6dYbVOKw6riRJ6hB49vDD6DxQlOZQky7xHQ9qTec5/rf0JTUZ16YaJ9YfHycbJS3QVpTYw==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.11.3': - resolution: {integrity: sha512-rzvfaRJPK9eRYVWMXCt8JtvOsVFAsqScgsFhnXzsipU6W1Te0g+b4q068o7hZ3NRTjJxNgFJj8ayOkZ6NbX0tA==} + '@oxlint-tsgolint/win32-x64@0.11.4': + resolution: {integrity: sha512-5xXTzZIT/1meWMmS60Q+FYWvWncc6iTfC8tyQt7GDfPUoqQvE5WVgHm1QjDSJvxTD+6AHphpCqdhXq/KtxagRw==} cpu: [x64] os: [win32] @@ -3206,6 +3556,10 @@ packages: cpu: [x64] os: [win32] + '@rolldown/browser@1.0.0-rc.3': + resolution: {integrity: sha512-6sxIQPzuCL27YanbaUht6qmVoih47Sk0jceFKuUAD28V1PXgVfjt2m30yP1KK7JuqZOBm6EybLtrccM0kK2Svw==} + hasBin: true + '@rolldown/pluginutils@1.0.0-rc.1': resolution: {integrity: sha512-UTBjtTxVOhodhzFVp/ayITaTETRHPUPYZPXQe0WU0wOgxghMojXxYjOiPOauKIYNWJAWS2fd7gJgGQK8GU8vDA==} @@ -3332,136 +3686,274 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.57.0': resolution: {integrity: sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.57.0': resolution: {integrity: sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.57.0': resolution: {integrity: sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.57.0': resolution: {integrity: sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.57.0': resolution: {integrity: sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.57.0': resolution: {integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==} cpu: [arm] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm-musleabihf@4.57.0': resolution: {integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==} cpu: [arm] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-arm64-gnu@4.57.0': resolution: {integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==} cpu: [arm64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm64-musl@4.57.0': resolution: {integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==} cpu: [arm64] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-loong64-gnu@4.57.0': resolution: {integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==} cpu: [loong64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-loong64-musl@4.57.0': resolution: {integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==} cpu: [loong64] os: [linux] libc: [musl] + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-ppc64-gnu@4.57.0': resolution: {integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==} cpu: [ppc64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-ppc64-musl@4.57.0': resolution: {integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==} cpu: [ppc64] os: [linux] libc: [musl] + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-riscv64-gnu@4.57.0': resolution: {integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==} cpu: [riscv64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-riscv64-musl@4.57.0': resolution: {integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==} cpu: [riscv64] os: [linux] libc: [musl] + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-s390x-gnu@4.57.0': resolution: {integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==} cpu: [s390x] os: [linux] libc: [glibc] + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.57.0': resolution: {integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==} cpu: [x64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-musl@4.57.0': resolution: {integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==} cpu: [x64] os: [linux] libc: [musl] + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + libc: [musl] + '@rollup/rollup-openbsd-x64@4.57.0': resolution: {integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==} cpu: [x64] os: [openbsd] + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + '@rollup/rollup-openharmony-arm64@4.57.0': resolution: {integrity: sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.57.0': resolution: {integrity: sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.57.0': resolution: {integrity: sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.57.0': resolution: {integrity: sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.0': - resolution: {integrity: sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.0': + resolution: {integrity: sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] @@ -3993,6 +4485,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unhead/vue@2.1.2': + resolution: {integrity: sha512-w5yxH/fkkLWAFAOnMSIbvAikNHYn6pgC7zGF/BasXf+K3CO1cYIPFehYAk5jpcsbiNPMc3goyyw1prGLoyD14g==} + peerDependencies: + vue: '>=3.5.18' + '@unhead/vue@2.1.3': resolution: {integrity: sha512-Cx0SvCPPOowHteJTpsI+sAQovYnmOgMdueL/McLIYyzJcSM1RBiB+4GJSWOvPDNBSK80SkyI654iWoW5V4UTTw==} peerDependencies: @@ -4095,11 +4592,6 @@ packages: '@upstash/redis@1.36.1': resolution: {integrity: sha512-N6SjDcgXdOcTAF+7uNoY69o7hCspe9BcA7YjQdxVu5d25avljTwyLaHBW3krWjrP0FfocgMk94qyVtQbeDp39A==} - '@vercel/kv@3.0.0': - resolution: {integrity: sha512-pKT8fRnfyYk2MgvyB6fn6ipJPCdfZwiKDdw7vB+HL50rjboEBHDVBEcnwfkEpVSp2AjNtoaOUH7zG+bVC/rvSg==} - engines: {node: '>=14.6'} - deprecated: 'Vercel KV is deprecated. If you had an existing KV store, it should have moved to Upstash Redis which you will see under Vercel Integrations. For new projects, install a Redis integration from Vercel Marketplace: https://vercel.com/marketplace?category=storage&search=redis' - '@vercel/nft@1.3.0': resolution: {integrity: sha512-i4EYGkCsIjzu4vorDUbqglZc5eFtQI2syHb++9ZUDm6TU4edVywGpVnYDein35x9sevONOn9/UabfQXuNXtuzQ==} engines: {node: '>=20'} @@ -4707,8 +5199,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + babel-plugin-polyfill-corejs3@0.14.0: + resolution: {integrity: sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4746,10 +5238,6 @@ packages: resolution: {integrity: sha512-WwCZ/5Diz7rsF29o27o0Gcc1Du+l7Zsv7SYtVPG0X3G/uUI1LqdxrQI7c9Hs2FWpqXXERjW9hp6g3/tH7DlVKg==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} - better-sqlite3@12.6.2: - resolution: {integrity: sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==} - engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -5437,6 +5925,10 @@ packages: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -5494,6 +5986,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} @@ -5926,12 +6423,17 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: @@ -6004,8 +6506,8 @@ packages: crossws: optional: true - happy-dom@20.4.0: - resolution: {integrity: sha512-RDeQm3dT9n0A5f/TszjUmNCLEuPnMGv3Tv4BmNINebz/h17PA6LMBcxJ5FrcqltNBMh9jA/8ufgDdBYUdBt+eg==} + happy-dom@20.3.5: + resolution: {integrity: sha512-QQ5Zh3uG0XH5+6Nw4lNu812Jui6X7jHFudFo9Vytm/8ivxRmJz1aw4r/PDS6oUmjCjzk+dla0VhYRXp0YV1woQ==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -6160,6 +6662,10 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + ico-endec@0.1.6: resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==} @@ -6499,8 +7005,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} jake@10.9.4: @@ -6982,6 +7488,11 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + memfs@4.56.10: + resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} + peerDependencies: + tslib: '2' + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -7121,6 +7632,10 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.1.2: + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7332,6 +7847,11 @@ packages: '@types/node': optional: true + nypm@0.6.4: + resolution: {integrity: sha512-1TvCKjZyyklN+JJj2TS3P4uSQEInrM/HkkuSXsEzm1ApPgBffOn8gFguNnZf07r/1X6vlryfIqMUkJKQMzlZiw==} + engines: {node: '>=18'} + hasBin: true + nypm@0.6.5: resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} engines: {node: '>=18'} @@ -7451,8 +7971,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint-tsgolint@0.11.3: - resolution: {integrity: sha512-zkuGXJzE5WIoGQ6CHG3GbxncPNrvUG9giTKdXMqKrlieCRxa9hGMvMJM+7DFxKSaryVAEFrTQJNrGJHpeMmFPg==} + oxlint-tsgolint@0.11.4: + resolution: {integrity: sha512-VyQc+69TxQwUdsEPiVFN7vNZdDVO/FHaEcHltnWs3O6rvwxv67uADlknQQO714sbRdEahOjgO5dFf+K9ili0gg==} hasBin: true oxlint@1.42.0: @@ -8187,6 +8707,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -8681,6 +9206,12 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} @@ -8742,6 +9273,12 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -8876,6 +9413,9 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unhead@2.1.2: + resolution: {integrity: sha512-vSihrxyb+zsEUfEbraZBCjdE0p/WSoc2NGDrpwwSNAwuPxhYK1nH3eegf02IENLpn1sUhL8IoO84JWmRQ6tILA==} + unhead@2.1.3: resolution: {integrity: sha512-Xg1vKNzkEDM4rrbQcSyKhjy2SAmSyV8qy/2iVdBeoln3Yxz31hlhpa1B2Yx5gBLj9G4MQ6+ZguDzpJTDgrhH+w==} @@ -9666,6 +10206,8 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.1 + '@atcute/uint8array@1.1.0': {} + '@atproto-labs/did-resolver@0.2.6': dependencies: '@atproto-labs/fetch': 0.2.3 @@ -9715,7 +10257,7 @@ snapshots: '@atproto/api@0.18.20': dependencies: - '@atproto/common-web': 0.4.15 + '@atproto/common-web': 0.4.16 '@atproto/lexicon': 0.6.1 '@atproto/syntax': 0.4.3 '@atproto/xrpc': 0.7.7 @@ -9724,16 +10266,23 @@ snapshots: tlds: 1.261.0 zod: 3.25.76 - '@atproto/common-web@0.4.15': + '@atproto/common-web@0.4.14': dependencies: - '@atproto/lex-data': 0.0.10 - '@atproto/lex-json': 0.0.10 + '@atproto/lex-data': 0.0.9 + '@atproto/lex-json': 0.0.9 + '@atproto/syntax': 0.4.3 + zod: 3.25.76 + + '@atproto/common-web@0.4.16': + dependencies: + '@atproto/lex-data': 0.0.11 + '@atproto/lex-json': 0.0.11 '@atproto/syntax': 0.4.3 zod: 3.25.76 '@atproto/common@0.5.10': dependencies: - '@atproto/common-web': 0.4.15 + '@atproto/common-web': 0.4.16 '@atproto/lex-cbor': 0.0.10 '@atproto/lex-data': 0.0.10 iso-datestring-validator: 2.2.2 @@ -9798,6 +10347,13 @@ snapshots: uint8arrays: 3.0.0 unicode-segmenter: 0.14.5 + '@atproto/lex-data@0.0.11': + dependencies: + multiformats: 9.9.0 + tslib: 2.8.1 + uint8arrays: 3.0.0 + unicode-segmenter: 0.14.5 + '@atproto/lex-data@0.0.9': dependencies: multiformats: 9.9.0 @@ -9822,9 +10378,9 @@ snapshots: '@atproto/syntax': 0.4.3 tslib: 2.8.1 - '@atproto/lex-json@0.0.10': + '@atproto/lex-json@0.0.11': dependencies: - '@atproto/lex-data': 0.0.10 + '@atproto/lex-data': 0.0.11 tslib: 2.8.1 '@atproto/lex-json@0.0.9': @@ -9863,7 +10419,7 @@ snapshots: '@atproto/lexicon@0.6.1': dependencies: - '@atproto/common-web': 0.4.15 + '@atproto/common-web': 0.4.16 '@atproto/syntax': 0.4.3 iso-datestring-validator: 2.2.2 multiformats: 9.9.0 @@ -9906,7 +10462,7 @@ snapshots: '@atproto/repo@0.8.12': dependencies: '@atproto/common': 0.5.10 - '@atproto/common-web': 0.4.15 + '@atproto/common-web': 0.4.14 '@atproto/crypto': 0.4.5 '@atproto/lexicon': 0.6.1 '@ipld/dag-cbor': 7.0.3 @@ -9924,6 +10480,12 @@ snapshots: '@atproto/lexicon': 0.6.1 zod: 3.25.76 + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -9932,6 +10494,8 @@ snapshots: '@babel/compat-data@7.28.6': {} + '@babel/compat-data@7.29.0': {} + '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -9952,6 +10516,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.0 @@ -9971,7 +10543,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@babel/helper-compilation-targets@7.28.6': dependencies: @@ -9989,7 +10561,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -10016,15 +10588,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -10039,7 +10611,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@babel/helper-plugin-utils@7.28.6': {} @@ -10057,14 +10629,14 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -10093,7 +10665,11 @@ snapshots: '@babel/parser@7.27.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 '@babel/parser@7.29.0': dependencies: @@ -10173,7 +10749,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 @@ -10254,7 +10830,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) @@ -10336,7 +10912,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) @@ -10354,7 +10930,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) @@ -10434,7 +11010,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 @@ -10512,9 +11088,9 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.28.6(@babel/core@7.29.0)': + '@babel/preset-env@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 @@ -10529,7 +11105,7 @@ snapshots: '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) @@ -10540,7 +11116,7 @@ snapshots: '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) @@ -10553,9 +11129,9 @@ snapshots: '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) @@ -10567,7 +11143,7 @@ snapshots: '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) @@ -10581,7 +11157,7 @@ snapshots: '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.0(@babel/core@7.29.0) babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) core-js-compat: 3.48.0 semver: 6.3.1 @@ -10599,22 +11175,34 @@ snapshots: '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@babel/traverse@7.27.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -10627,6 +11215,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -10639,6 +11232,8 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@bokuweb/zstd-wasm@0.0.27': {} + '@bomb.sh/tab@0.0.12(cac@6.7.14)(citty@0.2.0)': optionalDependencies: cac: 6.7.14 @@ -10699,171 +11294,246 @@ snapshots: dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - optional: true '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 - optional: true '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 - optional: true '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/aix-ppc64@0.27.2': + optional: true + '@esbuild/aix-ppc64@0.27.3': optional: true '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm64@0.27.2': + optional: true + '@esbuild/android-arm64@0.27.3': optional: true '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-arm@0.27.2': + optional: true + '@esbuild/android-arm@0.27.3': optional: true '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/android-x64@0.27.2': + optional: true + '@esbuild/android-x64@0.27.3': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.27.2': + optional: true + '@esbuild/darwin-arm64@0.27.3': optional: true '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/darwin-x64@0.27.2': + optional: true + '@esbuild/darwin-x64@0.27.3': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.27.2': + optional: true + '@esbuild/freebsd-arm64@0.27.3': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.27.2': + optional: true + '@esbuild/freebsd-x64@0.27.3': optional: true '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm64@0.27.2': + optional: true + '@esbuild/linux-arm64@0.27.3': optional: true '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-arm@0.27.2': + optional: true + '@esbuild/linux-arm@0.27.3': optional: true '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-ia32@0.27.2': + optional: true + '@esbuild/linux-ia32@0.27.3': optional: true '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-loong64@0.27.2': + optional: true + '@esbuild/linux-loong64@0.27.3': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-mips64el@0.27.2': + optional: true + '@esbuild/linux-mips64el@0.27.3': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-ppc64@0.27.2': + optional: true + '@esbuild/linux-ppc64@0.27.3': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.27.2': + optional: true + '@esbuild/linux-riscv64@0.27.3': optional: true '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-s390x@0.27.2': + optional: true + '@esbuild/linux-s390x@0.27.3': optional: true '@esbuild/linux-x64@0.25.12': optional: true + '@esbuild/linux-x64@0.27.2': + optional: true + '@esbuild/linux-x64@0.27.3': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-arm64@0.27.2': + optional: true + '@esbuild/netbsd-arm64@0.27.3': optional: true '@esbuild/netbsd-x64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.27.2': + optional: true + '@esbuild/netbsd-x64@0.27.3': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-arm64@0.27.2': + optional: true + '@esbuild/openbsd-arm64@0.27.3': optional: true '@esbuild/openbsd-x64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.27.2': + optional: true + '@esbuild/openbsd-x64@0.27.3': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/openharmony-arm64@0.27.2': + optional: true + '@esbuild/openharmony-arm64@0.27.3': optional: true '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/sunos-x64@0.27.2': + optional: true + '@esbuild/sunos-x64@0.27.3': optional: true '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-arm64@0.27.2': + optional: true + '@esbuild/win32-arm64@0.27.3': optional: true '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-ia32@0.27.2': + optional: true + '@esbuild/win32-ia32@0.27.3': optional: true '@esbuild/win32-x64@0.25.12': optional: true + '@esbuild/win32-x64@0.27.2': + optional: true + '@esbuild/win32-x64@0.27.3': optional: true @@ -11134,13 +11804,13 @@ snapshots: '@intlify/shared@11.2.8': {} - '@intlify/unplugin-vue-i18n@11.0.3(@vue/compiler-dom@3.5.27)(eslint@9.39.2(jiti@2.6.1))(rollup@4.57.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))': + '@intlify/unplugin-vue-i18n@11.0.3(@vue/compiler-dom@3.5.27)(eslint@9.39.2(jiti@2.6.1))(rollup@4.57.1)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@intlify/bundle-utils': 11.0.3(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3))) '@intlify/shared': 11.2.8 '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.2.8)(@vue/compiler-dom@3.5.27)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) - '@rollup/pluginutils': 5.3.0(rollup@4.57.0) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) debug: 4.4.3 @@ -11162,7 +11832,7 @@ snapshots: '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.2.8)(@vue/compiler-dom@3.5.27)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.28.6 optionalDependencies: '@intlify/shared': 11.2.8 '@vue/compiler-dom': 3.5.27 @@ -11182,6 +11852,10 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11191,6 +11865,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 @@ -11221,6 +11897,133 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsr/deno__cache-dir@0.25.0': dependencies: '@jsr/deno__graph': 0.86.9 @@ -11238,6 +12041,8 @@ snapshots: '@jsr/deno__graph@0.86.9': {} + '@jsr/mary__tar@0.3.2': {} + '@jsr/std__bytes@1.0.6': {} '@jsr/std__fmt@1.0.9': {} @@ -11294,11 +12099,11 @@ snapshots: - encoding - supports-color - '@miyaneee/rollup-plugin-json5@1.2.0(rollup@4.57.0)': + '@miyaneee/rollup-plugin-json5@1.2.0(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.0) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) json5: 2.2.3 - rollup: 4.57.0 + rollup: 4.57.1 '@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6)': dependencies: @@ -11327,7 +12132,6 @@ snapshots: '@emnapi/core': 1.8.1 '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 - optional: true '@noble/curves@1.9.7': dependencies: @@ -11352,7 +12156,7 @@ snapshots: '@nuxt/a11y@1.0.0-alpha.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) axe-core: 4.11.1 sirv: 3.0.2 transitivePeerDependencies: @@ -11399,7 +12203,7 @@ snapshots: '@nuxt/content@3.11.0(better-sqlite3@12.5.0)(magicast@0.5.1)(valibot@1.2.0(typescript@5.9.3))': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@nuxtjs/mdc': 0.20.1(magicast@0.5.1) '@shikijs/langs': 3.21.0 '@sqlite.org/sqlite-wasm': 3.50.4-build1 @@ -11428,7 +12232,7 @@ snapshots: minimark: 0.2.0 minimatch: 10.1.1 nuxt-component-meta: 0.17.1(magicast@0.5.1) - nypm: 0.6.5 + nypm: 0.6.4 ohash: 2.0.11 pathe: 2.0.3 pkg-types: 2.3.0 @@ -11470,7 +12274,7 @@ snapshots: '@nuxt/devtools-kit@3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) execa: 8.0.1 vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: @@ -11528,16 +12332,16 @@ snapshots: - utf-8-validate - vue - '@nuxt/fonts@0.12.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': + '@nuxt/fonts@0.12.1(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 esbuild: 0.25.12 fontaine: 0.7.0 - fontless: 0.1.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + fontless: 0.1.0(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) h3: 1.15.5 jiti: 2.6.1 magic-regexp: 0.10.0 @@ -11550,7 +12354,7 @@ snapshots: ufo: 1.6.3 unifont: 0.6.0 unplugin: 2.3.11 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11574,16 +12378,16 @@ snapshots: - uploadthing - vite - '@nuxt/fonts@0.13.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': + '@nuxt/fonts@0.13.0(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 - esbuild: 0.27.3 + esbuild: 0.27.2 fontaine: 0.8.0 - fontless: 0.1.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + fontless: 0.1.0(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) h3: 1.15.5 jiti: 2.6.1 magic-regexp: 0.10.0 @@ -11596,7 +12400,7 @@ snapshots: ufo: 1.6.3 unifont: 0.6.0 unplugin: 2.3.11 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11627,7 +12431,7 @@ snapshots: '@iconify/utils': 3.1.0 '@iconify/vue': 5.0.0(vue@3.5.27(typescript@5.9.3)) '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) consola: 3.4.2 local-pkg: 1.1.2 mlly: 1.8.0 @@ -11641,9 +12445,9 @@ snapshots: - vite - vue - '@nuxt/image@2.0.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)': + '@nuxt/image@2.0.0(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) consola: 3.4.2 defu: 6.1.4 h3: 1.15.5 @@ -11654,7 +12458,7 @@ snapshots: std-env: 3.10.0 ufo: 1.6.3 optionalDependencies: - ipx: 3.1.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) + ipx: 3.1.1(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11703,6 +12507,31 @@ snapshots: transitivePeerDependencies: - magicast + '@nuxt/kit@4.3.0(magicast@0.5.1)': + dependencies: + c12: 3.3.3(magicast@0.5.1) + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.8 + ignore: 7.0.5 + jiti: 2.6.1 + klona: 2.0.6 + mlly: 1.8.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.0 + rc9: 2.1.2 + scule: 1.3.0 + semver: 7.7.3 + tinyglobby: 0.2.15 + ufo: 1.6.3 + unctx: 2.5.0 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + '@nuxt/kit@4.3.1(magicast@0.5.1)': dependencies: c12: 3.3.3(magicast@0.5.1) @@ -11728,7 +12557,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.3.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.5.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-rc.1)(typescript@5.9.3)': + '@nuxt/nitro-server@4.3.1(@upstash/redis@1.36.1)(better-sqlite3@12.5.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-rc.1)(typescript@5.9.3)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.3.1(magicast@0.5.1) @@ -11745,8 +12574,8 @@ snapshots: impound: 1.0.0 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.5.0)(rolldown@1.0.0-rc.1) - nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) + nitropack: 2.13.1(@upstash/redis@1.36.1)(better-sqlite3@12.5.0)(rolldown@1.0.0-rc.1) + nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) ohash: 2.0.11 pathe: 2.0.3 pkg-types: 2.3.0 @@ -11754,7 +12583,7 @@ snapshots: std-env: 3.10.0 ufo: 1.6.3 unctx: 2.5.0 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) vue: 3.5.27(typescript@5.9.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 @@ -11793,70 +12622,13 @@ snapshots: - uploadthing - xml2js - '@nuxt/nitro-server@4.3.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.6.2)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-rc.1)(typescript@5.9.3)': + '@nuxt/schema@4.3.0': dependencies: - '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) '@vue/shared': 3.5.27 - consola: 3.4.2 defu: 6.1.4 - destr: 2.0.5 - devalue: 5.6.2 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - h3: 1.15.5 - impound: 1.0.0 - klona: 2.0.6 - mocked-exports: 0.1.1 - nitropack: 2.13.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.6.2)(rolldown@1.0.0-rc.1) - nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) - ohash: 2.0.11 pathe: 2.0.3 pkg-types: 2.3.0 - rou3: 0.7.12 std-env: 3.10.0 - ufo: 1.6.3 - unctx: 2.5.0 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) - vue: 3.5.27(typescript@5.9.3) - vue-bundle-renderer: 2.2.0 - vue-devtools-stub: 0.1.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bare-abort-controller - - better-sqlite3 - - db0 - - drizzle-orm - - encoding - - idb-keyval - - ioredis - - magicast - - mysql2 - - react-native-b4a - - rolldown - - sqlite3 - - supports-color - - typescript - - uploadthing - - xml2js '@nuxt/schema@4.3.1': dependencies: @@ -11866,9 +12638,9 @@ snapshots: pkg-types: 2.3.0 std-env: 3.10.0 - '@nuxt/scripts@0.13.2(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3))': + '@nuxt/scripts@0.13.2(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3))': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) consola: 3.4.2 @@ -11884,7 +12656,7 @@ snapshots: std-env: 3.10.0 ufo: 1.6.3 unplugin: 2.3.11 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) valibot: 1.2.0(typescript@5.9.3) transitivePeerDependencies: - '@azure/app-configuration' @@ -11919,7 +12691,7 @@ snapshots: rc9: 3.0.0 std-env: 3.10.0 - '@nuxt/test-utils@4.0.0(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.4.0)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': + '@nuxt/test-utils@4.0.0(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.3.5)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@clack/prompts': 1.0.0 '@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) @@ -11938,7 +12710,7 @@ snapshots: magic-string: 0.30.21 node-fetch-native: 1.6.7 node-mock-http: 1.0.4 - nypm: 0.6.5 + nypm: 0.6.4 ofetch: 1.5.1 pathe: 2.0.3 perfect-debounce: 2.1.0 @@ -11948,30 +12720,30 @@ snapshots: tinyexec: 1.0.2 ufo: 1.6.3 unplugin: 3.0.0 - vitest-environment-nuxt: 1.0.1(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.4.0)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + vitest-environment-nuxt: 1.0.1(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.3.5)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) vue: 3.5.27(typescript@5.9.3) optionalDependencies: '@playwright/test': 1.58.1 '@vue/test-utils': 2.4.6 - happy-dom: 20.4.0 + happy-dom: 20.3.5 playwright-core: 1.58.1 - vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' + vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' transitivePeerDependencies: - crossws - magicast - typescript - vite - '@nuxt/ui@4.4.0(@nuxt/content@3.11.0(better-sqlite3@12.5.0)(magicast@0.5.1)(valibot@1.2.0(typescript@5.9.3)))(@tiptap/extensions@3.17.1(@tiptap/core@3.17.1(@tiptap/pm@3.17.1))(@tiptap/pm@3.17.1))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(embla-carousel@8.6.0)(focus-trap@7.8.0)(ioredis@5.9.2)(magicast@0.5.1)(tailwindcss@4.1.18)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6)': + '@nuxt/ui@4.4.0(@nuxt/content@3.11.0(better-sqlite3@12.5.0)(magicast@0.5.1)(valibot@1.2.0(typescript@5.9.3)))(@tiptap/extensions@3.17.1(@tiptap/core@3.17.1(@tiptap/pm@3.17.1))(@tiptap/pm@3.17.1))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(embla-carousel@8.6.0)(focus-trap@7.8.0)(ioredis@5.9.2)(magicast@0.5.1)(tailwindcss@4.1.18)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6)': dependencies: '@floating-ui/dom': 1.7.5 '@iconify/vue': 5.0.0(vue@3.5.27(typescript@5.9.3)) '@internationalized/date': 3.10.1 '@internationalized/number': 3.6.5 - '@nuxt/fonts': 0.12.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + '@nuxt/fonts': 0.12.1(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) '@nuxt/icon': 2.2.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@nuxt/schema': 4.3.1 + '@nuxt/kit': 4.3.0(magicast@0.5.1) + '@nuxt/schema': 4.3.0 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.1) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.1.18 @@ -11995,7 +12767,7 @@ snapshots: '@tiptap/starter-kit': 3.17.1 '@tiptap/suggestion': 3.17.1(@tiptap/core@3.17.1(@tiptap/pm@3.17.1))(@tiptap/pm@3.17.1) '@tiptap/vue-3': 3.17.1(@floating-ui/dom@1.7.5)(@tiptap/core@3.17.1(@tiptap/pm@3.17.1))(@tiptap/pm@3.17.1)(vue@3.5.27(typescript@5.9.3)) - '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) + '@unhead/vue': 2.1.2(vue@3.5.27(typescript@5.9.3)) '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) '@vueuse/integrations': 14.2.0(focus-trap@7.8.0)(fuse.js@7.1.0)(vue@3.5.27(typescript@5.9.3)) '@vueuse/shared': 14.2.0(vue@3.5.27(typescript@5.9.3)) @@ -12026,8 +12798,8 @@ snapshots: typescript: 5.9.3 ufo: 1.6.3 unplugin: 2.3.11 - unplugin-auto-import: 21.0.0(@nuxt/kit@4.3.1(magicast@0.5.1))(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3))) - unplugin-vue-components: 31.0.0(@nuxt/kit@4.3.1(magicast@0.5.1))(vue@3.5.27(typescript@5.9.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.3.0(magicast@0.5.1))(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3))) + unplugin-vue-components: 31.0.0(@nuxt/kit@4.3.0(magicast@0.5.1))(vue@3.5.27(typescript@5.9.3)) vaul-vue: 0.4.1(reka-ui@2.7.0(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) vue-component-type-helpers: 3.2.4 optionalDependencies: @@ -12077,74 +12849,10 @@ snapshots: - vue - yjs - '@nuxt/vite-builder@4.3.1(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2)': - dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@rollup/plugin-replace': 6.0.3(rollup@4.57.0) - '@vitejs/plugin-vue': 6.0.4(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.4(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) - autoprefixer: 10.4.24(postcss@8.5.6) - consola: 3.4.2 - cssnano: 7.1.2(postcss@8.5.6) - defu: 6.1.4 - esbuild: 0.27.3 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - get-port-please: 3.2.0 - jiti: 2.6.1 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.0 - mocked-exports: 0.1.1 - nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) - pathe: 2.0.3 - pkg-types: 2.3.0 - postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-rc.1)(rollup@4.57.0) - seroval: 1.5.0 - std-env: 3.10.0 - ufo: 1.6.3 - unenv: 2.0.0-rc.24 - vite: '@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' - vite-node: 5.3.0(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3)) - vue: 3.5.27(typescript@5.9.3) - vue-bundle-renderer: 2.2.0 - optionalDependencies: - rolldown: 1.0.0-rc.1 - transitivePeerDependencies: - - '@arethetypeswrong/core' - - '@biomejs/biome' - - '@types/node' - - '@vitejs/devtools' - - eslint - - less - - magicast - - meow - - optionator - - oxlint - - publint - - rollup - - sass - - sass-embedded - - stylelint - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - unplugin-lightningcss - - unplugin-unused - - vls - - vti - - vue-tsc - - yaml - - '@nuxt/vite-builder@4.3.1(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2)': + '@nuxt/vite-builder@4.3.1(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2)': dependencies: '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@rollup/plugin-replace': 6.0.3(rollup@4.57.0) + '@rollup/plugin-replace': 6.0.3(rollup@4.57.1) '@vitejs/plugin-vue': 6.0.4(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': 5.1.4(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) autoprefixer: 10.4.24(postcss@8.5.6) @@ -12160,18 +12868,18 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.0 mocked-exports: 0.1.1 - nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-rc.1)(rollup@4.57.0) + rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-rc.1)(rollup@4.57.1) seroval: 1.5.0 std-env: 3.10.0 ufo: 1.6.3 unenv: 2.0.0-rc.24 vite: '@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' vite-node: 5.3.0(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3)) + vite-plugin-checker: 0.12.0(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3)) vue: 3.5.27(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -12216,7 +12924,7 @@ snapshots: '@nuxtjs/color-mode@4.0.0(magicast@0.5.1)': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) exsolve: 1.0.8 pathe: 2.0.3 pkg-types: 2.3.0 @@ -12224,11 +12932,11 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxtjs/html-validator@2.1.0(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(magicast@0.5.1)': + '@nuxtjs/html-validator@2.1.0(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(magicast@0.5.1)': dependencies: '@nuxt/kit': 3.21.0(magicast@0.5.1) consola: 3.4.2 - html-validate: 9.4.2(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + html-validate: 9.4.2(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) knitwork: 1.3.0 pathe: 2.0.3 prettier: 3.8.1 @@ -12240,16 +12948,16 @@ snapshots: - magicast - vitest - '@nuxtjs/i18n@10.2.3(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-dom@3.5.27)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(rollup@4.57.0)(vue@3.5.27(typescript@5.9.3))': + '@nuxtjs/i18n@10.2.3(@upstash/redis@1.36.1)(@vue/compiler-dom@3.5.27)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(rollup@4.57.1)(vue@3.5.27(typescript@5.9.3))': dependencies: '@intlify/core': 11.2.8 '@intlify/h3': 0.7.4 '@intlify/shared': 11.2.8 - '@intlify/unplugin-vue-i18n': 11.0.3(@vue/compiler-dom@3.5.27)(eslint@9.39.2(jiti@2.6.1))(rollup@4.57.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) + '@intlify/unplugin-vue-i18n': 11.0.3(@vue/compiler-dom@3.5.27)(eslint@9.39.2(jiti@2.6.1))(rollup@4.57.1)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) '@intlify/utils': 0.13.0 - '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.57.0) - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@rollup/plugin-yaml': 4.1.2(rollup@4.57.0) + '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.57.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) + '@rollup/plugin-yaml': 4.1.2(rollup@4.57.1) '@vue/compiler-sfc': 3.5.27 defu: 6.1.4 devalue: 5.6.2 @@ -12267,65 +12975,7 @@ snapshots: ufo: 1.6.3 unplugin: 2.3.11 unplugin-vue-router: 0.16.2(@vue/compiler-sfc@3.5.27)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) - vue-i18n: 11.2.8(vue@3.5.27(typescript@5.9.3)) - vue-router: 4.6.4(vue@3.5.27(typescript@5.9.3)) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vue/compiler-dom' - - aws4fetch - - db0 - - eslint - - idb-keyval - - ioredis - - magicast - - petite-vue-i18n - - rollup - - supports-color - - uploadthing - - vue - - '@nuxtjs/i18n@10.2.3(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-dom@3.5.27)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(rollup@4.57.0)(vue@3.5.27(typescript@5.9.3))': - dependencies: - '@intlify/core': 11.2.8 - '@intlify/h3': 0.7.4 - '@intlify/shared': 11.2.8 - '@intlify/unplugin-vue-i18n': 11.0.3(@vue/compiler-dom@3.5.27)(eslint@9.39.2(jiti@2.6.1))(rollup@4.57.0)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) - '@intlify/utils': 0.13.0 - '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.57.0) - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@rollup/plugin-yaml': 4.1.2(rollup@4.57.0) - '@vue/compiler-sfc': 3.5.27 - defu: 6.1.4 - devalue: 5.6.2 - h3: 1.15.5 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.0 - nuxt-define: 1.0.0 - ohash: 2.0.11 - oxc-parser: 0.95.0 - oxc-transform: 0.95.0 - oxc-walker: 0.5.2(oxc-parser@0.95.0) - pathe: 2.0.3 - typescript: 5.9.3 - ufo: 1.6.3 - unplugin: 2.3.11 - unplugin-vue-router: 0.16.2(@vue/compiler-sfc@3.5.27)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) vue-i18n: 11.2.8(vue@3.5.27(typescript@5.9.3)) vue-router: 4.6.4(vue@3.5.27(typescript@5.9.3)) transitivePeerDependencies: @@ -12360,7 +13010,7 @@ snapshots: dependencies: '@clack/prompts': 0.11.0 '@modelcontextprotocol/sdk': 1.25.3(hono@4.11.7)(zod@4.3.6) - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) automd: 0.4.2(magicast@0.5.1) chokidar: 5.0.0 defu: 6.1.4 @@ -12378,7 +13028,7 @@ snapshots: '@nuxtjs/mdc@0.20.1(magicast@0.5.1)': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@shikijs/core': 3.21.0 '@shikijs/langs': 3.21.0 '@shikijs/themes': 3.21.0 @@ -12428,7 +13078,7 @@ snapshots: '@nuxtjs/robots@5.6.7(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3))(zod@4.3.6)': dependencies: '@fingerprintjs/botd': 2.0.0 - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) consola: 3.4.2 defu: 6.1.4 nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) @@ -12821,22 +13471,22 @@ snapshots: '@oxfmt/win32-x64@0.27.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.11.3': + '@oxlint-tsgolint/darwin-arm64@0.11.4': optional: true - '@oxlint-tsgolint/darwin-x64@0.11.3': + '@oxlint-tsgolint/darwin-x64@0.11.4': optional: true - '@oxlint-tsgolint/linux-arm64@0.11.3': + '@oxlint-tsgolint/linux-arm64@0.11.4': optional: true - '@oxlint-tsgolint/linux-x64@0.11.3': + '@oxlint-tsgolint/linux-x64@0.11.4': optional: true - '@oxlint-tsgolint/win32-arm64@0.11.3': + '@oxlint-tsgolint/win32-arm64@0.11.4': optional: true - '@oxlint-tsgolint/win32-x64@0.11.3': + '@oxlint-tsgolint/win32-x64@0.11.4': optional: true '@oxlint/darwin-arm64@1.42.0': @@ -13049,6 +13699,10 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': optional: true + '@rolldown/browser@1.0.0-rc.3': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + '@rolldown/pluginutils@1.0.0-rc.1': {} '@rolldown/pluginutils@1.0.0-rc.2': {} @@ -13127,6 +13781,13 @@ snapshots: optionalDependencies: rollup: 4.57.0 + '@rollup/plugin-replace@6.0.3(rollup@4.57.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.57.1 + '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': dependencies: serialize-javascript: 6.0.2 @@ -13143,13 +13804,13 @@ snapshots: optionalDependencies: rollup: 4.57.0 - '@rollup/plugin-yaml@4.1.2(rollup@4.57.0)': + '@rollup/plugin-yaml@4.1.2(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.0) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) js-yaml: 4.1.1 tosource: 2.0.0-alpha.3 optionalDependencies: - rollup: 4.57.0 + rollup: 4.57.1 '@rollup/pluginutils@3.1.0(rollup@2.79.2)': dependencies: @@ -13174,81 +13835,164 @@ snapshots: optionalDependencies: rollup: 4.57.0 + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.1 + '@rollup/rollup-android-arm-eabi@4.57.0': optional: true + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + '@rollup/rollup-android-arm64@4.57.0': optional: true + '@rollup/rollup-android-arm64@4.57.1': + optional: true + '@rollup/rollup-darwin-arm64@4.57.0': optional: true + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + '@rollup/rollup-darwin-x64@4.57.0': optional: true + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.57.0': optional: true + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + '@rollup/rollup-freebsd-x64@4.57.0': optional: true + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.57.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.57.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.57.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.57.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.57.0': optional: true + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-loong64-musl@4.57.0': optional: true + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.57.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-ppc64-musl@4.57.0': optional: true + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.57.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.57.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.57.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.57.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.57.0': optional: true + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + '@rollup/rollup-openbsd-x64@4.57.0': optional: true + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + '@rollup/rollup-openharmony-arm64@4.57.0': optional: true + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.57.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.57.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + '@rollup/rollup-win32-x64-gnu@4.57.0': optional: true + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.57.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + '@sec-ant/readable-stream@0.4.1': {} '@shikijs/core@3.21.0': @@ -13653,7 +14397,6 @@ snapshots: '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 - optional: true '@types/chai@5.2.3': dependencies: @@ -13783,6 +14526,12 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3))': + dependencies: + hookable: 6.0.1 + unhead: 2.1.2 + vue: 3.5.27(typescript@5.9.3) + '@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3))': dependencies: hookable: 6.0.1 @@ -13837,7 +14586,7 @@ snapshots: '@unocss/nuxt@66.6.0(magicast@0.5.1)(postcss@8.5.6)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.3))': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@unocss/config': 66.6.0 '@unocss/core': 66.6.0 '@unocss/preset-attributify': 66.6.0 @@ -13979,11 +14728,6 @@ snapshots: dependencies: uncrypto: 0.1.3 - '@vercel/kv@3.0.0': - dependencies: - '@upstash/redis': 1.36.1 - optional: true - '@vercel/nft@1.3.0(rollup@4.57.0)': dependencies: '@mapbox/node-pre-gyp': 2.0.3 @@ -14045,20 +14789,20 @@ snapshots: vite: '@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' vue: 3.5.27(typescript@5.9.3) - '@vitest/browser-playwright@4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/browser-playwright@4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@vitest/browser': 4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/browser': 4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) playwright: 1.58.1 tinyrainbow: 3.0.3 - vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' + vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/browser@4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) '@vitest/utils': 4.0.18 @@ -14067,7 +14811,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' + vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' ws: 8.19.0 transitivePeerDependencies: - bufferutil @@ -14075,7 +14819,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)))(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)))(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -14087,9 +14831,9 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' + vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' optionalDependencies: - '@vitest/browser': 4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/browser': 4.0.18(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: @@ -14137,7 +14881,7 @@ snapshots: '@voidzero-dev/vite-plus-linux-x64-gnu@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab': optional: true - '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)': + '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 @@ -14154,7 +14898,7 @@ snapshots: ws: 8.19.0 optionalDependencies: '@types/node': 24.10.9 - happy-dom: 20.4.0 + happy-dom: 20.3.5 transitivePeerDependencies: - '@arethetypeswrong/core' - '@vitejs/devtools' @@ -14208,8 +14952,8 @@ snapshots: '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 '@vue/babel-helper-vue-transform-on': 2.0.1 '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.0) '@vue/shared': 3.5.27 @@ -14220,18 +14964,18 @@ snapshots: '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)': dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.28.6 '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/parser': 7.28.6 '@vue/compiler-sfc': 3.5.27 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.27': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.28.6 '@vue/shared': 3.5.27 entities: 7.0.1 estree-walker: 2.0.2 @@ -14244,7 +14988,7 @@ snapshots: '@vue/compiler-sfc@3.5.27': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.28.6 '@vue/compiler-core': 3.5.27 '@vue/compiler-dom': 3.5.27 '@vue/compiler-ssr': 3.5.27 @@ -14367,13 +15111,13 @@ snapshots: '@vueuse/metadata@14.2.0': {} - '@vueuse/nuxt@14.2.0(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': + '@vueuse/nuxt@14.2.0(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) '@vueuse/metadata': 14.2.0 local-pkg: 1.1.2 - nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) vue: 3.5.27(typescript@5.9.3) transitivePeerDependencies: - magicast @@ -14614,7 +15358,7 @@ snapshots: ast-kit@2.2.0: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.28.6 pathe: 2.0.3 ast-kit@3.0.0-beta.1: @@ -14631,7 +15375,7 @@ snapshots: ast-walker-scope@0.8.3: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.28.6 ast-kit: 2.2.0 async-function@1.0.0: {} @@ -14689,14 +15433,14 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.14.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) @@ -14728,12 +15472,6 @@ snapshots: bindings: 1.5.0 prebuild-install: 7.1.3 - better-sqlite3@12.6.2: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.3 - optional: true - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -15161,10 +15899,6 @@ snapshots: optionalDependencies: better-sqlite3: 12.5.0 - db0@0.3.4(better-sqlite3@12.6.2): - optionalDependencies: - better-sqlite3: 12.6.2 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -15249,16 +15983,16 @@ snapshots: diff@8.0.3: {} - docus@5.4.4(0a5f208c5e5e09cca0eb8d9e13c93aa6): + docus@5.4.4(9edf076b655db21d4d6cefdaeb22688c): dependencies: '@iconify-json/lucide': 1.2.87 '@iconify-json/simple-icons': 1.2.68 '@iconify-json/vscode-icons': 1.2.40 '@nuxt/content': 3.11.0(better-sqlite3@12.5.0)(magicast@0.5.1)(valibot@1.2.0(typescript@5.9.3)) - '@nuxt/image': 2.0.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1) - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@nuxt/ui': 4.4.0(@nuxt/content@3.11.0(better-sqlite3@12.5.0)(magicast@0.5.1)(valibot@1.2.0(typescript@5.9.3)))(@tiptap/extensions@3.17.1(@tiptap/core@3.17.1(@tiptap/pm@3.17.1))(@tiptap/pm@3.17.1))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(embla-carousel@8.6.0)(focus-trap@7.8.0)(ioredis@5.9.2)(magicast@0.5.1)(tailwindcss@4.1.18)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6) - '@nuxtjs/i18n': 10.2.3(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-dom@3.5.27)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(rollup@4.57.0)(vue@3.5.27(typescript@5.9.3)) + '@nuxt/image': 2.0.0(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) + '@nuxt/ui': 4.4.0(@nuxt/content@3.11.0(better-sqlite3@12.5.0)(magicast@0.5.1)(valibot@1.2.0(typescript@5.9.3)))(@tiptap/extensions@3.17.1(@tiptap/core@3.17.1(@tiptap/pm@3.17.1))(@tiptap/pm@3.17.1))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(embla-carousel@8.6.0)(focus-trap@7.8.0)(ioredis@5.9.2)(magicast@0.5.1)(tailwindcss@4.1.18)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6) + '@nuxtjs/i18n': 10.2.3(@upstash/redis@1.36.1)(@vue/compiler-dom@3.5.27)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(rollup@4.57.1)(vue@3.5.27(typescript@5.9.3)) '@nuxtjs/mcp-toolkit': 0.6.2(hono@4.11.7)(magicast@0.5.1)(zod@4.3.6) '@nuxtjs/mdc': 0.20.1(magicast@0.5.1) '@nuxtjs/robots': 5.6.7(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3))(zod@4.3.6) @@ -15269,9 +16003,9 @@ snapshots: git-url-parse: 16.1.0 minimark: 0.2.0 motion-v: 1.10.2(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) - nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) nuxt-llms: 0.2.0(magicast@0.5.1) - nuxt-og-image: 5.1.13(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unstorage@1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) + nuxt-og-image: 5.1.13(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unstorage@1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) pkg-types: 2.3.0 scule: 1.3.0 tailwindcss: 4.1.18 @@ -15479,6 +16213,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} entities@6.0.1: {} @@ -15602,6 +16341,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -15978,45 +16746,7 @@ snapshots: dependencies: tiny-inflate: 1.0.3 - fontless@0.1.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)): - dependencies: - consola: 3.4.2 - css-tree: 3.1.0 - defu: 6.1.4 - esbuild: 0.25.12 - fontaine: 0.7.0 - jiti: 2.6.1 - lightningcss: 1.31.1 - magic-string: 0.30.21 - ohash: 2.0.11 - pathe: 2.0.3 - ufo: 1.6.3 - unifont: 0.6.0 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) - optionalDependencies: - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - db0 - - idb-keyval - - ioredis - - uploadthing - - fontless@0.1.0(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)): + fontless@0.1.0(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)): dependencies: consola: 3.4.2 css-tree: 3.1.0 @@ -16030,7 +16760,7 @@ snapshots: pathe: 2.0.3 ufo: 1.6.3 unifont: 0.6.0 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) optionalDependencies: vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: @@ -16192,6 +16922,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} glob@10.5.0: @@ -16206,8 +16940,8 @@ snapshots: glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.1.1 + jackspeak: 4.2.3 + minimatch: 10.1.2 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.1 @@ -16293,7 +17027,7 @@ snapshots: rou3: 0.7.12 srvx: 0.10.1 - happy-dom@20.4.0: + happy-dom@20.3.5: dependencies: '@types/node': 24.10.9 '@types/whatwg-mimetype': 3.0.2 @@ -16482,7 +17216,7 @@ snapshots: html-escaper@2.0.2: {} - html-validate@9.4.2(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): + html-validate@9.4.2(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): dependencies: '@html-validate/stylish': 4.3.0 '@sidvind/better-ajv-errors': 3.0.1(ajv@8.17.1) @@ -16493,7 +17227,7 @@ snapshots: prompts: 2.4.2 semver: 7.7.3 optionalDependencies: - vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' + vitest: '@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)' html-void-elements@3.0.0: {} @@ -16529,6 +17263,8 @@ snapshots: human-signals@8.0.1: {} + hyperdyperid@1.2.0: {} + ico-endec@0.1.6: {} iconv-lite@0.4.24: @@ -16603,7 +17339,7 @@ snapshots: ipaddr.js@2.3.0: {} - ipx@3.1.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2): + ipx@3.1.1(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -16619,7 +17355,7 @@ snapshots: sharp: 0.34.5 svgo: 4.0.0 ufo: 1.6.3 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -16878,9 +17614,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: + jackspeak@4.2.3: dependencies: - '@isaacs/cliui': 8.0.2 + '@isaacs/cliui': 9.0.0 jake@10.9.4: dependencies: @@ -17253,8 +17989,8 @@ snapshots: magicast@0.5.1: dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 source-map-js: 1.2.1 make-dir@4.0.0: @@ -17408,6 +18144,23 @@ snapshots: media-typer@1.1.0: {} + memfs@4.56.10(tslib@2.8.1): + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -17636,6 +18389,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.1.2: + dependencies: + '@isaacs/brace-expansion': 5.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -17677,155 +18434,53 @@ snapshots: mocked-exports@0.1.1: {} - module-replacements@2.11.0: {} - - motion-dom@12.29.2: - dependencies: - motion-utils: 12.29.2 - - motion-utils@12.29.2: {} - - motion-v@1.10.2(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)): - dependencies: - '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) - framer-motion: 12.29.2 - hey-listen: 1.0.8 - motion-dom: 12.29.2 - vue: 3.5.27(typescript@5.9.3) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - react - - react-dom - - mrmime@2.0.1: {} - - ms@2.1.3: {} - - muggle-string@0.4.1: {} - - multiformats@9.9.0: {} - - nano-spawn@2.0.0: {} - - nanoid@3.3.11: {} - - nanoid@5.1.6: {} - - nanotar@0.2.0: {} - - napi-build-utils@2.0.0: {} - - natural-compare@1.4.0: {} - - negotiator@1.0.0: {} - - neo-async@2.6.2: {} - - neotraverse@0.6.18: {} - - nitropack@2.13.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.5.0)(rolldown@1.0.0-rc.1): - dependencies: - '@cloudflare/kv-asset-handler': 0.4.2 - '@rollup/plugin-alias': 6.0.0(rollup@4.57.0) - '@rollup/plugin-commonjs': 29.0.0(rollup@4.57.0) - '@rollup/plugin-inject': 5.0.5(rollup@4.57.0) - '@rollup/plugin-json': 6.1.0(rollup@4.57.0) - '@rollup/plugin-node-resolve': 16.0.3(rollup@4.57.0) - '@rollup/plugin-replace': 6.0.3(rollup@4.57.0) - '@rollup/plugin-terser': 0.4.4(rollup@4.57.0) - '@vercel/nft': 1.3.0(rollup@4.57.0) - archiver: 7.0.1 - c12: 3.3.3(magicast@0.5.1) - chokidar: 5.0.0 - citty: 0.1.6 - compatx: 0.2.0 - confbox: 0.2.2 - consola: 3.4.2 - cookie-es: 2.0.0 - croner: 9.1.0 - crossws: 0.3.5 - db0: 0.3.4(better-sqlite3@12.5.0) - defu: 6.1.4 - destr: 2.0.5 - dot-prop: 10.1.0 - esbuild: 0.27.3 - escape-string-regexp: 5.0.0 - etag: 1.8.1 - exsolve: 1.0.8 - globby: 16.1.0 - gzip-size: 7.0.0 - h3: 1.15.5 - hookable: 5.5.3 - httpxy: 0.1.7 - ioredis: 5.9.2 - jiti: 2.6.1 - klona: 2.0.6 - knitwork: 1.3.0 - listhen: 1.9.0 - magic-string: 0.30.21 - magicast: 0.5.1 - mime: 4.1.0 - mlly: 1.8.0 - node-fetch-native: 1.6.7 - node-mock-http: 1.0.4 - ofetch: 1.5.1 - ohash: 2.0.11 - pathe: 2.0.3 - perfect-debounce: 2.1.0 - pkg-types: 2.3.0 - pretty-bytes: 7.1.0 - radix3: 1.1.2 - rollup: 4.57.0 - rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-rc.1)(rollup@4.57.0) - scule: 1.3.0 - semver: 7.7.3 - serve-placeholder: 2.0.2 - serve-static: 2.2.1 - source-map: 0.7.6 - std-env: 3.10.0 - ufo: 1.6.3 - ultrahtml: 1.6.0 - uncrypto: 0.1.3 - unctx: 2.5.0 - unenv: 2.0.0-rc.24 - unimport: 5.6.0 - unplugin-utils: 0.3.1 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) - untyped: 2.0.0 - unwasm: 0.5.3 - youch: 4.1.0-beta.13 - youch-core: 0.3.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bare-abort-controller - - better-sqlite3 - - drizzle-orm - - encoding - - idb-keyval - - mysql2 - - react-native-b4a - - rolldown - - sqlite3 - - supports-color - - uploadthing - - nitropack@2.13.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.6.2)(rolldown@1.0.0-rc.1): + module-replacements@2.11.0: {} + + motion-dom@12.29.2: + dependencies: + motion-utils: 12.29.2 + + motion-utils@12.29.2: {} + + motion-v@1.10.2(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)): + dependencies: + '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) + framer-motion: 12.29.2 + hey-listen: 1.0.8 + motion-dom: 12.29.2 + vue: 3.5.27(typescript@5.9.3) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - react + - react-dom + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + multiformats@9.9.0: {} + + nano-spawn@2.0.0: {} + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + nanotar@0.2.0: {} + + napi-build-utils@2.0.0: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + neo-async@2.6.2: {} + + neotraverse@0.6.18: {} + + nitropack@2.13.1(@upstash/redis@1.36.1)(better-sqlite3@12.5.0)(rolldown@1.0.0-rc.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.57.0) @@ -17846,11 +18501,11 @@ snapshots: cookie-es: 2.0.0 croner: 9.1.0 crossws: 0.3.5 - db0: 0.3.4(better-sqlite3@12.6.2) + db0: 0.3.4(better-sqlite3@12.5.0) defu: 6.1.4 destr: 2.0.5 dot-prop: 10.1.0 - esbuild: 0.27.3 + esbuild: 0.27.2 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.8 @@ -17892,7 +18547,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 5.6.0 unplugin-utils: 0.3.1 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.0-beta.13 @@ -17979,7 +18634,7 @@ snapshots: nuxt-component-meta@0.17.1(magicast@0.5.1): dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) citty: 0.1.6 mlly: 1.8.0 ohash: 2.0.11 @@ -17994,54 +18649,14 @@ snapshots: nuxt-llms@0.2.0(magicast@0.5.1): dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) - transitivePeerDependencies: - - magicast - - nuxt-og-image@5.1.13(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unstorage@1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)): - dependencies: - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@resvg/resvg-js': 2.6.2 - '@resvg/resvg-wasm': 2.6.2 - '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) - '@unocss/core': 66.6.0 - '@unocss/preset-wind3': 66.6.0 - chrome-launcher: 1.2.1 - consola: 3.4.2 - defu: 6.1.4 - execa: 9.6.1 - image-size: 2.0.2 - magic-string: 0.30.21 - mocked-exports: 0.1.1 - nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) - nypm: 0.6.5 - ofetch: 1.5.1 - ohash: 2.0.11 - pathe: 2.0.3 - pkg-types: 2.3.0 - playwright-core: 1.58.1 - radix3: 1.1.2 - satori: 0.18.4 - satori-html: 0.3.2 - sirv: 3.0.2 - std-env: 3.10.0 - strip-literal: 3.1.0 - ufo: 1.6.3 - unplugin: 2.3.11 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) - unwasm: 0.5.3 - yoga-wasm-web: 0.3.3 + '@nuxt/kit': 4.3.0(magicast@0.5.1) transitivePeerDependencies: - magicast - - supports-color - - vite - - vue - nuxt-og-image@5.1.13(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unstorage@1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)): + nuxt-og-image@5.1.13(@unhead/vue@2.1.3(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unstorage@1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)): dependencies: '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@resvg/resvg-js': 2.6.2 '@resvg/resvg-wasm': 2.6.2 '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) @@ -18055,7 +18670,7 @@ snapshots: magic-string: 0.30.21 mocked-exports: 0.1.1 nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) - nypm: 0.6.5 + nypm: 0.6.4 ofetch: 1.5.1 ohash: 2.0.11 pathe: 2.0.3 @@ -18069,7 +18684,7 @@ snapshots: strip-literal: 3.1.0 ufo: 1.6.3 unplugin: 2.3.11 - unstorage: 1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2) + unstorage: 1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2) unwasm: 0.5.3 yoga-wasm-web: 0.3.3 transitivePeerDependencies: @@ -18080,7 +18695,7 @@ snapshots: nuxt-site-config-kit@3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)): dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) pkg-types: 2.3.0 site-config-stack: 3.2.18(vue@3.5.27(typescript@5.9.3)) std-env: 3.10.0 @@ -18091,7 +18706,7 @@ snapshots: nuxt-site-config@3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)): dependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) h3: 1.15.5 nuxt-site-config-kit: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) pathe: 2.0.3 @@ -18103,16 +18718,16 @@ snapshots: - magicast - vue - nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2): dependencies: '@dxup/nuxt': 0.3.2(magicast@0.5.1) '@nuxt/cli': 3.33.0(@nuxt/schema@4.3.1)(cac@6.7.14)(magicast@0.5.1) '@nuxt/devtools': 3.1.1(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@nuxt/nitro-server': 4.3.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.5.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-rc.1)(typescript@5.9.3) + '@nuxt/nitro-server': 4.3.1(@upstash/redis@1.36.1)(better-sqlite3@12.5.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-rc.1)(typescript@5.9.3) '@nuxt/schema': 4.3.1 '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.3.1(magicast@0.5.1)) - '@nuxt/vite-builder': 4.3.1(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2) + '@nuxt/vite-builder': 4.3.1(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(rolldown@1.0.0-rc.1)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2) '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) '@vue/shared': 3.5.27 c12: 3.3.3(magicast@0.5.1) @@ -18229,131 +18844,11 @@ snapshots: - xml2js - yaml - nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2): + nypm@0.6.4: dependencies: - '@dxup/nuxt': 0.3.2(magicast@0.5.1) - '@nuxt/cli': 3.33.0(@nuxt/schema@4.3.1)(cac@6.7.14)(magicast@0.5.1) - '@nuxt/devtools': 3.1.1(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) - '@nuxt/kit': 4.3.1(magicast@0.5.1) - '@nuxt/nitro-server': 4.3.1(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(better-sqlite3@12.6.2)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-rc.1)(typescript@5.9.3) - '@nuxt/schema': 4.3.1 - '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.3.1(magicast@0.5.1)) - '@nuxt/vite-builder': 4.3.1(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@24.10.9)(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(rolldown@1.0.0-rc.1)(rollup@4.57.0)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2) - '@unhead/vue': 2.1.3(vue@3.5.27(typescript@5.9.3)) - '@vue/shared': 3.5.27 - c12: 3.3.3(magicast@0.5.1) - chokidar: 5.0.0 - compatx: 0.2.0 - consola: 3.4.2 - cookie-es: 2.0.0 - defu: 6.1.4 - destr: 2.0.5 - devalue: 5.6.2 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - h3: 1.15.5 - hookable: 5.5.3 - ignore: 7.0.5 - impound: 1.0.0 - jiti: 2.6.1 - klona: 2.0.6 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.0 - nanotar: 0.2.0 - nypm: 0.6.5 - ofetch: 1.5.1 - ohash: 2.0.11 - on-change: 6.0.2 - oxc-minify: 0.112.0 - oxc-parser: 0.112.0 - oxc-transform: 0.112.0 - oxc-walker: 0.7.0(oxc-parser@0.112.0) + citty: 0.2.0 pathe: 2.0.3 - perfect-debounce: 2.1.0 - pkg-types: 2.3.0 - rou3: 0.7.12 - scule: 1.3.0 - semver: 7.7.4 - std-env: 3.10.0 - tinyglobby: 0.2.15 - ufo: 1.6.3 - ultrahtml: 1.6.0 - uncrypto: 0.1.3 - unctx: 2.5.0 - unimport: 5.6.0 - unplugin: 3.0.0 - unplugin-vue-router: 0.19.2(@vue/compiler-sfc@3.5.27)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) - untyped: 2.0.0 - vue: 3.5.27(typescript@5.9.3) - vue-router: 4.6.4(vue@3.5.27(typescript@5.9.3)) - optionalDependencies: - '@parcel/watcher': 2.5.6 - '@types/node': 24.10.9 - transitivePeerDependencies: - - '@arethetypeswrong/core' - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@biomejs/biome' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vitejs/devtools' - - '@vue/compiler-sfc' - - aws4fetch - - bare-abort-controller - - better-sqlite3 - - bufferutil - - cac - - commander - - db0 - - drizzle-orm - - encoding - - eslint - - idb-keyval - - ioredis - - less - - magicast - - meow - - mysql2 - - optionator - - oxlint - - publint - - react-native-b4a - - rolldown - - rollup - - sass - - sass-embedded - - sqlite3 - - stylelint - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - unplugin-lightningcss - - unplugin-unused - - uploadthing - - utf-8-validate - - vite - - vls - - vti - - vue-tsc - - xml2js - - yaml + tinyexec: 1.0.2 nypm@0.6.5: dependencies: @@ -18601,16 +19096,16 @@ snapshots: '@oxfmt/win32-arm64': 0.27.0 '@oxfmt/win32-x64': 0.27.0 - oxlint-tsgolint@0.11.3: + oxlint-tsgolint@0.11.4: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.11.3 - '@oxlint-tsgolint/darwin-x64': 0.11.3 - '@oxlint-tsgolint/linux-arm64': 0.11.3 - '@oxlint-tsgolint/linux-x64': 0.11.3 - '@oxlint-tsgolint/win32-arm64': 0.11.3 - '@oxlint-tsgolint/win32-x64': 0.11.3 - - oxlint@1.42.0(oxlint-tsgolint@0.11.3): + '@oxlint-tsgolint/darwin-arm64': 0.11.4 + '@oxlint-tsgolint/darwin-x64': 0.11.4 + '@oxlint-tsgolint/linux-arm64': 0.11.4 + '@oxlint-tsgolint/linux-x64': 0.11.4 + '@oxlint-tsgolint/win32-arm64': 0.11.4 + '@oxlint-tsgolint/win32-x64': 0.11.4 + + oxlint@1.42.0(oxlint-tsgolint@0.11.4): optionalDependencies: '@oxlint/darwin-arm64': 1.42.0 '@oxlint/darwin-x64': 1.42.0 @@ -18620,7 +19115,7 @@ snapshots: '@oxlint/linux-x64-musl': 1.42.0 '@oxlint/win32-arm64': 1.42.0 '@oxlint/win32-x64': 1.42.0 - oxlint-tsgolint: 0.11.3 + oxlint-tsgolint: 0.11.4 p-all@5.0.1: dependencies: @@ -19454,6 +19949,16 @@ snapshots: rolldown: 1.0.0-rc.1 rollup: 4.57.0 + rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-rc.1)(rollup@4.57.1): + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + source-map: 0.7.6 + yargs: 17.7.2 + optionalDependencies: + rolldown: 1.0.0-rc.1 + rollup: 4.57.1 + rollup@2.79.2: optionalDependencies: fsevents: 2.3.3 @@ -19489,6 +19994,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.0 fsevents: 2.3.3 + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + rope-sequence@1.3.4: {} rou3@0.7.12: {} @@ -20091,6 +20627,10 @@ snapshots: transitivePeerDependencies: - react-native-b4a + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -20138,6 +20678,10 @@ snapshots: dependencies: punycode: 2.3.1 + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -20290,6 +20834,10 @@ snapshots: dependencies: pathe: 2.0.3 + unhead@2.1.2: + dependencies: + hookable: 6.0.1 + unhead@2.1.3: dependencies: hookable: 6.0.1 @@ -20424,7 +20972,7 @@ snapshots: unpipe@1.0.0: {} - unplugin-auto-import@21.0.0(@nuxt/kit@4.3.1(magicast@0.5.1))(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3))): + unplugin-auto-import@21.0.0(@nuxt/kit@4.3.0(magicast@0.5.1))(@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3))): dependencies: local-pkg: 1.1.2 magic-string: 0.30.21 @@ -20433,7 +20981,7 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 optionalDependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) unplugin-utils@0.2.5: @@ -20446,7 +20994,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.3 - unplugin-vue-components@31.0.0(@nuxt/kit@4.3.1(magicast@0.5.1))(vue@3.5.27(typescript@5.9.3)): + unplugin-vue-components@31.0.0(@nuxt/kit@4.3.0(magicast@0.5.1))(vue@3.5.27(typescript@5.9.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.1.2 @@ -20459,11 +21007,11 @@ snapshots: unplugin-utils: 0.3.1 vue: 3.5.27(typescript@5.9.3) optionalDependencies: - '@nuxt/kit': 4.3.1(magicast@0.5.1) + '@nuxt/kit': 4.3.0(magicast@0.5.1) unplugin-vue-router@0.16.2(@vue/compiler-sfc@3.5.27)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)): dependencies: - '@babel/generator': 7.29.1 + '@babel/generator': 7.28.6 '@vue-macros/common': 3.1.2(vue@3.5.27(typescript@5.9.3)) '@vue/compiler-sfc': 3.5.27 '@vue/language-core': 3.2.4 @@ -20488,7 +21036,7 @@ snapshots: unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.27)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)): dependencies: - '@babel/generator': 7.29.1 + '@babel/generator': 7.28.6 '@vue-macros/common': 3.1.2(vue@3.5.27(typescript@5.9.3)) '@vue/compiler-sfc': 3.5.27 '@vue/language-core': 3.2.4 @@ -20528,7 +21076,7 @@ snapshots: dependencies: rolldown: 1.0.0-rc.1 - unstorage@1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2): + unstorage@1.17.4(@upstash/redis@1.36.1)(db0@0.3.4(better-sqlite3@12.5.0))(ioredis@5.9.2): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -20540,26 +21088,9 @@ snapshots: ufo: 1.6.3 optionalDependencies: '@upstash/redis': 1.36.1 - '@vercel/kv': 3.0.0 db0: 0.3.4(better-sqlite3@12.5.0) ioredis: 5.9.2 - unstorage@1.17.4(@upstash/redis@1.36.1)(@vercel/kv@3.0.0)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.2): - dependencies: - anymatch: 3.1.3 - chokidar: 5.0.0 - destr: 2.0.5 - h3: 1.15.5 - lru-cache: 11.2.5 - node-fetch-native: 1.6.7 - ofetch: 1.5.1 - ufo: 1.6.3 - optionalDependencies: - '@upstash/redis': 1.36.1 - '@vercel/kv': 3.0.0 - db0: 0.3.4(better-sqlite3@12.6.2) - ioredis: 5.9.2 - untun@0.1.3: dependencies: citty: 0.1.6 @@ -20672,9 +21203,9 @@ snapshots: - unplugin-unused - yaml - vite-plugin-checker@0.12.0(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.3))(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3)): + vite-plugin-checker@0.12.0(@voidzero-dev/vite-plus-core@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.42.0(oxlint-tsgolint@0.11.4))(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.28.6 chokidar: 4.0.3 npm-run-path: 6.0.0 picocolors: 1.1.1 @@ -20686,7 +21217,7 @@ snapshots: optionalDependencies: eslint: 9.39.2(jiti@2.6.1) optionator: 0.9.4 - oxlint: 1.42.0(oxlint-tsgolint@0.11.3) + oxlint: 1.42.0(oxlint-tsgolint@0.11.4) typescript: 5.9.3 vue-tsc: 3.2.4(typescript@5.9.3) @@ -20730,15 +21261,15 @@ snapshots: vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) vue: 3.5.27(typescript@5.9.3) - vite-plus@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2): + vite-plus@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: '@oxc-project/types': 0.111.0 '@voidzero-dev/vite-plus-core': 0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - '@voidzero-dev/vite-plus-test': 0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + '@voidzero-dev/vite-plus-test': 0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) cac: 6.7.14 oxfmt: 0.27.0 - oxlint: 1.42.0(oxlint-tsgolint@0.11.3) - oxlint-tsgolint: 0.11.3 + oxlint: 1.42.0(oxlint-tsgolint@0.11.4) + oxlint-tsgolint: 0.11.4 optionalDependencies: '@voidzero-dev/vite-plus-darwin-arm64': 0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab '@voidzero-dev/vite-plus-darwin-x64': 0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab @@ -20777,7 +21308,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.57.0 + rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.9 @@ -20787,9 +21318,9 @@ snapshots: terser: 5.46.0 yaml: 2.8.2 - vitest-environment-nuxt@1.0.1(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.4.0)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)): + vitest-environment-nuxt@1.0.1(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.3.5)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)): dependencies: - '@nuxt/test-utils': 4.0.0(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.4.0)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + '@nuxt/test-utils': 4.0.0(@playwright/test@1.58.1)(@voidzero-dev/vite-plus-test@0.0.0-833c515fa25cef20905a7f9affb156dfa6f151ab(@types/node@24.10.9)(esbuild@0.27.3)(happy-dom@20.3.5)(jiti@2.6.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(@vue/test-utils@2.4.6)(happy-dom@20.3.5)(magicast@0.5.1)(playwright-core@1.58.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -20903,7 +21434,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -21003,7 +21534,7 @@ snapshots: dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) '@babel/core': 7.29.0 - '@babel/preset-env': 7.28.6(@babel/core@7.29.0) + '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/runtime': 7.28.6 '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(rollup@2.79.2) '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) diff --git a/test/nuxt/a11y.spec.ts b/test/nuxt/a11y.spec.ts index cc270bd51..de46661af 100644 --- a/test/nuxt/a11y.spec.ts +++ b/test/nuxt/a11y.spec.ts @@ -101,6 +101,7 @@ import { DependencyPathPopup, FilterChips, FilterPanel, + ImpactDependencyBar, HeaderAccountMenu, HeaderConnectorModal, HeaderSearchBox, @@ -551,6 +552,30 @@ describe('component accessibility audits', () => { // component has issues in the test environment (requires DOM measurements that aren't // available during SSR-like test mounting). + describe('ImpactDependencyBar', () => { + const mockPackages = [ + { name: 'vue', version: '3.5.0', size: 2048000 }, + { name: 'lodash', version: '4.17.21', size: 1024000 }, + { name: '@vue/reactivity', version: '3.5.0', size: 512000 }, + ] + + it('should have no accessibility violations with packages', async () => { + const component = await mountSuspended(ImpactDependencyBar, { + props: { packages: mockPackages, packageName: 'vue' }, + }) + const results = await runAxe(component) + expect(results.violations).toEqual([]) + }) + + it('should have no accessibility violations with empty packages', async () => { + const component = await mountSuspended(ImpactDependencyBar, { + props: { packages: [], packageName: 'vue' }, + }) + const results = await runAxe(component) + expect(results.violations).toEqual([]) + }) + }) + describe('PackageChartModal', () => { it('should have no accessibility violations when closed', async () => { const component = await mountSuspended(PackageChartModal, { diff --git a/test/unit/a11y-component-coverage.spec.ts b/test/unit/a11y-component-coverage.spec.ts index 0cc0e40e5..074243846 100644 --- a/test/unit/a11y-component-coverage.spec.ts +++ b/test/unit/a11y-component-coverage.spec.ts @@ -44,6 +44,8 @@ const SKIPPED_COMPONENTS: Record = { 'SkeletonBlock.vue': 'Already covered indirectly via other component tests', 'SkeletonInline.vue': 'Already covered indirectly via other component tests', 'Button/Group.vue': "Wrapper component, tests wouldn't make much sense here", + 'ImpactAnalyzer.vue': + 'Complex component requiring useBundleAnalyzer composable with WebWorker and async bundling context', } /**