diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 095c7e6..1e2d3b8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,6 +51,9 @@ jobs: - name: Install run: nci + - name: Build + run: nr build + - name: Typecheck run: nr typecheck diff --git a/docs/packages/cdn.md b/docs/packages/cdn.md index 29be7c3..e6aaf83 100644 --- a/docs/packages/cdn.md +++ b/docs/packages/cdn.md @@ -1,3 +1,105 @@ # TwoSlash CDN -// TODO: +Run TwoSlash on the browsers or web workers, with [Auto-Type-Acquisition](https://www.typescriptlang.org/play#example/automatic-type-acquisition) from CDN. + +A thin wrapper around `twoslash`, `@typescript/vfs`, `@typescript/ata` to an easy-to-use interface. Huge thanks to the TypeScript team for the heavy-lifting work on [TypeScript Website](https://github.com/microsoft/TypeScript-Website) project. + +[CDN Example](https://twoslash-cdn-examples.netlify.app/) | [Example Source File](https://github.com/antfu/twoslashes/blob/main/packages/twoslash-cdn/examples/index.html) + +## Usage + +```html + +``` + +Or to bundle it your own, + +```bash +npm i -D twoslash-cdn +``` + +```ts twoslash +import { createTwoSlashFromCDN } from 'twoslash-cdn' + +const twoslash = createTwoSlashFromCDN() +// ... +``` + +### Cache Persistence + +By default, the fetched files are stored in a virtual file system in memory. So that multiple runs can share the same cache. If you want to keep them persistent, you can pass a `storage` option to the factory. The storage supports [unstorage](https://github.com/unjs/unstorage)'s interface, where you can adopt the storage to any supported providers. + +```html + +``` + +Refresh the page after loading once, you will see the execution is much faster as the cache is loaded from the local IndexedDB. + +### Synchronize Usage + +Fetching files from CDN is asynchronous, and there is no way to make the whole process synchronous. But if you can run some asynchronous code beforehand, we do provide API to separate the asynchronous part and the synchronous part. + +For example, in [Shikiji](https://shikiji.netlify.app/), the `codeToHtml` function is synchronous as well as the [`shikiji-twoslash` transformer](https://shikiji.netlify.app/packages/twoslash). + +```ts +import { createTwoSlashFromCDN } from 'twoslash-cdn' +import { createHighlighter } from 'shikiji' +import { transformerTwoSlash } from 'shikiji-twoslash' + +const highlighter = await createHighlighter({}) + +const twoslash = createTwoSlashFromCDN() + +const code = ` +import { ref } from 'vue' +const foo = ref(1) +// ^? +` + +// Load all necessary types from CDN before hand +await twoslash.prepreTypes(code) + +// This can be done synchronously +const highlighted = highlighter.codeToHtml(code, { + lang: 'ts', + theme: 'dark-plus', + transformers: [ + transformerTwoSlash({ + // Use `twoslash.runSync` to replace the non-CDN `twoslasher` function + twoslasher: twoslash.runSync + }) + ], +}) +``` diff --git a/package.json b/package.json index e4d4902..9287a99 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "simple-git-hooks": "^2.9.0", "tslib": "^2.6.2", "twoslash": "workspace:*", + "twoslash-cdn": "workspace:*", "twoslash-vue": "workspace:*", "typescript": "^5.3.3", "unbuild": "^2.0.0", diff --git a/packages/twoslash-cdn/README.md b/packages/twoslash-cdn/README.md new file mode 100644 index 0000000..74868d5 --- /dev/null +++ b/packages/twoslash-cdn/README.md @@ -0,0 +1,19 @@ +# twoslash-cdn + +[![npm version][npm-version-src]][npm-version-href] +[![npm downloads][npm-downloads-src]][npm-downloads-href] + +Run TwoSlash on the browsers or web workers, with [Auto-Type-Acquisition](https://www.typescriptlang.org/play#example/automatic-type-acquisition) from CDN. + +[📚 Documentation](https://twoslash.netlify.app/packages/cdn) + +## License + +[MIT](./LICENSE) License © 2023-PRESENT [Anthony Fu](https://github.com/antfu) + + + +[npm-version-src]: https://img.shields.io/npm/v/twoslash-cdn?style=flat&colorA=080f12&colorB=1fa669 +[npm-version-href]: https://npmjs.com/package/twoslash-cdn +[npm-downloads-src]: https://img.shields.io/npm/dm/twoslash-cdn?style=flat&colorA=080f12&colorB=1fa669 +[npm-downloads-href]: https://npmjs.com/package/twoslash-cdn diff --git a/packages/twoslash-cdn/build.config.ts b/packages/twoslash-cdn/build.config.ts new file mode 100644 index 0000000..e600aa6 --- /dev/null +++ b/packages/twoslash-cdn/build.config.ts @@ -0,0 +1,13 @@ +import { defineBuildConfig } from 'unbuild' + +export default defineBuildConfig({ + entries: [ + 'src/index', + ], + declaration: true, + clean: true, + rollup: { + emitCJS: false, + inlineDependencies: true, + }, +}) diff --git a/packages/twoslash-cdn/examples/index.html b/packages/twoslash-cdn/examples/index.html new file mode 100644 index 0000000..2bfd8a1 --- /dev/null +++ b/packages/twoslash-cdn/examples/index.html @@ -0,0 +1,86 @@ + + + + + + + TwoSlash + Shikiji on CDN Example + + + + + +

+ This is an example of running + TwoSlash + + Shikiji on CDN. This page is + + a single static HTML file. +

+
Loading...
+ + + diff --git a/packages/twoslash-cdn/package.json b/packages/twoslash-cdn/package.json new file mode 100644 index 0000000..db746d0 --- /dev/null +++ b/packages/twoslash-cdn/package.json @@ -0,0 +1,64 @@ +{ + "name": "twoslash-cdn", + "type": "module", + "version": "0.0.2", + "description": "Run TwoSlash on the browser, with Auto-Type-Acquisition on CDN.", + "author": "Anthony Fu ", + "license": "MIT", + "funding": "https://github.com/sponsors/antfu", + "homepage": "https://github.com/twoslashes/twoslash#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/twoslashes/twoslash.git", + "directory": "packages/twoslash-cdn" + }, + "bugs": "https://github.com/twoslashes/twoslash/issues", + "keywords": [ + "typescript", + "twoslash" + ], + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs" + } + }, + "main": "./dist/index.mjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "*": [ + "./dist/*", + "./dist/index.d.ts" + ] + } + }, + "files": [ + "dist" + ], + "scripts": { + "play": "nr -C playground dev", + "build": "unbuild", + "dev": "unbuild --stub", + "lint": "eslint .", + "prepublishOnly": "nr build" + }, + "peerDependencies": { + "typescript": "*" + }, + "dependencies": { + "twoslash": "workspace:*" + }, + "devDependencies": { + "@typescript/ata": "^0.9.4", + "@typescript/vfs": "^1.5.0", + "twoslash-cdn": "workspace:*", + "typescript": "^5.3.3", + "unbuild": "^2.0.0", + "unstorage": "^1.10.1", + "vite": "^5.0.10", + "vitest": "^1.0.4" + } +} diff --git a/packages/twoslash-cdn/playground/.gitignore b/packages/twoslash-cdn/playground/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/packages/twoslash-cdn/playground/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/twoslash-cdn/playground/index.html b/packages/twoslash-cdn/playground/index.html new file mode 100644 index 0000000..36dc022 --- /dev/null +++ b/packages/twoslash-cdn/playground/index.html @@ -0,0 +1,24 @@ + + + + + + TwoSlash + Shikiji on CDN Example + + + + +
Loading...
+ + + diff --git a/packages/twoslash-cdn/playground/main.ts b/packages/twoslash-cdn/playground/main.ts new file mode 100644 index 0000000..974cc76 --- /dev/null +++ b/packages/twoslash-cdn/playground/main.ts @@ -0,0 +1,39 @@ +import 'shikiji-twoslash/style-rich.css' +import { createTransformerFactory, rendererRich } from 'shikiji-twoslash/core' +import { codeToHtml } from 'shikiji' +import { createStorage } from 'unstorage' +import indexedDbDriver from 'unstorage/drivers/indexedb' +import { createTwoSlashFromCDN } from 'twoslash-cdn' + +const storage = createStorage({ + driver: indexedDbDriver({ base: 'twoslash-cdn:' }), +}) + +const twoslash = createTwoSlashFromCDN({ + storage, + compilerOptions: { + lib: ['esnext', 'dom'], + }, +}) + +const source = ` +import { ref } from 'vue' + +console.log("Hi! Shiki on CDN :)") + +const count = ref(0) +// ^? +` + +await twoslash.prepareTypes(source) + +const app = document.getElementById('app')! +app.innerHTML = await codeToHtml(source, { + lang: 'ts', + theme: 'vitesse-dark', + transformers: [ + createTransformerFactory(twoslash.runSync)({ + renderer: rendererRich(), + }), + ], +}) diff --git a/packages/twoslash-cdn/playground/package.json b/packages/twoslash-cdn/playground/package.json new file mode 100644 index 0000000..378a428 --- /dev/null +++ b/packages/twoslash-cdn/playground/package.json @@ -0,0 +1,18 @@ +{ + "name": "playground", + "type": "module", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "shikiji": "^0.9.9", + "shikiji-twoslash": "^0.9.9" + }, + "devDependencies": { + "idb-keyval": "^6.2.1", + "vite": "^5.0.10" + } +} diff --git a/packages/twoslash-cdn/src/index.ts b/packages/twoslash-cdn/src/index.ts new file mode 100644 index 0000000..775ffc7 --- /dev/null +++ b/packages/twoslash-cdn/src/index.ts @@ -0,0 +1,182 @@ +import type { TwoSlashExecuteOptions, TwoSlashFunction, TwoSlashOptions, TwoSlashReturn } from 'twoslash' +import { createTwoSlasher } from 'twoslash' +import * as ts from 'typescript/lib/tsserverlibrary' +import { createDefaultMapFromCDN } from '@typescript/vfs' +import { setupTypeAcquisition } from '@typescript/ata' + +/** + * A subset of `unstorage`'s interface to maximize the compatibility + * + * @see https://github.com/unjs/unstorage + */ +export interface PesudoStorage { + getItemRaw: (key: string) => string | Promise + setItemRaw: (key: string, value: string) => void | Promise +} + +export interface TwoSlashCdnOptions { + /** + * Storage for persistent caching + * + * Supports `unstorage`'s interface + * @see https://github.com/unjs/unstorage + */ + storage?: PesudoStorage + + /** + * TypeScript compiler options + */ + compilerOptions?: ts.CompilerOptions + + /** + * TwoSlash options Overrides + * + * Options `tsModule`, `lzstringModule` and `fsMap` are controlled by this function + */ + twoSlashOptionsOverrides?: Omit + + /** + * A map of file paths to virtual file contents + */ + fsMap?: Map + + /** + * Custom fetch function. When `unstorage` is provided, we will wrap the fetch function to cache the response. + */ + fetcher?: typeof fetch +} + +export interface TwoSlashCdnReturn { + /** + * Run auto type acquisition and then twoslash on the given code + */ + run: (code: string, extension?: string, options?: TwoSlashExecuteOptions) => Promise + + /** + * Run twoslasher on the given code, without running ATA + */ + runSync: TwoSlashFunction + + /** + * Runs Auto-Type-Acquisition (ATA) on the given code, the async operation before running twoslash + * @param code + */ + prepareTypes: (source: string) => Promise + + /** + * Load the default TypeScript types library from CDN + * Automatically called by `run` and `prepareTypes` + */ + init: () => Promise + + /** + * The fetch function used by the instance + */ + fetcher: typeof fetch +} + +export function createTwoSlashFromCDN(options: TwoSlashCdnOptions = {}): TwoSlashCdnReturn { + const fetcher = ( + options.storage + ? createCachedFetchFromStorage(options.storage, options.fetcher || fetch) + : options.fetcher || fetch + ) + const fsMap = options.fsMap || new Map() + + let initPromise: Promise | undefined + async function _init() { + const newMap = await createDefaultMapFromCDN( + options.compilerOptions || {}, + ts.version, + false, + ts, + undefined, + fetcher, + ) + + newMap.forEach((value, key) => { + fsMap.set(key, value) + }) + } + + function init() { + if (!initPromise) + initPromise = _init() + return initPromise + } + + const ata = setupTypeAcquisition({ + projectName: 'twoslash-cdn', + typescript: ts, + fetcher, + delegate: { + receivedFile: (code: string, path: string) => { + // console.log("ATA received", path); + fsMap.set(path, code) + }, + }, + }) + + async function prepareTypes(code: string) { + await Promise.all([ + init(), + ata(code), + ]) + } + + const twoslasher = createTwoSlasher({ + ...options.twoSlashOptionsOverrides, + tsModule: ts, + fsMap, + }) + + async function run(source: string, extension?: string, localOptions?: TwoSlashExecuteOptions) { + await prepareTypes(source) + return runSync(source, extension, localOptions) + } + + function runSync(source: string, extension?: string, localOptions?: TwoSlashExecuteOptions) { + return twoslasher(source, extension, { + ...options.twoSlashOptionsOverrides, + ...localOptions, + }) + } + + return { + run, + runSync, + init, + prepareTypes, + fetcher, + } +} + +/** + * Create a cached fetch function from an unstorage instance + * + * @see https://github.com/unjs/unstorage + * @param storage + * @param nativeFetch + */ +export function createCachedFetchFromStorage( + storage: PesudoStorage, + nativeFetch: typeof fetch = fetch, +): typeof fetch { + return (async (url: string, init?: RequestInit) => { + const shouldCache = !init || (init?.method === 'GET' && init?.cache !== 'no-store') + const cached = shouldCache + ? await storage.getItemRaw(url) + : undefined + if (cached != null) { + // console.log("cached", url); + return new Response(cached as any, init) + } + else { + // console.log("fetching", url); + const response = await nativeFetch(url, init) + if (shouldCache) + response.clone().text().then(text => storage.setItemRaw(url, text)) + return response + } + }) as any +} diff --git a/packages/twoslash-vue/README.md b/packages/twoslash-vue/README.md index 100560d..a366b46 100644 --- a/packages/twoslash-vue/README.md +++ b/packages/twoslash-vue/README.md @@ -8,29 +8,7 @@ Extended TwoSlash for Vue SFC support. > [!IMPORTANT] > Working in Progress. -## Install - -```bash -npm i twoslash-vue -``` - -## Usage - -The function supercharges `twoslasher` function from `twoslash` to support the `vue` extension, while fallback to the original behavior for other extensions. - -## TODOs - -- [x] Support Vue SFC -- [ ] Support marker in Vue SFC (because the compile code no longer have the same position, we need a way to mark it back) -- [ ] Support markers in Vue Template (via html comment maybe?) - -## Sponsors - -

- - - -

+[📚 Documentation](https://twoslash.netlify.app/packages/vue) ## License diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 328cc9e..a836a3a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,6 +85,9 @@ importers: twoslash: specifier: workspace:* version: link:packages/twoslash + twoslash-cdn: + specifier: workspace:* + version: link:packages/twoslash-cdn twoslash-vue: specifier: workspace:* version: link:packages/twoslash-vue @@ -144,6 +147,37 @@ importers: specifier: ^1.1.3 version: 1.1.3 + packages/twoslash-cdn: + dependencies: + twoslash: + specifier: workspace:* + version: link:../twoslash + devDependencies: + '@typescript/ata': + specifier: ^0.9.4 + version: 0.9.4(typescript@5.3.3) + '@typescript/vfs': + specifier: ^1.5.0 + version: 1.5.0 + twoslash-cdn: + specifier: workspace:* + version: 'link:' + typescript: + specifier: ^5.3.3 + version: 5.3.3 + unbuild: + specifier: ^2.0.0 + version: 2.0.0(typescript@5.3.3) + unstorage: + specifier: ^1.10.1 + version: 1.10.1 + vite: + specifier: ^5.0.10 + version: 5.0.11(@types/node@20.11.0)(sass@1.69.7) + vitest: + specifier: ^1.0.4 + version: 1.2.0(@types/node@20.11.0) + packages/twoslash-vue: dependencies: '@vue/language-core': @@ -1045,6 +1079,10 @@ packages: - supports-color dev: false + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: true + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1110,6 +1148,147 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.16.0 + /@parcel/watcher-android-arm64@2.3.0: + resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + dev: true + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher@2.3.0: + resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.3.0 + '@parcel/watcher-darwin-arm64': 2.3.0 + '@parcel/watcher-darwin-x64': 2.3.0 + '@parcel/watcher-freebsd-x64': 2.3.0 + '@parcel/watcher-linux-arm-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-musl': 2.3.0 + '@parcel/watcher-linux-x64-glibc': 2.3.0 + '@parcel/watcher-linux-x64-musl': 2.3.0 + '@parcel/watcher-win32-arm64': 2.3.0 + '@parcel/watcher-win32-ia32': 2.3.0 + '@parcel/watcher-win32-x64': 2.3.0 + dev: true + /@polka/url@1.0.0-next.24: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} dev: false @@ -1605,6 +1784,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript/ata@0.9.4(typescript@5.3.3): + resolution: {integrity: sha512-PaJ16WouPV/SaA+c0tnOKIqYq24+m93ipl/e0Dkxuianer+ibc5b0/6ZgfCFF8J7QEp57dySMSP9nWOFaCfJnw==} + peerDependencies: + typescript: ^4.4.4 + dependencies: + typescript: 5.3.3 + dev: true + /@typescript/twoslash@3.2.4(typescript@5.3.3): resolution: {integrity: sha512-/TCIOuPQaKltzUUT1qJo6mplYwjbAxkaSFvkeZD3FeFt3Ovt+HJi8xisu8rcLyDRmM3VJ0+jAx+AAICwn4Zlhw==} peerDependencies: @@ -2463,6 +2650,15 @@ packages: string-width: 7.0.0 dev: true + /clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + dev: true + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2472,6 +2668,11 @@ packages: wrap-ansi: 7.0.0 dev: true + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} requiresBuild: true @@ -2534,6 +2735,10 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + dev: true + /core-js-compat@3.35.0: resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} dependencies: @@ -2712,6 +2917,11 @@ packages: /defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: true + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2720,6 +2930,12 @@ packages: /destr@2.0.2: resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + /devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: @@ -3486,6 +3702,10 @@ packages: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true + /get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + dev: true + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -3600,6 +3820,19 @@ packages: duplexer: 0.1.2 dev: false + /h3@1.10.0: + resolution: {integrity: sha512-Tw1kcIC+AeimwRmviiObaD5EB430Yt+lTgOxLJxNr96Vd/fGRu04EF7aKfOAcpwKCI+U2JlbxOLhycD86p3Ciw==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.4 + destr: 2.0.2 + iron-webcrypto: 1.0.0 + radix3: 1.1.0 + ufo: 1.3.2 + uncrypto: 0.1.3 + unenv: 1.9.0 + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3634,6 +3867,11 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3681,6 +3919,27 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /iron-webcrypto@1.0.0: + resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} + dev: true + /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} dev: true @@ -3719,6 +3978,12 @@ packages: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} dev: true + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3750,6 +4015,14 @@ packages: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} dev: true + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true @@ -3779,6 +4052,20 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + + /is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + dependencies: + system-architecture: 0.1.0 + dev: true + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3943,6 +4230,29 @@ packages: - supports-color dev: true + /listhen@1.5.6: + resolution: {integrity: sha512-gTpEJhT5L85L0bFgmu+Boqu5rP4DwDtEb4Exq5gdQUxWRwx4jbzdInZkmyLONo5EwIcQB0k7ZpWlpCDPdL77EQ==} + hasBin: true + dependencies: + '@parcel/watcher': 2.3.0 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.5 + clipboardy: 4.0.0 + consola: 3.2.3 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.10.0 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.5.0 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.7.0 + ufo: 1.3.2 + untun: 0.1.3 + uqr: 0.1.2 + dev: true + /listr2@8.0.0: resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} engines: {node: '>=18.0.0'} @@ -3980,6 +4290,14 @@ packages: dependencies: p-locate: 5.0.0 + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: true + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: true + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -4023,6 +4341,11 @@ packages: get-func-name: 2.0.2 dev: true + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -4427,6 +4750,12 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4560,9 +4889,18 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /node-addon-api@7.0.0: + resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} + dev: true + /node-fetch-native@1.6.1: resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -4621,7 +4959,6 @@ packages: destr: 2.0.2 node-fetch-native: 1.6.1 ufo: 1.3.2 - dev: false /ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -5146,6 +5483,10 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} + dev: true + /rc9@2.1.1: resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} dependencies: @@ -5189,6 +5530,18 @@ packages: dependencies: picomatch: 2.3.1 + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: true + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: true + /regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -5462,6 +5815,10 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: true + /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true @@ -5575,6 +5932,11 @@ packages: picocolors: 1.0.0 dev: true + /system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + dev: true + /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false @@ -5756,9 +6118,23 @@ packages: mlly: 1.5.0 dev: false + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.1 + pathe: 1.1.2 + dev: true + /unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: @@ -5880,6 +6256,71 @@ packages: webpack-virtual-modules: 0.6.1 dev: true + /unstorage@1.10.1: + resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^4.0.0 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.3.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.16.0 + '@capacitor/preferences': ^5.0.6 + '@netlify/blobs': ^6.2.0 + '@planetscale/database': ^1.11.0 + '@upstash/redis': ^1.23.4 + '@vercel/kv': ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.10.0 + ioredis: 5.3.2 + listhen: 1.5.6 + lru-cache: 10.1.0 + mri: 1.2.0 + node-fetch-native: 1.6.1 + ofetch: 1.3.3 + ufo: 1.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + dependencies: + citty: 0.1.5 + consola: 3.2.3 + pathe: 1.1.2 + dev: true + /untyped@1.4.0: resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==} hasBin: true @@ -5905,6 +6346,10 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: