├── examples
├── vue
│ ├── style-scoped.css
│ ├── style-m-bar.css
│ ├── style-m.css
│ ├── style.css
│ ├── main.ts
│ ├── index.html
│ ├── App.vue
│ └── logo.svg
├── react
│ ├── index.html
│ ├── App.tsx
│ ├── style.module.css
│ └── main.tsx
├── types.d.ts
└── tsconfig.json
├── src
├── index.ts
├── plugins
│ ├── assets.ts
│ ├── typescript.ts
│ ├── esm.ts
│ ├── css.ts
│ └── vue.ts
├── types.ts
├── bundle.ts
├── bin.ts
├── compile.ts
├── server.ts
├── utils.ts
└── build.ts
├── .gitignore
├── vlite.svg
├── tsconfig.json
├── .github
└── workflows
│ └── npm-publish.yml
├── LICENSE
├── README.md
├── package.json
└── pnpm-lock.yaml
/examples/vue/style-scoped.css:
--------------------------------------------------------------------------------
1 | button {
2 | color: white;
3 | }
--------------------------------------------------------------------------------
/examples/vue/style-m-bar.css:
--------------------------------------------------------------------------------
1 | .button {
2 | margin: 8px 0;
3 | }
--------------------------------------------------------------------------------
/examples/vue/style-m.css:
--------------------------------------------------------------------------------
1 | .button {
2 | padding: 14px 20px;
3 | }
--------------------------------------------------------------------------------
/examples/vue/style.css:
--------------------------------------------------------------------------------
1 | button {
2 | background-color: #4CAF50;
3 | }
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './compile.js'
2 | export * from './server.js'
--------------------------------------------------------------------------------
/examples/react/index.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
3 | .DS_Store
4 |
5 | lib
6 | dist
7 | bundle
8 |
9 | TODO
10 |
--------------------------------------------------------------------------------
/examples/vue/main.ts:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/react/App.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import classNames from './style.module.css'
3 |
4 | export default function App() {
5 | return Hello, World!
;
6 | }
7 |
--------------------------------------------------------------------------------
/vlite.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/examples/vue/index.html:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/examples/types.d.ts:
--------------------------------------------------------------------------------
1 | // declaration.d.ts
2 |
3 | declare module '*.css' {
4 | const content: Record;
5 | export default content;
6 | }
7 |
8 | declare module '*.svg' {
9 | const content: string;
10 | export default content;
11 | }
12 |
--------------------------------------------------------------------------------
/examples/react/style.module.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #f0f0f0;
3 | font-family: Arial, sans-serif;
4 | margin: 0;
5 | padding: 0;
6 | }
7 |
8 | .app {
9 | display: flex;
10 | flex-direction: column;
11 | align-items: center;
12 | justify-content: center;
13 | height: 100vh;
14 | }
--------------------------------------------------------------------------------
/examples/react/main.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom'
3 | import App from './App.tsx'
4 |
5 | console.log('Hello World!')
6 |
7 | ReactDOM.render(, document.getElementById('app'))
8 |
9 | // const h1 = document.createElement('h1')
10 | // h1.textContent = 'Hello World!'
11 | // document.body.appendChild(h1)
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "rootDir": "src",
4 | "outDir": "lib",
5 | "skipLibCheck": true,
6 | "target": "ES2020",
7 | "module": "NodeNext",
8 | "moduleResolution": "NodeNext",
9 | "allowSyntheticDefaultImports": true,
10 | "declaration": true,
11 | "strict": true
12 | },
13 | "include": ["src/**/*"],
14 | }
15 |
--------------------------------------------------------------------------------
/src/plugins/assets.ts:
--------------------------------------------------------------------------------
1 | import { Plugin } from '../types.js';
2 |
3 | export default (): Plugin => {
4 | return {
5 | name: 'asset',
6 | transform: async (file) => {
7 | if (!file.query.url) {
8 | return
9 | }
10 |
11 | return {
12 | name: file.name,
13 | query: { url: true },
14 | content: `export default ${JSON.stringify(file.name.split('?')[0])};`
15 | }
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.github/workflows/npm-publish.yml:
--------------------------------------------------------------------------------
1 | name: Node.js Package
2 |
3 | on:
4 | push:
5 | tags:
6 | - "*"
7 |
8 | permissions:
9 | id-token: write
10 |
11 | jobs:
12 | publish-npm:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - uses: actions/checkout@v4
16 | - uses: pnpm/action-setup@v2
17 | with:
18 | version: 9
19 | - uses: actions/setup-node@v4
20 | with:
21 | node-version: 20.x
22 | registry-url: https://registry.npmjs.org/
23 | - run: pnpm install --frozen-lockfile
24 | - run: pnpm publish --no-git-checks --provenance
25 | env:
26 | NODE_AUTH_TOKEN: ${{secrets.npm_token}}
27 |
--------------------------------------------------------------------------------
/src/plugins/typescript.ts:
--------------------------------------------------------------------------------
1 | import { transform as t } from 'sucrase'
2 | import { Plugin, Transformer } from '../types.js';
3 |
4 | const transform: Transformer = (file) => {
5 | const { name, content } = file
6 |
7 | if (!name.endsWith('.ts') && !name.endsWith('.tsx')) {
8 | return
9 | }
10 |
11 | if (typeof content !== 'string') {
12 | return
13 | }
14 |
15 | const generatedCode = t(content, { transforms: ["typescript", "jsx"] }).code
16 |
17 | return {
18 | name,
19 | query: {},
20 | content: generatedCode
21 | }
22 | }
23 |
24 | export default (): Plugin => {
25 | return {
26 | name: 'typescript',
27 | transform: transform
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/examples/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "preserve",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true
22 | },
23 | "include": ["**/*.ts", "**/*.tsx", "**/*.vue"],
24 | }
25 |
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | export type Query = Record;
2 |
3 | export type Request = {
4 | id: string;
5 | name: string;
6 | query: Query;
7 | }
8 |
9 | export type File = {
10 | name: string;
11 | content: string | Buffer;
12 | };
13 |
14 | export type RequestedFile = File & {
15 | query: Query;
16 | };
17 |
18 | export type MaybePromise = T | undefined | Promise;
19 |
20 | export type Loader = (req: Request, context?: Context) => MaybePromise;
21 |
22 | export type Transformer = (file: RequestedFile, context?: Context) => MaybePromise;
23 |
24 | export type Context = {
25 | mode?: 'development' | 'production';
26 | command?: 'serve' | 'build' | 'bundle';
27 | debug?: boolean;
28 | defaultLoader?: Loader;
29 | };
30 |
31 | export type Plugin = {
32 | name: string;
33 | load?: Loader;
34 | transform?: Transformer;
35 | }
36 |
--------------------------------------------------------------------------------
/examples/vue/App.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
![Vue logo]()
10 |
20 |
21 |
22 |
23 |
28 |
29 |
34 |
35 |
40 |
41 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Jinjiang
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/src/bundle.ts:
--------------------------------------------------------------------------------
1 | import { createRequire } from 'module'
2 | import { dirname, join } from 'path'
3 | import { writeFileSync } from 'fs'
4 | import * as rolldown from '@rolldown/node'
5 | import { copyOtherFiles, readHtml } from './build.js'
6 |
7 | const require = createRequire(import.meta.url)
8 | const fsExtra = require('fs-extra')
9 |
10 | export const bundle = async (targetDir: string) => {
11 | const distDir = join(targetDir, 'dist')
12 | const bundleDir = join(targetDir, 'bundle')
13 |
14 | const { html, scripts } = readHtml(distDir)
15 | const input = join(distDir, scripts[0].id)
16 |
17 | const build = await rolldown.rolldown({
18 | input,
19 | // @ts-ignore
20 | cwd: distDir,
21 | resolve: {
22 | conditionNames: ['node', 'import'],
23 | alias: {},
24 | }
25 | })
26 | await build.write({
27 | dir: bundleDir
28 | })
29 |
30 | copyOtherFiles(targetDir, 'bundle')
31 |
32 | const bundleHtmlFile = join(bundleDir, 'index.html')
33 | fsExtra.ensureDirSync(dirname(bundleHtmlFile))
34 | writeFileSync(bundleHtmlFile, html)
35 |
36 | console.log(`Bundled:\n- ${bundleHtmlFile}\n- ${join(bundleDir, scripts[0].id)}`)
37 | }
38 |
--------------------------------------------------------------------------------
/src/bin.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | import { createRequire } from "module";
4 | import minimist from 'minimist'
5 | import { createServer } from './server.js'
6 | import { build } from "./build.js";
7 | import { bundle } from "./bundle.js";
8 |
9 | const require = createRequire(import.meta.url);
10 |
11 | const helpMessage = `
12 | This is vlite!
13 |
14 | Usage:
15 | vlite [] [--port ]
16 | vlite [] --build
17 | vlite [] --bundle
18 | vlite --help
19 | vlite --version
20 | `.trim()
21 |
22 | const main = async () => {
23 | const argv = minimist(process.argv.slice(2))
24 |
25 | const help = () => console.log(helpMessage)
26 |
27 | if (argv.v || argv.version) {
28 | console.log(require('../package.json').version)
29 | return
30 | }
31 |
32 | if (argv.h || argv.help) {
33 | help()
34 | return
35 | }
36 |
37 | const targetDir = argv._[0] || '.'
38 | const port = argv.p || argv.port || 3000
39 |
40 | if (argv.bundle) {
41 | await build(targetDir, true)
42 | await bundle(targetDir)
43 | return
44 | }
45 |
46 | if (argv.build) {
47 | await build(targetDir)
48 | return
49 | }
50 |
51 | createServer(targetDir, port)
52 | }
53 |
54 | main()
55 |
--------------------------------------------------------------------------------
/examples/vue/logo.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/src/compile.ts:
--------------------------------------------------------------------------------
1 | import { Context, Plugin, Query, Request, RequestedFile } from './types.js';
2 | import typescript from './plugins/typescript.js';
3 | import css from './plugins/css.js';
4 | import vue from './plugins/vue.js';
5 | import esm from './plugins/esm.js';
6 | import assets from './plugins/assets.js';
7 |
8 | const plugins: Plugin[] = [
9 | typescript(),
10 | css(),
11 | vue(),
12 | esm(),
13 | assets(),
14 | ];
15 |
16 | export const compileRequest = async (req: Request, context?: Context): Promise => {
17 | const defaultPlugin: Plugin = {
18 | name: 'default',
19 | load: context?.defaultLoader,
20 | }
21 | const resolvedPlugins = [...plugins, defaultPlugin]
22 | let content: string | Buffer = ''
23 | let query: Query = req.query
24 | for await (const plugin of resolvedPlugins) {
25 | if (plugin.load) {
26 | const loadedContent = await plugin.load(req, context)
27 | if (typeof loadedContent === 'string' || Buffer.isBuffer(loadedContent)) {
28 | content = loadedContent
29 | break
30 | }
31 | }
32 | }
33 |
34 | for await (const plugin of resolvedPlugins) {
35 | const tempFile: RequestedFile = {
36 | name: req.name,
37 | query,
38 | content,
39 | }
40 | if (plugin.transform) {
41 | const transformedFile = await plugin.transform(tempFile, context)
42 | if (transformedFile) {
43 | content = transformedFile.content
44 | query = transformedFile.query
45 | }
46 | }
47 | }
48 |
49 | return {
50 | name: req.name,
51 | content,
52 | query,
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vlite
2 |
3 |
4 |
5 | A lite demo server, inspired by Vite.
6 |
7 | ## Features
8 |
9 | - Zero-config
10 | - ESM-friendly
11 | - Straightforward compilations
12 | - Support Vue, React, and Vanilla
13 | - Support TypeScript, JSX, and TSX
14 | - Support CSS Modules and Scoped CSS
15 | - No node_modules installation required (package imports will be redirected to esm.sh)
16 | - No HMR, no SSR, no plugins, ~~no bundling~~, no production
17 |
18 | ## Installation
19 |
20 | ```bash
21 | npm install -g @jinjiang/vlite
22 | # or
23 | yarn global add @jinjiang/vlite
24 | # or
25 | pnpm add -g @jinjiang/vlite
26 | ```
27 |
28 | ## Getting Started
29 |
30 | A quick Vue demo
31 |
32 | ```bash
33 | echo "" > index.html
34 | echo "import { createApp } from 'vue'\nimport App from './App.vue'\ncreateApp(App).mount('#app')" > main.ts
35 | echo "Hello, Vlite\!
" > App.vue
36 | vlite
37 | ```
38 |
39 | A quick React demo
40 |
41 | ```bash
42 | echo "" > index.html
43 | echo "import React from 'react'\nimport ReactDOM from 'react-dom'\nReactDOM.render(Hello, World\!
, document.getElementById('app'))" > main.tsx
44 | vlite
45 | ```
46 |
47 | ## Usage
48 |
49 | ```bash
50 | vlite [] [--port ]
51 | vlite [] --build
52 | vlite [] --bundle
53 | vlite --help
54 | vlite --version
55 | ```
56 |
57 | > [!WARNING]
58 | > To be noticed: the build and bundle commands are in experimental stage. For bundle mode, you have to add this script into your `index.html`:
59 | >
60 | > ```html
61 | >
65 | > ```
66 | >
67 | > See the [Vue example](./examples/vue/index.html).
68 |
69 | ## Examples
70 |
71 | See the [React example](./examples/react/) and the [Vue example](./examples/vue/).
72 |
73 | ## License
74 |
75 | MIT
76 |
--------------------------------------------------------------------------------
/src/plugins/esm.ts:
--------------------------------------------------------------------------------
1 | import parseImports, { Import } from 'parse-imports'
2 | import { Plugin, Context, Transformer, RequestedFile } from '../types.js';
3 | import { createLogger, codeExtNamesRegExp, getExtName, setQuery } from '../utils.js';
4 |
5 | export const replaceImport = (content: string, $import: Import, resolved: string): string => {
6 | const { startIndex, endIndex, moduleSpecifier: { code: specifier } } = $import
7 | const before = content.slice(0, startIndex)
8 | const importStatement = content.slice(startIndex, endIndex)
9 | const after = content.slice(endIndex)
10 | return `${before}${importStatement.replace(specifier, JSON.stringify(resolved))}${after}`
11 | }
12 |
13 | const transform: Transformer = async (file, context?: Context) => {
14 | const { name, query, content } = file
15 | const extName = getExtName(name)
16 |
17 | if (!extName.match(codeExtNamesRegExp)) {
18 | return
19 | }
20 |
21 | if (typeof content !== 'string') {
22 | return
23 | }
24 |
25 | const logger = createLogger('esm', 'green', context)
26 | logger.log('[transform]', name)
27 |
28 | const result: RequestedFile = {
29 | name,
30 | query,
31 | content
32 | }
33 |
34 | // process package imports: reverse order to replace with esm.sh from bottom to top
35 | const imports = [...(await parseImports(content))]
36 | imports.reverse().forEach($import => {
37 | const { moduleSpecifier } = $import
38 | if (moduleSpecifier.value) {
39 | if (moduleSpecifier.type === 'package') {
40 | if (context?.command !== 'bundle') {
41 | const resolved = `https://esm.sh/${moduleSpecifier.value}`
42 | result.content = replaceImport(result.content as string, $import, resolved)
43 | }
44 | } else if (!getExtName(moduleSpecifier.value).match(codeExtNamesRegExp)) {
45 | const resolved = setQuery(moduleSpecifier.value, { url: true })
46 | result.content = replaceImport(result.content as string, $import, resolved)
47 | }
48 | }
49 | })
50 |
51 | logger.log(result.content)
52 | return result
53 | }
54 |
55 | export default (): Plugin => {
56 | return {
57 | name: 'esm',
58 | transform: transform
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/server.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs'
2 | import path from 'path'
3 | import express, { Request, Response } from 'express'
4 | import mime from 'mime'
5 | import { compileRequest } from './compile.js'
6 | import { Context, Request as FileRequest } from './types.js'
7 | import { getExtName, codeExtNamesRegExp, getQuery } from './utils.js'
8 |
9 | const prepareRequest = (req: Request): FileRequest => {
10 | const id = req.url
11 | const pathname = req.url?.split('?')[0]
12 | const name = pathname === '/' ? '/index.html' : pathname
13 | const query = getQuery(req.url)
14 | return {
15 | id,
16 | name,
17 | query,
18 | }
19 | }
20 |
21 | const prepareContext = (targetDir: string): Context => {
22 | const defaultLoader = (req: FileRequest): string | Buffer => {
23 | const { name } = req
24 | const filename = path.resolve(targetDir, name.slice(1))
25 | if (getExtName(name).match(codeExtNamesRegExp)) {
26 | return fs.existsSync(filename) ? fs.readFileSync(filename, 'utf-8') : ''
27 | }
28 | return fs.existsSync(filename) ? fs.readFileSync(filename) : Buffer.from('')
29 | }
30 | return { defaultLoader, debug: false }
31 | }
32 |
33 | export const createServer = (targetDir: string, port: number) => {
34 | const resolvedTargetDir = targetDir || path.resolve('./')
35 | const resolvedPort = port || 3000
36 |
37 | const context = prepareContext(resolvedTargetDir)
38 |
39 | const requestHandler = async (req: Request, res: Response): Promise => {
40 | const fileRequest = prepareRequest(req)
41 |
42 | // Compile file
43 | const compiledFile = await compileRequest(
44 | fileRequest,
45 | context
46 | )
47 |
48 | // Set Content-Type
49 | if (fileRequest.name.endsWith('.html')) {
50 | res.setHeader('Content-Type', 'text/html')
51 | } else if (getExtName(fileRequest.name).match(codeExtNamesRegExp)) {
52 | res.setHeader('Content-Type', 'application/javascript')
53 | } else if (fileRequest.query.url) {
54 | res.setHeader('Content-Type', 'application/javascript')
55 | } else {
56 | res.setHeader('Content-Type', mime.getType(fileRequest.name) || 'text/plain')
57 | }
58 |
59 | res.send(compiledFile.content)
60 | }
61 |
62 | const app = express()
63 | app.use(requestHandler)
64 | app.listen(resolvedPort, () => {
65 | console.log(`Server running at http://localhost:${resolvedPort}`)
66 | })
67 | }
68 |
--------------------------------------------------------------------------------
/src/plugins/css.ts:
--------------------------------------------------------------------------------
1 | import postcss from 'postcss';
2 | import modules from 'postcss-modules';
3 | import { compileStyle } from 'vue/compiler-sfc';
4 | import { File, Plugin, Query, Transformer } from '../types.js';
5 |
6 | export const tScopedCss = (file: File, id: string): string => {
7 | const result = compileStyle({
8 | source: file.content as string,
9 | filename: file.name,
10 | id: `data-v-${id}`,
11 | scoped: true,
12 | })
13 | return result.code
14 | }
15 |
16 | export const parseCssModules = async (file: File) => {
17 | let classNames: object | undefined
18 | const result = await postcss(
19 | [modules({ getJSON: (_, json) => {
20 | classNames = json
21 | } })]
22 | ).process(
23 | file.content, { from: file.name }
24 | )
25 | return {
26 | code: result.css,
27 | classNames
28 | }
29 | }
30 |
31 | export const tCss = (content: string): string => {
32 | return `
33 | {
34 | const style = document.createElement('style');
35 | style.innerHTML = ${JSON.stringify(content)};
36 | document.head.appendChild(style);
37 | };
38 | `.trim()
39 | }
40 |
41 | const t = (content: string, classNames?: object) => {
42 | const cssModulesInsertion = classNames ? `export default ${JSON.stringify(classNames)};` : ''
43 | return `
44 | ${tCss(content)}
45 | ${cssModulesInsertion}
46 | `.trim()
47 | }
48 |
49 | const transform: Transformer = async (file) => {
50 | const { name, query, content } = file
51 |
52 | if (!name.endsWith('.css')) {
53 | return
54 | }
55 |
56 | if (typeof content !== 'string') {
57 | return
58 | }
59 |
60 | // scoped css or css modules
61 | const scopedId = typeof query.scoped === 'string' ? query.scoped : query.id as string
62 | let code = query.scoped ? tScopedCss(file, scopedId) : content as string
63 | let classNames
64 | if (name.endsWith('.module.css') || query.module) {
65 | const result = await parseCssModules(file)
66 | code = result.code
67 | classNames = result.classNames
68 | }
69 |
70 | const generatedQuery: Query = {}
71 | if (query.scoped) {
72 | generatedQuery.scoped = scopedId
73 | }
74 | if (query.module) {
75 | generatedQuery.module = true
76 | }
77 | const generatedCode = t(code, classNames)
78 |
79 | return {
80 | name,
81 | query: generatedQuery,
82 | content: generatedCode
83 | }
84 | }
85 |
86 | export default (): Plugin => {
87 | return {
88 | name: 'css',
89 | transform: transform
90 | }
91 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@jinjiang/vlite",
3 | "version": "1.1.2",
4 | "description": "Lite demo server, inspired by Vite",
5 | "type": "module",
6 | "types": "lib/index.d.ts",
7 | "bin": {
8 | "vlite": "lib/bin.js"
9 | },
10 | "main": "lib/index.js",
11 | "files": [
12 | "tsconfig.json",
13 | "bin/*",
14 | "lib/*",
15 | "README.md",
16 | "LICENSE"
17 | ],
18 | "scripts": {
19 | "prepare": "pnpm run build",
20 | "dev": "tsc --watch",
21 | "lint": "tsc --noEmit",
22 | "demo": "DEBUG=1 node ./lib/bin.js ./examples/vue",
23 | "demo:react": "DEBUG=1 node ./lib/bin.js ./examples/react",
24 | "demo:build": "DEBUG=1 node ./lib/bin.js ./examples/vue --build",
25 | "demo:build:react": "DEBUG=1 node ./lib/bin.js ./examples/react --build",
26 | "demo:bundle": "DEBUG=1 node ./lib/bin.js ./examples/vue --bundle",
27 | "demo:bundle:react": "DEBUG=1 node ./lib/bin.js ./examples/react --bundle",
28 | "run": "DEBUG=1 node ./lib/bin.js",
29 | "run:version": "DEBUG=1 node ./lib/bin.js --version",
30 | "run:help": "DEBUG=1 node ./lib/bin.js --help",
31 | "build": "tsc",
32 | "prepublish": "pnpm run build"
33 | },
34 | "keywords": [
35 | "vite",
36 | "lite",
37 | "server",
38 | "static",
39 | "demo",
40 | "vue",
41 | "react",
42 | "typescript",
43 | "css"
44 | ],
45 | "author": "Jinjiang ",
46 | "license": "MIT",
47 | "repository": {
48 | "type": "git",
49 | "url": "git+https://github.com/Jinjiang/vlite.git"
50 | },
51 | "bugs": {
52 | "url": "https://github.com/Jinjiang/vlite/issues"
53 | },
54 | "homepage": "https://github.com/Jinjiang/vlite#readme",
55 | "devDependencies": {
56 | "@types/express": "^4.17.21",
57 | "@types/fs-extra": "^11.0.4",
58 | "@types/minimist": "^1.2.5",
59 | "@types/node": "^20.11.20",
60 | "@types/react": "^18.2.59",
61 | "@types/react-dom": "^18.2.19",
62 | "react": "^18.2.0",
63 | "react-dom": "^18.2.0"
64 | },
65 | "dependencies": {
66 | "@rolldown/node": "^0.0.5",
67 | "chalk": "^5.3.0",
68 | "express": "^4.18.2",
69 | "fs-extra": "^11.2.0",
70 | "htmlparser2": "^9.1.0",
71 | "mime": "^4.0.1",
72 | "minimist": "^1.2.8",
73 | "parse-imports": "^1.1.2",
74 | "postcss": "^8.4.35",
75 | "postcss-modules": "^6.0.0",
76 | "sucrase": "^3.35.0",
77 | "typescript": "^5.3.3",
78 | "vue": "^3.4.19",
79 | "vue-simple-compiler": "^0.0.7"
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | import chalk from 'chalk';
2 | import { Context } from "./types.js";
3 |
4 | // logger
5 |
6 | type CHALK_COLOR_LIST =
7 | | 'black'
8 | | 'red'
9 | | 'green'
10 | | 'yellow'
11 | | 'blue'
12 | | 'magenta'
13 | | 'cyan'
14 | | 'white'
15 |
16 | export const createLogger = (name: string, color: CHALK_COLOR_LIST = 'blue', context?: Context) => {
17 | return {
18 | log: (...argv: any[]) => {
19 | const primary = chalk[color].underline;
20 | const secondary = chalk.dim;
21 | if (process.env.DEBUG || context?.debug) {
22 | console.log(primary(`[${name}]`), ...argv.map((arg) => secondary(arg)));
23 | }
24 | },
25 | };
26 | }
27 |
28 | // extention name
29 |
30 | export const codeExtNamesRegExp = /(js|mjs|ts|tsx|jsx|css|vue)/
31 |
32 | export const getExtName = (name: string): string => {
33 | const endIndex = name.indexOf('?') > -1 ? name.indexOf('?') : name.indexOf('#') > -1 ? name.indexOf('#') : name.length
34 | const extIndex = name.lastIndexOf('.');
35 | if (extIndex === -1) return '';
36 | return name.slice(extIndex + 1, endIndex);
37 | }
38 |
39 | // query string
40 |
41 | export const getQuery = (name: string): Record => {
42 | const query = name.indexOf('?') > -1 ? name.slice(name.indexOf('?') + 1) : '';
43 | const queries = query.split('&');
44 | const result: Record = {};
45 | queries.forEach((query) => {
46 | if (query) {
47 | const [key, value] = query.split('=', 2);
48 | result[key] = value || true;
49 | }
50 | });
51 | return result;
52 | }
53 |
54 | export const setQuery = (name: string, query: Record): string => {
55 | const queries = Object.entries(query).map(([key, value]) => {
56 | return value === true ? key : `${key}=${value}`;
57 | });
58 | return name.indexOf('?') > -1 ? `${name}&${queries.join('&')}` : `${name}?${queries.join('&')}`;
59 | }
60 |
61 | export const removeQuery = (name: string): string => {
62 | return name.indexOf('?') > -1 ? name.slice(0, name.indexOf('?')) : name;
63 | }
64 |
65 | // build result
66 |
67 | /**
68 | * e.g.
69 | * - `foo, { x: true }` => `foo__x`
70 | * - `bar, { x: '1', y: true }` => `bar__x-1_y`
71 | */
72 | export const genId = (name: string, query: Record): string => {
73 | const queryStringList: string[] = [];
74 | Object.keys(query).sort().forEach((key) => {
75 | if (typeof query[key] === 'string' && query[key] !== '') {
76 | queryStringList.push(`${encodeURIComponent(key)}-${encodeURIComponent(query[key])}`);
77 | } else if (query[key] === true) {
78 | queryStringList.push(encodeURIComponent(key));
79 | }
80 | });
81 | return `${name}__${queryStringList.join('_')}`;
82 | }
83 |
--------------------------------------------------------------------------------
/src/plugins/vue.ts:
--------------------------------------------------------------------------------
1 | import { transform as t } from 'sucrase'
2 | import { compile } from 'vue-simple-compiler';
3 | import { Plugin, Transformer } from '../types.js';
4 | import { tCss, tScopedCss, parseCssModules } from './css.js';
5 |
6 | const genCssModuleAssignment = (module: string, value: string) => {
7 | const moduleString = JSON.stringify(module)
8 | return `cssModules[${moduleString}] = ${value};`
9 | }
10 |
11 | const tVueCss = (content: string, classNames?: object, module?: string) => {
12 | const cssModulesInsertion = module ? genCssModuleAssignment(module, JSON.stringify(classNames || {})) : ''
13 | return `
14 | ${tCss(content)}
15 | ${cssModulesInsertion}
16 | `.trim()
17 | }
18 |
19 | const transform: Transformer = async (file) => {
20 | const { name, content } = file
21 |
22 | if (!name.endsWith('.vue')) {
23 | return
24 | }
25 |
26 | if (typeof content !== 'string') {
27 | return
28 | }
29 |
30 | // script + template
31 | const compiled = compile(content, {
32 | filename: name,
33 | tsTransform: (src) => {
34 | return {
35 | code: t(src, { transforms: ["typescript"] }).code
36 | }
37 | }
38 | })
39 |
40 | // styles
41 | const compiledCss = await Promise.all(compiled.css.map(async cssFile => {
42 | if (cssFile.module) {
43 | const { code, classNames } = await parseCssModules({
44 | name: cssFile.filename,
45 | content: cssFile.code
46 | })
47 | return tVueCss(code, classNames, cssFile.module)
48 | }
49 | if (cssFile.scoped) {
50 | return tVueCss(tScopedCss({
51 | name: cssFile.filename,
52 | content: cssFile.code
53 | }, cssFile.scoped))
54 | }
55 | return tVueCss(cssFile.code)
56 | }))
57 |
58 | // external imports
59 | const externalImports: string[] = []
60 | const externalCssModules: string[] = []
61 | await Promise.all(compiled.externalJs.map(async jsFile => {
62 | externalImports.push(`import ${JSON.stringify(jsFile.filename)};`)
63 | }))
64 | await Promise.all(compiled.externalCss.map(async cssFile => {
65 | if (cssFile.module) {
66 | externalImports.push(`import ${cssFile.module} from ${JSON.stringify(`${cssFile.filename}?module`)};`)
67 | externalCssModules.push(genCssModuleAssignment(cssFile.module, cssFile.module))
68 | } else {
69 | const specifier = cssFile.scoped ? `${cssFile.filename}?scoped=${cssFile.scoped}` : cssFile.filename
70 | externalImports.push(`import ${JSON.stringify(specifier)};`)
71 | }
72 | }))
73 |
74 | const generatedCode = `${externalImports.join('\n')}\n${compiled.js.code}\n${compiledCss.join('\n')}\n${externalCssModules.join('\n')}`
75 |
76 | return {
77 | name,
78 | query: {},
79 | content: generatedCode
80 | }
81 | }
82 |
83 | export default (): Plugin => {
84 | return {
85 | name: 'vue',
86 | transform: transform
87 | }
88 | }
--------------------------------------------------------------------------------
/src/build.ts:
--------------------------------------------------------------------------------
1 | import { createRequire } from 'module'
2 | import { dirname, join, relative, resolve } from 'path'
3 | import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs'
4 | import parseImports, { Import } from 'parse-imports'
5 | import { Parser as HtmlParser } from 'htmlparser2'
6 | import { compileRequest } from "./compile.js"
7 | import { Request } from "./types.js"
8 | import { codeExtNamesRegExp, genId, getExtName, getQuery, removeQuery } from "./utils.js"
9 | import { replaceImport } from './plugins/esm.js'
10 |
11 | const require = createRequire(import.meta.url)
12 | const fsExtra = require('fs-extra')
13 |
14 | // TODO: put all the global variables into a context object
15 | const allFileList: Set = new Set()
16 | const idSrcToDist = new Map()
17 | const idDistToSrc = new Map()
18 | const codeMap: Record = {}
19 | const depsMap: Record = {}
20 | const binaryMap: Record = {}
21 |
22 | type ImportRecord = {
23 | specifier: string;
24 | id: string;
25 | depIdSrc: string;
26 | import: Import;
27 | }
28 |
29 | type Deps = {
30 | base: string;
31 | specifierSet: Set;
32 | importRecords: ImportRecord[];
33 | }
34 |
35 | type EntryScript = Request & {
36 | src: string;
37 | }
38 |
39 | export const readHtml = (targetDir: string) => {
40 | const entryHtml = join(targetDir, 'index.html')
41 | const entryHtmlContent = readFileSync(entryHtml, 'utf-8')
42 | const entryScripts: EntryScript[] = []
43 | const htmlParser = new HtmlParser({
44 | onopentag(name, attrs) {
45 | if (name === 'script' && attrs.type === 'module' && attrs.src) {
46 | const id = join('/', attrs.src)
47 | entryScripts.push({ id, name: id, query: {}, src: attrs.src })
48 | }
49 | }
50 | })
51 | htmlParser.write(entryHtmlContent)
52 | htmlParser.end()
53 | return {
54 | html: entryHtmlContent,
55 | scripts: entryScripts
56 | }
57 | }
58 |
59 | const getDeps = async (base: string, code: string): Promise => {
60 | const imports = [...(await parseImports(code))]
61 | const importRecords: ImportRecord[] = []
62 | imports.reverse().forEach($import => {
63 | const { moduleSpecifier } = $import
64 | if (moduleSpecifier.value) {
65 | if (moduleSpecifier.type !== 'relative') {
66 | return
67 | }
68 | if (moduleSpecifier.value.match(/^(https?:)?\/\//)) {
69 | return
70 | }
71 | const id = join(base, moduleSpecifier.value)
72 | const depName = removeQuery(id)
73 | const depQuery = getQuery(id)
74 | const depIdSrc = genId(depName, depQuery)
75 | importRecords.push({
76 | specifier: moduleSpecifier.value,
77 | id,
78 | depIdSrc,
79 | import: $import
80 | })
81 | }
82 | })
83 | return {
84 | base,
85 | specifierSet: new Set(importRecords.map(record => record.id)),
86 | importRecords,
87 | }
88 | }
89 |
90 | const traverse = async (entries: Request[], targetDir: string, forBundle?: boolean) => {
91 | const queue: Request[] = []
92 | await Promise.all(entries.map(async (entry) => {
93 | const idSrc = genId(entry.name, entry.query)
94 | if (idSrcToDist.has(idSrc)) return
95 |
96 | const result = await compileRequest(entry, {
97 | command: forBundle ? 'bundle' : 'build',
98 | defaultLoader: async (req) => {
99 | const filename = resolve(targetDir, req.name.slice(1))
100 | const existed = existsSync(filename)
101 | if (getExtName(entry.name).match(codeExtNamesRegExp)) {
102 | return existed ? readFileSync(filename, 'utf-8') : ''
103 | }
104 | return existed ? readFileSync(filename) : Buffer.from('')
105 | }
106 | })
107 |
108 | const idDist = genId(result.name, result.query)
109 |
110 | idSrcToDist.set(idSrc, idDist)
111 | idDistToSrc.set(idDist, idSrc)
112 |
113 | if (typeof result.content === 'string') {
114 | codeMap[idSrc] = result.content
115 | const deps = await getDeps(dirname(entry.name), result.content)
116 | depsMap[idSrc] = deps
117 | deps.specifierSet.forEach(specifier => {
118 | const depName = removeQuery(specifier)
119 | const depQuery = getQuery(specifier)
120 | const depIdSrc = genId(depName, depQuery)
121 | if (!idSrcToDist.has(depIdSrc)) {
122 | queue.push({ id: specifier, name: depName, query: depQuery })
123 | }
124 | })
125 | } else {
126 | binaryMap[entry.name] = result.content
127 | }
128 | }))
129 | if (queue.length > 0) {
130 | await traverse(queue, targetDir)
131 | }
132 | }
133 |
134 | const generate = async (targetDir: string) => {
135 | const generatedNameList: string[] = []
136 | idSrcToDist.forEach((idDist, idSrc) => {
137 | const code = codeMap[idSrc]
138 | const deps = depsMap[idSrc]
139 | const generatedName = join(targetDir, 'dist', idDist + '.js')
140 | let generatedCode = code
141 | deps && deps.importRecords.forEach(record => {
142 | const depIdSrc = record.depIdSrc
143 | const depIdDist = idSrcToDist.get(depIdSrc)
144 | if (!depIdDist) return
145 | const newSpecifier = relative(
146 | dirname(generatedName),
147 | join(targetDir, 'dist', '.' + depIdDist + '.js')
148 | )
149 | const newRelativeSpecifier = newSpecifier.startsWith('.') ? newSpecifier : './' + newSpecifier
150 | generatedCode = replaceImport(generatedCode, record.import, newRelativeSpecifier)
151 | })
152 | fsExtra.ensureDirSync(dirname(generatedName))
153 | writeFileSync(generatedName, generatedCode)
154 | generatedNameList.push(generatedName)
155 | })
156 | for (const [name, buffer] of Object.entries(binaryMap)) {
157 | const generatedName = join(targetDir, 'dist', name)
158 | fsExtra.ensureDirSync(dirname(generatedName))
159 | writeFileSync(generatedName, buffer)
160 | generatedNameList.push(generatedName)
161 | }
162 |
163 | return generatedNameList
164 | }
165 |
166 | const generateHtml = (html: string, scripts: EntryScript[], targetDir: string) => {
167 | // TODO: use HTML parser to replace script src
168 | let generatedEntryHtmlContent = html
169 | scripts.forEach(script => {
170 | const idSrc = genId(script.name, script.query)
171 | const idDist = idSrcToDist.get(idSrc)
172 | if (!idDist) return
173 | generatedEntryHtmlContent = generatedEntryHtmlContent.replace(
174 | script.src,
175 | idDist + '.js'
176 | )
177 | })
178 | const generatedEntryHtml = join(targetDir, 'dist', 'index.html')
179 | fsExtra.ensureDirSync(dirname(generatedEntryHtml))
180 | writeFileSync(generatedEntryHtml, generatedEntryHtmlContent)
181 | return generatedEntryHtml
182 | }
183 |
184 | const ignoredFiles = new Set([
185 | 'package.json',
186 | 'node_modules',
187 | 'package-lock.json',
188 | 'yarn.lock',
189 | 'pnpm-lock.yaml',
190 | 'dist',
191 | 'bundle'
192 | ])
193 |
194 | const getAllFiles = (dirPath: string) => {
195 | const files = readdirSync(dirPath)
196 | files.forEach((file) => {
197 | if (file.startsWith('.')) return
198 | if (ignoredFiles.has(file)) {
199 | return
200 | }
201 | if (statSync(join(dirPath, file)).isDirectory()) {
202 | getAllFiles(join(dirPath, file))
203 | } else {
204 | allFileList.add(join(dirPath, file))
205 | }
206 | })
207 | }
208 |
209 | export const copyOtherFiles = (targetDir: string, copyTo: string) => {
210 | return Array.from(allFileList).map(file => {
211 | if (file === join(targetDir, 'index.html')) {
212 | return
213 | }
214 | if (getExtName(file).match(codeExtNamesRegExp)) {
215 | return ''
216 | }
217 | const distFile = join(targetDir, copyTo, relative(targetDir, file))
218 | fsExtra.ensureDirSync(dirname(distFile))
219 | fsExtra.copyFileSync(file, distFile)
220 | return distFile
221 | }).filter(Boolean)
222 | }
223 |
224 | export const build = async (targetDir: string, forBundle?: boolean) => {
225 | getAllFiles(targetDir)
226 | const { html, scripts } = readHtml(targetDir)
227 | await traverse(scripts, targetDir, forBundle)
228 | const generatedNameList = await generate(targetDir)
229 | const generatedEntryHtml = generateHtml(html, scripts, targetDir)
230 | const otherFiles = copyOtherFiles(targetDir, 'dist')
231 | console.log(`Generated:\n${[generatedEntryHtml, ...generatedNameList, ...otherFiles].map(x => `- ${x}`).join('\n')}`)
232 | }
233 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | '@rolldown/node':
12 | specifier: ^0.0.5
13 | version: 0.0.5
14 | chalk:
15 | specifier: ^5.3.0
16 | version: 5.3.0
17 | express:
18 | specifier: ^4.18.2
19 | version: 4.18.2
20 | fs-extra:
21 | specifier: ^11.2.0
22 | version: 11.2.0
23 | htmlparser2:
24 | specifier: ^9.1.0
25 | version: 9.1.0
26 | mime:
27 | specifier: ^4.0.1
28 | version: 4.0.1
29 | minimist:
30 | specifier: ^1.2.8
31 | version: 1.2.8
32 | parse-imports:
33 | specifier: ^1.1.2
34 | version: 1.1.2
35 | postcss:
36 | specifier: ^8.4.35
37 | version: 8.4.35
38 | postcss-modules:
39 | specifier: ^6.0.0
40 | version: 6.0.0(postcss@8.4.35)
41 | sucrase:
42 | specifier: ^3.35.0
43 | version: 3.35.0
44 | typescript:
45 | specifier: ^5.3.3
46 | version: 5.3.3
47 | vue:
48 | specifier: ^3.4.19
49 | version: 3.4.19(typescript@5.3.3)
50 | vue-simple-compiler:
51 | specifier: ^0.0.7
52 | version: 0.0.7(less@4.2.0)(sass@1.71.1)(typescript@5.3.3)(vue@3.4.19(typescript@5.3.3))
53 | devDependencies:
54 | '@types/express':
55 | specifier: ^4.17.21
56 | version: 4.17.21
57 | '@types/fs-extra':
58 | specifier: ^11.0.4
59 | version: 11.0.4
60 | '@types/minimist':
61 | specifier: ^1.2.5
62 | version: 1.2.5
63 | '@types/node':
64 | specifier: ^20.11.20
65 | version: 20.11.20
66 | '@types/react':
67 | specifier: ^18.2.59
68 | version: 18.2.59
69 | '@types/react-dom':
70 | specifier: ^18.2.19
71 | version: 18.2.19
72 | react:
73 | specifier: ^18.2.0
74 | version: 18.2.0
75 | react-dom:
76 | specifier: ^18.2.0
77 | version: 18.2.0(react@18.2.0)
78 |
79 | packages:
80 |
81 | '@babel/helper-string-parser@7.23.4':
82 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
83 | engines: {node: '>=6.9.0'}
84 |
85 | '@babel/helper-validator-identifier@7.22.20':
86 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
87 | engines: {node: '>=6.9.0'}
88 |
89 | '@babel/parser@7.23.9':
90 | resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==}
91 | engines: {node: '>=6.0.0'}
92 | hasBin: true
93 |
94 | '@babel/types@7.23.9':
95 | resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==}
96 | engines: {node: '>=6.9.0'}
97 |
98 | '@isaacs/cliui@8.0.2':
99 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
100 | engines: {node: '>=12'}
101 |
102 | '@jridgewell/gen-mapping@0.3.4':
103 | resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==}
104 | engines: {node: '>=6.0.0'}
105 |
106 | '@jridgewell/resolve-uri@3.1.2':
107 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
108 | engines: {node: '>=6.0.0'}
109 |
110 | '@jridgewell/set-array@1.1.2':
111 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
112 | engines: {node: '>=6.0.0'}
113 |
114 | '@jridgewell/sourcemap-codec@1.4.15':
115 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
116 |
117 | '@jridgewell/trace-mapping@0.3.9':
118 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
119 |
120 | '@pkgjs/parseargs@0.11.0':
121 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
122 | engines: {node: '>=14'}
123 |
124 | '@rolldown/node-binding-android-arm-eabi@0.0.5':
125 | resolution: {integrity: sha512-cucXe7VPxPX/bCZfd6fvmTHB5TWTkO3+w7MF9jcHwIGmiv46prcaBSQsWCLOS7CsQCwMlcxEHvctHsaSQJ1iGA==}
126 | engines: {node: '>= 10'}
127 | cpu: [arm]
128 | os: [android]
129 |
130 | '@rolldown/node-binding-android-arm64@0.0.5':
131 | resolution: {integrity: sha512-wzngkRlDxkNDXXwDgxuueiOQHlqP4Bwum4gz0QdvfnK4V6Z1EsTDmfGFf2O4re2eLbeGwEmQehWqX8qwxYxm3g==}
132 | engines: {node: '>= 10'}
133 | cpu: [arm64]
134 | os: [android]
135 |
136 | '@rolldown/node-binding-darwin-arm64@0.0.5':
137 | resolution: {integrity: sha512-oACvfvHaq73BLRTHAtvQudU5mZoqWe2w++uFsohC2/i/sef0J979HhB2yt2FQ6AUwsjduQ2qYyzRqKc5j8X4tQ==}
138 | engines: {node: '>= 10'}
139 | cpu: [arm64]
140 | os: [darwin]
141 |
142 | '@rolldown/node-binding-darwin-x64@0.0.5':
143 | resolution: {integrity: sha512-ZjqyxfubPlnMjiLaRh44jfmyEcyfZgT4yu0sUOxmBsq2BFCuI9FHA8qA0DSNQPvXS2T7nyWzl0GH+CxqSi1qPw==}
144 | engines: {node: '>= 10'}
145 | cpu: [x64]
146 | os: [darwin]
147 |
148 | '@rolldown/node-binding-linux-arm-gnueabihf@0.0.5':
149 | resolution: {integrity: sha512-Vgaab13foxfs/fdruEfGXweS9xqWULMOQPzdA2zJKRw9YaaA/CW5E1IG7qkVXelolCRqe25inqcxAdva965t0w==}
150 | engines: {node: '>= 10'}
151 | cpu: [arm]
152 | os: [linux]
153 |
154 | '@rolldown/node-binding-linux-arm64-gnu@0.0.5':
155 | resolution: {integrity: sha512-x605Z2Nz1C1YVDTKhBOBWhDmq0+32aSGuyrslLMvsQYMU5ETZ7ScpyrZFvZRHoukbcPHrCHiPsCmip4EQBspqg==}
156 | engines: {node: '>= 10'}
157 | cpu: [arm64]
158 | os: [linux]
159 |
160 | '@rolldown/node-binding-linux-arm64-musl@0.0.5':
161 | resolution: {integrity: sha512-biz9cAL1dTkIL1XzG95gliq+HzNQNKd5TdkONUJcyHn4hflPKvSbftk/bPiLvN3VpiFopuay6z6vzpDJ2ibyXw==}
162 | engines: {node: '>= 10'}
163 | cpu: [arm64]
164 | os: [linux]
165 |
166 | '@rolldown/node-binding-linux-x64-gnu@0.0.5':
167 | resolution: {integrity: sha512-6tbXWsyvD0NrdVrIxP61obbdkNt2osb7ANqkTI07QD82zS1q2z5tM5ehFSO2Jz9cv0NZTkrIngUF77xtMD5tRA==}
168 | engines: {node: '>= 10'}
169 | cpu: [x64]
170 | os: [linux]
171 |
172 | '@rolldown/node-binding-linux-x64-musl@0.0.5':
173 | resolution: {integrity: sha512-XtO2ivmbFB+N+ZhrRD2LndipSbaMI00jZFtb/3clIe8+AG5axGPnRnoRlNYWSyowa0yx5FjkfQoA3sXfYxjthA==}
174 | engines: {node: '>= 10'}
175 | cpu: [x64]
176 | os: [linux]
177 |
178 | '@rolldown/node-binding-win32-arm64-msvc@0.0.5':
179 | resolution: {integrity: sha512-oncJYwGG1FeIHbw7SueBrpwTIePtkozyyVQCUIDQM6wBSNd0vUicqLmh/oEEeAca2YOWOVWd9B8mnsakCaEPaQ==}
180 | engines: {node: '>= 10'}
181 | cpu: [arm64]
182 | os: [win32]
183 |
184 | '@rolldown/node-binding-win32-ia32-msvc@0.0.5':
185 | resolution: {integrity: sha512-g7pVkwdQdzfw8V8Kbf+EThqjz3Co6ZTac91+nr60Kn/xLjXwZ4ymakyHMhHNxkM9NAK1+U1b/WI6L4PJNEgU8g==}
186 | engines: {node: '>= 10'}
187 | cpu: [ia32]
188 | os: [win32]
189 |
190 | '@rolldown/node-binding-win32-x64-msvc@0.0.5':
191 | resolution: {integrity: sha512-PvMwPt1rti+BlsujYXT25Kpz+VkwYb7VfuHE5yIWx7mLaNUwstoN4v6ScQnTugRhHeiu9QP/Ab/SiiIHYUsiyw==}
192 | engines: {node: '>= 10'}
193 | cpu: [x64]
194 | os: [win32]
195 |
196 | '@rolldown/node-binding@0.0.5':
197 | resolution: {integrity: sha512-khCsf4WEik/Ri3Buk2slxJV59EKwRwvXCXrmBpkiLMBK8VspVKq4I5pzMCn6ck+ulfSBwl7DEA+rAM5YoNtp+A==}
198 | engines: {node: '>= 10'}
199 |
200 | '@rolldown/node@0.0.5':
201 | resolution: {integrity: sha512-2/1nvX9yJtlqDw0y1aPGfvtmCCDEWCw0TpRquWWzGWdJAaRfYHyBYpKPdUYizLc1naSaT/O3k2WyU+qfGa4hkw==}
202 |
203 | '@types/body-parser@1.19.5':
204 | resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
205 |
206 | '@types/connect@3.4.38':
207 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
208 |
209 | '@types/express-serve-static-core@4.17.43':
210 | resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
211 |
212 | '@types/express@4.17.21':
213 | resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
214 |
215 | '@types/fs-extra@11.0.4':
216 | resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
217 |
218 | '@types/http-errors@2.0.4':
219 | resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
220 |
221 | '@types/jsonfile@6.1.4':
222 | resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
223 |
224 | '@types/mime@1.3.5':
225 | resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
226 |
227 | '@types/mime@3.0.4':
228 | resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==}
229 |
230 | '@types/minimist@1.2.5':
231 | resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
232 |
233 | '@types/node@20.11.20':
234 | resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==}
235 |
236 | '@types/prop-types@15.7.11':
237 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
238 |
239 | '@types/qs@6.9.11':
240 | resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==}
241 |
242 | '@types/range-parser@1.2.7':
243 | resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
244 |
245 | '@types/react-dom@18.2.19':
246 | resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==}
247 |
248 | '@types/react@18.2.59':
249 | resolution: {integrity: sha512-DE+F6BYEC8VtajY85Qr7mmhTd/79rJKIHCg99MU9SWPB4xvLb6D1za2vYflgZfmPqQVEr6UqJTnLXEwzpVPuOg==}
250 |
251 | '@types/scheduler@0.16.8':
252 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
253 |
254 | '@types/send@0.17.4':
255 | resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
256 |
257 | '@types/serve-static@1.15.5':
258 | resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==}
259 |
260 | '@vue/compiler-core@3.4.19':
261 | resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==}
262 |
263 | '@vue/compiler-dom@3.4.19':
264 | resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==}
265 |
266 | '@vue/compiler-sfc@3.4.19':
267 | resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==}
268 |
269 | '@vue/compiler-ssr@3.4.19':
270 | resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==}
271 |
272 | '@vue/reactivity@3.4.19':
273 | resolution: {integrity: sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==}
274 |
275 | '@vue/runtime-core@3.4.19':
276 | resolution: {integrity: sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==}
277 |
278 | '@vue/runtime-dom@3.4.19':
279 | resolution: {integrity: sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==}
280 |
281 | '@vue/server-renderer@3.4.19':
282 | resolution: {integrity: sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==}
283 | peerDependencies:
284 | vue: 3.4.19
285 |
286 | '@vue/shared@3.4.19':
287 | resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==}
288 |
289 | accepts@1.3.8:
290 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
291 | engines: {node: '>= 0.6'}
292 |
293 | ansi-regex@5.0.1:
294 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
295 | engines: {node: '>=8'}
296 |
297 | ansi-regex@6.0.1:
298 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
299 | engines: {node: '>=12'}
300 |
301 | ansi-styles@4.3.0:
302 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
303 | engines: {node: '>=8'}
304 |
305 | ansi-styles@6.2.1:
306 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
307 | engines: {node: '>=12'}
308 |
309 | any-promise@1.3.0:
310 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
311 |
312 | anymatch@3.1.3:
313 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
314 | engines: {node: '>= 8'}
315 |
316 | array-flatten@1.1.1:
317 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
318 |
319 | balanced-match@1.0.2:
320 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
321 |
322 | binary-extensions@2.2.0:
323 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
324 | engines: {node: '>=8'}
325 |
326 | body-parser@1.20.1:
327 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
328 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
329 |
330 | brace-expansion@2.0.1:
331 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
332 |
333 | braces@3.0.2:
334 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
335 | engines: {node: '>=8'}
336 |
337 | bytes@3.1.2:
338 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
339 | engines: {node: '>= 0.8'}
340 |
341 | call-bind@1.0.7:
342 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
343 | engines: {node: '>= 0.4'}
344 |
345 | chalk@5.3.0:
346 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
347 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
348 |
349 | chokidar@3.6.0:
350 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
351 | engines: {node: '>= 8.10.0'}
352 |
353 | color-convert@2.0.1:
354 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
355 | engines: {node: '>=7.0.0'}
356 |
357 | color-name@1.1.4:
358 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
359 |
360 | commander@4.1.1:
361 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
362 | engines: {node: '>= 6'}
363 |
364 | content-disposition@0.5.4:
365 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
366 | engines: {node: '>= 0.6'}
367 |
368 | content-type@1.0.5:
369 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
370 | engines: {node: '>= 0.6'}
371 |
372 | cookie-signature@1.0.6:
373 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
374 |
375 | cookie@0.5.0:
376 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
377 | engines: {node: '>= 0.6'}
378 |
379 | copy-anything@2.0.6:
380 | resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
381 |
382 | cross-spawn@7.0.3:
383 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
384 | engines: {node: '>= 8'}
385 |
386 | cssesc@3.0.0:
387 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
388 | engines: {node: '>=4'}
389 | hasBin: true
390 |
391 | csstype@3.1.3:
392 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
393 |
394 | debug@2.6.9:
395 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
396 | peerDependencies:
397 | supports-color: '*'
398 | peerDependenciesMeta:
399 | supports-color:
400 | optional: true
401 |
402 | define-data-property@1.1.4:
403 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
404 | engines: {node: '>= 0.4'}
405 |
406 | depd@2.0.0:
407 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
408 | engines: {node: '>= 0.8'}
409 |
410 | destroy@1.2.0:
411 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
412 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
413 |
414 | dom-serializer@2.0.0:
415 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
416 |
417 | domelementtype@2.3.0:
418 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
419 |
420 | domhandler@5.0.3:
421 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
422 | engines: {node: '>= 4'}
423 |
424 | domutils@3.1.0:
425 | resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
426 |
427 | eastasianwidth@0.2.0:
428 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
429 |
430 | ee-first@1.1.1:
431 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
432 |
433 | emoji-regex@8.0.0:
434 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
435 |
436 | emoji-regex@9.2.2:
437 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
438 |
439 | encodeurl@1.0.2:
440 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
441 | engines: {node: '>= 0.8'}
442 |
443 | entities@4.5.0:
444 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
445 | engines: {node: '>=0.12'}
446 |
447 | errno@0.1.8:
448 | resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
449 | hasBin: true
450 |
451 | es-define-property@1.0.0:
452 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
453 | engines: {node: '>= 0.4'}
454 |
455 | es-errors@1.3.0:
456 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
457 | engines: {node: '>= 0.4'}
458 |
459 | es-module-lexer@1.4.1:
460 | resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==}
461 |
462 | escape-html@1.0.3:
463 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
464 |
465 | estree-walker@2.0.2:
466 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
467 |
468 | etag@1.8.1:
469 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
470 | engines: {node: '>= 0.6'}
471 |
472 | express@4.18.2:
473 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
474 | engines: {node: '>= 0.10.0'}
475 |
476 | fill-range@7.0.1:
477 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
478 | engines: {node: '>=8'}
479 |
480 | finalhandler@1.2.0:
481 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
482 | engines: {node: '>= 0.8'}
483 |
484 | foreground-child@3.1.1:
485 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
486 | engines: {node: '>=14'}
487 |
488 | forwarded@0.2.0:
489 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
490 | engines: {node: '>= 0.6'}
491 |
492 | fresh@0.5.2:
493 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
494 | engines: {node: '>= 0.6'}
495 |
496 | fs-extra@11.2.0:
497 | resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
498 | engines: {node: '>=14.14'}
499 |
500 | fsevents@2.3.3:
501 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
502 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
503 | os: [darwin]
504 |
505 | function-bind@1.1.2:
506 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
507 |
508 | generic-names@4.0.0:
509 | resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==}
510 |
511 | get-intrinsic@1.2.4:
512 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
513 | engines: {node: '>= 0.4'}
514 |
515 | glob-parent@5.1.2:
516 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
517 | engines: {node: '>= 6'}
518 |
519 | glob@10.3.10:
520 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
521 | engines: {node: '>=16 || 14 >=14.17'}
522 | hasBin: true
523 |
524 | gopd@1.0.1:
525 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
526 |
527 | graceful-fs@4.2.11:
528 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
529 |
530 | has-property-descriptors@1.0.2:
531 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
532 |
533 | has-proto@1.0.3:
534 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
535 | engines: {node: '>= 0.4'}
536 |
537 | has-symbols@1.0.3:
538 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
539 | engines: {node: '>= 0.4'}
540 |
541 | hash-sum@2.0.0:
542 | resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==}
543 |
544 | hasown@2.0.1:
545 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==}
546 | engines: {node: '>= 0.4'}
547 |
548 | htmlparser2@9.1.0:
549 | resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
550 |
551 | http-errors@2.0.0:
552 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
553 | engines: {node: '>= 0.8'}
554 |
555 | iconv-lite@0.4.24:
556 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
557 | engines: {node: '>=0.10.0'}
558 |
559 | iconv-lite@0.6.3:
560 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
561 | engines: {node: '>=0.10.0'}
562 |
563 | icss-utils@5.1.0:
564 | resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
565 | engines: {node: ^10 || ^12 || >= 14}
566 | peerDependencies:
567 | postcss: ^8.1.0
568 |
569 | image-size@0.5.5:
570 | resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
571 | engines: {node: '>=0.10.0'}
572 | hasBin: true
573 |
574 | immutable@4.3.5:
575 | resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==}
576 |
577 | inherits@2.0.4:
578 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
579 |
580 | ipaddr.js@1.9.1:
581 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
582 | engines: {node: '>= 0.10'}
583 |
584 | is-binary-path@2.1.0:
585 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
586 | engines: {node: '>=8'}
587 |
588 | is-extglob@2.1.1:
589 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
590 | engines: {node: '>=0.10.0'}
591 |
592 | is-fullwidth-code-point@3.0.0:
593 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
594 | engines: {node: '>=8'}
595 |
596 | is-glob@4.0.3:
597 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
598 | engines: {node: '>=0.10.0'}
599 |
600 | is-number@7.0.0:
601 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
602 | engines: {node: '>=0.12.0'}
603 |
604 | is-what@3.14.1:
605 | resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
606 |
607 | isexe@2.0.0:
608 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
609 |
610 | jackspeak@2.3.6:
611 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
612 | engines: {node: '>=14'}
613 |
614 | js-tokens@4.0.0:
615 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
616 |
617 | jsonfile@6.1.0:
618 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
619 |
620 | less@4.2.0:
621 | resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==}
622 | engines: {node: '>=6'}
623 | hasBin: true
624 |
625 | lines-and-columns@1.2.4:
626 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
627 |
628 | loader-utils@3.2.1:
629 | resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==}
630 | engines: {node: '>= 12.13.0'}
631 |
632 | lodash.camelcase@4.3.0:
633 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
634 |
635 | loose-envify@1.4.0:
636 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
637 | hasBin: true
638 |
639 | lru-cache@10.2.0:
640 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
641 | engines: {node: 14 || >=16.14}
642 |
643 | magic-string@0.27.0:
644 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
645 | engines: {node: '>=12'}
646 |
647 | magic-string@0.30.7:
648 | resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
649 | engines: {node: '>=12'}
650 |
651 | make-dir@2.1.0:
652 | resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
653 | engines: {node: '>=6'}
654 |
655 | media-typer@0.3.0:
656 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
657 | engines: {node: '>= 0.6'}
658 |
659 | merge-descriptors@1.0.1:
660 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
661 |
662 | methods@1.1.2:
663 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
664 | engines: {node: '>= 0.6'}
665 |
666 | mime-db@1.52.0:
667 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
668 | engines: {node: '>= 0.6'}
669 |
670 | mime-types@2.1.35:
671 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
672 | engines: {node: '>= 0.6'}
673 |
674 | mime@1.6.0:
675 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
676 | engines: {node: '>=4'}
677 | hasBin: true
678 |
679 | mime@4.0.1:
680 | resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==}
681 | engines: {node: '>=16'}
682 | hasBin: true
683 |
684 | minimatch@9.0.3:
685 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
686 | engines: {node: '>=16 || 14 >=14.17'}
687 |
688 | minimist@1.2.8:
689 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
690 |
691 | minipass@7.0.4:
692 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
693 | engines: {node: '>=16 || 14 >=14.17'}
694 |
695 | ms@2.0.0:
696 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
697 |
698 | ms@2.1.3:
699 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
700 |
701 | mz@2.7.0:
702 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
703 |
704 | nanoid@3.3.7:
705 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
706 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
707 | hasBin: true
708 |
709 | needle@3.3.1:
710 | resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
711 | engines: {node: '>= 4.4.x'}
712 | hasBin: true
713 |
714 | negotiator@0.6.3:
715 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
716 | engines: {node: '>= 0.6'}
717 |
718 | normalize-path@3.0.0:
719 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
720 | engines: {node: '>=0.10.0'}
721 |
722 | object-assign@4.1.1:
723 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
724 | engines: {node: '>=0.10.0'}
725 |
726 | object-inspect@1.13.1:
727 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
728 |
729 | on-finished@2.4.1:
730 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
731 | engines: {node: '>= 0.8'}
732 |
733 | parse-imports@1.1.2:
734 | resolution: {integrity: sha512-UgTSNWlBvx+f4nxVSH3fOyJPJKol8GkFuG8mN8q9FqtmJgwaEx0azPRlXXX0klNlRxoP2gwme00TPDSm6rm/IA==}
735 | engines: {node: '>= 12.17'}
736 |
737 | parse-node-version@1.0.1:
738 | resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
739 | engines: {node: '>= 0.10'}
740 |
741 | parseurl@1.3.3:
742 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
743 | engines: {node: '>= 0.8'}
744 |
745 | path-key@3.1.1:
746 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
747 | engines: {node: '>=8'}
748 |
749 | path-scurry@1.10.1:
750 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
751 | engines: {node: '>=16 || 14 >=14.17'}
752 |
753 | path-to-regexp@0.1.7:
754 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
755 |
756 | picocolors@1.0.0:
757 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
758 |
759 | picomatch@2.3.1:
760 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
761 | engines: {node: '>=8.6'}
762 |
763 | pify@4.0.1:
764 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
765 | engines: {node: '>=6'}
766 |
767 | pirates@4.0.6:
768 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
769 | engines: {node: '>= 6'}
770 |
771 | postcss-modules-extract-imports@3.0.0:
772 | resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==}
773 | engines: {node: ^10 || ^12 || >= 14}
774 | peerDependencies:
775 | postcss: ^8.1.0
776 |
777 | postcss-modules-local-by-default@4.0.4:
778 | resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==}
779 | engines: {node: ^10 || ^12 || >= 14}
780 | peerDependencies:
781 | postcss: ^8.1.0
782 |
783 | postcss-modules-scope@3.1.1:
784 | resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==}
785 | engines: {node: ^10 || ^12 || >= 14}
786 | peerDependencies:
787 | postcss: ^8.1.0
788 |
789 | postcss-modules-values@4.0.0:
790 | resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
791 | engines: {node: ^10 || ^12 || >= 14}
792 | peerDependencies:
793 | postcss: ^8.1.0
794 |
795 | postcss-modules@6.0.0:
796 | resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==}
797 | peerDependencies:
798 | postcss: ^8.0.0
799 |
800 | postcss-selector-parser@6.0.15:
801 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==}
802 | engines: {node: '>=4'}
803 |
804 | postcss-value-parser@4.2.0:
805 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
806 |
807 | postcss@8.4.35:
808 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
809 | engines: {node: ^10 || ^12 || >=14}
810 |
811 | proxy-addr@2.0.7:
812 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
813 | engines: {node: '>= 0.10'}
814 |
815 | prr@1.0.1:
816 | resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
817 |
818 | qs@6.11.0:
819 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
820 | engines: {node: '>=0.6'}
821 |
822 | range-parser@1.2.1:
823 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
824 | engines: {node: '>= 0.6'}
825 |
826 | raw-body@2.5.1:
827 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
828 | engines: {node: '>= 0.8'}
829 |
830 | react-dom@18.2.0:
831 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
832 | peerDependencies:
833 | react: ^18.2.0
834 |
835 | react@18.2.0:
836 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
837 | engines: {node: '>=0.10.0'}
838 |
839 | readdirp@3.6.0:
840 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
841 | engines: {node: '>=8.10.0'}
842 |
843 | safe-buffer@5.2.1:
844 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
845 |
846 | safer-buffer@2.1.2:
847 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
848 |
849 | sass@1.71.1:
850 | resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==}
851 | engines: {node: '>=14.0.0'}
852 | hasBin: true
853 |
854 | sax@1.3.0:
855 | resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==}
856 |
857 | scheduler@0.23.0:
858 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
859 |
860 | semver@5.7.2:
861 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
862 | hasBin: true
863 |
864 | send@0.18.0:
865 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
866 | engines: {node: '>= 0.8.0'}
867 |
868 | serve-static@1.15.0:
869 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
870 | engines: {node: '>= 0.8.0'}
871 |
872 | set-function-length@1.2.1:
873 | resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==}
874 | engines: {node: '>= 0.4'}
875 |
876 | setprototypeof@1.2.0:
877 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
878 |
879 | shebang-command@2.0.0:
880 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
881 | engines: {node: '>=8'}
882 |
883 | shebang-regex@3.0.0:
884 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
885 | engines: {node: '>=8'}
886 |
887 | side-channel@1.0.5:
888 | resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==}
889 | engines: {node: '>= 0.4'}
890 |
891 | signal-exit@4.1.0:
892 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
893 | engines: {node: '>=14'}
894 |
895 | slashes@3.0.12:
896 | resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
897 |
898 | source-map-js@1.0.2:
899 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
900 | engines: {node: '>=0.10.0'}
901 |
902 | source-map@0.6.1:
903 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
904 | engines: {node: '>=0.10.0'}
905 |
906 | statuses@2.0.1:
907 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
908 | engines: {node: '>= 0.8'}
909 |
910 | string-hash@1.1.3:
911 | resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
912 |
913 | string-width@4.2.3:
914 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
915 | engines: {node: '>=8'}
916 |
917 | string-width@5.1.2:
918 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
919 | engines: {node: '>=12'}
920 |
921 | strip-ansi@6.0.1:
922 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
923 | engines: {node: '>=8'}
924 |
925 | strip-ansi@7.1.0:
926 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
927 | engines: {node: '>=12'}
928 |
929 | sucrase@3.35.0:
930 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
931 | engines: {node: '>=16 || 14 >=14.17'}
932 | hasBin: true
933 |
934 | thenify-all@1.6.0:
935 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
936 | engines: {node: '>=0.8'}
937 |
938 | thenify@3.3.1:
939 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
940 |
941 | to-fast-properties@2.0.0:
942 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
943 | engines: {node: '>=4'}
944 |
945 | to-regex-range@5.0.1:
946 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
947 | engines: {node: '>=8.0'}
948 |
949 | toidentifier@1.0.1:
950 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
951 | engines: {node: '>=0.6'}
952 |
953 | ts-interface-checker@0.1.13:
954 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
955 |
956 | tslib@2.6.2:
957 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
958 |
959 | type-is@1.6.18:
960 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
961 | engines: {node: '>= 0.6'}
962 |
963 | typescript@5.3.3:
964 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
965 | engines: {node: '>=14.17'}
966 | hasBin: true
967 |
968 | undici-types@5.26.5:
969 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
970 |
971 | universalify@2.0.1:
972 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
973 | engines: {node: '>= 10.0.0'}
974 |
975 | unpipe@1.0.0:
976 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
977 | engines: {node: '>= 0.8'}
978 |
979 | util-deprecate@1.0.2:
980 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
981 |
982 | utils-merge@1.0.1:
983 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
984 | engines: {node: '>= 0.4.0'}
985 |
986 | vary@1.1.2:
987 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
988 | engines: {node: '>= 0.8'}
989 |
990 | vue-simple-compiler@0.0.7:
991 | resolution: {integrity: sha512-0Fm3SN1t5s1ZNmjzzZffKKk7ICx4rf/O4q17qaYc3Ag//gpzWGd2KtRlS9PZyHsR94cfhE4FkKJwYSNkp/uWNg==}
992 | peerDependencies:
993 | less: ^4.1.3
994 | sass: ^1.62.1
995 | typescript: ^5.2.2
996 | vue: ^3.2.47
997 |
998 | vue@3.4.19:
999 | resolution: {integrity: sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==}
1000 | peerDependencies:
1001 | typescript: '*'
1002 | peerDependenciesMeta:
1003 | typescript:
1004 | optional: true
1005 |
1006 | which@2.0.2:
1007 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1008 | engines: {node: '>= 8'}
1009 | hasBin: true
1010 |
1011 | wrap-ansi@7.0.0:
1012 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1013 | engines: {node: '>=10'}
1014 |
1015 | wrap-ansi@8.1.0:
1016 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
1017 | engines: {node: '>=12'}
1018 |
1019 | snapshots:
1020 |
1021 | '@babel/helper-string-parser@7.23.4': {}
1022 |
1023 | '@babel/helper-validator-identifier@7.22.20': {}
1024 |
1025 | '@babel/parser@7.23.9':
1026 | dependencies:
1027 | '@babel/types': 7.23.9
1028 |
1029 | '@babel/types@7.23.9':
1030 | dependencies:
1031 | '@babel/helper-string-parser': 7.23.4
1032 | '@babel/helper-validator-identifier': 7.22.20
1033 | to-fast-properties: 2.0.0
1034 |
1035 | '@isaacs/cliui@8.0.2':
1036 | dependencies:
1037 | string-width: 5.1.2
1038 | string-width-cjs: string-width@4.2.3
1039 | strip-ansi: 7.1.0
1040 | strip-ansi-cjs: strip-ansi@6.0.1
1041 | wrap-ansi: 8.1.0
1042 | wrap-ansi-cjs: wrap-ansi@7.0.0
1043 |
1044 | '@jridgewell/gen-mapping@0.3.4':
1045 | dependencies:
1046 | '@jridgewell/set-array': 1.1.2
1047 | '@jridgewell/sourcemap-codec': 1.4.15
1048 | '@jridgewell/trace-mapping': 0.3.9
1049 |
1050 | '@jridgewell/resolve-uri@3.1.2': {}
1051 |
1052 | '@jridgewell/set-array@1.1.2': {}
1053 |
1054 | '@jridgewell/sourcemap-codec@1.4.15': {}
1055 |
1056 | '@jridgewell/trace-mapping@0.3.9':
1057 | dependencies:
1058 | '@jridgewell/resolve-uri': 3.1.2
1059 | '@jridgewell/sourcemap-codec': 1.4.15
1060 |
1061 | '@pkgjs/parseargs@0.11.0':
1062 | optional: true
1063 |
1064 | '@rolldown/node-binding-android-arm-eabi@0.0.5':
1065 | optional: true
1066 |
1067 | '@rolldown/node-binding-android-arm64@0.0.5':
1068 | optional: true
1069 |
1070 | '@rolldown/node-binding-darwin-arm64@0.0.5':
1071 | optional: true
1072 |
1073 | '@rolldown/node-binding-darwin-x64@0.0.5':
1074 | optional: true
1075 |
1076 | '@rolldown/node-binding-linux-arm-gnueabihf@0.0.5':
1077 | optional: true
1078 |
1079 | '@rolldown/node-binding-linux-arm64-gnu@0.0.5':
1080 | optional: true
1081 |
1082 | '@rolldown/node-binding-linux-arm64-musl@0.0.5':
1083 | optional: true
1084 |
1085 | '@rolldown/node-binding-linux-x64-gnu@0.0.5':
1086 | optional: true
1087 |
1088 | '@rolldown/node-binding-linux-x64-musl@0.0.5':
1089 | optional: true
1090 |
1091 | '@rolldown/node-binding-win32-arm64-msvc@0.0.5':
1092 | optional: true
1093 |
1094 | '@rolldown/node-binding-win32-ia32-msvc@0.0.5':
1095 | optional: true
1096 |
1097 | '@rolldown/node-binding-win32-x64-msvc@0.0.5':
1098 | optional: true
1099 |
1100 | '@rolldown/node-binding@0.0.5':
1101 | optionalDependencies:
1102 | '@rolldown/node-binding-android-arm-eabi': 0.0.5
1103 | '@rolldown/node-binding-android-arm64': 0.0.5
1104 | '@rolldown/node-binding-darwin-arm64': 0.0.5
1105 | '@rolldown/node-binding-darwin-x64': 0.0.5
1106 | '@rolldown/node-binding-linux-arm-gnueabihf': 0.0.5
1107 | '@rolldown/node-binding-linux-arm64-gnu': 0.0.5
1108 | '@rolldown/node-binding-linux-arm64-musl': 0.0.5
1109 | '@rolldown/node-binding-linux-x64-gnu': 0.0.5
1110 | '@rolldown/node-binding-linux-x64-musl': 0.0.5
1111 | '@rolldown/node-binding-win32-arm64-msvc': 0.0.5
1112 | '@rolldown/node-binding-win32-ia32-msvc': 0.0.5
1113 | '@rolldown/node-binding-win32-x64-msvc': 0.0.5
1114 |
1115 | '@rolldown/node@0.0.5':
1116 | dependencies:
1117 | '@rolldown/node-binding': 0.0.5
1118 |
1119 | '@types/body-parser@1.19.5':
1120 | dependencies:
1121 | '@types/connect': 3.4.38
1122 | '@types/node': 20.11.20
1123 |
1124 | '@types/connect@3.4.38':
1125 | dependencies:
1126 | '@types/node': 20.11.20
1127 |
1128 | '@types/express-serve-static-core@4.17.43':
1129 | dependencies:
1130 | '@types/node': 20.11.20
1131 | '@types/qs': 6.9.11
1132 | '@types/range-parser': 1.2.7
1133 | '@types/send': 0.17.4
1134 |
1135 | '@types/express@4.17.21':
1136 | dependencies:
1137 | '@types/body-parser': 1.19.5
1138 | '@types/express-serve-static-core': 4.17.43
1139 | '@types/qs': 6.9.11
1140 | '@types/serve-static': 1.15.5
1141 |
1142 | '@types/fs-extra@11.0.4':
1143 | dependencies:
1144 | '@types/jsonfile': 6.1.4
1145 | '@types/node': 20.11.20
1146 |
1147 | '@types/http-errors@2.0.4': {}
1148 |
1149 | '@types/jsonfile@6.1.4':
1150 | dependencies:
1151 | '@types/node': 20.11.20
1152 |
1153 | '@types/mime@1.3.5': {}
1154 |
1155 | '@types/mime@3.0.4': {}
1156 |
1157 | '@types/minimist@1.2.5': {}
1158 |
1159 | '@types/node@20.11.20':
1160 | dependencies:
1161 | undici-types: 5.26.5
1162 |
1163 | '@types/prop-types@15.7.11': {}
1164 |
1165 | '@types/qs@6.9.11': {}
1166 |
1167 | '@types/range-parser@1.2.7': {}
1168 |
1169 | '@types/react-dom@18.2.19':
1170 | dependencies:
1171 | '@types/react': 18.2.59
1172 |
1173 | '@types/react@18.2.59':
1174 | dependencies:
1175 | '@types/prop-types': 15.7.11
1176 | '@types/scheduler': 0.16.8
1177 | csstype: 3.1.3
1178 |
1179 | '@types/scheduler@0.16.8': {}
1180 |
1181 | '@types/send@0.17.4':
1182 | dependencies:
1183 | '@types/mime': 1.3.5
1184 | '@types/node': 20.11.20
1185 |
1186 | '@types/serve-static@1.15.5':
1187 | dependencies:
1188 | '@types/http-errors': 2.0.4
1189 | '@types/mime': 3.0.4
1190 | '@types/node': 20.11.20
1191 |
1192 | '@vue/compiler-core@3.4.19':
1193 | dependencies:
1194 | '@babel/parser': 7.23.9
1195 | '@vue/shared': 3.4.19
1196 | entities: 4.5.0
1197 | estree-walker: 2.0.2
1198 | source-map-js: 1.0.2
1199 |
1200 | '@vue/compiler-dom@3.4.19':
1201 | dependencies:
1202 | '@vue/compiler-core': 3.4.19
1203 | '@vue/shared': 3.4.19
1204 |
1205 | '@vue/compiler-sfc@3.4.19':
1206 | dependencies:
1207 | '@babel/parser': 7.23.9
1208 | '@vue/compiler-core': 3.4.19
1209 | '@vue/compiler-dom': 3.4.19
1210 | '@vue/compiler-ssr': 3.4.19
1211 | '@vue/shared': 3.4.19
1212 | estree-walker: 2.0.2
1213 | magic-string: 0.30.7
1214 | postcss: 8.4.35
1215 | source-map-js: 1.0.2
1216 |
1217 | '@vue/compiler-ssr@3.4.19':
1218 | dependencies:
1219 | '@vue/compiler-dom': 3.4.19
1220 | '@vue/shared': 3.4.19
1221 |
1222 | '@vue/reactivity@3.4.19':
1223 | dependencies:
1224 | '@vue/shared': 3.4.19
1225 |
1226 | '@vue/runtime-core@3.4.19':
1227 | dependencies:
1228 | '@vue/reactivity': 3.4.19
1229 | '@vue/shared': 3.4.19
1230 |
1231 | '@vue/runtime-dom@3.4.19':
1232 | dependencies:
1233 | '@vue/runtime-core': 3.4.19
1234 | '@vue/shared': 3.4.19
1235 | csstype: 3.1.3
1236 |
1237 | '@vue/server-renderer@3.4.19(vue@3.4.19(typescript@5.3.3))':
1238 | dependencies:
1239 | '@vue/compiler-ssr': 3.4.19
1240 | '@vue/shared': 3.4.19
1241 | vue: 3.4.19(typescript@5.3.3)
1242 |
1243 | '@vue/shared@3.4.19': {}
1244 |
1245 | accepts@1.3.8:
1246 | dependencies:
1247 | mime-types: 2.1.35
1248 | negotiator: 0.6.3
1249 |
1250 | ansi-regex@5.0.1: {}
1251 |
1252 | ansi-regex@6.0.1: {}
1253 |
1254 | ansi-styles@4.3.0:
1255 | dependencies:
1256 | color-convert: 2.0.1
1257 |
1258 | ansi-styles@6.2.1: {}
1259 |
1260 | any-promise@1.3.0: {}
1261 |
1262 | anymatch@3.1.3:
1263 | dependencies:
1264 | normalize-path: 3.0.0
1265 | picomatch: 2.3.1
1266 |
1267 | array-flatten@1.1.1: {}
1268 |
1269 | balanced-match@1.0.2: {}
1270 |
1271 | binary-extensions@2.2.0: {}
1272 |
1273 | body-parser@1.20.1:
1274 | dependencies:
1275 | bytes: 3.1.2
1276 | content-type: 1.0.5
1277 | debug: 2.6.9
1278 | depd: 2.0.0
1279 | destroy: 1.2.0
1280 | http-errors: 2.0.0
1281 | iconv-lite: 0.4.24
1282 | on-finished: 2.4.1
1283 | qs: 6.11.0
1284 | raw-body: 2.5.1
1285 | type-is: 1.6.18
1286 | unpipe: 1.0.0
1287 | transitivePeerDependencies:
1288 | - supports-color
1289 |
1290 | brace-expansion@2.0.1:
1291 | dependencies:
1292 | balanced-match: 1.0.2
1293 |
1294 | braces@3.0.2:
1295 | dependencies:
1296 | fill-range: 7.0.1
1297 |
1298 | bytes@3.1.2: {}
1299 |
1300 | call-bind@1.0.7:
1301 | dependencies:
1302 | es-define-property: 1.0.0
1303 | es-errors: 1.3.0
1304 | function-bind: 1.1.2
1305 | get-intrinsic: 1.2.4
1306 | set-function-length: 1.2.1
1307 |
1308 | chalk@5.3.0: {}
1309 |
1310 | chokidar@3.6.0:
1311 | dependencies:
1312 | anymatch: 3.1.3
1313 | braces: 3.0.2
1314 | glob-parent: 5.1.2
1315 | is-binary-path: 2.1.0
1316 | is-glob: 4.0.3
1317 | normalize-path: 3.0.0
1318 | readdirp: 3.6.0
1319 | optionalDependencies:
1320 | fsevents: 2.3.3
1321 |
1322 | color-convert@2.0.1:
1323 | dependencies:
1324 | color-name: 1.1.4
1325 |
1326 | color-name@1.1.4: {}
1327 |
1328 | commander@4.1.1: {}
1329 |
1330 | content-disposition@0.5.4:
1331 | dependencies:
1332 | safe-buffer: 5.2.1
1333 |
1334 | content-type@1.0.5: {}
1335 |
1336 | cookie-signature@1.0.6: {}
1337 |
1338 | cookie@0.5.0: {}
1339 |
1340 | copy-anything@2.0.6:
1341 | dependencies:
1342 | is-what: 3.14.1
1343 |
1344 | cross-spawn@7.0.3:
1345 | dependencies:
1346 | path-key: 3.1.1
1347 | shebang-command: 2.0.0
1348 | which: 2.0.2
1349 |
1350 | cssesc@3.0.0: {}
1351 |
1352 | csstype@3.1.3: {}
1353 |
1354 | debug@2.6.9:
1355 | dependencies:
1356 | ms: 2.0.0
1357 |
1358 | define-data-property@1.1.4:
1359 | dependencies:
1360 | es-define-property: 1.0.0
1361 | es-errors: 1.3.0
1362 | gopd: 1.0.1
1363 |
1364 | depd@2.0.0: {}
1365 |
1366 | destroy@1.2.0: {}
1367 |
1368 | dom-serializer@2.0.0:
1369 | dependencies:
1370 | domelementtype: 2.3.0
1371 | domhandler: 5.0.3
1372 | entities: 4.5.0
1373 |
1374 | domelementtype@2.3.0: {}
1375 |
1376 | domhandler@5.0.3:
1377 | dependencies:
1378 | domelementtype: 2.3.0
1379 |
1380 | domutils@3.1.0:
1381 | dependencies:
1382 | dom-serializer: 2.0.0
1383 | domelementtype: 2.3.0
1384 | domhandler: 5.0.3
1385 |
1386 | eastasianwidth@0.2.0: {}
1387 |
1388 | ee-first@1.1.1: {}
1389 |
1390 | emoji-regex@8.0.0: {}
1391 |
1392 | emoji-regex@9.2.2: {}
1393 |
1394 | encodeurl@1.0.2: {}
1395 |
1396 | entities@4.5.0: {}
1397 |
1398 | errno@0.1.8:
1399 | dependencies:
1400 | prr: 1.0.1
1401 | optional: true
1402 |
1403 | es-define-property@1.0.0:
1404 | dependencies:
1405 | get-intrinsic: 1.2.4
1406 |
1407 | es-errors@1.3.0: {}
1408 |
1409 | es-module-lexer@1.4.1: {}
1410 |
1411 | escape-html@1.0.3: {}
1412 |
1413 | estree-walker@2.0.2: {}
1414 |
1415 | etag@1.8.1: {}
1416 |
1417 | express@4.18.2:
1418 | dependencies:
1419 | accepts: 1.3.8
1420 | array-flatten: 1.1.1
1421 | body-parser: 1.20.1
1422 | content-disposition: 0.5.4
1423 | content-type: 1.0.5
1424 | cookie: 0.5.0
1425 | cookie-signature: 1.0.6
1426 | debug: 2.6.9
1427 | depd: 2.0.0
1428 | encodeurl: 1.0.2
1429 | escape-html: 1.0.3
1430 | etag: 1.8.1
1431 | finalhandler: 1.2.0
1432 | fresh: 0.5.2
1433 | http-errors: 2.0.0
1434 | merge-descriptors: 1.0.1
1435 | methods: 1.1.2
1436 | on-finished: 2.4.1
1437 | parseurl: 1.3.3
1438 | path-to-regexp: 0.1.7
1439 | proxy-addr: 2.0.7
1440 | qs: 6.11.0
1441 | range-parser: 1.2.1
1442 | safe-buffer: 5.2.1
1443 | send: 0.18.0
1444 | serve-static: 1.15.0
1445 | setprototypeof: 1.2.0
1446 | statuses: 2.0.1
1447 | type-is: 1.6.18
1448 | utils-merge: 1.0.1
1449 | vary: 1.1.2
1450 | transitivePeerDependencies:
1451 | - supports-color
1452 |
1453 | fill-range@7.0.1:
1454 | dependencies:
1455 | to-regex-range: 5.0.1
1456 |
1457 | finalhandler@1.2.0:
1458 | dependencies:
1459 | debug: 2.6.9
1460 | encodeurl: 1.0.2
1461 | escape-html: 1.0.3
1462 | on-finished: 2.4.1
1463 | parseurl: 1.3.3
1464 | statuses: 2.0.1
1465 | unpipe: 1.0.0
1466 | transitivePeerDependencies:
1467 | - supports-color
1468 |
1469 | foreground-child@3.1.1:
1470 | dependencies:
1471 | cross-spawn: 7.0.3
1472 | signal-exit: 4.1.0
1473 |
1474 | forwarded@0.2.0: {}
1475 |
1476 | fresh@0.5.2: {}
1477 |
1478 | fs-extra@11.2.0:
1479 | dependencies:
1480 | graceful-fs: 4.2.11
1481 | jsonfile: 6.1.0
1482 | universalify: 2.0.1
1483 |
1484 | fsevents@2.3.3:
1485 | optional: true
1486 |
1487 | function-bind@1.1.2: {}
1488 |
1489 | generic-names@4.0.0:
1490 | dependencies:
1491 | loader-utils: 3.2.1
1492 |
1493 | get-intrinsic@1.2.4:
1494 | dependencies:
1495 | es-errors: 1.3.0
1496 | function-bind: 1.1.2
1497 | has-proto: 1.0.3
1498 | has-symbols: 1.0.3
1499 | hasown: 2.0.1
1500 |
1501 | glob-parent@5.1.2:
1502 | dependencies:
1503 | is-glob: 4.0.3
1504 |
1505 | glob@10.3.10:
1506 | dependencies:
1507 | foreground-child: 3.1.1
1508 | jackspeak: 2.3.6
1509 | minimatch: 9.0.3
1510 | minipass: 7.0.4
1511 | path-scurry: 1.10.1
1512 |
1513 | gopd@1.0.1:
1514 | dependencies:
1515 | get-intrinsic: 1.2.4
1516 |
1517 | graceful-fs@4.2.11: {}
1518 |
1519 | has-property-descriptors@1.0.2:
1520 | dependencies:
1521 | es-define-property: 1.0.0
1522 |
1523 | has-proto@1.0.3: {}
1524 |
1525 | has-symbols@1.0.3: {}
1526 |
1527 | hash-sum@2.0.0: {}
1528 |
1529 | hasown@2.0.1:
1530 | dependencies:
1531 | function-bind: 1.1.2
1532 |
1533 | htmlparser2@9.1.0:
1534 | dependencies:
1535 | domelementtype: 2.3.0
1536 | domhandler: 5.0.3
1537 | domutils: 3.1.0
1538 | entities: 4.5.0
1539 |
1540 | http-errors@2.0.0:
1541 | dependencies:
1542 | depd: 2.0.0
1543 | inherits: 2.0.4
1544 | setprototypeof: 1.2.0
1545 | statuses: 2.0.1
1546 | toidentifier: 1.0.1
1547 |
1548 | iconv-lite@0.4.24:
1549 | dependencies:
1550 | safer-buffer: 2.1.2
1551 |
1552 | iconv-lite@0.6.3:
1553 | dependencies:
1554 | safer-buffer: 2.1.2
1555 | optional: true
1556 |
1557 | icss-utils@5.1.0(postcss@8.4.35):
1558 | dependencies:
1559 | postcss: 8.4.35
1560 |
1561 | image-size@0.5.5:
1562 | optional: true
1563 |
1564 | immutable@4.3.5: {}
1565 |
1566 | inherits@2.0.4: {}
1567 |
1568 | ipaddr.js@1.9.1: {}
1569 |
1570 | is-binary-path@2.1.0:
1571 | dependencies:
1572 | binary-extensions: 2.2.0
1573 |
1574 | is-extglob@2.1.1: {}
1575 |
1576 | is-fullwidth-code-point@3.0.0: {}
1577 |
1578 | is-glob@4.0.3:
1579 | dependencies:
1580 | is-extglob: 2.1.1
1581 |
1582 | is-number@7.0.0: {}
1583 |
1584 | is-what@3.14.1: {}
1585 |
1586 | isexe@2.0.0: {}
1587 |
1588 | jackspeak@2.3.6:
1589 | dependencies:
1590 | '@isaacs/cliui': 8.0.2
1591 | optionalDependencies:
1592 | '@pkgjs/parseargs': 0.11.0
1593 |
1594 | js-tokens@4.0.0: {}
1595 |
1596 | jsonfile@6.1.0:
1597 | dependencies:
1598 | universalify: 2.0.1
1599 | optionalDependencies:
1600 | graceful-fs: 4.2.11
1601 |
1602 | less@4.2.0:
1603 | dependencies:
1604 | copy-anything: 2.0.6
1605 | parse-node-version: 1.0.1
1606 | tslib: 2.6.2
1607 | optionalDependencies:
1608 | errno: 0.1.8
1609 | graceful-fs: 4.2.11
1610 | image-size: 0.5.5
1611 | make-dir: 2.1.0
1612 | mime: 1.6.0
1613 | needle: 3.3.1
1614 | source-map: 0.6.1
1615 |
1616 | lines-and-columns@1.2.4: {}
1617 |
1618 | loader-utils@3.2.1: {}
1619 |
1620 | lodash.camelcase@4.3.0: {}
1621 |
1622 | loose-envify@1.4.0:
1623 | dependencies:
1624 | js-tokens: 4.0.0
1625 |
1626 | lru-cache@10.2.0: {}
1627 |
1628 | magic-string@0.27.0:
1629 | dependencies:
1630 | '@jridgewell/sourcemap-codec': 1.4.15
1631 |
1632 | magic-string@0.30.7:
1633 | dependencies:
1634 | '@jridgewell/sourcemap-codec': 1.4.15
1635 |
1636 | make-dir@2.1.0:
1637 | dependencies:
1638 | pify: 4.0.1
1639 | semver: 5.7.2
1640 | optional: true
1641 |
1642 | media-typer@0.3.0: {}
1643 |
1644 | merge-descriptors@1.0.1: {}
1645 |
1646 | methods@1.1.2: {}
1647 |
1648 | mime-db@1.52.0: {}
1649 |
1650 | mime-types@2.1.35:
1651 | dependencies:
1652 | mime-db: 1.52.0
1653 |
1654 | mime@1.6.0: {}
1655 |
1656 | mime@4.0.1: {}
1657 |
1658 | minimatch@9.0.3:
1659 | dependencies:
1660 | brace-expansion: 2.0.1
1661 |
1662 | minimist@1.2.8: {}
1663 |
1664 | minipass@7.0.4: {}
1665 |
1666 | ms@2.0.0: {}
1667 |
1668 | ms@2.1.3: {}
1669 |
1670 | mz@2.7.0:
1671 | dependencies:
1672 | any-promise: 1.3.0
1673 | object-assign: 4.1.1
1674 | thenify-all: 1.6.0
1675 |
1676 | nanoid@3.3.7: {}
1677 |
1678 | needle@3.3.1:
1679 | dependencies:
1680 | iconv-lite: 0.6.3
1681 | sax: 1.3.0
1682 | optional: true
1683 |
1684 | negotiator@0.6.3: {}
1685 |
1686 | normalize-path@3.0.0: {}
1687 |
1688 | object-assign@4.1.1: {}
1689 |
1690 | object-inspect@1.13.1: {}
1691 |
1692 | on-finished@2.4.1:
1693 | dependencies:
1694 | ee-first: 1.1.1
1695 |
1696 | parse-imports@1.1.2:
1697 | dependencies:
1698 | es-module-lexer: 1.4.1
1699 | slashes: 3.0.12
1700 |
1701 | parse-node-version@1.0.1: {}
1702 |
1703 | parseurl@1.3.3: {}
1704 |
1705 | path-key@3.1.1: {}
1706 |
1707 | path-scurry@1.10.1:
1708 | dependencies:
1709 | lru-cache: 10.2.0
1710 | minipass: 7.0.4
1711 |
1712 | path-to-regexp@0.1.7: {}
1713 |
1714 | picocolors@1.0.0: {}
1715 |
1716 | picomatch@2.3.1: {}
1717 |
1718 | pify@4.0.1:
1719 | optional: true
1720 |
1721 | pirates@4.0.6: {}
1722 |
1723 | postcss-modules-extract-imports@3.0.0(postcss@8.4.35):
1724 | dependencies:
1725 | postcss: 8.4.35
1726 |
1727 | postcss-modules-local-by-default@4.0.4(postcss@8.4.35):
1728 | dependencies:
1729 | icss-utils: 5.1.0(postcss@8.4.35)
1730 | postcss: 8.4.35
1731 | postcss-selector-parser: 6.0.15
1732 | postcss-value-parser: 4.2.0
1733 |
1734 | postcss-modules-scope@3.1.1(postcss@8.4.35):
1735 | dependencies:
1736 | postcss: 8.4.35
1737 | postcss-selector-parser: 6.0.15
1738 |
1739 | postcss-modules-values@4.0.0(postcss@8.4.35):
1740 | dependencies:
1741 | icss-utils: 5.1.0(postcss@8.4.35)
1742 | postcss: 8.4.35
1743 |
1744 | postcss-modules@6.0.0(postcss@8.4.35):
1745 | dependencies:
1746 | generic-names: 4.0.0
1747 | icss-utils: 5.1.0(postcss@8.4.35)
1748 | lodash.camelcase: 4.3.0
1749 | postcss: 8.4.35
1750 | postcss-modules-extract-imports: 3.0.0(postcss@8.4.35)
1751 | postcss-modules-local-by-default: 4.0.4(postcss@8.4.35)
1752 | postcss-modules-scope: 3.1.1(postcss@8.4.35)
1753 | postcss-modules-values: 4.0.0(postcss@8.4.35)
1754 | string-hash: 1.1.3
1755 |
1756 | postcss-selector-parser@6.0.15:
1757 | dependencies:
1758 | cssesc: 3.0.0
1759 | util-deprecate: 1.0.2
1760 |
1761 | postcss-value-parser@4.2.0: {}
1762 |
1763 | postcss@8.4.35:
1764 | dependencies:
1765 | nanoid: 3.3.7
1766 | picocolors: 1.0.0
1767 | source-map-js: 1.0.2
1768 |
1769 | proxy-addr@2.0.7:
1770 | dependencies:
1771 | forwarded: 0.2.0
1772 | ipaddr.js: 1.9.1
1773 |
1774 | prr@1.0.1:
1775 | optional: true
1776 |
1777 | qs@6.11.0:
1778 | dependencies:
1779 | side-channel: 1.0.5
1780 |
1781 | range-parser@1.2.1: {}
1782 |
1783 | raw-body@2.5.1:
1784 | dependencies:
1785 | bytes: 3.1.2
1786 | http-errors: 2.0.0
1787 | iconv-lite: 0.4.24
1788 | unpipe: 1.0.0
1789 |
1790 | react-dom@18.2.0(react@18.2.0):
1791 | dependencies:
1792 | loose-envify: 1.4.0
1793 | react: 18.2.0
1794 | scheduler: 0.23.0
1795 |
1796 | react@18.2.0:
1797 | dependencies:
1798 | loose-envify: 1.4.0
1799 |
1800 | readdirp@3.6.0:
1801 | dependencies:
1802 | picomatch: 2.3.1
1803 |
1804 | safe-buffer@5.2.1: {}
1805 |
1806 | safer-buffer@2.1.2: {}
1807 |
1808 | sass@1.71.1:
1809 | dependencies:
1810 | chokidar: 3.6.0
1811 | immutable: 4.3.5
1812 | source-map-js: 1.0.2
1813 |
1814 | sax@1.3.0:
1815 | optional: true
1816 |
1817 | scheduler@0.23.0:
1818 | dependencies:
1819 | loose-envify: 1.4.0
1820 |
1821 | semver@5.7.2:
1822 | optional: true
1823 |
1824 | send@0.18.0:
1825 | dependencies:
1826 | debug: 2.6.9
1827 | depd: 2.0.0
1828 | destroy: 1.2.0
1829 | encodeurl: 1.0.2
1830 | escape-html: 1.0.3
1831 | etag: 1.8.1
1832 | fresh: 0.5.2
1833 | http-errors: 2.0.0
1834 | mime: 1.6.0
1835 | ms: 2.1.3
1836 | on-finished: 2.4.1
1837 | range-parser: 1.2.1
1838 | statuses: 2.0.1
1839 | transitivePeerDependencies:
1840 | - supports-color
1841 |
1842 | serve-static@1.15.0:
1843 | dependencies:
1844 | encodeurl: 1.0.2
1845 | escape-html: 1.0.3
1846 | parseurl: 1.3.3
1847 | send: 0.18.0
1848 | transitivePeerDependencies:
1849 | - supports-color
1850 |
1851 | set-function-length@1.2.1:
1852 | dependencies:
1853 | define-data-property: 1.1.4
1854 | es-errors: 1.3.0
1855 | function-bind: 1.1.2
1856 | get-intrinsic: 1.2.4
1857 | gopd: 1.0.1
1858 | has-property-descriptors: 1.0.2
1859 |
1860 | setprototypeof@1.2.0: {}
1861 |
1862 | shebang-command@2.0.0:
1863 | dependencies:
1864 | shebang-regex: 3.0.0
1865 |
1866 | shebang-regex@3.0.0: {}
1867 |
1868 | side-channel@1.0.5:
1869 | dependencies:
1870 | call-bind: 1.0.7
1871 | es-errors: 1.3.0
1872 | get-intrinsic: 1.2.4
1873 | object-inspect: 1.13.1
1874 |
1875 | signal-exit@4.1.0: {}
1876 |
1877 | slashes@3.0.12: {}
1878 |
1879 | source-map-js@1.0.2: {}
1880 |
1881 | source-map@0.6.1: {}
1882 |
1883 | statuses@2.0.1: {}
1884 |
1885 | string-hash@1.1.3: {}
1886 |
1887 | string-width@4.2.3:
1888 | dependencies:
1889 | emoji-regex: 8.0.0
1890 | is-fullwidth-code-point: 3.0.0
1891 | strip-ansi: 6.0.1
1892 |
1893 | string-width@5.1.2:
1894 | dependencies:
1895 | eastasianwidth: 0.2.0
1896 | emoji-regex: 9.2.2
1897 | strip-ansi: 7.1.0
1898 |
1899 | strip-ansi@6.0.1:
1900 | dependencies:
1901 | ansi-regex: 5.0.1
1902 |
1903 | strip-ansi@7.1.0:
1904 | dependencies:
1905 | ansi-regex: 6.0.1
1906 |
1907 | sucrase@3.35.0:
1908 | dependencies:
1909 | '@jridgewell/gen-mapping': 0.3.4
1910 | commander: 4.1.1
1911 | glob: 10.3.10
1912 | lines-and-columns: 1.2.4
1913 | mz: 2.7.0
1914 | pirates: 4.0.6
1915 | ts-interface-checker: 0.1.13
1916 |
1917 | thenify-all@1.6.0:
1918 | dependencies:
1919 | thenify: 3.3.1
1920 |
1921 | thenify@3.3.1:
1922 | dependencies:
1923 | any-promise: 1.3.0
1924 |
1925 | to-fast-properties@2.0.0: {}
1926 |
1927 | to-regex-range@5.0.1:
1928 | dependencies:
1929 | is-number: 7.0.0
1930 |
1931 | toidentifier@1.0.1: {}
1932 |
1933 | ts-interface-checker@0.1.13: {}
1934 |
1935 | tslib@2.6.2: {}
1936 |
1937 | type-is@1.6.18:
1938 | dependencies:
1939 | media-typer: 0.3.0
1940 | mime-types: 2.1.35
1941 |
1942 | typescript@5.3.3: {}
1943 |
1944 | undici-types@5.26.5: {}
1945 |
1946 | universalify@2.0.1: {}
1947 |
1948 | unpipe@1.0.0: {}
1949 |
1950 | util-deprecate@1.0.2: {}
1951 |
1952 | utils-merge@1.0.1: {}
1953 |
1954 | vary@1.1.2: {}
1955 |
1956 | vue-simple-compiler@0.0.7(less@4.2.0)(sass@1.71.1)(typescript@5.3.3)(vue@3.4.19(typescript@5.3.3)):
1957 | dependencies:
1958 | hash-sum: 2.0.0
1959 | less: 4.2.0
1960 | magic-string: 0.27.0
1961 | sass: 1.71.1
1962 | source-map: 0.6.1
1963 | typescript: 5.3.3
1964 | vue: 3.4.19(typescript@5.3.3)
1965 |
1966 | vue@3.4.19(typescript@5.3.3):
1967 | dependencies:
1968 | '@vue/compiler-dom': 3.4.19
1969 | '@vue/compiler-sfc': 3.4.19
1970 | '@vue/runtime-dom': 3.4.19
1971 | '@vue/server-renderer': 3.4.19(vue@3.4.19(typescript@5.3.3))
1972 | '@vue/shared': 3.4.19
1973 | optionalDependencies:
1974 | typescript: 5.3.3
1975 |
1976 | which@2.0.2:
1977 | dependencies:
1978 | isexe: 2.0.0
1979 |
1980 | wrap-ansi@7.0.0:
1981 | dependencies:
1982 | ansi-styles: 4.3.0
1983 | string-width: 4.2.3
1984 | strip-ansi: 6.0.1
1985 |
1986 | wrap-ansi@8.1.0:
1987 | dependencies:
1988 | ansi-styles: 6.2.1
1989 | string-width: 5.1.2
1990 | strip-ansi: 7.1.0
1991 |
--------------------------------------------------------------------------------