From 9f0acc294c2d88a80a45bd2dc08087a68f69fe73 Mon Sep 17 00:00:00 2001 From: "Jesse.Feng" Date: Sun, 20 Apr 2025 14:56:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(vite-plugin-build-chunk):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/npm-publish-combine.yml | 46 --- .github/workflows/npm-publish-external.yml | 46 --- .github/workflows/npm-publish-hook-use.yml | 46 --- .github/workflows/npm-publish-include-css.yml | 46 --- .github/workflows/npm-publish-mock-data.yml | 46 --- .../workflows/npm-publish-runtime-helper.yml | 30 -- .../npm-publish-separate-importer.yml | 46 --- .github/workflows/npm-publish-view.yml | 46 --- .../{npm-publish-cp.yml => npm-publish.yml} | 6 +- .gitignore | 44 +- docs/.vitepress/config/en.mts | 15 + docs/.vitepress/config/zh.mts | 15 + .../vite-plugin-build-chunk/options.md | 91 ++++ .../vite-plugin-build-chunk/quick-start.md | 87 ++++ .../vite-plugin-build-chunk/options.md | 115 ++++++ .../vite-plugin-build-chunk/quick-start.md | 87 ++++ package.json | 34 +- packages/create-vite-lib-starter/README.md | 54 +++ .../en/plugins/vite-plugin-combine/options.md | 58 --- .../vite-plugin-combine/quick-start.md | 52 --- .../en/plugins/vite-plugin-combine/usage.md | 63 --- .../docs/en/plugins/vite-plugin-cp/options.md | 118 ------ .../en/plugins/vite-plugin-cp/quick-start.md | 82 ---- .../plugins/vite-plugin-external/options.md | 157 ------- .../vite-plugin-external/quick-start.md | 75 ---- .../en/plugins/vite-plugin-external/usage.md | 273 ------------ .../vite-plugin-hook-use/quick-start.md | 38 -- .../en/plugins/vite-plugin-hook-use/usage.md | 82 ---- .../vite-plugin-include-css/quick-start.md | 49 --- .../plugins/vite-plugin-mock-data/options.md | 65 --- .../vite-plugin-mock-data/quick-start.md | 25 -- .../en/plugins/vite-plugin-mock-data/usage.md | 104 ----- .../vite-plugin-separate-importer/options.md | 55 --- .../quick-start.md | 25 -- .../vite-plugin-separate-importer/usage.md | 86 ---- .../en/plugins/vite-plugin-view/options.md | 188 --------- .../plugins/vite-plugin-view/quick-start.md | 112 ----- .../docs/en/plugins/vite-plugin-view/usage.md | 354 ---------------- .../zh/plugins/vite-plugin-combine/options.md | 77 ---- .../vite-plugin-combine/quick-start.md | 52 --- .../zh/plugins/vite-plugin-combine/usage.md | 64 --- .../docs/zh/plugins/vite-plugin-cp/options.md | 118 ------ .../zh/plugins/vite-plugin-cp/quick-start.md | 85 ---- .../plugins/vite-plugin-external/options.md | 156 ------- .../vite-plugin-external/quick-start.md | 112 ----- .../zh/plugins/vite-plugin-external/usage.md | 390 ------------------ .../vite-plugin-hook-use/quick-start.md | 38 -- .../zh/plugins/vite-plugin-hook-use/usage.md | 69 ---- .../vite-plugin-include-css/quick-start.md | 49 --- .../plugins/vite-plugin-mock-data/options.md | 67 --- .../vite-plugin-mock-data/quick-start.md | 25 -- .../zh/plugins/vite-plugin-mock-data/usage.md | 105 ----- .../vite-plugin-separate-importer/options.md | 62 --- .../quick-start.md | 25 -- .../vite-plugin-separate-importer/usage.md | 75 ---- .../zh/plugins/vite-plugin-view/options.md | 195 --------- .../plugins/vite-plugin-view/quick-start.md | 108 ----- .../docs/zh/plugins/vite-plugin-view/usage.md | 345 ---------------- packages/create-vite-lib-starter/package.json | 20 +- packages/create-vite-lib-starter/src/noop.ts | 3 +- .../test/index.test.ts | 39 ++ .../create-vite-lib-starter/tsconfig.json | 2 +- packages/vite-plugin-build-chunk/LICENSE | 21 + packages/vite-plugin-build-chunk/README.md | 53 +++ packages/vite-plugin-build-chunk/package.json | 50 +++ packages/vite-plugin-build-chunk/src/index.ts | 67 +++ packages/vite-plugin-build-chunk/src/types.ts | 83 ++++ .../tsconfig.build.json | 15 + .../vite-plugin-build-chunk/vite.config.mts | 29 ++ packages/vite-plugin-cp/package.json | 2 +- packages/vite-plugin-cp/src/index.ts | 4 +- .../package.json | 2 +- .../src/index.ts | 6 +- packages/vp-runtime-helper/package.json | 4 +- packages/vp-runtime-helper/src/index.ts | 1 + packages/vp-runtime-helper/src/time.ts | 25 ++ packages/vp-runtime-helper/vite.config.mts | 4 +- release.mjs | 69 ++++ 78 files changed, 987 insertions(+), 4690 deletions(-) delete mode 100644 .github/workflows/npm-publish-combine.yml delete mode 100644 .github/workflows/npm-publish-external.yml delete mode 100644 .github/workflows/npm-publish-hook-use.yml delete mode 100644 .github/workflows/npm-publish-include-css.yml delete mode 100644 .github/workflows/npm-publish-mock-data.yml delete mode 100644 .github/workflows/npm-publish-runtime-helper.yml delete mode 100644 .github/workflows/npm-publish-separate-importer.yml delete mode 100644 .github/workflows/npm-publish-view.yml rename .github/workflows/{npm-publish-cp.yml => npm-publish.yml} (93%) create mode 100644 docs/en/plugins/vite-plugin-build-chunk/options.md create mode 100644 docs/en/plugins/vite-plugin-build-chunk/quick-start.md create mode 100644 docs/zh/plugins/vite-plugin-build-chunk/options.md create mode 100644 docs/zh/plugins/vite-plugin-build-chunk/quick-start.md create mode 100644 packages/create-vite-lib-starter/README.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/options.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/options.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/options.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-include-css/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/options.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/options.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/options.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/options.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/options.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/options.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-include-css/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/options.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/options.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/usage.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/options.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/quick-start.md delete mode 100644 packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/usage.md create mode 100644 packages/create-vite-lib-starter/test/index.test.ts create mode 100644 packages/vite-plugin-build-chunk/LICENSE create mode 100644 packages/vite-plugin-build-chunk/README.md create mode 100644 packages/vite-plugin-build-chunk/package.json create mode 100644 packages/vite-plugin-build-chunk/src/index.ts create mode 100644 packages/vite-plugin-build-chunk/src/types.ts create mode 100644 packages/vite-plugin-build-chunk/tsconfig.build.json create mode 100644 packages/vite-plugin-build-chunk/vite.config.mts create mode 100644 packages/vp-runtime-helper/src/time.ts create mode 100644 release.mjs diff --git a/.github/workflows/npm-publish-combine.yml b/.github/workflows/npm-publish-combine.yml deleted file mode 100644 index 5b01615..0000000 --- a/.github/workflows/npm-publish-combine.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-combine - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:combine - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:combine - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-external.yml b/.github/workflows/npm-publish-external.yml deleted file mode 100644 index c9b5ad3..0000000 --- a/.github/workflows/npm-publish-external.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-external - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:external - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:external - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-hook-use.yml b/.github/workflows/npm-publish-hook-use.yml deleted file mode 100644 index 808a5e9..0000000 --- a/.github/workflows/npm-publish-hook-use.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-hook-use - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:hook-use - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:hook-use - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-include-css.yml b/.github/workflows/npm-publish-include-css.yml deleted file mode 100644 index 583ed27..0000000 --- a/.github/workflows/npm-publish-include-css.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-include-css - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:include-css - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:include-css - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-mock-data.yml b/.github/workflows/npm-publish-mock-data.yml deleted file mode 100644 index 337779a..0000000 --- a/.github/workflows/npm-publish-mock-data.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-mock-data - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:mock-data - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:mock-data - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-runtime-helper.yml b/.github/workflows/npm-publish-runtime-helper.yml deleted file mode 100644 index a364d52..0000000 --- a/.github/workflows/npm-publish-runtime-helper.yml +++ /dev/null @@ -1,30 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vp-runtime-helper - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - publish-npm: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:runtime-helper - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-separate-importer.yml b/.github/workflows/npm-publish-separate-importer.yml deleted file mode 100644 index de8b375..0000000 --- a/.github/workflows/npm-publish-separate-importer.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-separate-importer - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:separate-importer - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:separate-importer - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-view.yml b/.github/workflows/npm-publish-view.yml deleted file mode 100644 index 78a3ffc..0000000 --- a/.github/workflows/npm-publish-view.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - -name: vite-plugin-view - -on: - pull_request: - branches: [main] - - # 允许你从 Actions 选项卡手动运行此工作流程 - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run test:view - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - run: npm run deps - - run: npm run release:view - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/npm-publish-cp.yml b/.github/workflows/npm-publish.yml similarity index 93% rename from .github/workflows/npm-publish-cp.yml rename to .github/workflows/npm-publish.yml index ea3d6bf..7afa7b4 100644 --- a/.github/workflows/npm-publish-cp.yml +++ b/.github/workflows/npm-publish.yml @@ -1,7 +1,7 @@ # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages -name: vite-plugin-cp +name: npm publish on: pull_request: @@ -24,7 +24,7 @@ jobs: with: version: 10 - run: npm run deps - - run: npm run test:cp + - run: npm run test:all publish-npm: needs: build @@ -41,6 +41,6 @@ jobs: with: version: 10 - run: npm run deps - - run: npm run release:cp + - run: npm run release:all env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.gitignore b/.gitignore index a7d7afa..3c2b73a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* +.pnpm-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -41,8 +42,8 @@ build/Release node_modules/ jspm_packages/ -# TypeScript v1 declaration files -typings/ +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ # TypeScript cache *.tsbuildinfo @@ -53,6 +54,9 @@ typings/ # Optional eslint cache .eslintcache +# Optional stylelint cache +.stylelintcache + # Microbundle cache .rpt2_cache/ .rts2_cache_cjs/ @@ -68,15 +72,20 @@ typings/ # Yarn Integrity file .yarn-integrity -# dotenv environment variables file +# dotenv environment variable files .env -.env.test +.env.development.local +.env.test.local +.env.production.local +.env.local # parcel-bundler cache (https://parceljs.org/) .cache +.parcel-cache # Next.js build output .next +out # Nuxt.js build / generate output .nuxt @@ -84,13 +93,26 @@ dist # Gatsby files .cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js +# Comment in the public line in if your project uses Gatsby and not Next.js # https://nextjs.org/blog/next-9-1#public-directory-support # public # vuepress build output .vuepress/dist +# vuepress v2.x temp and cache directory +.temp +.cache + +# vitepress build output +**/.vitepress/dist + +# vitepress cache directory +**/.vitepress/cache + +# Docusaurus cache and generated files +.docusaurus + # Serverless directories .serverless/ @@ -103,4 +125,14 @@ dist # TernJS port file .tern-port -examples/*/dist \ No newline at end of file +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +.DS_Store \ No newline at end of file diff --git a/docs/.vitepress/config/en.mts b/docs/.vitepress/config/en.mts index ea2311e..4abbd3d 100644 --- a/docs/.vitepress/config/en.mts +++ b/docs/.vitepress/config/en.mts @@ -28,6 +28,16 @@ export const en = defineConfig({ { text: 'Contribution', link: 'contribution' } ] }, + '/plugins/vite-plugin-build-chunk/': { + base: '/plugins/vite-plugin-build-chunk/', + items: [{ + text: 'vite-plugin-build-chunk', + items: [ + { text: 'Quick start', link: 'quick-start' }, + { text: 'Options', link: 'options' }, + ] + }] + }, '/plugins/vite-plugin-combine/': { base: '/plugins/vite-plugin-combine/', items: [{ @@ -122,6 +132,11 @@ export const en = defineConfig({ function navPlugins(): DefaultTheme.NavItemWithLink[] { return [ + { + text: 'vite-plugin-build-chunk', + activeMatch: '/plugins/vite-plugin-build-chunk/', + link: '/plugins/vite-plugin-build-chunk/quick-start' + }, { text: 'vite-plugin-combine', activeMatch: '/plugins/vite-plugin-combine/', diff --git a/docs/.vitepress/config/zh.mts b/docs/.vitepress/config/zh.mts index 154c250..822f28d 100644 --- a/docs/.vitepress/config/zh.mts +++ b/docs/.vitepress/config/zh.mts @@ -28,6 +28,16 @@ export const zh = defineConfig({ { text: '贡献指南', link: 'contribution' } ] }, + '/zh/plugins/vite-plugin-build-chunk/': { + base: '/zh/plugins/vite-plugin-build-chunk/', + items: [{ + text: 'vite-plugin-build-chunk', + items: [ + { text: '快速入门', link: 'quick-start' }, + { text: '配置项', link: 'options' }, + ] + }] + }, '/zh/plugins/vite-plugin-combine/': { base: '/zh/plugins/vite-plugin-combine/', items: [{ @@ -122,6 +132,11 @@ export const zh = defineConfig({ function navPlugins(): DefaultTheme.NavItemWithLink[] { return [ + { + text: 'vite-plugin-build-chunk', + activeMatch: '/zh/plugins/vite-plugin-build-chunk/', + link: '/zh/plugins/vite-plugin-build-chunk/quick-start' + }, { text: 'vite-plugin-combine', activeMatch: '/zh/plugins/vite-plugin-combine/', diff --git a/docs/en/plugins/vite-plugin-build-chunk/options.md b/docs/en/plugins/vite-plugin-build-chunk/options.md new file mode 100644 index 0000000..aca7fe7 --- /dev/null +++ b/docs/en/plugins/vite-plugin-build-chunk/options.md @@ -0,0 +1,91 @@ +# Configuration Options + +## Core Configuration Interfaces + +### **Options (Top-level Configuration Object)** +| Parameter | Type | Required | Default Value | Description | +|-----------------|----------------------------------------------------------------------|----------|------------------------|-----------------------------------------------------------------------------| +| `build` | `BuildOptions[] \| BuildOptions` | Yes | - | Configuration for build tasks (array or single object). | +| `logLevel` | `LogLevel` (from `vp-runtime-helper`) | No | `'info'` | Log level (e.g., `'error'`, `'warn'`, `'info'`). | +| `enableBanner` | `boolean` | No | `false` | Whether to output a build banner (e.g., version information). | + +--- + +### **BuildOptions (Configuration for Each Build Task)** +| Parameter | Type | Required | Default Value | Description | +|-----------------|----------------------------------------------------------------------|----------|------------------------|-----------------------------------------------------------------------------| +| `chunk` | `string` | Yes | - | Entry file path (relative to project root). | +| `name` | `string` | Yes | `'default'` | Global variable name (applies only to UMD/IIFE formats). | +| `format` | `'es' \| 'cjs' \| 'umd' \| 'iife'` | No | `'umd'` | Build format (defaults to `umd`). | +| `sourcemap` | `boolean \| 'inline' \| 'hidden'` | No | `false` | Whether to generate sourcemaps (supports inline or hidden modes). | +| `exports` | `'default' \| 'named' \| 'none' \| 'auto'` | No | `'auto'` | Export type for Rollup output. | +| `minify` | `boolean \| 'terser' \| 'esbuild'` | No | `false` | Whether to enable output minification (supports `terser` or `esbuild`). | +| `outDir` | `string` | No | Main build's `outDir` | Custom output directory (relative to project root). | +| `fileName` | `string \| ((format: string, entryName: string) => string)` | No | Default based on format| Custom filename (supports template strings or functions). | +| `plugins` | `PluginOption[]` | No | `[]` | Additional Vite plugins. | + +--- + +## TypeScript Definitions + +```typescript +import { ModuleFormat } from 'rollup'; +import type { LibraryFormats, PluginOption } from 'vite'; +import { LogLevel } from 'vp-runtime-helper'; + +export interface BuildOptions { + /** + * The chunk name. + */ + chunk: string; + /** + * Global variable name. + */ + name: string; + /** + * The output format. + */ + format?: LibraryFormats; + /** + * Whether to generate sourcemaps. + */ + sourcemap?: boolean | 'inline' | 'hidden'; + /** + * The exports type. + */ + exports?: 'default' | 'named' | 'none' | 'auto'; + /** + * Whether to minify the output. + */ + minify?: boolean | 'terser' | 'esbuild'; + /** + * The output directory. + */ + outDir?: string; + /** + * The output file name. + */ + fileName?: string | ((format: ModuleFormat, entryName: string) => string); + /** + * The plugins to use. + */ + plugins?: PluginOption[]; +} + +export interface Options { + /** + * The build options. + */ + build: BuildOptions | BuildOptions[]; + + /** + * The log level to use. + */ + logLevel?: LogLevel; + + /** + * Whether to output the banner + */ + enableBanner?: boolean; +} +``` diff --git a/docs/en/plugins/vite-plugin-build-chunk/quick-start.md b/docs/en/plugins/vite-plugin-build-chunk/quick-start.md new file mode 100644 index 0000000..ae9ec74 --- /dev/null +++ b/docs/en/plugins/vite-plugin-build-chunk/quick-start.md @@ -0,0 +1,87 @@ +# vite-plugin-build-chunk + +> Generate additional build artifacts (e.g., chunk files in different formats) after Vite's main build process. Ideal for scenarios requiring multi-format outputs or secondary builds. + +## Installation + +::: code-group + +```bash [npm] +npm add vite-plugin-build-chunk +``` +```bash [pnpm] +pnpm add vite-plugin-build-chunk +``` +```bash [yarn] +yarn add vite-plugin-build-chunk +``` + +::: + +## Usage + +Configure the plugin in `vite.config.ts`: + +```typescript +import buildChunk from 'vite-plugin-build-chunk'; + +export default { + plugins: [ + buildChunk({ + build: [ // The `build` property must be configured + { + chunk: 'main.mjs', // Entry file path (relative to project root) + format: 'umd', // Build format (default: 'umd') + name: 'MyLib', // Global variable name (only applies to UMD/IIFE formats) + }, + // Add more configurations here + ], + }), + ], +}; +``` + +### **fileName Examples** +```typescript +// Default template (e.g., 'es' → 'main.mjs', 'cjs' → 'main.js', 'umd' → 'main.umd.js') +fileName: undefined, + +// Custom template string (must include `[name]` and `[format]`) +fileName: '[name]', + +// Dynamic generation via function +fileName: (format, entryName) => { + return `${entryName}-${format}.js`; +} +``` + +--- + +### **Notes** +1. **Configuration Structure**: The `build` property must be provided as an array or object. Example: + ```typescript + buildChunk({ build: [...] }) + ``` +2. **Entry Path**: `chunk` must be an absolute path or relative to the project root. +3. **Multi-Task Support**: Use the `build` array to configure multiple tasks, each generating independent artifacts. +4. **Silent Mode**: The plugin defaults to `logLevel: 'OFF'` to avoid cluttering the main build output. +5. **Format Default**: `format` defaults to `umd` if unspecified. + +--- + +### **Example Output** +For the configuration: +```typescript +{ + build: [{ + chunk: 'main.mjs', + name: 'MyLib', + format: 'umd' + }] +} +``` + +The generated file path might be: +``` +dist/main.umd.js +``` diff --git a/docs/zh/plugins/vite-plugin-build-chunk/options.md b/docs/zh/plugins/vite-plugin-build-chunk/options.md new file mode 100644 index 0000000..d4882df --- /dev/null +++ b/docs/zh/plugins/vite-plugin-build-chunk/options.md @@ -0,0 +1,115 @@ +# 配置项 + +## 核心配置接口 + +### **Options(顶层配置对象)** +| 参数 | 类型 | 必填 | 默认值 | 说明 | +|--------------|----------------------------------------------------------------------|------|-----------------|----------------------------------------------------------------------| +| `build` | `BuildOptions[] \| BuildOptions` | 是 | - | 构建任务配置(数组或单个对象) | +| `logLevel` | `LogLevel` (来自 `vp-runtime-helper`) | 否 | `'info'` | 日志等级(如 `'error'`, `'warn'`, `'info'`) | +| `enableBanner`| `boolean` | 否 | `false` | 是否输出构建 banner(如版本信息) | + +--- + +### **BuildOptions(每个构建任务的配置)** +| 参数 | 类型 | 必填 | 默认值 | 说明 | +|--------------|----------------------------------------------------------------------|------|-----------------|----------------------------------------------------------------------| +| `chunk` | `string` | 是 | - | 入口文件路径(相对项目根目录) | +| `name` | `string` | 是 | `'default'` | 全局变量名(仅在 UMD/IIFE 格式生效) | +| `format` | `'es' \| 'cjs' \| 'umd' \| 'iife'` | 否 | `'umd'` | 构建格式(默认 `umd`) | +| `sourcemap` | `boolean \| 'inline' \| 'hidden'` | 否 | `false` | 是否生成 sourcemap(支持内联或隐藏模式) | +| `exports` | `'default' \| 'named' \| 'none' \| 'auto'` | 否 | `'auto'` | Rollup 输出的导出类型 | +| `minify` | `boolean \| 'terser' \| 'esbuild'` | 否 | `false` | 是否启用代码压缩(支持 `terser` 或 `esbuild`) | +| `outDir` | `string` | 否 | 主构建的 `outDir` | 自定义输出目录(相对项目根目录) | +| `fileName` | `string \| ((format: string, entryName: string) => string)` | 否 | 根据格式生成默认名称 | 自定义文件名(支持模板字符串或函数) | +| `plugins` | `PluginOption[]` | 否 | `[]` | 额外的 Vite 插件列表 | + +--- + +## TypeScript 定义 + +```typescript +import { ModuleFormat } from 'rollup'; +import type { LibraryFormats, PluginOption } from 'vite'; +import { LogLevel } from 'vp-runtime-helper'; + +export interface BuildOptions { + /** + * The chunk name. + * + * 构建的 chunk 名称。 + */ + chunk: string; + /** + * Global variable name. + * + * 全局变量名。 + */ + name: string; + /** + * The output format. + * + * 输出格式。 + */ + format?: LibraryFormats; + /** + * Whether to generate sourcemaps. + * + * 是否生成 sourcemap。 + */ + sourcemap?: boolean | 'inline' | 'hidden'; + /** + * The exports type. + * + * 导出类型。 + */ + exports?: 'default' | 'named' | 'none' | 'auto'; + /** + * Whether to minify the output. + * + * 是否压缩输出。 + */ + minify?: boolean | 'terser' | 'esbuild'; + /** + * The output directory. + * + * 输出目录。 + */ + outDir?: string; + /** + * The output file name. + * + * 输出文件名。 + */ + fileName?: string | ((format: ModuleFormat, entryName: string) => string); + /** + * The plugins to use. + * + * 使用的插件。 + */ + plugins?: PluginOption[]; +} + +export interface Options { + /** + * The build options. + * + * 构建选项。 + */ + build: BuildOptions | BuildOptions[]; + + /** + * The log level to use. + * + * 日志等级。 + */ + logLevel?: LogLevel; + + /** + * Whether to output the banner + * + * 是否输出 banner + */ + enableBanner?: boolean; +} +``` \ No newline at end of file diff --git a/docs/zh/plugins/vite-plugin-build-chunk/quick-start.md b/docs/zh/plugins/vite-plugin-build-chunk/quick-start.md new file mode 100644 index 0000000..d98eac7 --- /dev/null +++ b/docs/zh/plugins/vite-plugin-build-chunk/quick-start.md @@ -0,0 +1,87 @@ +# vite-plugin-build-chunk + +> 在 Vite 构建完成后,根据配置生成额外的构建产物(如不同格式的 chunk 文件),适用于需要多格式输出或二次构建的场景。 + +## 安装 + +::: code-group + +```bash [npm] +npm add vite-plugin-build-chunk +``` +```bash [pnpm] +pnpm add vite-plugin-build-chunk +``` +```bash [yarn] +yarn add vite-plugin-build-chunk +``` + +::: + +## 用法 + +在 `vite.config.ts` 中配置插件: + +```typescript +import buildChunk from 'vite-plugin-build-chunk'; + +export default { + plugins: [ + buildChunk({ + build: [ // 必须配置顶层的 `build` 属性 + { + chunk: 'main.mjs', // 入口文件路径(相对项目根目录) + format: 'umd', // 构建格式(默认 'umd') + name: 'MyLib', // 全局变量名(仅 UMD/IIFE 生效) + }, + // 可添加多个配置对象 + ] + }), + ], +}; +``` + +### **fileName 示例** +```typescript +// 默认模板(如 es → main.mjs,cjs → main.js,umd → main.umd.js) +fileName: undefined, + +// 自定义模板字符串(需包含 `[name]` 和 `[format]`) +fileName: '[name]', + +// 使用函数动态生成 +fileName: (format, entryName) => { + return `${entryName}-${format}.js`; +} +``` + +--- + +### **注意事项** +1. **配置结构**:必须通过 `build` 属性传递配置数组或对象,例如: + ```typescript + buildChunk({ build: [...] }) + ``` +2. **入口路径**:`chunk` 需为绝对路径或相对于项目根目录的路径。 +3. **多配置支持**:通过 `build` 数组配置多个构建任务,每个任务生成独立的构建产物。 +4. **静默模式**:插件默认关闭日志输出(`logLevel: 'OFF'`),避免干扰主构建输出。 +5. **格式默认值**:`format` 默认为 `umd`,若未指定将使用此格式。 + +--- + +### **示例输出** +若配置如下: +```typescript +{ + build: [{ + chunk: 'main.mjs', + name: 'MyLib', + format: 'umd' + }] +} +``` + +生成的文件路径可能为: +``` +dist/main.umd.js +``` diff --git a/package.json b/package.json index 7d4cab9..e60425d 100644 --- a/package.json +++ b/package.json @@ -7,38 +7,14 @@ "deps": "npm run clean && pnpm install", "clean": "rm -rf node_modules ./*/*/node_modules", "eslint": "eslint --ext .js,.jsx,.ts,.tsx,.mjs --fix --ignore-path .eslintignore ./", - "build:packages": "pnpm run -r --parallel build:lib", - "build:examples": "pnpm run -r --parallel build", "prepare": "husky install", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", - "release:combine": "npm run build:combine && pnpm run --filter=vite-plugin-combine release", - "release:cp": "npm run build:cp && pnpm run --filter=vite-plugin-cp release", - "release:external": "npm run build:external && pnpm run --filter=vite-plugin-external release", - "release:hook-use": "npm run build:hook-use && pnpm run --filter=vite-plugin-hook-use release", - "release:mock-data": "npm run build:mock-data && pnpm run --filter=vite-plugin-mock-data release", - "release:include-css": "npm run build:include-css && pnpm run --filter=vite-plugin-include-css release", - "release:runtime-helper": "pnpm run --filter=vp-runtime-helper release", - "release:separate-importer": "npm run build:separate-importer && pnpm run --filter=vite-plugin-separate-importer release", - "release:view": "npm run build:view && pnpm run --filter=vite-plugin-view release", - "build:combine": "npm run build:external && pnpm run --filter=vite-plugin-combine build:lib", - "build:cp": "npm run build:external && pnpm run --filter=vite-plugin-cp build:lib", - "build:external": "npm run build:runtime-helper && pnpm run --filter=vite-plugin-external build:lib", - "build:hook-use": "npm run build:external && pnpm run --filter=vite-plugin-hook-use build:lib", - "build:include-css": "npm run build:external && pnpm run --filter=vite-plugin-include-css build:lib", - "build:mock-data": "npm run build:external && pnpm run --filter=vite-plugin-mock-data build:lib", - "build:runtime-helper": "pnpm run --filter=vp-runtime-helper build:lib", - "build:separate-importer": "npm run build:external && pnpm run --filter=vite-plugin-separate-importer build:lib", - "build:view": "npm run build:external && pnpm run --filter=vite-plugin-view build:lib", - "test:combine": "npm run build:combine && pnpm run -r --parallel /build:combine\\.*/", - "test:cp": "npm run build:cp && pnpm run -r --parallel /build:cp\\.*/", - "test:external": "npm run build:external && pnpm run -r --parallel /build:external\\.*/", - "test:hook-use": "npm run build:hook-use && pnpm run -r --parallel /build:hook-use\\.*/", - "test:include-css": "npm run build:include-css && pnpm run -r --parallel /build:include-css\\.*/", - "test:mock-data": "npm run build:mock-data && pnpm run -r --parallel /build:mock-data\\.*/", - "test:separate-importer": "npm run build:separate-importer && pnpm run -r --parallel /build:separate-importer\\.*/", - "test:view": "npm run build:view && pnpm run -r --parallel /build:view\\.*/" + "release:all": "node ./release.mjs", + "build:vite-plugin-deps": "pnpm run --parallel --filter=vite-plugin-external... build:lib", + "build:all": "npm run build:vite-plugin-deps && pnpm run --parallel --filter=vite-plugin-* --filter=!vite-plugin-external build:lib", + "test:all": "npm run build:all && pnpm run --filter=*-demo -r --parallel /^build:*/" }, "repository": { "type": "git", @@ -51,7 +27,9 @@ }, "homepage": "https://github.com/fengxinming/vite-plugins#readme", "dependencies": { + "cross-spawn": "^7.0.6", "markdown-it-mathjax3": "^4.3.2", + "undici": "^7.8.0", "vitepress": "^1.6.3", "vitepress-plugin-group-icons": "^1.3.8" }, diff --git a/packages/create-vite-lib-starter/README.md b/packages/create-vite-lib-starter/README.md new file mode 100644 index 0000000..0eeb8d8 --- /dev/null +++ b/packages/create-vite-lib-starter/README.md @@ -0,0 +1,54 @@ +# create-vite-lib-starter + +> Quickly generate a Vite library project template with basic configuration and development environment. + +## Usage + +Run in the terminal: + +```bash +npm create vite-lib-starter@latest +``` + +Example: + +```bash +npm create vite-lib-starter@latest my-vite-lib +``` + +This will create a new directory named `my-vite-lib` in the current folder with the initialized project structure. + +--- + +## Quick Start + +1. **Navigate to the project directory:** + ```bash + cd my-vite-lib + ``` + +2. **Start the development server:** + ```bash + npm run dev + # or + yarn dev + ``` + +3. **Build for production:** + ```bash + npm run build + # or + yarn build + ``` + +4. **Run tests:** + ```bash + npm test + # or + yarn test + ``` + +--- + +## Notes +- The project name must comply with **npm package name conventions** (lowercase letters, numbers, hyphens). diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/options.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/options.md deleted file mode 100644 index 481fd47..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/options.md +++ /dev/null @@ -1,58 +0,0 @@ -# Options - -## TypeScript Definitions - -```typescript -export type NameExport = (name: string, filePath: string) => string; - -export interface Options { - /** - * Path to the files to be combined, supports glob patterns. - */ - src: string | string[]; - - /** - * Path to the target file after combination. - * @default 'index.js' - */ - target: string; - - /** - * Whether to overwrite the existing target file. - * @default false - */ - overwrite?: boolean; - - /** - * Custom function or boolean value for controlling export name generation. - */ - nameExport?: NameExport | boolean; - - /** - * Exported module types. - * @default 'named' - */ - exports?: 'named' | 'default' | 'both' | 'none'; - - /** - * Plugin execution order. 'pre' runs before others, 'post' after. - * @see [Vite Plugin Ordering](https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering) - */ - enforce?: 'pre' | 'post'; - - /** - * Logging level configuration. - */ - logLevel?: LogLevel; - - /** - * Current working directory. - */ - cwd?: string; - - /** - * Process code before writing to the file. - */ - beforeWrite?: (code: string) => string | void | undefined | null; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/quick-start.md deleted file mode 100644 index fc5f592..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/quick-start.md +++ /dev/null @@ -1,52 +0,0 @@ -# vite-plugin-combine - -[![npm package](https://nodei.co/npm/vite-plugin-combine.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-combine) - -> Combines multiple module files into a single target file. It supports four modes: named exports, default exports, automatic exports, and no exports, and can auto-generate corresponding import statements based on configuration. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-combine.svg?style=flat)](https://npmjs.org/package/vite-plugin-combine) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-combine.svg?style=flat)](https://npmjs.org/package/vite-plugin-combine) -[![Node version](https://img.shields.io/node/v/vite-plugin-combine.svg?style=flat)](https://npmjs.org/package/vite-plugin-combine) - - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-combine -``` -```bash [pnpm] -pnpm add vite-plugin-combine -``` -```bash [yarn] -yarn add vite-plugin-combine -``` - -::: - -## Usage - -Import and configure the plugin in `vite.config.ts`: - -```typescript -import { defineConfig } from 'vite'; -import pluginCombine from 'vite-plugin-combine'; - -export default defineConfig({ - plugins: [ - pluginCombine({ - src: 'src/*.ts', // Match files to combine - target: 'src/index.ts', // Target file path - exports: 'named', // Export type: 'named' | 'default' | 'both' | 'none' - }) - ], - build: { - minify: false, - lib: { - formats: ['es', 'cjs'], - fileName: '[name]' - } - } -}); -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/usage.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/usage.md deleted file mode 100644 index 5779cd7..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-combine/usage.md +++ /dev/null @@ -1,63 +0,0 @@ -# Usage Examples - -Assuming the following file structure: - -``` -src/ - |- components/ - | |- Button.ts - | |- Input.ts - | |- Select.ts -``` - -Configure the plugin as: - -```typescript -import { defineConfig } from 'vite'; -import pluginCombine from 'vite-plugin-combine'; - -export default defineConfig({ - plugins: [ - pluginCombine({ - src: 'src/components/**/*.ts', - target: 'src/index.ts', - exports: 'named', - nameExport: (name, filePath) => `my${name}` - }) - ], - build: { - minify: false, - lib: { - formats: ['es', 'cjs'], - fileName: '[name]' - } - } -}); -``` - -This will generate the following files: - -`dist/index.mjs` -```mjs -export { default as default2 } from './Button'; -export { default as default3 } from './Input'; -export { default as default4 } from './Select'; - -export { - default2 as myButton, - default3 as myInput, - default4 as mySelect -}; -``` - -`dist/index.js` -```js -"use strict"; -Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); -const Button = require("./Button.js"); -const Input = require("./Input.js"); -const Select = require("./Select.js"); -exports.Button = Button; -exports.Input = Input; -exports.Select = Select; -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/options.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/options.md deleted file mode 100644 index e4a6c35..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/options.md +++ /dev/null @@ -1,118 +0,0 @@ -# 配置项 - -```ts -export interface Target { - /** - * Path or glob of what to copy. - * - * 要复制的目录、文件或者 `globby` 匹配规则。 - */ - src: string | string[]; - - /** - * One or more destinations where to copy. - * - * 复制到目标目录。 - */ - dest: string; - - /** - * Rename the file after copying. - * - * 复制后重命名文件。 - */ - rename?: string | ((name: string) => string); - - /** - * Remove the directory structure of copied files, if `src` is a directory. - * - * 是否删除复制的文件目录结构,`src` 为目录时有效。 - */ - flatten?: boolean; - - /** - * Options for tinyglobby. See more at https://github.com/sindresorhus/globby#options - * - * tinyglobby 的选项,设置 `src` 的匹配参数 - */ - globOptions?: GlobOptions; - - /** - * Options for fs-extra.copy See more at https://github.com/jprichardson/node-fs-extra/blob/HEAD/docs/copy.md - * - * fs-extra.copy 的选项,设置 `src` 的复制参数 - */ - copyOptions?: CopyOptions; - - /** - * Transform the file before copying. - * - * 复制前转换文件内容。 - */ - transform?: TransformFile; -} - -export interface Options { - /** - * Default `'closeBundle'`, vite hook the plugin should use. - * - * 默认 `'closeBundle'`,调用指定钩子函数时开始复制。 - * - * @default 'closeBundle' - */ - hook?: string; - - /** - * The value of enforce can be either `"pre"` or `"post"`, see more at https://vitejs.dev/guide/api-plugin.html#plugin-ordering. - * - * 强制执行顺序,`pre` 前,`post` 后,参考 https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering - */ - enforce?: 'pre' | 'post'; - - /** - * Options for tinyglobby. See more at https://github.com/SuperchupuDev/tinyglobby?tab=readme-ov-file#options - * - * tinyglobby 的选项,设置 `src` 的匹配参数。 - */ - globOptions?: GlobOptions; - - /** - * Options for fs-extra.copy See more at https://github.com/jprichardson/node-fs-extra/blob/HEAD/docs/copy.md - * - * fs-extra.copy 的选项,设置 `src` 的复制参数 - */ - copyOptions?: CopyOptions; - - /** - * Default `process.cwd()`, The current working directory in which to search. - * - * 默认 `process.cwd()`,用于拼接 `src` 的路径。 - * - * @default `process.cwd()` - */ - cwd?: string; - - /** - * Array of targets to copy. - * - * 复制文件的规则配置。 - */ - targets: Target[]; - - /** - * Default `'warn'`, The log level to use. - * - * 默认 `'warn'`,日志等级。 - * - * @default 'WARN' - */ - logLevel?: LogLevel; - - /** - * Delay in milliseconds before copying. - * - * 复制前的延迟时间。 - */ - delay?: number; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/quick-start.md deleted file mode 100644 index cf261e8..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-cp/quick-start.md +++ /dev/null @@ -1,82 +0,0 @@ -# vite-plugin-cp - -[![npm package](https://nodei.co/npm/vite-plugin-cp.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-cp) - -> A powerful Vite plugin for copying files/directories with advanced transformation and renaming capabilities. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-cp.svg?style=flat)](https://npmjs.org/package/vite-plugin-cp) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-cp.svg?style=flat)](https://npmjs.org/package/vite-plugin-cp) -[![Node version](https://img.shields.io/node/v/vite-plugin-cp.svg?style=flat)](https://npmjs.org/package/vite-plugin-cp) - - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-cp -``` -```bash [pnpm] -pnpm add vite-plugin-cp -``` -```bash [yarn] -yarn add vite-plugin-cp -``` - -::: - -## Features -- 📁 Supports copying files/directories using glob patterns -- 🔄 Flexible file transformation before copying -- 📦 Preserves or flattens directory structures -- 🛠️ Customizable file renaming -- 🔄 Works with both JavaScript and TypeScript projects -- ⚡ Runs during Vite's build lifecycle - -## Usage - -```js -import { defineConfig } from 'vite'; -import cp from 'vite-plugin-cp'; - -export default defineConfig({ - plugins: [ - cp({ - targets: [ - // Copy all files from 'node_modules/vite/dist' to 'dist/cp/test' - { src: './node_modules/vite/dist', dest: 'dist/cp/test' }, - - // Copy all files from 'node_modules/vite/dist' to 'dist/cp/test2', but keep the directory structure - { src: './node_modules/vite/dist', dest: 'dist/cp/test2', flatten: false }, - - // Copy the README.md file from 'node_modules/vite' to 'dist/cp' - { src: './node_modules/vite/README.md', dest: 'dist/cp' }, - - { src: './node_modules/vite/index.cjs', dest: 'dist/cp', rename: 'index.js' }, - - // Copy all .ts files from 'node_modules/vite' to 'dist/cp/types' - { src: './node_modules/vite/**/*.ts', dest: 'dist/cp/types' }, - - // Copy all .ts files from 'node_modules/vite' to 'dist/cp/types2', but modify the name - { - src: './node_modules/vite/**/*.ts', dest: 'dist/cp/types2', rename(name) { - return name.replace('.d.ts', '.ts'); - } - }, - - // Copy the package.json file from 'node_modules/vite' to 'dist/cp', but modify the name and version - { - src: './node_modules/vite/package.json', dest: 'dist/cp', transform(buf: Buffer) { - const pkg = JSON.parse(buf.toString()); - return JSON.stringify({ - ...pkg, - name: 'vite-plugin-cp-test', - version: '1.0.0' - }, null, 2); - } - } - ] - }) - ] -}); -``` diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/options.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/options.md deleted file mode 100644 index 47ec351..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/options.md +++ /dev/null @@ -1,157 +0,0 @@ -# Option Reference - -## `externals` -* Type: `Record` -* Required: `false` - -Configure external dependencies. [Example](/plugins/vite-plugin-external/usage#basic-usage) - -## `logLevel` -* Type: `"TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL" | "OFF"` -* Required: `false` -* Default: `"WARN"` - -Sets the logging level. - -## `nodeBuiltins` -* Type: `boolean` -* Required: `false` - -Whether to exclude Node.js built-in modules. [Example](/plugins/vite-plugin-external/usage#excluding-dependencies-during-build) - -## `externalizeDeps` -* Type: `Array` -* Required: `false` - -Specify dependencies to exclude from bundling. [Example](/plugins/vite-plugin-external/usage#excluding-dependencies-during-build) - -## `externalGlobals` -* Type: `(globals: Record) => rollup.Plugin` -* Required: `false` - -Resolve IIFE Packaging Issues [Rollup Issue #3188](https://github.com/rollup/rollup/issues/3188). [Example](/plugins/vite-plugin-external/usage#solving-iife-build-issues) - -## `rollback` -* Type: `boolean` -* Required: `false` - -Whether to revert to the legacy implementation. - -## `interop` -* Type: `"auto" | undefined` -* Required: `false` - -This option controls how Vite adjust build strategies -. [Example](/plugins/vite-plugin-external/usage#adjusting-build-strategies) - -## `enforce` -* Type: `'pre' | 'post'` -* Required: `false` - -Enforce order. Values: `pre` (before) or `post` (after). Refer to [Vite Plugin Ordering](https://vite.dev/guide/api-plugin#plugin-ordering). - -## `cwd` -* Type: `string` -* Required: `false` -* Default: `process.cwd()` - -Sets the current directory for resolving `cacheDir` relative paths. - -## `cacheDir` -* Type: `string` -* Required: `false` -* Default: `${cwd}/node_modules/.vite_external` - -Cache directory path. - -## `[mode: string]` -* Type: `BasicOptions` -* Required: `false` - -Configure external dependencies for specific modes. [Example](/plugins/vite-plugin-external/usage#multi-mode-configuration) - ---- - -## TypeScript Definitions - -```typescript -import type { NullValue, Plugin as RollupPlugin } from 'rollup'; -import type { ConfigEnv } from 'vite'; -import type { LogLevel } from 'vp-runtime-helper'; - -export type ExternalFn = ( - source: string, - importer: string | undefined, - isResolved: boolean -) => string | boolean | NullValue; - -export type ModuleNameMap = Record | ((id: string) => string); - -export type { LogLevel } from 'base-log-factory'; - -export interface BasicOptions { - /** - * Current working directory for resolving `cacheDir` paths. - * @default `process.cwd()` - */ - cwd?: string; - - /** - * Cache directory path - * @default `${cwd}/node_modules/.vite_external` - */ - cacheDir?: string; - - /** - * External dependencies configuration - */ - externals?: Record | ExternalFn; - - /** - * Logging level configuration - */ - logLevel?: LogLevel; -} - -export interface Options extends BasicOptions { - /** - * Mode-specific external dependencies configuration - */ - [mode: string]: BasicOptions | any; - - /** - * Revert to legacy implementation - */ - rollback?: boolean; - - /** - * Controls Vite's default handling behavior - */ - interop?: 'auto'; - - /** - * Plugin execution order ("pre" or "post") - */ - enforce?: 'pre' | 'post'; - - /** - * Exclude Node.js built-in modules - */ - nodeBuiltins?: boolean; - - /** - * Dependencies to exclude from bundling - */ - externalizeDeps?: Array; - - /** - * Fix Rollup#3188 issue (https://github.com/rollup/rollup/issues/3188) - */ - externalGlobals?: (globals: ModuleNameMap) => RollupPlugin; -} - -export interface ResolvedOptions extends Options, ConfigEnv { - cwd: string; - cacheDir: string; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/quick-start.md deleted file mode 100644 index 9d5c535..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/quick-start.md +++ /dev/null @@ -1,75 +0,0 @@ -# vite-plugin-external - -[![npm package](https://nodei.co/npm/vite-plugin-external.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-external) - -> Exclude specified module dependencies from runtime code and built bundles. -> Supported Vite versions: >= 3.1. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-external.svg?style=flat)](https://npmjs.org/package/vite-plugin-external) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-external.svg?style=flat)](https://npmjs.org/package/vite-plugin-external) -[![Node version](https://img.shields.io/node/v/vite-plugin-external.svg?style=flat)](https://npmjs.org/package/vite-plugin-external) - -## Description - -### Workflow for Vite 6.x and Earlier - -When the `command` value is `'serve'`, the plugin converts `externals` into `alias` configuration to leverage Vite's file loading capabilities. When `command` is `'build'`, it converts `externals` into `rollupOptions` configuration containing `external` and `output.globals`. However, you can configure `interop` as `'auto'` to uniformly convert `externals` into `alias` configuration, resulting in compatible import code in the bundled output. - -#### Runtime Flow - -![image](https://user-images.githubusercontent.com/6262382/126889725-a5d276ad-913a-4498-8da1-2aa3fd1404ab.png) - -### Workflow for Vite 6.x and Later - -When `command` is `'serve'`, the plugin prebuilds `externals` and reads Vite cache upon request hits. It supports `externals` as `object` or `function` from v6.1. - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-external -``` -```bash [pnpm] -pnpm add vite-plugin-external -``` -```bash [yarn] -yarn add vite-plugin-external -``` - -::: - -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externals: { - jquery: '$', - react: 'React', - 'react-dom/client': 'ReactDOM', - vue: 'Vue' - } - }) - ] -}); -``` - -## Changelog - -* **6.1.0** - * Reimplemented external plugin logic for Vite 6.x compatibility - * Added optional `rollback` parameter to revert to previous implementation - * Added optional `logLevel` parameter to control logging level (values: "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL" | "OFF") - -* **6.0.0** - * Added optional `externalGlobals` parameter to fix issue [rollup#3188](https://github.com/rollup/rollup/issues/3188) - -* **4.3.1** - * `externalizeDeps` configuration supports regex patterns - -* **4.3.0** - * Previous `mode: false` logic replaced with `interop: 'auto'` - * Added `nodeBuiltins` and `externalizeDeps` configurations for Node module bundling diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/usage.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/usage.md deleted file mode 100644 index 8c96772..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-external/usage.md +++ /dev/null @@ -1,273 +0,0 @@ -# Usage Examples - -## Basic Usage - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externals: { - jquery: '$', - react: 'React', - 'react-dom/client': 'ReactDOM', - vue: 'Vue' - } - }) - ] -}); -``` - -## Dynamic Configuration of Global Variable Names - -```js -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - externals(libName) { - if (libName === 'react') { - return 'React'; - } - if (libName === 'react-dom/client') { - return 'ReactDOM'; - } - } - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -## Multi-Environment Configuration - -> Sometimes development and production environments use different CDNs. You can configure `development` and `production` modes for respective external dependencies. - -production `index.html` -```html - - -``` - -development `index.html` -```html - -``` - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externals: { - react: '$linkdesign.React' - }, - development: { - externals: { - react: 'React' - } - } - }) - ] -}); -``` - -## Adjusting Build Strategies - -> The plugin uses two strategies during development runtime and build time. -> During development runtime, it maps dependencies to `module.exports = ${globalName};`. -> During build time, it configures Rollup's `external` and `output` options. -> The `interop` option controls whether to use the first strategy. - -Example configuration: - -`vite.config.mjs` -```js -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: '$linkdesign.React', - 'react-dom': '$linkdesign.ReactDOM', - 'prop-types': '$linkdesign.PropTypes' - } - }) - ], - build: { - minify: false, - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -`index.html` -```html - -``` - -`src/index.jsx` - -**Before Build** - -```jsx -import { useState, StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -function App() { - const [count, setCount] = useState(0); - return ( -
-

Count: {count}

- -
- ); -} -createRoot(document.getElementById('root')).render( - - - , -); -``` - -### Setting `interop` to `'auto'` - -**After Build** - -::: code-group - -```js [Vite 6.x] -(function() { - // ... (code remains unchanged) -}); -``` - -```js [Vite 5.x] -(function() { - // ... (code remains unchanged) -}); -``` - -```js [Vite 4.x] -(function() { - // ... (code remains unchanged) -}); -``` - -```js [Vite 3.x] -(function() { - // ... (code remains unchanged) -}); -``` - -::: - -### Without Setting `interop` - -**After Build** - -::: code-group -```js [Vite 6.x] -(function(React, ReactDOM) { - // ... (code remains unchanged) -})($linkdesign.React, $linkdesign.ReactDOM); -``` - -```js [Vite 5.x] -(function(React, ReactDOM) { - // ... (code remains unchanged) -})($linkdesign.React, $linkdesign.ReactDOM); -``` - -```js [Vite 4.x] -(function(React, ReactDOM) { - // ... (code remains unchanged) -})($linkdesign.React, $linkdesign.ReactDOM); -``` - -```js [Vite 3.x] -(function(React, ReactDOM) { - // ... (code remains unchanged) -})($linkdesign.React, $linkdesign.ReactDOM); -``` -::: - -## Solving IIFE Build Issues - -> For Vite versions below 6.x, use `rollup-plugin-external-globals` to resolve incomplete mapping. -> See https://github.com/rollup/rollup/issues/3188. - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; -import externalGlobals from 'rollup-plugin-external-globals'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externalGlobals, - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -## Excluding Dependencies During Build - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; -import { globSync } from 'tinyglobby'; -import { dependencies } from './package.json'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - nodeBuiltins: true, - externalizeDeps: Object.keys(dependencies) - }) - ], - build: { - minify: false, - lib: { - formats: ['es', 'cjs'], - entry: globbySync('src/*.js'), - fileName(format, entryName) { - return entryName + (format === 'es' ? '.mjs' : '.js'); - } - } - } -}); -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/quick-start.md deleted file mode 100644 index 6469fda..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/quick-start.md +++ /dev/null @@ -1,38 +0,0 @@ -# vite-plugin-hook-use - -[![npm package](https://nodei.co/npm/vite-plugin-hook-use.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-hook-use) - -> Displays the sequence and frequency of vite calling its hook functions. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-hook-use.svg?style=flat)](https://npmjs.org/package/vite-plugin-hook-use) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-hook-use.svg?style=flat)](https://npmjs.org/package/vite-plugin-hook-use) -[![Node version](https://img.shields.io/node/v/vite-plugin-hook-use.svg?style=flat)](https://npmjs.org/package/vite-plugin-hook-use) - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-hook-use -``` -```bash [pnpm] -pnpm add vite-plugin-hook-use -``` -```bash [yarn] -yarn add vite-plugin-hook-use -``` - -::: - -## Usage - -```js -import { defineConfig } from 'vite'; -import vitePluginHookUse from 'vite-plugin-hook-use'; - -export default defineConfig({ - plugins: [ - vitePluginHookUse() - ] -}); -``` diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/usage.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/usage.md deleted file mode 100644 index 0ec2a21..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-hook-use/usage.md +++ /dev/null @@ -1,82 +0,0 @@ -Here is the translated English version of the document: - ---- - -# Usage Examples - -Assume you have the following file structure: - -``` -src/ - |- index.js -``` - -Configure as follows: - -```typescript -import { defineConfig } from 'vite'; -import vitePluginHookUse from 'vite-plugin-hook-use'; - -export default defineConfig({ - plugins: [ - vitePluginHookUse() - ] -}); -``` - -Run the following command: - -```bash -vite build -``` - -The console will output the following content, where numbers indicate the call count: - -```bash -┌ === Start === -│ -◇ config(1) -│ -◇ configResolved(1) -│ -◇ options(1) -│ -◇ buildStart(1) -│ -◇ load(1) -│ -◇ transform(1) -│ -◇ moduleParsed(1) -│ -◇ buildEnd(1) -│ -◇ outputOptions(1) -│ -◇ renderStart(1) -│ -◇ banner(1) -│ -◇ footer(1) -│ -◇ intro(1) -│ -◇ outro(1) -│ -◇ renderChunk(1) -│ -◇ generateBundle(1) -│ -◇ writeBundle(1) -│ -◇ closeBundle(1) -│ -└ === End === -``` - ---- - -### Explanation: -- The plugin tracks and displays all Vite hook functions invoked during the build process. -- Each line shows the **hook name** followed by its **call count** in parentheses. -- The output helps visualize the execution sequence and frequency of Vite's internal hooks. \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-include-css/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-include-css/quick-start.md deleted file mode 100644 index 23d6ad1..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-include-css/quick-start.md +++ /dev/null @@ -1,49 +0,0 @@ -# vite-plugin-include-css - -[![npm package](https://nodei.co/npm/vite-plugin-include-css.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-include-css) - -> When `cssCodeSplit: false` is enabled, all CSS will be bundled into a single JavaScript file. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-include-css.svg?style=flat)](https://npmjs.org/package/vite-plugin-include-css) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-include-css.svg?style=flat)](https://npmjs.org/package/vite-plugin-include-css) -[![Node version](https://img.shields.io/node/v/vite-plugin-include-css.svg?style=flat)](https://npmjs.org/package/vite-plugin-include-css) - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-include-css -``` -```bash [pnpm] -pnpm add vite-plugin-include-css -``` -```bash [yarn] -yarn add vite-plugin-include-css -``` - -::: - -## Usage - -```js -import { defineConfig } from 'vite'; -import includeCSS from 'vite-plugin-include-css'; - -export default defineConfig({ - plugins: [ - includeCSS() - ], - build: { - cssCodeSplit: false, - rollupOptions: { - output: { - manualChunks: undefined, - assetFileNames: 'assets/[name][extname]', - entryFileNames: '[name].js', - format: 'iife' - } - } - } -}); -``` diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/options.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/options.md deleted file mode 100644 index 9494f93..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/options.md +++ /dev/null @@ -1,65 +0,0 @@ -# Option Reference - -## `routes` -* Type: `RouteConfig | Array | string` - * `RouteConfig | Array` - Initial list of mock routes that should be added to the dev server. - * `string` - Specify the directory to define mock routes that should be added to the dev server. -* Required: `false` - -## `routerOptions` -* Type: `SirvConfig | SirvConfig` -* Required: `false` -[Initial options of `find-my-way`](https://github.com/delvedor/find-my-way#findmywayoptions) - -## `cwd` -* Type: `string` -* Required: `false` -* Default: `process.cwd()`. -Current working directory. - -## `isAfter` -* Type: `boolean` -* Required: `false` -If `true`, these mock routes is matched after internal middlewares are installed. - -## TypeScript Definitions - -```ts -import { Config as SirvConfig, HTTPVersion, RouteOptions, Handler } from 'find-my-way'; - -export interface HandleRoute { - file?: string; - handler?: any | Handler; - options?: RouteOptions; - store?: any; -} - -export interface RouteConfig { - [route: string]: string | Handler | HandleRoute; -} - -export interface Options { - /** - * The directory to serve files from. - * @default `process.cwd()` - */ - cwd?: string; - - /** - * If `true`, these mock routes is matched after internal middlewares are installed. - * @default `false` - */ - isAfter?: boolean; - - /** - * Initial options of `find-my-way`. see more at https://github.com/delvedor/find-my-way#findmywayoptions - */ - routerOptions?: SirvConfig | SirvConfig; - - /** - * Initial list of mock routes that should be added to the dev server - * or specify the directory to define mock routes that should be added to the dev server. - */ - routes?: RouteConfig | Array | string; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/quick-start.md deleted file mode 100644 index 3f85d48..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/quick-start.md +++ /dev/null @@ -1,25 +0,0 @@ -# vite-plugin-mock-data - -[![npm package](https://nodei.co/npm/vite-plugin-mock-data.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-mock-data) - -> Provides a simple way to mock data. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-mock-data.svg?style=flat)](https://npmjs.org/package/vite-plugin-mock-data) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-mock-data.svg?style=flat)](https://npmjs.org/package/vite-plugin-mock-data) -[![Node version](https://img.shields.io/node/v/vite-plugin-mock-data.svg?style=flat)](https://npmjs.org/package/vite-plugin-mock-data) - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-mock-data -``` -```bash [pnpm] -pnpm add vite-plugin-mock-data -``` -```bash [yarn] -yarn add vite-plugin-mock-data -``` - -::: diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/usage.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/usage.md deleted file mode 100644 index fb883b5..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-mock-data/usage.md +++ /dev/null @@ -1,104 +0,0 @@ -# Usage Examples - -## Specify the directory to add mock routes to the dev server - -`vite.config.mjs` -```js -import { defineConfig } from 'vite'; -import mockData from 'vite-plugin-mock-data'; - -export default defineConfig({ - plugins: [ - mockData({ - routes: './mock' - }) - ] -}); -``` - -Make a mock route file `mock/test.ts` -```txt -. -├── mock -│ └── test.ts -``` - -The mock route file: -```js -module.exports = { - '/hello': 'hello', - '/hello2'(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello2'); - }, - '/hello3': { - handler(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello3'); - } - }, - '/json': { - handler: { hello: 1 } - }, - '/package.json': { - file: './package.json' - } -}; -``` - -Make a request to `/package.json` from the browser -```js -fetch('/package.json') - .then(res => res.json()) - .then((json) => { - console.log(json); - }); -``` - -## add mock routes to the dev server - -`vite.config.mjs` - -```js -import { defineConfig } from 'vite'; -import mockData from 'vite-plugin-mock-data'; - -export default defineConfig({ - plugins: [ - mockData({ - routes: { - '/hello': 'hello', - '/hello2'(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello2'); - }, - '/hello3': { - handler(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello3'); - } - }, - '/json': { - handler: { hello: 1 } - }, - '/package.json': { - file: './package.json' - } - } - }) - ] -}); -``` - -```js -fetch('/package.json') - .then(res => res.json()) - .then((json) => { - console.log(json); - }); -``` - diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/options.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/options.md deleted file mode 100644 index 99472e1..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/options.md +++ /dev/null @@ -1,55 +0,0 @@ -# Option Reference - -## `logLevel` -* **Type:** `"TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL" | "OFF"` -* **Required:** `false` -* **Default:** `"WARN"` - -## `libs` -* **Type:** `libConfig[]` -* **Required:** `false` - ---- - -# TypeScript Type Definitions - -```typescript -import type { LogLevel } from 'base-log-factory'; - -export interface ImportSource { - es: string; - cjs?: string; -} - -export interface libConfig { - /** - * Name(s) of the library to be transformed, can be a single string or an array of strings. - */ - name: string | string[]; - /** - * New path for the module. - */ - importFrom?: (importer: string, libName: string) => string | ImportSource; - /** - * Specify the import source to insert. - */ - insertFrom?: (importer: string, libName: string) => string | ImportSource | Array; -} - -export interface Options { - /** - * The value of `enforce` can be either `"pre"` or `"post"`, see more at https://vitejs.dev/guide/api-plugin.html#plugin-ordering. - */ - enforce?: 'pre' | 'post'; - - /** - * Configuration interface defining libraries and their transformation logic. - */ - libs?: libConfig[]; - - /** - * Log level for plugin output. - */ - logLevel?: LogLevel; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/quick-start.md deleted file mode 100644 index b54ac34..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/quick-start.md +++ /dev/null @@ -1,25 +0,0 @@ -# vite-plugin-separate-importer - -[![npm package](https://nodei.co/npm/vite-plugin-separate-importer.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-separate-importer) - -> Converts batch imports from a source module into separate imports from individual files under the source module. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-separate-importer.svg?style=flat)](https://npmjs.org/package/vite-plugin-separate-importer) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-separate-importer.svg?style=flat)](https://npmjs.org/package/vite-plugin-separate-importer) -[![Node version](https://img.shields.io/node/v/vite-plugin-separate-importer.svg?style=flat)](https://npmjs.org/package/vite-plugin-separate-importer) - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-separate-importer -``` -```bash [pnpm] -pnpm add vite-plugin-separate-importer -``` -```bash [yarn] -yarn add vite-plugin-separate-importer -``` - -::: \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/usage.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/usage.md deleted file mode 100644 index b59b89f..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-separate-importer/usage.md +++ /dev/null @@ -1,86 +0,0 @@ -# Usage Examples - -Configure in `vite.config.mjs`: -```js -import react from '@vitejs/plugin-react'; -import decamelize from 'decamelize'; -import { defineConfig, Plugin } from 'vite'; -import pluginExternal from 'vite-plugin-external'; -import pluginSeparateImporter from 'vite-plugin-separate-importer'; - -export default defineConfig({ - plugins: [ - react({ - jsxRuntime: 'classic' - }), - pluginExternal({ - externalizeDeps: ['antd', 'react'] - }), - pluginSeparateImporter({ - logLevel: 'TRACE', - libs: [ - { - name: 'antd', - importFrom(importer, libName) { - return { - es: `${libName}/es/${decamelize(importer)}`, - cjs: `${libName}/lib/${decamelize(importer)}` - }; - }, - insertFrom(importer, libName) { - return { - es: `${libName}/es/${decamelize(importer)}/style`, - cjs: `${libName}/lib/${decamelize(importer)}/style` - }; - } - } - ] - }) - ], - build: { - minify: false, - lib: { - formats: ['es', 'cjs'], - entry: ['src/index.tsx'], - fileName(format, entryName) { - return entryName + (format === 'es' ? '.mjs' : '.js'); - } - } - } -}); -``` - ---- - -## Component Wrapping Example - -`src/index.tsx`: -```tsx -import { Button } from 'antd'; - -export function WrappedButton() { - return ; -} -``` - ---- - -## Compiled Output -```js -import Button from "antd/es/button"; -import "antd/es/button/style"; -function WrappedButton() { - return /* @__PURE__ */ React.createElement(Button, null, "Wrapped Button"); -} -export { - WrappedButton -}; -``` - ---- - -### Explanation -1. The plugin transforms batch imports into individual file imports. -2. The `importFrom` function specifies the new module paths. -3. The `insertFrom` function adds style imports automatically. -4. The compiled output shows separated imports for `antd` components and their styles. \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/options.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/options.md deleted file mode 100644 index 548def9..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/options.md +++ /dev/null @@ -1,188 +0,0 @@ -# Configuration Options Reference - -## Options Configuration Interface -Core configuration options for the plugin: - -| Property | Type | Description | Default Value | -|-------------------|-------------------------------|-----------------------------------------------------------------------------|-----------------------------| -| **engine** | `SupportedTemplateEngines` | **Mandatory** - Specify the template engine name. | - | -| entry | `InputOption` | Entry file configuration for the template engine. | `index${extension}` | -| extension | `string` | File extension to process (defaults to the engine name if unspecified). | `.${engine}` | -| engineOptions | `EngineOptions` | Configuration options for the template engine. | - | -| pretty | `boolean` | Force code beautification (some engines like Pug may not recommend this). | `false` | -| logLevel | `LogLevel` | Control log level output. | - | -| enforce | `'pre' | 'post'` | Plugin execution order control (follows Vite plugin ordering rules). | - | - ---- - -## SupportedTemplateEngines Enumeration -List of supported template engines (59 engines): - -```typescript -type SupportedTemplateEngines = - | 'arc-templates' - | 'atpl' - | 'bracket' - | 'dot' - | 'dust' - | 'eco' - | 'ejs' - | 'ect' - | 'haml' - | 'haml-coffee' - | 'hamlet' - | 'handlebars' - | 'hogan' - | 'htmling' - | 'jade' - | 'jazz' - | 'jqtpl' - | 'just' - | 'liquid' - | 'liquor' - | 'lodash' - | 'marko' - | 'mote' - | 'mustache' - | 'nunjucks' - | 'plates' - | 'pug' - | 'qejs' - | 'ractive' - | 'razor' - | 'react' - | 'slm' - | 'squirrelly' - | 'swig' - | 'teacup' - | 'templayed' - | 'toffee' - | 'twig' - | 'underscore' - | 'vash' - | 'velocityjs' - | 'walrus' - | 'whiskers'; -``` - ---- - -## EngineOptions Type -Template engine configuration type supports two forms: -```typescript -type EngineOptions = - | Record - | ((config: ResolvedConfig) => Record | NullValue); -``` - -### Configuration Notes -- **engine**: Must specify a template engine name from the `SupportedTemplateEngines` list. -- **extension**: Defaults to the engine name (e.g., `pug` corresponds to `.pug`). -- **enforce**: Values must follow Vite's plugin execution order rules ([details](https://vitejs.dev/guide/api-plugin.html#plugin-ordering)). - ---- - -## Key Type References -- `LogLevel` from `base-log-factory` package -- `InputOption` from `rollup` package -- `ResolvedConfig` from `vite` package - ---- - -## TypeScript Type Definitions - -```typescript -import type { InputOption, NullValue } from 'rollup'; -import type { ResolvedConfig } from 'vite'; -import type { LogLevel } from 'vp-runtime-helper'; - -export type SupportedTemplateEngines = - | 'arc-templates' - | 'atpl' - | 'bracket' - | 'dot' - | 'dust' - | 'eco' - | 'ejs' - | 'ect' - | 'haml' - | 'haml-coffee' - | 'hamlet' - | 'handlebars' - | 'hogan' - | 'htmling' - | 'jade' - | 'jazz' - | 'jqtpl' - | 'just' - | 'liquid' - | 'liquor' - | 'lodash' - | 'marko' - | 'mote' - | 'mustache' - | 'nunjucks' - | 'plates' - | 'pug' - | 'qejs' - | 'ractive' - | 'razor' - | 'react' - | 'slm' - | 'squirrelly' - | 'swig' - | 'teacup' - | 'templayed' - | 'toffee' - | 'twig' - | 'underscore' - | 'vash' - | 'velocityjs' - | 'walrus' - | 'whiskers'; - -export type EngineOptions = - | Record - | ((config: ResolvedConfig) => Record | NullValue); - -export interface Options { - /** - * Specify the template engine name - */ - engine: SupportedTemplateEngines; - - /** - * Specify the template engine entry files - * - * @default `index${extension}` - */ - entry?: InputOption; - - /** - * Specify the file extension to process, defaults to the engine name - * - * @default `.${engine}` - */ - extension?: string; - - /** - * Template engine configuration - */ - engineOptions?: EngineOptions; - - /** - * Force HTML beautification after rendering (some engines like Pug may not support this) - */ - pretty?: boolean; - - /** - * Output log level - */ - logLevel?: LogLevel; - - /** - * Plugin execution order: "pre" (before other plugins) or "post" (after) - */ - enforce?: 'pre' | 'post'; -} -``` diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/quick-start.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/quick-start.md deleted file mode 100644 index b43f6f3..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/quick-start.md +++ /dev/null @@ -1,112 +0,0 @@ -# vite-plugin-view - -[![npm package](https://nodei.co/npm/vite-plugin-view.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-view) - -> Dynamically render pages using custom template engines instead of the static `index.html` entry file. - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-view.svg?style=flat)](https://npmjs.org/package/vite-plugin-view) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-view.svg?style=flat)](https://npmjs.org/package/vite-plugin-view) -[![Node version](https://img.shields.io/node/v/vite-plugin-view.svg?style=flat)](https://npmjs.org/package/vite-plugin-view) - - ---- - -## Supported Template Engines -The plugin supports **59 template engines** (sorted alphabetically): - - -* arc-templates -* atpl -* bracket -* dot -* dust -* eco -* ejs -* ect -* haml -* haml-coffee -* hamlet -* handlebars -* hogan -* htmling -* jade -* jazz -* jqtpl -* just -* liquid -* liquor -* lodash -* marko -* mote -* mustache -* nunjucks -* plates -* pug -* qejs -* ractive -* razor -* react -* slm -* squirrelly -* swig -* teacup -* templayed -* toffee -* twig -* underscore -* vash -* velocityjs -* walrus -* whiskers - ---- - -## Installation Steps - -### 1. Install Plugin & Template Engine -::: code-group -```bash [npm] -npm add vite-plugin-view -``` -```bash [pnpm] -pnpm add vite-plugin-view -``` -```bash [yarn] -yarn add vite-plugin-view -``` -::: - -> Replace `` with any engine from the list above (e.g., `pug` or `ejs`). - ---- - -## Configuration Example -Configure the plugin in `vite.config.js`: - -```javascript -import { defineConfig } from 'vite'; -import { view } from 'vite-plugin-view'; - -export default defineConfig({ - plugins: [ - view({ - engine: 'pug', // Set the template engine to use (e.g., 'pug', 'ejs', etc.) - }) - ] -}); -``` - ---- - -## Advanced Features -To add global variables/filters to template engines, refer to: -👉 [Template Engine Instances](https://github.com/ladjs/consolidate?tab=readme-ov-file#template-engine-instances) - ---- - -## Important Notes -1. Ensure the selected template engine dependency is installed (e.g., `npm install pug`). -2. Place template files in Vite-accessible paths (default entry: `index.${extension}`). -3. Some engines (e.g., `pug`) may have specific requirements for beautification (`pretty` option). -4. Always test configurations with your chosen template engine. -``` diff --git a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/usage.md b/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/usage.md deleted file mode 100644 index 1c1f545..0000000 --- a/packages/create-vite-lib-starter/docs/en/plugins/vite-plugin-view/usage.md +++ /dev/null @@ -1,354 +0,0 @@ -# Usage Examples - -## Pug Template Usage Example - -### Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-view pug -``` -```bash [pnpm] -pnpm add vite-plugin-view pug -``` -```bash [yarn] -yarn add vite-plugin-view pug -``` - -::: - -### Configuration - -Configure in `vite.config.mjs`: - -```js -import vue from '@vitejs/plugin-vue'; -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { view } from 'vite-plugin-view'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - vue: 'Vue' - } - }), - vue(), - view({ - engine: 'pug', - // entry: 'index.pug', // Default is 'index.pug', can configure multiple templates - engineOptions: { - title: 'Vite + Vue' // Available as `title` variable in templates - }, - logLevel: 'TRACE' // Set to 'TRACE' to view all logs - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### Using Passed Parameters in Templates - -`index.pug`: - -```pug -doctype html -html(lang='en') - head - meta(charset='UTF-8') - meta(content='width=device-width, initial-scale=1.0' name='viewport') - title= title - link(href='./index.css' rel='stylesheet') - body - //- ResolvedConfig comes from the configResolved hook - p - | define: - = JSON.stringify(ResolvedConfig.define, null, 2) - p - | env: - = JSON.stringify(ResolvedConfig.env, null, 2) - #root - script(src='//unpkg.com/vue@3.5.13/dist/vue.runtime.global.js') - script(src='./src/main.ts' type='module') -``` - ---- - -## EJS Template Usage Example - -### Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-view ejs -``` -```bash [pnpm] -pnpm add vite-plugin-view ejs -``` -```bash [yarn] -yarn add vite-plugin-view ejs -``` - -::: - -### Configuration - -Configure in `vite.config.mjs`: - -```js -import react from '@vitejs/plugin-react'; -import { defineConfig, Plugin } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { view } from 'vite-plugin-view'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }), - react({ - jsxRuntime: 'classic' - }), - view({ - engine: 'ejs', - // entry: 'index.ejs', // Default is 'index.ejs', can configure multiple templates - engineOptions: { - title: 'Vite + React' // Available as `title` variable in templates - }, - logLevel: 'TRACE' // Set to 'TRACE' to view all logs - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### Using Passed Parameters in Templates - -`index.ejs`: - -```html - - - - - - <%= title %> - - - - <%# ResolvedConfig comes from the configResolved hook %> -

alias: <%= JSON.stringify(ResolvedConfig.resolve.alias, null, 2) %>

-

env: <%= JSON.stringify(ResolvedConfig.env, null, 2) %>

-
- - - - - -``` - ---- - -## Nunjucks Template Usage Example - -### Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-view nunjucks -``` -```bash [pnpm] -pnpm add vite-plugin-view nunjucks -``` -```bash [yarn] -yarn add vite-plugin-view nunjucks -``` - -::: - -### Configuration - -Configure in `vite.config.mjs`: - -```js -import react from '@vitejs/plugin-react'; -import nunjucks from 'nunjucks'; -import { defineConfig, Plugin } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { engineSource, view } from 'vite-plugin-view'; - -const env = new nunjucks.Environment(); - -env.addFilter('stringify', (obj) => { - return JSON.stringify(obj, null, 2); -}); - -engineSource.requires.nunjucks = env; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }), - react({ - jsxRuntime: 'classic' - }), - view({ - engine: 'nunjucks', - // entry: 'index.nunjucks', // Default is 'index.nunjucks', can configure multiple templates - engineOptions: { - title: 'Vite + React' // Available as `title` variable in templates - }, - logLevel: 'TRACE' // Set to 'TRACE' to view all logs - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### Using Passed Parameters in Templates - -`index.nunjucks`: - -```html - - - - - - {{ title }} - - - - {# ResolvedConfig comes from the configResolved hook #} -

alias: {{ ResolvedConfig.resolve.alias|stringify }}

-

env: {{ ResolvedConfig.env|stringify }}

-
- - - - - -``` - ---- - -## Handlebars Template Usage Example - -### Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-view handlebars -``` -```bash [pnpm] -pnpm add vite-plugin-view handlebars -``` -```bash [yarn] -yarn add vite-plugin-view handlebars -``` - -::: - -### Configuration - -Configure in `vite.config.mjs`: - -```js -import react from '@vitejs/plugin-react'; -import Handlebars from 'handlebars'; -import { defineConfig, Plugin } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { view } from 'vite-plugin-view'; - -Handlebars.registerHelper('stringify', (obj) => { - return JSON.stringify(obj, null, 2); -}); - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }), - react({ - jsxRuntime: 'classic' - }), - view({ - engine: 'handlebars', - // entry: 'index.handlebars', // Default is 'index.handlebars', can configure multiple templates - engineOptions: { - title: 'Vite + React' // Available as `title` variable in templates - }, - logLevel: 'TRACE' // Set to 'TRACE' to view all logs - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### Using Passed Parameters in Templates - -`index.handlebars`: - -```handlebars - - - - - - {{ title }} - - - - {{! ResolvedConfig comes from the configResolved hook }} -

alias: {{ stringify ResolvedConfig.resolve.alias }}

-

env: {{ stringify ResolvedConfig.env }}

-
- - - - - -``` diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/options.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/options.md deleted file mode 100644 index 46ca8cf..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/options.md +++ /dev/null @@ -1,77 +0,0 @@ -# 配置项 - -## TypeScript 定义 - -```ts -export type NameExport = (name: string, filePath: string) => string; - -export interface Options { - /** - * Path to the files to be combined, supports glob patterns. - * - * 需要合并的文件路径,支持 glob 模式。 - */ - src: string | string[]; - /** - * Path to the target file after combination. - * - * 合并后的目标文件路径。 - * - * @default 'index.js' - */ - target: string; - - /** - * Whether to overwrite the existing target file。 - * - * 是否覆盖已存在的目标文件。 - * - * @default false - */ - overwrite?: boolean; - - /** - * Custom function or boolean value for controlling the generation of export names. - * - * 自定义导出名称的函数或布尔值,用于控制导出名称的生成方式。 - */ - nameExport?: NameExport | boolean; - - /** - * Exported module types. - * - * 导出的模块类型 - * - * @default 'named' - */ - exports?: 'named' | 'default' | 'both' | 'none'; - - /** - * The value of enforce can be either `"pre"` or `"post"`, see more at https://vitejs.dev/guide/api-plugin.html#plugin-ordering. - * - * 强制执行顺序,`pre` 前,`post` 后,参考 https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering。 - */ - enforce?: 'pre' | 'post'; - - /** - * Log level - * - * 输出日志等级 - */ - logLevel?: LogLevel; - - /** - * Current Working Directory. - * - * 当前工作目录 - */ - cwd?: string; - - /** - * Handle code before writing to the file. - * - * 写入文件前处理代码字符串 - */ - beforeWrite?: (code: string) => string | void | undefined | null; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/quick-start.md deleted file mode 100644 index 50ef0d4..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/quick-start.md +++ /dev/null @@ -1,52 +0,0 @@ -# vite-plugin-combine - -[![npm package](https://nodei.co/npm/vite-plugin-combine.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-combine) - -> 将多个模块文件合并成一个目标文件。它支持命名导出、默认导出、自动导出和无导出四种模式,并可以根据配置自动生成相应的导入语句。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-combine.svg?style=flat)](https://npmjs.org/package/vite-plugin-combine) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-combine.svg?style=flat)](https://npmjs.org/package/vite-plugin-combine) -[![Node version](https://img.shields.io/node/v/vite-plugin-combine.svg?style=flat)](https://npmjs.org/package/vite-plugin-combine) - -## 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-combine -``` -```bash [pnpm] -pnpm add vite-plugin-combine -``` -```bash [yarn] -yarn add vite-plugin-combine -``` - -::: - -## 使用方法 - -在 `vite.config.ts` 中引入并配置插件: - -```typescript -import { defineConfig } from 'vite'; -import pluginCombine from 'vite-plugin-combine'; - -export default defineConfig({ - plugins: [ - pluginCombine({ - src: 'src/*.ts', // 匹配要组合的文件路径 - target: 'src/index.ts', // 目标文件路径 - exports: 'named', // 导出类型:'named' | 'default' | ‘both’ | 'none' - }) - ], - build: { - minify: false, - lib: { - entry: [], - formats: ['es', 'cjs'], - fileName: '[name]' - } - } -}); -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/usage.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/usage.md deleted file mode 100644 index b062e90..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-combine/usage.md +++ /dev/null @@ -1,64 +0,0 @@ -# 使用示例 - -假设你有以下文件结构: - -``` -src/ - |- components/ - | |- Button.ts - | |- Input.ts - | |- Select.ts -``` - -配置如下: - -```typescript -import { defineConfig } from 'vite'; -import pluginCombine from 'vite-plugin-combine'; - -export default defineConfig({ - plugins: [ - pluginCombine({ - src: 'src/components/**/*.ts', - target: 'src/index.ts', - exports: 'named', - nameExport: (name, filePath) => `my${name}` - }) - ], - build: { - minify: false, - lib: { - entry: [], - formats: ['es', 'cjs'], - fileName: '[name]' - } - } -}); -``` - -输出的文件内容: - -`dist/index.mjs` -```mjs -export { default as default2 } from './Button'; -export { default as default3 } from './Input'; -export { default as default4 } from './Select'; - -export { - default2 as myButton, - default3 as myInput, - default4 as mySelect -}; -``` - -`dist/index.js` -```js -"use strict"; -Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); -const Button = require("./Button.js"); -const Input = require("./Input.js"); -const Select = require("./Select.js"); -exports.Button = Button; -exports.Input = Input; -exports.Select = Select; -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/options.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/options.md deleted file mode 100644 index e4a6c35..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/options.md +++ /dev/null @@ -1,118 +0,0 @@ -# 配置项 - -```ts -export interface Target { - /** - * Path or glob of what to copy. - * - * 要复制的目录、文件或者 `globby` 匹配规则。 - */ - src: string | string[]; - - /** - * One or more destinations where to copy. - * - * 复制到目标目录。 - */ - dest: string; - - /** - * Rename the file after copying. - * - * 复制后重命名文件。 - */ - rename?: string | ((name: string) => string); - - /** - * Remove the directory structure of copied files, if `src` is a directory. - * - * 是否删除复制的文件目录结构,`src` 为目录时有效。 - */ - flatten?: boolean; - - /** - * Options for tinyglobby. See more at https://github.com/sindresorhus/globby#options - * - * tinyglobby 的选项,设置 `src` 的匹配参数 - */ - globOptions?: GlobOptions; - - /** - * Options for fs-extra.copy See more at https://github.com/jprichardson/node-fs-extra/blob/HEAD/docs/copy.md - * - * fs-extra.copy 的选项,设置 `src` 的复制参数 - */ - copyOptions?: CopyOptions; - - /** - * Transform the file before copying. - * - * 复制前转换文件内容。 - */ - transform?: TransformFile; -} - -export interface Options { - /** - * Default `'closeBundle'`, vite hook the plugin should use. - * - * 默认 `'closeBundle'`,调用指定钩子函数时开始复制。 - * - * @default 'closeBundle' - */ - hook?: string; - - /** - * The value of enforce can be either `"pre"` or `"post"`, see more at https://vitejs.dev/guide/api-plugin.html#plugin-ordering. - * - * 强制执行顺序,`pre` 前,`post` 后,参考 https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering - */ - enforce?: 'pre' | 'post'; - - /** - * Options for tinyglobby. See more at https://github.com/SuperchupuDev/tinyglobby?tab=readme-ov-file#options - * - * tinyglobby 的选项,设置 `src` 的匹配参数。 - */ - globOptions?: GlobOptions; - - /** - * Options for fs-extra.copy See more at https://github.com/jprichardson/node-fs-extra/blob/HEAD/docs/copy.md - * - * fs-extra.copy 的选项,设置 `src` 的复制参数 - */ - copyOptions?: CopyOptions; - - /** - * Default `process.cwd()`, The current working directory in which to search. - * - * 默认 `process.cwd()`,用于拼接 `src` 的路径。 - * - * @default `process.cwd()` - */ - cwd?: string; - - /** - * Array of targets to copy. - * - * 复制文件的规则配置。 - */ - targets: Target[]; - - /** - * Default `'warn'`, The log level to use. - * - * 默认 `'warn'`,日志等级。 - * - * @default 'WARN' - */ - logLevel?: LogLevel; - - /** - * Delay in milliseconds before copying. - * - * 复制前的延迟时间。 - */ - delay?: number; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/quick-start.md deleted file mode 100644 index b0314b8..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-cp/quick-start.md +++ /dev/null @@ -1,85 +0,0 @@ -# vite-plugin-cp - -[![npm package](https://nodei.co/npm/vite-plugin-cp.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-cp) - -> 一个用于复制文件/目录,并支持灵活转换文件内容、保留或扁平化目录结构、自定义文件重命名等的Vite插件。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-cp.svg?style=flat)](https://npmjs.org/package/vite-plugin-cp) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-cp.svg?style=flat)](https://npmjs.org/package/vite-plugin-cp) -[![Node version](https://img.shields.io/node/v/vite-plugin-cp.svg?style=flat)](https://npmjs.org/package/vite-plugin-cp) - - -## 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-cp -``` -```bash [pnpm] -pnpm add vite-plugin-cp -``` -```bash [yarn] -yarn add vite-plugin-cp -``` - -::: - -## 功能特性 -- 📁 支持使用glob模式复制文件/目录 -- 🔄 在复制前灵活转换文件内容 -- 📦 可保留或扁平化目录结构 -- 🛠️ 自定义文件重命名 -- 🔄 支持JavaScript和TypeScript项目 -- ⚡ 在Vite的构建生命周期中运行 - -## 使用示例 - -```js -import { defineConfig } from 'vite'; -import cp from 'vite-plugin-cp'; - -export default defineConfig({ - plugins: [ - cp({ - targets: [ - // 从 'node_modules/vite/dist' 复制所有文件到 'dist/cp/test' - { src: './node_modules/vite/dist', dest: 'dist/cp/test' }, - - // 将 'node_modules/vite/dist' 的所有文件复制到 'dist/cp/test2',保留目录结构 - { src: './node_modules/vite/dist', dest: 'dist/cp/test2', flatten: false }, - - // 将 'node_modules/vite' 的README.md文件复制到 'dist/cp' - { src: './node_modules/vite/README.md', dest: 'dist/cp' }, - - // 重命名复制文件 - { src: './node_modules/vite/index.cjs', dest: 'dist/cp', rename: 'index.js' }, - - // 复制所有.ts文件到目标目录 - { src: './node_modules/vite/**/*.ts', dest: 'dist/cp/types' }, - - // 动态重命名.ts文件 - { - src: './node_modules/vite/**/*.ts', dest: 'dist/cp/types2', - rename(name) { - return name.replace('.d.ts', '.ts'); - } - }, - - // 转换JSON文件内容 - { - src: './node_modules/vite/package.json', dest: 'dist/cp', - transform(buf) { - const pkg = JSON.parse(buf.toString()); - return JSON.stringify({ - ...pkg, - name: 'vite-plugin-cp-test', - version: '1.0.0' - }, null, 2); - } - } - ] - }) - ] -}); -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/options.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/options.md deleted file mode 100644 index c143345..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/options.md +++ /dev/null @@ -1,156 +0,0 @@ -# 配置选项参考 - -## `externals` -* 类型:`Record` -* 必填:`false` - -配置外部依赖项。[示例](/zh/plugins/vite-plugin-external/usage#基础使用) - -## `logLevel` -* 类型:`"TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL" | "OFF"` -* 必填:`false` -* 默认值:`"WARN"` - -设置日志级别。 - -## `nodeBuiltins` -* 类型:`boolean` -* 必填:`false` - -是否排除 Node.js 内置模块。[示例](/zh/plugins/vite-plugin-external/usage#构建时仅排除依赖) - -## `externalizeDeps` -* 类型:`Array` -* 必填:`false` - -指定需要排除的打包依赖项。[示例](/zh/plugins/vite-plugin-external/usage#构建时仅排除依赖) - -## `externalGlobals` -* 类型:`(globals: Record) => rollup.Plugin` -* 必填:`false` - -解决 IIFE 打包问题([Rollup Issue #3188](https://github.com/rollup/rollup/issues/3188))。[示例](/zh/plugins/vite-plugin-external/usage#解决-iife-格式的打包问题) - -## `rollback` -* 类型:`boolean` -* 必填:`false` - -是否回退到旧版实现。 - -## `interop` -* 类型:`"auto" | undefined` -* 必填:`false` - -控制 Vite 的默认构建策略调整。[示例](/zh/plugins/vite-plugin-external/usage#调整打包策略) - -## `enforce` -* 类型:`'pre' | 'post'` -* 必填:`false` - -设置插件执行顺序。可选值:`pre`(前置)或 `post`(后置)。参考 [Vite 插件顺序](https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering)。 - -## `cwd` -* 类型:`string` -* 必填:`false` -* 默认值:`process.cwd()` - -设置解析 `cacheDir` 相对路径时的当前工作目录。 - -## `cacheDir` -* 类型:`string` -* 必填:`false` -* 默认值:`${cwd}/node_modules/.vite_external` - -缓存目录路径。 - -## `[mode: string]` -* 类型:`BasicOptions` -* 必填:`false` - -为特定模式配置外部依赖项。[示例](/zh/plugins/vite-plugin-external/usage#多模式场景配置) - ---- - -## TypeScript 类型定义 - -```typescript -import type { NullValue, Plugin as RollupPlugin } from 'rollup'; -import type { ConfigEnv } from 'vite'; -import type { LogLevel } from 'vp-runtime-helper'; - -export type ExternalFn = ( - source: string, - importer: string | undefined, - isResolved: boolean -) => string | boolean | NullValue; - -export type ModuleNameMap = Record | ((id: string) => string); - -export type { LogLevel } from 'base-log-factory'; - -export interface BasicOptions { - /** - * 解析 `cacheDir` 路径时的当前工作目录。 - * @default `process.cwd()` - */ - cwd?: string; - - /** - * 缓存目录路径 - * @default `${cwd}/node_modules/.vite_external` - */ - cacheDir?: string; - - /** - * 外部依赖项配置 - */ - externals?: Record | ExternalFn; - - /** - * 日志级别配置 - */ - logLevel?: LogLevel; -} - -export interface Options extends BasicOptions { - /** - * 按模式配置的外部依赖项 - */ - [mode: string]: BasicOptions | any; - - /** - * 回退到旧版实现 - */ - rollback?: boolean; - - /** - * 控制 Vite 的默认行为 - */ - interop?: 'auto'; - - /** - * 插件执行顺序("pre" 或 "post") - */ - enforce?: 'pre' | 'post'; - - /** - * 是否排除 Node.js 内置模块 - */ - nodeBuiltins?: boolean; - - /** - * 需要排除的打包依赖项 - */ - externalizeDeps?: Array; - - /** - * 解决 Rollup#3188 问题(https://github.com/rollup/rollup/issues/3188) - */ - externalGlobals?: (globals: ModuleNameMap) => RollupPlugin; -} - -export interface ResolvedOptions extends Options, ConfigEnv { - cwd: string; - cacheDir: string; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/quick-start.md deleted file mode 100644 index 9ccf3b9..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/quick-start.md +++ /dev/null @@ -1,112 +0,0 @@ -# vite-plugin-external - -[![npm package](https://nodei.co/npm/vite-plugin-external.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-external) - -> 从运行时代码和构建后的 bundles 中排除指定的模块依赖项。 -> 使用范围 Vite >= 3.1。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-external.svg?style=flat)](https://npmjs.org/package/vite-plugin-external) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-external.svg?style=flat)](https://npmjs.org/package/vite-plugin-external) -[![Node version](https://img.shields.io/node/v/vite-plugin-external.svg?style=flat)](https://npmjs.org/package/vite-plugin-external) - -## 说明 - -### Vite 6.x 之前的流程 - -当 `command` 的值为 `'serve'` 时,插件将 `externals` 转换成 `alias` 配置,这样可以直接使用 Vite 的文件加载能力;当 `command` 的值为 `'build'` 时,插件将 `externals` 转换成 `rollupOptions` 配置,包含 `external` 和 `output.globals`。但是可以通过配置 `interop` 为 `'auto'`,统一将 `externals` 转换成 `alias` 配置,打包后的代码中会使用兼容代码导入外部依赖。 - -#### 运行时流程 - -![image](https://user-images.githubusercontent.com/6262382/126889725-a5d276ad-913a-4498-8da1-2aa3fd1404ab.png) - -### Vite 6.x 之后的流程 - -当 `command` 的值为 `'serve'` 时,插件将 `externals` 预构建,请求命中后直接读取 Vite 缓存,从 v6.1 版本开始支持 `externals` 为 `object`、`function`。 - -## 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-external -``` -```bash [pnpm] -pnpm add vite-plugin-external -``` -```bash [yarn] -yarn add vite-plugin-external -``` - -::: - -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externals: { - jquery: '$', - - vue: 'Vue', - - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife', - }, - }, - } -}); -``` - -```js -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - externals(libName) { - if (libName === 'react') { - return 'React'; - } - - if (libName === 'react-dom/client') { - return 'ReactDOM'; - } - } - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife', - }, - }, - } -}); -``` - -## 变更记录 - -* 6.1.0 - * 针对 Vite 6.x 重新实现了 external 插件逻辑 - * 新增可选参数 `rollback`,可回退到原来的实现逻辑 - * 新增可选参数 `logLevel`,可控制日志输出等级,即:"TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL" | "OFF" - -* 6.0.0 - * 新增可选参数 `externalGlobals` 修复 https://github.com/rollup/rollup/issues/3188 - -* 4.3.1 - * `externalizeDeps` 配置项支持传入正则表达式 - -* 4.3.0 - * 上一个版本的 `mode: false` 的逻辑改用 `interop: 'auto'` 代替 - * 新增字段 `nodeBuiltins` 和 `externalizeDeps` 配置项用于开发node模块后的打包处理 diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/usage.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/usage.md deleted file mode 100644 index 749a3dc..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-external/usage.md +++ /dev/null @@ -1,390 +0,0 @@ -# 使用示例 - -## 基础使用 - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externals: { - jquery: '$', - - react: 'React', - 'react-dom/client': 'ReactDOM', - - vue: 'Vue' - } - }) - ] -}); -``` - -## 动态配置全局变量名 - -```js -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - externals(libName) { - if (libName === 'react') { - return 'React'; - } - if (libName === 'react-dom/client') { - return 'ReactDOM'; - } - } - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -## 多模式场景配置 - -> 有时候可能开发环境和生产环境用到的 cdn 不一致。针对这种情况,可以配置 `development` 和 `production` 两个模式,分别对应开发环境和生产环境的外部依赖。 - -production `index.html` -```html - - -``` - -development `index.html` -```html - -``` - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externals: { - react: '$linkdesign.React' - }, - development: { - externals: { - react: 'React' - } - } - }) - ] -}); -``` - -## 调整打包策略 - -> 插件在处理外部依赖时有两套策略,分别应用到开发运行时和构建时。 - -> 开发运行时,插件会根据 `externals` 配置项,将外部依赖映射成 `module.exports = ${globalName};`。 - -> 构建时,插件会根据 `externals` 配置项,将外部依赖映射成 `rollupOptions.external` 和 `rollupOptions.output`。 - -> `interop` 配置项,用于控制是否沿用第一种策略。 - -**以下面这段配置为例:** - -`vite.config.mjs` - -```js -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: '$linkdesign.React', - 'react-dom': '$linkdesign.ReactDOM', - 'prop-types': '$linkdesign.PropTypes' - } - }) - ], - build: { - minify: false, - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -`index.html` - -```html - -``` - -`src/index.jsx` - -**打包前** - -```jsx -import { useState, StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -function App() { - const [count, setCount] = useState(0); - return ( -
-

Count: {count}

- -
- ); -} -createRoot(document.getElementById('root')).render( - - - , -); -``` - -### 设置 `interop` 为 `'auto'` - -**打包后** - -::: code-group - -```js [Vite 6.x] -(function() { - "use strict"; - function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; - } - var react; - var hasRequiredReact; - function requireReact() { - if (hasRequiredReact) return react; - hasRequiredReact = 1; - react = $linkdesign.React; - return react; - } - var reactExports = requireReact(); - const React = /* @__PURE__ */ getDefaultExportFromCjs(reactExports); - var reactDom; - var hasRequiredReactDom; - function requireReactDom() { - if (hasRequiredReactDom) return reactDom; - hasRequiredReactDom = 1; - reactDom = $linkdesign.ReactDOM; - return reactDom; - } - var reactDomExports = requireReactDom(); - const ReactDOM = /* @__PURE__ */ getDefaultExportFromCjs(reactDomExports); - function App() { - const [count, setCount] = reactExports.useState(0); - return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("p", null, reactExports.version), /* @__PURE__ */ React.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM.render( - /* @__PURE__ */ React.createElement(App, null), - document.getElementById("root") - ); -})(); -``` - -```js [Vite 5.x] -(function() { - "use strict"; - function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; - } - var react = React; - const React$1 = /* @__PURE__ */ getDefaultExportFromCjs(react); - var reactDom = $linkdesign.ReactDOM; - const ReactDOM = /* @__PURE__ */ getDefaultExportFromCjs(reactDom); - function App() { - const [count, setCount] = react.useState(0); - return /* @__PURE__ */ React$1.createElement(React$1.Fragment, null, /* @__PURE__ */ React$1.createElement("p", null, react.version), /* @__PURE__ */ React$1.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React$1.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM.render( - /* @__PURE__ */ React$1.createElement(App, null), - document.getElementById("root") - ); -})(); -``` - -```js [Vite 4.x] -(function() { - "use strict"; - function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; - } - var react = React; - const React$1 = /* @__PURE__ */ getDefaultExportFromCjs(react); - var reactDom = $linkdesign.ReactDOM; - const ReactDOM = /* @__PURE__ */ getDefaultExportFromCjs(reactDom); - function App() { - const [count, setCount] = react.useState(0); - return /* @__PURE__ */ React$1.createElement(React$1.Fragment, null, /* @__PURE__ */ React$1.createElement("p", null, react.version), /* @__PURE__ */ React$1.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React$1.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM.render( - /* @__PURE__ */ React$1.createElement(App, null), - document.getElementById("root") - ); -})(); -``` - -```js [Vite 3.x] -(function() { - "use strict"; - var react = React; - var reactDom = $linkdesign.ReactDOM; - function App() { - const [count, setCount] = react.useState(0); - return /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("p", null, react.version), /* @__PURE__ */ react.createElement("h1", null, "Count: ", count), /* @__PURE__ */ react.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - reactDom.render( - /* @__PURE__ */ react.createElement(App, null), - document.getElementById("root") - ); -})(); -``` - -::: - - -### 未设置 `interop` - -**打包后** - -::: code-group -```js [Vite 6.x] -(function(React, ReactDOM) { - "use strict"; - function App() { - const [count, setCount] = React.useState(0); - return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("p", null, React.version), /* @__PURE__ */ React.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM.render( - /* @__PURE__ */ React.createElement(App, null), - document.getElementById("root") - ); -})($linkdesign.React, $linkdesign.ReactDOM); -``` - -```js [Vite 5.x] -(function(React, ReactDOM) { - "use strict"; - function App() { - const [count, setCount] = React.useState(0); - return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("p", null, React.version), /* @__PURE__ */ React.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM.render( - /* @__PURE__ */ React.createElement(App, null), - document.getElementById("root") - ); -})($linkdesign.React, $linkdesign.ReactDOM); -``` - -```js [Vite 4.x] -(function(React, ReactDOM) { - "use strict"; - function App() { - const [count, setCount] = React.useState(0); - return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("p", null, React.version), /* @__PURE__ */ React.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM.render( - /* @__PURE__ */ React.createElement(App, null), - document.getElementById("root") - ); -})($linkdesign.React, $linkdesign.ReactDOM); -``` - -```js [Vite 3.x] -(function(React, ReactDOM) { - "use strict"; - const _interopDefaultLegacy = (e) => e && typeof e === "object" && "default" in e ? e : { default: e }; - const React__default = /* @__PURE__ */ _interopDefaultLegacy(React); - const ReactDOM__default = /* @__PURE__ */ _interopDefaultLegacy(ReactDOM); - function App() { - const [count, setCount] = React.useState(0); - return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("p", null, React.version), /* @__PURE__ */ React__default.default.createElement("h1", null, "Count: ", count), /* @__PURE__ */ React__default.default.createElement("button", { onClick: () => setCount((prev) => prev + 1) }, "Click me")); - } - ReactDOM__default.default.render( - /* @__PURE__ */ React__default.default.createElement(App, null), - document.getElementById("root") - ); -})($linkdesign.React, $linkdesign.ReactDOM); -``` -::: - -## 解决 IIFE 格式的打包问题 - -> 在上述示例中,Vite 6.x 以下的版本存在打包问题,`react` 没有被完全映射成 `$linkdesign.React`,因此需要用到 `rollup-plugin-external-globals` 插件。 - -> 具体问题参阅 https://github.com/rollup/rollup/issues/3188 。 - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; -import externalGlobals from 'rollup-plugin-external-globals'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - externalGlobals, - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -## 构建时仅排除依赖 - -> 比如要排除 `node_modules` 内的依赖,可以使用 `externalizeDeps` 排除它们。或者使用 `nodeBuiltins` 排除 Nodejs 内置模块。 - -vite.config.mjs -```js -import { defineConfig } from 'vite'; -import pluginExternal from 'vite-plugin-external'; -import { globSync } from 'tinyglobby'; -import { dependencies } from './package.json'; - -export default defineConfig({ - plugins: [ - pluginExternal({ - nodeBuiltins: true, - externalizeDeps: Object.keys(dependencies) - }) - ], - build: { - minify: false, - lib: { - formats: ['es', 'cjs'], - entry: globbySync('src/*.js'), - fileName(format, entryName) { - return entryName + (format === 'es' ? '.mjs' : '.js'); - } - } - } -}); -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/quick-start.md deleted file mode 100644 index 121b7c0..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/quick-start.md +++ /dev/null @@ -1,38 +0,0 @@ -# vite-plugin-hook-use - -[![npm package](https://nodei.co/npm/vite-plugin-hook-use.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-hook-use) - -> 显示 `vite` 调用其钩子函数的序列和频率 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-hook-use.svg?style=flat)](https://npmjs.org/package/vite-plugin-hook-use) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-hook-use.svg?style=flat)](https://npmjs.org/package/vite-plugin-hook-use) -[![Node version](https://img.shields.io/node/v/vite-plugin-hook-use.svg?style=flat)](https://npmjs.org/package/vite-plugin-hook-use) - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-hook-use -``` -```bash [pnpm] -pnpm add vite-plugin-hook-use -``` -```bash [yarn] -yarn add vite-plugin-hook-use -``` - -::: - -## Usage - -```js -import { defineConfig } from 'vite'; -import vitePluginHookUse from 'vite-plugin-hook-use'; - -export default defineConfig({ - plugins: [ - vitePluginHookUse() - ] -}); -``` diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/usage.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/usage.md deleted file mode 100644 index 0c524af..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-hook-use/usage.md +++ /dev/null @@ -1,69 +0,0 @@ -# 使用示例 - -假设你有以下文件结构: - -``` -src/ - |- index.js -``` - -配置如下: - -```typescript -import { defineConfig } from 'vite'; -import vitePluginHookUse from 'vite-plugin-hook-use'; - -export default defineConfig({ - plugins: [ - vitePluginHookUse() - ] -}); -``` - -```bash -vite build -``` - -将会在控制台打印出以下内容,数字表示调用次数 - -```bash -┌ === Start === -│ -◇ config(1) -│ -◇ configResolved(1) -│ -◇ options(1) -│ -◇ buildStart(1) -│ -◇ load(1) -│ -◇ transform(1) -│ -◇ moduleParsed(1) -│ -◇ buildEnd(1) -│ -◇ outputOptions(1) -│ -◇ renderStart(1) -│ -◇ banner(1) -│ -◇ footer(1) -│ -◇ intro(1) -│ -◇ outro(1) -│ -◇ renderChunk(1) -│ -◇ generateBundle(1) -│ -◇ writeBundle(1) -│ -◇ closeBundle(1) -│ -└ === End === -``` diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-include-css/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-include-css/quick-start.md deleted file mode 100644 index 6121a0a..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-include-css/quick-start.md +++ /dev/null @@ -1,49 +0,0 @@ -# vite-plugin-include-css - -[![npm package](https://nodei.co/npm/vite-plugin-include-css.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-include-css) - -> 当启用 `cssCodeSplit: false` 时,将所有CSS打包到单个JavaScript文件中。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-include-css.svg?style=flat)](https://npmjs.org/package/vite-plugin-include-css) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-include-css.svg?style=flat)](https://npmjs.org/package/vite-plugin-include-css) -[![Node version](https://img.shields.io/node/v/vite-plugin-include-css.svg?style=flat)](https://npmjs.org/package/vite-plugin-include-css) - -## Installation - -::: code-group - -```bash [npm] -npm add vite-plugin-include-css -``` -```bash [pnpm] -pnpm add vite-plugin-include-css -``` -```bash [yarn] -yarn add vite-plugin-include-css -``` - -::: - -## Usage - -```js -import { defineConfig } from 'vite'; -import includeCSS from 'vite-plugin-include-css'; - -export default defineConfig({ - plugins: [ - includeCSS() - ], - build: { - cssCodeSplit: false, - rollupOptions: { - output: { - manualChunks: undefined, - assetFileNames: 'assets/[name][extname]', - entryFileNames: '[name].js', - format: 'iife' - } - } - } -}); -``` diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/options.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/options.md deleted file mode 100644 index 0ba957a..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/options.md +++ /dev/null @@ -1,67 +0,0 @@ -# 配置选项参考 - -## `routes` -* **类型**:`RouteConfig | Array | string` - * `RouteConfig | Array` - 需要添加到开发服务器的初始模拟路由列表。 - * `string` - 指定定义模拟路由的目录路径。 -* **必填**:`false` - -## `routerOptions` -* **类型**:`SirvConfig | SirvConfig` -* **必填**:`false` - * `find-my-way` 库的初始配置选项,[详情见文档](https://github.com/delvedor/find-my-way#findmywayoptions)。 - -## `cwd` -* **类型**:`string` -* **必填**:`false` -* **默认值**:`process.cwd()` - 当前工作目录。 - -## `isAfter` -* **类型**:`boolean` -* **必填**:`false` - * 如果设为 `true`,这些模拟路由将在内部中间件安装完成后才进行匹配。 - ---- - -## TypeScript 类型定义 - -```typescript -import { Config as SirvConfig, HTTPVersion, RouteOptions, Handler } from 'find-my-way'; - -export interface HandleRoute { - file?: string; - handler?: any | Handler; - options?: RouteOptions; - store?: any; -} - -export interface RouteConfig { - [route: string]: string | Handler | HandleRoute; -} - -export interface Options { - /** - * 需要提供文件的目录路径。 - * @default `process.cwd()` - */ - cwd?: string; - - /** - * 如果设为 `true`,这些模拟路由将在内部中间件安装完成后匹配。 - * @default `false` - */ - isAfter?: boolean; - - /** - * `find-my-way` 的初始配置选项。[详情见文档](https://github.com/delvedor/find-my-way#findmywayoptions) - */ - routerOptions?: SirvConfig | SirvConfig; - - /** - * 需要添加到开发服务器的初始模拟路由列表, - * 或指定定义模拟路由的目录路径。 - */ - routes?: RouteConfig | Array | string; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/quick-start.md deleted file mode 100644 index e1c3dd3..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/quick-start.md +++ /dev/null @@ -1,25 +0,0 @@ -# vite-plugin-mock-data - -[![npm package](https://nodei.co/npm/vite-plugin-mock-data.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-mock-data) - -> 提供了一种简单的方式来模拟数据。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-mock-data.svg?style=flat)](https://npmjs.org/package/vite-plugin-mock-data) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-mock-data.svg?style=flat)](https://npmjs.org/package/vite-plugin-mock-data) -[![Node version](https://img.shields.io/node/v/vite-plugin-mock-data.svg?style=flat)](https://npmjs.org/package/vite-plugin-mock-data) - -## 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-mock-data -``` -```bash [pnpm] -pnpm add vite-plugin-mock-data -``` -```bash [yarn] -yarn add vite-plugin-mock-data -``` - -::: diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/usage.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/usage.md deleted file mode 100644 index d89baf6..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-mock-data/usage.md +++ /dev/null @@ -1,105 +0,0 @@ -# 使用示例 - -## 指定目录将模拟路由添加到开发服务器 - -在 `vite.config.mjs` 中配置: -```js -import { defineConfig } from 'vite'; -import mockData from 'vite-plugin-mock-data'; - -export default defineConfig({ - plugins: [ - mockData({ - routes: './mock' - }) - ] -}); -``` - -创建模拟路由文件 `mock/test.ts`: -```txt -. -├── mock -│ └── test.ts -``` - -模拟路由文件内容: -```js -module.exports = { - '/hello': 'hello', - '/hello2'(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello2'); - }, - '/hello3': { - handler(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello3'); - } - }, - '/json': { - handler: { hello: 1 } - }, - '/package.json': { - file: './package.json' - } -}; -``` - -通过浏览器请求 `/package.json`: -```js -fetch('/package.json') - .then(res => res.json()) - .then((json) => { - console.log(json); - }); -``` - ---- - -## 直接添加模拟路由到开发服务器 - -在 `vite.config.mjs` 中直接配置: -```js -import { defineConfig } from 'vite'; -import mockData from 'vite-plugin-mock-data'; - -export default defineConfig({ - plugins: [ - mockData({ - routes: { - '/hello': 'hello', - '/hello2'(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello2'); - }, - '/hello3': { - handler(req, res) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - res.end('hello3'); - } - }, - '/json': { - handler: { hello: 1 } - }, - '/package.json': { - file: './package.json' - } - } - }) - ] -}); -``` - -通过浏览器请求 `/package.json`: -```js -fetch('/package.json') - .then(res => res.json()) - .then((json) => { - console.log(json); - }); -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/options.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/options.md deleted file mode 100644 index fe6f167..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/options.md +++ /dev/null @@ -1,62 +0,0 @@ -# 配置选项参考 - -## `logLevel` -* **类型:** `"TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL" | "OFF"` -* **必填:** `false` -* **默认值:** `"WARN"` - -## `libs` -* **类型:** `libConfig[]` -* **必填:** `false` - ---- - -## TypeScript 类型定义 - -```typescript -import type { LogLevel } from 'base-log-factory'; -export interface ImportSource { - es: string; - cjs?: string; -} - -export interface libConfig { - /** - * 待转换的库名称,可以是单个字符串或字符串数组 - * Library name(s) to be transformed, can be a single string or an array of strings - */ - name: string | string[]; - /** - * 模块的新路径 - * New path for the module - */ - importFrom?: (importer: string, libName: string) => string | ImportSource; - /** - * 插入导入声明 - * Insert import source - */ - insertFrom?: (importer: string, libName: string) => string | ImportSource | Array; -} - -export interface Options { - /** - * The value of enforce can be either `"pre"` or `"post"`, see more at https://vitejs.dev/guide/api-plugin.html#plugin-ordering. - * - * 强制执行顺序,`pre` 前,`post` 后,参考 https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering。 - */ - enforce?: 'pre' | 'post'; - - /** - * 插件配置接口,用于定义待转换的库名称及其处理逻辑 - * Interface for plugin configuration to define the library names and processing logic - */ - libs?: libConfig[]; - - - /** - * 输出日志等级 - * Output log level - */ - logLevel?: LogLevel; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/quick-start.md deleted file mode 100644 index a6e8a1f..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/quick-start.md +++ /dev/null @@ -1,25 +0,0 @@ -# vite-plugin-separate-importer - -[![npm package](https://nodei.co/npm/vite-plugin-separate-importer.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-separate-importer) - -> 将原来从一个源模块批量导入内容变成分批从源模块下导入单个文件。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-separate-importer.svg?style=flat)](https://npmjs.org/package/vite-plugin-separate-importer) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-separate-importer.svg?style=flat)](https://npmjs.org/package/vite-plugin-separate-importer) -[![Node version](https://img.shields.io/node/v/vite-plugin-separate-importer.svg?style=flat)](https://npmjs.org/package/vite-plugin-separate-importer) - -## 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-separate-importer -``` -```bash [pnpm] -pnpm add vite-plugin-separate-importer -``` -```bash [yarn] -yarn add vite-plugin-separate-importer -``` - -::: diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/usage.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/usage.md deleted file mode 100644 index aea7b46..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-separate-importer/usage.md +++ /dev/null @@ -1,75 +0,0 @@ -# 使用示例 - -在 `vite.config.mjs` 中配置: -```js -import react from '@vitejs/plugin-react'; -import decamelize from 'decamelize'; -import { defineConfig, Plugin } from 'vite'; -import pluginExternal from 'vite-plugin-external'; -import pluginSeparateImporter from 'vite-plugin-separate-importer'; - -export default defineConfig({ - plugins: [ - react({ - jsxRuntime: 'classic' - }) as unknown as Plugin, - pluginExternal({ - externalizeDeps: ['antd', 'react'] - }), - pluginSeparateImporter({ - logLevel: 'TRACE', - libs: [ - { - name: 'antd', - importFrom(importer, libName) { - return { - es: `${libName}/es/${decamelize(importer)}`, - cjs: `${libName}/lib/${decamelize(importer)}` - }; - }, - insertFrom(importer, libName) { - return { - es: `${libName}/es/${decamelize(importer)}/style`, - cjs: `${libName}/lib/${decamelize(importer)}/style` - }; - } - } - ] - }) - ], - build: { - minify: false, - lib: { - formats: ['es', 'cjs'], - entry: ['src/index.tsx'], - fileName(format, entryName) { - return entryName + (format === 'es' ? '.mjs' : '.js'); - } - } - } -}); -``` - -## 二次封装组件 - -`src/index.tsx` -```tsx -import { Button } from 'antd'; - -export function WrappedButton() { - return ; -} -``` - - -## 编译后的输出 -```js -import Button from "antd/es/button"; -import "antd/es/button/style"; -function WrappedButton() { - return /* @__PURE__ */ React.createElement(Button, null, "Wrapped Button"); -} -export { - WrappedButton -}; -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/options.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/options.md deleted file mode 100644 index 1392407..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/options.md +++ /dev/null @@ -1,195 +0,0 @@ -# 配置选项参考 - -## Options 配置接口 -插件核心配置选项: - -| 属性名 | 类型 | 描述 | 默认值 | -|----------------|----------------------------|--------------------------------------|----------------------| -| **engine** | `SupportedTemplateEngines` | 必填项,指定模板引擎名称 | - | -| entry | `InputOption` | 模板引擎入口文件配置 | `index${extension}` | -| extension | `string` | 需要处理的文件扩展名,默认与引擎名称一致 | `.${engine}` | -| engineOptions | `EngineOptions` | 模板引擎配置选项 | - | -| pretty | `boolean` | 强制美化代码输出(部分引擎不建议渲染时美化) | `false` | -| logLevel | `LogLevel` | 日志等级控制 | - | -| enforce | `'pre' | 'post'` | 插件执行顺序控制(参考 Vite 插件排序规则) | - | - -## SupportedTemplateEngines 枚举类型 -支持的模板引擎列表,包含以下 59 种类型: - -```typescript -type SupportedTemplateEngines = - | 'arc-templates' - | 'atpl' - | 'bracket' - | 'dot' - | 'dust' - | 'eco' - | 'ejs' - | 'ect' - | 'haml' - | 'haml-coffee' - | 'hamlet' - | 'handlebars' - | 'hogan' - | 'htmling' - | 'jade' - | 'jazz' - | 'jqtpl' - | 'just' - | 'liquid' - | 'liquor' - | 'lodash' - | 'marko' - | 'mote' - | 'mustache' - | 'nunjucks' - | 'plates' - | 'pug' - | 'qejs' - | 'ractive' - | 'razor' - | 'react' - | 'slm' - | 'squirrelly' - | 'swig' - | 'teacup' - | 'templayed' - | 'toffee' - | 'twig' - | 'underscore' - | 'vash' - | 'velocityjs' - | 'walrus' - | 'whiskers'; -``` - -## EngineOptions 类型 -模板引擎配置类型,支持两种形式: -```typescript -type EngineOptions = - | Record - | ((config: ResolvedConfig) => Record | NullValue); -``` - -### 配置说明 -- **engine**: 必须指定模板引擎名称(参考 `SupportedTemplateEngines` 列表) -- **extension**: 若未指定则自动使用引擎名称作为扩展名(如 `pug` 对应 `.pug`) -- **enforce**: 取值需符合 Vite 插件执行顺序规范([详情](https://vitejs.dev/guide/api-plugin.html#plugin-ordering)) - -## 关键类型引用 -- `LogLevel` 来自 `base-log-factory` 包 -- `InputOption` 来自 `rollup` 包 -- `ResolvedConfig` 来自 `vite` 包 - -## TypeScript 类型定义 - -```typescript -import type { InputOption, NullValue } from 'rollup'; -import type { ResolvedConfig } from 'vite'; -import type { LogLevel } from 'vp-runtime-helper'; - -export type SupportedTemplateEngines = - | 'arc-templates' - | 'atpl' - | 'bracket' - | 'dot' - | 'dust' - | 'eco' - | 'ejs' - | 'ect' - | 'haml' - | 'haml-coffee' - | 'hamlet' - | 'handlebars' - | 'hogan' - | 'htmling' - | 'jade' - | 'jazz' - | 'jqtpl' - | 'just' - | 'liquid' - | 'liquor' - | 'lodash' - | 'marko' - | 'mote' - | 'mustache' - | 'nunjucks' - | 'plates' - | 'pug' - | 'qejs' - | 'ractive' - | 'razor' - | 'react' - | 'slm' - | 'squirrelly' - | 'swig' - | 'teacup' - | 'templayed' - | 'toffee' - | 'twig' - | 'underscore' - | 'vash' - | 'velocityjs' - | 'walrus' - | 'whiskers'; - -export type EngineOptions = - | Record - | ((config: ResolvedConfig) => Record | NullValue); - -export interface Options { - /** - * 指定模版引擎名称 - * - * Specify the template engine name - */ - engine: SupportedTemplateEngines; - - /** - * 指定模版引擎入口文件 - * - * Specify the template engine entry files - * - * @default `index${extension}` - */ - entry?: InputOption; - - /** - * 用于处理指定扩展名的文件,默认跟引擎名称保持一致 - * - * Specify the extension of the file to be processed, defaults to the same as the engine name - * - * @default `.${engine}` - */ - extension?: string; - - /** - * 模版引擎配置 - * - * Template engine configuration - */ - engineOptions?: EngineOptions; - - /** - * 强制美化代码,一些模版引擎可能不建议在渲染时美化(如:pug)或不支持美化,使用此参数在完成渲染后再美化HTML代码 - * - * Force beautify code - */ - pretty?: boolean; - - /** - * 输出日志等级 - * - * Output log level - */ - logLevel?: LogLevel; - - - /** - * 强制执行顺序,`pre` 前,`post` 后,参考 https://cn.vitejs.dev/guide/api-plugin.html#plugin-ordering。 - * - * The value of enforce can be either `"pre"` or `"post"`, see more at https://vitejs.dev/guide/api-plugin.html#plugin-ordering. - */ - enforce?: 'pre' | 'post'; -} -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/quick-start.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/quick-start.md deleted file mode 100644 index 2c719c1..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/quick-start.md +++ /dev/null @@ -1,108 +0,0 @@ -# vite-plugin-view - -[![npm package](https://nodei.co/npm/vite-plugin-view.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-view) - -> 使用自定义模板引擎动态渲染页面,替代静态的 `index.html` 入口文件。 - -[![NPM version](https://img.shields.io/npm/v/vite-plugin-view.svg?style=flat)](https://npmjs.org/package/vite-plugin-view) -[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-view.svg?style=flat)](https://npmjs.org/package/vite-plugin-view) -[![Node version](https://img.shields.io/node/v/vite-plugin-view.svg?style=flat)](https://npmjs.org/package/vite-plugin-view) - ---- - -## 支持的模板引擎 -支持以下 59 种模板引擎(按字母顺序排列): - -* arc-templates -* atpl -* bracket -* dot -* dust -* eco -* ejs -* ect -* haml -* haml-coffee -* hamlet -* handlebars -* hogan -* htmling -* jade -* jazz -* jqtpl -* just -* liquid -* liquor -* lodash -* marko -* mote -* mustache -* nunjucks -* plates -* pug -* qejs -* ractive -* razor -* react -* slm -* squirrelly -* swig -* teacup -* templayed -* toffee -* twig -* underscore -* vash -* velocityjs -* walrus -* whiskers - ---- - -## 安装步骤 - -### 1. 安装插件及模板引擎 - -::: code-group -```bash [npm] -npm install vite-plugin-view <模板引擎名称> -``` -```bash [pnpm] -pnpm add vite-plugin-view <模板引擎名称> -``` -```bash [yarn] -yarn add vite-plugin-view <模板引擎名称> -``` -::: - -> 替换 `<模板引擎名称>` 为上方列表中的任意一种(如 `pug` 或 `ejs`) - ---- - -## 配置示例 -在 `vite.config.js` 中配置插件: - -```javascript -import { defineConfig } from 'vite'; -import { view } from 'vite-plugin-view'; - -export default defineConfig({ - plugins: [ - view({ - engine: 'pug', // 必填:指定模板引擎 - }) - ] -}); -``` - ---- - -## 功能增强 -如需为模板引擎添加全局变量/过滤器,可参考以下方法: -👉 [Template Engine Instances](https://github.com/ladjs/consolidate?tab=readme-ov-file#template-engine-instances) - ---- - -## 注意事项 -1. 确保已安装所选模板引擎的依赖包(如 `npm install pug`) -2. 模板文件需放置在 Vite 可识别的路径中(默认入口为 `index.${extension}`) diff --git a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/usage.md b/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/usage.md deleted file mode 100644 index 191a95a..0000000 --- a/packages/create-vite-lib-starter/docs/zh/plugins/vite-plugin-view/usage.md +++ /dev/null @@ -1,345 +0,0 @@ -# 使用示例 - -## Pug 模板使用示例 - -### 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-view pug -``` -```bash [pnpm] -pnpm add vite-plugin-view pug -``` -```bash [yarn] -yarn add vite-plugin-view pug -``` - -::: - -### 配置 - -在 `vite.config.mjs` 中配置: - -```js -import vue from '@vitejs/plugin-vue'; -import { defineConfig } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { view } from 'vite-plugin-view'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - vue: 'Vue' - } - }), - vue(), - view({ - engine: 'pug', - // entry: 'index.pug', // 默认为 'index.pug',可以配置多个模版文件 - engineOptions: { - title: 'Vite + Vue' // 在模版中可以使用 `title` 变量 - }, - logLevel: 'TRACE' // 设置 'TRACE' 可以查看所有的打印日志 - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### 在模板中使用透传参数 - -`index.pug` - -```pug -doctype html -html(lang='en') - head - meta(charset='UTF-8') - meta(content='width=device-width, initial-scale=1.0' name='viewport') - title= title - link(href='./index.css' rel='stylesheet') - body - //- ResolvedConfig 来自 configResolved 钩子 - p - | define: - = JSON.stringify(ResolvedConfig.define, null, 2) - p - | env: - = JSON.stringify(ResolvedConfig.env, null, 2) - #root - script(src='//unpkg.com/vue@3.5.13/dist/vue.runtime.global.js') - script(src='./src/main.ts' type='module') -``` - -## EJS 模板使用示例 - -### 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-view ejs -``` -```bash [pnpm] -pnpm add vite-plugin-view ejs -``` -```bash [yarn] -yarn add vite-plugin-view ejs -``` - -::: - -### 配置 - -在 `vite.config.mjs` 中配置: -```js -import react from '@vitejs/plugin-react'; -import { defineConfig, Plugin } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { view } from 'vite-plugin-view'; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }), - react({ - jsxRuntime: 'classic' - }), - view({ - engine: 'ejs', - // entry: 'index.ejs', // 默认为 'index.ejs',可以配置多个模版文件 - engineOptions: { - title: 'Vite + React' // 在模版中可以使用 `title` 变量 - }, - logLevel: 'TRACE' // 设置 'TRACE' 可以查看所有的打印日志 - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### 在模板中使用透传参数 - -`index.ejs` - -```html - - - - - - <%= title %> - - - - <%# ResolvedConfig 来自 configResolved 钩子 %> -

alias: <%= JSON.stringify(ResolvedConfig.resolve.alias, null, 2) %>

-

env: <%= JSON.stringify(ResolvedConfig.env, null, 2) %>

-
- - - - - -``` - -## Nunjucks 模板使用示例 - -### 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-view nunjucks -``` -```bash [pnpm] -pnpm add vite-plugin-view nunjucks -``` -```bash [yarn] -yarn add vite-plugin-view nunjucks -``` - -::: - -### 配置 - -在 `vite.config.mjs` 中配置: -```js -import react from '@vitejs/plugin-react'; -import nunjucks from 'nunjucks'; -import { defineConfig, Plugin } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { engineSource, view } from 'vite-plugin-view'; - -const env = new nunjucks.Environment(); - -env.addFilter('stringify', (obj) => { - return JSON.stringify(obj, null, 2); -}); - -engineSource.requires.nunjucks = env; - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }), - react({ - jsxRuntime: 'classic' - }), - view({ - engine: 'nunjucks', - // entry: 'index.nunjucks', // 默认为 'index.nunjucks',可以配置多个模版文件 - engineOptions: { - title: 'Vite + React' // 在模版中可以使用 `title` 变量 - }, - logLevel: 'TRACE' // 设置 'TRACE' 可以查看所有的打印日志 - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### 在模板中使用透传参数 - -`index.nunjucks` - -```html - - - - - - {{ title }} - - - - {# ResolvedConfig 来自 configResolved 钩子 #} -

alias: {{ ResolvedConfig.resolve.alias|stringify }}

-

env: {{ ResolvedConfig.env|stringify }}

-
- - - - - -``` - -## Handlebars 模板使用示例 - -### 安装 - -::: code-group - -```bash [npm] -npm add vite-plugin-view handlebars -``` -```bash [pnpm] -pnpm add vite-plugin-view handlebars -``` -```bash [yarn] -yarn add vite-plugin-view handlebars -``` - -::: - -### 配置 - -在 `vite.config.mjs` 中配置: -```js -import react from '@vitejs/plugin-react'; -import Handlebars from 'handlebars'; -import { defineConfig, Plugin } from 'vite'; -import vitePluginExternal from 'vite-plugin-external'; -import { view } from 'vite-plugin-view'; - -Handlebars.registerHelper('stringify', (obj) => { - return JSON.stringify(obj, null, 2); -}); - -export default defineConfig({ - plugins: [ - vitePluginExternal({ - logLevel: 'TRACE', - externals: { - react: 'React', - 'react-dom/client': 'ReactDOM' - } - }), - react({ - jsxRuntime: 'classic' - }), - view({ - engine: 'handlebars', - // entry: 'index.handlebars', // 默认为 'index.handlebars',可以配置多个模版文件 - engineOptions: { - title: 'Vite + React' // 在模版中可以使用 `title` 变量 - }, - logLevel: 'TRACE' // 设置 'TRACE' 可以查看所有的打印日志 - }) - ], - build: { - rollupOptions: { - output: { - format: 'iife' - } - } - } -}); -``` - -### 在模板中使用透传参数 - -`index.handlebars` - -```handlebars - - - - - - {{ title }} - - - - {{! ResolvedConfig 来自 configResolved 钩子 }} -

alias: {{ stringify ResolvedConfig.resolve.alias }}

-

env: {{ stringify ResolvedConfig.env }}

-
- - - - - -``` \ No newline at end of file diff --git a/packages/create-vite-lib-starter/package.json b/packages/create-vite-lib-starter/package.json index 8b6973e..de0b5b2 100644 --- a/packages/create-vite-lib-starter/package.json +++ b/packages/create-vite-lib-starter/package.json @@ -1,20 +1,17 @@ { "name": "create-vite-lib-starter", "version": "1.0.0", - "types": "./dist/index.d.ts", - "module": "./dist/index.mjs", - "main": "./dist/index.js", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.js" - } - }, + "types": "dist/index.d.ts", + "module": "dist/index.mjs", + "main": "dist/index.js", + "unpkg": "dist/index.umd.js", + "jsdelivr": "dist/index.umd.js", "bin": { "create-vite-lib-starter": "bin/index.mjs" }, "scripts": { + "deps": "npm run clean && pnpm install", + "clean": "rm -rf node_modules", "dev": "vite", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", @@ -22,6 +19,7 @@ "build": "vite build", "eslint": "eslint --ext .js,.mjs,.jsx,.ts,.tsx --fix --ignore-path .eslintignore ./", "prepare": "husky", + "prepublishOnly": "npm run build", "preview": "vite preview", "test": "vitest run --coverage", "typedoc": "typedoc && typedoc --options typedoc.zh.json" @@ -50,6 +48,6 @@ "fs-extra": "^11.3.0" }, "files": [ - "dist" + "dist/" ] } \ No newline at end of file diff --git a/packages/create-vite-lib-starter/src/noop.ts b/packages/create-vite-lib-starter/src/noop.ts index 9106a5d..2693fa5 100644 --- a/packages/create-vite-lib-starter/src/noop.ts +++ b/packages/create-vite-lib-starter/src/noop.ts @@ -1,4 +1,5 @@ /** * Empty function that does nothing. */ -export default function noop() {} +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export default function noop(...args: any[]) {} diff --git a/packages/create-vite-lib-starter/test/index.test.ts b/packages/create-vite-lib-starter/test/index.test.ts new file mode 100644 index 0000000..94c239c --- /dev/null +++ b/packages/create-vite-lib-starter/test/index.test.ts @@ -0,0 +1,39 @@ +import { describe, expect, test, vi } from 'vitest'; + +import { isNil, noop } from '../src/index'; + +describe('Utils Functions', () => { + describe('isNil', () => { + test('returns true for null', () => { + expect(isNil(null)).toBe(true); + }); + + test('returns true for undefined', () => { + expect(isNil(undefined)).toBe(true); + }); + + test('returns false for non-nil values', () => { + expect(isNil(0)).toBe(false); + expect(isNil('')).toBe(false); + expect(isNil({})).toBe(false); + expect(isNil(false)).toBe(false); + }); + }); + + describe('noop', () => { + test('does not throw an error when called', () => { + expect(() => noop()).not.toThrow(); + }); + + test('is a function', () => { + expect(typeof noop).toBe('function'); + }); + + // 如果需要验证无副作用(可选) + test('has no side effects', () => { + const spy = vi.fn(); + noop(spy); // 假设支持参数但不执行 + expect(spy).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/create-vite-lib-starter/tsconfig.json b/packages/create-vite-lib-starter/tsconfig.json index e7c8db2..73c30fb 100644 --- a/packages/create-vite-lib-starter/tsconfig.json +++ b/packages/create-vite-lib-starter/tsconfig.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.base.json", "include": [ "./src/**/*.ts", - "./test/index.test.ts", + "./test/*.ts", "./node_modules/vite/client.d.ts", "./vite.config.mts" ] diff --git a/packages/vite-plugin-build-chunk/LICENSE b/packages/vite-plugin-build-chunk/LICENSE new file mode 100644 index 0000000..2720669 --- /dev/null +++ b/packages/vite-plugin-build-chunk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Jesse Feng + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/vite-plugin-build-chunk/README.md b/packages/vite-plugin-build-chunk/README.md new file mode 100644 index 0000000..15236c1 --- /dev/null +++ b/packages/vite-plugin-build-chunk/README.md @@ -0,0 +1,53 @@ +# vite-plugin-build-chunk + +[![npm package](https://nodei.co/npm/vite-plugin-build-chunk.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-build-chunk) + +> + +[![NPM version](https://img.shields.io/npm/v/vite-plugin-build-chunk.svg?style=flat)](https://npmjs.org/package/vite-plugin-build-chunk) +[![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-build-chunk.svg?style=flat)](https://npmjs.org/package/vite-plugin-build-chunk) +[![Node version](https://img.shields.io/node/v/vite-plugin-build-chunk.svg?style=flat)](https://npmjs.org/package/vite-plugin-build-chunk) + +## Installation + +```bash +npm install vite-plugin-build-chunk --save-dev +``` + +## Usage + +```js +import { defineConfig } from 'vite'; +import pluginBuildChunk from 'vite-plugin-build-chunk'; + +export default defineConfig({ + plugins: [ + pluginBuildChunk({ + chunk: 'index.mjs', + name: 'MyLib', + format: 'umd', + minify: false + }) + ] +}); +``` + + +## Documentation + +For detailed usage instructions and API references, please visit the official documentation: + +👉 [View Full Documentation](https://fengxinming.github.io/vite-plugins/plugins/vite-plugin-build-chunk/quick-start) + +## Contributing + +We welcome contributions from the community! If you find a bug or want to suggest an improvement, feel free to open an issue or submit a pull request. + +### How to Contribute +1. Fork the repository. +2. Create a new branch for your changes. +3. Submit a pull request with a clear description of your changes. + +## License + +This project is licensed under the [MIT License](LICENSE). \ No newline at end of file diff --git a/packages/vite-plugin-build-chunk/package.json b/packages/vite-plugin-build-chunk/package.json new file mode 100644 index 0000000..1e097e8 --- /dev/null +++ b/packages/vite-plugin-build-chunk/package.json @@ -0,0 +1,50 @@ +{ + "name": "vite-plugin-build-chunk", + "version": "6.0.0", + "description": "", + "types": "./dist/index.d.ts", + "module": "./dist/index.mjs", + "main": "./dist/index.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + }, + "engines": { + "node": ">=14.18.0", + "vite": ">=3.1.0" + }, + "scripts": { + "build:lib": "vite build", + "watch": "vite build --watch", + "prepublishOnly": "npm run build:lib", + "release": "pnpm publish --no-git-checks" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fengxinming/vite-plugins.git", + "directory": "packages/vite-plugin-build-chunk" + }, + "keywords": [ + "vite-plugin", + "vite-plugin-build-chunk" + ], + "author": "Jesse Feng ", + "license": "MIT", + "bugs": { + "url": "https://github.com/fengxinming/vite-plugins/issues" + }, + "homepage": "https://fengxinming.github.io/vite-plugins/plugins/vite-plugin-build-chunk/quick-start", + "dependencies": { + "vp-runtime-helper": "workspace:^" + }, + "devDependencies": { + "@rollup/plugin-typescript": "^12.1.2", + "vite": "^6.1.0" + }, + "files": [ + "dist" + ] +} \ No newline at end of file diff --git a/packages/vite-plugin-build-chunk/src/index.ts b/packages/vite-plugin-build-chunk/src/index.ts new file mode 100644 index 0000000..c9da3c3 --- /dev/null +++ b/packages/vite-plugin-build-chunk/src/index.ts @@ -0,0 +1,67 @@ +import { join } from 'node:path'; + +import type { Plugin } from 'vite'; +import { build } from 'vite'; + +import type { Options } from './types'; + +export * from './types'; + +export default function pluginBuildChunk(opts: Options): Plugin { + let buildOptions = opts.build; + if (!Array.isArray(buildOptions)) { + buildOptions = [buildOptions]; + } + + let originalOutDir; + + return { + name: 'vite-plugin-build-chunk', + apply: 'build', + enforce: 'post', + configResolved(config) { + originalOutDir = config.build.outDir; + }, + async closeBundle(error) { + if (error) { + return; + } + await Promise.all(buildOptions.map(({ + chunk, + minify, + format = 'umd', + name, + sourcemap, + outDir, + fileName, + exports, + plugins + }) => { + return build({ + logLevel: 'silent', + configFile: false, + plugins, + build: { + outDir: outDir || originalOutDir, + emptyOutDir: false, + minify, + sourcemap, + lib: { + entry: join(originalOutDir, chunk), + name, + formats: [format], + fileName: fileName || ((format, entryName) => { + return `${entryName}.${format === 'es' ? 'mjs' : format === 'cjs' ? 'js' : `${format}.js`}`; + }) + }, + rollupOptions: { + output: { + exports + } + } + } + }); + })); + } + }; +} diff --git a/packages/vite-plugin-build-chunk/src/types.ts b/packages/vite-plugin-build-chunk/src/types.ts new file mode 100644 index 0000000..a188548 --- /dev/null +++ b/packages/vite-plugin-build-chunk/src/types.ts @@ -0,0 +1,83 @@ +import { ModuleFormat } from 'rollup'; +import type { LibraryFormats, PluginOption } from 'vite'; +import { LogLevel } from 'vp-runtime-helper'; + +export interface BuildOptions { + /** + * The chunk name. + * + * 构建的 chunk 名称。 + */ + chunk: string; + /** + * Global variable name. + * + * 全局变量名。 + */ + name: string; + /** + * The output format. + * + * 输出格式。 + */ + format?: LibraryFormats; + /** + * Whether to generate sourcemaps. + * + * 是否生成 sourcemap。 + */ + sourcemap?: boolean | 'inline' | 'hidden'; + /** + * The exports type. + * + * 导出类型。 + */ + exports?: 'default' | 'named' | 'none' | 'auto'; + /** + * Whether to minify the output. + * + * 是否压缩输出。 + */ + minify?: boolean | 'terser' | 'esbuild'; + /** + * The output directory. + * + * 输出目录。 + */ + outDir?: string; + /** + * The output file name. + * + * 输出文件名。 + */ + fileName?: string | ((format: ModuleFormat, entryName: string) => string); + /** + * The plugins to use. + * + * 使用的插件。 + */ + plugins?: PluginOption[]; +} + +export interface Options { + /** + * The build options. + * + * 构建选项。 + */ + build: BuildOptions | BuildOptions[]; + + /** + * The log level to use. + * + * 日志等级。 + */ + logLevel?: LogLevel; + + /** + * Whether to output the banner + * + * 是否输出 banner + */ + enableBanner?: boolean; +} diff --git a/packages/vite-plugin-build-chunk/tsconfig.build.json b/packages/vite-plugin-build-chunk/tsconfig.build.json new file mode 100644 index 0000000..cb2c71a --- /dev/null +++ b/packages/vite-plugin-build-chunk/tsconfig.build.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "declarationDir": "dist" + }, + "include": [ + "src", + "./node_modules/vite/client.d.ts" + ], + "exclude": [ + "dist" + ] +} \ No newline at end of file diff --git a/packages/vite-plugin-build-chunk/vite.config.mts b/packages/vite-plugin-build-chunk/vite.config.mts new file mode 100644 index 0000000..274656b --- /dev/null +++ b/packages/vite-plugin-build-chunk/vite.config.mts @@ -0,0 +1,29 @@ +import ts from '@rollup/plugin-typescript'; +import { defineConfig } from 'vite'; +import pluginExternal from 'vite-plugin-external'; + +import pkg from './package.json'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + pluginExternal({ + nodeBuiltins: true, + externalizeDeps: Object.keys(pkg.dependencies) + }), + ts({ + tsconfig: './tsconfig.build.json' + }) + ], + build: { + rollupOptions: { + external: ['vite'] + }, + lib: { + entry: 'src/index.ts', + formats: ['es', 'cjs'], + fileName: 'index' + }, + minify: false + } +}); diff --git a/packages/vite-plugin-cp/package.json b/packages/vite-plugin-cp/package.json index b973b8d..f35363e 100644 --- a/packages/vite-plugin-cp/package.json +++ b/packages/vite-plugin-cp/package.json @@ -1,6 +1,6 @@ { "name": "vite-plugin-cp", - "version": "6.0.2", + "version": "6.0.3", "description": "A powerful Vite plugin for copying files/directories with advanced transformation and renaming capabilities.", "types": "./dist/index.d.ts", "module": "./dist/index.mjs", diff --git a/packages/vite-plugin-cp/src/index.ts b/packages/vite-plugin-cp/src/index.ts index 7e8dd55..ea8bece 100644 --- a/packages/vite-plugin-cp/src/index.ts +++ b/packages/vite-plugin-cp/src/index.ts @@ -6,7 +6,7 @@ import { isObject } from 'is-what-type'; import type { GlobOptions } from 'tinyglobby'; import { glob } from 'tinyglobby'; import type { Plugin } from 'vite'; -import { banner, sleep, toAbsolutePath } from 'vp-runtime-helper'; +import { banner, displayTime, sleep, toAbsolutePath } from 'vp-runtime-helper'; import { logger, PLUGIN_NAME } from './logger'; import type { Options, Target } from './typings'; @@ -176,7 +176,7 @@ export default function pluginCp(opts: Options) { ); })); - logger.info(`Done in ${Number((Date.now() - startTime) / 1000).toFixed(1)}s`); + logger.info(`Done in ${displayTime(Date.now() - startTime)}`); }; return plugin; diff --git a/packages/vite-plugin-separate-importer/package.json b/packages/vite-plugin-separate-importer/package.json index de4cf42..501a178 100644 --- a/packages/vite-plugin-separate-importer/package.json +++ b/packages/vite-plugin-separate-importer/package.json @@ -1,6 +1,6 @@ { "name": "vite-plugin-separate-importer", - "version": "6.0.3", + "version": "6.0.4", "description": "Transform bulk imports from a single source module into individual file imports from the source module.", "types": "./dist/index.d.ts", "module": "./dist/index.mjs", diff --git a/packages/vite-plugin-separate-importer/src/index.ts b/packages/vite-plugin-separate-importer/src/index.ts index 6cc8d21..326816d 100644 --- a/packages/vite-plugin-separate-importer/src/index.ts +++ b/packages/vite-plugin-separate-importer/src/index.ts @@ -161,7 +161,7 @@ function processLibs( * @returns a vite plugin */ function pluginSeparateImporter( - { enforce, libs = [], logLevel }: Options = {} + { enforce, libs = [], logLevel, enableBanner }: Options = {} ): Plugin | undefined { if (!Array.isArray(libs) || libs.length === 0) { logger.warn('No libs specified.'); @@ -172,7 +172,9 @@ function pluginSeparateImporter( logger.level = logLevel; } - banner(PLUGIN_NAME); + if (enableBanner) { + banner(PLUGIN_NAME); + } const libMap: Record = {}; for (const lib of libs) { diff --git a/packages/vp-runtime-helper/package.json b/packages/vp-runtime-helper/package.json index ec4ab25..4f1a8c0 100644 --- a/packages/vp-runtime-helper/package.json +++ b/packages/vp-runtime-helper/package.json @@ -1,6 +1,6 @@ { "name": "vp-runtime-helper", - "version": "1.0.8", + "version": "1.0.9", "description": "Vite plugin runtime helper.", "types": "./dist/index.d.ts", "module": "./dist/index.mjs", @@ -39,7 +39,7 @@ "homepage": "https://fengxinming.github.io/vite-plugins/", "dependencies": { "@types/fs-extra": "^11.0.4", - "base-log-factory": "^2.1.1", + "base-log-factory": "^2.1.2", "blf-debug-appender": "^1.0.2", "figlet": "^1.8.0", "fs-extra": "^11.3.0", diff --git a/packages/vp-runtime-helper/src/index.ts b/packages/vp-runtime-helper/src/index.ts index b6d0432..e5936e2 100644 --- a/packages/vp-runtime-helper/src/index.ts +++ b/packages/vp-runtime-helper/src/index.ts @@ -34,5 +34,6 @@ export * from './generateStarter'; export * from './getValue'; export * from './hash'; export * from './logger'; +export * from './time'; export * from './version'; export type { LogLevel } from 'base-log-factory'; diff --git a/packages/vp-runtime-helper/src/time.ts b/packages/vp-runtime-helper/src/time.ts new file mode 100644 index 0000000..0676169 --- /dev/null +++ b/packages/vp-runtime-helper/src/time.ts @@ -0,0 +1,25 @@ +export function displayTime(time: number): string { + // display: {X}ms + if (time < 1000) { + return `${time}ms`; + } + + time = time / 1000; + + // display: {X}s + if (time < 60) { + return `${time.toFixed(2)}s`; + } + + // Calculate total minutes and remaining seconds + const mins = Math.floor(time / 60); + const seconds = Math.round(time % 60); + + // Handle case where seconds rounds to 60 + if (seconds === 60) { + return `${mins + 1}m`; + } + + // display: {X}m {Y}s + return `${mins}m${seconds < 1 ? '' : ` ${seconds}s`}`; +} diff --git a/packages/vp-runtime-helper/vite.config.mts b/packages/vp-runtime-helper/vite.config.mts index c3b184a..f8b7baa 100644 --- a/packages/vp-runtime-helper/vite.config.mts +++ b/packages/vp-runtime-helper/vite.config.mts @@ -3,9 +3,9 @@ import { builtinModules } from 'node:module'; import ts from '@rollup/plugin-typescript'; import { defineConfig } from 'vite'; -import pkg from './package.json'; +import { dependencies } from './package.json'; -const externals = Object.keys(pkg.dependencies) +const externals = Object.keys(dependencies) .concat(builtinModules, 'vite') .map((n) => new RegExp(`^${n}/?`)) .concat(/^node:/); diff --git a/release.mjs b/release.mjs new file mode 100644 index 0000000..a9d602e --- /dev/null +++ b/release.mjs @@ -0,0 +1,69 @@ +import { readdir, readFile } from 'node:fs/promises'; +import { EOL } from 'node:os'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { spawn } from 'cross-spawn'; +import { request } from 'undici'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const [,, packageName] = process.argv; + +async function getLatestVersion(pkgName) { + const { body } = await request(`https://registry.npmjs.org/${pkgName}`); + + const pkg = await body.json(); + if (pkg.error) { + console.error(`Package '${pkgName}' not found!`); + return null; + } + return pkg['dist-tags'].latest; +} + +function release(pkg) { + return new Promise((resolve, reject) => { + const { name } = pkg; + const tag = /\d+\.\d+\.\d+-([a-z]+)\.\d+/.exec(name); + const args = [ + 'publish', + '--filter', + packageName, + '--no-git-checks', + '--tag', + tag ? tag[1] : 'latest' + ]; + const child = spawn('pnpm', args); + let err = ''; + child.stderr.on('data', (data) => { + err += data; + }); + child.on('close', (code) => { + if (code === 0) { + console.info(`'${name}' released successfully!`); + resolve(); + } + else { + reject(new Error(`'${name}' release failed!${EOL}${err}`)); + } + }); + }); +} +async function run() { + const packagesDir = join(__dirname, 'packages'); + const fileList = await readdir(packagesDir); + await Promise.all(fileList.map((pkgName) => (async () => { + const latestVersion = await getLatestVersion(pkgName); + const pkg = JSON.parse(await readFile(join(packagesDir, pkgName, 'package.json'), 'utf-8')); + if (pkg.version !== latestVersion) { + return release(pkg); + } + + console.info(`'${pkgName}' is up to date!`); + })())); +} + +run().catch((err) => { + console.error(err); +}); From 19a3a790239ccffd895c844fb1d58c16c93abf92 Mon Sep 17 00:00:00 2001 From: "Jesse.Feng" Date: Sun, 20 Apr 2025 15:00:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?chore(cache):=20=E7=A7=BB=E9=99=A4cache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/cache/deps/_metadata.json | 31 - docs/.vitepress/cache/deps/chunk-QXP276DV.js | 12542 ---------------- .../cache/deps/chunk-QXP276DV.js.map | 7 - docs/.vitepress/cache/deps/package.json | 3 - .../deps/vitepress___@vue_devtools-api.js | 4504 ------ .../deps/vitepress___@vue_devtools-api.js.map | 7 - .../cache/deps/vitepress___@vueuse_core.js | 9731 ------------ .../deps/vitepress___@vueuse_core.js.map | 7 - docs/.vitepress/cache/deps/vue.js | 343 - docs/.vitepress/cache/deps/vue.js.map | 7 - 10 files changed, 27182 deletions(-) delete mode 100644 docs/.vitepress/cache/deps/_metadata.json delete mode 100644 docs/.vitepress/cache/deps/chunk-QXP276DV.js delete mode 100644 docs/.vitepress/cache/deps/chunk-QXP276DV.js.map delete mode 100644 docs/.vitepress/cache/deps/package.json delete mode 100644 docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js delete mode 100644 docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map delete mode 100644 docs/.vitepress/cache/deps/vitepress___@vueuse_core.js delete mode 100644 docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map delete mode 100644 docs/.vitepress/cache/deps/vue.js delete mode 100644 docs/.vitepress/cache/deps/vue.js.map diff --git a/docs/.vitepress/cache/deps/_metadata.json b/docs/.vitepress/cache/deps/_metadata.json deleted file mode 100644 index ff195d8..0000000 --- a/docs/.vitepress/cache/deps/_metadata.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "hash": "1d5fcace", - "configHash": "409d24f6", - "lockfileHash": "e3b0c442", - "browserHash": "a76c8d30", - "optimized": { - "vue": { - "src": "../../../../node_modules/.pnpm/vue@3.5.13_typescript@5.8.3/node_modules/vue/dist/vue.runtime.esm-bundler.js", - "file": "vue.js", - "fileHash": "e0f55a92", - "needsInterop": false - }, - "vitepress > @vue/devtools-api": { - "src": "../../../../node_modules/.pnpm/@vue+devtools-api@7.7.2/node_modules/@vue/devtools-api/dist/index.js", - "file": "vitepress___@vue_devtools-api.js", - "fileHash": "8515b001", - "needsInterop": false - }, - "vitepress > @vueuse/core": { - "src": "../../../../node_modules/.pnpm/@vueuse+core@12.8.2_typescript@5.8.3/node_modules/@vueuse/core/index.mjs", - "file": "vitepress___@vueuse_core.js", - "fileHash": "517406f8", - "needsInterop": false - } - }, - "chunks": { - "chunk-QXP276DV": { - "file": "chunk-QXP276DV.js" - } - } -} \ No newline at end of file diff --git a/docs/.vitepress/cache/deps/chunk-QXP276DV.js b/docs/.vitepress/cache/deps/chunk-QXP276DV.js deleted file mode 100644 index 40cf680..0000000 --- a/docs/.vitepress/cache/deps/chunk-QXP276DV.js +++ /dev/null @@ -1,12542 +0,0 @@ -// node_modules/.pnpm/@vue+shared@3.5.13/node_modules/@vue/shared/dist/shared.esm-bundler.js -function makeMap(str) { - const map2 = /* @__PURE__ */ Object.create(null); - for (const key of str.split(",")) map2[key] = 1; - return (val) => val in map2; -} -var EMPTY_OBJ = true ? Object.freeze({}) : {}; -var EMPTY_ARR = true ? Object.freeze([]) : []; -var NOOP = () => { -}; -var NO = () => false; -var isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter -(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); -var isModelListener = (key) => key.startsWith("onUpdate:"); -var extend = Object.assign; -var remove = (arr, el) => { - const i = arr.indexOf(el); - if (i > -1) { - arr.splice(i, 1); - } -}; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var hasOwn = (val, key) => hasOwnProperty.call(val, key); -var isArray = Array.isArray; -var isMap = (val) => toTypeString(val) === "[object Map]"; -var isSet = (val) => toTypeString(val) === "[object Set]"; -var isDate = (val) => toTypeString(val) === "[object Date]"; -var isRegExp = (val) => toTypeString(val) === "[object RegExp]"; -var isFunction = (val) => typeof val === "function"; -var isString = (val) => typeof val === "string"; -var isSymbol = (val) => typeof val === "symbol"; -var isObject = (val) => val !== null && typeof val === "object"; -var isPromise = (val) => { - return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); -}; -var objectToString = Object.prototype.toString; -var toTypeString = (value) => objectToString.call(value); -var toRawType = (value) => { - return toTypeString(value).slice(8, -1); -}; -var isPlainObject = (val) => toTypeString(val) === "[object Object]"; -var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; -var isReservedProp = makeMap( - // the leading comma is intentional so empty string "" is also included - ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" -); -var isBuiltInDirective = makeMap( - "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" -); -var cacheStringFunction = (fn) => { - const cache = /* @__PURE__ */ Object.create(null); - return (str) => { - const hit = cache[str]; - return hit || (cache[str] = fn(str)); - }; -}; -var camelizeRE = /-(\w)/g; -var camelize = cacheStringFunction( - (str) => { - return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); - } -); -var hyphenateRE = /\B([A-Z])/g; -var hyphenate = cacheStringFunction( - (str) => str.replace(hyphenateRE, "-$1").toLowerCase() -); -var capitalize = cacheStringFunction((str) => { - return str.charAt(0).toUpperCase() + str.slice(1); -}); -var toHandlerKey = cacheStringFunction( - (str) => { - const s = str ? `on${capitalize(str)}` : ``; - return s; - } -); -var hasChanged = (value, oldValue) => !Object.is(value, oldValue); -var invokeArrayFns = (fns, ...arg) => { - for (let i = 0; i < fns.length; i++) { - fns[i](...arg); - } -}; -var def = (obj, key, value, writable = false) => { - Object.defineProperty(obj, key, { - configurable: true, - enumerable: false, - writable, - value - }); -}; -var looseToNumber = (val) => { - const n = parseFloat(val); - return isNaN(n) ? val : n; -}; -var toNumber = (val) => { - const n = isString(val) ? Number(val) : NaN; - return isNaN(n) ? val : n; -}; -var _globalThis; -var getGlobalThis = () => { - return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); -}; -var GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol"; -var isGloballyAllowed = makeMap(GLOBALS_ALLOWED); -function normalizeStyle(value) { - if (isArray(value)) { - const res = {}; - for (let i = 0; i < value.length; i++) { - const item = value[i]; - const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); - if (normalized) { - for (const key in normalized) { - res[key] = normalized[key]; - } - } - } - return res; - } else if (isString(value) || isObject(value)) { - return value; - } -} -var listDelimiterRE = /;(?![^(]*\))/g; -var propertyDelimiterRE = /:([^]+)/; -var styleCommentRE = /\/\*[^]*?\*\//g; -function parseStringStyle(cssText) { - const ret = {}; - cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { - if (item) { - const tmp = item.split(propertyDelimiterRE); - tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); - } - }); - return ret; -} -function stringifyStyle(styles) { - if (!styles) return ""; - if (isString(styles)) return styles; - let ret = ""; - for (const key in styles) { - const value = styles[key]; - if (isString(value) || typeof value === "number") { - const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key); - ret += `${normalizedKey}:${value};`; - } - } - return ret; -} -function normalizeClass(value) { - let res = ""; - if (isString(value)) { - res = value; - } else if (isArray(value)) { - for (let i = 0; i < value.length; i++) { - const normalized = normalizeClass(value[i]); - if (normalized) { - res += normalized + " "; - } - } - } else if (isObject(value)) { - for (const name in value) { - if (value[name]) { - res += name + " "; - } - } - } - return res.trim(); -} -function normalizeProps(props) { - if (!props) return null; - let { class: klass, style } = props; - if (klass && !isString(klass)) { - props.class = normalizeClass(klass); - } - if (style) { - props.style = normalizeStyle(style); - } - return props; -} -var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; -var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; -var MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics"; -var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; -var isHTMLTag = makeMap(HTML_TAGS); -var isSVGTag = makeMap(SVG_TAGS); -var isMathMLTag = makeMap(MATH_TAGS); -var isVoidTag = makeMap(VOID_TAGS); -var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; -var isSpecialBooleanAttr = makeMap(specialBooleanAttrs); -var isBooleanAttr = makeMap( - specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected` -); -function includeBooleanAttr(value) { - return !!value || value === ""; -} -var isKnownHtmlAttr = makeMap( - `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap` -); -var isKnownSvgAttr = makeMap( - `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan` -); -var isKnownMathMLAttr = makeMap( - `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns` -); -function isRenderableAttrValue(value) { - if (value == null) { - return false; - } - const type = typeof value; - return type === "string" || type === "number" || type === "boolean"; -} -var cssVarNameEscapeSymbolsRE = /[ !"#$%&'()*+,./:;<=>?@[\\\]^`{|}~]/g; -function getEscapedCssVarName(key, doubleEscape) { - return key.replace( - cssVarNameEscapeSymbolsRE, - (s) => doubleEscape ? s === '"' ? '\\\\\\"' : `\\\\${s}` : `\\${s}` - ); -} -function looseCompareArrays(a, b) { - if (a.length !== b.length) return false; - let equal = true; - for (let i = 0; equal && i < a.length; i++) { - equal = looseEqual(a[i], b[i]); - } - return equal; -} -function looseEqual(a, b) { - if (a === b) return true; - let aValidType = isDate(a); - let bValidType = isDate(b); - if (aValidType || bValidType) { - return aValidType && bValidType ? a.getTime() === b.getTime() : false; - } - aValidType = isSymbol(a); - bValidType = isSymbol(b); - if (aValidType || bValidType) { - return a === b; - } - aValidType = isArray(a); - bValidType = isArray(b); - if (aValidType || bValidType) { - return aValidType && bValidType ? looseCompareArrays(a, b) : false; - } - aValidType = isObject(a); - bValidType = isObject(b); - if (aValidType || bValidType) { - if (!aValidType || !bValidType) { - return false; - } - const aKeysCount = Object.keys(a).length; - const bKeysCount = Object.keys(b).length; - if (aKeysCount !== bKeysCount) { - return false; - } - for (const key in a) { - const aHasKey = a.hasOwnProperty(key); - const bHasKey = b.hasOwnProperty(key); - if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { - return false; - } - } - } - return String(a) === String(b); -} -function looseIndexOf(arr, val) { - return arr.findIndex((item) => looseEqual(item, val)); -} -var isRef = (val) => { - return !!(val && val["__v_isRef"] === true); -}; -var toDisplayString = (val) => { - return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); -}; -var replacer = (_key, val) => { - if (isRef(val)) { - return replacer(_key, val.value); - } else if (isMap(val)) { - return { - [`Map(${val.size})`]: [...val.entries()].reduce( - (entries, [key, val2], i) => { - entries[stringifySymbol(key, i) + " =>"] = val2; - return entries; - }, - {} - ) - }; - } else if (isSet(val)) { - return { - [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) - }; - } else if (isSymbol(val)) { - return stringifySymbol(val); - } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { - return String(val); - } - return val; -}; -var stringifySymbol = (v, i = "") => { - var _a; - return ( - // Symbol.description in es2019+ so we need to cast here to pass - // the lib: es2016 check - isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v - ); -}; - -// node_modules/.pnpm/@vue+reactivity@3.5.13/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js -function warn(msg, ...args) { - console.warn(`[Vue warn] ${msg}`, ...args); -} -var activeEffectScope; -var EffectScope = class { - constructor(detached = false) { - this.detached = detached; - this._active = true; - this.effects = []; - this.cleanups = []; - this._isPaused = false; - this.parent = activeEffectScope; - if (!detached && activeEffectScope) { - this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( - this - ) - 1; - } - } - get active() { - return this._active; - } - pause() { - if (this._active) { - this._isPaused = true; - let i, l; - if (this.scopes) { - for (i = 0, l = this.scopes.length; i < l; i++) { - this.scopes[i].pause(); - } - } - for (i = 0, l = this.effects.length; i < l; i++) { - this.effects[i].pause(); - } - } - } - /** - * Resumes the effect scope, including all child scopes and effects. - */ - resume() { - if (this._active) { - if (this._isPaused) { - this._isPaused = false; - let i, l; - if (this.scopes) { - for (i = 0, l = this.scopes.length; i < l; i++) { - this.scopes[i].resume(); - } - } - for (i = 0, l = this.effects.length; i < l; i++) { - this.effects[i].resume(); - } - } - } - } - run(fn) { - if (this._active) { - const currentEffectScope = activeEffectScope; - try { - activeEffectScope = this; - return fn(); - } finally { - activeEffectScope = currentEffectScope; - } - } else if (true) { - warn(`cannot run an inactive effect scope.`); - } - } - /** - * This should only be called on non-detached scopes - * @internal - */ - on() { - activeEffectScope = this; - } - /** - * This should only be called on non-detached scopes - * @internal - */ - off() { - activeEffectScope = this.parent; - } - stop(fromParent) { - if (this._active) { - this._active = false; - let i, l; - for (i = 0, l = this.effects.length; i < l; i++) { - this.effects[i].stop(); - } - this.effects.length = 0; - for (i = 0, l = this.cleanups.length; i < l; i++) { - this.cleanups[i](); - } - this.cleanups.length = 0; - if (this.scopes) { - for (i = 0, l = this.scopes.length; i < l; i++) { - this.scopes[i].stop(true); - } - this.scopes.length = 0; - } - if (!this.detached && this.parent && !fromParent) { - const last = this.parent.scopes.pop(); - if (last && last !== this) { - this.parent.scopes[this.index] = last; - last.index = this.index; - } - } - this.parent = void 0; - } - } -}; -function effectScope(detached) { - return new EffectScope(detached); -} -function getCurrentScope() { - return activeEffectScope; -} -function onScopeDispose(fn, failSilently = false) { - if (activeEffectScope) { - activeEffectScope.cleanups.push(fn); - } else if (!failSilently) { - warn( - `onScopeDispose() is called when there is no active effect scope to be associated with.` - ); - } -} -var activeSub; -var pausedQueueEffects = /* @__PURE__ */ new WeakSet(); -var ReactiveEffect = class { - constructor(fn) { - this.fn = fn; - this.deps = void 0; - this.depsTail = void 0; - this.flags = 1 | 4; - this.next = void 0; - this.cleanup = void 0; - this.scheduler = void 0; - if (activeEffectScope && activeEffectScope.active) { - activeEffectScope.effects.push(this); - } - } - pause() { - this.flags |= 64; - } - resume() { - if (this.flags & 64) { - this.flags &= ~64; - if (pausedQueueEffects.has(this)) { - pausedQueueEffects.delete(this); - this.trigger(); - } - } - } - /** - * @internal - */ - notify() { - if (this.flags & 2 && !(this.flags & 32)) { - return; - } - if (!(this.flags & 8)) { - batch(this); - } - } - run() { - if (!(this.flags & 1)) { - return this.fn(); - } - this.flags |= 2; - cleanupEffect(this); - prepareDeps(this); - const prevEffect = activeSub; - const prevShouldTrack = shouldTrack; - activeSub = this; - shouldTrack = true; - try { - return this.fn(); - } finally { - if (activeSub !== this) { - warn( - "Active effect was not restored correctly - this is likely a Vue internal bug." - ); - } - cleanupDeps(this); - activeSub = prevEffect; - shouldTrack = prevShouldTrack; - this.flags &= ~2; - } - } - stop() { - if (this.flags & 1) { - for (let link = this.deps; link; link = link.nextDep) { - removeSub(link); - } - this.deps = this.depsTail = void 0; - cleanupEffect(this); - this.onStop && this.onStop(); - this.flags &= ~1; - } - } - trigger() { - if (this.flags & 64) { - pausedQueueEffects.add(this); - } else if (this.scheduler) { - this.scheduler(); - } else { - this.runIfDirty(); - } - } - /** - * @internal - */ - runIfDirty() { - if (isDirty(this)) { - this.run(); - } - } - get dirty() { - return isDirty(this); - } -}; -var batchDepth = 0; -var batchedSub; -var batchedComputed; -function batch(sub, isComputed = false) { - sub.flags |= 8; - if (isComputed) { - sub.next = batchedComputed; - batchedComputed = sub; - return; - } - sub.next = batchedSub; - batchedSub = sub; -} -function startBatch() { - batchDepth++; -} -function endBatch() { - if (--batchDepth > 0) { - return; - } - if (batchedComputed) { - let e = batchedComputed; - batchedComputed = void 0; - while (e) { - const next = e.next; - e.next = void 0; - e.flags &= ~8; - e = next; - } - } - let error; - while (batchedSub) { - let e = batchedSub; - batchedSub = void 0; - while (e) { - const next = e.next; - e.next = void 0; - e.flags &= ~8; - if (e.flags & 1) { - try { - ; - e.trigger(); - } catch (err) { - if (!error) error = err; - } - } - e = next; - } - } - if (error) throw error; -} -function prepareDeps(sub) { - for (let link = sub.deps; link; link = link.nextDep) { - link.version = -1; - link.prevActiveLink = link.dep.activeLink; - link.dep.activeLink = link; - } -} -function cleanupDeps(sub) { - let head; - let tail = sub.depsTail; - let link = tail; - while (link) { - const prev = link.prevDep; - if (link.version === -1) { - if (link === tail) tail = prev; - removeSub(link); - removeDep(link); - } else { - head = link; - } - link.dep.activeLink = link.prevActiveLink; - link.prevActiveLink = void 0; - link = prev; - } - sub.deps = head; - sub.depsTail = tail; -} -function isDirty(sub) { - for (let link = sub.deps; link; link = link.nextDep) { - if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) { - return true; - } - } - if (sub._dirty) { - return true; - } - return false; -} -function refreshComputed(computed3) { - if (computed3.flags & 4 && !(computed3.flags & 16)) { - return; - } - computed3.flags &= ~16; - if (computed3.globalVersion === globalVersion) { - return; - } - computed3.globalVersion = globalVersion; - const dep = computed3.dep; - computed3.flags |= 2; - if (dep.version > 0 && !computed3.isSSR && computed3.deps && !isDirty(computed3)) { - computed3.flags &= ~2; - return; - } - const prevSub = activeSub; - const prevShouldTrack = shouldTrack; - activeSub = computed3; - shouldTrack = true; - try { - prepareDeps(computed3); - const value = computed3.fn(computed3._value); - if (dep.version === 0 || hasChanged(value, computed3._value)) { - computed3._value = value; - dep.version++; - } - } catch (err) { - dep.version++; - throw err; - } finally { - activeSub = prevSub; - shouldTrack = prevShouldTrack; - cleanupDeps(computed3); - computed3.flags &= ~2; - } -} -function removeSub(link, soft = false) { - const { dep, prevSub, nextSub } = link; - if (prevSub) { - prevSub.nextSub = nextSub; - link.prevSub = void 0; - } - if (nextSub) { - nextSub.prevSub = prevSub; - link.nextSub = void 0; - } - if (dep.subsHead === link) { - dep.subsHead = nextSub; - } - if (dep.subs === link) { - dep.subs = prevSub; - if (!prevSub && dep.computed) { - dep.computed.flags &= ~4; - for (let l = dep.computed.deps; l; l = l.nextDep) { - removeSub(l, true); - } - } - } - if (!soft && !--dep.sc && dep.map) { - dep.map.delete(dep.key); - } -} -function removeDep(link) { - const { prevDep, nextDep } = link; - if (prevDep) { - prevDep.nextDep = nextDep; - link.prevDep = void 0; - } - if (nextDep) { - nextDep.prevDep = prevDep; - link.nextDep = void 0; - } -} -function effect(fn, options) { - if (fn.effect instanceof ReactiveEffect) { - fn = fn.effect.fn; - } - const e = new ReactiveEffect(fn); - if (options) { - extend(e, options); - } - try { - e.run(); - } catch (err) { - e.stop(); - throw err; - } - const runner = e.run.bind(e); - runner.effect = e; - return runner; -} -function stop(runner) { - runner.effect.stop(); -} -var shouldTrack = true; -var trackStack = []; -function pauseTracking() { - trackStack.push(shouldTrack); - shouldTrack = false; -} -function resetTracking() { - const last = trackStack.pop(); - shouldTrack = last === void 0 ? true : last; -} -function cleanupEffect(e) { - const { cleanup } = e; - e.cleanup = void 0; - if (cleanup) { - const prevSub = activeSub; - activeSub = void 0; - try { - cleanup(); - } finally { - activeSub = prevSub; - } - } -} -var globalVersion = 0; -var Link = class { - constructor(sub, dep) { - this.sub = sub; - this.dep = dep; - this.version = dep.version; - this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; - } -}; -var Dep = class { - constructor(computed3) { - this.computed = computed3; - this.version = 0; - this.activeLink = void 0; - this.subs = void 0; - this.map = void 0; - this.key = void 0; - this.sc = 0; - if (true) { - this.subsHead = void 0; - } - } - track(debugInfo) { - if (!activeSub || !shouldTrack || activeSub === this.computed) { - return; - } - let link = this.activeLink; - if (link === void 0 || link.sub !== activeSub) { - link = this.activeLink = new Link(activeSub, this); - if (!activeSub.deps) { - activeSub.deps = activeSub.depsTail = link; - } else { - link.prevDep = activeSub.depsTail; - activeSub.depsTail.nextDep = link; - activeSub.depsTail = link; - } - addSub(link); - } else if (link.version === -1) { - link.version = this.version; - if (link.nextDep) { - const next = link.nextDep; - next.prevDep = link.prevDep; - if (link.prevDep) { - link.prevDep.nextDep = next; - } - link.prevDep = activeSub.depsTail; - link.nextDep = void 0; - activeSub.depsTail.nextDep = link; - activeSub.depsTail = link; - if (activeSub.deps === link) { - activeSub.deps = next; - } - } - } - if (activeSub.onTrack) { - activeSub.onTrack( - extend( - { - effect: activeSub - }, - debugInfo - ) - ); - } - return link; - } - trigger(debugInfo) { - this.version++; - globalVersion++; - this.notify(debugInfo); - } - notify(debugInfo) { - startBatch(); - try { - if (true) { - for (let head = this.subsHead; head; head = head.nextSub) { - if (head.sub.onTrigger && !(head.sub.flags & 8)) { - head.sub.onTrigger( - extend( - { - effect: head.sub - }, - debugInfo - ) - ); - } - } - } - for (let link = this.subs; link; link = link.prevSub) { - if (link.sub.notify()) { - ; - link.sub.dep.notify(); - } - } - } finally { - endBatch(); - } - } -}; -function addSub(link) { - link.dep.sc++; - if (link.sub.flags & 4) { - const computed3 = link.dep.computed; - if (computed3 && !link.dep.subs) { - computed3.flags |= 4 | 16; - for (let l = computed3.deps; l; l = l.nextDep) { - addSub(l); - } - } - const currentTail = link.dep.subs; - if (currentTail !== link) { - link.prevSub = currentTail; - if (currentTail) currentTail.nextSub = link; - } - if (link.dep.subsHead === void 0) { - link.dep.subsHead = link; - } - link.dep.subs = link; - } -} -var targetMap = /* @__PURE__ */ new WeakMap(); -var ITERATE_KEY = Symbol( - true ? "Object iterate" : "" -); -var MAP_KEY_ITERATE_KEY = Symbol( - true ? "Map keys iterate" : "" -); -var ARRAY_ITERATE_KEY = Symbol( - true ? "Array iterate" : "" -); -function track(target, type, key) { - if (shouldTrack && activeSub) { - let depsMap = targetMap.get(target); - if (!depsMap) { - targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); - } - let dep = depsMap.get(key); - if (!dep) { - depsMap.set(key, dep = new Dep()); - dep.map = depsMap; - dep.key = key; - } - if (true) { - dep.track({ - target, - type, - key - }); - } else { - dep.track(); - } - } -} -function trigger(target, type, key, newValue, oldValue, oldTarget) { - const depsMap = targetMap.get(target); - if (!depsMap) { - globalVersion++; - return; - } - const run = (dep) => { - if (dep) { - if (true) { - dep.trigger({ - target, - type, - key, - newValue, - oldValue, - oldTarget - }); - } else { - dep.trigger(); - } - } - }; - startBatch(); - if (type === "clear") { - depsMap.forEach(run); - } else { - const targetIsArray = isArray(target); - const isArrayIndex = targetIsArray && isIntegerKey(key); - if (targetIsArray && key === "length") { - const newLength = Number(newValue); - depsMap.forEach((dep, key2) => { - if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) { - run(dep); - } - }); - } else { - if (key !== void 0 || depsMap.has(void 0)) { - run(depsMap.get(key)); - } - if (isArrayIndex) { - run(depsMap.get(ARRAY_ITERATE_KEY)); - } - switch (type) { - case "add": - if (!targetIsArray) { - run(depsMap.get(ITERATE_KEY)); - if (isMap(target)) { - run(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } else if (isArrayIndex) { - run(depsMap.get("length")); - } - break; - case "delete": - if (!targetIsArray) { - run(depsMap.get(ITERATE_KEY)); - if (isMap(target)) { - run(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } - break; - case "set": - if (isMap(target)) { - run(depsMap.get(ITERATE_KEY)); - } - break; - } - } - } - endBatch(); -} -function getDepFromReactive(object, key) { - const depMap = targetMap.get(object); - return depMap && depMap.get(key); -} -function reactiveReadArray(array) { - const raw = toRaw(array); - if (raw === array) return raw; - track(raw, "iterate", ARRAY_ITERATE_KEY); - return isShallow(array) ? raw : raw.map(toReactive); -} -function shallowReadArray(arr) { - track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY); - return arr; -} -var arrayInstrumentations = { - __proto__: null, - [Symbol.iterator]() { - return iterator(this, Symbol.iterator, toReactive); - }, - concat(...args) { - return reactiveReadArray(this).concat( - ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x) - ); - }, - entries() { - return iterator(this, "entries", (value) => { - value[1] = toReactive(value[1]); - return value; - }); - }, - every(fn, thisArg) { - return apply(this, "every", fn, thisArg, void 0, arguments); - }, - filter(fn, thisArg) { - return apply(this, "filter", fn, thisArg, (v) => v.map(toReactive), arguments); - }, - find(fn, thisArg) { - return apply(this, "find", fn, thisArg, toReactive, arguments); - }, - findIndex(fn, thisArg) { - return apply(this, "findIndex", fn, thisArg, void 0, arguments); - }, - findLast(fn, thisArg) { - return apply(this, "findLast", fn, thisArg, toReactive, arguments); - }, - findLastIndex(fn, thisArg) { - return apply(this, "findLastIndex", fn, thisArg, void 0, arguments); - }, - // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement - forEach(fn, thisArg) { - return apply(this, "forEach", fn, thisArg, void 0, arguments); - }, - includes(...args) { - return searchProxy(this, "includes", args); - }, - indexOf(...args) { - return searchProxy(this, "indexOf", args); - }, - join(separator) { - return reactiveReadArray(this).join(separator); - }, - // keys() iterator only reads `length`, no optimisation required - lastIndexOf(...args) { - return searchProxy(this, "lastIndexOf", args); - }, - map(fn, thisArg) { - return apply(this, "map", fn, thisArg, void 0, arguments); - }, - pop() { - return noTracking(this, "pop"); - }, - push(...args) { - return noTracking(this, "push", args); - }, - reduce(fn, ...args) { - return reduce(this, "reduce", fn, args); - }, - reduceRight(fn, ...args) { - return reduce(this, "reduceRight", fn, args); - }, - shift() { - return noTracking(this, "shift"); - }, - // slice could use ARRAY_ITERATE but also seems to beg for range tracking - some(fn, thisArg) { - return apply(this, "some", fn, thisArg, void 0, arguments); - }, - splice(...args) { - return noTracking(this, "splice", args); - }, - toReversed() { - return reactiveReadArray(this).toReversed(); - }, - toSorted(comparer) { - return reactiveReadArray(this).toSorted(comparer); - }, - toSpliced(...args) { - return reactiveReadArray(this).toSpliced(...args); - }, - unshift(...args) { - return noTracking(this, "unshift", args); - }, - values() { - return iterator(this, "values", toReactive); - } -}; -function iterator(self2, method, wrapValue) { - const arr = shallowReadArray(self2); - const iter = arr[method](); - if (arr !== self2 && !isShallow(self2)) { - iter._next = iter.next; - iter.next = () => { - const result = iter._next(); - if (result.value) { - result.value = wrapValue(result.value); - } - return result; - }; - } - return iter; -} -var arrayProto = Array.prototype; -function apply(self2, method, fn, thisArg, wrappedRetFn, args) { - const arr = shallowReadArray(self2); - const needsWrap = arr !== self2 && !isShallow(self2); - const methodFn = arr[method]; - if (methodFn !== arrayProto[method]) { - const result2 = methodFn.apply(self2, args); - return needsWrap ? toReactive(result2) : result2; - } - let wrappedFn = fn; - if (arr !== self2) { - if (needsWrap) { - wrappedFn = function(item, index) { - return fn.call(this, toReactive(item), index, self2); - }; - } else if (fn.length > 2) { - wrappedFn = function(item, index) { - return fn.call(this, item, index, self2); - }; - } - } - const result = methodFn.call(arr, wrappedFn, thisArg); - return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result; -} -function reduce(self2, method, fn, args) { - const arr = shallowReadArray(self2); - let wrappedFn = fn; - if (arr !== self2) { - if (!isShallow(self2)) { - wrappedFn = function(acc, item, index) { - return fn.call(this, acc, toReactive(item), index, self2); - }; - } else if (fn.length > 3) { - wrappedFn = function(acc, item, index) { - return fn.call(this, acc, item, index, self2); - }; - } - } - return arr[method](wrappedFn, ...args); -} -function searchProxy(self2, method, args) { - const arr = toRaw(self2); - track(arr, "iterate", ARRAY_ITERATE_KEY); - const res = arr[method](...args); - if ((res === -1 || res === false) && isProxy(args[0])) { - args[0] = toRaw(args[0]); - return arr[method](...args); - } - return res; -} -function noTracking(self2, method, args = []) { - pauseTracking(); - startBatch(); - const res = toRaw(self2)[method].apply(self2, args); - endBatch(); - resetTracking(); - return res; -} -var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`); -var builtInSymbols = new Set( - Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) -); -function hasOwnProperty2(key) { - if (!isSymbol(key)) key = String(key); - const obj = toRaw(this); - track(obj, "has", key); - return obj.hasOwnProperty(key); -} -var BaseReactiveHandler = class { - constructor(_isReadonly = false, _isShallow = false) { - this._isReadonly = _isReadonly; - this._isShallow = _isShallow; - } - get(target, key, receiver) { - if (key === "__v_skip") return target["__v_skip"]; - const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; - if (key === "__v_isReactive") { - return !isReadonly2; - } else if (key === "__v_isReadonly") { - return isReadonly2; - } else if (key === "__v_isShallow") { - return isShallow2; - } else if (key === "__v_raw") { - if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype - // this means the receiver is a user proxy of the reactive proxy - Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { - return target; - } - return; - } - const targetIsArray = isArray(target); - if (!isReadonly2) { - let fn; - if (targetIsArray && (fn = arrayInstrumentations[key])) { - return fn; - } - if (key === "hasOwnProperty") { - return hasOwnProperty2; - } - } - const res = Reflect.get( - target, - key, - // if this is a proxy wrapping a ref, return methods using the raw ref - // as receiver so that we don't have to call `toRaw` on the ref in all - // its class methods - isRef2(target) ? target : receiver - ); - if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { - return res; - } - if (!isReadonly2) { - track(target, "get", key); - } - if (isShallow2) { - return res; - } - if (isRef2(res)) { - return targetIsArray && isIntegerKey(key) ? res : res.value; - } - if (isObject(res)) { - return isReadonly2 ? readonly(res) : reactive(res); - } - return res; - } -}; -var MutableReactiveHandler = class extends BaseReactiveHandler { - constructor(isShallow2 = false) { - super(false, isShallow2); - } - set(target, key, value, receiver) { - let oldValue = target[key]; - if (!this._isShallow) { - const isOldValueReadonly = isReadonly(oldValue); - if (!isShallow(value) && !isReadonly(value)) { - oldValue = toRaw(oldValue); - value = toRaw(value); - } - if (!isArray(target) && isRef2(oldValue) && !isRef2(value)) { - if (isOldValueReadonly) { - return false; - } else { - oldValue.value = value; - return true; - } - } - } - const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); - const result = Reflect.set( - target, - key, - value, - isRef2(target) ? target : receiver - ); - if (target === toRaw(receiver)) { - if (!hadKey) { - trigger(target, "add", key, value); - } else if (hasChanged(value, oldValue)) { - trigger(target, "set", key, value, oldValue); - } - } - return result; - } - deleteProperty(target, key) { - const hadKey = hasOwn(target, key); - const oldValue = target[key]; - const result = Reflect.deleteProperty(target, key); - if (result && hadKey) { - trigger(target, "delete", key, void 0, oldValue); - } - return result; - } - has(target, key) { - const result = Reflect.has(target, key); - if (!isSymbol(key) || !builtInSymbols.has(key)) { - track(target, "has", key); - } - return result; - } - ownKeys(target) { - track( - target, - "iterate", - isArray(target) ? "length" : ITERATE_KEY - ); - return Reflect.ownKeys(target); - } -}; -var ReadonlyReactiveHandler = class extends BaseReactiveHandler { - constructor(isShallow2 = false) { - super(true, isShallow2); - } - set(target, key) { - if (true) { - warn( - `Set operation on key "${String(key)}" failed: target is readonly.`, - target - ); - } - return true; - } - deleteProperty(target, key) { - if (true) { - warn( - `Delete operation on key "${String(key)}" failed: target is readonly.`, - target - ); - } - return true; - } -}; -var mutableHandlers = new MutableReactiveHandler(); -var readonlyHandlers = new ReadonlyReactiveHandler(); -var shallowReactiveHandlers = new MutableReactiveHandler(true); -var shallowReadonlyHandlers = new ReadonlyReactiveHandler(true); -var toShallow = (value) => value; -var getProto = (v) => Reflect.getPrototypeOf(v); -function createIterableMethod(method, isReadonly2, isShallow2) { - return function(...args) { - const target = this["__v_raw"]; - const rawTarget = toRaw(target); - const targetIsMap = isMap(rawTarget); - const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; - const isKeyOnly = method === "keys" && targetIsMap; - const innerIterator = target[method](...args); - const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; - !isReadonly2 && track( - rawTarget, - "iterate", - isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY - ); - return { - // iterator protocol - next() { - const { value, done } = innerIterator.next(); - return done ? { value, done } : { - value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), - done - }; - }, - // iterable protocol - [Symbol.iterator]() { - return this; - } - }; - }; -} -function createReadonlyMethod(type) { - return function(...args) { - if (true) { - const key = args[0] ? `on key "${args[0]}" ` : ``; - warn( - `${capitalize(type)} operation ${key}failed: target is readonly.`, - toRaw(this) - ); - } - return type === "delete" ? false : type === "clear" ? void 0 : this; - }; -} -function createInstrumentations(readonly2, shallow) { - const instrumentations = { - get(key) { - const target = this["__v_raw"]; - const rawTarget = toRaw(target); - const rawKey = toRaw(key); - if (!readonly2) { - if (hasChanged(key, rawKey)) { - track(rawTarget, "get", key); - } - track(rawTarget, "get", rawKey); - } - const { has } = getProto(rawTarget); - const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; - if (has.call(rawTarget, key)) { - return wrap(target.get(key)); - } else if (has.call(rawTarget, rawKey)) { - return wrap(target.get(rawKey)); - } else if (target !== rawTarget) { - target.get(key); - } - }, - get size() { - const target = this["__v_raw"]; - !readonly2 && track(toRaw(target), "iterate", ITERATE_KEY); - return Reflect.get(target, "size", target); - }, - has(key) { - const target = this["__v_raw"]; - const rawTarget = toRaw(target); - const rawKey = toRaw(key); - if (!readonly2) { - if (hasChanged(key, rawKey)) { - track(rawTarget, "has", key); - } - track(rawTarget, "has", rawKey); - } - return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); - }, - forEach(callback, thisArg) { - const observed = this; - const target = observed["__v_raw"]; - const rawTarget = toRaw(target); - const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; - !readonly2 && track(rawTarget, "iterate", ITERATE_KEY); - return target.forEach((value, key) => { - return callback.call(thisArg, wrap(value), wrap(key), observed); - }); - } - }; - extend( - instrumentations, - readonly2 ? { - add: createReadonlyMethod("add"), - set: createReadonlyMethod("set"), - delete: createReadonlyMethod("delete"), - clear: createReadonlyMethod("clear") - } : { - add(value) { - if (!shallow && !isShallow(value) && !isReadonly(value)) { - value = toRaw(value); - } - const target = toRaw(this); - const proto = getProto(target); - const hadKey = proto.has.call(target, value); - if (!hadKey) { - target.add(value); - trigger(target, "add", value, value); - } - return this; - }, - set(key, value) { - if (!shallow && !isShallow(value) && !isReadonly(value)) { - value = toRaw(value); - } - const target = toRaw(this); - const { has, get } = getProto(target); - let hadKey = has.call(target, key); - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } else if (true) { - checkIdentityKeys(target, has, key); - } - const oldValue = get.call(target, key); - target.set(key, value); - if (!hadKey) { - trigger(target, "add", key, value); - } else if (hasChanged(value, oldValue)) { - trigger(target, "set", key, value, oldValue); - } - return this; - }, - delete(key) { - const target = toRaw(this); - const { has, get } = getProto(target); - let hadKey = has.call(target, key); - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } else if (true) { - checkIdentityKeys(target, has, key); - } - const oldValue = get ? get.call(target, key) : void 0; - const result = target.delete(key); - if (hadKey) { - trigger(target, "delete", key, void 0, oldValue); - } - return result; - }, - clear() { - const target = toRaw(this); - const hadItems = target.size !== 0; - const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0; - const result = target.clear(); - if (hadItems) { - trigger( - target, - "clear", - void 0, - void 0, - oldTarget - ); - } - return result; - } - } - ); - const iteratorMethods = [ - "keys", - "values", - "entries", - Symbol.iterator - ]; - iteratorMethods.forEach((method) => { - instrumentations[method] = createIterableMethod(method, readonly2, shallow); - }); - return instrumentations; -} -function createInstrumentationGetter(isReadonly2, shallow) { - const instrumentations = createInstrumentations(isReadonly2, shallow); - return (target, key, receiver) => { - if (key === "__v_isReactive") { - return !isReadonly2; - } else if (key === "__v_isReadonly") { - return isReadonly2; - } else if (key === "__v_raw") { - return target; - } - return Reflect.get( - hasOwn(instrumentations, key) && key in target ? instrumentations : target, - key, - receiver - ); - }; -} -var mutableCollectionHandlers = { - get: createInstrumentationGetter(false, false) -}; -var shallowCollectionHandlers = { - get: createInstrumentationGetter(false, true) -}; -var readonlyCollectionHandlers = { - get: createInstrumentationGetter(true, false) -}; -var shallowReadonlyCollectionHandlers = { - get: createInstrumentationGetter(true, true) -}; -function checkIdentityKeys(target, has, key) { - const rawKey = toRaw(key); - if (rawKey !== key && has.call(target, rawKey)) { - const type = toRawType(target); - warn( - `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` - ); - } -} -var reactiveMap = /* @__PURE__ */ new WeakMap(); -var shallowReactiveMap = /* @__PURE__ */ new WeakMap(); -var readonlyMap = /* @__PURE__ */ new WeakMap(); -var shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); -function targetTypeMap(rawType) { - switch (rawType) { - case "Object": - case "Array": - return 1; - case "Map": - case "Set": - case "WeakMap": - case "WeakSet": - return 2; - default: - return 0; - } -} -function getTargetType(value) { - return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); -} -function reactive(target) { - if (isReadonly(target)) { - return target; - } - return createReactiveObject( - target, - false, - mutableHandlers, - mutableCollectionHandlers, - reactiveMap - ); -} -function shallowReactive(target) { - return createReactiveObject( - target, - false, - shallowReactiveHandlers, - shallowCollectionHandlers, - shallowReactiveMap - ); -} -function readonly(target) { - return createReactiveObject( - target, - true, - readonlyHandlers, - readonlyCollectionHandlers, - readonlyMap - ); -} -function shallowReadonly(target) { - return createReactiveObject( - target, - true, - shallowReadonlyHandlers, - shallowReadonlyCollectionHandlers, - shallowReadonlyMap - ); -} -function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { - if (!isObject(target)) { - if (true) { - warn( - `value cannot be made ${isReadonly2 ? "readonly" : "reactive"}: ${String( - target - )}` - ); - } - return target; - } - if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { - return target; - } - const existingProxy = proxyMap.get(target); - if (existingProxy) { - return existingProxy; - } - const targetType = getTargetType(target); - if (targetType === 0) { - return target; - } - const proxy = new Proxy( - target, - targetType === 2 ? collectionHandlers : baseHandlers - ); - proxyMap.set(target, proxy); - return proxy; -} -function isReactive(value) { - if (isReadonly(value)) { - return isReactive(value["__v_raw"]); - } - return !!(value && value["__v_isReactive"]); -} -function isReadonly(value) { - return !!(value && value["__v_isReadonly"]); -} -function isShallow(value) { - return !!(value && value["__v_isShallow"]); -} -function isProxy(value) { - return value ? !!value["__v_raw"] : false; -} -function toRaw(observed) { - const raw = observed && observed["__v_raw"]; - return raw ? toRaw(raw) : observed; -} -function markRaw(value) { - if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) { - def(value, "__v_skip", true); - } - return value; -} -var toReactive = (value) => isObject(value) ? reactive(value) : value; -var toReadonly = (value) => isObject(value) ? readonly(value) : value; -function isRef2(r) { - return r ? r["__v_isRef"] === true : false; -} -function ref(value) { - return createRef(value, false); -} -function shallowRef(value) { - return createRef(value, true); -} -function createRef(rawValue, shallow) { - if (isRef2(rawValue)) { - return rawValue; - } - return new RefImpl(rawValue, shallow); -} -var RefImpl = class { - constructor(value, isShallow2) { - this.dep = new Dep(); - this["__v_isRef"] = true; - this["__v_isShallow"] = false; - this._rawValue = isShallow2 ? value : toRaw(value); - this._value = isShallow2 ? value : toReactive(value); - this["__v_isShallow"] = isShallow2; - } - get value() { - if (true) { - this.dep.track({ - target: this, - type: "get", - key: "value" - }); - } else { - this.dep.track(); - } - return this._value; - } - set value(newValue) { - const oldValue = this._rawValue; - const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue); - newValue = useDirectValue ? newValue : toRaw(newValue); - if (hasChanged(newValue, oldValue)) { - this._rawValue = newValue; - this._value = useDirectValue ? newValue : toReactive(newValue); - if (true) { - this.dep.trigger({ - target: this, - type: "set", - key: "value", - newValue, - oldValue - }); - } else { - this.dep.trigger(); - } - } - } -}; -function triggerRef(ref2) { - if (ref2.dep) { - if (true) { - ref2.dep.trigger({ - target: ref2, - type: "set", - key: "value", - newValue: ref2._value - }); - } else { - ref2.dep.trigger(); - } - } -} -function unref(ref2) { - return isRef2(ref2) ? ref2.value : ref2; -} -function toValue(source) { - return isFunction(source) ? source() : unref(source); -} -var shallowUnwrapHandlers = { - get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)), - set: (target, key, value, receiver) => { - const oldValue = target[key]; - if (isRef2(oldValue) && !isRef2(value)) { - oldValue.value = value; - return true; - } else { - return Reflect.set(target, key, value, receiver); - } - } -}; -function proxyRefs(objectWithRefs) { - return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); -} -var CustomRefImpl = class { - constructor(factory) { - this["__v_isRef"] = true; - this._value = void 0; - const dep = this.dep = new Dep(); - const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep)); - this._get = get; - this._set = set; - } - get value() { - return this._value = this._get(); - } - set value(newVal) { - this._set(newVal); - } -}; -function customRef(factory) { - return new CustomRefImpl(factory); -} -function toRefs(object) { - if (!isProxy(object)) { - warn(`toRefs() expects a reactive object but received a plain one.`); - } - const ret = isArray(object) ? new Array(object.length) : {}; - for (const key in object) { - ret[key] = propertyToRef(object, key); - } - return ret; -} -var ObjectRefImpl = class { - constructor(_object, _key, _defaultValue) { - this._object = _object; - this._key = _key; - this._defaultValue = _defaultValue; - this["__v_isRef"] = true; - this._value = void 0; - } - get value() { - const val = this._object[this._key]; - return this._value = val === void 0 ? this._defaultValue : val; - } - set value(newVal) { - this._object[this._key] = newVal; - } - get dep() { - return getDepFromReactive(toRaw(this._object), this._key); - } -}; -var GetterRefImpl = class { - constructor(_getter) { - this._getter = _getter; - this["__v_isRef"] = true; - this["__v_isReadonly"] = true; - this._value = void 0; - } - get value() { - return this._value = this._getter(); - } -}; -function toRef(source, key, defaultValue) { - if (isRef2(source)) { - return source; - } else if (isFunction(source)) { - return new GetterRefImpl(source); - } else if (isObject(source) && arguments.length > 1) { - return propertyToRef(source, key, defaultValue); - } else { - return ref(source); - } -} -function propertyToRef(source, key, defaultValue) { - const val = source[key]; - return isRef2(val) ? val : new ObjectRefImpl(source, key, defaultValue); -} -var ComputedRefImpl = class { - constructor(fn, setter, isSSR) { - this.fn = fn; - this.setter = setter; - this._value = void 0; - this.dep = new Dep(this); - this.__v_isRef = true; - this.deps = void 0; - this.depsTail = void 0; - this.flags = 16; - this.globalVersion = globalVersion - 1; - this.next = void 0; - this.effect = this; - this["__v_isReadonly"] = !setter; - this.isSSR = isSSR; - } - /** - * @internal - */ - notify() { - this.flags |= 16; - if (!(this.flags & 8) && // avoid infinite self recursion - activeSub !== this) { - batch(this, true); - return true; - } else if (true) ; - } - get value() { - const link = true ? this.dep.track({ - target: this, - type: "get", - key: "value" - }) : this.dep.track(); - refreshComputed(this); - if (link) { - link.version = this.dep.version; - } - return this._value; - } - set value(newValue) { - if (this.setter) { - this.setter(newValue); - } else if (true) { - warn("Write operation failed: computed value is readonly"); - } - } -}; -function computed(getterOrOptions, debugOptions, isSSR = false) { - let getter; - let setter; - if (isFunction(getterOrOptions)) { - getter = getterOrOptions; - } else { - getter = getterOrOptions.get; - setter = getterOrOptions.set; - } - const cRef = new ComputedRefImpl(getter, setter, isSSR); - if (debugOptions && !isSSR) { - cRef.onTrack = debugOptions.onTrack; - cRef.onTrigger = debugOptions.onTrigger; - } - return cRef; -} -var TrackOpTypes = { - "GET": "get", - "HAS": "has", - "ITERATE": "iterate" -}; -var TriggerOpTypes = { - "SET": "set", - "ADD": "add", - "DELETE": "delete", - "CLEAR": "clear" -}; -var INITIAL_WATCHER_VALUE = {}; -var cleanupMap = /* @__PURE__ */ new WeakMap(); -var activeWatcher = void 0; -function getCurrentWatcher() { - return activeWatcher; -} -function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) { - if (owner) { - let cleanups = cleanupMap.get(owner); - if (!cleanups) cleanupMap.set(owner, cleanups = []); - cleanups.push(cleanupFn); - } else if (!failSilently) { - warn( - `onWatcherCleanup() was called when there was no active watcher to associate with.` - ); - } -} -function watch(source, cb, options = EMPTY_OBJ) { - const { immediate, deep, once, scheduler, augmentJob, call } = options; - const warnInvalidSource = (s) => { - (options.onWarn || warn)( - `Invalid watch source: `, - s, - `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.` - ); - }; - const reactiveGetter = (source2) => { - if (deep) return source2; - if (isShallow(source2) || deep === false || deep === 0) - return traverse(source2, 1); - return traverse(source2); - }; - let effect2; - let getter; - let cleanup; - let boundCleanup; - let forceTrigger = false; - let isMultiSource = false; - if (isRef2(source)) { - getter = () => source.value; - forceTrigger = isShallow(source); - } else if (isReactive(source)) { - getter = () => reactiveGetter(source); - forceTrigger = true; - } else if (isArray(source)) { - isMultiSource = true; - forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); - getter = () => source.map((s) => { - if (isRef2(s)) { - return s.value; - } else if (isReactive(s)) { - return reactiveGetter(s); - } else if (isFunction(s)) { - return call ? call(s, 2) : s(); - } else { - warnInvalidSource(s); - } - }); - } else if (isFunction(source)) { - if (cb) { - getter = call ? () => call(source, 2) : source; - } else { - getter = () => { - if (cleanup) { - pauseTracking(); - try { - cleanup(); - } finally { - resetTracking(); - } - } - const currentEffect = activeWatcher; - activeWatcher = effect2; - try { - return call ? call(source, 3, [boundCleanup]) : source(boundCleanup); - } finally { - activeWatcher = currentEffect; - } - }; - } - } else { - getter = NOOP; - warnInvalidSource(source); - } - if (cb && deep) { - const baseGetter = getter; - const depth = deep === true ? Infinity : deep; - getter = () => traverse(baseGetter(), depth); - } - const scope = getCurrentScope(); - const watchHandle = () => { - effect2.stop(); - if (scope && scope.active) { - remove(scope.effects, effect2); - } - }; - if (once && cb) { - const _cb = cb; - cb = (...args) => { - _cb(...args); - watchHandle(); - }; - } - let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; - const job = (immediateFirstRun) => { - if (!(effect2.flags & 1) || !effect2.dirty && !immediateFirstRun) { - return; - } - if (cb) { - const newValue = effect2.run(); - if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) { - if (cleanup) { - cleanup(); - } - const currentWatcher = activeWatcher; - activeWatcher = effect2; - try { - const args = [ - newValue, - // pass undefined as the old value when it's changed for the first time - oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, - boundCleanup - ]; - call ? call(cb, 3, args) : ( - // @ts-expect-error - cb(...args) - ); - oldValue = newValue; - } finally { - activeWatcher = currentWatcher; - } - } - } else { - effect2.run(); - } - }; - if (augmentJob) { - augmentJob(job); - } - effect2 = new ReactiveEffect(getter); - effect2.scheduler = scheduler ? () => scheduler(job, false) : job; - boundCleanup = (fn) => onWatcherCleanup(fn, false, effect2); - cleanup = effect2.onStop = () => { - const cleanups = cleanupMap.get(effect2); - if (cleanups) { - if (call) { - call(cleanups, 4); - } else { - for (const cleanup2 of cleanups) cleanup2(); - } - cleanupMap.delete(effect2); - } - }; - if (true) { - effect2.onTrack = options.onTrack; - effect2.onTrigger = options.onTrigger; - } - if (cb) { - if (immediate) { - job(true); - } else { - oldValue = effect2.run(); - } - } else if (scheduler) { - scheduler(job.bind(null, true), true); - } else { - effect2.run(); - } - watchHandle.pause = effect2.pause.bind(effect2); - watchHandle.resume = effect2.resume.bind(effect2); - watchHandle.stop = watchHandle; - return watchHandle; -} -function traverse(value, depth = Infinity, seen) { - if (depth <= 0 || !isObject(value) || value["__v_skip"]) { - return value; - } - seen = seen || /* @__PURE__ */ new Set(); - if (seen.has(value)) { - return value; - } - seen.add(value); - depth--; - if (isRef2(value)) { - traverse(value.value, depth, seen); - } else if (isArray(value)) { - for (let i = 0; i < value.length; i++) { - traverse(value[i], depth, seen); - } - } else if (isSet(value) || isMap(value)) { - value.forEach((v) => { - traverse(v, depth, seen); - }); - } else if (isPlainObject(value)) { - for (const key in value) { - traverse(value[key], depth, seen); - } - for (const key of Object.getOwnPropertySymbols(value)) { - if (Object.prototype.propertyIsEnumerable.call(value, key)) { - traverse(value[key], depth, seen); - } - } - } - return value; -} - -// node_modules/.pnpm/@vue+runtime-core@3.5.13/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -var stack = []; -function pushWarningContext(vnode) { - stack.push(vnode); -} -function popWarningContext() { - stack.pop(); -} -var isWarning = false; -function warn$1(msg, ...args) { - if (isWarning) return; - isWarning = true; - pauseTracking(); - const instance = stack.length ? stack[stack.length - 1].component : null; - const appWarnHandler = instance && instance.appContext.config.warnHandler; - const trace = getComponentTrace(); - if (appWarnHandler) { - callWithErrorHandling( - appWarnHandler, - instance, - 11, - [ - // eslint-disable-next-line no-restricted-syntax - msg + args.map((a) => { - var _a, _b; - return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); - }).join(""), - instance && instance.proxy, - trace.map( - ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` - ).join("\n"), - trace - ] - ); - } else { - const warnArgs = [`[Vue warn]: ${msg}`, ...args]; - if (trace.length && // avoid spamming console during tests - true) { - warnArgs.push(` -`, ...formatTrace(trace)); - } - console.warn(...warnArgs); - } - resetTracking(); - isWarning = false; -} -function getComponentTrace() { - let currentVNode = stack[stack.length - 1]; - if (!currentVNode) { - return []; - } - const normalizedStack = []; - while (currentVNode) { - const last = normalizedStack[0]; - if (last && last.vnode === currentVNode) { - last.recurseCount++; - } else { - normalizedStack.push({ - vnode: currentVNode, - recurseCount: 0 - }); - } - const parentInstance = currentVNode.component && currentVNode.component.parent; - currentVNode = parentInstance && parentInstance.vnode; - } - return normalizedStack; -} -function formatTrace(trace) { - const logs = []; - trace.forEach((entry, i) => { - logs.push(...i === 0 ? [] : [` -`], ...formatTraceEntry(entry)); - }); - return logs; -} -function formatTraceEntry({ vnode, recurseCount }) { - const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; - const isRoot = vnode.component ? vnode.component.parent == null : false; - const open = ` at <${formatComponentName( - vnode.component, - vnode.type, - isRoot - )}`; - const close = `>` + postfix; - return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; -} -function formatProps(props) { - const res = []; - const keys = Object.keys(props); - keys.slice(0, 3).forEach((key) => { - res.push(...formatProp(key, props[key])); - }); - if (keys.length > 3) { - res.push(` ...`); - } - return res; -} -function formatProp(key, value, raw) { - if (isString(value)) { - value = JSON.stringify(value); - return raw ? value : [`${key}=${value}`]; - } else if (typeof value === "number" || typeof value === "boolean" || value == null) { - return raw ? value : [`${key}=${value}`]; - } else if (isRef2(value)) { - value = formatProp(key, toRaw(value.value), true); - return raw ? value : [`${key}=Ref<`, value, `>`]; - } else if (isFunction(value)) { - return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; - } else { - value = toRaw(value); - return raw ? value : [`${key}=`, value]; - } -} -function assertNumber(val, type) { - if (false) return; - if (val === void 0) { - return; - } else if (typeof val !== "number") { - warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`); - } else if (isNaN(val)) { - warn$1(`${type} is NaN - the duration expression might be incorrect.`); - } -} -var ErrorCodes = { - "SETUP_FUNCTION": 0, - "0": "SETUP_FUNCTION", - "RENDER_FUNCTION": 1, - "1": "RENDER_FUNCTION", - "NATIVE_EVENT_HANDLER": 5, - "5": "NATIVE_EVENT_HANDLER", - "COMPONENT_EVENT_HANDLER": 6, - "6": "COMPONENT_EVENT_HANDLER", - "VNODE_HOOK": 7, - "7": "VNODE_HOOK", - "DIRECTIVE_HOOK": 8, - "8": "DIRECTIVE_HOOK", - "TRANSITION_HOOK": 9, - "9": "TRANSITION_HOOK", - "APP_ERROR_HANDLER": 10, - "10": "APP_ERROR_HANDLER", - "APP_WARN_HANDLER": 11, - "11": "APP_WARN_HANDLER", - "FUNCTION_REF": 12, - "12": "FUNCTION_REF", - "ASYNC_COMPONENT_LOADER": 13, - "13": "ASYNC_COMPONENT_LOADER", - "SCHEDULER": 14, - "14": "SCHEDULER", - "COMPONENT_UPDATE": 15, - "15": "COMPONENT_UPDATE", - "APP_UNMOUNT_CLEANUP": 16, - "16": "APP_UNMOUNT_CLEANUP" -}; -var ErrorTypeStrings$1 = { - ["sp"]: "serverPrefetch hook", - ["bc"]: "beforeCreate hook", - ["c"]: "created hook", - ["bm"]: "beforeMount hook", - ["m"]: "mounted hook", - ["bu"]: "beforeUpdate hook", - ["u"]: "updated", - ["bum"]: "beforeUnmount hook", - ["um"]: "unmounted hook", - ["a"]: "activated hook", - ["da"]: "deactivated hook", - ["ec"]: "errorCaptured hook", - ["rtc"]: "renderTracked hook", - ["rtg"]: "renderTriggered hook", - [0]: "setup function", - [1]: "render function", - [2]: "watcher getter", - [3]: "watcher callback", - [4]: "watcher cleanup function", - [5]: "native event handler", - [6]: "component event handler", - [7]: "vnode hook", - [8]: "directive hook", - [9]: "transition hook", - [10]: "app errorHandler", - [11]: "app warnHandler", - [12]: "ref function", - [13]: "async component loader", - [14]: "scheduler flush", - [15]: "component update", - [16]: "app unmount cleanup function" -}; -function callWithErrorHandling(fn, instance, type, args) { - try { - return args ? fn(...args) : fn(); - } catch (err) { - handleError(err, instance, type); - } -} -function callWithAsyncErrorHandling(fn, instance, type, args) { - if (isFunction(fn)) { - const res = callWithErrorHandling(fn, instance, type, args); - if (res && isPromise(res)) { - res.catch((err) => { - handleError(err, instance, type); - }); - } - return res; - } - if (isArray(fn)) { - const values = []; - for (let i = 0; i < fn.length; i++) { - values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); - } - return values; - } else if (true) { - warn$1( - `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}` - ); - } -} -function handleError(err, instance, type, throwInDev = true) { - const contextVNode = instance ? instance.vnode : null; - const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ; - if (instance) { - let cur = instance.parent; - const exposedInstance = instance.proxy; - const errorInfo = true ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`; - while (cur) { - const errorCapturedHooks = cur.ec; - if (errorCapturedHooks) { - for (let i = 0; i < errorCapturedHooks.length; i++) { - if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { - return; - } - } - } - cur = cur.parent; - } - if (errorHandler) { - pauseTracking(); - callWithErrorHandling(errorHandler, null, 10, [ - err, - exposedInstance, - errorInfo - ]); - resetTracking(); - return; - } - } - logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction); -} -function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) { - if (true) { - const info = ErrorTypeStrings$1[type]; - if (contextVNode) { - pushWarningContext(contextVNode); - } - warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`); - if (contextVNode) { - popWarningContext(); - } - if (throwInDev) { - throw err; - } else { - console.error(err); - } - } else if (throwInProd) { - throw err; - } else { - console.error(err); - } -} -var queue = []; -var flushIndex = -1; -var pendingPostFlushCbs = []; -var activePostFlushCbs = null; -var postFlushIndex = 0; -var resolvedPromise = Promise.resolve(); -var currentFlushPromise = null; -var RECURSION_LIMIT = 100; -function nextTick(fn) { - const p2 = currentFlushPromise || resolvedPromise; - return fn ? p2.then(this ? fn.bind(this) : fn) : p2; -} -function findInsertionIndex(id) { - let start = flushIndex + 1; - let end = queue.length; - while (start < end) { - const middle = start + end >>> 1; - const middleJob = queue[middle]; - const middleJobId = getId(middleJob); - if (middleJobId < id || middleJobId === id && middleJob.flags & 2) { - start = middle + 1; - } else { - end = middle; - } - } - return start; -} -function queueJob(job) { - if (!(job.flags & 1)) { - const jobId = getId(job); - const lastJob = queue[queue.length - 1]; - if (!lastJob || // fast path when the job id is larger than the tail - !(job.flags & 2) && jobId >= getId(lastJob)) { - queue.push(job); - } else { - queue.splice(findInsertionIndex(jobId), 0, job); - } - job.flags |= 1; - queueFlush(); - } -} -function queueFlush() { - if (!currentFlushPromise) { - currentFlushPromise = resolvedPromise.then(flushJobs); - } -} -function queuePostFlushCb(cb) { - if (!isArray(cb)) { - if (activePostFlushCbs && cb.id === -1) { - activePostFlushCbs.splice(postFlushIndex + 1, 0, cb); - } else if (!(cb.flags & 1)) { - pendingPostFlushCbs.push(cb); - cb.flags |= 1; - } - } else { - pendingPostFlushCbs.push(...cb); - } - queueFlush(); -} -function flushPreFlushCbs(instance, seen, i = flushIndex + 1) { - if (true) { - seen = seen || /* @__PURE__ */ new Map(); - } - for (; i < queue.length; i++) { - const cb = queue[i]; - if (cb && cb.flags & 2) { - if (instance && cb.id !== instance.uid) { - continue; - } - if (checkRecursiveUpdates(seen, cb)) { - continue; - } - queue.splice(i, 1); - i--; - if (cb.flags & 4) { - cb.flags &= ~1; - } - cb(); - if (!(cb.flags & 4)) { - cb.flags &= ~1; - } - } - } -} -function flushPostFlushCbs(seen) { - if (pendingPostFlushCbs.length) { - const deduped = [...new Set(pendingPostFlushCbs)].sort( - (a, b) => getId(a) - getId(b) - ); - pendingPostFlushCbs.length = 0; - if (activePostFlushCbs) { - activePostFlushCbs.push(...deduped); - return; - } - activePostFlushCbs = deduped; - if (true) { - seen = seen || /* @__PURE__ */ new Map(); - } - for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { - const cb = activePostFlushCbs[postFlushIndex]; - if (checkRecursiveUpdates(seen, cb)) { - continue; - } - if (cb.flags & 4) { - cb.flags &= ~1; - } - if (!(cb.flags & 8)) cb(); - cb.flags &= ~1; - } - activePostFlushCbs = null; - postFlushIndex = 0; - } -} -var getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id; -function flushJobs(seen) { - if (true) { - seen = seen || /* @__PURE__ */ new Map(); - } - const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP; - try { - for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { - const job = queue[flushIndex]; - if (job && !(job.flags & 8)) { - if (check(job)) { - continue; - } - if (job.flags & 4) { - job.flags &= ~1; - } - callWithErrorHandling( - job, - job.i, - job.i ? 15 : 14 - ); - if (!(job.flags & 4)) { - job.flags &= ~1; - } - } - } - } finally { - for (; flushIndex < queue.length; flushIndex++) { - const job = queue[flushIndex]; - if (job) { - job.flags &= ~1; - } - } - flushIndex = -1; - queue.length = 0; - flushPostFlushCbs(seen); - currentFlushPromise = null; - if (queue.length || pendingPostFlushCbs.length) { - flushJobs(seen); - } - } -} -function checkRecursiveUpdates(seen, fn) { - const count = seen.get(fn) || 0; - if (count > RECURSION_LIMIT) { - const instance = fn.i; - const componentName = instance && getComponentName(instance.type); - handleError( - `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`, - null, - 10 - ); - return true; - } - seen.set(fn, count + 1); - return false; -} -var isHmrUpdating = false; -var hmrDirtyComponents = /* @__PURE__ */ new Map(); -if (true) { - getGlobalThis().__VUE_HMR_RUNTIME__ = { - createRecord: tryWrap(createRecord), - rerender: tryWrap(rerender), - reload: tryWrap(reload) - }; -} -var map = /* @__PURE__ */ new Map(); -function registerHMR(instance) { - const id = instance.type.__hmrId; - let record = map.get(id); - if (!record) { - createRecord(id, instance.type); - record = map.get(id); - } - record.instances.add(instance); -} -function unregisterHMR(instance) { - map.get(instance.type.__hmrId).instances.delete(instance); -} -function createRecord(id, initialDef) { - if (map.has(id)) { - return false; - } - map.set(id, { - initialDef: normalizeClassComponent(initialDef), - instances: /* @__PURE__ */ new Set() - }); - return true; -} -function normalizeClassComponent(component) { - return isClassComponent(component) ? component.__vccOpts : component; -} -function rerender(id, newRender) { - const record = map.get(id); - if (!record) { - return; - } - record.initialDef.render = newRender; - [...record.instances].forEach((instance) => { - if (newRender) { - instance.render = newRender; - normalizeClassComponent(instance.type).render = newRender; - } - instance.renderCache = []; - isHmrUpdating = true; - instance.update(); - isHmrUpdating = false; - }); -} -function reload(id, newComp) { - const record = map.get(id); - if (!record) return; - newComp = normalizeClassComponent(newComp); - updateComponentDef(record.initialDef, newComp); - const instances = [...record.instances]; - for (let i = 0; i < instances.length; i++) { - const instance = instances[i]; - const oldComp = normalizeClassComponent(instance.type); - let dirtyInstances = hmrDirtyComponents.get(oldComp); - if (!dirtyInstances) { - if (oldComp !== record.initialDef) { - updateComponentDef(oldComp, newComp); - } - hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set()); - } - dirtyInstances.add(instance); - instance.appContext.propsCache.delete(instance.type); - instance.appContext.emitsCache.delete(instance.type); - instance.appContext.optionsCache.delete(instance.type); - if (instance.ceReload) { - dirtyInstances.add(instance); - instance.ceReload(newComp.styles); - dirtyInstances.delete(instance); - } else if (instance.parent) { - queueJob(() => { - isHmrUpdating = true; - instance.parent.update(); - isHmrUpdating = false; - dirtyInstances.delete(instance); - }); - } else if (instance.appContext.reload) { - instance.appContext.reload(); - } else if (typeof window !== "undefined") { - window.location.reload(); - } else { - console.warn( - "[HMR] Root or manually mounted instance modified. Full reload required." - ); - } - if (instance.root.ce && instance !== instance.root) { - instance.root.ce._removeChildStyle(oldComp); - } - } - queuePostFlushCb(() => { - hmrDirtyComponents.clear(); - }); -} -function updateComponentDef(oldComp, newComp) { - extend(oldComp, newComp); - for (const key in oldComp) { - if (key !== "__file" && !(key in newComp)) { - delete oldComp[key]; - } - } -} -function tryWrap(fn) { - return (id, arg) => { - try { - return fn(id, arg); - } catch (e) { - console.error(e); - console.warn( - `[HMR] Something went wrong during Vue component hot-reload. Full reload required.` - ); - } - }; -} -var devtools$1; -var buffer = []; -var devtoolsNotInstalled = false; -function emit$1(event, ...args) { - if (devtools$1) { - devtools$1.emit(event, ...args); - } else if (!devtoolsNotInstalled) { - buffer.push({ event, args }); - } -} -function setDevtoolsHook$1(hook, target) { - var _a, _b; - devtools$1 = hook; - if (devtools$1) { - devtools$1.enabled = true; - buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args)); - buffer = []; - } else if ( - // handle late devtools injection - only do this if we are in an actual - // browser environment to avoid the timer handle stalling test runner exit - // (#4815) - typeof window !== "undefined" && // some envs mock window but not fully - window.HTMLElement && // also exclude jsdom - // eslint-disable-next-line no-restricted-syntax - !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) - ) { - const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; - replay.push((newHook) => { - setDevtoolsHook$1(newHook, target); - }); - setTimeout(() => { - if (!devtools$1) { - target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; - devtoolsNotInstalled = true; - buffer = []; - } - }, 3e3); - } else { - devtoolsNotInstalled = true; - buffer = []; - } -} -function devtoolsInitApp(app, version2) { - emit$1("app:init", app, version2, { - Fragment, - Text, - Comment, - Static - }); -} -function devtoolsUnmountApp(app) { - emit$1("app:unmount", app); -} -var devtoolsComponentAdded = createDevtoolsComponentHook( - "component:added" - /* COMPONENT_ADDED */ -); -var devtoolsComponentUpdated = createDevtoolsComponentHook( - "component:updated" - /* COMPONENT_UPDATED */ -); -var _devtoolsComponentRemoved = createDevtoolsComponentHook( - "component:removed" - /* COMPONENT_REMOVED */ -); -var devtoolsComponentRemoved = (component) => { - if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered - !devtools$1.cleanupBuffer(component)) { - _devtoolsComponentRemoved(component); - } -}; -function createDevtoolsComponentHook(hook) { - return (component) => { - emit$1( - hook, - component.appContext.app, - component.uid, - component.parent ? component.parent.uid : void 0, - component - ); - }; -} -var devtoolsPerfStart = createDevtoolsPerformanceHook( - "perf:start" - /* PERFORMANCE_START */ -); -var devtoolsPerfEnd = createDevtoolsPerformanceHook( - "perf:end" - /* PERFORMANCE_END */ -); -function createDevtoolsPerformanceHook(hook) { - return (component, type, time) => { - emit$1(hook, component.appContext.app, component.uid, component, type, time); - }; -} -function devtoolsComponentEmit(component, event, params) { - emit$1( - "component:emit", - component.appContext.app, - component, - event, - params - ); -} -var currentRenderingInstance = null; -var currentScopeId = null; -function setCurrentRenderingInstance(instance) { - const prev = currentRenderingInstance; - currentRenderingInstance = instance; - currentScopeId = instance && instance.type.__scopeId || null; - return prev; -} -function pushScopeId(id) { - currentScopeId = id; -} -function popScopeId() { - currentScopeId = null; -} -var withScopeId = (_id) => withCtx; -function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { - if (!ctx) return fn; - if (fn._n) { - return fn; - } - const renderFnWithContext = (...args) => { - if (renderFnWithContext._d) { - setBlockTracking(-1); - } - const prevInstance = setCurrentRenderingInstance(ctx); - let res; - try { - res = fn(...args); - } finally { - setCurrentRenderingInstance(prevInstance); - if (renderFnWithContext._d) { - setBlockTracking(1); - } - } - if (true) { - devtoolsComponentUpdated(ctx); - } - return res; - }; - renderFnWithContext._n = true; - renderFnWithContext._c = true; - renderFnWithContext._d = true; - return renderFnWithContext; -} -function validateDirectiveName(name) { - if (isBuiltInDirective(name)) { - warn$1("Do not use built-in directive ids as custom directive id: " + name); - } -} -function withDirectives(vnode, directives) { - if (currentRenderingInstance === null) { - warn$1(`withDirectives can only be used inside render functions.`); - return vnode; - } - const instance = getComponentPublicInstance(currentRenderingInstance); - const bindings = vnode.dirs || (vnode.dirs = []); - for (let i = 0; i < directives.length; i++) { - let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; - if (dir) { - if (isFunction(dir)) { - dir = { - mounted: dir, - updated: dir - }; - } - if (dir.deep) { - traverse(value); - } - bindings.push({ - dir, - instance, - value, - oldValue: void 0, - arg, - modifiers - }); - } - } - return vnode; -} -function invokeDirectiveHook(vnode, prevVNode, instance, name) { - const bindings = vnode.dirs; - const oldBindings = prevVNode && prevVNode.dirs; - for (let i = 0; i < bindings.length; i++) { - const binding = bindings[i]; - if (oldBindings) { - binding.oldValue = oldBindings[i].value; - } - let hook = binding.dir[name]; - if (hook) { - pauseTracking(); - callWithAsyncErrorHandling(hook, instance, 8, [ - vnode.el, - binding, - vnode, - prevVNode - ]); - resetTracking(); - } - } -} -var TeleportEndKey = Symbol("_vte"); -var isTeleport = (type) => type.__isTeleport; -var isTeleportDisabled = (props) => props && (props.disabled || props.disabled === ""); -var isTeleportDeferred = (props) => props && (props.defer || props.defer === ""); -var isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement; -var isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement; -var resolveTarget = (props, select) => { - const targetSelector = props && props.to; - if (isString(targetSelector)) { - if (!select) { - warn$1( - `Current renderer does not support string target for Teleports. (missing querySelector renderer option)` - ); - return null; - } else { - const target = select(targetSelector); - if (!target && !isTeleportDisabled(props)) { - warn$1( - `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.` - ); - } - return target; - } - } else { - if (!targetSelector && !isTeleportDisabled(props)) { - warn$1(`Invalid Teleport target: ${targetSelector}`); - } - return targetSelector; - } -}; -var TeleportImpl = { - name: "Teleport", - __isTeleport: true, - process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) { - const { - mc: mountChildren, - pc: patchChildren, - pbc: patchBlockChildren, - o: { insert, querySelector, createText, createComment } - } = internals; - const disabled = isTeleportDisabled(n2.props); - let { shapeFlag, children, dynamicChildren } = n2; - if (isHmrUpdating) { - optimized = false; - dynamicChildren = null; - } - if (n1 == null) { - const placeholder = n2.el = true ? createComment("teleport start") : createText(""); - const mainAnchor = n2.anchor = true ? createComment("teleport end") : createText(""); - insert(placeholder, container, anchor); - insert(mainAnchor, container, anchor); - const mount = (container2, anchor2) => { - if (shapeFlag & 16) { - if (parentComponent && parentComponent.isCE) { - parentComponent.ce._teleportTarget = container2; - } - mountChildren( - children, - container2, - anchor2, - parentComponent, - parentSuspense, - namespace, - slotScopeIds, - optimized - ); - } - }; - const mountToTarget = () => { - const target = n2.target = resolveTarget(n2.props, querySelector); - const targetAnchor = prepareAnchor(target, n2, createText, insert); - if (target) { - if (namespace !== "svg" && isTargetSVG(target)) { - namespace = "svg"; - } else if (namespace !== "mathml" && isTargetMathML(target)) { - namespace = "mathml"; - } - if (!disabled) { - mount(target, targetAnchor); - updateCssVars(n2, false); - } - } else if (!disabled) { - warn$1( - "Invalid Teleport target on mount:", - target, - `(${typeof target})` - ); - } - }; - if (disabled) { - mount(container, mainAnchor); - updateCssVars(n2, true); - } - if (isTeleportDeferred(n2.props)) { - queuePostRenderEffect(() => { - mountToTarget(); - n2.el.__isMounted = true; - }, parentSuspense); - } else { - mountToTarget(); - } - } else { - if (isTeleportDeferred(n2.props) && !n1.el.__isMounted) { - queuePostRenderEffect(() => { - TeleportImpl.process( - n1, - n2, - container, - anchor, - parentComponent, - parentSuspense, - namespace, - slotScopeIds, - optimized, - internals - ); - delete n1.el.__isMounted; - }, parentSuspense); - return; - } - n2.el = n1.el; - n2.targetStart = n1.targetStart; - const mainAnchor = n2.anchor = n1.anchor; - const target = n2.target = n1.target; - const targetAnchor = n2.targetAnchor = n1.targetAnchor; - const wasDisabled = isTeleportDisabled(n1.props); - const currentContainer = wasDisabled ? container : target; - const currentAnchor = wasDisabled ? mainAnchor : targetAnchor; - if (namespace === "svg" || isTargetSVG(target)) { - namespace = "svg"; - } else if (namespace === "mathml" || isTargetMathML(target)) { - namespace = "mathml"; - } - if (dynamicChildren) { - patchBlockChildren( - n1.dynamicChildren, - dynamicChildren, - currentContainer, - parentComponent, - parentSuspense, - namespace, - slotScopeIds - ); - traverseStaticChildren(n1, n2, true); - } else if (!optimized) { - patchChildren( - n1, - n2, - currentContainer, - currentAnchor, - parentComponent, - parentSuspense, - namespace, - slotScopeIds, - false - ); - } - if (disabled) { - if (!wasDisabled) { - moveTeleport( - n2, - container, - mainAnchor, - internals, - 1 - ); - } else { - if (n2.props && n1.props && n2.props.to !== n1.props.to) { - n2.props.to = n1.props.to; - } - } - } else { - if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) { - const nextTarget = n2.target = resolveTarget( - n2.props, - querySelector - ); - if (nextTarget) { - moveTeleport( - n2, - nextTarget, - null, - internals, - 0 - ); - } else if (true) { - warn$1( - "Invalid Teleport target on update:", - target, - `(${typeof target})` - ); - } - } else if (wasDisabled) { - moveTeleport( - n2, - target, - targetAnchor, - internals, - 1 - ); - } - } - updateCssVars(n2, disabled); - } - }, - remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) { - const { - shapeFlag, - children, - anchor, - targetStart, - targetAnchor, - target, - props - } = vnode; - if (target) { - hostRemove(targetStart); - hostRemove(targetAnchor); - } - doRemove && hostRemove(anchor); - if (shapeFlag & 16) { - const shouldRemove = doRemove || !isTeleportDisabled(props); - for (let i = 0; i < children.length; i++) { - const child = children[i]; - unmount( - child, - parentComponent, - parentSuspense, - shouldRemove, - !!child.dynamicChildren - ); - } - } - }, - move: moveTeleport, - hydrate: hydrateTeleport -}; -function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) { - if (moveType === 0) { - insert(vnode.targetAnchor, container, parentAnchor); - } - const { el, anchor, shapeFlag, children, props } = vnode; - const isReorder = moveType === 2; - if (isReorder) { - insert(el, container, parentAnchor); - } - if (!isReorder || isTeleportDisabled(props)) { - if (shapeFlag & 16) { - for (let i = 0; i < children.length; i++) { - move( - children[i], - container, - parentAnchor, - 2 - ); - } - } - } - if (isReorder) { - insert(anchor, container, parentAnchor); - } -} -function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, { - o: { nextSibling, parentNode, querySelector, insert, createText } -}, hydrateChildren) { - const target = vnode.target = resolveTarget( - vnode.props, - querySelector - ); - if (target) { - const disabled = isTeleportDisabled(vnode.props); - const targetNode = target._lpa || target.firstChild; - if (vnode.shapeFlag & 16) { - if (disabled) { - vnode.anchor = hydrateChildren( - nextSibling(node), - vnode, - parentNode(node), - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - vnode.targetStart = targetNode; - vnode.targetAnchor = targetNode && nextSibling(targetNode); - } else { - vnode.anchor = nextSibling(node); - let targetAnchor = targetNode; - while (targetAnchor) { - if (targetAnchor && targetAnchor.nodeType === 8) { - if (targetAnchor.data === "teleport start anchor") { - vnode.targetStart = targetAnchor; - } else if (targetAnchor.data === "teleport anchor") { - vnode.targetAnchor = targetAnchor; - target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor); - break; - } - } - targetAnchor = nextSibling(targetAnchor); - } - if (!vnode.targetAnchor) { - prepareAnchor(target, vnode, createText, insert); - } - hydrateChildren( - targetNode && nextSibling(targetNode), - vnode, - target, - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - } - } - updateCssVars(vnode, disabled); - } - return vnode.anchor && nextSibling(vnode.anchor); -} -var Teleport = TeleportImpl; -function updateCssVars(vnode, isDisabled) { - const ctx = vnode.ctx; - if (ctx && ctx.ut) { - let node, anchor; - if (isDisabled) { - node = vnode.el; - anchor = vnode.anchor; - } else { - node = vnode.targetStart; - anchor = vnode.targetAnchor; - } - while (node && node !== anchor) { - if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid); - node = node.nextSibling; - } - ctx.ut(); - } -} -function prepareAnchor(target, vnode, createText, insert) { - const targetStart = vnode.targetStart = createText(""); - const targetAnchor = vnode.targetAnchor = createText(""); - targetStart[TeleportEndKey] = targetAnchor; - if (target) { - insert(targetStart, target); - insert(targetAnchor, target); - } - return targetAnchor; -} -var leaveCbKey = Symbol("_leaveCb"); -var enterCbKey = Symbol("_enterCb"); -function useTransitionState() { - const state = { - isMounted: false, - isLeaving: false, - isUnmounting: false, - leavingVNodes: /* @__PURE__ */ new Map() - }; - onMounted(() => { - state.isMounted = true; - }); - onBeforeUnmount(() => { - state.isUnmounting = true; - }); - return state; -} -var TransitionHookValidator = [Function, Array]; -var BaseTransitionPropsValidators = { - mode: String, - appear: Boolean, - persisted: Boolean, - // enter - onBeforeEnter: TransitionHookValidator, - onEnter: TransitionHookValidator, - onAfterEnter: TransitionHookValidator, - onEnterCancelled: TransitionHookValidator, - // leave - onBeforeLeave: TransitionHookValidator, - onLeave: TransitionHookValidator, - onAfterLeave: TransitionHookValidator, - onLeaveCancelled: TransitionHookValidator, - // appear - onBeforeAppear: TransitionHookValidator, - onAppear: TransitionHookValidator, - onAfterAppear: TransitionHookValidator, - onAppearCancelled: TransitionHookValidator -}; -var recursiveGetSubtree = (instance) => { - const subTree = instance.subTree; - return subTree.component ? recursiveGetSubtree(subTree.component) : subTree; -}; -var BaseTransitionImpl = { - name: `BaseTransition`, - props: BaseTransitionPropsValidators, - setup(props, { slots }) { - const instance = getCurrentInstance(); - const state = useTransitionState(); - return () => { - const children = slots.default && getTransitionRawChildren(slots.default(), true); - if (!children || !children.length) { - return; - } - const child = findNonCommentChild(children); - const rawProps = toRaw(props); - const { mode } = rawProps; - if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") { - warn$1(`invalid mode: ${mode}`); - } - if (state.isLeaving) { - return emptyPlaceholder(child); - } - const innerChild = getInnerChild$1(child); - if (!innerChild) { - return emptyPlaceholder(child); - } - let enterHooks = resolveTransitionHooks( - innerChild, - rawProps, - state, - instance, - // #11061, ensure enterHooks is fresh after clone - (hooks) => enterHooks = hooks - ); - if (innerChild.type !== Comment) { - setTransitionHooks(innerChild, enterHooks); - } - let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree); - if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) { - let leavingHooks = resolveTransitionHooks( - oldInnerChild, - rawProps, - state, - instance - ); - setTransitionHooks(oldInnerChild, leavingHooks); - if (mode === "out-in" && innerChild.type !== Comment) { - state.isLeaving = true; - leavingHooks.afterLeave = () => { - state.isLeaving = false; - if (!(instance.job.flags & 8)) { - instance.update(); - } - delete leavingHooks.afterLeave; - oldInnerChild = void 0; - }; - return emptyPlaceholder(child); - } else if (mode === "in-out" && innerChild.type !== Comment) { - leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { - const leavingVNodesCache = getLeavingNodesForType( - state, - oldInnerChild - ); - leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; - el[leaveCbKey] = () => { - earlyRemove(); - el[leaveCbKey] = void 0; - delete enterHooks.delayedLeave; - oldInnerChild = void 0; - }; - enterHooks.delayedLeave = () => { - delayedLeave(); - delete enterHooks.delayedLeave; - oldInnerChild = void 0; - }; - }; - } else { - oldInnerChild = void 0; - } - } else if (oldInnerChild) { - oldInnerChild = void 0; - } - return child; - }; - } -}; -function findNonCommentChild(children) { - let child = children[0]; - if (children.length > 1) { - let hasFound = false; - for (const c of children) { - if (c.type !== Comment) { - if (hasFound) { - warn$1( - " can only be used on a single element or component. Use for lists." - ); - break; - } - child = c; - hasFound = true; - if (false) break; - } - } - } - return child; -} -var BaseTransition = BaseTransitionImpl; -function getLeavingNodesForType(state, vnode) { - const { leavingVNodes } = state; - let leavingVNodesCache = leavingVNodes.get(vnode.type); - if (!leavingVNodesCache) { - leavingVNodesCache = /* @__PURE__ */ Object.create(null); - leavingVNodes.set(vnode.type, leavingVNodesCache); - } - return leavingVNodesCache; -} -function resolveTransitionHooks(vnode, props, state, instance, postClone) { - const { - appear, - mode, - persisted = false, - onBeforeEnter, - onEnter, - onAfterEnter, - onEnterCancelled, - onBeforeLeave, - onLeave, - onAfterLeave, - onLeaveCancelled, - onBeforeAppear, - onAppear, - onAfterAppear, - onAppearCancelled - } = props; - const key = String(vnode.key); - const leavingVNodesCache = getLeavingNodesForType(state, vnode); - const callHook3 = (hook, args) => { - hook && callWithAsyncErrorHandling( - hook, - instance, - 9, - args - ); - }; - const callAsyncHook = (hook, args) => { - const done = args[1]; - callHook3(hook, args); - if (isArray(hook)) { - if (hook.every((hook2) => hook2.length <= 1)) done(); - } else if (hook.length <= 1) { - done(); - } - }; - const hooks = { - mode, - persisted, - beforeEnter(el) { - let hook = onBeforeEnter; - if (!state.isMounted) { - if (appear) { - hook = onBeforeAppear || onBeforeEnter; - } else { - return; - } - } - if (el[leaveCbKey]) { - el[leaveCbKey]( - true - /* cancelled */ - ); - } - const leavingVNode = leavingVNodesCache[key]; - if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { - leavingVNode.el[leaveCbKey](); - } - callHook3(hook, [el]); - }, - enter(el) { - let hook = onEnter; - let afterHook = onAfterEnter; - let cancelHook = onEnterCancelled; - if (!state.isMounted) { - if (appear) { - hook = onAppear || onEnter; - afterHook = onAfterAppear || onAfterEnter; - cancelHook = onAppearCancelled || onEnterCancelled; - } else { - return; - } - } - let called = false; - const done = el[enterCbKey] = (cancelled) => { - if (called) return; - called = true; - if (cancelled) { - callHook3(cancelHook, [el]); - } else { - callHook3(afterHook, [el]); - } - if (hooks.delayedLeave) { - hooks.delayedLeave(); - } - el[enterCbKey] = void 0; - }; - if (hook) { - callAsyncHook(hook, [el, done]); - } else { - done(); - } - }, - leave(el, remove2) { - const key2 = String(vnode.key); - if (el[enterCbKey]) { - el[enterCbKey]( - true - /* cancelled */ - ); - } - if (state.isUnmounting) { - return remove2(); - } - callHook3(onBeforeLeave, [el]); - let called = false; - const done = el[leaveCbKey] = (cancelled) => { - if (called) return; - called = true; - remove2(); - if (cancelled) { - callHook3(onLeaveCancelled, [el]); - } else { - callHook3(onAfterLeave, [el]); - } - el[leaveCbKey] = void 0; - if (leavingVNodesCache[key2] === vnode) { - delete leavingVNodesCache[key2]; - } - }; - leavingVNodesCache[key2] = vnode; - if (onLeave) { - callAsyncHook(onLeave, [el, done]); - } else { - done(); - } - }, - clone(vnode2) { - const hooks2 = resolveTransitionHooks( - vnode2, - props, - state, - instance, - postClone - ); - if (postClone) postClone(hooks2); - return hooks2; - } - }; - return hooks; -} -function emptyPlaceholder(vnode) { - if (isKeepAlive(vnode)) { - vnode = cloneVNode(vnode); - vnode.children = null; - return vnode; - } -} -function getInnerChild$1(vnode) { - if (!isKeepAlive(vnode)) { - if (isTeleport(vnode.type) && vnode.children) { - return findNonCommentChild(vnode.children); - } - return vnode; - } - if (vnode.component) { - return vnode.component.subTree; - } - const { shapeFlag, children } = vnode; - if (children) { - if (shapeFlag & 16) { - return children[0]; - } - if (shapeFlag & 32 && isFunction(children.default)) { - return children.default(); - } - } -} -function setTransitionHooks(vnode, hooks) { - if (vnode.shapeFlag & 6 && vnode.component) { - vnode.transition = hooks; - setTransitionHooks(vnode.component.subTree, hooks); - } else if (vnode.shapeFlag & 128) { - vnode.ssContent.transition = hooks.clone(vnode.ssContent); - vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); - } else { - vnode.transition = hooks; - } -} -function getTransitionRawChildren(children, keepComment = false, parentKey) { - let ret = []; - let keyedFragmentCount = 0; - for (let i = 0; i < children.length; i++) { - let child = children[i]; - const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); - if (child.type === Fragment) { - if (child.patchFlag & 128) keyedFragmentCount++; - ret = ret.concat( - getTransitionRawChildren(child.children, keepComment, key) - ); - } else if (keepComment || child.type !== Comment) { - ret.push(key != null ? cloneVNode(child, { key }) : child); - } - } - if (keyedFragmentCount > 1) { - for (let i = 0; i < ret.length; i++) { - ret[i].patchFlag = -2; - } - } - return ret; -} -function defineComponent(options, extraOptions) { - return isFunction(options) ? ( - // #8236: extend call and options.name access are considered side-effects - // by Rollup, so we have to wrap it in a pure-annotated IIFE. - (() => extend({ name: options.name }, extraOptions, { setup: options }))() - ) : options; -} -function useId() { - const i = getCurrentInstance(); - if (i) { - return (i.appContext.config.idPrefix || "v") + "-" + i.ids[0] + i.ids[1]++; - } else if (true) { - warn$1( - `useId() is called when there is no active component instance to be associated with.` - ); - } - return ""; -} -function markAsyncBoundary(instance) { - instance.ids = [instance.ids[0] + instance.ids[2]++ + "-", 0, 0]; -} -var knownTemplateRefs = /* @__PURE__ */ new WeakSet(); -function useTemplateRef(key) { - const i = getCurrentInstance(); - const r = shallowRef(null); - if (i) { - const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs; - let desc; - if ((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) { - warn$1(`useTemplateRef('${key}') already exists.`); - } else { - Object.defineProperty(refs, key, { - enumerable: true, - get: () => r.value, - set: (val) => r.value = val - }); - } - } else if (true) { - warn$1( - `useTemplateRef() is called when there is no active component instance to be associated with.` - ); - } - const ret = true ? readonly(r) : r; - if (true) { - knownTemplateRefs.add(ret); - } - return ret; -} -function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { - if (isArray(rawRef)) { - rawRef.forEach( - (r, i) => setRef( - r, - oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), - parentSuspense, - vnode, - isUnmount - ) - ); - return; - } - if (isAsyncWrapper(vnode) && !isUnmount) { - if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) { - setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree); - } - return; - } - const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; - const value = isUnmount ? null : refValue; - const { i: owner, r: ref2 } = rawRef; - if (!owner) { - warn$1( - `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.` - ); - return; - } - const oldRef = oldRawRef && oldRawRef.r; - const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; - const setupState = owner.setupState; - const rawSetupState = toRaw(setupState); - const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => { - if (true) { - if (hasOwn(rawSetupState, key) && !isRef2(rawSetupState[key])) { - warn$1( - `Template ref "${key}" used on a non-ref value. It will not work in the production build.` - ); - } - if (knownTemplateRefs.has(rawSetupState[key])) { - return false; - } - } - return hasOwn(rawSetupState, key); - }; - if (oldRef != null && oldRef !== ref2) { - if (isString(oldRef)) { - refs[oldRef] = null; - if (canSetSetupRef(oldRef)) { - setupState[oldRef] = null; - } - } else if (isRef2(oldRef)) { - oldRef.value = null; - } - } - if (isFunction(ref2)) { - callWithErrorHandling(ref2, owner, 12, [value, refs]); - } else { - const _isString = isString(ref2); - const _isRef = isRef2(ref2); - if (_isString || _isRef) { - const doSet = () => { - if (rawRef.f) { - const existing = _isString ? canSetSetupRef(ref2) ? setupState[ref2] : refs[ref2] : ref2.value; - if (isUnmount) { - isArray(existing) && remove(existing, refValue); - } else { - if (!isArray(existing)) { - if (_isString) { - refs[ref2] = [refValue]; - if (canSetSetupRef(ref2)) { - setupState[ref2] = refs[ref2]; - } - } else { - ref2.value = [refValue]; - if (rawRef.k) refs[rawRef.k] = ref2.value; - } - } else if (!existing.includes(refValue)) { - existing.push(refValue); - } - } - } else if (_isString) { - refs[ref2] = value; - if (canSetSetupRef(ref2)) { - setupState[ref2] = value; - } - } else if (_isRef) { - ref2.value = value; - if (rawRef.k) refs[rawRef.k] = value; - } else if (true) { - warn$1("Invalid template ref type:", ref2, `(${typeof ref2})`); - } - }; - if (value) { - doSet.id = -1; - queuePostRenderEffect(doSet, parentSuspense); - } else { - doSet(); - } - } else if (true) { - warn$1("Invalid template ref type:", ref2, `(${typeof ref2})`); - } - } -} -var hasLoggedMismatchError = false; -var logMismatchError = () => { - if (hasLoggedMismatchError) { - return; - } - console.error("Hydration completed but contains mismatches."); - hasLoggedMismatchError = true; -}; -var isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject"; -var isMathMLContainer = (container) => container.namespaceURI.includes("MathML"); -var getContainerType = (container) => { - if (container.nodeType !== 1) return void 0; - if (isSVGContainer(container)) return "svg"; - if (isMathMLContainer(container)) return "mathml"; - return void 0; -}; -var isComment = (node) => node.nodeType === 8; -function createHydrationFunctions(rendererInternals) { - const { - mt: mountComponent, - p: patch, - o: { - patchProp: patchProp2, - createText, - nextSibling, - parentNode, - remove: remove2, - insert, - createComment - } - } = rendererInternals; - const hydrate2 = (vnode, container) => { - if (!container.hasChildNodes()) { - warn$1( - `Attempting to hydrate existing markup but container is empty. Performing full mount instead.` - ); - patch(null, vnode, container); - flushPostFlushCbs(); - container._vnode = vnode; - return; - } - hydrateNode(container.firstChild, vnode, null, null, null); - flushPostFlushCbs(); - container._vnode = vnode; - }; - const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => { - optimized = optimized || !!vnode.dynamicChildren; - const isFragmentStart = isComment(node) && node.data === "["; - const onMismatch = () => handleMismatch( - node, - vnode, - parentComponent, - parentSuspense, - slotScopeIds, - isFragmentStart - ); - const { type, ref: ref2, shapeFlag, patchFlag } = vnode; - let domType = node.nodeType; - vnode.el = node; - if (true) { - def(node, "__vnode", vnode, true); - def(node, "__vueParentComponent", parentComponent, true); - } - if (patchFlag === -2) { - optimized = false; - vnode.dynamicChildren = null; - } - let nextNode = null; - switch (type) { - case Text: - if (domType !== 3) { - if (vnode.children === "") { - insert(vnode.el = createText(""), parentNode(node), node); - nextNode = node; - } else { - nextNode = onMismatch(); - } - } else { - if (node.data !== vnode.children) { - warn$1( - `Hydration text mismatch in`, - node.parentNode, - ` - - rendered on server: ${JSON.stringify( - node.data - )} - - expected on client: ${JSON.stringify(vnode.children)}` - ); - logMismatchError(); - node.data = vnode.children; - } - nextNode = nextSibling(node); - } - break; - case Comment: - if (isTemplateNode(node)) { - nextNode = nextSibling(node); - replaceNode( - vnode.el = node.content.firstChild, - node, - parentComponent - ); - } else if (domType !== 8 || isFragmentStart) { - nextNode = onMismatch(); - } else { - nextNode = nextSibling(node); - } - break; - case Static: - if (isFragmentStart) { - node = nextSibling(node); - domType = node.nodeType; - } - if (domType === 1 || domType === 3) { - nextNode = node; - const needToAdoptContent = !vnode.children.length; - for (let i = 0; i < vnode.staticCount; i++) { - if (needToAdoptContent) - vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data; - if (i === vnode.staticCount - 1) { - vnode.anchor = nextNode; - } - nextNode = nextSibling(nextNode); - } - return isFragmentStart ? nextSibling(nextNode) : nextNode; - } else { - onMismatch(); - } - break; - case Fragment: - if (!isFragmentStart) { - nextNode = onMismatch(); - } else { - nextNode = hydrateFragment( - node, - vnode, - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - } - break; - default: - if (shapeFlag & 1) { - if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) { - nextNode = onMismatch(); - } else { - nextNode = hydrateElement( - node, - vnode, - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - } - } else if (shapeFlag & 6) { - vnode.slotScopeIds = slotScopeIds; - const container = parentNode(node); - if (isFragmentStart) { - nextNode = locateClosingAnchor(node); - } else if (isComment(node) && node.data === "teleport start") { - nextNode = locateClosingAnchor(node, node.data, "teleport end"); - } else { - nextNode = nextSibling(node); - } - mountComponent( - vnode, - container, - null, - parentComponent, - parentSuspense, - getContainerType(container), - optimized - ); - if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) { - let subTree; - if (isFragmentStart) { - subTree = createVNode(Fragment); - subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild; - } else { - subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div"); - } - subTree.el = node; - vnode.component.subTree = subTree; - } - } else if (shapeFlag & 64) { - if (domType !== 8) { - nextNode = onMismatch(); - } else { - nextNode = vnode.type.hydrate( - node, - vnode, - parentComponent, - parentSuspense, - slotScopeIds, - optimized, - rendererInternals, - hydrateChildren - ); - } - } else if (shapeFlag & 128) { - nextNode = vnode.type.hydrate( - node, - vnode, - parentComponent, - parentSuspense, - getContainerType(parentNode(node)), - slotScopeIds, - optimized, - rendererInternals, - hydrateNode - ); - } else if (true) { - warn$1("Invalid HostVNode type:", type, `(${typeof type})`); - } - } - if (ref2 != null) { - setRef(ref2, null, parentSuspense, vnode); - } - return nextNode; - }; - const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { - optimized = optimized || !!vnode.dynamicChildren; - const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode; - const forcePatch = type === "input" || type === "option"; - if (true) { - if (dirs) { - invokeDirectiveHook(vnode, null, parentComponent, "created"); - } - let needCallTransitionHooks = false; - if (isTemplateNode(el)) { - needCallTransitionHooks = needTransition( - null, - // no need check parentSuspense in hydration - transition - ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear; - const content = el.content.firstChild; - if (needCallTransitionHooks) { - transition.beforeEnter(content); - } - replaceNode(content, el, parentComponent); - vnode.el = el = content; - } - if (shapeFlag & 16 && // skip if element has innerHTML / textContent - !(props && (props.innerHTML || props.textContent))) { - let next = hydrateChildren( - el.firstChild, - vnode, - el, - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - let hasWarned2 = false; - while (next) { - if (!isMismatchAllowed( - el, - 1 - /* CHILDREN */ - )) { - if (!hasWarned2) { - warn$1( - `Hydration children mismatch on`, - el, - ` -Server rendered element contains more child nodes than client vdom.` - ); - hasWarned2 = true; - } - logMismatchError(); - } - const cur = next; - next = next.nextSibling; - remove2(cur); - } - } else if (shapeFlag & 8) { - let clientText = vnode.children; - if (clientText[0] === "\n" && (el.tagName === "PRE" || el.tagName === "TEXTAREA")) { - clientText = clientText.slice(1); - } - if (el.textContent !== clientText) { - if (!isMismatchAllowed( - el, - 0 - /* TEXT */ - )) { - warn$1( - `Hydration text content mismatch on`, - el, - ` - - rendered on server: ${el.textContent} - - expected on client: ${vnode.children}` - ); - logMismatchError(); - } - el.textContent = vnode.children; - } - } - if (props) { - if (true) { - const isCustomElement = el.tagName.includes("-"); - for (const key in props) { - if (// #11189 skip if this node has directives that have created hooks - // as it could have mutated the DOM in any possible way - !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) { - logMismatchError(); - } - if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers - key[0] === "." || isCustomElement) { - patchProp2(el, key, null, props[key], void 0, parentComponent); - } - } - } else if (props.onClick) { - patchProp2( - el, - "onClick", - null, - props.onClick, - void 0, - parentComponent - ); - } else if (patchFlag & 4 && isReactive(props.style)) { - for (const key in props.style) props.style[key]; - } - } - let vnodeHooks; - if (vnodeHooks = props && props.onVnodeBeforeMount) { - invokeVNodeHook(vnodeHooks, parentComponent, vnode); - } - if (dirs) { - invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); - } - if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) { - queueEffectWithSuspense(() => { - vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode); - needCallTransitionHooks && transition.enter(el); - dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); - }, parentSuspense); - } - } - return el.nextSibling; - }; - const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => { - optimized = optimized || !!parentVNode.dynamicChildren; - const children = parentVNode.children; - const l = children.length; - let hasWarned2 = false; - for (let i = 0; i < l; i++) { - const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]); - const isText = vnode.type === Text; - if (node) { - if (isText && !optimized) { - if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) { - insert( - createText( - node.data.slice(vnode.children.length) - ), - container, - nextSibling(node) - ); - node.data = vnode.children; - } - } - node = hydrateNode( - node, - vnode, - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - } else if (isText && !vnode.children) { - insert(vnode.el = createText(""), container); - } else { - if (!isMismatchAllowed( - container, - 1 - /* CHILDREN */ - )) { - if (!hasWarned2) { - warn$1( - `Hydration children mismatch on`, - container, - ` -Server rendered element contains fewer child nodes than client vdom.` - ); - hasWarned2 = true; - } - logMismatchError(); - } - patch( - null, - vnode, - container, - null, - parentComponent, - parentSuspense, - getContainerType(container), - slotScopeIds - ); - } - } - return node; - }; - const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { - const { slotScopeIds: fragmentSlotScopeIds } = vnode; - if (fragmentSlotScopeIds) { - slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; - } - const container = parentNode(node); - const next = hydrateChildren( - nextSibling(node), - vnode, - container, - parentComponent, - parentSuspense, - slotScopeIds, - optimized - ); - if (next && isComment(next) && next.data === "]") { - return nextSibling(vnode.anchor = next); - } else { - logMismatchError(); - insert(vnode.anchor = createComment(`]`), container, next); - return next; - } - }; - const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => { - if (!isMismatchAllowed( - node.parentElement, - 1 - /* CHILDREN */ - )) { - warn$1( - `Hydration node mismatch: -- rendered on server:`, - node, - node.nodeType === 3 ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``, - ` -- expected on client:`, - vnode.type - ); - logMismatchError(); - } - vnode.el = null; - if (isFragment) { - const end = locateClosingAnchor(node); - while (true) { - const next2 = nextSibling(node); - if (next2 && next2 !== end) { - remove2(next2); - } else { - break; - } - } - } - const next = nextSibling(node); - const container = parentNode(node); - remove2(node); - patch( - null, - vnode, - container, - next, - parentComponent, - parentSuspense, - getContainerType(container), - slotScopeIds - ); - if (parentComponent) { - parentComponent.vnode.el = vnode.el; - updateHOCHostEl(parentComponent, vnode.el); - } - return next; - }; - const locateClosingAnchor = (node, open = "[", close = "]") => { - let match = 0; - while (node) { - node = nextSibling(node); - if (node && isComment(node)) { - if (node.data === open) match++; - if (node.data === close) { - if (match === 0) { - return nextSibling(node); - } else { - match--; - } - } - } - } - return node; - }; - const replaceNode = (newNode, oldNode, parentComponent) => { - const parentNode2 = oldNode.parentNode; - if (parentNode2) { - parentNode2.replaceChild(newNode, oldNode); - } - let parent = parentComponent; - while (parent) { - if (parent.vnode.el === oldNode) { - parent.vnode.el = parent.subTree.el = newNode; - } - parent = parent.parent; - } - }; - const isTemplateNode = (node) => { - return node.nodeType === 1 && node.tagName === "TEMPLATE"; - }; - return [hydrate2, hydrateNode]; -} -function propHasMismatch(el, key, clientValue, vnode, instance) { - let mismatchType; - let mismatchKey; - let actual; - let expected; - if (key === "class") { - actual = el.getAttribute("class"); - expected = normalizeClass(clientValue); - if (!isSetEqual(toClassSet(actual || ""), toClassSet(expected))) { - mismatchType = 2; - mismatchKey = `class`; - } - } else if (key === "style") { - actual = el.getAttribute("style") || ""; - expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue)); - const actualMap = toStyleMap(actual); - const expectedMap = toStyleMap(expected); - if (vnode.dirs) { - for (const { dir, value } of vnode.dirs) { - if (dir.name === "show" && !value) { - expectedMap.set("display", "none"); - } - } - } - if (instance) { - resolveCssVars(instance, vnode, expectedMap); - } - if (!isMapEqual(actualMap, expectedMap)) { - mismatchType = 3; - mismatchKey = "style"; - } - } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) { - if (isBooleanAttr(key)) { - actual = el.hasAttribute(key); - expected = includeBooleanAttr(clientValue); - } else if (clientValue == null) { - actual = el.hasAttribute(key); - expected = false; - } else { - if (el.hasAttribute(key)) { - actual = el.getAttribute(key); - } else if (key === "value" && el.tagName === "TEXTAREA") { - actual = el.value; - } else { - actual = false; - } - expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false; - } - if (actual !== expected) { - mismatchType = 4; - mismatchKey = key; - } - } - if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) { - const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}="${v}"`; - const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`; - const postSegment = ` - - rendered on server: ${format(actual)} - - expected on client: ${format(expected)} - Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead. - You should fix the source of the mismatch.`; - { - warn$1(preSegment, el, postSegment); - } - return true; - } - return false; -} -function toClassSet(str) { - return new Set(str.trim().split(/\s+/)); -} -function isSetEqual(a, b) { - if (a.size !== b.size) { - return false; - } - for (const s of a) { - if (!b.has(s)) { - return false; - } - } - return true; -} -function toStyleMap(str) { - const styleMap = /* @__PURE__ */ new Map(); - for (const item of str.split(";")) { - let [key, value] = item.split(":"); - key = key.trim(); - value = value && value.trim(); - if (key && value) { - styleMap.set(key, value); - } - } - return styleMap; -} -function isMapEqual(a, b) { - if (a.size !== b.size) { - return false; - } - for (const [key, value] of a) { - if (value !== b.get(key)) { - return false; - } - } - return true; -} -function resolveCssVars(instance, vnode, expectedMap) { - const root = instance.subTree; - if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) { - const cssVars = instance.getCssVars(); - for (const key in cssVars) { - expectedMap.set( - `--${getEscapedCssVarName(key, false)}`, - String(cssVars[key]) - ); - } - } - if (vnode === root && instance.parent) { - resolveCssVars(instance.parent, instance.vnode, expectedMap); - } -} -var allowMismatchAttr = "data-allow-mismatch"; -var MismatchTypeString = { - [ - 0 - /* TEXT */ - ]: "text", - [ - 1 - /* CHILDREN */ - ]: "children", - [ - 2 - /* CLASS */ - ]: "class", - [ - 3 - /* STYLE */ - ]: "style", - [ - 4 - /* ATTRIBUTE */ - ]: "attribute" -}; -function isMismatchAllowed(el, allowedType) { - if (allowedType === 0 || allowedType === 1) { - while (el && !el.hasAttribute(allowMismatchAttr)) { - el = el.parentElement; - } - } - const allowedAttr = el && el.getAttribute(allowMismatchAttr); - if (allowedAttr == null) { - return false; - } else if (allowedAttr === "") { - return true; - } else { - const list = allowedAttr.split(","); - if (allowedType === 0 && list.includes("children")) { - return true; - } - return allowedAttr.split(",").includes(MismatchTypeString[allowedType]); - } -} -var requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1)); -var cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id)); -var hydrateOnIdle = (timeout = 1e4) => (hydrate2) => { - const id = requestIdleCallback(hydrate2, { timeout }); - return () => cancelIdleCallback(id); -}; -function elementIsVisibleInViewport(el) { - const { top, left, bottom, right } = el.getBoundingClientRect(); - const { innerHeight, innerWidth } = window; - return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth); -} -var hydrateOnVisible = (opts) => (hydrate2, forEach) => { - const ob = new IntersectionObserver((entries) => { - for (const e of entries) { - if (!e.isIntersecting) continue; - ob.disconnect(); - hydrate2(); - break; - } - }, opts); - forEach((el) => { - if (!(el instanceof Element)) return; - if (elementIsVisibleInViewport(el)) { - hydrate2(); - ob.disconnect(); - return false; - } - ob.observe(el); - }); - return () => ob.disconnect(); -}; -var hydrateOnMediaQuery = (query) => (hydrate2) => { - if (query) { - const mql = matchMedia(query); - if (mql.matches) { - hydrate2(); - } else { - mql.addEventListener("change", hydrate2, { once: true }); - return () => mql.removeEventListener("change", hydrate2); - } - } -}; -var hydrateOnInteraction = (interactions = []) => (hydrate2, forEach) => { - if (isString(interactions)) interactions = [interactions]; - let hasHydrated = false; - const doHydrate = (e) => { - if (!hasHydrated) { - hasHydrated = true; - teardown(); - hydrate2(); - e.target.dispatchEvent(new e.constructor(e.type, e)); - } - }; - const teardown = () => { - forEach((el) => { - for (const i of interactions) { - el.removeEventListener(i, doHydrate); - } - }); - }; - forEach((el) => { - for (const i of interactions) { - el.addEventListener(i, doHydrate, { once: true }); - } - }); - return teardown; -}; -function forEachElement(node, cb) { - if (isComment(node) && node.data === "[") { - let depth = 1; - let next = node.nextSibling; - while (next) { - if (next.nodeType === 1) { - const result = cb(next); - if (result === false) { - break; - } - } else if (isComment(next)) { - if (next.data === "]") { - if (--depth === 0) break; - } else if (next.data === "[") { - depth++; - } - } - next = next.nextSibling; - } - } else { - cb(node); - } -} -var isAsyncWrapper = (i) => !!i.type.__asyncLoader; -function defineAsyncComponent(source) { - if (isFunction(source)) { - source = { loader: source }; - } - const { - loader, - loadingComponent, - errorComponent, - delay = 200, - hydrate: hydrateStrategy, - timeout, - // undefined = never times out - suspensible = true, - onError: userOnError - } = source; - let pendingRequest = null; - let resolvedComp; - let retries = 0; - const retry = () => { - retries++; - pendingRequest = null; - return load(); - }; - const load = () => { - let thisRequest; - return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { - err = err instanceof Error ? err : new Error(String(err)); - if (userOnError) { - return new Promise((resolve2, reject) => { - const userRetry = () => resolve2(retry()); - const userFail = () => reject(err); - userOnError(err, userRetry, userFail, retries + 1); - }); - } else { - throw err; - } - }).then((comp) => { - if (thisRequest !== pendingRequest && pendingRequest) { - return pendingRequest; - } - if (!comp) { - warn$1( - `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.` - ); - } - if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { - comp = comp.default; - } - if (comp && !isObject(comp) && !isFunction(comp)) { - throw new Error(`Invalid async component load result: ${comp}`); - } - resolvedComp = comp; - return comp; - })); - }; - return defineComponent({ - name: "AsyncComponentWrapper", - __asyncLoader: load, - __asyncHydrate(el, instance, hydrate2) { - const doHydrate = hydrateStrategy ? () => { - const teardown = hydrateStrategy( - hydrate2, - (cb) => forEachElement(el, cb) - ); - if (teardown) { - (instance.bum || (instance.bum = [])).push(teardown); - } - } : hydrate2; - if (resolvedComp) { - doHydrate(); - } else { - load().then(() => !instance.isUnmounted && doHydrate()); - } - }, - get __asyncResolved() { - return resolvedComp; - }, - setup() { - const instance = currentInstance; - markAsyncBoundary(instance); - if (resolvedComp) { - return () => createInnerComp(resolvedComp, instance); - } - const onError = (err) => { - pendingRequest = null; - handleError( - err, - instance, - 13, - !errorComponent - ); - }; - if (suspensible && instance.suspense || isInSSRComponentSetup) { - return load().then((comp) => { - return () => createInnerComp(comp, instance); - }).catch((err) => { - onError(err); - return () => errorComponent ? createVNode(errorComponent, { - error: err - }) : null; - }); - } - const loaded = ref(false); - const error = ref(); - const delayed = ref(!!delay); - if (delay) { - setTimeout(() => { - delayed.value = false; - }, delay); - } - if (timeout != null) { - setTimeout(() => { - if (!loaded.value && !error.value) { - const err = new Error( - `Async component timed out after ${timeout}ms.` - ); - onError(err); - error.value = err; - } - }, timeout); - } - load().then(() => { - loaded.value = true; - if (instance.parent && isKeepAlive(instance.parent.vnode)) { - instance.parent.update(); - } - }).catch((err) => { - onError(err); - error.value = err; - }); - return () => { - if (loaded.value && resolvedComp) { - return createInnerComp(resolvedComp, instance); - } else if (error.value && errorComponent) { - return createVNode(errorComponent, { - error: error.value - }); - } else if (loadingComponent && !delayed.value) { - return createVNode(loadingComponent); - } - }; - } - }); -} -function createInnerComp(comp, parent) { - const { ref: ref2, props, children, ce } = parent.vnode; - const vnode = createVNode(comp, props, children); - vnode.ref = ref2; - vnode.ce = ce; - delete parent.vnode.ce; - return vnode; -} -var isKeepAlive = (vnode) => vnode.type.__isKeepAlive; -var KeepAliveImpl = { - name: `KeepAlive`, - // Marker for special handling inside the renderer. We are not using a === - // check directly on KeepAlive in the renderer, because importing it directly - // would prevent it from being tree-shaken. - __isKeepAlive: true, - props: { - include: [String, RegExp, Array], - exclude: [String, RegExp, Array], - max: [String, Number] - }, - setup(props, { slots }) { - const instance = getCurrentInstance(); - const sharedContext = instance.ctx; - if (!sharedContext.renderer) { - return () => { - const children = slots.default && slots.default(); - return children && children.length === 1 ? children[0] : children; - }; - } - const cache = /* @__PURE__ */ new Map(); - const keys = /* @__PURE__ */ new Set(); - let current = null; - if (true) { - instance.__v_cache = cache; - } - const parentSuspense = instance.suspense; - const { - renderer: { - p: patch, - m: move, - um: _unmount, - o: { createElement } - } - } = sharedContext; - const storageContainer = createElement("div"); - sharedContext.activate = (vnode, container, anchor, namespace, optimized) => { - const instance2 = vnode.component; - move(vnode, container, anchor, 0, parentSuspense); - patch( - instance2.vnode, - vnode, - container, - anchor, - instance2, - parentSuspense, - namespace, - vnode.slotScopeIds, - optimized - ); - queuePostRenderEffect(() => { - instance2.isDeactivated = false; - if (instance2.a) { - invokeArrayFns(instance2.a); - } - const vnodeHook = vnode.props && vnode.props.onVnodeMounted; - if (vnodeHook) { - invokeVNodeHook(vnodeHook, instance2.parent, vnode); - } - }, parentSuspense); - if (true) { - devtoolsComponentAdded(instance2); - } - }; - sharedContext.deactivate = (vnode) => { - const instance2 = vnode.component; - invalidateMount(instance2.m); - invalidateMount(instance2.a); - move(vnode, storageContainer, null, 1, parentSuspense); - queuePostRenderEffect(() => { - if (instance2.da) { - invokeArrayFns(instance2.da); - } - const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; - if (vnodeHook) { - invokeVNodeHook(vnodeHook, instance2.parent, vnode); - } - instance2.isDeactivated = true; - }, parentSuspense); - if (true) { - devtoolsComponentAdded(instance2); - } - }; - function unmount(vnode) { - resetShapeFlag(vnode); - _unmount(vnode, instance, parentSuspense, true); - } - function pruneCache(filter) { - cache.forEach((vnode, key) => { - const name = getComponentName(vnode.type); - if (name && !filter(name)) { - pruneCacheEntry(key); - } - }); - } - function pruneCacheEntry(key) { - const cached = cache.get(key); - if (cached && (!current || !isSameVNodeType(cached, current))) { - unmount(cached); - } else if (current) { - resetShapeFlag(current); - } - cache.delete(key); - keys.delete(key); - } - watch2( - () => [props.include, props.exclude], - ([include, exclude]) => { - include && pruneCache((name) => matches(include, name)); - exclude && pruneCache((name) => !matches(exclude, name)); - }, - // prune post-render after `current` has been updated - { flush: "post", deep: true } - ); - let pendingCacheKey = null; - const cacheSubtree = () => { - if (pendingCacheKey != null) { - if (isSuspense(instance.subTree.type)) { - queuePostRenderEffect(() => { - cache.set(pendingCacheKey, getInnerChild(instance.subTree)); - }, instance.subTree.suspense); - } else { - cache.set(pendingCacheKey, getInnerChild(instance.subTree)); - } - } - }; - onMounted(cacheSubtree); - onUpdated(cacheSubtree); - onBeforeUnmount(() => { - cache.forEach((cached) => { - const { subTree, suspense } = instance; - const vnode = getInnerChild(subTree); - if (cached.type === vnode.type && cached.key === vnode.key) { - resetShapeFlag(vnode); - const da = vnode.component.da; - da && queuePostRenderEffect(da, suspense); - return; - } - unmount(cached); - }); - }); - return () => { - pendingCacheKey = null; - if (!slots.default) { - return current = null; - } - const children = slots.default(); - const rawVNode = children[0]; - if (children.length > 1) { - if (true) { - warn$1(`KeepAlive should contain exactly one component child.`); - } - current = null; - return children; - } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { - current = null; - return rawVNode; - } - let vnode = getInnerChild(rawVNode); - if (vnode.type === Comment) { - current = null; - return vnode; - } - const comp = vnode.type; - const name = getComponentName( - isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp - ); - const { include, exclude, max } = props; - if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { - vnode.shapeFlag &= ~256; - current = vnode; - return rawVNode; - } - const key = vnode.key == null ? comp : vnode.key; - const cachedVNode = cache.get(key); - if (vnode.el) { - vnode = cloneVNode(vnode); - if (rawVNode.shapeFlag & 128) { - rawVNode.ssContent = vnode; - } - } - pendingCacheKey = key; - if (cachedVNode) { - vnode.el = cachedVNode.el; - vnode.component = cachedVNode.component; - if (vnode.transition) { - setTransitionHooks(vnode, vnode.transition); - } - vnode.shapeFlag |= 512; - keys.delete(key); - keys.add(key); - } else { - keys.add(key); - if (max && keys.size > parseInt(max, 10)) { - pruneCacheEntry(keys.values().next().value); - } - } - vnode.shapeFlag |= 256; - current = vnode; - return isSuspense(rawVNode.type) ? rawVNode : vnode; - }; - } -}; -var KeepAlive = KeepAliveImpl; -function matches(pattern, name) { - if (isArray(pattern)) { - return pattern.some((p2) => matches(p2, name)); - } else if (isString(pattern)) { - return pattern.split(",").includes(name); - } else if (isRegExp(pattern)) { - pattern.lastIndex = 0; - return pattern.test(name); - } - return false; -} -function onActivated(hook, target) { - registerKeepAliveHook(hook, "a", target); -} -function onDeactivated(hook, target) { - registerKeepAliveHook(hook, "da", target); -} -function registerKeepAliveHook(hook, type, target = currentInstance) { - const wrappedHook = hook.__wdc || (hook.__wdc = () => { - let current = target; - while (current) { - if (current.isDeactivated) { - return; - } - current = current.parent; - } - return hook(); - }); - injectHook(type, wrappedHook, target); - if (target) { - let current = target.parent; - while (current && current.parent) { - if (isKeepAlive(current.parent.vnode)) { - injectToKeepAliveRoot(wrappedHook, type, target, current); - } - current = current.parent; - } - } -} -function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { - const injected = injectHook( - type, - hook, - keepAliveRoot, - true - /* prepend */ - ); - onUnmounted(() => { - remove(keepAliveRoot[type], injected); - }, target); -} -function resetShapeFlag(vnode) { - vnode.shapeFlag &= ~256; - vnode.shapeFlag &= ~512; -} -function getInnerChild(vnode) { - return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; -} -function injectHook(type, hook, target = currentInstance, prepend = false) { - if (target) { - const hooks = target[type] || (target[type] = []); - const wrappedHook = hook.__weh || (hook.__weh = (...args) => { - pauseTracking(); - const reset = setCurrentInstance(target); - const res = callWithAsyncErrorHandling(hook, target, type, args); - reset(); - resetTracking(); - return res; - }); - if (prepend) { - hooks.unshift(wrappedHook); - } else { - hooks.push(wrappedHook); - } - return wrappedHook; - } else if (true) { - const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, "")); - warn$1( - `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` - ); - } -} -var createHook = (lifecycle) => (hook, target = currentInstance) => { - if (!isInSSRComponentSetup || lifecycle === "sp") { - injectHook(lifecycle, (...args) => hook(...args), target); - } -}; -var onBeforeMount = createHook("bm"); -var onMounted = createHook("m"); -var onBeforeUpdate = createHook( - "bu" -); -var onUpdated = createHook("u"); -var onBeforeUnmount = createHook( - "bum" -); -var onUnmounted = createHook("um"); -var onServerPrefetch = createHook( - "sp" -); -var onRenderTriggered = createHook("rtg"); -var onRenderTracked = createHook("rtc"); -function onErrorCaptured(hook, target = currentInstance) { - injectHook("ec", hook, target); -} -var COMPONENTS = "components"; -var DIRECTIVES = "directives"; -function resolveComponent(name, maybeSelfReference) { - return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; -} -var NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); -function resolveDynamicComponent(component) { - if (isString(component)) { - return resolveAsset(COMPONENTS, component, false) || component; - } else { - return component || NULL_DYNAMIC_COMPONENT; - } -} -function resolveDirective(name) { - return resolveAsset(DIRECTIVES, name); -} -function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { - const instance = currentRenderingInstance || currentInstance; - if (instance) { - const Component = instance.type; - if (type === COMPONENTS) { - const selfName = getComponentName( - Component, - false - ); - if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { - return Component; - } - } - const res = ( - // local registration - // check instance[type] first which is resolved for options API - resolve(instance[type] || Component[type], name) || // global registration - resolve(instance.appContext[type], name) - ); - if (!res && maybeSelfReference) { - return Component; - } - if (warnMissing && !res) { - const extra = type === COMPONENTS ? ` -If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; - warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); - } - return res; - } else if (true) { - warn$1( - `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().` - ); - } -} -function resolve(registry, name) { - return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); -} -function renderList(source, renderItem, cache, index) { - let ret; - const cached = cache && cache[index]; - const sourceIsArray = isArray(source); - if (sourceIsArray || isString(source)) { - const sourceIsReactiveArray = sourceIsArray && isReactive(source); - let needsWrap = false; - if (sourceIsReactiveArray) { - needsWrap = !isShallow(source); - source = shallowReadArray(source); - } - ret = new Array(source.length); - for (let i = 0, l = source.length; i < l; i++) { - ret[i] = renderItem( - needsWrap ? toReactive(source[i]) : source[i], - i, - void 0, - cached && cached[i] - ); - } - } else if (typeof source === "number") { - if (!Number.isInteger(source)) { - warn$1(`The v-for range expect an integer value but got ${source}.`); - } - ret = new Array(source); - for (let i = 0; i < source; i++) { - ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); - } - } else if (isObject(source)) { - if (source[Symbol.iterator]) { - ret = Array.from( - source, - (item, i) => renderItem(item, i, void 0, cached && cached[i]) - ); - } else { - const keys = Object.keys(source); - ret = new Array(keys.length); - for (let i = 0, l = keys.length; i < l; i++) { - const key = keys[i]; - ret[i] = renderItem(source[key], key, i, cached && cached[i]); - } - } - } else { - ret = []; - } - if (cache) { - cache[index] = ret; - } - return ret; -} -function createSlots(slots, dynamicSlots) { - for (let i = 0; i < dynamicSlots.length; i++) { - const slot = dynamicSlots[i]; - if (isArray(slot)) { - for (let j = 0; j < slot.length; j++) { - slots[slot[j].name] = slot[j].fn; - } - } else if (slot) { - slots[slot.name] = slot.key ? (...args) => { - const res = slot.fn(...args); - if (res) res.key = slot.key; - return res; - } : slot.fn; - } - } - return slots; -} -function renderSlot(slots, name, props = {}, fallback, noSlotted) { - if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) { - if (name !== "default") props.name = name; - return openBlock(), createBlock( - Fragment, - null, - [createVNode("slot", props, fallback && fallback())], - 64 - ); - } - let slot = slots[name]; - if (slot && slot.length > 1) { - warn$1( - `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.` - ); - slot = () => []; - } - if (slot && slot._c) { - slot._d = false; - } - openBlock(); - const validSlotContent = slot && ensureValidVNode(slot(props)); - const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch - // key attached in the `createSlots` helper, respect that - validSlotContent && validSlotContent.key; - const rendered = createBlock( - Fragment, - { - key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content - (!validSlotContent && fallback ? "_fb" : "") - }, - validSlotContent || (fallback ? fallback() : []), - validSlotContent && slots._ === 1 ? 64 : -2 - ); - if (!noSlotted && rendered.scopeId) { - rendered.slotScopeIds = [rendered.scopeId + "-s"]; - } - if (slot && slot._c) { - slot._d = true; - } - return rendered; -} -function ensureValidVNode(vnodes) { - return vnodes.some((child) => { - if (!isVNode(child)) return true; - if (child.type === Comment) return false; - if (child.type === Fragment && !ensureValidVNode(child.children)) - return false; - return true; - }) ? vnodes : null; -} -function toHandlers(obj, preserveCaseIfNecessary) { - const ret = {}; - if (!isObject(obj)) { - warn$1(`v-on with no argument expects an object value.`); - return ret; - } - for (const key in obj) { - ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; - } - return ret; -} -var getPublicInstance = (i) => { - if (!i) return null; - if (isStatefulComponent(i)) return getComponentPublicInstance(i); - return getPublicInstance(i.parent); -}; -var publicPropertiesMap = ( - // Move PURE marker to new line to workaround compiler discarding it - // due to type annotation - extend(/* @__PURE__ */ Object.create(null), { - $: (i) => i, - $el: (i) => i.vnode.el, - $data: (i) => i.data, - $props: (i) => true ? shallowReadonly(i.props) : i.props, - $attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs, - $slots: (i) => true ? shallowReadonly(i.slots) : i.slots, - $refs: (i) => true ? shallowReadonly(i.refs) : i.refs, - $parent: (i) => getPublicInstance(i.parent), - $root: (i) => getPublicInstance(i.root), - $host: (i) => i.ce, - $emit: (i) => i.emit, - $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type, - $forceUpdate: (i) => i.f || (i.f = () => { - queueJob(i.update); - }), - $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), - $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP - }) -); -var isReservedPrefix = (key) => key === "_" || key === "$"; -var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); -var PublicInstanceProxyHandlers = { - get({ _: instance }, key) { - if (key === "__v_skip") { - return true; - } - const { ctx, setupState, data, props, accessCache, type, appContext } = instance; - if (key === "__isVue") { - return true; - } - let normalizedProps; - if (key[0] !== "$") { - const n = accessCache[key]; - if (n !== void 0) { - switch (n) { - case 1: - return setupState[key]; - case 2: - return data[key]; - case 4: - return ctx[key]; - case 3: - return props[key]; - } - } else if (hasSetupBinding(setupState, key)) { - accessCache[key] = 1; - return setupState[key]; - } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { - accessCache[key] = 2; - return data[key]; - } else if ( - // only cache other properties when instance has declared (thus stable) - // props - (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) - ) { - accessCache[key] = 3; - return props[key]; - } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { - accessCache[key] = 4; - return ctx[key]; - } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) { - accessCache[key] = 0; - } - } - const publicGetter = publicPropertiesMap[key]; - let cssModule, globalProperties; - if (publicGetter) { - if (key === "$attrs") { - track(instance.attrs, "get", ""); - markAttrsAccessed(); - } else if (key === "$slots") { - track(instance, "get", key); - } - return publicGetter(instance); - } else if ( - // css module (injected by vue-loader) - (cssModule = type.__cssModules) && (cssModule = cssModule[key]) - ) { - return cssModule; - } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { - accessCache[key] = 4; - return ctx[key]; - } else if ( - // global properties - globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) - ) { - { - return globalProperties[key]; - } - } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading - // to infinite warning loop - key.indexOf("__v") !== 0)) { - if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) { - warn$1( - `Property ${JSON.stringify( - key - )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.` - ); - } else if (instance === currentRenderingInstance) { - warn$1( - `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.` - ); - } - } - }, - set({ _: instance }, key, value) { - const { data, setupState, ctx } = instance; - if (hasSetupBinding(setupState, key)) { - setupState[key] = value; - return true; - } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) { - warn$1(`Cannot mutate