diff --git a/.npmrc b/.npmrc index 59b05522..ae90f705 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ ignore-workspace-root-check=true -use-node-version=18.16.0 diff --git a/README.md b/README.md index ddb2e189..c4ddc399 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,21 @@

Next gen framework for developing web extensions.
Powered by Vite. Inspired by Nuxt.

-![Example CLI Output](./.github/assets/cli-output.png) +![Example CLI Output](./docs/assets/cli-output.png) ## Features - 🌐 Supports all browsers - ✅ Supports both MV2 and MV3 -- 📂 Directory based entrypoints - ⚡ Dev mode with HMR & auto-reload +- 📂 File based entrypoints - 🚔 TypeScript - 🦾 Auto-imports - ⬇️ Download and bundle remote URL imports +- 🎨 Frontend framework agnostic: works with Vue, React, Svelte, etc ### Todo -- 🎨 Frontend framework agnostic: works with Vue, React, Svelte, etc - 🖍️ Quickly bootstrap a new project - 📏 Bundle analysis - 🤖 Automated publishing diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 00000000..e255852e --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,35 @@ +import { defineConfig } from 'vitepress'; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: 'WXT', + description: 'Next gen framework for developing web extensions', + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: 'Get Started', link: '/get-started/installation.md' }, + { text: 'Guide', link: '/guide.md' }, + { text: 'API', link: '/api.md' }, + ], + + sidebar: { + '/get-started/': [ + { + text: 'Guide', + items: [ + { text: 'Introduction', link: '/get-started/introduction.md' }, + { text: 'Installation', link: '/get-started/installation.md' }, + { text: 'Configuration', link: '/get-started/configuration.md' }, + { text: 'Entrypoints', link: '/get-started/entrypoints.md' }, + { text: 'Assets', link: '/get-started/assets.md' }, + { text: 'Build Targets', link: '/get-started/build-targets.md' }, + { text: 'Publishing', link: '/get-started/publishing.md' }, + { text: 'Testing', link: '/get-started/testing.md' }, + ], + }, + ], + }, + + socialLinks: [{ icon: 'github', link: 'https://github.com/aklinker1/wxt' }], + }, +}); diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 00000000..ce969b39 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,5 @@ +# API Reference + +:::warning 🚧 Under construction +This documentation does not exist yet. +::: diff --git a/.github/assets/cli-output.png b/docs/assets/cli-output.png similarity index 100% rename from .github/assets/cli-output.png rename to docs/assets/cli-output.png diff --git a/docs/get-started/assets.md b/docs/get-started/assets.md new file mode 100644 index 00000000..d844f994 --- /dev/null +++ b/docs/get-started/assets.md @@ -0,0 +1,85 @@ +# Assets + +WXT has two directories for storing assets like CSS, images, or fonts. + +- `/public`: Store files that will be copied into the output directory as-is +- `/assets`: Store files that will be processed by Vite during the build process + +## `/public` Directory + +Place static files like the extension icon or `_locales/` directory here. These files will be copied over to the output directory without being transformed by Vite. + +``` + +└─ public/ + ├─ icon-16.png + ├─ icon-32.png + ├─ icon-48.png + ├─ icon-96.png + └─ icon-128.png +``` + +### Example + +You can reference these files by using absolute paths in HTML files or `browser.runtime.getURL` in content scripts. + +:::code-group + +```html [popup.html] + +``` + +```ts [content.ts] +defineContentScript({ + main() { + const image = document.createElement('img'); + image.src = browser.runtime.getURL('/icon-128.png'); + document.body.append(image); + }, +}); +``` + +::: + +## `/assets` Directory + +Files in the assets directory will be processed by Vite. They are imported in your source code, and will be transformed or renamed in the output directory. + +``` + +└─ assets/ + ├─ style.css + └─ illustration.svg +``` + +### Example + +:::code-group + +```html [popup.html] + + + + + + + + + + +``` + +```ts [content.ts] +import '~/assets/style.css'; +import illustration from '~/assets/style.svg'; + +defineContentScript({ + main() { + const image = document.createElement('img'); + image.src = illustration; + document.body.append(image); + }, +}); +``` + +::: diff --git a/docs/get-started/build-targets.md b/docs/get-started/build-targets.md new file mode 100644 index 00000000..a5c745d9 --- /dev/null +++ b/docs/get-started/build-targets.md @@ -0,0 +1,46 @@ +# Build Targets + +You can build an extension for any combination of browser and manifest verison. Different browsers and manifest versions support different APIs and entrypoints, so be sure to check that your extension functions as expected for each target. + +Separate build targets are to separate output directories: + +``` + +└─ .output + ├─ chrome-mv3 + ├─ firefox-mv2 + ├─ edge-mv3 + └─ ... +``` + +## Target Browser + +To build for a specific browser, pass the `-b --browser` flag from the CLI: + +``` + +wxt --browser firefox +wxt build --browser firefox + +``` + +By default, it will build for `chrome`. When excluding the [`--mv2` or `--mv3` flags](#target-manifest-version), it will default to the commonly accepted version used with that browser. + +| Browser | Default Manifest Version | +| ---------------- | :----------------------: | +| `chrome` | 3 | +| `firefox` | 2 | +| `safari` | 2 | +| `edge` | 3 | +| Any other string | 3 | + +## Target Manifest Version + +To build for a specific manifest version, pass either the `--mv2` flag or `--mv3` flag from the CLI. + +```sh +wxt --mv2 +wxt build --mv2 +``` + +When the `-b --browser` flag is not passed, it defaults to `chrome`. So here, we're targetting MV2 for Chrome. diff --git a/docs/get-started/configuration.md b/docs/get-started/configuration.md new file mode 100644 index 00000000..52e5a2c4 --- /dev/null +++ b/docs/get-started/configuration.md @@ -0,0 +1,62 @@ +# Configuration + +WXT's behavior can be configured via the `wxt.config.ts` file. In this file, you can add Vite plugins, change the directory strucutre of your project, and provide permissions or other fields to the `/manifest.json`. + +However, since WXT is an opinionated framework, some things cannot be configured. + +## Config File + +To configure WXT, create a `wxt.config.ts` file in your project root. It should have the following contents: + +```ts +import { defineConfig } from 'wxt'; + +export default defineConfig({ + // My WXT config +}); +``` + +:::info +See the [API reference](/api.md) for a full list of options. +::: + +## Directory Config + +WXT allows you to edit several directories to your liking: + +- `root` (default: `process.cwd()`) - Root of the WXT project +- `srcDir` (default: ``) - Location of all your source code +- `entrypointsDir` (default: `/entrypoints`) - Folder containing all the entrypoints. +- `publicDir` (default: `/public`) - Folder containing [public assets](/get-started/assets.md) + +### Example + +If you want a `src/` directory to contain all your source code, and you want to rename `entrypoints/` to `entries/`, your config would look like this: + +```ts +import { defineConfig } from 'wxt'; + +export default defineConfig({ + srcDir: 'src', + entrypointsDir: 'entries', +}); +``` + +## Vite Config + +Vite is the bundler used to build each part of an extension. Vite can be configured via the `vite` option. + +### Example + +A common reason to configure Vite is to add plugins: + +```ts +import { defineConfig } from 'wxt'; +import vue from '@vitejs/plugin-vue'; + +export default defineConfig({ + vite: { + plugins: [vue()], + }, +}); +``` diff --git a/docs/get-started/entrypoints.md b/docs/get-started/entrypoints.md new file mode 100644 index 00000000..9f3e452f --- /dev/null +++ b/docs/get-started/entrypoints.md @@ -0,0 +1,89 @@ +# Defining Entrypoints + +Entrypoints are any HTML, JS, or CSS file that needs to be bundled and included with the extension. + +They may or may not be listed in the extension's `manifest.json`. + +## `/entrypoints` Directory + +In WXT, entrypoints are defined by adding a file to the `entrypoints/` directory. + +For example, a project that looks like this: + +``` + +├─ entrypoints/ +│ ├─ background.ts +│ ├─ content.ts +│ ├─ injected.ts +│ └─ popup.html +└─ wxt.config.ts +``` + +would result in the following `manifest.json`: + +```json +{ + // ... + "manifest_version": 3, + "action": { + // ... + "default_popup": "popup.html" + }, + "background": { + // ... + "service_worker": "background.js" + }, + "content_scripts": [ + { + // ... + "js": ["content-scripts/content.js"] + } + ] +} +``` + +If a file uses a [special name recognized by WXT](/get-started/entrypoints.md), it will be added to the manifest. In this case: + +- `popup.html` → `action.default_popup` +- `content.ts` → `content_scripts.*.js` +- `background.ts` → `background.service_worker` + +But not all entrypoints are added to the `manifest.json`. If they have a name that is not recognized by WXT, they are still built and included in the extension, but they are unlisted and do not show up in the manifest. + +In this case, `injected.ts` gets bundled to `/injected.js` and is accessible via `browser.runtime.getURL("/injected.js")`. + +:::info +See [`/entrypoints` folder](/get-started/entrypoints.md) documentation for a full list of recognized entrypoint filenames. +::: + +## Entrypoint Options + +Some entrypoints, like content scripts, actions, or the background, can recieve additional options. + +In HTML files, options are listed as `meta` tags: + +```html + + + + + + +``` + +In TS files, options are apart of the file's default export: + +```ts +export default defineContentScript({ + matches: ['*://*.google.com/*'], + runAt: 'document_start', + main() { + // ... + }, +}); +``` + +:::info +For a full list of entrypoints and each of their options, see the [`/entrypoints` folder](/get-started/entrypoints.md) documentation. +::: diff --git a/docs/get-started/installation.md b/docs/get-started/installation.md new file mode 100644 index 00000000..f277a6a6 --- /dev/null +++ b/docs/get-started/installation.md @@ -0,0 +1,98 @@ +# Installation + +Bootstrap a new project or start from scratch. + +## Bootstrap Project + +:::warning 🚧 This feature is not implemented yet! + +See [From Scratch](#from-scratch) instead. + +::: + +:::code-group + +```sh [pnpm] +pnpx wxt@latest init +``` + +```sh [npm] +npx wxt@latest init +``` + +::: + +## From Scratch + +Create a new NPM project: + +:::code-group + +```sh [pnpm] +pnpm init +cd +echo 'shamefully-hoist=true' >> .npmrc +``` + +```sh [npm] +npm init +cd +``` + +```sh [yarn] +yarn init +cd +``` + +::: + +Then install `wxt`: + +:::code-group + +```sh [pnpm] +pnpm add wxt +``` + +```sh [npm] +npm i --save wxt +``` + +```sh [yarn] +yarn add wxt +``` + +::: + +Finally, add `package.json` scripts: + +```json +{ + "scripts": { + "dev": "wxt", + "dev:firefox": "wxt --browser firefox", + "build": "wxt build", + "build:firefox": "wxt build --browser firefox" + } +} +``` + +## Development + +Once you've installed WXT, you can start the development server using the `dev` command: + +```sh +pnpm dev +``` + +:::tip 🎉 Well done! + +The dev command will build the extension for development, open the browser, and reload the different parts of the extension when you save changes. +::: + +## Next Steps + +Now that your WXT project is setup, you're ready to build a out your web extension! + +- Learn how to [add entrypoints](./entrypoints.md) like the popup, background, or content scripts +- [Configure WXT](./configuration.md) by creating a `wxt.config.ts` file diff --git a/docs/get-started/introduction.md b/docs/get-started/introduction.md new file mode 100644 index 00000000..998263a0 --- /dev/null +++ b/docs/get-started/introduction.md @@ -0,0 +1,32 @@ +# Introduction + +WXT is a free and open source framework for building web extensions in an conventional, intuative, and safe way **_for all browsers_**. + +WXT comes with full TypeScript support and auto-imports. Sounds familiar? That's right, **_WXT was based off of Nuxt_** and aims to provide the same greate DX and features. + +![Example build output](../assets/cli-output.png) + +## Conventions + +WXT is an optionated framework. This helps keep projects consistent and easy to pick up. + +- **Generated manifest**: Based on your project's file structure +- **Entrypoint configuration**: Configure entrypoints from the same file they're declare in +- **Type-safety is a priority**: Out-of-the-box TypeScript support with improved browser API typing +- **Simple output file structure**: Ouptut file paths minimize the path at runtime + +## Development + +WXT's dev server supports modern features like HMR to provide a lighting fast dev mode. + +When changes can't be hot-reloaded, like content scripts or background scripts, they're reloaded individually to prevent reloading the entire extension and slowing down your development cycle. + +## Production-ready + +Production builds are optimized for store review, changing as few files as possible between builds. + +In addition, WXT fully supports Firefox's source code requirements when using a bundler. It will automatically create and upload a ZIP file of your source code. + +:::info +See [Publishing](./publishing.md) for more info around production builds. +::: diff --git a/docs/get-started/publishing.md b/docs/get-started/publishing.md new file mode 100644 index 00000000..379b6509 --- /dev/null +++ b/docs/get-started/publishing.md @@ -0,0 +1,5 @@ +# Publishing + +:::warning 🚧 Not implemented yet! +For now, manually zip the output directory and upload to stores by hand. +::: diff --git a/docs/get-started/testing.md b/docs/get-started/testing.md new file mode 100644 index 00000000..d0c9eaad --- /dev/null +++ b/docs/get-started/testing.md @@ -0,0 +1,5 @@ +# Testing + +:::warning 🚧 Testing utils are not implemented yet! +Eventually, the plan is to have an integration with Vitest. +::: diff --git a/docs/guide.md b/docs/guide.md new file mode 100644 index 00000000..ba638049 --- /dev/null +++ b/docs/guide.md @@ -0,0 +1,5 @@ +# Guide + +:::warning 🚧 Under construction +This documentation does not exist yet. +::: diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..4b208671 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,49 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home +titleTemplate: 'Next Generation Web Extension Framework' + +hero: + name: WXT + text: Next gen framework for web extensions + tagline: Powered by Vite, inspired by Nuxt. + actions: + - theme: brand + text: Get Started + link: /get-started/installation + - theme: alt + text: Learn More + link: /get-started/introduction + +features: + - icon: 🌐 + title: Supported Browsers + details: Chrome, Firefox, Edge, Safari, and any Chromium based browser. + - icon: ✅ + title: MV2 and MV3 + details: Supports both manifest versions for each browser. + - icon: ⚡ + title: Fast Dev Mode + details: HMR for UIs and fast reload for background and content scripts. + - icon: 📂 + title: File Based Entrypoints + details: Manifest is generated based on files inside the project. + - icon: 🚔 + title: TypeScript + details: Scale projects with full TS support. + - icon: 🦾 + title: Auto-imports + details: Nuxt-like auto-imports to speed up development. + - icon: ⬇️ + title: Bundle Remote Code + details: Downloads and bundles remote code imported from URLs. + - icon: 🎨 + title: Frontend framework agnostic + details: Works with any front-end framework with a Vite plugin. + - icon: 🤖 + title: Automated Publishing + details: 'TODO: Automatically zip, upload, and release extensions.' + - icon: 📏 + title: Bundle analysis + details: 'TODO: Tools for analyizing the final extension bundle.' +--- diff --git a/e2e/utils.ts b/e2e/utils.ts index 24c5c9df..d42bb8af 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -55,6 +55,7 @@ export class TestProject { */ addFile(filename: string, content?: string) { this.files.push([filename, content ?? '']); + if (filename === 'wxt.config.ts') this.config = {}; } /** @@ -63,15 +64,13 @@ export class TestProject { async build(config: InlineConfig = {}) { if (this.config == null) this.setConfigFileConfig(); - await Promise.all( - this.files.map(async (file) => { - const [name, content] = file; - const filePath = resolve(this.root, name); - const fileDir = dirname(filePath); - await fs.ensureDir(fileDir); - await fs.writeFile(filePath, content ?? '', 'utf-8'); - }), - ); + for (const file of this.files) { + const [name, content] = file; + const filePath = resolve(this.root, name); + const fileDir = dirname(filePath); + await fs.ensureDir(fileDir); + await fs.writeFile(filePath, content ?? '', 'utf-8'); + } execSync('npm i --ignore-scripts', { cwd: this.root }); await build({ ...config, root: this.root }); diff --git a/package.json b/package.json index 2dcd75d6..cdbdb673 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "type": "module", "version": "0.1.2", "description": "Next gen framework for developing web extensions", + "engines": { + "node": ">=18.16.0" + }, "repository": { "type": "git", "url": "https://github.com/aklinker1/wxt" @@ -49,7 +52,10 @@ "test": "vitest", "test:coverage": "vitest run --coverage", "prepare": "simple-git-hooks", - "prepublish": "pnpm -s build" + "prepublish": "pnpm -s build", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" }, "dependencies": { "@types/webextension-polyfill": "^0.10.0", @@ -88,6 +94,7 @@ "tsup": "^7.0.0", "tsx": "^3.12.7", "typescript": "^5.1.3", + "vitepress": "1.0.0-beta.5", "vitest": "^0.32.4", "vitest-mock-extended": "^1.1.4", "webextension-polyfill": "^0.10.0" @@ -98,5 +105,16 @@ "packageManager": "pnpm@8.6.3", "simple-git-hooks": { "pre-commit": "pnpm pretty-quick --staged" + }, + "pnpm": { + "peerDependencyRules": { + "ignoreMissing": [ + "@algolia/client-search", + "search-insights" + ], + "allowAny": [ + "node-fetch" + ] + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74d5fa94..98243fed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,7 @@ importers: typescript: ^5.1.3 unimport: ^3.0.8 vite: ^4.3.9 + vitepress: 1.0.0-beta.5 vitest: ^0.32.4 vitest-mock-extended: ^1.1.4 web-ext: ^7.6.2 @@ -75,6 +76,7 @@ importers: tsup: 7.0.0_typescript@5.1.3 tsx: 3.12.7 typescript: 5.1.3 + vitepress: 1.0.0-beta.5_@types+node@20.3.1 vitest: 0.32.4 vitest-mock-extended: 1.1.4_ekuvgbe6yxmpeqet3xraeb3oaa @@ -90,6 +92,200 @@ importers: wxt: link:.. packages: + /@algolia/autocomplete-core/1.9.3_algoliasearch@4.18.0: + resolution: + { + integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==, + } + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3_algoliasearch@4.18.0 + '@algolia/autocomplete-shared': 1.9.3_algoliasearch@4.18.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + dev: true + + /@algolia/autocomplete-plugin-algolia-insights/1.9.3_algoliasearch@4.18.0: + resolution: + { + integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==, + } + peerDependencies: + search-insights: '>= 1 < 3' + peerDependenciesMeta: + search-insights: + optional: true + dependencies: + '@algolia/autocomplete-shared': 1.9.3_algoliasearch@4.18.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + dev: true + + /@algolia/autocomplete-preset-algolia/1.9.3_algoliasearch@4.18.0: + resolution: + { + integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==, + } + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + peerDependenciesMeta: + '@algolia/client-search': + optional: true + dependencies: + '@algolia/autocomplete-shared': 1.9.3_algoliasearch@4.18.0 + algoliasearch: 4.18.0 + dev: true + + /@algolia/autocomplete-shared/1.9.3_algoliasearch@4.18.0: + resolution: + { + integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==, + } + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + peerDependenciesMeta: + '@algolia/client-search': + optional: true + dependencies: + algoliasearch: 4.18.0 + dev: true + + /@algolia/cache-browser-local-storage/4.18.0: + resolution: + { + integrity: sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==, + } + dependencies: + '@algolia/cache-common': 4.18.0 + dev: true + + /@algolia/cache-common/4.18.0: + resolution: + { + integrity: sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==, + } + dev: true + + /@algolia/cache-in-memory/4.18.0: + resolution: + { + integrity: sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==, + } + dependencies: + '@algolia/cache-common': 4.18.0 + dev: true + + /@algolia/client-account/4.18.0: + resolution: + { + integrity: sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==, + } + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/transporter': 4.18.0 + dev: true + + /@algolia/client-analytics/4.18.0: + resolution: + { + integrity: sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==, + } + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + dev: true + + /@algolia/client-common/4.18.0: + resolution: + { + integrity: sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==, + } + dependencies: + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + dev: true + + /@algolia/client-personalization/4.18.0: + resolution: + { + integrity: sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==, + } + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + dev: true + + /@algolia/client-search/4.18.0: + resolution: + { + integrity: sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==, + } + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + dev: true + + /@algolia/logger-common/4.18.0: + resolution: + { + integrity: sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==, + } + dev: true + + /@algolia/logger-console/4.18.0: + resolution: + { + integrity: sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==, + } + dependencies: + '@algolia/logger-common': 4.18.0 + dev: true + + /@algolia/requester-browser-xhr/4.18.0: + resolution: + { + integrity: sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==, + } + dependencies: + '@algolia/requester-common': 4.18.0 + dev: true + + /@algolia/requester-common/4.18.0: + resolution: + { + integrity: sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==, + } + dev: true + + /@algolia/requester-node-http/4.18.0: + resolution: + { + integrity: sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==, + } + dependencies: + '@algolia/requester-common': 4.18.0 + dev: true + + /@algolia/transporter/4.18.0: + resolution: + { + integrity: sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==, + } + dependencies: + '@algolia/cache-common': 4.18.0 + '@algolia/logger-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + dev: true + /@ampproject/remapping/2.2.1: resolution: { @@ -111,13 +307,20 @@ packages: '@babel/highlight': 7.22.5 dev: false + /@babel/helper-string-parser/7.22.5: + resolution: + { + integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, + } + engines: { node: '>=6.9.0' } + dev: true + /@babel/helper-validator-identifier/7.22.5: resolution: { integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==, } engines: { node: '>=6.9.0' } - dev: false /@babel/highlight/7.22.5: resolution: @@ -131,6 +334,17 @@ packages: js-tokens: 4.0.0 dev: false + /@babel/parser/7.22.7: + resolution: + { + integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==, + } + engines: { node: '>=6.0.0' } + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/runtime/7.21.0: resolution: { @@ -141,6 +355,18 @@ packages: regenerator-runtime: 0.13.11 dev: false + /@babel/types/7.22.5: + resolution: + { + integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage/0.2.3: resolution: { @@ -183,6 +409,55 @@ packages: - supports-color dev: false + /@docsearch/css/3.5.1: + resolution: + { + integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==, + } + dev: true + + /@docsearch/js/3.5.1: + resolution: + { + integrity: sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==, + } + dependencies: + '@docsearch/react': 3.5.1 + preact: 10.16.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + dev: true + + /@docsearch/react/3.5.1: + resolution: + { + integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==, + } + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.9.3_algoliasearch@4.18.0 + '@algolia/autocomplete-preset-algolia': 1.9.3_algoliasearch@4.18.0 + '@docsearch/css': 3.5.1 + algoliasearch: 4.18.0 + transitivePeerDependencies: + - '@algolia/client-search' + - search-insights + dev: true + /@esbuild-kit/cjs-loader/2.4.2: resolution: { @@ -1079,6 +1354,13 @@ packages: } dev: true + /@types/web-bluetooth/0.0.17: + resolution: + { + integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==, + } + dev: true + /@types/webextension-polyfill/0.10.0: resolution: { @@ -1094,6 +1376,20 @@ packages: '@types/node': 20.3.1 dev: false + /@vitejs/plugin-vue/4.2.3_v6jephi5mcvi5e46pp5rj2e64i: + resolution: + { + integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.4.0-beta.3_@types+node@20.3.1 + vue: 3.3.4 + dev: true + /@vitest/coverage-v8/0.32.2_vitest@0.32.4: resolution: { @@ -1171,6 +1467,213 @@ packages: pretty-format: 29.6.0 dev: true + /@vue/compiler-core/3.3.4: + resolution: + { + integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==, + } + dependencies: + '@babel/parser': 7.22.7 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-dom/3.3.4: + resolution: + { + integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==, + } + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + dev: true + + /@vue/compiler-sfc/3.3.4: + resolution: + { + integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==, + } + dependencies: + '@babel/parser': 7.22.7 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.0 + postcss: 8.4.24 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-ssr/3.3.4: + resolution: + { + integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==, + } + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + dev: true + + /@vue/devtools-api/6.5.0: + resolution: + { + integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==, + } + dev: true + + /@vue/reactivity-transform/3.3.4: + resolution: + { + integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==, + } + dependencies: + '@babel/parser': 7.22.7 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.0 + dev: true + + /@vue/reactivity/3.3.4: + resolution: + { + integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==, + } + dependencies: + '@vue/shared': 3.3.4 + dev: true + + /@vue/runtime-core/3.3.4: + resolution: + { + integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==, + } + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + dev: true + + /@vue/runtime-dom/3.3.4: + resolution: + { + integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==, + } + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.2 + dev: true + + /@vue/server-renderer/3.3.4_vue@3.3.4: + resolution: + { + integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==, + } + peerDependencies: + vue: 3.3.4 + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + dev: true + + /@vue/shared/3.3.4: + resolution: + { + integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==, + } + dev: true + + /@vueuse/core/10.2.1_vue@3.3.4: + resolution: + { + integrity: sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==, + } + dependencies: + '@types/web-bluetooth': 0.0.17 + '@vueuse/metadata': 10.2.1 + '@vueuse/shared': 10.2.1_vue@3.3.4 + vue-demi: 0.14.5_vue@3.3.4 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + + /@vueuse/integrations/10.2.1_focus-trap@7.5.2+vue@3.3.4: + resolution: + { + integrity: sha512-FDP5lni+z9FjHE9H3xuvwSjoRV9U8jmDvJpmHPCBjUgPGYRynwb60eHWXCFJXLUtb4gSIHy0e+iaEbrKdalCkQ==, + } + peerDependencies: + async-validator: '*' + axios: '*' + change-case: '*' + drauu: '*' + focus-trap: '*' + fuse.js: '*' + idb-keyval: '*' + jwt-decode: '*' + nprogress: '*' + qrcode: '*' + sortablejs: '*' + universal-cookie: '*' + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + dependencies: + '@vueuse/core': 10.2.1_vue@3.3.4 + '@vueuse/shared': 10.2.1_vue@3.3.4 + focus-trap: 7.5.2 + vue-demi: 0.14.5_vue@3.3.4 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + + /@vueuse/metadata/10.2.1: + resolution: + { + integrity: sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==, + } + dev: true + + /@vueuse/shared/10.2.1_vue@3.3.4: + resolution: + { + integrity: sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==, + } + dependencies: + vue-demi: 0.14.5_vue@3.3.4 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + /@webcomponents/webcomponentsjs/2.8.0: resolution: { @@ -1296,7 +1799,7 @@ packages: peerDependencies: body-parser: 1.20.2 express: 4.18.2 - node-fetch: 2.6.7 + node-fetch: '*' safe-compare: 1.1.4 peerDependenciesMeta: body-parser: @@ -1361,6 +1864,28 @@ packages: uri-js: 4.4.1 dev: false + /algoliasearch/4.18.0: + resolution: + { + integrity: sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==, + } + dependencies: + '@algolia/cache-browser-local-storage': 4.18.0 + '@algolia/cache-common': 4.18.0 + '@algolia/cache-in-memory': 4.18.0 + '@algolia/client-account': 4.18.0 + '@algolia/client-analytics': 4.18.0 + '@algolia/client-common': 4.18.0 + '@algolia/client-personalization': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/logger-common': 4.18.0 + '@algolia/logger-console': 4.18.0 + '@algolia/requester-browser-xhr': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/requester-node-http': 4.18.0 + '@algolia/transporter': 4.18.0 + dev: true + /ansi-align/3.0.1: resolution: { @@ -1385,6 +1910,13 @@ packages: } engines: { node: '>=12' } + /ansi-sequence-parser/1.1.0: + resolution: + { + integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==, + } + dev: true + /ansi-styles/3.2.1: resolution: { @@ -1623,6 +2155,13 @@ packages: } dev: false + /body-scroll-lock/4.0.0-beta.0: + resolution: + { + integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==, + } + dev: true + /boolbase/1.0.0: resolution: { @@ -2235,6 +2774,13 @@ packages: } dev: false + /csstype/3.1.2: + resolution: + { + integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==, + } + dev: true + /dashdash/1.14.1: resolution: { @@ -2908,7 +3454,6 @@ packages: { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } - dev: false /esutils/2.0.3: resolution: @@ -3158,6 +3703,15 @@ packages: } dev: false + /focus-trap/7.5.2: + resolution: + { + integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==, + } + dependencies: + tabbable: 6.2.0 + dev: true + /for-each/0.3.3: resolution: { @@ -4715,6 +5269,13 @@ packages: p-defer: 1.0.0 dev: false + /mark.js/8.11.1: + resolution: + { + integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==, + } + dev: true + /marky/1.2.5: resolution: { @@ -4865,6 +5426,13 @@ packages: engines: { node: '>=16 || 14 >=14.17' } dev: false + /minisearch/6.1.0: + resolution: + { + integrity: sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==, + } + dev: true + /minizlib/2.1.2: resolution: { @@ -5658,6 +6226,13 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /preact/10.16.0: + resolution: + { + integrity: sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==, + } + dev: true + /prelude-ls/1.2.1: resolution: { @@ -6114,6 +6689,17 @@ packages: optionalDependencies: fsevents: 2.3.2 + /rollup/3.26.2: + resolution: + { + integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==, + } + engines: { node: '>=14.18.0', npm: '>=8.0.0' } + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-parallel/1.2.0: resolution: { @@ -6305,6 +6891,18 @@ packages: } dev: false + /shiki/0.14.3: + resolution: + { + integrity: sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==, + } + dependencies: + ansi-sequence-parser: 1.1.0 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: true + /side-channel/1.0.4: resolution: { @@ -6748,6 +7346,13 @@ packages: engines: { node: '>= 0.4' } dev: true + /tabbable/6.2.0: + resolution: + { + integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==, + } + dev: true + /tar/6.1.15: resolution: { @@ -6848,6 +7453,14 @@ packages: rimraf: 3.0.2 dev: false + /to-fast-properties/2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: '>=4' } + dev: true + /to-regex-range/5.0.1: resolution: { @@ -7304,6 +7917,92 @@ packages: optionalDependencies: fsevents: 2.3.2 + /vite/4.4.0-beta.3_@types+node@20.3.1: + resolution: + { + integrity: sha512-IC/thYTvArOFRJ4qvvudnu4KKZOVc+gduS3I9OfC5SbP/Rf4kkP7z6Of2QpKeOSVqwIK24khW6VOUmVD/0yzSQ==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.3.1 + esbuild: 0.18.11 + postcss: 8.4.24 + rollup: 3.26.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitepress/1.0.0-beta.5_@types+node@20.3.1: + resolution: + { + integrity: sha512-/RjqqRsSEKkzF6HhK5e5Ij+bZ7ETb9jNCRRgIMm10gJ+ZLC3D1OqkE465lEqCeJUgt2HZ6jmWjDqIBfrJSpv7w==, + } + hasBin: true + dependencies: + '@docsearch/css': 3.5.1 + '@docsearch/js': 3.5.1 + '@vitejs/plugin-vue': 4.2.3_v6jephi5mcvi5e46pp5rj2e64i + '@vue/devtools-api': 6.5.0 + '@vueuse/core': 10.2.1_vue@3.3.4 + '@vueuse/integrations': 10.2.1_focus-trap@7.5.2+vue@3.3.4 + body-scroll-lock: 4.0.0-beta.0 + focus-trap: 7.5.2 + mark.js: 8.11.1 + minisearch: 6.1.0 + shiki: 0.14.3 + vite: 4.4.0-beta.3_@types+node@20.3.1 + vue: 3.3.4 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - universal-cookie + dev: true + /vitest-mock-extended/1.1.4_ekuvgbe6yxmpeqet3xraeb3oaa: resolution: { @@ -7385,6 +8084,51 @@ packages: - terser dev: true + /vscode-oniguruma/1.7.0: + resolution: + { + integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==, + } + dev: true + + /vscode-textmate/8.0.0: + resolution: + { + integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==, + } + dev: true + + /vue-demi/0.14.5_vue@3.3.4: + resolution: + { + integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==, + } + engines: { node: '>=12' } + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.3.4 + dev: true + + /vue/3.3.4: + resolution: + { + integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==, + } + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4_vue@3.3.4 + '@vue/shared': 3.3.4 + dev: true + /watchpack/2.4.0: resolution: { diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..7ae9a3de --- /dev/null +++ b/vercel.json @@ -0,0 +1,5 @@ +{ + "github": { + "silent": true + } +}