├── .github └── FUNDING.yml ├── .gitignore ├── .npmrc ├── CHANGELOG.md ├── CHANGELOG.zh-CN.md ├── LICENSE ├── README.md ├── README.zh-CN.md ├── examples ├── .gitignore ├── .vscode │ └── extensions.json ├── README.md ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public │ └── favicon.ico ├── src │ ├── App.vue │ ├── assets │ │ ├── logo.png │ │ ├── logo2.png │ │ └── styles │ │ │ └── base.css │ ├── components │ │ └── HelloWorld.vue │ ├── env.d.ts │ ├── locale │ │ ├── en.json │ │ └── zh-cn.json │ ├── main.ts │ ├── publicPath.ts │ ├── typing.d.ts │ └── views │ │ ├── About.vue │ │ ├── Basic.vue │ │ └── Home.vue ├── tsconfig.json └── vite.config.ts ├── package.json ├── pnpm-lock.yaml ├── src ├── core │ ├── ast.ts │ ├── transform.ts │ └── utils.ts ├── index.ts └── types.ts ├── tests ├── basic.test.ts ├── configWithoutDefine.test.ts └── transform.test.ts ├── tsconfig.build.json ├── tsconfig.json └── vitest.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: https://cdn.staticaly.com/gh/chenxch/pic-image@master/20221026/1666791805873.30bhic398gu0.webp 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | # tests 7 | coverage 8 | __snapshots__/ -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | ignore-workspace-root-check=true 2 | shamefully-hoist=true 3 | git-checks=false -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Changelog 2 | 3 | ### 1.1.0 4 | 5 | _2024-05-15_ 6 | 7 | #### Chore 8 | 9 | - support defer load script. 10 | 11 | 12 | ### 1.0.3 13 | 14 | _2024-04-29_ 15 | 16 | #### Chore 17 | 18 | - add peerDependencies. 19 | 20 | ### 1.0.2 21 | 22 | _2024-02-02_ 23 | 24 | #### Fix 25 | 26 | - Fix failing transformations due to wrong string / template order. 27 | 28 | ### 1.0.1 29 | 30 | _2024-02-02_ 31 | 32 | #### Feat 33 | 34 | - Add support for replacement in template literals. ([#28](https://github.com/chenxch/vite-plugin-dynamic-base/pull/28) by [@joarfish](https://github.com/joarfish)) 35 | 36 | 37 | ### 1.0.0 38 | 39 | _2023-06-07_ 40 | 41 | #### Feat 42 | 43 | - Using SWC for token transformation ([#23](https://github.com/chenxch/vite-plugin-dynamic-base/pull/23) by [@joarfish](https://github.com/joarfish)) 44 | 45 | 46 | ### 0.4.9 47 | 48 | _2023-04-11_ 49 | #### Fix 50 | 51 | - fix html template src parse ([#21](https://github.com/chenxch/vite-plugin-dynamic-base/issues/21)) 52 | 53 | ### 0.4.8 54 | 55 | _2023-01-15_ 56 | #### Fix 57 | 58 | - fix legacy assets path ([#19](https://github.com/chenxch/vite-plugin-dynamic-base/issues/19) by [@jgsrty](https://github.com/jgsrty)) 59 | 60 | ### 0.4.5 61 | 62 | _2022-09-07_ 63 | #### Fix 64 | 65 | - support aysnc load components.([#14](https://github.com/chenxch/vite-plugin-dynamic-base/issues/14)) 66 | ### 0.4.4 67 | 68 | _2022-06-24_ 69 | #### Feat 70 | 71 | - support legacy modernPolyfills.([#9](https://github.com/chenxch/vite-plugin-dynamic-base/issues/9)) 72 | 73 | ### 0.4.3 74 | 75 | _2022-06-21_ 76 | #### Bug fixes 77 | 78 | - template strings does not work.([#8](https://github.com/chenxch/vite-plugin-dynamic-base/issues/8)) 79 | 80 | ### 0.4.1 81 | 82 | _2022-05-09_ 83 | #### Bug fixes 84 | 85 | - Legacy is invalid in browsers such as IE11. 86 | 87 | 88 | ### 0.4.0 89 | 90 | _2022-05-01_ 91 | 92 | #### Features 93 | 94 | - compatible `vite-plugin-pwa` 95 | - base mark 96 | 97 | #### Bug fixes 98 | 99 | - Multi-level cdn reference resource path fix 100 | 101 | #### Refactors 102 | 103 | - Replace the matching scheme and use the base attribute as a marker bit 104 | - Code structure adjustment, introduction of asynchronous processing 105 | 106 | 107 | ### 0.3.0 108 | 109 | _2022-04-23_ 110 | 111 | #### Features 112 | 113 | - setup simple unit tests with `vitest`. (#5 by @zhoujinfu) 114 | 115 | #### Bug fixes 116 | 117 | - import.env.LEGACY cause undefined errors with vite config `define`. (#5 by @zhoujinfu) -------------------------------------------------------------------------------- /CHANGELOG.zh-CN.md: -------------------------------------------------------------------------------- 1 | ## Changelog 2 | 3 | ### 1.1.0 4 | 5 | _2024-05-15_ 6 | 7 | #### Chore 8 | 9 | - 只支持脚本延后加载. 10 | 11 | ### 1.0.3 12 | 13 | _2024-04-29_ 14 | 15 | #### Chore 16 | 17 | - 添加vite版本要求。 18 | 19 | 20 | ### 1.0.2 21 | 22 | _2024-02-02_ 23 | 24 | #### Fix 25 | 26 | - 修复由于错误的字符串/模板顺序而导致的失败转换。 27 | 28 | ### 1.0.1 29 | 30 | _2024-02-02_ 31 | 32 | #### Feat 33 | 34 | - 添加对模板文字替换的支持 ([#28](https://github.com/chenxch/vite-plugin-dynamic-base/pull/28) by [@joarfish](https://github.com/joarfish)) 35 | 36 | 37 | ### 1.0.0 38 | 39 | _2023-06-07_ 40 | 41 | #### Feat 42 | 43 | - 使用swc进行标记转换 ([#23](https://github.com/chenxch/vite-plugin-dynamic-base/pull/23) by [@joarfish](https://github.com/joarfish)) 44 | 45 | ### 0.4.9 46 | 47 | _2023-04-11_ 48 | #### Fix 49 | 50 | - 修复html模版src解析 ([#21](https://github.com/chenxch/vite-plugin-dynamic-base/issues/21)) 51 | 52 | ### 0.4.8 53 | 54 | _2023-01-15_ 55 | #### Fix 56 | 57 | - 修复 legacy 资源路径 ([#19](https://github.com/chenxch/vite-plugin-dynamic-base/issues/19) by [@jgsrty](https://github.com/jgsrty)) 58 | 59 | ### 0.4.5 60 | 61 | _2022-09-07_ 62 | #### Fix 63 | 64 | - 支持 异步加载组件.([#14](https://github.com/chenxch/vite-plugin-dynamic-base/issues/14)) 65 | 66 | ### 0.4.4 67 | 68 | _2022-06-24_ 69 | #### Feat 70 | 71 | - 支持 legacy modernPolyfills.([#9](https://github.com/chenxch/vite-plugin-dynamic-base/issues/9)) 72 | 73 | ### 0.4.3 74 | 75 | _2022-06-21_ 76 | #### Bug fixes 77 | 78 | - 修复字符串模板不工作.([#8](https://github.com/chenxch/vite-plugin-dynamic-base/issues/8)) 79 | 80 | ### 0.4.1 81 | 82 | _2022-05-09_ 83 | #### Bug fixes 84 | 85 | - Legacy is invalid in browsers such as IE11. 86 | 87 | ### 0.4.0 88 | 89 | _2022-05-01_ 90 | 91 | #### 新特性 92 | 93 | - 兼容`vite-plugin-pwa` 94 | - base标记 95 | 96 | #### Bug 修复 97 | 98 | - 多层级cdn引用资源路径修复 99 | 100 | #### 重构 101 | 102 | - 更换匹配方案,使用base属性作为标记位 103 | - 代码结构调整,引入异步处理 104 | 105 | 106 | ### 0.3.0 107 | 108 | _2022-04-23_ 109 | 110 | #### 新特性 111 | 112 | - 添加简单的单元测试 `vitest`. (#5 by @zhoujinfu) 113 | 114 | #### Bug 修复 115 | 116 | - import.env.LEGACY 未定义的错误. (#5 by @zhoujinfu) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 chenxch 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vite-plugin-dynamic-base 2 | 3 | 4 | 5 | 6 | Version 7 | 8 | 9 | Languages 10 | 11 | 12 | License 13 | 14 | 15 | Star 16 | 17 | 18 | Download 19 | 20 | 21 |

22 | English | 简体中文 23 |

24 | 25 | - 🦾 Resolve all resource files dynamic publicPath, like Webpack's `__webpack_public_path__`. 26 | 27 | 28 | ## Installation 29 | 30 | ```bash 31 | npm i vite-plugin-dynamic-base -D 32 | ``` 33 | 34 | 35 | ## Changelog 36 | 37 | [Changelogs](./CHANGELOG.md) 38 | 39 | 40 | ## Build Mode 41 | 42 | - [x] es 43 | - [x] system 44 | 45 | ## Compatible plugins 46 | 47 | - [x] [@vitejs/plugin-legacy](https://www.npmjs.com/package/@vitejs/plugin-legacy) 48 | - [x] [vite-plugin-pwa](https://www.npmjs.com/package/vite-plugin-pwa) 49 | 50 | ## Usage 51 | 52 | ```ts 53 | // vite.config.ts 54 | import { dynamicBase } from 'vite-plugin-dynamic-base' 55 | 56 | export default defineConfig({ 57 | // base: "/", 58 | base: process.env.NODE_ENV === "production" ? "/__dynamic_base__/" : "/", 59 | plugins: [ 60 | dynamicBase({ /* options */ }), 61 | ], 62 | }) 63 | ``` 64 | 65 | ## Configuration 66 | 67 | The following show the default values of the configuration 68 | 69 | ```ts 70 | dynamicBase({ 71 | // dynamic public path var string, default window.__dynamic_base__ 72 | publicPath: 'window.__dynamic_base__', 73 | // dynamic load resources on index.html, default false. maybe change default true 74 | transformIndexHtml: false 75 | // provide conversion configuration parameters. by 1.1.0 76 | // transformIndexHtmlConfig: { insertBodyAfter: false } 77 | }) 78 | ``` 79 | 80 | -------------------------------------------------------------------------------- /README.zh-CN.md: -------------------------------------------------------------------------------- 1 | # vite-plugin-dynamic-base 2 | 3 | 4 | 5 | 6 | Version 7 | 8 | 9 | Languages 10 | 11 | 12 | License 13 | 14 | 15 | Star 16 | 17 | 18 | Download 19 | 20 | 21 | 22 |

23 | English | 简体中文 24 |

25 | 26 | - 🦾 解析所有资源文件动态路径(多cdn切换), 类似 Webpack 的 `__webpack_public_path__`. 27 | 28 | ## 安装 29 | 30 | ```bash 31 | npm i vite-plugin-dynamic-base -D 32 | ``` 33 | 34 | ## 变更日志 35 | 36 | [变更日志](./CHANGELOG.zh-CN.md) 37 | 38 | ## 编译模式 39 | 40 | - [x] es 41 | - [x] system 42 | 43 | ## 兼容插件 44 | 45 | - [x] [@vitejs/plugin-legacy](https://www.npmjs.com/package/@vitejs/plugin-legacy) 46 | - [x] [vite-plugin-pwa](https://www.npmjs.com/package/vite-plugin-pwa) 47 | 48 | 49 | ## 使用 50 | 51 | ```ts 52 | // vite.config.ts 53 | import { dynamicBase } from 'vite-plugin-dynamic-base' 54 | 55 | export default defineConfig({ 56 | // base: "/", 57 | base: process.env.NODE_ENV === "production" ? "/__dynamic_base__/" : "/", 58 | plugins: [ 59 | dynamicBase({ /* options */ }), 60 | ], 61 | }) 62 | ``` 63 | 64 | ## 配置 65 | 66 | 以下显示配置的默认值 67 | 68 | ```ts 69 | dynamicBase({ 70 | // dynamic public path var string, default window.__dynamic_base__ 71 | publicPath: 'window.__dynamic_base__', 72 | // dynamic load resources on index.html, default false. maybe change default true 73 | transformIndexHtml: false 74 | // provide conversion configuration parameters. by 1.1.0 75 | // transformIndexHtmlConfig: { insertBodyAfter: false } 76 | }) 77 | ``` 78 | 79 | -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | -------------------------------------------------------------------------------- /examples/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["johnsoncodehk.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # Vue 3 + Typescript + Vite 2 | 3 | This template should help get you started developing with Vue 3 and Typescript in Vite. The template uses Vue 3 ` 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vue-tsc --noEmit && vite build", 7 | "preview": "vite preview" 8 | }, 9 | "dependencies": { 10 | "vue": "^3.2.25", 11 | "vue-router": "^4.0.12" 12 | }, 13 | "devDependencies": { 14 | "@vitejs/plugin-legacy": "^1.7.1", 15 | "@vitejs/plugin-vue": "^3.1.0", 16 | "typescript": "^4.8.4", 17 | "vite": "^3.1.0", 18 | "vite-plugin-dynamic-base": "0.4.5", 19 | "vite-plugin-pwa": "^0.12.0", 20 | "vue-tsc": "^1.0.9" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenxch/vite-plugin-dynamic-base/d1cb4ed2423d21a5893a13bb6b8a2af84d544fc5/examples/public/favicon.ico -------------------------------------------------------------------------------- /examples/src/App.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 32 | 33 | 45 | -------------------------------------------------------------------------------- /examples/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenxch/vite-plugin-dynamic-base/d1cb4ed2423d21a5893a13bb6b8a2af84d544fc5/examples/src/assets/logo.png -------------------------------------------------------------------------------- /examples/src/assets/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenxch/vite-plugin-dynamic-base/d1cb4ed2423d21a5893a13bb6b8a2af84d544fc5/examples/src/assets/logo2.png -------------------------------------------------------------------------------- /examples/src/assets/styles/base.css: -------------------------------------------------------------------------------- 1 | .base { 2 | width: 100px; 3 | height: 100px; 4 | background-image: url("../logo.png"); 5 | } -------------------------------------------------------------------------------- /examples/src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 35 | 36 | 53 | -------------------------------------------------------------------------------- /examples/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import { DefineComponent } from 'vue' 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 6 | const component: DefineComponent<{}, {}, any> 7 | export default component 8 | } 9 | -------------------------------------------------------------------------------- /examples/src/locale/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "hello": "hello" 3 | } -------------------------------------------------------------------------------- /examples/src/locale/zh-cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "hello": "你好" 3 | } -------------------------------------------------------------------------------- /examples/src/main.ts: -------------------------------------------------------------------------------- 1 | // import './publicPath' 2 | import { createApp } from 'vue' 3 | import { createRouter, createWebHashHistory } from 'vue-router' 4 | import App from './App.vue' 5 | import Basic from './views/Basic.vue' 6 | 7 | const routes = [ 8 | { path: '/', component: ()=> import('./views/Home.vue') }, 9 | { path: '/about', component: ()=> import('./views/About.vue') }, 10 | { 11 | path: '/basic', component: Basic 12 | } 13 | ] 14 | 15 | export const router = createRouter({ 16 | history: createWebHashHistory(), 17 | routes: routes, 18 | // strict: true, 19 | // scrollBehavior: () => ({ left: 0, top: 0 }), 20 | }); 21 | 22 | createApp(App).use(router).mount('#app') 23 | -------------------------------------------------------------------------------- /examples/src/publicPath.ts: -------------------------------------------------------------------------------- 1 | window.__dynamic_base__ = 'http://localhost:4173' -------------------------------------------------------------------------------- /examples/src/typing.d.ts: -------------------------------------------------------------------------------- 1 | declare interface Window { 2 | __dynamic_base__:string 3 | } -------------------------------------------------------------------------------- /examples/src/views/About.vue: -------------------------------------------------------------------------------- 1 | 7 | 14 | 33 | -------------------------------------------------------------------------------- /examples/src/views/Basic.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "useDefineForClassFields": true, 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "strict": true, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "esModuleInterop": true, 12 | "lib": ["esnext", "dom"] 13 | }, 14 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] 15 | } 16 | -------------------------------------------------------------------------------- /examples/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | // import { dynamicBase } from 'vite-plugin-dynamic-base' 4 | import { dynamicBase } from '../dist/index' 5 | import legacy from '@vitejs/plugin-legacy' 6 | import { VitePWA } from 'vite-plugin-pwa' 7 | 8 | // https://vitejs.dev/config/ 9 | export default defineConfig({ 10 | // base: 'a/b', 11 | base: process.env.NODE_ENV === "production" ? "/__dynamic_base__/" : "/", 12 | plugins: [ 13 | legacy({ 14 | targets: ['ie >= 11'], 15 | additionalLegacyPolyfills: ['regenerator-runtime/runtime'], 16 | modernPolyfills: true, 17 | }), 18 | vue(), 19 | VitePWA({}), 20 | dynamicBase({ transformIndexHtml: true }), 21 | ], 22 | build: { 23 | // assetsDir: 'assets/a/b' 24 | } 25 | }) 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-plugin-dynamic-base", 3 | "version": "1.1.0", 4 | "description": "Resolve all resource files dynamic publicPath, like Webpack's __webpack_public_path__", 5 | "main": "dist/index.js", 6 | "type": "dist/index.d.ts", 7 | "scripts": { 8 | "dev": "tsc -p ./tsconfig.build.json -w --incremental --skipLibCheck", 9 | "build": "rm -rf dist && tsc -p ./tsconfig.build.json --skipLibCheck", 10 | "test": "vitest run", 11 | "coverage": "vitest run --coverage", 12 | "tdd": "vitest -w", 13 | "snap": "vitest run --update", 14 | "release": "bumpp --commit --push --tag && pnpm publish" 15 | }, 16 | "files": [ 17 | "dist" 18 | ], 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/chenxch/vite-plugin-dynamic-base.git" 22 | }, 23 | "author": "chenxch", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/chenxch/vite-plugin-dynamic-base/issues" 27 | }, 28 | "homepage": "https://github.com/chenxch/vite-plugin-dynamic-base", 29 | "devDependencies": { 30 | "@types/node": "^16.11.27", 31 | "bumpp": "^8.2.1", 32 | "c8": "^7.11.2", 33 | "typescript": "^4.6.3", 34 | "vite": "^2.9.5", 35 | "vitest": "^0.9.4" 36 | }, 37 | "dependencies": { 38 | "@swc/core": "^1.3.61", 39 | "node-html-parser": "^5.3.3" 40 | }, 41 | "peerDependencies": { 42 | "vite": ">= 2.9.5" 43 | }, 44 | "keywords": [ 45 | "vite", 46 | "vite plugin", 47 | "publicpath", 48 | "dynamic publicpath", 49 | "dynamic base", 50 | "__webpack_public_path__" 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@swc/core': 9 | specifier: ^1.3.61 10 | version: 1.3.62 11 | node-html-parser: 12 | specifier: ^5.3.3 13 | version: registry.npmmirror.com/node-html-parser@5.3.3 14 | 15 | devDependencies: 16 | '@types/node': 17 | specifier: ^16.11.27 18 | version: registry.npmmirror.com/@types/node@16.11.27 19 | bumpp: 20 | specifier: ^8.2.1 21 | version: 8.2.1 22 | c8: 23 | specifier: ^7.11.2 24 | version: registry.npmmirror.com/c8@7.11.2 25 | typescript: 26 | specifier: ^4.6.3 27 | version: registry.npmmirror.com/typescript@4.6.3 28 | vite: 29 | specifier: ^2.9.5 30 | version: registry.npmmirror.com/vite@2.9.5 31 | vitest: 32 | specifier: ^0.9.4 33 | version: 0.9.4(c8@7.11.2) 34 | 35 | packages: 36 | 37 | /@jsdevtools/ez-spawn@3.0.4: 38 | resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} 39 | engines: {node: '>=10'} 40 | dependencies: 41 | call-me-maybe: 1.0.1 42 | cross-spawn: 7.0.3 43 | string-argv: 0.3.1 44 | type-detect: 4.0.8 45 | dev: true 46 | 47 | /@nodelib/fs.scandir@2.1.5: 48 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 49 | engines: {node: '>= 8'} 50 | dependencies: 51 | '@nodelib/fs.stat': 2.0.5 52 | run-parallel: 1.2.0 53 | dev: true 54 | 55 | /@nodelib/fs.stat@2.0.5: 56 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 57 | engines: {node: '>= 8'} 58 | dev: true 59 | 60 | /@nodelib/fs.walk@1.2.8: 61 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 62 | engines: {node: '>= 8'} 63 | dependencies: 64 | '@nodelib/fs.scandir': 2.1.5 65 | fastq: 1.13.0 66 | dev: true 67 | 68 | /@swc/core-darwin-arm64@1.3.62: 69 | resolution: {integrity: sha512-MmGilibITz68LEje6vJlKzc2gUUSgzvB3wGLSjEORikTNeM7P8jXVxE4A8fgZqDeudJUm9HVWrxCV+pHDSwXhA==} 70 | engines: {node: '>=10'} 71 | cpu: [arm64] 72 | os: [darwin] 73 | requiresBuild: true 74 | dev: false 75 | optional: true 76 | 77 | /@swc/core-darwin-x64@1.3.62: 78 | resolution: {integrity: sha512-Xl93MMB3sCWVlYWuQIB+v6EQgzoiuQYK5tNt9lsHoIEVu2zLdkQjae+5FUHZb1VYqCXIiWcULFfVz0R4Sjb7JQ==} 79 | engines: {node: '>=10'} 80 | cpu: [x64] 81 | os: [darwin] 82 | requiresBuild: true 83 | dev: false 84 | optional: true 85 | 86 | /@swc/core-linux-arm-gnueabihf@1.3.62: 87 | resolution: {integrity: sha512-nJsp6O7kCtAjTTMcIjVB0g5y1JNiYAa5q630eiwrnaHUusEFoANDdORI3Z9vXeikMkng+6yIv9/V8Rb093xLjQ==} 88 | engines: {node: '>=10'} 89 | cpu: [arm] 90 | os: [linux] 91 | requiresBuild: true 92 | dev: false 93 | optional: true 94 | 95 | /@swc/core-linux-arm64-gnu@1.3.62: 96 | resolution: {integrity: sha512-XGsV93vpUAopDt5y6vPwbK1Nc/MlL55L77bAZUPIiosWD1cWWPHNtNSpriE6+I+JiMHe0pqtfS/SSTk6ZkFQVw==} 97 | engines: {node: '>=10'} 98 | cpu: [arm64] 99 | os: [linux] 100 | requiresBuild: true 101 | dev: false 102 | optional: true 103 | 104 | /@swc/core-linux-arm64-musl@1.3.62: 105 | resolution: {integrity: sha512-ESUmJjSlTTkoBy9dMG49opcNn8BmviqStMhwyeD1G8XRnmRVCZZgoBOKdvCXmJhw8bQXDhZumeaTUB+OFUKVXg==} 106 | engines: {node: '>=10'} 107 | cpu: [arm64] 108 | os: [linux] 109 | requiresBuild: true 110 | dev: false 111 | optional: true 112 | 113 | /@swc/core-linux-x64-gnu@1.3.62: 114 | resolution: {integrity: sha512-wnHJkt3ZBrax3SFnUHDcncG6mrSg9ZZjMhQV9Mc3JL1x1s1Gy9rGZCoBNnV/BUZWTemxIBcQbANRSDut/WO+9A==} 115 | engines: {node: '>=10'} 116 | cpu: [x64] 117 | os: [linux] 118 | requiresBuild: true 119 | dev: false 120 | optional: true 121 | 122 | /@swc/core-linux-x64-musl@1.3.62: 123 | resolution: {integrity: sha512-9oRbuTC/VshB66Rgwi3pTq3sPxSTIb8k9L1vJjES+dDMKa29DAjPtWCXG/pyZ00ufpFZgkGEuAHH5uqUcr1JQg==} 124 | engines: {node: '>=10'} 125 | cpu: [x64] 126 | os: [linux] 127 | requiresBuild: true 128 | dev: false 129 | optional: true 130 | 131 | /@swc/core-win32-arm64-msvc@1.3.62: 132 | resolution: {integrity: sha512-zv14vlF2VRrxS061XkfzGjCYnOrEo5glKJjLK5PwUKysIoVrx/L8nAbFxjkX5cObdlyoqo+ekelyBPAO+4bS0w==} 133 | engines: {node: '>=10'} 134 | cpu: [arm64] 135 | os: [win32] 136 | requiresBuild: true 137 | dev: false 138 | optional: true 139 | 140 | /@swc/core-win32-ia32-msvc@1.3.62: 141 | resolution: {integrity: sha512-8MC/PZQSsOP2iA/81tAfNRqMWyEqTS/8zKUI67vPuLvpx6NAjRn3E9qBv7iFqH79iqZNzqSMo3awnLrKZyFbcw==} 142 | engines: {node: '>=10'} 143 | cpu: [ia32] 144 | os: [win32] 145 | requiresBuild: true 146 | dev: false 147 | optional: true 148 | 149 | /@swc/core-win32-x64-msvc@1.3.62: 150 | resolution: {integrity: sha512-GJSmUJ95HKHZXAxiuPUmrcm/S3ivQvEzXhOZaIqYBIwUsm02vFZkClsV7eIKzWjso1t0+I/8MjrnUNaSWqh1rQ==} 151 | engines: {node: '>=10'} 152 | cpu: [x64] 153 | os: [win32] 154 | requiresBuild: true 155 | dev: false 156 | optional: true 157 | 158 | /@swc/core@1.3.62: 159 | resolution: {integrity: sha512-J58hWY+/G8vOr4J6ZH9hLg0lMSijZtqIIf4HofZezGog/pVX6sJyBJ40dZ1ploFkDIlWTWvJyqtpesBKS73gkQ==} 160 | engines: {node: '>=10'} 161 | requiresBuild: true 162 | peerDependencies: 163 | '@swc/helpers': ^0.5.0 164 | peerDependenciesMeta: 165 | '@swc/helpers': 166 | optional: true 167 | optionalDependencies: 168 | '@swc/core-darwin-arm64': 1.3.62 169 | '@swc/core-darwin-x64': 1.3.62 170 | '@swc/core-linux-arm-gnueabihf': 1.3.62 171 | '@swc/core-linux-arm64-gnu': 1.3.62 172 | '@swc/core-linux-arm64-musl': 1.3.62 173 | '@swc/core-linux-x64-gnu': 1.3.62 174 | '@swc/core-linux-x64-musl': 1.3.62 175 | '@swc/core-win32-arm64-msvc': 1.3.62 176 | '@swc/core-win32-ia32-msvc': 1.3.62 177 | '@swc/core-win32-x64-msvc': 1.3.62 178 | dev: false 179 | 180 | /braces@3.0.2: 181 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 182 | engines: {node: '>=8'} 183 | dependencies: 184 | fill-range: 7.0.1 185 | dev: true 186 | 187 | /bumpp@8.2.1: 188 | resolution: {integrity: sha512-4tHKsWC2mqHQvdjZ4AXgVhS2xMsz8qQ4zYt87vGRXW5tqAjrYa/UJqy7s/dGYI2OIe9ghBdiFhKpyKEX9SXffg==} 189 | engines: {node: '>=10'} 190 | hasBin: true 191 | dependencies: 192 | '@jsdevtools/ez-spawn': 3.0.4 193 | cac: 6.7.14 194 | fast-glob: 3.2.11 195 | kleur: 4.1.5 196 | prompts: 2.4.2 197 | semver: 7.3.7 198 | dev: true 199 | 200 | /cac@6.7.14: 201 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 202 | engines: {node: '>=8'} 203 | dev: true 204 | 205 | /call-me-maybe@1.0.1: 206 | resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} 207 | dev: true 208 | 209 | /cross-spawn@7.0.3: 210 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 211 | engines: {node: '>= 8'} 212 | dependencies: 213 | path-key: 3.1.1 214 | shebang-command: 2.0.0 215 | which: 2.0.2 216 | dev: true 217 | 218 | /esbuild-android-64@0.14.38: 219 | resolution: {integrity: sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==} 220 | engines: {node: '>=12'} 221 | cpu: [x64] 222 | os: [android] 223 | requiresBuild: true 224 | dev: true 225 | optional: true 226 | 227 | /esbuild-android-arm64@0.14.38: 228 | resolution: {integrity: sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==} 229 | engines: {node: '>=12'} 230 | cpu: [arm64] 231 | os: [android] 232 | requiresBuild: true 233 | dev: true 234 | optional: true 235 | 236 | /esbuild-darwin-64@0.14.38: 237 | resolution: {integrity: sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [darwin] 241 | requiresBuild: true 242 | dev: true 243 | optional: true 244 | 245 | /esbuild-darwin-arm64@0.14.38: 246 | resolution: {integrity: sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==} 247 | engines: {node: '>=12'} 248 | cpu: [arm64] 249 | os: [darwin] 250 | requiresBuild: true 251 | dev: true 252 | optional: true 253 | 254 | /esbuild-freebsd-64@0.14.38: 255 | resolution: {integrity: sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==} 256 | engines: {node: '>=12'} 257 | cpu: [x64] 258 | os: [freebsd] 259 | requiresBuild: true 260 | dev: true 261 | optional: true 262 | 263 | /esbuild-freebsd-arm64@0.14.38: 264 | resolution: {integrity: sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==} 265 | engines: {node: '>=12'} 266 | cpu: [arm64] 267 | os: [freebsd] 268 | requiresBuild: true 269 | dev: true 270 | optional: true 271 | 272 | /esbuild-linux-32@0.14.38: 273 | resolution: {integrity: sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==} 274 | engines: {node: '>=12'} 275 | cpu: [ia32] 276 | os: [linux] 277 | requiresBuild: true 278 | dev: true 279 | optional: true 280 | 281 | /esbuild-linux-64@0.14.38: 282 | resolution: {integrity: sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==} 283 | engines: {node: '>=12'} 284 | cpu: [x64] 285 | os: [linux] 286 | requiresBuild: true 287 | dev: true 288 | optional: true 289 | 290 | /esbuild-linux-arm64@0.14.38: 291 | resolution: {integrity: sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==} 292 | engines: {node: '>=12'} 293 | cpu: [arm64] 294 | os: [linux] 295 | requiresBuild: true 296 | dev: true 297 | optional: true 298 | 299 | /esbuild-linux-arm@0.14.38: 300 | resolution: {integrity: sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==} 301 | engines: {node: '>=12'} 302 | cpu: [arm] 303 | os: [linux] 304 | requiresBuild: true 305 | dev: true 306 | optional: true 307 | 308 | /esbuild-linux-mips64le@0.14.38: 309 | resolution: {integrity: sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==} 310 | engines: {node: '>=12'} 311 | cpu: [mips64el] 312 | os: [linux] 313 | requiresBuild: true 314 | dev: true 315 | optional: true 316 | 317 | /esbuild-linux-ppc64le@0.14.38: 318 | resolution: {integrity: sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==} 319 | engines: {node: '>=12'} 320 | cpu: [ppc64] 321 | os: [linux] 322 | requiresBuild: true 323 | dev: true 324 | optional: true 325 | 326 | /esbuild-linux-riscv64@0.14.38: 327 | resolution: {integrity: sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==} 328 | engines: {node: '>=12'} 329 | cpu: [riscv64] 330 | os: [linux] 331 | requiresBuild: true 332 | dev: true 333 | optional: true 334 | 335 | /esbuild-linux-s390x@0.14.38: 336 | resolution: {integrity: sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==} 337 | engines: {node: '>=12'} 338 | cpu: [s390x] 339 | os: [linux] 340 | requiresBuild: true 341 | dev: true 342 | optional: true 343 | 344 | /esbuild-netbsd-64@0.14.38: 345 | resolution: {integrity: sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==} 346 | engines: {node: '>=12'} 347 | cpu: [x64] 348 | os: [netbsd] 349 | requiresBuild: true 350 | dev: true 351 | optional: true 352 | 353 | /esbuild-openbsd-64@0.14.38: 354 | resolution: {integrity: sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==} 355 | engines: {node: '>=12'} 356 | cpu: [x64] 357 | os: [openbsd] 358 | requiresBuild: true 359 | dev: true 360 | optional: true 361 | 362 | /esbuild-sunos-64@0.14.38: 363 | resolution: {integrity: sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==} 364 | engines: {node: '>=12'} 365 | cpu: [x64] 366 | os: [sunos] 367 | requiresBuild: true 368 | dev: true 369 | optional: true 370 | 371 | /esbuild-windows-32@0.14.38: 372 | resolution: {integrity: sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==} 373 | engines: {node: '>=12'} 374 | cpu: [ia32] 375 | os: [win32] 376 | requiresBuild: true 377 | dev: true 378 | optional: true 379 | 380 | /esbuild-windows-64@0.14.38: 381 | resolution: {integrity: sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==} 382 | engines: {node: '>=12'} 383 | cpu: [x64] 384 | os: [win32] 385 | requiresBuild: true 386 | dev: true 387 | optional: true 388 | 389 | /esbuild-windows-arm64@0.14.38: 390 | resolution: {integrity: sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==} 391 | engines: {node: '>=12'} 392 | cpu: [arm64] 393 | os: [win32] 394 | requiresBuild: true 395 | dev: true 396 | optional: true 397 | 398 | /fast-glob@3.2.11: 399 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 400 | engines: {node: '>=8.6.0'} 401 | dependencies: 402 | '@nodelib/fs.stat': 2.0.5 403 | '@nodelib/fs.walk': 1.2.8 404 | glob-parent: 5.1.2 405 | merge2: 1.4.1 406 | micromatch: 4.0.5 407 | dev: true 408 | 409 | /fastq@1.13.0: 410 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 411 | dependencies: 412 | reusify: 1.0.4 413 | dev: true 414 | 415 | /fill-range@7.0.1: 416 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 417 | engines: {node: '>=8'} 418 | dependencies: 419 | to-regex-range: 5.0.1 420 | dev: true 421 | 422 | /fsevents@2.3.2: 423 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 424 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 425 | os: [darwin] 426 | requiresBuild: true 427 | dev: true 428 | optional: true 429 | 430 | /glob-parent@5.1.2: 431 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 432 | engines: {node: '>= 6'} 433 | dependencies: 434 | is-glob: 4.0.3 435 | dev: true 436 | 437 | /is-extglob@2.1.1: 438 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 439 | engines: {node: '>=0.10.0'} 440 | dev: true 441 | 442 | /is-glob@4.0.3: 443 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 444 | engines: {node: '>=0.10.0'} 445 | dependencies: 446 | is-extglob: 2.1.1 447 | dev: true 448 | 449 | /is-number@7.0.0: 450 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 451 | engines: {node: '>=0.12.0'} 452 | dev: true 453 | 454 | /isexe@2.0.0: 455 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 456 | dev: true 457 | 458 | /kleur@3.0.3: 459 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 460 | engines: {node: '>=6'} 461 | dev: true 462 | 463 | /kleur@4.1.5: 464 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 465 | engines: {node: '>=6'} 466 | dev: true 467 | 468 | /lru-cache@6.0.0: 469 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 470 | engines: {node: '>=10'} 471 | dependencies: 472 | yallist: 4.0.0 473 | dev: true 474 | 475 | /merge2@1.4.1: 476 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 477 | engines: {node: '>= 8'} 478 | dev: true 479 | 480 | /micromatch@4.0.5: 481 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 482 | engines: {node: '>=8.6'} 483 | dependencies: 484 | braces: 3.0.2 485 | picomatch: 2.3.1 486 | dev: true 487 | 488 | /path-key@3.1.1: 489 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 490 | engines: {node: '>=8'} 491 | dev: true 492 | 493 | /picomatch@2.3.1: 494 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 495 | engines: {node: '>=8.6'} 496 | dev: true 497 | 498 | /prompts@2.4.2: 499 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 500 | engines: {node: '>= 6'} 501 | dependencies: 502 | kleur: 3.0.3 503 | sisteransi: 1.0.5 504 | dev: true 505 | 506 | /queue-microtask@1.2.3: 507 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 508 | dev: true 509 | 510 | /reusify@1.0.4: 511 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 512 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 513 | dev: true 514 | 515 | /run-parallel@1.2.0: 516 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 517 | dependencies: 518 | queue-microtask: 1.2.3 519 | dev: true 520 | 521 | /semver@7.3.7: 522 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} 523 | engines: {node: '>=10'} 524 | hasBin: true 525 | dependencies: 526 | lru-cache: 6.0.0 527 | dev: true 528 | 529 | /shebang-command@2.0.0: 530 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 531 | engines: {node: '>=8'} 532 | dependencies: 533 | shebang-regex: 3.0.0 534 | dev: true 535 | 536 | /shebang-regex@3.0.0: 537 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 538 | engines: {node: '>=8'} 539 | dev: true 540 | 541 | /sisteransi@1.0.5: 542 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 543 | dev: true 544 | 545 | /string-argv@0.3.1: 546 | resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} 547 | engines: {node: '>=0.6.19'} 548 | dev: true 549 | 550 | /to-regex-range@5.0.1: 551 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 552 | engines: {node: '>=8.0'} 553 | dependencies: 554 | is-number: 7.0.0 555 | dev: true 556 | 557 | /type-detect@4.0.8: 558 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 559 | engines: {node: '>=4'} 560 | dev: true 561 | 562 | /vitest@0.9.4(c8@7.11.2): 563 | resolution: {integrity: sha512-Em+EJb3keCr3GjyqnkxHuY7zMerEgLsN+m2nqsUcCzO7C4+Y0E7O7LXSNaODh3Gc/An3dqnoaAe/uLBrAJXUdQ==} 564 | engines: {node: '>=v14.16.0'} 565 | hasBin: true 566 | peerDependencies: 567 | '@vitest/ui': '*' 568 | c8: '*' 569 | happy-dom: '*' 570 | jsdom: '*' 571 | peerDependenciesMeta: 572 | '@vitest/ui': 573 | optional: true 574 | c8: 575 | optional: true 576 | happy-dom: 577 | optional: true 578 | jsdom: 579 | optional: true 580 | dependencies: 581 | '@types/chai': registry.npmmirror.com/@types/chai@4.3.1 582 | '@types/chai-subset': registry.npmmirror.com/@types/chai-subset@1.3.3 583 | c8: registry.npmmirror.com/c8@7.11.2 584 | chai: registry.npmmirror.com/chai@4.3.6 585 | local-pkg: registry.npmmirror.com/local-pkg@0.4.1 586 | tinypool: registry.npmmirror.com/tinypool@0.1.2 587 | tinyspy: registry.npmmirror.com/tinyspy@0.3.2 588 | vite: registry.npmmirror.com/vite@2.9.5 589 | transitivePeerDependencies: 590 | - less 591 | - sass 592 | - stylus 593 | dev: true 594 | 595 | /which@2.0.2: 596 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 597 | engines: {node: '>= 8'} 598 | hasBin: true 599 | dependencies: 600 | isexe: 2.0.0 601 | dev: true 602 | 603 | /yallist@4.0.0: 604 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 605 | dev: true 606 | 607 | registry.nlark.com/concat-map@0.0.1: 608 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz} 609 | name: concat-map 610 | version: 0.0.1 611 | dev: true 612 | 613 | registry.npmmirror.com/@bcoe/v8-coverage@0.2.3: 614 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz} 615 | name: '@bcoe/v8-coverage' 616 | version: 0.2.3 617 | dev: true 618 | 619 | registry.npmmirror.com/@istanbuljs/schema@0.1.3: 620 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz} 621 | name: '@istanbuljs/schema' 622 | version: 0.1.3 623 | engines: {node: '>=8'} 624 | dev: true 625 | 626 | registry.npmmirror.com/@jridgewell/resolve-uri@3.0.6: 627 | resolution: {integrity: sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz} 628 | name: '@jridgewell/resolve-uri' 629 | version: 3.0.6 630 | engines: {node: '>=6.0.0'} 631 | dev: true 632 | 633 | registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.11: 634 | resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz} 635 | name: '@jridgewell/sourcemap-codec' 636 | version: 1.4.11 637 | dev: true 638 | 639 | registry.npmmirror.com/@jridgewell/trace-mapping@0.3.9: 640 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz} 641 | name: '@jridgewell/trace-mapping' 642 | version: 0.3.9 643 | dependencies: 644 | '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri@3.0.6 645 | '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.11 646 | dev: true 647 | 648 | registry.npmmirror.com/@types/chai-subset@1.3.3: 649 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/chai-subset/-/chai-subset-1.3.3.tgz} 650 | name: '@types/chai-subset' 651 | version: 1.3.3 652 | dependencies: 653 | '@types/chai': registry.npmmirror.com/@types/chai@4.3.1 654 | dev: true 655 | 656 | registry.npmmirror.com/@types/chai@4.3.1: 657 | resolution: {integrity: sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/chai/-/chai-4.3.1.tgz} 658 | name: '@types/chai' 659 | version: 4.3.1 660 | dev: true 661 | 662 | registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.4: 663 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz} 664 | name: '@types/istanbul-lib-coverage' 665 | version: 2.0.4 666 | dev: true 667 | 668 | registry.npmmirror.com/@types/node@16.11.27: 669 | resolution: {integrity: sha512-C1pD3kgLoZ56Uuy5lhfOxie4aZlA3UMGLX9rXteq4WitEZH6Rl80mwactt9QG0w0gLFlN/kLBTFnGXtDVWvWQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-16.11.27.tgz} 670 | name: '@types/node' 671 | version: 16.11.27 672 | dev: true 673 | 674 | registry.npmmirror.com/ansi-regex@5.0.1: 675 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz} 676 | name: ansi-regex 677 | version: 5.0.1 678 | engines: {node: '>=8'} 679 | dev: true 680 | 681 | registry.npmmirror.com/ansi-styles@4.3.0: 682 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} 683 | name: ansi-styles 684 | version: 4.3.0 685 | engines: {node: '>=8'} 686 | dependencies: 687 | color-convert: registry.npmmirror.com/color-convert@2.0.1 688 | dev: true 689 | 690 | registry.npmmirror.com/assertion-error@1.1.0: 691 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz} 692 | name: assertion-error 693 | version: 1.1.0 694 | dev: true 695 | 696 | registry.npmmirror.com/balanced-match@1.0.2: 697 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz} 698 | name: balanced-match 699 | version: 1.0.2 700 | dev: true 701 | 702 | registry.npmmirror.com/boolbase@1.0.0: 703 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz} 704 | name: boolbase 705 | version: 1.0.0 706 | dev: false 707 | 708 | registry.npmmirror.com/brace-expansion@1.1.11: 709 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz} 710 | name: brace-expansion 711 | version: 1.1.11 712 | dependencies: 713 | balanced-match: registry.npmmirror.com/balanced-match@1.0.2 714 | concat-map: registry.nlark.com/concat-map@0.0.1 715 | dev: true 716 | 717 | registry.npmmirror.com/c8@7.11.2: 718 | resolution: {integrity: sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/c8/-/c8-7.11.2.tgz} 719 | name: c8 720 | version: 7.11.2 721 | engines: {node: '>=10.12.0'} 722 | hasBin: true 723 | dependencies: 724 | '@bcoe/v8-coverage': registry.npmmirror.com/@bcoe/v8-coverage@0.2.3 725 | '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 726 | find-up: registry.npmmirror.com/find-up@5.0.0 727 | foreground-child: registry.npmmirror.com/foreground-child@2.0.0 728 | istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.0 729 | istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.0 730 | istanbul-reports: registry.npmmirror.com/istanbul-reports@3.1.4 731 | rimraf: registry.npmmirror.com/rimraf@3.0.2 732 | test-exclude: registry.npmmirror.com/test-exclude@6.0.0 733 | v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul@9.0.0 734 | yargs: registry.npmmirror.com/yargs@16.2.0 735 | yargs-parser: registry.npmmirror.com/yargs-parser@20.2.9 736 | dev: true 737 | 738 | registry.npmmirror.com/chai@4.3.6: 739 | resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chai/-/chai-4.3.6.tgz} 740 | name: chai 741 | version: 4.3.6 742 | engines: {node: '>=4'} 743 | dependencies: 744 | assertion-error: registry.npmmirror.com/assertion-error@1.1.0 745 | check-error: registry.npmmirror.com/check-error@1.0.2 746 | deep-eql: registry.npmmirror.com/deep-eql@3.0.1 747 | get-func-name: registry.npmmirror.com/get-func-name@2.0.0 748 | loupe: registry.npmmirror.com/loupe@2.3.4 749 | pathval: registry.npmmirror.com/pathval@1.1.1 750 | type-detect: registry.npmmirror.com/type-detect@4.0.8 751 | dev: true 752 | 753 | registry.npmmirror.com/check-error@1.0.2: 754 | resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.2.tgz} 755 | name: check-error 756 | version: 1.0.2 757 | dev: true 758 | 759 | registry.npmmirror.com/cliui@7.0.4: 760 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz} 761 | name: cliui 762 | version: 7.0.4 763 | dependencies: 764 | string-width: registry.npmmirror.com/string-width@4.2.3 765 | strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 766 | wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 767 | dev: true 768 | 769 | registry.npmmirror.com/color-convert@2.0.1: 770 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} 771 | name: color-convert 772 | version: 2.0.1 773 | engines: {node: '>=7.0.0'} 774 | dependencies: 775 | color-name: registry.npmmirror.com/color-name@1.1.4 776 | dev: true 777 | 778 | registry.npmmirror.com/color-name@1.1.4: 779 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} 780 | name: color-name 781 | version: 1.1.4 782 | dev: true 783 | 784 | registry.npmmirror.com/convert-source-map@1.8.0: 785 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz} 786 | name: convert-source-map 787 | version: 1.8.0 788 | dependencies: 789 | safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 790 | dev: true 791 | 792 | registry.npmmirror.com/cross-spawn@7.0.3: 793 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz} 794 | name: cross-spawn 795 | version: 7.0.3 796 | engines: {node: '>= 8'} 797 | dependencies: 798 | path-key: registry.npmmirror.com/path-key@3.1.1 799 | shebang-command: registry.npmmirror.com/shebang-command@2.0.0 800 | which: registry.npmmirror.com/which@2.0.2 801 | dev: true 802 | 803 | registry.npmmirror.com/css-select@4.3.0: 804 | resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz} 805 | name: css-select 806 | version: 4.3.0 807 | dependencies: 808 | boolbase: registry.npmmirror.com/boolbase@1.0.0 809 | css-what: registry.npmmirror.com/css-what@6.1.0 810 | domhandler: registry.npmmirror.com/domhandler@4.3.1 811 | domutils: registry.npmmirror.com/domutils@2.8.0 812 | nth-check: registry.npmmirror.com/nth-check@2.0.1 813 | dev: false 814 | 815 | registry.npmmirror.com/css-what@6.1.0: 816 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz} 817 | name: css-what 818 | version: 6.1.0 819 | engines: {node: '>= 6'} 820 | dev: false 821 | 822 | registry.npmmirror.com/deep-eql@3.0.1: 823 | resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-3.0.1.tgz} 824 | name: deep-eql 825 | version: 3.0.1 826 | engines: {node: '>=0.12'} 827 | dependencies: 828 | type-detect: registry.npmmirror.com/type-detect@4.0.8 829 | dev: true 830 | 831 | registry.npmmirror.com/dom-serializer@1.4.1: 832 | resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz} 833 | name: dom-serializer 834 | version: 1.4.1 835 | dependencies: 836 | domelementtype: registry.npmmirror.com/domelementtype@2.3.0 837 | domhandler: registry.npmmirror.com/domhandler@4.3.1 838 | entities: registry.npmmirror.com/entities@2.2.0 839 | dev: false 840 | 841 | registry.npmmirror.com/domelementtype@2.3.0: 842 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz} 843 | name: domelementtype 844 | version: 2.3.0 845 | dev: false 846 | 847 | registry.npmmirror.com/domhandler@4.3.1: 848 | resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz} 849 | name: domhandler 850 | version: 4.3.1 851 | engines: {node: '>= 4'} 852 | dependencies: 853 | domelementtype: registry.npmmirror.com/domelementtype@2.3.0 854 | dev: false 855 | 856 | registry.npmmirror.com/domutils@2.8.0: 857 | resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz} 858 | name: domutils 859 | version: 2.8.0 860 | dependencies: 861 | dom-serializer: registry.npmmirror.com/dom-serializer@1.4.1 862 | domelementtype: registry.npmmirror.com/domelementtype@2.3.0 863 | domhandler: registry.npmmirror.com/domhandler@4.3.1 864 | dev: false 865 | 866 | registry.npmmirror.com/emoji-regex@8.0.0: 867 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz} 868 | name: emoji-regex 869 | version: 8.0.0 870 | dev: true 871 | 872 | registry.npmmirror.com/entities@2.2.0: 873 | resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz} 874 | name: entities 875 | version: 2.2.0 876 | dev: false 877 | 878 | registry.npmmirror.com/esbuild@0.14.38: 879 | resolution: {integrity: sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.14.38.tgz} 880 | name: esbuild 881 | version: 0.14.38 882 | engines: {node: '>=12'} 883 | hasBin: true 884 | requiresBuild: true 885 | optionalDependencies: 886 | esbuild-android-64: 0.14.38 887 | esbuild-android-arm64: 0.14.38 888 | esbuild-darwin-64: 0.14.38 889 | esbuild-darwin-arm64: 0.14.38 890 | esbuild-freebsd-64: 0.14.38 891 | esbuild-freebsd-arm64: 0.14.38 892 | esbuild-linux-32: 0.14.38 893 | esbuild-linux-64: 0.14.38 894 | esbuild-linux-arm: 0.14.38 895 | esbuild-linux-arm64: 0.14.38 896 | esbuild-linux-mips64le: 0.14.38 897 | esbuild-linux-ppc64le: 0.14.38 898 | esbuild-linux-riscv64: 0.14.38 899 | esbuild-linux-s390x: 0.14.38 900 | esbuild-netbsd-64: 0.14.38 901 | esbuild-openbsd-64: 0.14.38 902 | esbuild-sunos-64: 0.14.38 903 | esbuild-windows-32: 0.14.38 904 | esbuild-windows-64: 0.14.38 905 | esbuild-windows-arm64: 0.14.38 906 | dev: true 907 | 908 | registry.npmmirror.com/escalade@3.1.1: 909 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} 910 | name: escalade 911 | version: 3.1.1 912 | engines: {node: '>=6'} 913 | dev: true 914 | 915 | registry.npmmirror.com/find-up@5.0.0: 916 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz} 917 | name: find-up 918 | version: 5.0.0 919 | engines: {node: '>=10'} 920 | dependencies: 921 | locate-path: registry.npmmirror.com/locate-path@6.0.0 922 | path-exists: registry.npmmirror.com/path-exists@4.0.0 923 | dev: true 924 | 925 | registry.npmmirror.com/foreground-child@2.0.0: 926 | resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/foreground-child/-/foreground-child-2.0.0.tgz} 927 | name: foreground-child 928 | version: 2.0.0 929 | engines: {node: '>=8.0.0'} 930 | dependencies: 931 | cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 932 | signal-exit: registry.npmmirror.com/signal-exit@3.0.7 933 | dev: true 934 | 935 | registry.npmmirror.com/fs.realpath@1.0.0: 936 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz} 937 | name: fs.realpath 938 | version: 1.0.0 939 | dev: true 940 | 941 | registry.npmmirror.com/function-bind@1.1.1: 942 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz} 943 | name: function-bind 944 | version: 1.1.1 945 | dev: true 946 | 947 | registry.npmmirror.com/get-caller-file@2.0.5: 948 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz} 949 | name: get-caller-file 950 | version: 2.0.5 951 | engines: {node: 6.* || 8.* || >= 10.*} 952 | dev: true 953 | 954 | registry.npmmirror.com/get-func-name@2.0.0: 955 | resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.0.tgz} 956 | name: get-func-name 957 | version: 2.0.0 958 | dev: true 959 | 960 | registry.npmmirror.com/glob@7.2.0: 961 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz} 962 | name: glob 963 | version: 7.2.0 964 | dependencies: 965 | fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 966 | inflight: registry.npmmirror.com/inflight@1.0.6 967 | inherits: registry.npmmirror.com/inherits@2.0.4 968 | minimatch: registry.npmmirror.com/minimatch@3.1.2 969 | once: registry.npmmirror.com/once@1.4.0 970 | path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 971 | dev: true 972 | 973 | registry.npmmirror.com/has-flag@4.0.0: 974 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz} 975 | name: has-flag 976 | version: 4.0.0 977 | engines: {node: '>=8'} 978 | dev: true 979 | 980 | registry.npmmirror.com/has@1.0.3: 981 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has/-/has-1.0.3.tgz} 982 | name: has 983 | version: 1.0.3 984 | engines: {node: '>= 0.4.0'} 985 | dependencies: 986 | function-bind: registry.npmmirror.com/function-bind@1.1.1 987 | dev: true 988 | 989 | registry.npmmirror.com/he@1.2.0: 990 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} 991 | name: he 992 | version: 1.2.0 993 | hasBin: true 994 | dev: false 995 | 996 | registry.npmmirror.com/html-escaper@2.0.2: 997 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz} 998 | name: html-escaper 999 | version: 2.0.2 1000 | dev: true 1001 | 1002 | registry.npmmirror.com/inflight@1.0.6: 1003 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz} 1004 | name: inflight 1005 | version: 1.0.6 1006 | dependencies: 1007 | once: registry.npmmirror.com/once@1.4.0 1008 | wrappy: registry.npmmirror.com/wrappy@1.0.2 1009 | dev: true 1010 | 1011 | registry.npmmirror.com/inherits@2.0.4: 1012 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz} 1013 | name: inherits 1014 | version: 2.0.4 1015 | dev: true 1016 | 1017 | registry.npmmirror.com/is-core-module@2.9.0: 1018 | resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz} 1019 | name: is-core-module 1020 | version: 2.9.0 1021 | dependencies: 1022 | has: registry.npmmirror.com/has@1.0.3 1023 | dev: true 1024 | 1025 | registry.npmmirror.com/is-fullwidth-code-point@3.0.0: 1026 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} 1027 | name: is-fullwidth-code-point 1028 | version: 3.0.0 1029 | engines: {node: '>=8'} 1030 | dev: true 1031 | 1032 | registry.npmmirror.com/isexe@2.0.0: 1033 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz} 1034 | name: isexe 1035 | version: 2.0.0 1036 | dev: true 1037 | 1038 | registry.npmmirror.com/istanbul-lib-coverage@3.2.0: 1039 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz} 1040 | name: istanbul-lib-coverage 1041 | version: 3.2.0 1042 | engines: {node: '>=8'} 1043 | dev: true 1044 | 1045 | registry.npmmirror.com/istanbul-lib-report@3.0.0: 1046 | resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz} 1047 | name: istanbul-lib-report 1048 | version: 3.0.0 1049 | engines: {node: '>=8'} 1050 | dependencies: 1051 | istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.0 1052 | make-dir: registry.npmmirror.com/make-dir@3.1.0 1053 | supports-color: registry.npmmirror.com/supports-color@7.2.0 1054 | dev: true 1055 | 1056 | registry.npmmirror.com/istanbul-reports@3.1.4: 1057 | resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz} 1058 | name: istanbul-reports 1059 | version: 3.1.4 1060 | engines: {node: '>=8'} 1061 | dependencies: 1062 | html-escaper: registry.npmmirror.com/html-escaper@2.0.2 1063 | istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.0 1064 | dev: true 1065 | 1066 | registry.npmmirror.com/local-pkg@0.4.1: 1067 | resolution: {integrity: sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.1.tgz} 1068 | name: local-pkg 1069 | version: 0.4.1 1070 | engines: {node: '>=14'} 1071 | dev: true 1072 | 1073 | registry.npmmirror.com/locate-path@6.0.0: 1074 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz} 1075 | name: locate-path 1076 | version: 6.0.0 1077 | engines: {node: '>=10'} 1078 | dependencies: 1079 | p-locate: registry.npmmirror.com/p-locate@5.0.0 1080 | dev: true 1081 | 1082 | registry.npmmirror.com/loupe@2.3.4: 1083 | resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.4.tgz} 1084 | name: loupe 1085 | version: 2.3.4 1086 | dependencies: 1087 | get-func-name: registry.npmmirror.com/get-func-name@2.0.0 1088 | dev: true 1089 | 1090 | registry.npmmirror.com/make-dir@3.1.0: 1091 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz} 1092 | name: make-dir 1093 | version: 3.1.0 1094 | engines: {node: '>=8'} 1095 | dependencies: 1096 | semver: registry.npmmirror.com/semver@6.3.0 1097 | dev: true 1098 | 1099 | registry.npmmirror.com/minimatch@3.1.2: 1100 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz} 1101 | name: minimatch 1102 | version: 3.1.2 1103 | dependencies: 1104 | brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 1105 | dev: true 1106 | 1107 | registry.npmmirror.com/nanoid@3.3.3: 1108 | resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz} 1109 | name: nanoid 1110 | version: 3.3.3 1111 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1112 | hasBin: true 1113 | dev: true 1114 | 1115 | registry.npmmirror.com/node-html-parser@5.3.3: 1116 | resolution: {integrity: sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.3.3.tgz} 1117 | name: node-html-parser 1118 | version: 5.3.3 1119 | dependencies: 1120 | css-select: registry.npmmirror.com/css-select@4.3.0 1121 | he: registry.npmmirror.com/he@1.2.0 1122 | dev: false 1123 | 1124 | registry.npmmirror.com/nth-check@2.0.1: 1125 | resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nth-check/-/nth-check-2.0.1.tgz} 1126 | name: nth-check 1127 | version: 2.0.1 1128 | dependencies: 1129 | boolbase: registry.npmmirror.com/boolbase@1.0.0 1130 | dev: false 1131 | 1132 | registry.npmmirror.com/once@1.4.0: 1133 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz} 1134 | name: once 1135 | version: 1.4.0 1136 | dependencies: 1137 | wrappy: registry.npmmirror.com/wrappy@1.0.2 1138 | dev: true 1139 | 1140 | registry.npmmirror.com/p-limit@3.1.0: 1141 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz} 1142 | name: p-limit 1143 | version: 3.1.0 1144 | engines: {node: '>=10'} 1145 | dependencies: 1146 | yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 1147 | dev: true 1148 | 1149 | registry.npmmirror.com/p-locate@5.0.0: 1150 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz} 1151 | name: p-locate 1152 | version: 5.0.0 1153 | engines: {node: '>=10'} 1154 | dependencies: 1155 | p-limit: registry.npmmirror.com/p-limit@3.1.0 1156 | dev: true 1157 | 1158 | registry.npmmirror.com/path-exists@4.0.0: 1159 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz} 1160 | name: path-exists 1161 | version: 4.0.0 1162 | engines: {node: '>=8'} 1163 | dev: true 1164 | 1165 | registry.npmmirror.com/path-is-absolute@1.0.1: 1166 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz} 1167 | name: path-is-absolute 1168 | version: 1.0.1 1169 | engines: {node: '>=0.10.0'} 1170 | dev: true 1171 | 1172 | registry.npmmirror.com/path-key@3.1.1: 1173 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz} 1174 | name: path-key 1175 | version: 3.1.1 1176 | engines: {node: '>=8'} 1177 | dev: true 1178 | 1179 | registry.npmmirror.com/path-parse@1.0.7: 1180 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz} 1181 | name: path-parse 1182 | version: 1.0.7 1183 | dev: true 1184 | 1185 | registry.npmmirror.com/pathval@1.1.1: 1186 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz} 1187 | name: pathval 1188 | version: 1.1.1 1189 | dev: true 1190 | 1191 | registry.npmmirror.com/picocolors@1.0.0: 1192 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} 1193 | name: picocolors 1194 | version: 1.0.0 1195 | dev: true 1196 | 1197 | registry.npmmirror.com/postcss@8.4.12: 1198 | resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-8.4.12.tgz} 1199 | name: postcss 1200 | version: 8.4.12 1201 | engines: {node: ^10 || ^12 || >=14} 1202 | dependencies: 1203 | nanoid: registry.npmmirror.com/nanoid@3.3.3 1204 | picocolors: registry.npmmirror.com/picocolors@1.0.0 1205 | source-map-js: registry.npmmirror.com/source-map-js@1.0.2 1206 | dev: true 1207 | 1208 | registry.npmmirror.com/require-directory@2.1.1: 1209 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz} 1210 | name: require-directory 1211 | version: 2.1.1 1212 | engines: {node: '>=0.10.0'} 1213 | dev: true 1214 | 1215 | registry.npmmirror.com/resolve@1.22.0: 1216 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz} 1217 | name: resolve 1218 | version: 1.22.0 1219 | hasBin: true 1220 | dependencies: 1221 | is-core-module: registry.npmmirror.com/is-core-module@2.9.0 1222 | path-parse: registry.npmmirror.com/path-parse@1.0.7 1223 | supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 1224 | dev: true 1225 | 1226 | registry.npmmirror.com/rimraf@3.0.2: 1227 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz} 1228 | name: rimraf 1229 | version: 3.0.2 1230 | hasBin: true 1231 | dependencies: 1232 | glob: registry.npmmirror.com/glob@7.2.0 1233 | dev: true 1234 | 1235 | registry.npmmirror.com/rollup@2.70.2: 1236 | resolution: {integrity: sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup/-/rollup-2.70.2.tgz} 1237 | name: rollup 1238 | version: 2.70.2 1239 | engines: {node: '>=10.0.0'} 1240 | hasBin: true 1241 | optionalDependencies: 1242 | fsevents: 2.3.2 1243 | dev: true 1244 | 1245 | registry.npmmirror.com/safe-buffer@5.1.2: 1246 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz} 1247 | name: safe-buffer 1248 | version: 5.1.2 1249 | dev: true 1250 | 1251 | registry.npmmirror.com/semver@6.3.0: 1252 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz} 1253 | name: semver 1254 | version: 6.3.0 1255 | hasBin: true 1256 | dev: true 1257 | 1258 | registry.npmmirror.com/shebang-command@2.0.0: 1259 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz} 1260 | name: shebang-command 1261 | version: 2.0.0 1262 | engines: {node: '>=8'} 1263 | dependencies: 1264 | shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 1265 | dev: true 1266 | 1267 | registry.npmmirror.com/shebang-regex@3.0.0: 1268 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz} 1269 | name: shebang-regex 1270 | version: 3.0.0 1271 | engines: {node: '>=8'} 1272 | dev: true 1273 | 1274 | registry.npmmirror.com/signal-exit@3.0.7: 1275 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz} 1276 | name: signal-exit 1277 | version: 3.0.7 1278 | dev: true 1279 | 1280 | registry.npmmirror.com/source-map-js@1.0.2: 1281 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz} 1282 | name: source-map-js 1283 | version: 1.0.2 1284 | engines: {node: '>=0.10.0'} 1285 | dev: true 1286 | 1287 | registry.npmmirror.com/string-width@4.2.3: 1288 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz} 1289 | name: string-width 1290 | version: 4.2.3 1291 | engines: {node: '>=8'} 1292 | dependencies: 1293 | emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 1294 | is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 1295 | strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 1296 | dev: true 1297 | 1298 | registry.npmmirror.com/strip-ansi@6.0.1: 1299 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz} 1300 | name: strip-ansi 1301 | version: 6.0.1 1302 | engines: {node: '>=8'} 1303 | dependencies: 1304 | ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 1305 | dev: true 1306 | 1307 | registry.npmmirror.com/supports-color@7.2.0: 1308 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz} 1309 | name: supports-color 1310 | version: 7.2.0 1311 | engines: {node: '>=8'} 1312 | dependencies: 1313 | has-flag: registry.npmmirror.com/has-flag@4.0.0 1314 | dev: true 1315 | 1316 | registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: 1317 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} 1318 | name: supports-preserve-symlinks-flag 1319 | version: 1.0.0 1320 | engines: {node: '>= 0.4'} 1321 | dev: true 1322 | 1323 | registry.npmmirror.com/test-exclude@6.0.0: 1324 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz} 1325 | name: test-exclude 1326 | version: 6.0.0 1327 | engines: {node: '>=8'} 1328 | dependencies: 1329 | '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 1330 | glob: registry.npmmirror.com/glob@7.2.0 1331 | minimatch: registry.npmmirror.com/minimatch@3.1.2 1332 | dev: true 1333 | 1334 | registry.npmmirror.com/tinypool@0.1.2: 1335 | resolution: {integrity: sha512-fvtYGXoui2RpeMILfkvGIgOVkzJEGediv8UJt7TxdAOY8pnvUkFg/fkvqTfXG9Acc9S17Cnn1S4osDc2164guA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinypool/-/tinypool-0.1.2.tgz} 1336 | name: tinypool 1337 | version: 0.1.2 1338 | engines: {node: '>=14.0.0'} 1339 | dev: true 1340 | 1341 | registry.npmmirror.com/tinyspy@0.3.2: 1342 | resolution: {integrity: sha512-2+40EP4D3sFYy42UkgkFFB+kiX2Tg3URG/lVvAZFfLxgGpnWl5qQJuBw1gaLttq8UOS+2p3C0WrhJnQigLTT2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinyspy/-/tinyspy-0.3.2.tgz} 1343 | name: tinyspy 1344 | version: 0.3.2 1345 | engines: {node: '>=14.0.0'} 1346 | dev: true 1347 | 1348 | registry.npmmirror.com/type-detect@4.0.8: 1349 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz} 1350 | name: type-detect 1351 | version: 4.0.8 1352 | engines: {node: '>=4'} 1353 | dev: true 1354 | 1355 | registry.npmmirror.com/typescript@4.6.3: 1356 | resolution: {integrity: sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typescript/-/typescript-4.6.3.tgz} 1357 | name: typescript 1358 | version: 4.6.3 1359 | engines: {node: '>=4.2.0'} 1360 | hasBin: true 1361 | dev: true 1362 | 1363 | registry.npmmirror.com/v8-to-istanbul@9.0.0: 1364 | resolution: {integrity: sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz} 1365 | name: v8-to-istanbul 1366 | version: 9.0.0 1367 | engines: {node: '>=10.12.0'} 1368 | dependencies: 1369 | '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.9 1370 | '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.4 1371 | convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 1372 | dev: true 1373 | 1374 | registry.npmmirror.com/vite@2.9.5: 1375 | resolution: {integrity: sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite/-/vite-2.9.5.tgz} 1376 | name: vite 1377 | version: 2.9.5 1378 | engines: {node: '>=12.2.0'} 1379 | hasBin: true 1380 | peerDependencies: 1381 | less: '*' 1382 | sass: '*' 1383 | stylus: '*' 1384 | peerDependenciesMeta: 1385 | less: 1386 | optional: true 1387 | sass: 1388 | optional: true 1389 | stylus: 1390 | optional: true 1391 | dependencies: 1392 | esbuild: registry.npmmirror.com/esbuild@0.14.38 1393 | postcss: registry.npmmirror.com/postcss@8.4.12 1394 | resolve: registry.npmmirror.com/resolve@1.22.0 1395 | rollup: registry.npmmirror.com/rollup@2.70.2 1396 | optionalDependencies: 1397 | fsevents: 2.3.2 1398 | dev: true 1399 | 1400 | registry.npmmirror.com/which@2.0.2: 1401 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz} 1402 | name: which 1403 | version: 2.0.2 1404 | engines: {node: '>= 8'} 1405 | hasBin: true 1406 | dependencies: 1407 | isexe: registry.npmmirror.com/isexe@2.0.0 1408 | dev: true 1409 | 1410 | registry.npmmirror.com/wrap-ansi@7.0.0: 1411 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz} 1412 | name: wrap-ansi 1413 | version: 7.0.0 1414 | engines: {node: '>=10'} 1415 | dependencies: 1416 | ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 1417 | string-width: registry.npmmirror.com/string-width@4.2.3 1418 | strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 1419 | dev: true 1420 | 1421 | registry.npmmirror.com/wrappy@1.0.2: 1422 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz} 1423 | name: wrappy 1424 | version: 1.0.2 1425 | dev: true 1426 | 1427 | registry.npmmirror.com/y18n@5.0.8: 1428 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} 1429 | name: y18n 1430 | version: 5.0.8 1431 | engines: {node: '>=10'} 1432 | dev: true 1433 | 1434 | registry.npmmirror.com/yargs-parser@20.2.9: 1435 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz} 1436 | name: yargs-parser 1437 | version: 20.2.9 1438 | engines: {node: '>=10'} 1439 | dev: true 1440 | 1441 | registry.npmmirror.com/yargs@16.2.0: 1442 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz} 1443 | name: yargs 1444 | version: 16.2.0 1445 | engines: {node: '>=10'} 1446 | dependencies: 1447 | cliui: registry.npmmirror.com/cliui@7.0.4 1448 | escalade: registry.npmmirror.com/escalade@3.1.1 1449 | get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 1450 | require-directory: registry.npmmirror.com/require-directory@2.1.1 1451 | string-width: registry.npmmirror.com/string-width@4.2.3 1452 | y18n: registry.npmmirror.com/y18n@5.0.8 1453 | yargs-parser: registry.npmmirror.com/yargs-parser@20.2.9 1454 | dev: true 1455 | 1456 | registry.npmmirror.com/yocto-queue@0.1.0: 1457 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz} 1458 | name: yocto-queue 1459 | version: 0.1.0 1460 | engines: {node: '>=10'} 1461 | dev: true 1462 | -------------------------------------------------------------------------------- /src/core/ast.ts: -------------------------------------------------------------------------------- 1 | import {Expression, ModuleItem, parse, StringLiteral, TemplateElement, TemplateLiteral} from "@swc/core"; 2 | import Visitor from "@swc/core/Visitor"; 3 | 4 | /** 5 | * Traverses an AST (or parts of it) to collect all StringLiterals and TemplateElements that contain 6 | * needle in their value. 7 | */ 8 | export class StringCollector extends Visitor { 9 | public matchingStrings: (StringLiteral|TemplateElement)[] = []; 10 | private readonly needle: string; 11 | 12 | constructor(needle: string) { 13 | super(); 14 | this.needle = needle; 15 | } 16 | 17 | visitStringLiteral(n: StringLiteral): StringLiteral { 18 | if (n.value.indexOf(this.needle) !== -1) { 19 | this.matchingStrings.push(n); 20 | } 21 | 22 | return super.visitStringLiteral(n); 23 | } 24 | 25 | visitTemplateLiteral(n: TemplateLiteral): Expression { 26 | for(const q of n.quasis) { 27 | if (q.raw.indexOf(this.needle) !== -1) { 28 | this.matchingStrings.push(q); 29 | } 30 | } 31 | 32 | return super.visitTemplateLiteral(n); 33 | } 34 | } 35 | 36 | /** 37 | * Represents a string as bytes, so it can be sliced via 38 | * byte-positions. 39 | */ 40 | export class StringAsBytes { 41 | private string: Uint8Array; 42 | private decoder: TextDecoder; 43 | 44 | constructor(string: string) { 45 | this.decoder = new TextDecoder(); 46 | this.string = (new TextEncoder()).encode(string); 47 | } 48 | 49 | /** 50 | * Returns a slice of the string by providing byte indices. 51 | * @param from - Byte index to slice from 52 | * @param to - Optional byte index to slice to 53 | */ 54 | public slice(from: number, to?: number): string { 55 | return this.decoder.decode( 56 | new DataView(this.string.buffer, from, to !== undefined ? to - from : undefined) 57 | ); 58 | } 59 | } 60 | 61 | /** 62 | * Parses js code into a AST. 63 | * @param code 64 | */ 65 | export async function parseCode(code: string): Promise<[number, ModuleItem[]]> { 66 | const module = await parse(code, { target: 'esnext', syntax: 'ecmascript' }); 67 | return [module.span.start, module.body]; 68 | } 69 | 70 | /** 71 | * Returns an array of StringLiterals and TemplateElements from an AST that contain needle in their value. 72 | * @param needle 73 | * @param ast 74 | */ 75 | export function collectMatchingStrings(needle: string, ast: ModuleItem[]): (StringLiteral|TemplateElement)[] { 76 | const visitor = new StringCollector(needle); 77 | visitor.visitModuleItems(ast); 78 | 79 | return visitor.matchingStrings; 80 | } 81 | -------------------------------------------------------------------------------- /src/core/transform.ts: -------------------------------------------------------------------------------- 1 | import type {TransformOptions, TransformIndexHtmlConfig} from '../types' 2 | import {parse} from 'node-html-parser' 3 | import {replace, replaceImport, replaceInStringLiteral, replaceInTemplateElement, replaceSrc} from './utils' 4 | import {StringAsBytes, collectMatchingStrings, parseCode} from "./ast"; 5 | 6 | export async function transformChunk(codeStr: string, options: TransformOptions): Promise { 7 | const { base, publicPath } = options 8 | const [spanOffset, ast] = await parseCode(codeStr); 9 | 10 | const strings = collectMatchingStrings(base, ast); 11 | 12 | if (strings.length === 0) { 13 | return codeStr; 14 | } 15 | 16 | const code = new StringAsBytes(codeStr); 17 | 18 | let lastIdx = 0; 19 | let transformedCode = ""; 20 | 21 | for (const str of strings) { 22 | const prev = code.slice(lastIdx, str.span.start - spanOffset); 23 | 24 | let transformed: string; 25 | if (str.type === 'TemplateElement') { 26 | transformed = replaceInTemplateElement(str, base, publicPath); 27 | } else if (str.type === 'StringLiteral') { 28 | transformed = replaceInStringLiteral(str, base, publicPath); 29 | } 30 | 31 | lastIdx = str.span.end - spanOffset; 32 | transformedCode += prev + transformed; 33 | } 34 | transformedCode += code.slice(lastIdx); 35 | 36 | return transformedCode; 37 | } 38 | 39 | export function transformAsset(code: string, options: TransformOptions) { 40 | const { assetsDir, base } = options 41 | let content = replace(`${base}${assetsDir}/`, '', code) 42 | content = replace(base, '', content) 43 | return content 44 | } 45 | 46 | export function transformLegacyHtml(code: string, options: TransformOptions) { 47 | const { base, publicPath } = options 48 | let content = replaceSrc(publicPath, code) 49 | content = replace(base, '/', content) 50 | content = replaceImport(publicPath, content) 51 | const document = parse(content, { comment: true }) 52 | const legacyPolyfill = document.getElementById('vite-legacy-polyfill') 53 | if (legacyPolyfill) { 54 | legacyPolyfill.setAttribute('data-src', legacyPolyfill.getAttribute('src')) 55 | legacyPolyfill.removeAttribute('src') 56 | legacyPolyfill.innerHTML = `!(function() { 57 | var e = document.createElement('script') 58 | e.src = ${publicPath} + document.getElementById('vite-legacy-polyfill').getAttribute('data-src'); 59 | e.onload = function() { 60 | System.import(${publicPath}+document.getElementById('vite-legacy-entry').getAttribute('data-src')) 61 | }; 62 | document.body.appendChild(e) 63 | })();` 64 | } 65 | const legacyEntry = document.getElementById('vite-legacy-entry') 66 | if (legacyEntry) { 67 | legacyEntry.innerHTML = '' 68 | } 69 | content = document.outerHTML 70 | return content 71 | } 72 | 73 | export function transformHtml(html: string, options: TransformOptions,transformIndexHtmlConfig: TransformIndexHtmlConfig) { 74 | const { base, publicPath } = options 75 | const document = parse(html, { comment: true }) 76 | const baseMarker = `${base}` 77 | const assetsTags = document.querySelectorAll(`head>link[href^="${baseMarker}"],head>script[src^="${baseMarker}"]`) 78 | const preloads = assetsTags.map(o => { 79 | const result = { 80 | parentTagName: o.parentNode.rawTagName, 81 | tagName: o.rawTagName, 82 | attrs: Object.assign( 83 | {}, 84 | o.attrs, 85 | o.attrs.src ? { src: o.attrs.src.replace(baseMarker, '/') } : { href: o.attrs.href.replace(baseMarker, '/') } 86 | ) 87 | } 88 | o.parentNode.removeChild(o) 89 | return result 90 | }) 91 | const endTag = transformIndexHtmlConfig?.insertBodyAfter ? '' : '' 92 | const injectCode = ` 116 | ${endTag} 117 | ` 118 | 119 | 120 | return document.outerHTML.replace(endTag, injectCode) 121 | } 122 | -------------------------------------------------------------------------------- /src/core/utils.ts: -------------------------------------------------------------------------------- 1 | // replace 2 | import {StringLiteral, TemplateElement} from "@swc/core"; 3 | 4 | export function replace(mark: string, placeholder: string, code: string) { 5 | const re = new RegExp(mark, 'g') 6 | return code.replace(re, placeholder) 7 | } 8 | 9 | // replace asset src 10 | export function replaceSrc(placeholder: string, code: string) { 11 | return code.replace(/=([a-zA-Z]+).src/g, `=${placeholder}+$1.getAttribute('data-src')`) 12 | } 13 | 14 | export function replaceImport(placeholder: string, code: string) { 15 | return code.replace(/(System.import\()/g, `$1${placeholder}+`) 16 | } 17 | 18 | export function replaceInStringLiteral(literal: StringLiteral, base: string, placeholder: string): string { 19 | const quoteMark = literal.raw.charAt(0); 20 | const regex = new RegExp(base, 'g'); 21 | // Keep track of whether we need to add quotation marks at the beginning of the 22 | // final output 23 | let withStartQuote = true; 24 | 25 | const transformedStr = literal.value.replace(regex, (match, index) => { 26 | let prefix = `${quoteMark}+`; 27 | 28 | if (index === 0) { 29 | prefix = ''; 30 | withStartQuote = false; 31 | } 32 | 33 | return `${prefix}${placeholder}+${quoteMark}/`; 34 | }); 35 | 36 | const prefix = withStartQuote ? quoteMark : ''; 37 | 38 | return `${prefix}${transformedStr}${quoteMark}`; 39 | } 40 | 41 | export function replaceInTemplateElement(element: TemplateElement, base: string, placeholder: string): string { 42 | const regex = new RegExp(base, 'g'); 43 | return element.raw.replace(regex, () => '/${' + placeholder + '}/'); 44 | } 45 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { Plugin } from 'vite' 2 | import type { Options, TransformOptions } from './types' 3 | import { transformChunk, transformAsset, transformLegacyHtml, transformHtml } from './core/transform' 4 | 5 | export function dynamicBase(options?: Options): Plugin { 6 | const defaultOptions: Options = { 7 | publicPath: 'window.__dynamic_base__', 8 | transformIndexHtml: false, // maybe default true 9 | transformIndexHtmlConfig: {} 10 | } 11 | 12 | const { publicPath, transformIndexHtml, transformIndexHtmlConfig } = { ...defaultOptions, ...(options || {}) } 13 | 14 | // const preloadHelperId = 'vite/preload-helper' 15 | let assetsDir = 'assets' 16 | let base = '/' 17 | let legacy = false 18 | let baseOptions: TransformOptions = { assetsDir, base, legacy, publicPath: ` ${publicPath}`, transformIndexHtml } 19 | 20 | return { 21 | name: 'vite-plugin-dynamic-base', 22 | enforce: 'post', 23 | apply: 'build', 24 | configResolved(resolvedConfig) { 25 | assetsDir = resolvedConfig.build.assetsDir 26 | base = resolvedConfig.base 27 | legacy = !!resolvedConfig?.define?.['import.meta.env.LEGACY'] 28 | if (!base || base === '/') { 29 | throw new Error( 30 | 'Please replace `config.base` in build with unique markup text, (e.g. /__dynamic_base__/)\n' + 31 | 'Recommended changes:\n' + 32 | ` - base: ${JSON.stringify(base)},\n` + 33 | ` + base: process.env.NODE_ENV === "production" ? "/__dynamic_base__/" : "/",\n` + 34 | ' (in your vite.config.ts/js file)' 35 | ) 36 | } 37 | Object.assign(baseOptions, { assetsDir, base, legacy }) 38 | }, 39 | async generateBundle({ format }, bundle) { 40 | if (format !== 'es' && format !== 'system') { 41 | return 42 | } 43 | await Promise.all( 44 | Object.entries(bundle).map(async ([, chunk]) => { 45 | if (chunk.type === 'chunk' && chunk.code.indexOf(base) > -1) { 46 | chunk.code = await transformChunk(chunk.code, baseOptions); 47 | } else if (chunk.type === 'asset' && typeof chunk.source === 'string') { 48 | if (!chunk.fileName.endsWith('.html')) { 49 | chunk.source = transformAsset(chunk.source, baseOptions) 50 | } else if (transformIndexHtml) { 51 | chunk.source = transformHtml(chunk.source, baseOptions, transformIndexHtmlConfig) 52 | if(legacy){ 53 | chunk.source = transformLegacyHtml(chunk.source, baseOptions) 54 | } 55 | } 56 | } 57 | }) 58 | ) 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export interface Options { 2 | publicPath?: string, 3 | transformIndexHtml?: boolean 4 | transformIndexHtmlConfig?: TransformIndexHtmlConfig 5 | } 6 | 7 | export interface TransformIndexHtmlConfig { 8 | insertBodyAfter?: boolean, 9 | } 10 | 11 | export interface TransformOptions extends Options { 12 | assetsDir: string, 13 | base: string, 14 | legacy: boolean 15 | } -------------------------------------------------------------------------------- /tests/basic.test.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { dynamicBase as createPlugin } from '..' 3 | 4 | describe('setup ok', () => { 5 | it('works', () => { 6 | expect(defineConfig({ 7 | plugins: [createPlugin()], 8 | })).toMatchInlineSnapshot(` 9 | { 10 | "plugins": [ 11 | { 12 | "apply": "build", 13 | "configResolved": [Function], 14 | "enforce": "post", 15 | "generateBundle": [Function], 16 | "name": "vite-plugin-dynamic-base", 17 | }, 18 | ], 19 | } 20 | `) 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /tests/configWithoutDefine.test.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, InlineConfig, resolveConfig } from 'vite' 2 | import { dynamicBase as createPlugin } from '..' 3 | 4 | describe('vite `define` cause null pointer exception in `configResolved`', () => { 5 | const plugin = createPlugin() 6 | 7 | it('works well with `define`', async () => { 8 | const configWithDefine = defineConfig({ 9 | base: "/__dynamic_base__/", 10 | define: {}, 11 | plugins: [plugin], 12 | }) as InlineConfig 13 | await expect(resolveConfig(configWithDefine, 'build')).resolves.toMatchSnapshot() 14 | }) 15 | 16 | it('exception occurs', async () => { 17 | const configWithoutDefine = defineConfig({ 18 | base: "/__dynamic_base__/", 19 | plugins: [plugin], 20 | }) as InlineConfig 21 | // await expect(() => resolveConfig(configWithoutDefine, 'build')).rejects.toMatch( 22 | // /TypeError: Cannot read property 'import\.meta\.env\.LEGACY' of undefined/, 23 | // ) 24 | await expect(resolveConfig(configWithoutDefine, 'build')).resolves.toMatchSnapshot() 25 | }) 26 | }) -------------------------------------------------------------------------------- /tests/transform.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from 'vitest' 2 | import { transformChunk } from '../src/core/transform' 3 | 4 | describe('transform', () => { 5 | const options = { publicPath: 'window.__dynamic_base__', assetsDir: 'assets', base: '/__dynamic_base__/', legacy: false, transformIndexHtml: false } 6 | 7 | test('transformChunk-html-in-js', async () => { 8 | const code = `i = d('
;',1)` 9 | const result = await transformChunk(code, options) 10 | expect(result).toEqual(`i = d('
;',1)`) 11 | }) 12 | 13 | test('transformChunk-es-doublequote', async () => { 14 | const code = `var ji=n("d", "/__dynamic_base__/assets/logo.03d6d6da.png")` 15 | const result = await transformChunk(code, options) 16 | expect(result).toEqual(`var ji=n("d", window.__dynamic_base__+"/assets/logo.03d6d6da.png")`) 17 | }) 18 | 19 | test('transformChunk-css-in-js', async () => { 20 | const code = `c.innerHTML="a[data-v-b4cdb4a4]{color:#42b983}label[data-v-b4cdb4a4]{margin:0 .5em;font-weight:700}code[data-v-b4cdb4a4]{background-color:#eee;padding:2px 4px;border-radius:4px;color:#304455}.base{width:100px;height:100px;background-image:url(/__dynamic_base__/assets/logo.03d6d6da.png)}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}"` 21 | const result = await transformChunk(code, options) 22 | expect(result).toEqual(`c.innerHTML="a[data-v-b4cdb4a4]{color:#42b983}label[data-v-b4cdb4a4]{margin:0 .5em;font-weight:700}code[data-v-b4cdb4a4]{background-color:#eee;padding:2px 4px;border-radius:4px;color:#304455}.base{width:100px;height:100px;background-image:url("+window.__dynamic_base__+"/assets/logo.03d6d6da.png)}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}"`) 23 | }) 24 | 25 | test('transformChunk-add-variable', async () => { 26 | const code = `var Mo=function(e){ return '/__dynamic_base__/'+e;}`; 27 | const result = await transformChunk(code, options); 28 | expect(result).toEqual(`var Mo=function(e){ return window.__dynamic_base__+'/'+e;}`); 29 | }) 30 | 31 | test('transformChunk-no-string', async () => { 32 | const code = `var Mo=function(){ return '/__dynamic_base__/';}`; 33 | const result = await transformChunk(code, options); 34 | expect(result).toEqual(`var Mo=function(){ return window.__dynamic_base__+'/';}`); 35 | }) 36 | 37 | test('transformChunk-multiple-within-string', async () => { 38 | const code = `var reportError=function(e){return "Couldn't find /__dynamic_base__/assets/some.file or /__dynamic_base__/assets/some_other.file";}`; 39 | const result = await transformChunk(code, options); 40 | expect(result).toEqual(`var reportError=function(e){return "Couldn't find "+window.__dynamic_base__+"/assets/some.file or "+window.__dynamic_base__+"/assets/some_other.file";}`); 41 | }) 42 | 43 | test('transformChunk-template-literal', async () => { 44 | const code = 'var foo=function(part1,part2){return \`${part1}/__dynamic_base__/test/${part2}\`;}'; 45 | const result = await transformChunk(code, options); 46 | expect(result).toEqual('var foo=function(part1,part2){return \`$\{part1}/${window.__dynamic_base__}/test/${part2}\`;}'); 47 | }) 48 | 49 | test('transformChunk-template-literal-with-multiple-elements', async () => { 50 | const code = "var reportError=function(e){return \`Couldn't find /__dynamic_base__/assets/${filename1} or /__dynamic_base__/assets/${filename2}\`;}"; 51 | const result = await transformChunk(code, options); 52 | expect(result).toEqual("var reportError=function(e){return `Couldn't find /${window.__dynamic_base__}/assets/${filename1} or /${window.__dynamic_base__}/assets/${filename2}`;}"); 53 | }) 54 | 55 | test('transformChunk-mixed-strings-and-templates', async () => { 56 | const code = "const someString = \"Hello World!\"; const someTemplate = \`${Math.random()} is a random number.\`; const myPath = `/${someVar}/__dynamic_base__/image.png`; const strPath = '/assets/__dynamic_base__/image2.png';"; 57 | const result = await transformChunk(code, options); 58 | expect(result).toEqual("const someString = \"Hello World!\"; const someTemplate = \`${Math.random()} is a random number.\`; const myPath = `/${someVar}/${window.__dynamic_base__}/image.png`; const strPath = '/assets'+window.__dynamic_base__+'/image2.png';") 59 | }) 60 | }) -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["./src"] 4 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "moduleResolution": "node", 5 | "strict": false, 6 | "declaration": true, 7 | "noUnusedLocals": true, 8 | "esModuleInterop": true, 9 | "outDir": "dist", 10 | "module": "commonjs", 11 | "lib": ["ESNext","DOM"], 12 | "sourceMap": true, 13 | "types": [ 14 | "vitest/globals" 15 | ] 16 | }, 17 | "include": ["./src", "./tests"] 18 | } -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config' 2 | 3 | export default defineConfig({ 4 | test: { 5 | include: ['tests/**/*.test.ts'], 6 | globals: true, 7 | }, 8 | }) --------------------------------------------------------------------------------