├── 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 | 2 | 3 | 4 | 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 | 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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 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 "" > 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 | --------------------------------------------------------------------------------