├── .eslintrc ├── .github └── workflows │ ├── ci.yml │ └── release.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── package.json ├── playground ├── .gitignore ├── components.d.ts ├── index.html ├── package.json ├── public │ └── vite.svg ├── src │ ├── App.css │ ├── App.tsx │ ├── CompA.tsx │ ├── CompB.tsx │ ├── Components │ │ └── CompC.tsx │ ├── assets │ │ └── react.svg │ ├── index.css │ ├── main.tsx │ ├── utils.tsx │ └── vite-env.d.ts └── vite.config.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts └── postbuild.ts ├── src ├── core │ ├── generateDts.ts │ ├── resolvers.ts │ ├── resolvers │ │ ├── antd.ts │ │ ├── createResolver.ts │ │ ├── index.ts │ │ └── mui.ts │ ├── searchGlob.ts │ ├── transformer.ts │ └── utils.ts ├── index.ts ├── types.ts ├── vite.ts └── webpack.ts ├── test ├── __snapshots__ │ └── index.test.ts.snap ├── fixtures │ ├── A.tsx │ ├── App.tsx │ └── components.d.ts └── index.test.ts ├── tsconfig.json └── tsup.config.ts /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@antfu", 3 | "rules": { 4 | "import/no-mutable-exports": "off" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | pull_request: 9 | branches: 10 | - master 11 | 12 | jobs: 13 | lint: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | 18 | - name: Set node 19 | uses: actions/setup-node@v2 20 | with: 21 | node-version: 16.x 22 | 23 | - run: corepack enable 24 | 25 | - name: Setup 26 | run: npm i -g @antfu/ni 27 | 28 | - name: Install 29 | run: nci 30 | 31 | - name: Lint 32 | run: nr lint 33 | 34 | test: 35 | runs-on: ${{ matrix.os }} 36 | 37 | strategy: 38 | matrix: 39 | node: [14.x, 16.x] 40 | os: [ubuntu-latest, windows-latest, macos-latest] 41 | fail-fast: false 42 | 43 | steps: 44 | - uses: actions/checkout@v2 45 | 46 | - name: Set node version to ${{ matrix.node }} 47 | uses: actions/setup-node@v2 48 | with: 49 | node-version: ${{ matrix.node }} 50 | 51 | - run: corepack enable 52 | 53 | - name: Setup 54 | run: npm i -g @antfu/ni 55 | 56 | - name: Install 57 | run: nci 58 | 59 | - name: Build 60 | run: nr build 61 | 62 | - name: Test 63 | run: nr test 64 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | with: 14 | fetch-depth: 0 15 | 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 16.x 19 | 20 | - run: npx changelogithub 21 | env: 22 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | .vite-inspect 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | 62 | # parcel-bundler cache (https://parceljs.org/) 63 | .cache 64 | 65 | # next.js build output 66 | .next 67 | 68 | # nuxt.js build output 69 | .nuxt 70 | 71 | # Nuxt generate 72 | dist 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless 79 | 80 | # IDE 81 | .idea 82 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | ignore-workspace-root-check=true 2 | shamefully-hoist=true 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Anthony Fu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # unplugin-react-components 2 | 3 | [![NPM version](https://img.shields.io/npm/v/unplugin-react-components?color=a1b858&label=)](https://www.npmjs.com/package/unplugin-react-components) 4 | 5 | ## Install 6 | 7 | ```bash 8 | npm i unplugin-react-components -D 9 | ``` 10 | 11 |
12 | Vite
13 | 14 | ```ts 15 | // vite.config.ts 16 | import Components from 'unplugin-react-components/vite' 17 | 18 | export default defineConfig({ 19 | plugins: [ 20 | React(), 21 | Components({ /* options */ }), 22 | ], 23 | }) 24 | ``` 25 |
26 |
27 | 28 | 29 |
30 | Webpack 31 |
32 | 33 | ```ts 34 | // webpack.config.js 35 | module.exports = { 36 | /* ... */ 37 | plugins: [ 38 | require('unplugin-react-components/webpack')({ /* options */ }) 39 | ] 40 | } 41 | ``` 42 | 43 |
44 | 45 | ## Usage 46 | Use components in templates as you would usually do, it will import components on demand, and there is no import and component registration required anymore! If you register the parent component asynchronously (or lazy route), the auto-imported components will be code-split along with their parent. 47 | 48 | It will automatically turn this 49 | 50 | ```tsx 51 | export function App() { 52 | return ( 53 | 54 | ) 55 | } 56 | ``` 57 | into this 58 | ```tsx 59 | import { CompA } from './CompA' 60 | 61 | export function App() { 62 | return ( 63 | 64 | ) 65 | } 66 | ``` 67 | 68 | ## TypeScript 69 | ```ts 70 | Components({ 71 | dts: true, // enabled by default if `typescript` is installed 72 | }) 73 | ``` 74 | Once the setup is done, a components.d.ts will be generated and updates automatically with the type definitions. Feel free to commit it into git or not as you want. 75 | > Make sure you also add components.d.ts to your tsconfig.json under include 76 | 77 | ## Importing from UI Libraries 78 | Use third-party components in your components as you would usually do, it will import components on demand, and there is no import and component registration required anymore! 79 | 80 | > At present, the number of UI supported is limited. If you want to provide more UI support, you are welcome to propose PR or you can use custom resolver. 81 | 82 | Supported Resolvers: 83 | - [Antd](https://github.com/SnowingFox/unplugin-react-components/blob/master/src/core/resolvers/antd.ts) 84 | - [Mui](https://github.com/SnowingFox/unplugin-react-components/blob/master/src/core/resolvers/mui.ts) 85 | 86 | ```ts 87 | import { AntdResolver, MuiResolver } from 'unplugin-react-components' 88 | 89 | Components({ 90 | resolvers: [ 91 | AntdResolver(), 92 | MuiResolver() 93 | ], 94 | }) 95 | ``` 96 | 97 | ## Custom Resolver 98 | ```ts 99 | Components({ 100 | resolvers: [ 101 | () => [ 102 | /** 103 | * in App.tsx 104 | * import { Form } from 'formik' 105 | * 106 | * in components.d.ts 107 | * const MikForm: typeof import('formik')['Form'] 108 | * 109 | * **/ 110 | { name: 'MikForm', from: 'formik', type: 'Export', orignalName: 'Form' }, 111 | /** 112 | * in App.tsx 113 | * import XXX fro 114 | * 115 | * in components.d.ts 116 | * const Component: typeof import('ui')['default'] 117 | * 118 | * **/ 119 | { name: 'Component', from: 'ui', type: 'ExportDefault', orignalName: 'XXX' } 120 | ] 121 | ], 122 | }) 123 | ``` 124 | 125 | or you can use `createResolver` 126 | 127 | ```ts 128 | import { createResolver } from 'unplugin-react-components' 129 | 130 | Components({ 131 | resolvers: [ 132 | createResolver({ 133 | module: 'react-ui', 134 | prefix: 'RUi', 135 | exclude: (name) => { 136 | return name.startsWith('Excluded') 137 | }, 138 | }) 139 | ] 140 | }) 141 | ``` 142 | 143 | ## sideEffects 144 | 145 | Assume you are using antd 146 | ```tsx 147 | export default function App() { 148 | return ( 149 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Tooltip will show on mouse enter. 14 | 15 | 16 | 17 | ) 18 | } 19 | 20 | export default App 21 | -------------------------------------------------------------------------------- /playground/src/CompA.tsx: -------------------------------------------------------------------------------- 1 | export const CompA = () => { 2 | return ( 3 |
CompA
4 | ) 5 | } 6 | -------------------------------------------------------------------------------- /playground/src/CompB.tsx: -------------------------------------------------------------------------------- 1 | export const CompB = () => { 2 | return ( 3 |
CompB
4 | ) 5 | } 6 | -------------------------------------------------------------------------------- /playground/src/Components/CompC.tsx: -------------------------------------------------------------------------------- 1 | export const CompC = () => { 2 | return
CompC
3 | } 4 | -------------------------------------------------------------------------------- /playground/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /playground/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, Avenir, Helvetica, Arial, sans-serif; 3 | font-size: 16px; 4 | line-height: 24px; 5 | font-weight: 400; 6 | 7 | color-scheme: light dark; 8 | color: rgba(255, 255, 255, 0.87); 9 | background-color: #242424; 10 | 11 | font-synthesis: none; 12 | text-rendering: optimizeLegibility; 13 | -webkit-font-smoothing: antialiased; 14 | -moz-osx-font-smoothing: grayscale; 15 | -webkit-text-size-adjust: 100%; 16 | } 17 | 18 | a { 19 | font-weight: 500; 20 | color: #646cff; 21 | text-decoration: inherit; 22 | } 23 | a:hover { 24 | color: #535bf2; 25 | } 26 | 27 | body { 28 | margin: 0; 29 | display: flex; 30 | place-items: center; 31 | min-width: 320px; 32 | min-height: 100vh; 33 | } 34 | 35 | h1 { 36 | font-size: 3.2em; 37 | line-height: 1.1; 38 | } 39 | 40 | button { 41 | border-radius: 8px; 42 | border: 1px solid transparent; 43 | padding: 0.6em 1.2em; 44 | font-size: 1em; 45 | font-weight: 500; 46 | font-family: inherit; 47 | background-color: #1a1a1a; 48 | cursor: pointer; 49 | transition: border-color 0.25s; 50 | } 51 | button:hover { 52 | border-color: #646cff; 53 | } 54 | button:focus, 55 | button:focus-visible { 56 | outline: 4px auto -webkit-focus-ring-color; 57 | } 58 | 59 | @media (prefers-color-scheme: light) { 60 | :root { 61 | color: #213547; 62 | background-color: #ffffff; 63 | } 64 | a:hover { 65 | color: #747bff; 66 | } 67 | button { 68 | background-color: #f9f9f9; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /playground/src/main.tsx: -------------------------------------------------------------------------------- 1 | import ReactDOM from 'react-dom/client' 2 | import React from 'react' 3 | 4 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 5 | 6 | 7 | , 8 | ) 9 | -------------------------------------------------------------------------------- /playground/src/utils.tsx: -------------------------------------------------------------------------------- 1 | export const sum = (a: number, b: number) => a + b 2 | 3 | export function AAA() { return
1
} 4 | export default function Utils() { return
1
} 5 | 6 | -------------------------------------------------------------------------------- /playground/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /playground/vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react' 2 | import Inspect from 'vite-plugin-inspect' 3 | import { defineConfig } from 'vite' 4 | import Components from 'unplugin-react-components/vite' 5 | import { AntdResolver, MuiResolver } from 'unplugin-react-components' 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [ 10 | react(), 11 | Components({ 12 | dts: true, 13 | local: true, 14 | resolvers: [ 15 | MuiResolver({ 16 | prefix: false, 17 | }), 18 | AntdResolver({ 19 | prefix: 'Ant', 20 | }), 21 | ], 22 | }), 23 | Inspect({ 24 | build: true, 25 | }), 26 | ], 27 | }) 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | importers: 4 | 5 | playground: 6 | specifiers: 7 | '@mui/material': ^5.10.11 8 | '@types/react': ^18.0.17 9 | '@types/react-dom': ^18.0.6 10 | '@vitejs/plugin-react': ^3.0.1 11 | antd: ^4.23.6 12 | react: ^18.2.0 13 | react-dom: ^18.2.0 14 | typescript: ^4.6.4 15 | unplugin-react-components: workspace:* 16 | vite: ^3.1.0 17 | vite-plugin-inspector: ^1.0.4 18 | dependencies: 19 | '@mui/material': 5.11.3_ib3m5ricvtkl2cll7qpr2f6lvq 20 | antd: 4.23.6_biqbaboplfbrettd7655fr4n2y 21 | react: 18.2.0 22 | react-dom: 18.2.0_react@18.2.0 23 | devDependencies: 24 | '@types/react': 18.0.26 25 | '@types/react-dom': 18.0.10 26 | '@vitejs/plugin-react': 3.0.1_vite@3.1.4 27 | typescript: 4.8.4 28 | unplugin-react-components: link:.. 29 | vite: 3.1.4 30 | vite-plugin-inspector: 1.0.4 31 | 32 | packages: 33 | 34 | /@ampproject/remapping/2.2.0: 35 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} 36 | engines: {node: '>=6.0.0'} 37 | dependencies: 38 | '@jridgewell/gen-mapping': 0.1.1 39 | '@jridgewell/trace-mapping': 0.3.17 40 | dev: true 41 | 42 | /@ant-design/colors/6.0.0: 43 | resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} 44 | dependencies: 45 | '@ctrl/tinycolor': 3.4.1 46 | dev: false 47 | 48 | /@ant-design/icons-svg/4.2.1: 49 | resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==} 50 | dev: false 51 | 52 | /@ant-design/icons/4.7.0_biqbaboplfbrettd7655fr4n2y: 53 | resolution: {integrity: sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==} 54 | engines: {node: '>=8'} 55 | peerDependencies: 56 | react: '>=16.0.0' 57 | react-dom: '>=16.0.0' 58 | dependencies: 59 | '@ant-design/colors': 6.0.0 60 | '@ant-design/icons-svg': 4.2.1 61 | '@babel/runtime': 7.19.4 62 | classnames: 2.3.2 63 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 64 | react: 18.2.0 65 | react-dom: 18.2.0_react@18.2.0 66 | dev: false 67 | 68 | /@ant-design/react-slick/0.29.2_react@18.2.0: 69 | resolution: {integrity: sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==} 70 | peerDependencies: 71 | react: '>=16.9.0' 72 | dependencies: 73 | '@babel/runtime': 7.19.4 74 | classnames: 2.3.2 75 | json2mq: 0.2.0 76 | lodash: 4.17.21 77 | react: 18.2.0 78 | resize-observer-polyfill: 1.5.1 79 | dev: false 80 | 81 | /@babel/code-frame/7.18.6: 82 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} 83 | engines: {node: '>=6.9.0'} 84 | dependencies: 85 | '@babel/highlight': 7.18.6 86 | dev: true 87 | 88 | /@babel/compat-data/7.20.10: 89 | resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} 90 | engines: {node: '>=6.9.0'} 91 | dev: true 92 | 93 | /@babel/core/7.20.12: 94 | resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} 95 | engines: {node: '>=6.9.0'} 96 | dependencies: 97 | '@ampproject/remapping': 2.2.0 98 | '@babel/code-frame': 7.18.6 99 | '@babel/generator': 7.20.7 100 | '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 101 | '@babel/helper-module-transforms': 7.20.11 102 | '@babel/helpers': 7.20.7 103 | '@babel/parser': 7.20.7 104 | '@babel/template': 7.20.7 105 | '@babel/traverse': 7.20.12 106 | '@babel/types': 7.20.7 107 | convert-source-map: 1.9.0 108 | debug: 4.3.4 109 | gensync: 1.0.0-beta.2 110 | json5: 2.2.3 111 | semver: 6.3.0 112 | transitivePeerDependencies: 113 | - supports-color 114 | dev: true 115 | 116 | /@babel/generator/7.20.7: 117 | resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} 118 | engines: {node: '>=6.9.0'} 119 | dependencies: 120 | '@babel/types': 7.20.7 121 | '@jridgewell/gen-mapping': 0.3.2 122 | jsesc: 2.5.2 123 | dev: true 124 | 125 | /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: 126 | resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} 127 | engines: {node: '>=6.9.0'} 128 | peerDependencies: 129 | '@babel/core': ^7.0.0 130 | dependencies: 131 | '@babel/compat-data': 7.20.10 132 | '@babel/core': 7.20.12 133 | '@babel/helper-validator-option': 7.18.6 134 | browserslist: 4.21.4 135 | lru-cache: 5.1.1 136 | semver: 6.3.0 137 | dev: true 138 | 139 | /@babel/helper-environment-visitor/7.18.9: 140 | resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} 141 | engines: {node: '>=6.9.0'} 142 | dev: true 143 | 144 | /@babel/helper-function-name/7.19.0: 145 | resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} 146 | engines: {node: '>=6.9.0'} 147 | dependencies: 148 | '@babel/template': 7.20.7 149 | '@babel/types': 7.20.7 150 | dev: true 151 | 152 | /@babel/helper-hoist-variables/7.18.6: 153 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} 154 | engines: {node: '>=6.9.0'} 155 | dependencies: 156 | '@babel/types': 7.20.7 157 | dev: true 158 | 159 | /@babel/helper-module-imports/7.18.6: 160 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 161 | engines: {node: '>=6.9.0'} 162 | dependencies: 163 | '@babel/types': 7.20.7 164 | dev: true 165 | 166 | /@babel/helper-module-transforms/7.20.11: 167 | resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/helper-environment-visitor': 7.18.9 171 | '@babel/helper-module-imports': 7.18.6 172 | '@babel/helper-simple-access': 7.20.2 173 | '@babel/helper-split-export-declaration': 7.18.6 174 | '@babel/helper-validator-identifier': 7.19.1 175 | '@babel/template': 7.20.7 176 | '@babel/traverse': 7.20.12 177 | '@babel/types': 7.20.7 178 | transitivePeerDependencies: 179 | - supports-color 180 | dev: true 181 | 182 | /@babel/helper-plugin-utils/7.20.2: 183 | resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} 184 | engines: {node: '>=6.9.0'} 185 | dev: true 186 | 187 | /@babel/helper-simple-access/7.20.2: 188 | resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} 189 | engines: {node: '>=6.9.0'} 190 | dependencies: 191 | '@babel/types': 7.20.7 192 | dev: true 193 | 194 | /@babel/helper-split-export-declaration/7.18.6: 195 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} 196 | engines: {node: '>=6.9.0'} 197 | dependencies: 198 | '@babel/types': 7.20.7 199 | dev: true 200 | 201 | /@babel/helper-string-parser/7.19.4: 202 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 203 | engines: {node: '>=6.9.0'} 204 | dev: true 205 | 206 | /@babel/helper-validator-identifier/7.19.1: 207 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 208 | engines: {node: '>=6.9.0'} 209 | dev: true 210 | 211 | /@babel/helper-validator-option/7.18.6: 212 | resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} 213 | engines: {node: '>=6.9.0'} 214 | dev: true 215 | 216 | /@babel/helpers/7.20.7: 217 | resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} 218 | engines: {node: '>=6.9.0'} 219 | dependencies: 220 | '@babel/template': 7.20.7 221 | '@babel/traverse': 7.20.12 222 | '@babel/types': 7.20.7 223 | transitivePeerDependencies: 224 | - supports-color 225 | dev: true 226 | 227 | /@babel/highlight/7.18.6: 228 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} 229 | engines: {node: '>=6.9.0'} 230 | dependencies: 231 | '@babel/helper-validator-identifier': 7.19.1 232 | chalk: 2.4.2 233 | js-tokens: 4.0.0 234 | dev: true 235 | 236 | /@babel/parser/7.20.7: 237 | resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} 238 | engines: {node: '>=6.0.0'} 239 | hasBin: true 240 | dependencies: 241 | '@babel/types': 7.20.7 242 | dev: true 243 | 244 | /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.12: 245 | resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} 246 | engines: {node: '>=6.9.0'} 247 | peerDependencies: 248 | '@babel/core': ^7.0.0-0 249 | dependencies: 250 | '@babel/core': 7.20.12 251 | '@babel/helper-plugin-utils': 7.20.2 252 | dev: true 253 | 254 | /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.12: 255 | resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} 256 | engines: {node: '>=6.9.0'} 257 | peerDependencies: 258 | '@babel/core': ^7.0.0-0 259 | dependencies: 260 | '@babel/core': 7.20.12 261 | '@babel/helper-plugin-utils': 7.20.2 262 | dev: true 263 | 264 | /@babel/runtime/7.19.4: 265 | resolution: {integrity: sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==} 266 | engines: {node: '>=6.9.0'} 267 | dependencies: 268 | regenerator-runtime: 0.13.10 269 | dev: false 270 | 271 | /@babel/runtime/7.20.7: 272 | resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} 273 | engines: {node: '>=6.9.0'} 274 | dependencies: 275 | regenerator-runtime: 0.13.11 276 | dev: false 277 | 278 | /@babel/template/7.20.7: 279 | resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} 280 | engines: {node: '>=6.9.0'} 281 | dependencies: 282 | '@babel/code-frame': 7.18.6 283 | '@babel/parser': 7.20.7 284 | '@babel/types': 7.20.7 285 | dev: true 286 | 287 | /@babel/traverse/7.20.12: 288 | resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==} 289 | engines: {node: '>=6.9.0'} 290 | dependencies: 291 | '@babel/code-frame': 7.18.6 292 | '@babel/generator': 7.20.7 293 | '@babel/helper-environment-visitor': 7.18.9 294 | '@babel/helper-function-name': 7.19.0 295 | '@babel/helper-hoist-variables': 7.18.6 296 | '@babel/helper-split-export-declaration': 7.18.6 297 | '@babel/parser': 7.20.7 298 | '@babel/types': 7.20.7 299 | debug: 4.3.4 300 | globals: 11.12.0 301 | transitivePeerDependencies: 302 | - supports-color 303 | dev: true 304 | 305 | /@babel/types/7.20.7: 306 | resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} 307 | engines: {node: '>=6.9.0'} 308 | dependencies: 309 | '@babel/helper-string-parser': 7.19.4 310 | '@babel/helper-validator-identifier': 7.19.1 311 | to-fast-properties: 2.0.0 312 | dev: true 313 | 314 | /@ctrl/tinycolor/3.4.1: 315 | resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==} 316 | engines: {node: '>=10'} 317 | dev: false 318 | 319 | /@emotion/cache/11.10.5: 320 | resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} 321 | dependencies: 322 | '@emotion/memoize': 0.8.0 323 | '@emotion/sheet': 1.2.1 324 | '@emotion/utils': 1.2.0 325 | '@emotion/weak-memoize': 0.3.0 326 | stylis: 4.1.3 327 | dev: false 328 | 329 | /@emotion/is-prop-valid/1.2.0: 330 | resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} 331 | dependencies: 332 | '@emotion/memoize': 0.8.0 333 | dev: false 334 | 335 | /@emotion/memoize/0.8.0: 336 | resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} 337 | dev: false 338 | 339 | /@emotion/sheet/1.2.1: 340 | resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} 341 | dev: false 342 | 343 | /@emotion/utils/1.2.0: 344 | resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} 345 | dev: false 346 | 347 | /@emotion/weak-memoize/0.3.0: 348 | resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} 349 | dev: false 350 | 351 | /@esbuild/android-arm/0.15.10: 352 | resolution: {integrity: sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==} 353 | engines: {node: '>=12'} 354 | cpu: [arm] 355 | os: [android] 356 | requiresBuild: true 357 | dev: true 358 | optional: true 359 | 360 | /@esbuild/linux-loong64/0.15.10: 361 | resolution: {integrity: sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==} 362 | engines: {node: '>=12'} 363 | cpu: [loong64] 364 | os: [linux] 365 | requiresBuild: true 366 | dev: true 367 | optional: true 368 | 369 | /@jridgewell/gen-mapping/0.1.1: 370 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} 371 | engines: {node: '>=6.0.0'} 372 | dependencies: 373 | '@jridgewell/set-array': 1.1.2 374 | '@jridgewell/sourcemap-codec': 1.4.14 375 | dev: true 376 | 377 | /@jridgewell/gen-mapping/0.3.2: 378 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} 379 | engines: {node: '>=6.0.0'} 380 | dependencies: 381 | '@jridgewell/set-array': 1.1.2 382 | '@jridgewell/sourcemap-codec': 1.4.14 383 | '@jridgewell/trace-mapping': 0.3.17 384 | dev: true 385 | 386 | /@jridgewell/resolve-uri/3.1.0: 387 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 388 | engines: {node: '>=6.0.0'} 389 | dev: true 390 | 391 | /@jridgewell/set-array/1.1.2: 392 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 393 | engines: {node: '>=6.0.0'} 394 | dev: true 395 | 396 | /@jridgewell/sourcemap-codec/1.4.14: 397 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 398 | dev: true 399 | 400 | /@jridgewell/trace-mapping/0.3.17: 401 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 402 | dependencies: 403 | '@jridgewell/resolve-uri': 3.1.0 404 | '@jridgewell/sourcemap-codec': 1.4.14 405 | dev: true 406 | 407 | /@mui/base/5.0.0-alpha.112_ib3m5ricvtkl2cll7qpr2f6lvq: 408 | resolution: {integrity: sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ==} 409 | engines: {node: '>=12.0.0'} 410 | peerDependencies: 411 | '@types/react': ^17.0.0 || ^18.0.0 412 | react: ^17.0.0 || ^18.0.0 413 | react-dom: ^17.0.0 || ^18.0.0 414 | peerDependenciesMeta: 415 | '@types/react': 416 | optional: true 417 | dependencies: 418 | '@babel/runtime': 7.20.7 419 | '@emotion/is-prop-valid': 1.2.0 420 | '@mui/types': 7.2.3_@types+react@18.0.26 421 | '@mui/utils': 5.11.2_react@18.2.0 422 | '@popperjs/core': 2.11.6 423 | '@types/react': 18.0.26 424 | clsx: 1.2.1 425 | prop-types: 15.8.1 426 | react: 18.2.0 427 | react-dom: 18.2.0_react@18.2.0 428 | react-is: 18.2.0 429 | dev: false 430 | 431 | /@mui/core-downloads-tracker/5.11.3: 432 | resolution: {integrity: sha512-Bgb6//KtxY7IC7M5Pa5RKFX1wttc213mqpKqydnz3wn4BGDXfA5c0vf5nTu5zqsJeB4T3ysAJTRJhQ/E1GsZDQ==} 433 | dev: false 434 | 435 | /@mui/material/5.11.3_ib3m5ricvtkl2cll7qpr2f6lvq: 436 | resolution: {integrity: sha512-Oz+rMFiMtxzzDLUxKyyj4mSxF9ShmsBoJ9qvglXCYqklgSrEl1R/Z4hfPZ+2pWd5CriO8U/0CFHr4DksrlTiCw==} 437 | engines: {node: '>=12.0.0'} 438 | peerDependencies: 439 | '@emotion/react': ^11.5.0 440 | '@emotion/styled': ^11.3.0 441 | '@types/react': ^17.0.0 || ^18.0.0 442 | react: ^17.0.0 || ^18.0.0 443 | react-dom: ^17.0.0 || ^18.0.0 444 | peerDependenciesMeta: 445 | '@emotion/react': 446 | optional: true 447 | '@emotion/styled': 448 | optional: true 449 | '@types/react': 450 | optional: true 451 | dependencies: 452 | '@babel/runtime': 7.20.7 453 | '@mui/base': 5.0.0-alpha.112_ib3m5ricvtkl2cll7qpr2f6lvq 454 | '@mui/core-downloads-tracker': 5.11.3 455 | '@mui/system': 5.11.2_kzbn2opkn2327fwg5yzwzya5o4 456 | '@mui/types': 7.2.3_@types+react@18.0.26 457 | '@mui/utils': 5.11.2_react@18.2.0 458 | '@types/react': 18.0.26 459 | '@types/react-transition-group': 4.4.5 460 | clsx: 1.2.1 461 | csstype: 3.1.1 462 | prop-types: 15.8.1 463 | react: 18.2.0 464 | react-dom: 18.2.0_react@18.2.0 465 | react-is: 18.2.0 466 | react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y 467 | dev: false 468 | 469 | /@mui/private-theming/5.11.2_kzbn2opkn2327fwg5yzwzya5o4: 470 | resolution: {integrity: sha512-qZwMaqRFPwlYmqwVKblKBGKtIjJRAj3nsvX93pOmatsXyorW7N/0IPE/swPgz1VwChXhHO75DwBEx8tB+aRMNg==} 471 | engines: {node: '>=12.0.0'} 472 | peerDependencies: 473 | '@types/react': ^17.0.0 || ^18.0.0 474 | react: ^17.0.0 || ^18.0.0 475 | peerDependenciesMeta: 476 | '@types/react': 477 | optional: true 478 | dependencies: 479 | '@babel/runtime': 7.20.7 480 | '@mui/utils': 5.11.2_react@18.2.0 481 | '@types/react': 18.0.26 482 | prop-types: 15.8.1 483 | react: 18.2.0 484 | dev: false 485 | 486 | /@mui/styled-engine/5.11.0_react@18.2.0: 487 | resolution: {integrity: sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==} 488 | engines: {node: '>=12.0.0'} 489 | peerDependencies: 490 | '@emotion/react': ^11.4.1 491 | '@emotion/styled': ^11.3.0 492 | react: ^17.0.0 || ^18.0.0 493 | peerDependenciesMeta: 494 | '@emotion/react': 495 | optional: true 496 | '@emotion/styled': 497 | optional: true 498 | dependencies: 499 | '@babel/runtime': 7.20.7 500 | '@emotion/cache': 11.10.5 501 | csstype: 3.1.1 502 | prop-types: 15.8.1 503 | react: 18.2.0 504 | dev: false 505 | 506 | /@mui/system/5.11.2_kzbn2opkn2327fwg5yzwzya5o4: 507 | resolution: {integrity: sha512-PPkYhrcP2MkhscX6SauIl0wPgra0w1LGPtll+hIKc2Z2JbGRSrUCFif93kxejB7I1cAoCay9jWW4mnNhsOqF/g==} 508 | engines: {node: '>=12.0.0'} 509 | peerDependencies: 510 | '@emotion/react': ^11.5.0 511 | '@emotion/styled': ^11.3.0 512 | '@types/react': ^17.0.0 || ^18.0.0 513 | react: ^17.0.0 || ^18.0.0 514 | peerDependenciesMeta: 515 | '@emotion/react': 516 | optional: true 517 | '@emotion/styled': 518 | optional: true 519 | '@types/react': 520 | optional: true 521 | dependencies: 522 | '@babel/runtime': 7.20.7 523 | '@mui/private-theming': 5.11.2_kzbn2opkn2327fwg5yzwzya5o4 524 | '@mui/styled-engine': 5.11.0_react@18.2.0 525 | '@mui/types': 7.2.3_@types+react@18.0.26 526 | '@mui/utils': 5.11.2_react@18.2.0 527 | '@types/react': 18.0.26 528 | clsx: 1.2.1 529 | csstype: 3.1.1 530 | prop-types: 15.8.1 531 | react: 18.2.0 532 | dev: false 533 | 534 | /@mui/types/7.2.3_@types+react@18.0.26: 535 | resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==} 536 | peerDependencies: 537 | '@types/react': '*' 538 | peerDependenciesMeta: 539 | '@types/react': 540 | optional: true 541 | dependencies: 542 | '@types/react': 18.0.26 543 | dev: false 544 | 545 | /@mui/utils/5.11.2_react@18.2.0: 546 | resolution: {integrity: sha512-AyizuHHlGdAtH5hOOXBW3kriuIwUIKUIgg0P7LzMvzf6jPhoQbENYqY6zJqfoZ7fAWMNNYT8mgN5EftNGzwE2w==} 547 | engines: {node: '>=12.0.0'} 548 | peerDependencies: 549 | react: ^17.0.0 || ^18.0.0 550 | dependencies: 551 | '@babel/runtime': 7.20.7 552 | '@types/prop-types': 15.7.5 553 | '@types/react-is': 17.0.3 554 | prop-types: 15.8.1 555 | react: 18.2.0 556 | react-is: 18.2.0 557 | dev: false 558 | 559 | /@popperjs/core/2.11.6: 560 | resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} 561 | dev: false 562 | 563 | /@types/prop-types/15.7.5: 564 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 565 | 566 | /@types/react-dom/18.0.10: 567 | resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} 568 | dependencies: 569 | '@types/react': 18.0.26 570 | dev: true 571 | 572 | /@types/react-is/17.0.3: 573 | resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} 574 | dependencies: 575 | '@types/react': 18.0.26 576 | dev: false 577 | 578 | /@types/react-transition-group/4.4.5: 579 | resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} 580 | dependencies: 581 | '@types/react': 18.0.26 582 | dev: false 583 | 584 | /@types/react/18.0.26: 585 | resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} 586 | dependencies: 587 | '@types/prop-types': 15.7.5 588 | '@types/scheduler': 0.16.2 589 | csstype: 3.1.1 590 | 591 | /@types/scheduler/0.16.2: 592 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} 593 | 594 | /@vitejs/plugin-react/3.0.1_vite@3.1.4: 595 | resolution: {integrity: sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==} 596 | engines: {node: ^14.18.0 || >=16.0.0} 597 | peerDependencies: 598 | vite: ^4.0.0 599 | dependencies: 600 | '@babel/core': 7.20.12 601 | '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.12 602 | '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12 603 | magic-string: 0.27.0 604 | react-refresh: 0.14.0 605 | vite: 3.1.4 606 | transitivePeerDependencies: 607 | - supports-color 608 | dev: true 609 | 610 | /ansi-styles/3.2.1: 611 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 612 | engines: {node: '>=4'} 613 | dependencies: 614 | color-convert: 1.9.3 615 | dev: true 616 | 617 | /antd/4.23.6_biqbaboplfbrettd7655fr4n2y: 618 | resolution: {integrity: sha512-AYH57cWBDe1ChtbnvG8i9dpKG4WnjE3AG0zIKpXByFNnxsr4saV6/19ihE8/ImSGpohN4E2zTXmo7R5/MyVRKQ==} 619 | peerDependencies: 620 | react: '>=16.9.0' 621 | react-dom: '>=16.9.0' 622 | dependencies: 623 | '@ant-design/colors': 6.0.0 624 | '@ant-design/icons': 4.7.0_biqbaboplfbrettd7655fr4n2y 625 | '@ant-design/react-slick': 0.29.2_react@18.2.0 626 | '@babel/runtime': 7.19.4 627 | '@ctrl/tinycolor': 3.4.1 628 | classnames: 2.3.2 629 | copy-to-clipboard: 3.3.2 630 | lodash: 4.17.21 631 | memoize-one: 6.0.0 632 | moment: 2.29.4 633 | rc-cascader: 3.7.0_biqbaboplfbrettd7655fr4n2y 634 | rc-checkbox: 2.3.2_biqbaboplfbrettd7655fr4n2y 635 | rc-collapse: 3.3.1_biqbaboplfbrettd7655fr4n2y 636 | rc-dialog: 8.9.0_biqbaboplfbrettd7655fr4n2y 637 | rc-drawer: 5.1.0_biqbaboplfbrettd7655fr4n2y 638 | rc-dropdown: 4.0.1_biqbaboplfbrettd7655fr4n2y 639 | rc-field-form: 1.27.3_biqbaboplfbrettd7655fr4n2y 640 | rc-image: 5.7.1_biqbaboplfbrettd7655fr4n2y 641 | rc-input: 0.1.3_biqbaboplfbrettd7655fr4n2y 642 | rc-input-number: 7.3.9_biqbaboplfbrettd7655fr4n2y 643 | rc-mentions: 1.10.0_biqbaboplfbrettd7655fr4n2y 644 | rc-menu: 9.6.4_biqbaboplfbrettd7655fr4n2y 645 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 646 | rc-notification: 4.6.0_biqbaboplfbrettd7655fr4n2y 647 | rc-pagination: 3.1.17_biqbaboplfbrettd7655fr4n2y 648 | rc-picker: 2.6.11_biqbaboplfbrettd7655fr4n2y 649 | rc-progress: 3.3.3_biqbaboplfbrettd7655fr4n2y 650 | rc-rate: 2.9.2_biqbaboplfbrettd7655fr4n2y 651 | rc-resize-observer: 1.2.0_biqbaboplfbrettd7655fr4n2y 652 | rc-segmented: 2.1.0_biqbaboplfbrettd7655fr4n2y 653 | rc-select: 14.1.13_biqbaboplfbrettd7655fr4n2y 654 | rc-slider: 10.0.1_biqbaboplfbrettd7655fr4n2y 655 | rc-steps: 4.1.4_biqbaboplfbrettd7655fr4n2y 656 | rc-switch: 3.2.2_biqbaboplfbrettd7655fr4n2y 657 | rc-table: 7.26.0_biqbaboplfbrettd7655fr4n2y 658 | rc-tabs: 12.2.1_biqbaboplfbrettd7655fr4n2y 659 | rc-textarea: 0.4.5_biqbaboplfbrettd7655fr4n2y 660 | rc-tooltip: 5.2.2_biqbaboplfbrettd7655fr4n2y 661 | rc-tree: 5.7.0_biqbaboplfbrettd7655fr4n2y 662 | rc-tree-select: 5.5.3_biqbaboplfbrettd7655fr4n2y 663 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 664 | rc-upload: 4.3.4_biqbaboplfbrettd7655fr4n2y 665 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 666 | react: 18.2.0 667 | react-dom: 18.2.0_react@18.2.0 668 | scroll-into-view-if-needed: 2.2.29 669 | dev: false 670 | 671 | /array-tree-filter/2.1.0: 672 | resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} 673 | dev: false 674 | 675 | /async-validator/4.2.5: 676 | resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} 677 | dev: false 678 | 679 | /browserslist/4.21.4: 680 | resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} 681 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 682 | hasBin: true 683 | dependencies: 684 | caniuse-lite: 1.0.30001442 685 | electron-to-chromium: 1.4.284 686 | node-releases: 2.0.8 687 | update-browserslist-db: 1.0.10_browserslist@4.21.4 688 | dev: true 689 | 690 | /caniuse-lite/1.0.30001442: 691 | resolution: {integrity: sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==} 692 | dev: true 693 | 694 | /chalk/2.4.2: 695 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 696 | engines: {node: '>=4'} 697 | dependencies: 698 | ansi-styles: 3.2.1 699 | escape-string-regexp: 1.0.5 700 | supports-color: 5.5.0 701 | dev: true 702 | 703 | /classnames/2.3.2: 704 | resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} 705 | dev: false 706 | 707 | /clsx/1.2.1: 708 | resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} 709 | engines: {node: '>=6'} 710 | dev: false 711 | 712 | /color-convert/1.9.3: 713 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 714 | dependencies: 715 | color-name: 1.1.3 716 | dev: true 717 | 718 | /color-name/1.1.3: 719 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 720 | dev: true 721 | 722 | /compute-scroll-into-view/1.0.17: 723 | resolution: {integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==} 724 | dev: false 725 | 726 | /convert-source-map/1.9.0: 727 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 728 | dev: true 729 | 730 | /copy-to-clipboard/3.3.2: 731 | resolution: {integrity: sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==} 732 | dependencies: 733 | toggle-selection: 1.0.6 734 | dev: false 735 | 736 | /csstype/3.1.1: 737 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 738 | 739 | /date-fns/2.29.3: 740 | resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} 741 | engines: {node: '>=0.11'} 742 | dev: false 743 | 744 | /dayjs/1.11.6: 745 | resolution: {integrity: sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==} 746 | dev: false 747 | 748 | /debug/4.3.4: 749 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 750 | engines: {node: '>=6.0'} 751 | peerDependencies: 752 | supports-color: '*' 753 | peerDependenciesMeta: 754 | supports-color: 755 | optional: true 756 | dependencies: 757 | ms: 2.1.2 758 | dev: true 759 | 760 | /dom-align/1.12.3: 761 | resolution: {integrity: sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==} 762 | dev: false 763 | 764 | /dom-helpers/5.2.1: 765 | resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} 766 | dependencies: 767 | '@babel/runtime': 7.20.7 768 | csstype: 3.1.1 769 | dev: false 770 | 771 | /electron-to-chromium/1.4.284: 772 | resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} 773 | dev: true 774 | 775 | /esbuild-android-64/0.15.10: 776 | resolution: {integrity: sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==} 777 | engines: {node: '>=12'} 778 | cpu: [x64] 779 | os: [android] 780 | requiresBuild: true 781 | dev: true 782 | optional: true 783 | 784 | /esbuild-android-arm64/0.15.10: 785 | resolution: {integrity: sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==} 786 | engines: {node: '>=12'} 787 | cpu: [arm64] 788 | os: [android] 789 | requiresBuild: true 790 | dev: true 791 | optional: true 792 | 793 | /esbuild-darwin-64/0.15.10: 794 | resolution: {integrity: sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==} 795 | engines: {node: '>=12'} 796 | cpu: [x64] 797 | os: [darwin] 798 | requiresBuild: true 799 | dev: true 800 | optional: true 801 | 802 | /esbuild-darwin-arm64/0.15.10: 803 | resolution: {integrity: sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==} 804 | engines: {node: '>=12'} 805 | cpu: [arm64] 806 | os: [darwin] 807 | requiresBuild: true 808 | dev: true 809 | optional: true 810 | 811 | /esbuild-freebsd-64/0.15.10: 812 | resolution: {integrity: sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==} 813 | engines: {node: '>=12'} 814 | cpu: [x64] 815 | os: [freebsd] 816 | requiresBuild: true 817 | dev: true 818 | optional: true 819 | 820 | /esbuild-freebsd-arm64/0.15.10: 821 | resolution: {integrity: sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==} 822 | engines: {node: '>=12'} 823 | cpu: [arm64] 824 | os: [freebsd] 825 | requiresBuild: true 826 | dev: true 827 | optional: true 828 | 829 | /esbuild-linux-32/0.15.10: 830 | resolution: {integrity: sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==} 831 | engines: {node: '>=12'} 832 | cpu: [ia32] 833 | os: [linux] 834 | requiresBuild: true 835 | dev: true 836 | optional: true 837 | 838 | /esbuild-linux-64/0.15.10: 839 | resolution: {integrity: sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==} 840 | engines: {node: '>=12'} 841 | cpu: [x64] 842 | os: [linux] 843 | requiresBuild: true 844 | dev: true 845 | optional: true 846 | 847 | /esbuild-linux-arm/0.15.10: 848 | resolution: {integrity: sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==} 849 | engines: {node: '>=12'} 850 | cpu: [arm] 851 | os: [linux] 852 | requiresBuild: true 853 | dev: true 854 | optional: true 855 | 856 | /esbuild-linux-arm64/0.15.10: 857 | resolution: {integrity: sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==} 858 | engines: {node: '>=12'} 859 | cpu: [arm64] 860 | os: [linux] 861 | requiresBuild: true 862 | dev: true 863 | optional: true 864 | 865 | /esbuild-linux-mips64le/0.15.10: 866 | resolution: {integrity: sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==} 867 | engines: {node: '>=12'} 868 | cpu: [mips64el] 869 | os: [linux] 870 | requiresBuild: true 871 | dev: true 872 | optional: true 873 | 874 | /esbuild-linux-ppc64le/0.15.10: 875 | resolution: {integrity: sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==} 876 | engines: {node: '>=12'} 877 | cpu: [ppc64] 878 | os: [linux] 879 | requiresBuild: true 880 | dev: true 881 | optional: true 882 | 883 | /esbuild-linux-riscv64/0.15.10: 884 | resolution: {integrity: sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==} 885 | engines: {node: '>=12'} 886 | cpu: [riscv64] 887 | os: [linux] 888 | requiresBuild: true 889 | dev: true 890 | optional: true 891 | 892 | /esbuild-linux-s390x/0.15.10: 893 | resolution: {integrity: sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==} 894 | engines: {node: '>=12'} 895 | cpu: [s390x] 896 | os: [linux] 897 | requiresBuild: true 898 | dev: true 899 | optional: true 900 | 901 | /esbuild-netbsd-64/0.15.10: 902 | resolution: {integrity: sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==} 903 | engines: {node: '>=12'} 904 | cpu: [x64] 905 | os: [netbsd] 906 | requiresBuild: true 907 | dev: true 908 | optional: true 909 | 910 | /esbuild-openbsd-64/0.15.10: 911 | resolution: {integrity: sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==} 912 | engines: {node: '>=12'} 913 | cpu: [x64] 914 | os: [openbsd] 915 | requiresBuild: true 916 | dev: true 917 | optional: true 918 | 919 | /esbuild-sunos-64/0.15.10: 920 | resolution: {integrity: sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==} 921 | engines: {node: '>=12'} 922 | cpu: [x64] 923 | os: [sunos] 924 | requiresBuild: true 925 | dev: true 926 | optional: true 927 | 928 | /esbuild-windows-32/0.15.10: 929 | resolution: {integrity: sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==} 930 | engines: {node: '>=12'} 931 | cpu: [ia32] 932 | os: [win32] 933 | requiresBuild: true 934 | dev: true 935 | optional: true 936 | 937 | /esbuild-windows-64/0.15.10: 938 | resolution: {integrity: sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==} 939 | engines: {node: '>=12'} 940 | cpu: [x64] 941 | os: [win32] 942 | requiresBuild: true 943 | dev: true 944 | optional: true 945 | 946 | /esbuild-windows-arm64/0.15.10: 947 | resolution: {integrity: sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==} 948 | engines: {node: '>=12'} 949 | cpu: [arm64] 950 | os: [win32] 951 | requiresBuild: true 952 | dev: true 953 | optional: true 954 | 955 | /esbuild/0.15.10: 956 | resolution: {integrity: sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==} 957 | engines: {node: '>=12'} 958 | hasBin: true 959 | requiresBuild: true 960 | optionalDependencies: 961 | '@esbuild/android-arm': 0.15.10 962 | '@esbuild/linux-loong64': 0.15.10 963 | esbuild-android-64: 0.15.10 964 | esbuild-android-arm64: 0.15.10 965 | esbuild-darwin-64: 0.15.10 966 | esbuild-darwin-arm64: 0.15.10 967 | esbuild-freebsd-64: 0.15.10 968 | esbuild-freebsd-arm64: 0.15.10 969 | esbuild-linux-32: 0.15.10 970 | esbuild-linux-64: 0.15.10 971 | esbuild-linux-arm: 0.15.10 972 | esbuild-linux-arm64: 0.15.10 973 | esbuild-linux-mips64le: 0.15.10 974 | esbuild-linux-ppc64le: 0.15.10 975 | esbuild-linux-riscv64: 0.15.10 976 | esbuild-linux-s390x: 0.15.10 977 | esbuild-netbsd-64: 0.15.10 978 | esbuild-openbsd-64: 0.15.10 979 | esbuild-sunos-64: 0.15.10 980 | esbuild-windows-32: 0.15.10 981 | esbuild-windows-64: 0.15.10 982 | esbuild-windows-arm64: 0.15.10 983 | dev: true 984 | 985 | /escalade/3.1.1: 986 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 987 | engines: {node: '>=6'} 988 | dev: true 989 | 990 | /escape-string-regexp/1.0.5: 991 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 992 | engines: {node: '>=0.8.0'} 993 | dev: true 994 | 995 | /fsevents/2.3.2: 996 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 997 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 998 | os: [darwin] 999 | requiresBuild: true 1000 | dev: true 1001 | optional: true 1002 | 1003 | /function-bind/1.1.1: 1004 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1005 | dev: true 1006 | 1007 | /gensync/1.0.0-beta.2: 1008 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1009 | engines: {node: '>=6.9.0'} 1010 | dev: true 1011 | 1012 | /globals/11.12.0: 1013 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1014 | engines: {node: '>=4'} 1015 | dev: true 1016 | 1017 | /has-flag/3.0.0: 1018 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1019 | engines: {node: '>=4'} 1020 | dev: true 1021 | 1022 | /has/1.0.3: 1023 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1024 | engines: {node: '>= 0.4.0'} 1025 | dependencies: 1026 | function-bind: 1.1.1 1027 | dev: true 1028 | 1029 | /is-core-module/2.10.0: 1030 | resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} 1031 | dependencies: 1032 | has: 1.0.3 1033 | dev: true 1034 | 1035 | /js-tokens/4.0.0: 1036 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1037 | 1038 | /jsesc/2.5.2: 1039 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1040 | engines: {node: '>=4'} 1041 | hasBin: true 1042 | dev: true 1043 | 1044 | /json2mq/0.2.0: 1045 | resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} 1046 | dependencies: 1047 | string-convert: 0.2.1 1048 | dev: false 1049 | 1050 | /json5/2.2.3: 1051 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1052 | engines: {node: '>=6'} 1053 | hasBin: true 1054 | dev: true 1055 | 1056 | /lodash/4.17.21: 1057 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1058 | dev: false 1059 | 1060 | /loose-envify/1.4.0: 1061 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1062 | hasBin: true 1063 | dependencies: 1064 | js-tokens: 4.0.0 1065 | dev: false 1066 | 1067 | /lru-cache/5.1.1: 1068 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1069 | dependencies: 1070 | yallist: 3.1.1 1071 | dev: true 1072 | 1073 | /magic-string/0.27.0: 1074 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 1075 | engines: {node: '>=12'} 1076 | dependencies: 1077 | '@jridgewell/sourcemap-codec': 1.4.14 1078 | dev: true 1079 | 1080 | /memoize-one/6.0.0: 1081 | resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} 1082 | dev: false 1083 | 1084 | /moment/2.29.4: 1085 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 1086 | dev: false 1087 | 1088 | /ms/2.1.2: 1089 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1090 | dev: true 1091 | 1092 | /nanoid/3.3.4: 1093 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1094 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1095 | hasBin: true 1096 | dev: true 1097 | 1098 | /node-releases/2.0.8: 1099 | resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} 1100 | dev: true 1101 | 1102 | /object-assign/4.1.1: 1103 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1104 | engines: {node: '>=0.10.0'} 1105 | dev: false 1106 | 1107 | /path-parse/1.0.7: 1108 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1109 | dev: true 1110 | 1111 | /picocolors/1.0.0: 1112 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1113 | dev: true 1114 | 1115 | /postcss/8.4.17: 1116 | resolution: {integrity: sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==} 1117 | engines: {node: ^10 || ^12 || >=14} 1118 | dependencies: 1119 | nanoid: 3.3.4 1120 | picocolors: 1.0.0 1121 | source-map-js: 1.0.2 1122 | dev: true 1123 | 1124 | /postcss/8.4.21: 1125 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 1126 | engines: {node: ^10 || ^12 || >=14} 1127 | dependencies: 1128 | nanoid: 3.3.4 1129 | picocolors: 1.0.0 1130 | source-map-js: 1.0.2 1131 | dev: true 1132 | 1133 | /prop-types/15.8.1: 1134 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1135 | dependencies: 1136 | loose-envify: 1.4.0 1137 | object-assign: 4.1.1 1138 | react-is: 16.13.1 1139 | dev: false 1140 | 1141 | /rc-align/4.0.12_biqbaboplfbrettd7655fr4n2y: 1142 | resolution: {integrity: sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==} 1143 | peerDependencies: 1144 | react: '>=16.9.0' 1145 | react-dom: '>=16.9.0' 1146 | dependencies: 1147 | '@babel/runtime': 7.19.4 1148 | classnames: 2.3.2 1149 | dom-align: 1.12.3 1150 | lodash: 4.17.21 1151 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1152 | react: 18.2.0 1153 | react-dom: 18.2.0_react@18.2.0 1154 | resize-observer-polyfill: 1.5.1 1155 | dev: false 1156 | 1157 | /rc-cascader/3.7.0_biqbaboplfbrettd7655fr4n2y: 1158 | resolution: {integrity: sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==} 1159 | peerDependencies: 1160 | react: '>=16.9.0' 1161 | react-dom: '>=16.9.0' 1162 | dependencies: 1163 | '@babel/runtime': 7.19.4 1164 | array-tree-filter: 2.1.0 1165 | classnames: 2.3.2 1166 | rc-select: 14.1.13_biqbaboplfbrettd7655fr4n2y 1167 | rc-tree: 5.7.0_biqbaboplfbrettd7655fr4n2y 1168 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1169 | react: 18.2.0 1170 | react-dom: 18.2.0_react@18.2.0 1171 | dev: false 1172 | 1173 | /rc-checkbox/2.3.2_biqbaboplfbrettd7655fr4n2y: 1174 | resolution: {integrity: sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==} 1175 | peerDependencies: 1176 | react: '>=16.9.0' 1177 | react-dom: '>=16.9.0' 1178 | dependencies: 1179 | '@babel/runtime': 7.19.4 1180 | classnames: 2.3.2 1181 | react: 18.2.0 1182 | react-dom: 18.2.0_react@18.2.0 1183 | dev: false 1184 | 1185 | /rc-collapse/3.3.1_biqbaboplfbrettd7655fr4n2y: 1186 | resolution: {integrity: sha512-cOJfcSe3R8vocrF8T+PgaHDrgeA1tX+lwfhwSj60NX9QVRidsILIbRNDLD6nAzmcvVC5PWiIRiR4S1OobxdhCg==} 1187 | peerDependencies: 1188 | react: '>=16.9.0' 1189 | react-dom: '>=16.9.0' 1190 | dependencies: 1191 | '@babel/runtime': 7.19.4 1192 | classnames: 2.3.2 1193 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1194 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1195 | react: 18.2.0 1196 | react-dom: 18.2.0_react@18.2.0 1197 | shallowequal: 1.1.0 1198 | dev: false 1199 | 1200 | /rc-dialog/8.9.0_biqbaboplfbrettd7655fr4n2y: 1201 | resolution: {integrity: sha512-Cp0tbJnrvPchJfnwIvOMWmJ4yjX3HWFatO6oBFD1jx8QkgsQCR0p8nUWAKdd3seLJhEC39/v56kZaEjwp9muoQ==} 1202 | peerDependencies: 1203 | react: '>=16.9.0' 1204 | react-dom: '>=16.9.0' 1205 | dependencies: 1206 | '@babel/runtime': 7.19.4 1207 | classnames: 2.3.2 1208 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1209 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1210 | react: 18.2.0 1211 | react-dom: 18.2.0_react@18.2.0 1212 | dev: false 1213 | 1214 | /rc-drawer/5.1.0_biqbaboplfbrettd7655fr4n2y: 1215 | resolution: {integrity: sha512-pU3Tsn99pxGdYowXehzZbdDVE+4lDXSGb7p8vA9mSmr569oc2Izh4Zw5vLKSe/Xxn2p5MSNbLVqD4tz+pK6SOw==} 1216 | peerDependencies: 1217 | react: '>=16.9.0' 1218 | react-dom: '>=16.9.0' 1219 | dependencies: 1220 | '@babel/runtime': 7.19.4 1221 | classnames: 2.3.2 1222 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1223 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1224 | react: 18.2.0 1225 | react-dom: 18.2.0_react@18.2.0 1226 | dev: false 1227 | 1228 | /rc-dropdown/4.0.1_biqbaboplfbrettd7655fr4n2y: 1229 | resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} 1230 | peerDependencies: 1231 | react: '>=16.11.0' 1232 | react-dom: '>=16.11.0' 1233 | dependencies: 1234 | '@babel/runtime': 7.19.4 1235 | classnames: 2.3.2 1236 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 1237 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1238 | react: 18.2.0 1239 | react-dom: 18.2.0_react@18.2.0 1240 | dev: false 1241 | 1242 | /rc-field-form/1.27.3_biqbaboplfbrettd7655fr4n2y: 1243 | resolution: {integrity: sha512-HGqxHnmGQgkPApEcikV4qTg3BLPC82uB/cwBDftDt1pYaqitJfSl5TFTTUMKVEJVT5RqJ2Zi68ME1HmIMX2HAw==} 1244 | engines: {node: '>=8.x'} 1245 | peerDependencies: 1246 | react: '>=16.9.0' 1247 | react-dom: '>=16.9.0' 1248 | dependencies: 1249 | '@babel/runtime': 7.19.4 1250 | async-validator: 4.2.5 1251 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1252 | react: 18.2.0 1253 | react-dom: 18.2.0_react@18.2.0 1254 | dev: false 1255 | 1256 | /rc-image/5.7.1_biqbaboplfbrettd7655fr4n2y: 1257 | resolution: {integrity: sha512-QyMfdhoUfb5W14plqXSisaYwpdstcLYnB0MjX5ccIK2rydQM9sDPuekQWu500DDGR2dBaIF5vx9XbWkNFK17Fg==} 1258 | peerDependencies: 1259 | react: '>=16.9.0' 1260 | react-dom: '>=16.9.0' 1261 | dependencies: 1262 | '@babel/runtime': 7.19.4 1263 | classnames: 2.3.2 1264 | rc-dialog: 8.9.0_biqbaboplfbrettd7655fr4n2y 1265 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1266 | react: 18.2.0 1267 | react-dom: 18.2.0_react@18.2.0 1268 | dev: false 1269 | 1270 | /rc-input-number/7.3.9_biqbaboplfbrettd7655fr4n2y: 1271 | resolution: {integrity: sha512-u0+miS+SATdb6DtssYei2JJ1WuZME+nXaG6XGtR8maNyW5uGDytfDu60OTWLQEb0Anv/AcCzehldV8CKmKyQfA==} 1272 | peerDependencies: 1273 | react: '>=16.9.0' 1274 | react-dom: '>=16.9.0' 1275 | dependencies: 1276 | '@babel/runtime': 7.19.4 1277 | classnames: 2.3.2 1278 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1279 | react: 18.2.0 1280 | react-dom: 18.2.0_react@18.2.0 1281 | dev: false 1282 | 1283 | /rc-input/0.1.3_biqbaboplfbrettd7655fr4n2y: 1284 | resolution: {integrity: sha512-FgW80AtNA3qTc++BPWXoBPVCGL7oSVbWxcEnBN51pBWpOqiJ6ta79EqtD/WI7k/N1SNqh+ie3GRfPmZhKOj6VQ==} 1285 | peerDependencies: 1286 | react: '>=16.0.0' 1287 | react-dom: '>=16.0.0' 1288 | dependencies: 1289 | '@babel/runtime': 7.19.4 1290 | classnames: 2.3.2 1291 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1292 | react: 18.2.0 1293 | react-dom: 18.2.0_react@18.2.0 1294 | dev: false 1295 | 1296 | /rc-mentions/1.10.0_biqbaboplfbrettd7655fr4n2y: 1297 | resolution: {integrity: sha512-oMlYWnwXSxP2NQVlgxOTzuG/u9BUc3ySY78K3/t7MNhJWpZzXTao+/Bic6tyZLuNCO89//hVQJBdaR2rnFQl6Q==} 1298 | peerDependencies: 1299 | react: '>=16.9.0' 1300 | react-dom: '>=16.9.0' 1301 | dependencies: 1302 | '@babel/runtime': 7.19.4 1303 | classnames: 2.3.2 1304 | rc-menu: 9.6.4_biqbaboplfbrettd7655fr4n2y 1305 | rc-textarea: 0.4.5_biqbaboplfbrettd7655fr4n2y 1306 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 1307 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1308 | react: 18.2.0 1309 | react-dom: 18.2.0_react@18.2.0 1310 | dev: false 1311 | 1312 | /rc-menu/9.6.4_biqbaboplfbrettd7655fr4n2y: 1313 | resolution: {integrity: sha512-6DiNAjxjVIPLZXHffXxxcyE15d4isRL7iQ1ru4MqYDH2Cqc5bW96wZOdMydFtGLyDdnmEQ9jVvdCE9yliGvzkw==} 1314 | peerDependencies: 1315 | react: '>=16.9.0' 1316 | react-dom: '>=16.9.0' 1317 | dependencies: 1318 | '@babel/runtime': 7.19.4 1319 | classnames: 2.3.2 1320 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1321 | rc-overflow: 1.2.8_biqbaboplfbrettd7655fr4n2y 1322 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 1323 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1324 | react: 18.2.0 1325 | react-dom: 18.2.0_react@18.2.0 1326 | shallowequal: 1.1.0 1327 | dev: false 1328 | 1329 | /rc-motion/2.6.2_biqbaboplfbrettd7655fr4n2y: 1330 | resolution: {integrity: sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==} 1331 | peerDependencies: 1332 | react: '>=16.9.0' 1333 | react-dom: '>=16.9.0' 1334 | dependencies: 1335 | '@babel/runtime': 7.19.4 1336 | classnames: 2.3.2 1337 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1338 | react: 18.2.0 1339 | react-dom: 18.2.0_react@18.2.0 1340 | dev: false 1341 | 1342 | /rc-notification/4.6.0_biqbaboplfbrettd7655fr4n2y: 1343 | resolution: {integrity: sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ==} 1344 | engines: {node: '>=8.x'} 1345 | peerDependencies: 1346 | react: '>=16.9.0' 1347 | react-dom: '>=16.9.0' 1348 | dependencies: 1349 | '@babel/runtime': 7.19.4 1350 | classnames: 2.3.2 1351 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1352 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1353 | react: 18.2.0 1354 | react-dom: 18.2.0_react@18.2.0 1355 | dev: false 1356 | 1357 | /rc-overflow/1.2.8_biqbaboplfbrettd7655fr4n2y: 1358 | resolution: {integrity: sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==} 1359 | peerDependencies: 1360 | react: '>=16.9.0' 1361 | react-dom: '>=16.9.0' 1362 | dependencies: 1363 | '@babel/runtime': 7.19.4 1364 | classnames: 2.3.2 1365 | rc-resize-observer: 1.2.0_biqbaboplfbrettd7655fr4n2y 1366 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1367 | react: 18.2.0 1368 | react-dom: 18.2.0_react@18.2.0 1369 | dev: false 1370 | 1371 | /rc-pagination/3.1.17_biqbaboplfbrettd7655fr4n2y: 1372 | resolution: {integrity: sha512-/BQ5UxcBnW28vFAcP2hfh+Xg15W0QZn8TWYwdCApchMH1H0CxiaUUcULP8uXcFM1TygcdKWdt3JqsL9cTAfdkQ==} 1373 | peerDependencies: 1374 | react: '>=16.9.0' 1375 | react-dom: '>=16.9.0' 1376 | dependencies: 1377 | '@babel/runtime': 7.19.4 1378 | classnames: 2.3.2 1379 | react: 18.2.0 1380 | react-dom: 18.2.0_react@18.2.0 1381 | dev: false 1382 | 1383 | /rc-picker/2.6.11_biqbaboplfbrettd7655fr4n2y: 1384 | resolution: {integrity: sha512-INJ7ULu+Kj4UgqbcqE8Q+QpMw55xFf9kkyLBHJFk0ihjJpAV4glialRfqHE7k4KX2BWYPQfpILwhwR14x2EiRQ==} 1385 | engines: {node: '>=8.x'} 1386 | peerDependencies: 1387 | react: '>=16.9.0' 1388 | react-dom: '>=16.9.0' 1389 | dependencies: 1390 | '@babel/runtime': 7.19.4 1391 | classnames: 2.3.2 1392 | date-fns: 2.29.3 1393 | dayjs: 1.11.6 1394 | moment: 2.29.4 1395 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 1396 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1397 | react: 18.2.0 1398 | react-dom: 18.2.0_react@18.2.0 1399 | shallowequal: 1.1.0 1400 | dev: false 1401 | 1402 | /rc-progress/3.3.3_biqbaboplfbrettd7655fr4n2y: 1403 | resolution: {integrity: sha512-MDVNVHzGanYtRy2KKraEaWeZLri2ZHWIRyaE1a9MQ2MuJ09m+Wxj5cfcaoaR6z5iRpHpA59YeUxAlpML8N4PJw==} 1404 | peerDependencies: 1405 | react: '>=16.9.0' 1406 | react-dom: '>=16.9.0' 1407 | dependencies: 1408 | '@babel/runtime': 7.19.4 1409 | classnames: 2.3.2 1410 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1411 | react: 18.2.0 1412 | react-dom: 18.2.0_react@18.2.0 1413 | dev: false 1414 | 1415 | /rc-rate/2.9.2_biqbaboplfbrettd7655fr4n2y: 1416 | resolution: {integrity: sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==} 1417 | engines: {node: '>=8.x'} 1418 | peerDependencies: 1419 | react: '>=16.9.0' 1420 | react-dom: '>=16.9.0' 1421 | dependencies: 1422 | '@babel/runtime': 7.19.4 1423 | classnames: 2.3.2 1424 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1425 | react: 18.2.0 1426 | react-dom: 18.2.0_react@18.2.0 1427 | dev: false 1428 | 1429 | /rc-resize-observer/1.2.0_biqbaboplfbrettd7655fr4n2y: 1430 | resolution: {integrity: sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==} 1431 | peerDependencies: 1432 | react: '>=16.9.0' 1433 | react-dom: '>=16.9.0' 1434 | dependencies: 1435 | '@babel/runtime': 7.19.4 1436 | classnames: 2.3.2 1437 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1438 | react: 18.2.0 1439 | react-dom: 18.2.0_react@18.2.0 1440 | resize-observer-polyfill: 1.5.1 1441 | dev: false 1442 | 1443 | /rc-segmented/2.1.0_biqbaboplfbrettd7655fr4n2y: 1444 | resolution: {integrity: sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==} 1445 | peerDependencies: 1446 | react: '>=16.0.0' 1447 | react-dom: '>=16.0.0' 1448 | dependencies: 1449 | '@babel/runtime': 7.19.4 1450 | classnames: 2.3.2 1451 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1452 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1453 | react: 18.2.0 1454 | react-dom: 18.2.0_react@18.2.0 1455 | dev: false 1456 | 1457 | /rc-select/14.1.13_biqbaboplfbrettd7655fr4n2y: 1458 | resolution: {integrity: sha512-WMEsC3gTwA1dbzWOdVIXDmWyidYNLq68AwvvUlRROw790uGUly0/vmqDozXrIr0QvN/A3CEULx12o+WtLCAefg==} 1459 | engines: {node: '>=8.x'} 1460 | peerDependencies: 1461 | react: '*' 1462 | react-dom: '*' 1463 | dependencies: 1464 | '@babel/runtime': 7.19.4 1465 | classnames: 2.3.2 1466 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1467 | rc-overflow: 1.2.8_biqbaboplfbrettd7655fr4n2y 1468 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 1469 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1470 | rc-virtual-list: 3.4.10_biqbaboplfbrettd7655fr4n2y 1471 | react: 18.2.0 1472 | react-dom: 18.2.0_react@18.2.0 1473 | dev: false 1474 | 1475 | /rc-slider/10.0.1_biqbaboplfbrettd7655fr4n2y: 1476 | resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==} 1477 | engines: {node: '>=8.x'} 1478 | peerDependencies: 1479 | react: '>=16.9.0' 1480 | react-dom: '>=16.9.0' 1481 | dependencies: 1482 | '@babel/runtime': 7.19.4 1483 | classnames: 2.3.2 1484 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1485 | react: 18.2.0 1486 | react-dom: 18.2.0_react@18.2.0 1487 | shallowequal: 1.1.0 1488 | dev: false 1489 | 1490 | /rc-steps/4.1.4_biqbaboplfbrettd7655fr4n2y: 1491 | resolution: {integrity: sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w==} 1492 | engines: {node: '>=8.x'} 1493 | peerDependencies: 1494 | react: '>=16.9.0' 1495 | react-dom: '>=16.9.0' 1496 | dependencies: 1497 | '@babel/runtime': 7.19.4 1498 | classnames: 2.3.2 1499 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1500 | react: 18.2.0 1501 | react-dom: 18.2.0_react@18.2.0 1502 | dev: false 1503 | 1504 | /rc-switch/3.2.2_biqbaboplfbrettd7655fr4n2y: 1505 | resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==} 1506 | peerDependencies: 1507 | react: '>=16.9.0' 1508 | react-dom: '>=16.9.0' 1509 | dependencies: 1510 | '@babel/runtime': 7.19.4 1511 | classnames: 2.3.2 1512 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1513 | react: 18.2.0 1514 | react-dom: 18.2.0_react@18.2.0 1515 | dev: false 1516 | 1517 | /rc-table/7.26.0_biqbaboplfbrettd7655fr4n2y: 1518 | resolution: {integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==} 1519 | engines: {node: '>=8.x'} 1520 | peerDependencies: 1521 | react: '>=16.9.0' 1522 | react-dom: '>=16.9.0' 1523 | dependencies: 1524 | '@babel/runtime': 7.19.4 1525 | classnames: 2.3.2 1526 | rc-resize-observer: 1.2.0_biqbaboplfbrettd7655fr4n2y 1527 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1528 | react: 18.2.0 1529 | react-dom: 18.2.0_react@18.2.0 1530 | shallowequal: 1.1.0 1531 | dev: false 1532 | 1533 | /rc-tabs/12.2.1_biqbaboplfbrettd7655fr4n2y: 1534 | resolution: {integrity: sha512-09pVv4kN8VFqp6THceEmxOW8PAShQC08hrroeVYP4Y8YBFaP1PIWdyFL01czcbyz5YZFj9flZ7aljMaAl0jLVg==} 1535 | engines: {node: '>=8.x'} 1536 | peerDependencies: 1537 | react: '>=16.9.0' 1538 | react-dom: '>=16.9.0' 1539 | dependencies: 1540 | '@babel/runtime': 7.19.4 1541 | classnames: 2.3.2 1542 | rc-dropdown: 4.0.1_biqbaboplfbrettd7655fr4n2y 1543 | rc-menu: 9.6.4_biqbaboplfbrettd7655fr4n2y 1544 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1545 | rc-resize-observer: 1.2.0_biqbaboplfbrettd7655fr4n2y 1546 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1547 | react: 18.2.0 1548 | react-dom: 18.2.0_react@18.2.0 1549 | dev: false 1550 | 1551 | /rc-textarea/0.4.5_biqbaboplfbrettd7655fr4n2y: 1552 | resolution: {integrity: sha512-WHeJRgUlloNyVgTsItMrIXwMhU6P3NmrUDkxX+JRwEpJjECsKtZNlNcXe9pHNLCaYQ3Z1cVCfsClhgDDgJ2kFQ==} 1553 | peerDependencies: 1554 | react: '>=16.9.0' 1555 | react-dom: '>=16.9.0' 1556 | dependencies: 1557 | '@babel/runtime': 7.19.4 1558 | classnames: 2.3.2 1559 | rc-resize-observer: 1.2.0_biqbaboplfbrettd7655fr4n2y 1560 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1561 | react: 18.2.0 1562 | react-dom: 18.2.0_react@18.2.0 1563 | shallowequal: 1.1.0 1564 | dev: false 1565 | 1566 | /rc-tooltip/5.2.2_biqbaboplfbrettd7655fr4n2y: 1567 | resolution: {integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==} 1568 | peerDependencies: 1569 | react: '>=16.9.0' 1570 | react-dom: '>=16.9.0' 1571 | dependencies: 1572 | '@babel/runtime': 7.19.4 1573 | classnames: 2.3.2 1574 | rc-trigger: 5.3.1_biqbaboplfbrettd7655fr4n2y 1575 | react: 18.2.0 1576 | react-dom: 18.2.0_react@18.2.0 1577 | dev: false 1578 | 1579 | /rc-tree-select/5.5.3_biqbaboplfbrettd7655fr4n2y: 1580 | resolution: {integrity: sha512-gv8KyC6J7f9e50OkGk1ibF7v8vL+iaBnA8Ep/EVlMma2/tGdBQXO9xIvPjX8eQrZL5PjoeTUndNPM3cY3721ng==} 1581 | peerDependencies: 1582 | react: '*' 1583 | react-dom: '*' 1584 | dependencies: 1585 | '@babel/runtime': 7.19.4 1586 | classnames: 2.3.2 1587 | rc-select: 14.1.13_biqbaboplfbrettd7655fr4n2y 1588 | rc-tree: 5.7.0_biqbaboplfbrettd7655fr4n2y 1589 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1590 | react: 18.2.0 1591 | react-dom: 18.2.0_react@18.2.0 1592 | dev: false 1593 | 1594 | /rc-tree/5.7.0_biqbaboplfbrettd7655fr4n2y: 1595 | resolution: {integrity: sha512-F+Ewkv/UcutshnVBMISP+lPdHDlcsL+YH/MQDVWbk+QdkfID7vXiwrHMEZn31+2Rbbm21z/HPceGS8PXGMmnQg==} 1596 | engines: {node: '>=10.x'} 1597 | peerDependencies: 1598 | react: '*' 1599 | react-dom: '*' 1600 | dependencies: 1601 | '@babel/runtime': 7.19.4 1602 | classnames: 2.3.2 1603 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1604 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1605 | rc-virtual-list: 3.4.10_biqbaboplfbrettd7655fr4n2y 1606 | react: 18.2.0 1607 | react-dom: 18.2.0_react@18.2.0 1608 | dev: false 1609 | 1610 | /rc-trigger/5.3.1_biqbaboplfbrettd7655fr4n2y: 1611 | resolution: {integrity: sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==} 1612 | engines: {node: '>=8.x'} 1613 | peerDependencies: 1614 | react: '>=16.9.0' 1615 | react-dom: '>=16.9.0' 1616 | dependencies: 1617 | '@babel/runtime': 7.19.4 1618 | classnames: 2.3.2 1619 | rc-align: 4.0.12_biqbaboplfbrettd7655fr4n2y 1620 | rc-motion: 2.6.2_biqbaboplfbrettd7655fr4n2y 1621 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1622 | react: 18.2.0 1623 | react-dom: 18.2.0_react@18.2.0 1624 | dev: false 1625 | 1626 | /rc-upload/4.3.4_biqbaboplfbrettd7655fr4n2y: 1627 | resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==} 1628 | peerDependencies: 1629 | react: '>=16.9.0' 1630 | react-dom: '>=16.9.0' 1631 | dependencies: 1632 | '@babel/runtime': 7.19.4 1633 | classnames: 2.3.2 1634 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1635 | react: 18.2.0 1636 | react-dom: 18.2.0_react@18.2.0 1637 | dev: false 1638 | 1639 | /rc-util/5.24.4_biqbaboplfbrettd7655fr4n2y: 1640 | resolution: {integrity: sha512-2a4RQnycV9eV7lVZPEJ7QwJRPlZNc06J7CwcwZo4vIHr3PfUqtYgl1EkUV9ETAc6VRRi8XZOMFhYG63whlIC9Q==} 1641 | peerDependencies: 1642 | react: '>=16.9.0' 1643 | react-dom: '>=16.9.0' 1644 | dependencies: 1645 | '@babel/runtime': 7.19.4 1646 | react: 18.2.0 1647 | react-dom: 18.2.0_react@18.2.0 1648 | react-is: 16.13.1 1649 | shallowequal: 1.1.0 1650 | dev: false 1651 | 1652 | /rc-virtual-list/3.4.10_biqbaboplfbrettd7655fr4n2y: 1653 | resolution: {integrity: sha512-Jv0cgJxJ+8F/YViW8WGs/jQF2rmT8RUcJ5uDJs5MOFLTYLAvCpM/xU+Zu6EpCun50fmovhXiItQctcfE2UY3Aw==} 1654 | engines: {node: '>=8.x'} 1655 | peerDependencies: 1656 | react: '*' 1657 | react-dom: '*' 1658 | dependencies: 1659 | classnames: 2.3.2 1660 | rc-resize-observer: 1.2.0_biqbaboplfbrettd7655fr4n2y 1661 | rc-util: 5.24.4_biqbaboplfbrettd7655fr4n2y 1662 | react: 18.2.0 1663 | react-dom: 18.2.0_react@18.2.0 1664 | dev: false 1665 | 1666 | /react-dom/18.2.0_react@18.2.0: 1667 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1668 | peerDependencies: 1669 | react: ^18.2.0 1670 | dependencies: 1671 | loose-envify: 1.4.0 1672 | react: 18.2.0 1673 | scheduler: 0.23.0 1674 | dev: false 1675 | 1676 | /react-is/16.13.1: 1677 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1678 | dev: false 1679 | 1680 | /react-is/18.2.0: 1681 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 1682 | dev: false 1683 | 1684 | /react-refresh/0.14.0: 1685 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} 1686 | engines: {node: '>=0.10.0'} 1687 | dev: true 1688 | 1689 | /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: 1690 | resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} 1691 | peerDependencies: 1692 | react: '>=16.6.0' 1693 | react-dom: '>=16.6.0' 1694 | dependencies: 1695 | '@babel/runtime': 7.20.7 1696 | dom-helpers: 5.2.1 1697 | loose-envify: 1.4.0 1698 | prop-types: 15.8.1 1699 | react: 18.2.0 1700 | react-dom: 18.2.0_react@18.2.0 1701 | dev: false 1702 | 1703 | /react/18.2.0: 1704 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1705 | engines: {node: '>=0.10.0'} 1706 | dependencies: 1707 | loose-envify: 1.4.0 1708 | dev: false 1709 | 1710 | /regenerator-runtime/0.13.10: 1711 | resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==} 1712 | dev: false 1713 | 1714 | /regenerator-runtime/0.13.11: 1715 | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} 1716 | dev: false 1717 | 1718 | /resize-observer-polyfill/1.5.1: 1719 | resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} 1720 | dev: false 1721 | 1722 | /resolve/1.22.1: 1723 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1724 | hasBin: true 1725 | dependencies: 1726 | is-core-module: 2.10.0 1727 | path-parse: 1.0.7 1728 | supports-preserve-symlinks-flag: 1.0.0 1729 | dev: true 1730 | 1731 | /rollup/2.78.1: 1732 | resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} 1733 | engines: {node: '>=10.0.0'} 1734 | hasBin: true 1735 | optionalDependencies: 1736 | fsevents: 2.3.2 1737 | dev: true 1738 | 1739 | /rollup/2.79.1: 1740 | resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} 1741 | engines: {node: '>=10.0.0'} 1742 | hasBin: true 1743 | optionalDependencies: 1744 | fsevents: 2.3.2 1745 | dev: true 1746 | 1747 | /scheduler/0.23.0: 1748 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1749 | dependencies: 1750 | loose-envify: 1.4.0 1751 | dev: false 1752 | 1753 | /scroll-into-view-if-needed/2.2.29: 1754 | resolution: {integrity: sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==} 1755 | dependencies: 1756 | compute-scroll-into-view: 1.0.17 1757 | dev: false 1758 | 1759 | /semver/6.3.0: 1760 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1761 | hasBin: true 1762 | dev: true 1763 | 1764 | /shallowequal/1.1.0: 1765 | resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} 1766 | dev: false 1767 | 1768 | /shell-quote/1.7.4: 1769 | resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} 1770 | dev: true 1771 | 1772 | /source-map-js/1.0.2: 1773 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1774 | engines: {node: '>=0.10.0'} 1775 | dev: true 1776 | 1777 | /string-convert/0.2.1: 1778 | resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} 1779 | dev: false 1780 | 1781 | /stylis/4.1.3: 1782 | resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} 1783 | dev: false 1784 | 1785 | /supports-color/5.5.0: 1786 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1787 | engines: {node: '>=4'} 1788 | dependencies: 1789 | has-flag: 3.0.0 1790 | dev: true 1791 | 1792 | /supports-preserve-symlinks-flag/1.0.0: 1793 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1794 | engines: {node: '>= 0.4'} 1795 | dev: true 1796 | 1797 | /to-fast-properties/2.0.0: 1798 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1799 | engines: {node: '>=4'} 1800 | dev: true 1801 | 1802 | /toggle-selection/1.0.6: 1803 | resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} 1804 | dev: false 1805 | 1806 | /typescript/4.8.4: 1807 | resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} 1808 | engines: {node: '>=4.2.0'} 1809 | hasBin: true 1810 | dev: true 1811 | 1812 | /update-browserslist-db/1.0.10_browserslist@4.21.4: 1813 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 1814 | hasBin: true 1815 | peerDependencies: 1816 | browserslist: '>= 4.21.0' 1817 | dependencies: 1818 | browserslist: 4.21.4 1819 | escalade: 3.1.1 1820 | picocolors: 1.0.0 1821 | dev: true 1822 | 1823 | /vite-plugin-inspector/1.0.4: 1824 | resolution: {integrity: sha512-mtMNNiIBA2mEX9+BkhyhAl91P4WcX8Zt9el3WDOFW/OEyNJ6nm+VV50rdoxNgPINPoS5Gb4dJ+7//IgvLjc3/A==} 1825 | dependencies: 1826 | shell-quote: 1.7.4 1827 | vite: 3.2.5 1828 | transitivePeerDependencies: 1829 | - '@types/node' 1830 | - less 1831 | - sass 1832 | - stylus 1833 | - sugarss 1834 | - terser 1835 | dev: true 1836 | 1837 | /vite/3.1.4: 1838 | resolution: {integrity: sha512-JoQI08aBjY9lycL7jcEq4p9o1xUjq5aRvdH4KWaXtkSx7e7RpAh9D3IjzDWRD4Fg44LS3oDAIOG/Kq1L+82psA==} 1839 | engines: {node: ^14.18.0 || >=16.0.0} 1840 | hasBin: true 1841 | peerDependencies: 1842 | less: '*' 1843 | sass: '*' 1844 | stylus: '*' 1845 | terser: ^5.4.0 1846 | peerDependenciesMeta: 1847 | less: 1848 | optional: true 1849 | sass: 1850 | optional: true 1851 | stylus: 1852 | optional: true 1853 | terser: 1854 | optional: true 1855 | dependencies: 1856 | esbuild: 0.15.10 1857 | postcss: 8.4.17 1858 | resolve: 1.22.1 1859 | rollup: 2.78.1 1860 | optionalDependencies: 1861 | fsevents: 2.3.2 1862 | dev: true 1863 | 1864 | /vite/3.2.5: 1865 | resolution: {integrity: sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==} 1866 | engines: {node: ^14.18.0 || >=16.0.0} 1867 | hasBin: true 1868 | peerDependencies: 1869 | '@types/node': '>= 14' 1870 | less: '*' 1871 | sass: '*' 1872 | stylus: '*' 1873 | sugarss: '*' 1874 | terser: ^5.4.0 1875 | peerDependenciesMeta: 1876 | '@types/node': 1877 | optional: true 1878 | less: 1879 | optional: true 1880 | sass: 1881 | optional: true 1882 | stylus: 1883 | optional: true 1884 | sugarss: 1885 | optional: true 1886 | terser: 1887 | optional: true 1888 | dependencies: 1889 | esbuild: 0.15.10 1890 | postcss: 8.4.21 1891 | resolve: 1.22.1 1892 | rollup: 2.79.1 1893 | optionalDependencies: 1894 | fsevents: 2.3.2 1895 | dev: true 1896 | 1897 | /yallist/3.1.1: 1898 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1899 | dev: true 1900 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | -'packages/**' 3 | -------------------------------------------------------------------------------- /scripts/postbuild.ts: -------------------------------------------------------------------------------- 1 | import { basename, dirname, resolve } from 'path' 2 | import { promises as fs } from 'fs' 3 | import { fileURLToPath } from 'url' 4 | import fg from 'fast-glob' 5 | import chalk from 'chalk' 6 | 7 | async function run() { 8 | // fix cjs exports 9 | const files = await fg('*.cjs', { 10 | ignore: ['chunk-*'], 11 | absolute: true, 12 | cwd: resolve(dirname(fileURLToPath(import.meta.url)), '../dist'), 13 | }) 14 | for (const file of files) { 15 | console.log(chalk.cyan.inverse(' POST '), `Fix ${basename(file)}`) 16 | let code = await fs.readFile(file, 'utf8') 17 | code = code.replace('exports.default =', 'module.exports =') 18 | code += 'exports.default = module.exports;' 19 | await fs.writeFile(file, code) 20 | } 21 | } 22 | 23 | run() 24 | -------------------------------------------------------------------------------- /src/core/generateDts.ts: -------------------------------------------------------------------------------- 1 | import { writeFileSync } from 'fs' 2 | import { relative } from 'path' 3 | import type { ComponentsContext, GenerateDtsOptions } from '../types' 4 | import { isExportComponent, slash } from './utils' 5 | import { getResolversResult } from './resolvers' 6 | 7 | function stringifyComponent(rootPath: string, component: ComponentsContext) { 8 | const related = `./${relative(rootPath, component.path)}` 9 | return `typeof import('${slash(related).replace(/\.[tj]sx$/, '')}')['${isExportComponent(component) ? component.name : 'default'}']\n` 10 | } 11 | 12 | function stringifyResolver(resolver: any) { 13 | return `typeof import('${resolver.from}')['${isExportComponent(resolver.type) ? resolver.originalName : 'default'}']\n` 14 | } 15 | 16 | export async function generateDts(options: GenerateDtsOptions) { 17 | const { 18 | components, 19 | rootPath = process.cwd(), 20 | filename = 'components', 21 | resolvers, 22 | local, 23 | } = options 24 | 25 | const resolversResult = await getResolversResult(resolvers) 26 | 27 | let dts = '/* generated by unplugin-react-components */\nexport {}\ndeclare global{\n' 28 | if (local) { 29 | components.forEach((component) => { 30 | dts += `\tconst ${component.name}: ${stringifyComponent(rootPath, component)}` 31 | }) 32 | } 33 | resolversResult?.forEach((resolver) => { 34 | resolver.forEach((item) => { 35 | dts += `\tconst ${item.name}: ${stringifyResolver(item)}` 36 | }) 37 | }) 38 | 39 | writeFileSync(`${rootPath}/${filename}.d.ts`, `${dts}}`, { encoding: 'utf-8' }) 40 | 41 | return dts 42 | } 43 | -------------------------------------------------------------------------------- /src/core/resolvers.ts: -------------------------------------------------------------------------------- 1 | import type { ResolverReturnType, Resolvers } from '../types' 2 | 3 | export const resolversType = new Set() 4 | 5 | export const getResolversResult = async (resolvers: Resolvers) => { 6 | if (!resolvers) 7 | return 8 | 9 | for (const item of resolvers) { 10 | const fn = await item 11 | if (typeof fn === 'function') 12 | resolversType.add((fn as any)()) 13 | else 14 | resolversType.add(fn) 15 | } 16 | 17 | return resolversType 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/core/resolvers/antd.ts: -------------------------------------------------------------------------------- 1 | import type { BaseResolverOptions } from '../../types' 2 | import { createResolver } from './createResolver' 3 | 4 | interface Options extends BaseResolverOptions { 5 | 6 | } 7 | 8 | export const AntdResolver = createResolver({ 9 | module: 'antd', 10 | prefix: 'Ant', 11 | style: true, 12 | }) 13 | 14 | -------------------------------------------------------------------------------- /src/core/resolvers/createResolver.ts: -------------------------------------------------------------------------------- 1 | import { importModule } from 'local-pkg' 2 | import { isCapitalCase } from '../utils' 3 | import type { BaseResolverOptions, ResolverReturnType } from '../../types' 4 | 5 | interface CreateResolverOptions { 6 | prefix: string 7 | module: string 8 | exclude?: (name: string) => boolean 9 | style?: boolean 10 | } 11 | 12 | export function createResolver( 13 | _options: CreateResolverOptions, 14 | ) { 15 | return async (options: T = {} as T) => { 16 | let prefix: string | undefined 17 | 18 | if (typeof options.prefix === 'boolean' && options.prefix) 19 | prefix = 'Ant' 20 | else if (typeof options.prefix === 'string') 21 | prefix = options.prefix 22 | 23 | const pkgs = await importModule(_options.module) 24 | 25 | const components: ResolverReturnType[] = Object.keys(pkgs) 26 | .filter((item) => { 27 | if (_options.exclude) 28 | return isCapitalCase(item) && _options.exclude(item) 29 | 30 | return isCapitalCase(item) 31 | }) 32 | .map((item) => { 33 | const component: ResolverReturnType = { 34 | name: `${typeof prefix === 'string' ? prefix : ''}${item}`, 35 | originalName: typeof prefix === 'string' ? item.replace(prefix, '') : item, 36 | from: _options.module, 37 | type: 'Export', 38 | } 39 | 40 | if (_options.style) 41 | component.style = `${_options.module}/es/${component.originalName.toLowerCase()}/style/index.css` 42 | 43 | return component 44 | }) 45 | 46 | return () => components 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/core/resolvers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './createResolver' 2 | export * from './mui' 3 | export * from './antd' 4 | -------------------------------------------------------------------------------- /src/core/resolvers/mui.ts: -------------------------------------------------------------------------------- 1 | import type { BaseResolverOptions } from '../../types' 2 | 3 | import { createResolver } from './createResolver' 4 | 5 | interface MuiResolverOptions extends BaseResolverOptions { 6 | } 7 | 8 | export const MuiResolver = createResolver({ 9 | module: '@mui/material', 10 | prefix: 'Mui', 11 | exclude: name => name !== 'FormLabelRoot', 12 | }) 13 | -------------------------------------------------------------------------------- /src/core/searchGlob.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import { resolve } from 'path' 3 | import fg from 'fast-glob' 4 | import { parse } from '@babel/parser' 5 | import type { BaseNode } from 'estree-walker' 6 | import { walk } from 'estree-walker' 7 | import type { Node } from '@babel/types' 8 | import type { Components, ComponentsContext, SearchGlobOptions } from '../types' 9 | import { slash } from './utils' 10 | 11 | export function searchGlob(options: SearchGlobOptions): Components { 12 | const { rootPath } = options 13 | 14 | const files = fg.sync(['**/**.tsx', '**/**.jsx'], { 15 | ignore: ['node_modules'], 16 | cwd: rootPath, 17 | }) 18 | 19 | const components: Components = new Set() 20 | 21 | for (const file of files) { 22 | const code = fs.readFileSync(resolve(rootPath, file), { encoding: 'utf-8' }) 23 | const program = parse(code, { 24 | sourceType: 'module', 25 | plugins: [ 26 | 'typescript', 27 | 'jsx', 28 | ], 29 | }) as BaseNode 30 | 31 | walk(program, { 32 | enter(nodes) { 33 | const node = nodes as unknown as Node 34 | let name = '' 35 | let type: ComponentsContext['type'] = 'Declaration' 36 | 37 | /* 38 | const A = () => ( 39 |
1
40 | ) 41 | */ 42 | if ( 43 | node.type === 'VariableDeclaration' 44 | && ( 45 | (node.declarations[0].init?.type === 'ArrowFunctionExpression' 46 | && node.declarations[0].init?.body?.type === 'JSXElement') 47 | ) 48 | ) { 49 | type = 'Declaration' 50 | name = (node.declarations.find(item => item.type === 'VariableDeclarator' && item.id.type === 'Identifier')!.id as any).name 51 | } 52 | else if ( 53 | node.type === 'FunctionDeclaration' 54 | && node.body.type === 'BlockStatement' 55 | && node.body.body.find(item => item.type === 'ReturnStatement' && item.argument?.type === 'JSXElement') 56 | ) { 57 | name = node.id?.name || '' 58 | type = 'Declaration' 59 | } 60 | else if (node.type === 'ExportDefaultDeclaration') { 61 | if ( 62 | node.declaration.type === 'FunctionDeclaration' 63 | && node.declaration.body.body.find(item => item.type === 'ReturnStatement' && item.argument?.type === 'JSXElement') 64 | ) { 65 | name = (node.declaration as any).id.name 66 | type = 'ExportDefault' 67 | } 68 | /* 69 | const A = () => ( 70 |
1
71 | ) 72 | export default A 73 | */ 74 | else if (node.declaration.type === 'Identifier') { 75 | const exportedName = node.declaration?.name 76 | const component = Array.from(components).find(item => item.name === exportedName) 77 | if (component && component.type === 'Declaration') { 78 | type = 'ExportDefault' 79 | name = component.name 80 | } 81 | } 82 | } 83 | else if (node.type === 'ExportNamedDeclaration') { 84 | /* 85 | export function A() { 86 | return
1
87 | } 88 | */ 89 | if ( 90 | node.declaration?.type === 'FunctionDeclaration' 91 | && node.declaration.body.type === 'BlockStatement' 92 | && node.declaration.body.body.find(item => item.type === 'ReturnStatement' && item.argument?.type === 'JSXElement') 93 | ) { 94 | name = node.declaration.id?.name || '' 95 | type = 'Export' 96 | } 97 | else if (node.declaration?.type === 'VariableDeclaration') { 98 | const declaration = node.declaration.declarations.find( 99 | item => item.type === 'VariableDeclarator' && item.init?.type === 'ArrowFunctionExpression', 100 | ) 101 | if ( 102 | declaration && declaration.init?.type === 'ArrowFunctionExpression' 103 | && declaration.init.body.type === 'BlockStatement' 104 | && declaration.init.body.body.find(item => item.type === 'ReturnStatement' && item.argument?.type === 'JSXElement') 105 | ) { 106 | name = (declaration.id as any).name 107 | type = 'Export' 108 | } 109 | } 110 | } 111 | 112 | if (name?.length) { 113 | components.add({ 114 | name, 115 | type, 116 | path: slash(`${rootPath}/${file}`), 117 | }) 118 | } 119 | }, 120 | }) 121 | } 122 | 123 | return new Set(Array.from(components).filter(item => item.type !== 'Declaration')) 124 | } 125 | -------------------------------------------------------------------------------- /src/core/transformer.ts: -------------------------------------------------------------------------------- 1 | import type { ExportType, TransformOptions } from '../types' 2 | import { isExportComponent, stringifyImport } from './utils' 3 | import { getResolversResult } from './resolvers' 4 | 5 | const reactDevRE = /_jsxDEV\(([^"][^React\.]\w+|[a-zA-Z]+|)/g 6 | const reactBuildRE = /_jsx\(([^"][^React\.]\w+|[a-zA-Z]+|)/g 7 | const reactLatestBuildRE = /jsx\(([^"][^React\.]\w+|[a-zA-Z]+|)/g 8 | 9 | let reactComponentRE: RegExp 10 | 11 | export async function transform(options: TransformOptions) { 12 | let index = 0 13 | const { code, id, components, resolvers, local } = options 14 | let isDevMode = true 15 | let isLatestBundle = false 16 | 17 | if (code.original.includes('react/jsx-dev-runtime')) { 18 | reactComponentRE = reactDevRE 19 | } 20 | else { 21 | isDevMode = false 22 | if (code.original.includes('_jsx')) { 23 | reactComponentRE = reactBuildRE 24 | } 25 | else { 26 | reactComponentRE = reactLatestBuildRE 27 | isLatestBundle = true 28 | } 29 | } 30 | 31 | const matches = Array.from(code.original.matchAll(reactComponentRE)).map(item => ({ 32 | name: item[1], 33 | path: id, 34 | original: item[0], 35 | })) 36 | 37 | const importsName: string[] = [] 38 | const imports: string[] = [] 39 | 40 | const resolveImports = (name: string, type: ExportType, path: string, original: string, style?: string) => { 41 | if (importsName.includes(name)) 42 | return 43 | 44 | const replacedName = `_unplugin_react_${name}_${index}` 45 | index++ 46 | 47 | code.replaceAll(original, `${isDevMode ? '_jsxDEV' : isLatestBundle ? 'jsx' : '_jsx'}(${replacedName}`) 48 | 49 | const importedPath = path 50 | 51 | if (isExportComponent(type)) { 52 | imports.push(stringifyImport({ 53 | name, 54 | as: replacedName, 55 | from: importedPath, 56 | })) 57 | } 58 | else { 59 | imports.push(stringifyImport({ 60 | default: replacedName, 61 | from: importedPath, 62 | })) 63 | } 64 | 65 | if (style) 66 | imports.push(stringifyImport(style)) 67 | 68 | importsName.push(name) 69 | } 70 | 71 | const resolversResult = await getResolversResult(resolvers) 72 | 73 | for (const matched of matches) { 74 | resolversResult?.forEach((resolver) => { 75 | resolver.forEach((item) => { 76 | if (item.name === matched.name) 77 | resolveImports(item.originalName, item.type, item.from, matched.original, item.style) 78 | }) 79 | }) 80 | 81 | if (local) { 82 | const component = Array.from(components).find(item => item.name === matched.name) 83 | 84 | if (!component) 85 | continue 86 | 87 | resolveImports(component.name, component.type as ExportType, component.path, matched.original) 88 | } 89 | } 90 | 91 | code.prepend(`${imports.join('\n')}\n`) 92 | 93 | return code.toString() 94 | } 95 | -------------------------------------------------------------------------------- /src/core/utils.ts: -------------------------------------------------------------------------------- 1 | import type { ComponentsContext, ExportType, ImportInfo, Options } from '../types' 2 | 3 | export const isExportComponent = (component: ComponentsContext | ExportType) => 4 | typeof component === 'string' ? component === 'Export' : component.type === 'Export' 5 | 6 | export const isCapitalCase = (code: string) => { 7 | const ascii = code[0].charCodeAt(0) 8 | return ascii >= 65 && ascii <= 90 9 | } 10 | /** 11 | * Replace backslash to slash 12 | */ 13 | export function slash(str: string) { 14 | return str.replace(/\\/g, '/') 15 | } 16 | 17 | export function stringifyImport(info: ImportInfo | string) { 18 | if (typeof info === 'string') 19 | return `import '${info}'` 20 | else if (info.name && info.as) 21 | return `import { ${info.name} as ${info.as} } from '${info.from}'` 22 | else if (info.name) 23 | return `import { ${info.name} } from '${info.from}'` 24 | else 25 | return `import ${info.default} from '${info.from}'` 26 | } 27 | 28 | export function resolveOptions(options: Options = {}): Required { 29 | return { 30 | rootDir: options.rootDir || process.cwd(), 31 | dts: false, 32 | include: [/\.[j|t]sx$/], 33 | exclude: [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/], 34 | resolvers: options.resolvers || [], 35 | local: typeof options.local === 'boolean' ? options.local : true, 36 | ...options, 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { createUnplugin } from 'unplugin' 2 | import MagicString from 'magic-string' 3 | import { createFilter } from '@rollup/pluginutils' 4 | import type { GenerateDtsOptions, Options, TransformOptions } from './types' 5 | import { transform } from './core/transformer' 6 | import { searchGlob } from './core/searchGlob' 7 | import { generateDts } from './core/generateDts' 8 | import { resolveOptions } from './core/utils' 9 | 10 | export * from './core/resolvers' 11 | export * from './core/generateDts' 12 | export * from './core/resolvers/index' 13 | export * from './core/searchGlob' 14 | export * from './core/transformer' 15 | 16 | export default createUnplugin((options = {}) => { 17 | options = resolveOptions(options) 18 | 19 | const filter = createFilter( 20 | options.include || [/\.[j|t]sx$/], 21 | options.exclude || [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/], 22 | ) 23 | const searchGlobResult = searchGlob({ rootPath: (options.dts as any)?.rootPath || options.rootDir! }) 24 | const dtsOptions = { 25 | components: searchGlobResult, 26 | filename: (options.dts as GenerateDtsOptions)?.filename || 'components', 27 | rootPath: (options.dts as GenerateDtsOptions)?.rootPath || options.rootDir!, 28 | local: options.local, 29 | resolvers: options.resolvers, 30 | } as GenerateDtsOptions 31 | 32 | if (options.dts === true) 33 | generateDts({ ...dtsOptions }) 34 | else if (typeof options.dts === 'object') 35 | generateDts({ ...dtsOptions, ...options.dts }) 36 | 37 | return { 38 | name: 'unplugin-react-components', 39 | transformInclude(id) { 40 | return filter(id) 41 | }, 42 | async transform(code, id) { 43 | const context: TransformOptions = { 44 | code: new MagicString(code), 45 | components: searchGlobResult, 46 | rootDir: options.rootDir!, 47 | resolvers: options.resolvers!, 48 | local: options.local!, 49 | id, 50 | } 51 | 52 | return await transform(context) 53 | }, 54 | } 55 | }) 56 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import type MagicString from 'magic-string' 2 | import type { FilterPattern } from '@rollup/pluginutils' 3 | 4 | export interface Options { 5 | /** 6 | * Provide path which will be transformed 7 | * 8 | * @default process.cwd() 9 | */ 10 | rootDir?: string 11 | 12 | /** 13 | * Should generate d.ts file 14 | * 15 | * @default false 16 | */ 17 | dts?: boolean | Partial> 18 | 19 | /** 20 | * Should generate d.ts file 21 | * 22 | * @default true 23 | */ 24 | local?: boolean 25 | 26 | /** 27 | * RegExp or glob to match files to be transformed 28 | */ 29 | include?: FilterPattern 30 | 31 | /** 32 | * RegExp or glob to match files to NOT be transformed 33 | */ 34 | exclude?: FilterPattern 35 | 36 | /** 37 | * Pass a custom function to resolve the component importing path from the component name. 38 | * 39 | */ 40 | resolvers?: Resolvers 41 | } 42 | 43 | export interface ImportInfo { 44 | as?: string 45 | name?: string 46 | default?: string 47 | from: string 48 | } 49 | 50 | export type ExportType = 'Export' | 'ExportDefault' 51 | 52 | export interface ComponentsContext { 53 | name: string 54 | path: string 55 | type: ExportType | 'Declaration' 56 | } 57 | 58 | export interface ResolverReturnType { 59 | name: string 60 | from: string 61 | type: ExportType 62 | originalName: string 63 | style?: string 64 | } 65 | 66 | export type ResolverComponent = () => ResolverReturnType[] | Promise 67 | 68 | export type Resolvers = Promise[] | ResolverComponent[] 69 | 70 | export type Components = Set 71 | 72 | export interface TransformOptions { 73 | id: string 74 | code: MagicString 75 | components: Components 76 | rootDir: string 77 | resolvers: Resolvers 78 | local: boolean 79 | } 80 | 81 | export interface GenerateDtsOptions { 82 | components: Components 83 | rootPath: string 84 | filename: string 85 | resolvers: Resolvers 86 | local: boolean 87 | } 88 | 89 | export interface SearchGlobOptions { 90 | rootPath: string 91 | } 92 | 93 | export interface BaseResolverOptions { 94 | prefix?: boolean | string 95 | } 96 | -------------------------------------------------------------------------------- /src/vite.ts: -------------------------------------------------------------------------------- 1 | import unplugin from '.' 2 | 3 | export default unplugin.vite 4 | -------------------------------------------------------------------------------- /src/webpack.ts: -------------------------------------------------------------------------------- 1 | import unplugin from '.' 2 | 3 | export default unplugin.webpack 4 | -------------------------------------------------------------------------------- /test/__snapshots__/index.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1 2 | 3 | exports[`generate components.d.ts 1`] = ` 4 | "/* generated by unplugin-react-components */ 5 | export {} 6 | declare global{ 7 | const A: typeof import('./A')['A'] 8 | const App: typeof import('./App')['App'] 9 | const AntAffix: typeof import('antd')['Affix'] 10 | const AntAlert: typeof import('antd')['Alert'] 11 | const AntAnchor: typeof import('antd')['Anchor'] 12 | const AntAutoComplete: typeof import('antd')['AutoComplete'] 13 | const AntAvatar: typeof import('antd')['Avatar'] 14 | const AntBackTop: typeof import('antd')['BackTop'] 15 | const AntBadge: typeof import('antd')['Badge'] 16 | const AntBreadcrumb: typeof import('antd')['Breadcrumb'] 17 | const AntButton: typeof import('antd')['Button'] 18 | const AntCalendar: typeof import('antd')['Calendar'] 19 | const AntCard: typeof import('antd')['Card'] 20 | const AntCarousel: typeof import('antd')['Carousel'] 21 | const AntCascader: typeof import('antd')['Cascader'] 22 | const AntCheckbox: typeof import('antd')['Checkbox'] 23 | const AntCol: typeof import('antd')['Col'] 24 | const AntCollapse: typeof import('antd')['Collapse'] 25 | const AntComment: typeof import('antd')['Comment'] 26 | const AntConfigProvider: typeof import('antd')['ConfigProvider'] 27 | const AntDatePicker: typeof import('antd')['DatePicker'] 28 | const AntDescriptions: typeof import('antd')['Descriptions'] 29 | const AntDivider: typeof import('antd')['Divider'] 30 | const AntDrawer: typeof import('antd')['Drawer'] 31 | const AntDropdown: typeof import('antd')['Dropdown'] 32 | const AntEmpty: typeof import('antd')['Empty'] 33 | const AntForm: typeof import('antd')['Form'] 34 | const AntGrid: typeof import('antd')['Grid'] 35 | const AntImage: typeof import('antd')['Image'] 36 | const AntInput: typeof import('antd')['Input'] 37 | const AntInputNumber: typeof import('antd')['InputNumber'] 38 | const AntLayout: typeof import('antd')['Layout'] 39 | const AntList: typeof import('antd')['List'] 40 | const AntMentions: typeof import('antd')['Mentions'] 41 | const AntMenu: typeof import('antd')['Menu'] 42 | const AntModal: typeof import('antd')['Modal'] 43 | const AntPageHeader: typeof import('antd')['PageHeader'] 44 | const AntPagination: typeof import('antd')['Pagination'] 45 | const AntPopconfirm: typeof import('antd')['Popconfirm'] 46 | const AntPopover: typeof import('antd')['Popover'] 47 | const AntProgress: typeof import('antd')['Progress'] 48 | const AntRadio: typeof import('antd')['Radio'] 49 | const AntRate: typeof import('antd')['Rate'] 50 | const AntResult: typeof import('antd')['Result'] 51 | const AntRow: typeof import('antd')['Row'] 52 | const AntSegmented: typeof import('antd')['Segmented'] 53 | const AntSelect: typeof import('antd')['Select'] 54 | const AntSkeleton: typeof import('antd')['Skeleton'] 55 | const AntSlider: typeof import('antd')['Slider'] 56 | const AntSpace: typeof import('antd')['Space'] 57 | const AntSpin: typeof import('antd')['Spin'] 58 | const AntStatistic: typeof import('antd')['Statistic'] 59 | const AntSteps: typeof import('antd')['Steps'] 60 | const AntSwitch: typeof import('antd')['Switch'] 61 | const AntTable: typeof import('antd')['Table'] 62 | const AntTabs: typeof import('antd')['Tabs'] 63 | const AntTag: typeof import('antd')['Tag'] 64 | const AntTimePicker: typeof import('antd')['TimePicker'] 65 | const AntTimeline: typeof import('antd')['Timeline'] 66 | const AntTooltip: typeof import('antd')['Tooltip'] 67 | const AntTransfer: typeof import('antd')['Transfer'] 68 | const AntTree: typeof import('antd')['Tree'] 69 | const AntTreeSelect: typeof import('antd')['TreeSelect'] 70 | const AntTypography: typeof import('antd')['Typography'] 71 | const AntUpload: typeof import('antd')['Upload'] 72 | const Affix: typeof import('antd')['Affix'] 73 | const Alert: typeof import('antd')['Alert'] 74 | const Anchor: typeof import('antd')['Anchor'] 75 | const AutoComplete: typeof import('antd')['AutoComplete'] 76 | const Avatar: typeof import('antd')['Avatar'] 77 | const BackTop: typeof import('antd')['BackTop'] 78 | const Badge: typeof import('antd')['Badge'] 79 | const Breadcrumb: typeof import('antd')['Breadcrumb'] 80 | const Button: typeof import('antd')['Button'] 81 | const Calendar: typeof import('antd')['Calendar'] 82 | const Card: typeof import('antd')['Card'] 83 | const Carousel: typeof import('antd')['Carousel'] 84 | const Cascader: typeof import('antd')['Cascader'] 85 | const Checkbox: typeof import('antd')['Checkbox'] 86 | const Col: typeof import('antd')['Col'] 87 | const Collapse: typeof import('antd')['Collapse'] 88 | const Comment: typeof import('antd')['Comment'] 89 | const ConfigProvider: typeof import('antd')['ConfigProvider'] 90 | const DatePicker: typeof import('antd')['DatePicker'] 91 | const Descriptions: typeof import('antd')['Descriptions'] 92 | const Divider: typeof import('antd')['Divider'] 93 | const Drawer: typeof import('antd')['Drawer'] 94 | const Dropdown: typeof import('antd')['Dropdown'] 95 | const Empty: typeof import('antd')['Empty'] 96 | const Form: typeof import('antd')['Form'] 97 | const Grid: typeof import('antd')['Grid'] 98 | const Image: typeof import('antd')['Image'] 99 | const Input: typeof import('antd')['Input'] 100 | const InputNumber: typeof import('antd')['InputNumber'] 101 | const Layout: typeof import('antd')['Layout'] 102 | const List: typeof import('antd')['List'] 103 | const Mentions: typeof import('antd')['Mentions'] 104 | const Menu: typeof import('antd')['Menu'] 105 | const Modal: typeof import('antd')['Modal'] 106 | const PageHeader: typeof import('antd')['PageHeader'] 107 | const Pagination: typeof import('antd')['Pagination'] 108 | const Popconfirm: typeof import('antd')['Popconfirm'] 109 | const Popover: typeof import('antd')['Popover'] 110 | const Progress: typeof import('antd')['Progress'] 111 | const Radio: typeof import('antd')['Radio'] 112 | const Rate: typeof import('antd')['Rate'] 113 | const Result: typeof import('antd')['Result'] 114 | const Row: typeof import('antd')['Row'] 115 | const Segmented: typeof import('antd')['Segmented'] 116 | const Select: typeof import('antd')['Select'] 117 | const Skeleton: typeof import('antd')['Skeleton'] 118 | const Slider: typeof import('antd')['Slider'] 119 | const Space: typeof import('antd')['Space'] 120 | const Spin: typeof import('antd')['Spin'] 121 | const Statistic: typeof import('antd')['Statistic'] 122 | const Steps: typeof import('antd')['Steps'] 123 | const Switch: typeof import('antd')['Switch'] 124 | const Table: typeof import('antd')['Table'] 125 | const Tabs: typeof import('antd')['Tabs'] 126 | const Tag: typeof import('antd')['Tag'] 127 | const TimePicker: typeof import('antd')['TimePicker'] 128 | const Timeline: typeof import('antd')['Timeline'] 129 | const Tooltip: typeof import('antd')['Tooltip'] 130 | const Transfer: typeof import('antd')['Transfer'] 131 | const Tree: typeof import('antd')['Tree'] 132 | const TreeSelect: typeof import('antd')['TreeSelect'] 133 | const Typography: typeof import('antd')['Typography'] 134 | const Upload: typeof import('antd')['Upload'] 135 | " 136 | `; 137 | 138 | exports[`ignore local components 1`] = ` 139 | "import { Progress as _unplugin_react_Progress_0 } from 'antd' 140 | import 'antd/es/progress/style/index.css' 141 | import { Tooltip as _unplugin_react_Tooltip_1 } from 'antd' 142 | import 'antd/es/tooltip/style/index.css' 143 | 144 | import { jsxDEV as _jsxDEV } from \\"react/jsx-dev-runtime\\"; 145 | function App() { 146 | return /*#__PURE__*/_jsxDEV(\\"div\\", { 147 | className: \\"App\\", 148 | children: [/*#__PURE__*/_jsxDEV(A, { 149 | variant: 'contained', 150 | children: \\"hi mui\\" 151 | }, void 0, false, { 152 | fileName: _jsxFileName, 153 | lineNumber: 6, 154 | columnNumber: 7 155 | }, this), /*#__PURE__*/_jsxDEV(_unplugin_react_Progress_0, { 156 | percent: 30 157 | }, void 0, false, { 158 | fileName: _jsxFileName, 159 | lineNumber: 7, 160 | columnNumber: 7 161 | }, this), /*#__PURE__*/_jsxDEV(A, {}, void 0, false, { 162 | fileName: _jsxFileName, 163 | lineNumber: 8, 164 | columnNumber: 7 165 | }, this), /*#__PURE__*/_jsxDEV(_unplugin_react_Tooltip_1, { 166 | title: \\"prompt text\\", 167 | children: /*#__PURE__*/_jsxDEV(\\"span\\", { 168 | children: \\"Tooltip will show on mouse enter.\\" 169 | }, void 0, false, { 170 | fileName: _jsxFileName, 171 | lineNumber: 10, 172 | columnNumber: 9 173 | }, this) 174 | }, void 0, false, { 175 | fileName: _jsxFileName, 176 | lineNumber: 9, 177 | columnNumber: 7 178 | }, this)] 179 | }, void 0, true, { 180 | fileName: _jsxFileName, 181 | lineNumber: 5, 182 | columnNumber: 5 183 | }, this); 184 | } 185 | _c = App; 186 | export default App;" 187 | `; 188 | 189 | exports[`it should work after bundle. 1`] = ` 190 | "import { Button as _unplugin_react_Button_0 } from 'antd' 191 | import 'antd/es/button/style/index.css' 192 | import { Progress as _unplugin_react_Progress_1 } from 'antd' 193 | import 'antd/es/progress/style/index.css' 194 | import { Skeleton as _unplugin_react_Skeleton_2 } from 'antd' 195 | import 'antd/es/skeleton/style/index.css' 196 | import { Tooltip as _unplugin_react_Tooltip_3 } from 'antd' 197 | import 'antd/es/tooltip/style/index.css' 198 | import \\"./App.css\\"; 199 | import { jsx } from \\"react/jsx-runtime\\"; 200 | import { jsxs} from \\"react/jsx-runtime\\"; 201 | function App() { 202 | return /* @__PURE__ */ jsxs(\\"div\\", { 203 | className: \\"App\\", 204 | children: [/* @__PURE__ */ jsx(_unplugin_react_Button_0, { 205 | variant: \\"contained\\", 206 | children: \\"hi mui\\" 207 | }), /* @__PURE__ */ jsx(Box, {}), /* @__PURE__ */ jsx(_unplugin_react_Progress_1, { 208 | percent: 30 209 | }), /* @__PURE__ */ jsx(_unplugin_react_Progress_1, { 210 | percent: 30 211 | }), /* @__PURE__ */ jsx(_unplugin_react_Skeleton_2, {}), /* @__PURE__ */ jsx(_unplugin_react_Tooltip_3, { 212 | title: \\"prompt text\\", 213 | children: /* @__PURE__ */ jsx(\\"span\\", { 214 | children: \\"Tooltip will show on mouse enter.\\" 215 | }) 216 | }), /* @__PURE__ */ jsx(CompC, {})] 217 | }); 218 | } 219 | export default App; 220 | " 221 | `; 222 | 223 | exports[`play with resolver 1`] = ` 224 | "import { A as _unplugin_react_A_0 } from 'D:/Dev/unplugin/unplugin-react-components/test/fixtures/A.tsx' 225 | import { Progress as _unplugin_react_Progress_1 } from 'antd' 226 | import 'antd/es/progress/style/index.css' 227 | import { Tooltip as _unplugin_react_Tooltip_2 } from 'antd' 228 | import 'antd/es/tooltip/style/index.css' 229 | 230 | import { jsxDEV as _jsxDEV } from \\"react/jsx-dev-runtime\\"; 231 | function App() { 232 | return /*#__PURE__*/_jsxDEV(\\"div\\", { 233 | className: \\"App\\", 234 | children: [/*#__PURE__*/_jsxDEV(_unplugin_react_A_0, { 235 | variant: 'contained', 236 | children: \\"hi mui\\" 237 | }, void 0, false, { 238 | fileName: _jsxFileName, 239 | lineNumber: 6, 240 | columnNumber: 7 241 | }, this), /*#__PURE__*/_jsxDEV(_unplugin_react_Progress_1, { 242 | percent: 30 243 | }, void 0, false, { 244 | fileName: _jsxFileName, 245 | lineNumber: 7, 246 | columnNumber: 7 247 | }, this), /*#__PURE__*/_jsxDEV(_unplugin_react_A_0, {}, void 0, false, { 248 | fileName: _jsxFileName, 249 | lineNumber: 8, 250 | columnNumber: 7 251 | }, this), /*#__PURE__*/_jsxDEV(_unplugin_react_Tooltip_2, { 252 | title: \\"prompt text\\", 253 | children: /*#__PURE__*/_jsxDEV(\\"span\\", { 254 | children: \\"Tooltip will show on mouse enter.\\" 255 | }, void 0, false, { 256 | fileName: _jsxFileName, 257 | lineNumber: 10, 258 | columnNumber: 9 259 | }, this) 260 | }, void 0, false, { 261 | fileName: _jsxFileName, 262 | lineNumber: 9, 263 | columnNumber: 7 264 | }, this)] 265 | }, void 0, true, { 266 | fileName: _jsxFileName, 267 | lineNumber: 5, 268 | columnNumber: 5 269 | }, this); 270 | } 271 | _c = App; 272 | export default App;" 273 | `; 274 | -------------------------------------------------------------------------------- /test/fixtures/A.tsx: -------------------------------------------------------------------------------- 1 | export const A = () => { 2 | return
A
3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/App.tsx: -------------------------------------------------------------------------------- 1 | export function App() { 2 | return ( 3 |
4 | hi 5 | 6 |
7 | ) 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/components.d.ts: -------------------------------------------------------------------------------- 1 | /* generated by unplugin-react-components */ 2 | export {} 3 | declare global{ 4 | const A: typeof import('./A')['A'] 5 | const App: typeof import('./App')['App'] 6 | const AntAffix: typeof import('antd')['Affix'] 7 | const AntAlert: typeof import('antd')['Alert'] 8 | const AntAnchor: typeof import('antd')['Anchor'] 9 | const AntAutoComplete: typeof import('antd')['AutoComplete'] 10 | const AntAvatar: typeof import('antd')['Avatar'] 11 | const AntBackTop: typeof import('antd')['BackTop'] 12 | const AntBadge: typeof import('antd')['Badge'] 13 | const AntBreadcrumb: typeof import('antd')['Breadcrumb'] 14 | const AntButton: typeof import('antd')['Button'] 15 | const AntCalendar: typeof import('antd')['Calendar'] 16 | const AntCard: typeof import('antd')['Card'] 17 | const AntCarousel: typeof import('antd')['Carousel'] 18 | const AntCascader: typeof import('antd')['Cascader'] 19 | const AntCheckbox: typeof import('antd')['Checkbox'] 20 | const AntCol: typeof import('antd')['Col'] 21 | const AntCollapse: typeof import('antd')['Collapse'] 22 | const AntComment: typeof import('antd')['Comment'] 23 | const AntConfigProvider: typeof import('antd')['ConfigProvider'] 24 | const AntDatePicker: typeof import('antd')['DatePicker'] 25 | const AntDescriptions: typeof import('antd')['Descriptions'] 26 | const AntDivider: typeof import('antd')['Divider'] 27 | const AntDrawer: typeof import('antd')['Drawer'] 28 | const AntDropdown: typeof import('antd')['Dropdown'] 29 | const AntEmpty: typeof import('antd')['Empty'] 30 | const AntForm: typeof import('antd')['Form'] 31 | const AntGrid: typeof import('antd')['Grid'] 32 | const AntImage: typeof import('antd')['Image'] 33 | const AntInput: typeof import('antd')['Input'] 34 | const AntInputNumber: typeof import('antd')['InputNumber'] 35 | const AntLayout: typeof import('antd')['Layout'] 36 | const AntList: typeof import('antd')['List'] 37 | const AntMentions: typeof import('antd')['Mentions'] 38 | const AntMenu: typeof import('antd')['Menu'] 39 | const AntModal: typeof import('antd')['Modal'] 40 | const AntPageHeader: typeof import('antd')['PageHeader'] 41 | const AntPagination: typeof import('antd')['Pagination'] 42 | const AntPopconfirm: typeof import('antd')['Popconfirm'] 43 | const AntPopover: typeof import('antd')['Popover'] 44 | const AntProgress: typeof import('antd')['Progress'] 45 | const AntRadio: typeof import('antd')['Radio'] 46 | const AntRate: typeof import('antd')['Rate'] 47 | const AntResult: typeof import('antd')['Result'] 48 | const AntRow: typeof import('antd')['Row'] 49 | const AntSegmented: typeof import('antd')['Segmented'] 50 | const AntSelect: typeof import('antd')['Select'] 51 | const AntSkeleton: typeof import('antd')['Skeleton'] 52 | const AntSlider: typeof import('antd')['Slider'] 53 | const AntSpace: typeof import('antd')['Space'] 54 | const AntSpin: typeof import('antd')['Spin'] 55 | const AntStatistic: typeof import('antd')['Statistic'] 56 | const AntSteps: typeof import('antd')['Steps'] 57 | const AntSwitch: typeof import('antd')['Switch'] 58 | const AntTable: typeof import('antd')['Table'] 59 | const AntTabs: typeof import('antd')['Tabs'] 60 | const AntTag: typeof import('antd')['Tag'] 61 | const AntTimePicker: typeof import('antd')['TimePicker'] 62 | const AntTimeline: typeof import('antd')['Timeline'] 63 | const AntTooltip: typeof import('antd')['Tooltip'] 64 | const AntTransfer: typeof import('antd')['Transfer'] 65 | const AntTree: typeof import('antd')['Tree'] 66 | const AntTreeSelect: typeof import('antd')['TreeSelect'] 67 | const AntTypography: typeof import('antd')['Typography'] 68 | const AntUpload: typeof import('antd')['Upload'] 69 | const Affix: typeof import('antd')['Affix'] 70 | const Alert: typeof import('antd')['Alert'] 71 | const Anchor: typeof import('antd')['Anchor'] 72 | const AutoComplete: typeof import('antd')['AutoComplete'] 73 | const Avatar: typeof import('antd')['Avatar'] 74 | const BackTop: typeof import('antd')['BackTop'] 75 | const Badge: typeof import('antd')['Badge'] 76 | const Breadcrumb: typeof import('antd')['Breadcrumb'] 77 | const Button: typeof import('antd')['Button'] 78 | const Calendar: typeof import('antd')['Calendar'] 79 | const Card: typeof import('antd')['Card'] 80 | const Carousel: typeof import('antd')['Carousel'] 81 | const Cascader: typeof import('antd')['Cascader'] 82 | const Checkbox: typeof import('antd')['Checkbox'] 83 | const Col: typeof import('antd')['Col'] 84 | const Collapse: typeof import('antd')['Collapse'] 85 | const Comment: typeof import('antd')['Comment'] 86 | const ConfigProvider: typeof import('antd')['ConfigProvider'] 87 | const DatePicker: typeof import('antd')['DatePicker'] 88 | const Descriptions: typeof import('antd')['Descriptions'] 89 | const Divider: typeof import('antd')['Divider'] 90 | const Drawer: typeof import('antd')['Drawer'] 91 | const Dropdown: typeof import('antd')['Dropdown'] 92 | const Empty: typeof import('antd')['Empty'] 93 | const Form: typeof import('antd')['Form'] 94 | const Grid: typeof import('antd')['Grid'] 95 | const Image: typeof import('antd')['Image'] 96 | const Input: typeof import('antd')['Input'] 97 | const InputNumber: typeof import('antd')['InputNumber'] 98 | const Layout: typeof import('antd')['Layout'] 99 | const List: typeof import('antd')['List'] 100 | const Mentions: typeof import('antd')['Mentions'] 101 | const Menu: typeof import('antd')['Menu'] 102 | const Modal: typeof import('antd')['Modal'] 103 | const PageHeader: typeof import('antd')['PageHeader'] 104 | const Pagination: typeof import('antd')['Pagination'] 105 | const Popconfirm: typeof import('antd')['Popconfirm'] 106 | const Popover: typeof import('antd')['Popover'] 107 | const Progress: typeof import('antd')['Progress'] 108 | const Radio: typeof import('antd')['Radio'] 109 | const Rate: typeof import('antd')['Rate'] 110 | const Result: typeof import('antd')['Result'] 111 | const Row: typeof import('antd')['Row'] 112 | const Segmented: typeof import('antd')['Segmented'] 113 | const Select: typeof import('antd')['Select'] 114 | const Skeleton: typeof import('antd')['Skeleton'] 115 | const Slider: typeof import('antd')['Slider'] 116 | const Space: typeof import('antd')['Space'] 117 | const Spin: typeof import('antd')['Spin'] 118 | const Statistic: typeof import('antd')['Statistic'] 119 | const Steps: typeof import('antd')['Steps'] 120 | const Switch: typeof import('antd')['Switch'] 121 | const Table: typeof import('antd')['Table'] 122 | const Tabs: typeof import('antd')['Tabs'] 123 | const Tag: typeof import('antd')['Tag'] 124 | const TimePicker: typeof import('antd')['TimePicker'] 125 | const Timeline: typeof import('antd')['Timeline'] 126 | const Tooltip: typeof import('antd')['Tooltip'] 127 | const Transfer: typeof import('antd')['Transfer'] 128 | const Tree: typeof import('antd')['Tree'] 129 | const TreeSelect: typeof import('antd')['TreeSelect'] 130 | const Typography: typeof import('antd')['Typography'] 131 | const Upload: typeof import('antd')['Upload'] 132 | } -------------------------------------------------------------------------------- /test/index.test.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'path' 2 | import { expect, test } from 'vitest' 3 | import MagicString from 'magic-string' 4 | import { AntdResolver, generateDts, searchGlob, transform } from '../src' 5 | import { slash } from '../src/core/utils' 6 | 7 | const rootPath = slash(`${resolve(__dirname)}/fixtures`) 8 | const searchGlobResult = searchGlob({ 9 | rootPath, 10 | }) 11 | 12 | const id = slash(`${process.cwd()}/test/fixtures/App.tsx`) 13 | 14 | const code = ` 15 | import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime"; 16 | function App() { 17 | return /*#__PURE__*/_jsxDEV("div", { 18 | className: "App", 19 | children: [/*#__PURE__*/_jsxDEV(A, { 20 | variant: 'contained', 21 | children: "hi mui" 22 | }, void 0, false, { 23 | fileName: _jsxFileName, 24 | lineNumber: 6, 25 | columnNumber: 7 26 | }, this), /*#__PURE__*/_jsxDEV(AntProgress, { 27 | percent: 30 28 | }, void 0, false, { 29 | fileName: _jsxFileName, 30 | lineNumber: 7, 31 | columnNumber: 7 32 | }, this), /*#__PURE__*/_jsxDEV(A, {}, void 0, false, { 33 | fileName: _jsxFileName, 34 | lineNumber: 8, 35 | columnNumber: 7 36 | }, this), /*#__PURE__*/_jsxDEV(AntTooltip, { 37 | title: "prompt text", 38 | children: /*#__PURE__*/_jsxDEV("span", { 39 | children: "Tooltip will show on mouse enter." 40 | }, void 0, false, { 41 | fileName: _jsxFileName, 42 | lineNumber: 10, 43 | columnNumber: 9 44 | }, this) 45 | }, void 0, false, { 46 | fileName: _jsxFileName, 47 | lineNumber: 9, 48 | columnNumber: 7 49 | }, this)] 50 | }, void 0, true, { 51 | fileName: _jsxFileName, 52 | lineNumber: 5, 53 | columnNumber: 5 54 | }, this); 55 | } 56 | _c = App; 57 | export default App;` 58 | 59 | test('test searchGlob', async () => { 60 | const arr = Array.from(searchGlobResult).map(i => ({ ...i, path: 'searchGlob' })) 61 | expect(arr).toMatchInlineSnapshot(` 62 | [ 63 | { 64 | "name": "A", 65 | "path": "searchGlob", 66 | "type": "Export", 67 | }, 68 | { 69 | "name": "App", 70 | "path": "searchGlob", 71 | "type": "Export", 72 | }, 73 | ] 74 | `) 75 | }) 76 | 77 | test('play with resolver', async () => { 78 | const transformed = await transform({ 79 | code: new MagicString(code), 80 | id, 81 | components: searchGlobResult, 82 | resolvers: [ 83 | AntdResolver({ 84 | prefix: 'Ant', 85 | }), 86 | ], 87 | local: true, 88 | rootDir: '', 89 | }) 90 | 91 | transformed.replace('""', '"') 92 | 93 | expect(transformed).toMatchSnapshot() 94 | }) 95 | 96 | test('ignore local components', async () => { 97 | expect(await transform({ 98 | code: new MagicString(code), 99 | id, 100 | components: searchGlobResult, 101 | local: false, 102 | rootDir: slash(`${resolve(__dirname)}/fixtures`), 103 | resolvers: [ 104 | AntdResolver(), 105 | ], 106 | })).toMatchSnapshot() 107 | }) 108 | 109 | test('generate components.d.ts', async () => { 110 | const dts = await generateDts({ 111 | components: searchGlobResult, 112 | filename: 'components', 113 | local: true, 114 | rootPath, 115 | resolvers: [], 116 | }) 117 | 118 | expect(dts).toMatchSnapshot() 119 | }) 120 | 121 | test('it should work after bundle.', async () => { 122 | const code = `import "./App.css"; 123 | import { jsx } from "react/jsx-runtime"; 124 | import { jsxs} from "react/jsx-runtime"; 125 | function App() { 126 | return /* @__PURE__ */ jsxs("div", { 127 | className: "App", 128 | children: [/* @__PURE__ */ jsx(Button, { 129 | variant: "contained", 130 | children: "hi mui" 131 | }), /* @__PURE__ */ jsx(Box, {}), /* @__PURE__ */ jsx(AntProgress, { 132 | percent: 30 133 | }), /* @__PURE__ */ jsx(AntProgress, { 134 | percent: 30 135 | }), /* @__PURE__ */ jsx(AntSkeleton, {}), /* @__PURE__ */ jsx(AntTooltip, { 136 | title: "prompt text", 137 | children: /* @__PURE__ */ jsx("span", { 138 | children: "Tooltip will show on mouse enter." 139 | }) 140 | }), /* @__PURE__ */ jsx(CompC, {})] 141 | }); 142 | } 143 | export default App; 144 | ` 145 | 146 | expect(await transform({ 147 | code: new MagicString(code), 148 | id, 149 | components: searchGlobResult, 150 | local: false, 151 | rootDir: slash(`${resolve(__dirname)}/fixtures`), 152 | resolvers: [ 153 | AntdResolver(), 154 | ], 155 | })).toMatchSnapshot() 156 | }) 157 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "esnext", 5 | "lib": [ 6 | "esnext", 7 | "DOM" 8 | ], 9 | "moduleResolution": "node", 10 | "esModuleInterop": true, 11 | "strict": true, 12 | "strictNullChecks": true, 13 | "resolveJsonModule": true, 14 | "jsx": "react-jsx" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import type { Options } from 'tsup' 2 | 3 | export default { 4 | entry: [ 5 | 'src/*.ts', 6 | ], 7 | format: ['cjs', 'esm'], 8 | dts: true, 9 | splitting: true, 10 | clean: true, 11 | shims: false, 12 | onSuccess: 'npm run build:fix', 13 | } 14 | --------------------------------------------------------------------------------