├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── README.md ├── jest.config.ts ├── package.json ├── pnpm-lock.yaml ├── src-reactivity ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── README.md ├── babel.config.js ├── example-reactivity │ ├── __tests__ │ │ ├── computed.spec.ts │ │ ├── dep.spec.ts │ │ ├── effect.spec.ts │ │ ├── reactive.spec.ts │ │ ├── readonly.spec.ts │ │ ├── ref.spec.ts │ │ └── shallowReadonly.spec.ts │ ├── babel.config.js │ ├── package.json │ ├── src │ │ ├── baseHandlers.ts │ │ ├── computed.ts │ │ ├── dep.ts │ │ ├── effect.ts │ │ ├── index.ts │ │ ├── reactive.ts │ │ └── ref.ts │ └── yarn.lock ├── jest.config.ts ├── package.json ├── pnpm-lock.yaml ├── src │ ├── __test__ │ │ ├── reactive.spec.ts │ │ ├── sum.spec copy.ts │ │ └── sum.spec.ts │ ├── baseHandlers.ts │ ├── const.ts │ ├── effect.ts │ ├── index.ts │ ├── reactive.ts │ ├── share.ts │ └── sum.ts └── tsconfig.json ├── src-rollup-vue ├── .gitignore ├── README.md ├── lib │ └── mini-vue.esm.js ├── package.json ├── pnpm-lock.yaml ├── rollup.config.js └── src │ └── App.vue ├── src └── index.ts ├── test └── sum.spec.ts └── tsconfig.json /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | es2021: true, 6 | }, 7 | extends: [ 8 | "eslint:recommended", 9 | // "plugin:react/recommended", 10 | // "plugin:react-hooks/recommended", 11 | "plugin:@typescript-eslint/recommended", 12 | ], 13 | parser: "@typescript-eslint/parser", 14 | parserOptions: { 15 | ecmaFeatures: { 16 | jsx: true, 17 | }, 18 | ecmaVersion: "latest", 19 | sourceType: "module", 20 | }, 21 | plugins: [ 22 | // "react", 23 | // "react-hooks", 24 | "@typescript-eslint", 25 | ], 26 | ignorePatterns: ["*.js"], 27 | rules: { 28 | "react-hooks/rules-of-hooks": "error", 29 | "react-hooks/exhaustive-deps": "warn", 30 | // enable additional rules 31 | // indent: ["error", 2], 32 | indent: "off", 33 | "@typescript-eslint/indent": ["warn", 2], 34 | "linebreak-style": ["error", "unix"], 35 | quotes: ["error", "double"], 36 | semi: ["error", "always"], 37 | 38 | // override configuration set by extending "eslint:recommended" 39 | "no-empty": "warn", 40 | "no-cond-assign": ["error", "always"], 41 | 42 | // disable rules from base configurations 43 | "for-direction": "off", 44 | 45 | "react/no-set-state": "off", 46 | }, 47 | }; 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | dist 3 | coverage -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.md 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "printWidth": 80, 4 | "semi": true, 5 | "singleQuote": false, 6 | "tabWidth": 2, 7 | "useTabs": false, 8 | "endOfLine": "lf" 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # playground-mini-vue 2 | 3 | > A minimal vue3. 4 | > 最小vue3的实现。 5 | 6 | ## 功能 7 | 8 | - 直接运行(ts-node) 9 | 10 | ## 构建指南 11 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | import { Config } from "@jest/types"; 2 | 3 | export default async (): Promise => { 4 | return { 5 | verbose: true, 6 | testPathIgnorePatterns: ["/node_modules/", "build"], 7 | rootDir: "", 8 | testEnvironment: "jsdom", 9 | }; 10 | }; 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "template-typescript", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest", 8 | "testCoverage": "jest --coverage", 9 | "run": "ts-node -P ./tsconfig.json --files ./src/index.ts", 10 | "build": "tsc" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "@types/jest": "^27.4.1", 16 | "@types/node": "^17.0.23", 17 | "eslint": "^8.12.0", 18 | "jest": "^27.5.1", 19 | "ts-node": "^10.7.0", 20 | "typescript": "^4.6.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@types/jest': ^27.4.1 5 | '@types/node': ^17.0.23 6 | eslint: ^8.12.0 7 | jest: ^27.5.1 8 | ts-node: ^10.7.0 9 | typescript: ^4.6.3 10 | 11 | devDependencies: 12 | '@types/jest': 27.4.1 13 | '@types/node': 17.0.23 14 | eslint: 8.12.0 15 | jest: 27.5.1_ts-node@10.7.0 16 | ts-node: 10.7.0_ee885bc7281b682b6adbed6ae09ee090 17 | typescript: 4.6.3 18 | 19 | packages: 20 | 21 | /@ampproject/remapping/2.1.2: 22 | resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} 23 | engines: {node: '>=6.0.0'} 24 | dependencies: 25 | '@jridgewell/trace-mapping': 0.3.4 26 | dev: true 27 | 28 | /@babel/code-frame/7.16.7: 29 | resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} 30 | engines: {node: '>=6.9.0'} 31 | dependencies: 32 | '@babel/highlight': 7.16.10 33 | dev: true 34 | 35 | /@babel/compat-data/7.17.7: 36 | resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} 37 | engines: {node: '>=6.9.0'} 38 | dev: true 39 | 40 | /@babel/core/7.17.8: 41 | resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} 42 | engines: {node: '>=6.9.0'} 43 | dependencies: 44 | '@ampproject/remapping': 2.1.2 45 | '@babel/code-frame': 7.16.7 46 | '@babel/generator': 7.17.7 47 | '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.8 48 | '@babel/helper-module-transforms': 7.17.7 49 | '@babel/helpers': 7.17.8 50 | '@babel/parser': 7.17.8 51 | '@babel/template': 7.16.7 52 | '@babel/traverse': 7.17.3 53 | '@babel/types': 7.17.0 54 | convert-source-map: 1.8.0 55 | debug: 4.3.4 56 | gensync: 1.0.0-beta.2 57 | json5: 2.2.1 58 | semver: 6.3.0 59 | transitivePeerDependencies: 60 | - supports-color 61 | dev: true 62 | 63 | /@babel/generator/7.17.7: 64 | resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 65 | engines: {node: '>=6.9.0'} 66 | dependencies: 67 | '@babel/types': 7.17.0 68 | jsesc: 2.5.2 69 | source-map: 0.5.7 70 | dev: true 71 | 72 | /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: 73 | resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} 74 | engines: {node: '>=6.9.0'} 75 | peerDependencies: 76 | '@babel/core': ^7.0.0 77 | dependencies: 78 | '@babel/compat-data': 7.17.7 79 | '@babel/core': 7.17.8 80 | '@babel/helper-validator-option': 7.16.7 81 | browserslist: 4.20.2 82 | semver: 6.3.0 83 | dev: true 84 | 85 | /@babel/helper-environment-visitor/7.16.7: 86 | resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} 87 | engines: {node: '>=6.9.0'} 88 | dependencies: 89 | '@babel/types': 7.17.0 90 | dev: true 91 | 92 | /@babel/helper-function-name/7.16.7: 93 | resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} 94 | engines: {node: '>=6.9.0'} 95 | dependencies: 96 | '@babel/helper-get-function-arity': 7.16.7 97 | '@babel/template': 7.16.7 98 | '@babel/types': 7.17.0 99 | dev: true 100 | 101 | /@babel/helper-get-function-arity/7.16.7: 102 | resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} 103 | engines: {node: '>=6.9.0'} 104 | dependencies: 105 | '@babel/types': 7.17.0 106 | dev: true 107 | 108 | /@babel/helper-hoist-variables/7.16.7: 109 | resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} 110 | engines: {node: '>=6.9.0'} 111 | dependencies: 112 | '@babel/types': 7.17.0 113 | dev: true 114 | 115 | /@babel/helper-module-imports/7.16.7: 116 | resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/types': 7.17.0 120 | dev: true 121 | 122 | /@babel/helper-module-transforms/7.17.7: 123 | resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} 124 | engines: {node: '>=6.9.0'} 125 | dependencies: 126 | '@babel/helper-environment-visitor': 7.16.7 127 | '@babel/helper-module-imports': 7.16.7 128 | '@babel/helper-simple-access': 7.17.7 129 | '@babel/helper-split-export-declaration': 7.16.7 130 | '@babel/helper-validator-identifier': 7.16.7 131 | '@babel/template': 7.16.7 132 | '@babel/traverse': 7.17.3 133 | '@babel/types': 7.17.0 134 | transitivePeerDependencies: 135 | - supports-color 136 | dev: true 137 | 138 | /@babel/helper-plugin-utils/7.16.7: 139 | resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} 140 | engines: {node: '>=6.9.0'} 141 | dev: true 142 | 143 | /@babel/helper-simple-access/7.17.7: 144 | resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} 145 | engines: {node: '>=6.9.0'} 146 | dependencies: 147 | '@babel/types': 7.17.0 148 | dev: true 149 | 150 | /@babel/helper-split-export-declaration/7.16.7: 151 | resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} 152 | engines: {node: '>=6.9.0'} 153 | dependencies: 154 | '@babel/types': 7.17.0 155 | dev: true 156 | 157 | /@babel/helper-validator-identifier/7.16.7: 158 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 159 | engines: {node: '>=6.9.0'} 160 | dev: true 161 | 162 | /@babel/helper-validator-option/7.16.7: 163 | resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} 164 | engines: {node: '>=6.9.0'} 165 | dev: true 166 | 167 | /@babel/helpers/7.17.8: 168 | resolution: {integrity: sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==} 169 | engines: {node: '>=6.9.0'} 170 | dependencies: 171 | '@babel/template': 7.16.7 172 | '@babel/traverse': 7.17.3 173 | '@babel/types': 7.17.0 174 | transitivePeerDependencies: 175 | - supports-color 176 | dev: true 177 | 178 | /@babel/highlight/7.16.10: 179 | resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} 180 | engines: {node: '>=6.9.0'} 181 | dependencies: 182 | '@babel/helper-validator-identifier': 7.16.7 183 | chalk: 2.4.2 184 | js-tokens: 4.0.0 185 | dev: true 186 | 187 | /@babel/parser/7.17.8: 188 | resolution: {integrity: sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==} 189 | engines: {node: '>=6.0.0'} 190 | hasBin: true 191 | dev: true 192 | 193 | /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.8: 194 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 195 | peerDependencies: 196 | '@babel/core': ^7.0.0-0 197 | dependencies: 198 | '@babel/core': 7.17.8 199 | '@babel/helper-plugin-utils': 7.16.7 200 | dev: true 201 | 202 | /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.8: 203 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 204 | peerDependencies: 205 | '@babel/core': ^7.0.0-0 206 | dependencies: 207 | '@babel/core': 7.17.8 208 | '@babel/helper-plugin-utils': 7.16.7 209 | dev: true 210 | 211 | /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.8: 212 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 213 | peerDependencies: 214 | '@babel/core': ^7.0.0-0 215 | dependencies: 216 | '@babel/core': 7.17.8 217 | '@babel/helper-plugin-utils': 7.16.7 218 | dev: true 219 | 220 | /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.8: 221 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 222 | peerDependencies: 223 | '@babel/core': ^7.0.0-0 224 | dependencies: 225 | '@babel/core': 7.17.8 226 | '@babel/helper-plugin-utils': 7.16.7 227 | dev: true 228 | 229 | /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.8: 230 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 231 | peerDependencies: 232 | '@babel/core': ^7.0.0-0 233 | dependencies: 234 | '@babel/core': 7.17.8 235 | '@babel/helper-plugin-utils': 7.16.7 236 | dev: true 237 | 238 | /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.8: 239 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 240 | peerDependencies: 241 | '@babel/core': ^7.0.0-0 242 | dependencies: 243 | '@babel/core': 7.17.8 244 | '@babel/helper-plugin-utils': 7.16.7 245 | dev: true 246 | 247 | /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.8: 248 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 249 | peerDependencies: 250 | '@babel/core': ^7.0.0-0 251 | dependencies: 252 | '@babel/core': 7.17.8 253 | '@babel/helper-plugin-utils': 7.16.7 254 | dev: true 255 | 256 | /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.8: 257 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 258 | peerDependencies: 259 | '@babel/core': ^7.0.0-0 260 | dependencies: 261 | '@babel/core': 7.17.8 262 | '@babel/helper-plugin-utils': 7.16.7 263 | dev: true 264 | 265 | /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.8: 266 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 267 | peerDependencies: 268 | '@babel/core': ^7.0.0-0 269 | dependencies: 270 | '@babel/core': 7.17.8 271 | '@babel/helper-plugin-utils': 7.16.7 272 | dev: true 273 | 274 | /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.8: 275 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 276 | peerDependencies: 277 | '@babel/core': ^7.0.0-0 278 | dependencies: 279 | '@babel/core': 7.17.8 280 | '@babel/helper-plugin-utils': 7.16.7 281 | dev: true 282 | 283 | /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.8: 284 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 285 | peerDependencies: 286 | '@babel/core': ^7.0.0-0 287 | dependencies: 288 | '@babel/core': 7.17.8 289 | '@babel/helper-plugin-utils': 7.16.7 290 | dev: true 291 | 292 | /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.8: 293 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 294 | engines: {node: '>=6.9.0'} 295 | peerDependencies: 296 | '@babel/core': ^7.0.0-0 297 | dependencies: 298 | '@babel/core': 7.17.8 299 | '@babel/helper-plugin-utils': 7.16.7 300 | dev: true 301 | 302 | /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.17.8: 303 | resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} 304 | engines: {node: '>=6.9.0'} 305 | peerDependencies: 306 | '@babel/core': ^7.0.0-0 307 | dependencies: 308 | '@babel/core': 7.17.8 309 | '@babel/helper-plugin-utils': 7.16.7 310 | dev: true 311 | 312 | /@babel/template/7.16.7: 313 | resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} 314 | engines: {node: '>=6.9.0'} 315 | dependencies: 316 | '@babel/code-frame': 7.16.7 317 | '@babel/parser': 7.17.8 318 | '@babel/types': 7.17.0 319 | dev: true 320 | 321 | /@babel/traverse/7.17.3: 322 | resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} 323 | engines: {node: '>=6.9.0'} 324 | dependencies: 325 | '@babel/code-frame': 7.16.7 326 | '@babel/generator': 7.17.7 327 | '@babel/helper-environment-visitor': 7.16.7 328 | '@babel/helper-function-name': 7.16.7 329 | '@babel/helper-hoist-variables': 7.16.7 330 | '@babel/helper-split-export-declaration': 7.16.7 331 | '@babel/parser': 7.17.8 332 | '@babel/types': 7.17.0 333 | debug: 4.3.4 334 | globals: 11.12.0 335 | transitivePeerDependencies: 336 | - supports-color 337 | dev: true 338 | 339 | /@babel/types/7.17.0: 340 | resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 341 | engines: {node: '>=6.9.0'} 342 | dependencies: 343 | '@babel/helper-validator-identifier': 7.16.7 344 | to-fast-properties: 2.0.0 345 | dev: true 346 | 347 | /@bcoe/v8-coverage/0.2.3: 348 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 349 | dev: true 350 | 351 | /@cspotcode/source-map-consumer/0.8.0: 352 | resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} 353 | engines: {node: '>= 12'} 354 | dev: true 355 | 356 | /@cspotcode/source-map-support/0.7.0: 357 | resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} 358 | engines: {node: '>=12'} 359 | dependencies: 360 | '@cspotcode/source-map-consumer': 0.8.0 361 | dev: true 362 | 363 | /@eslint/eslintrc/1.2.1: 364 | resolution: {integrity: sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==} 365 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 366 | dependencies: 367 | ajv: 6.12.6 368 | debug: 4.3.4 369 | espree: 9.3.1 370 | globals: 13.13.0 371 | ignore: 5.2.0 372 | import-fresh: 3.3.0 373 | js-yaml: 4.1.0 374 | minimatch: 3.1.2 375 | strip-json-comments: 3.1.1 376 | transitivePeerDependencies: 377 | - supports-color 378 | dev: true 379 | 380 | /@humanwhocodes/config-array/0.9.5: 381 | resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} 382 | engines: {node: '>=10.10.0'} 383 | dependencies: 384 | '@humanwhocodes/object-schema': 1.2.1 385 | debug: 4.3.4 386 | minimatch: 3.1.2 387 | transitivePeerDependencies: 388 | - supports-color 389 | dev: true 390 | 391 | /@humanwhocodes/object-schema/1.2.1: 392 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 393 | dev: true 394 | 395 | /@istanbuljs/load-nyc-config/1.1.0: 396 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 397 | engines: {node: '>=8'} 398 | dependencies: 399 | camelcase: 5.3.1 400 | find-up: 4.1.0 401 | get-package-type: 0.1.0 402 | js-yaml: 3.14.1 403 | resolve-from: 5.0.0 404 | dev: true 405 | 406 | /@istanbuljs/schema/0.1.3: 407 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 408 | engines: {node: '>=8'} 409 | dev: true 410 | 411 | /@jest/console/27.5.1: 412 | resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} 413 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 414 | dependencies: 415 | '@jest/types': 27.5.1 416 | '@types/node': 17.0.23 417 | chalk: 4.1.2 418 | jest-message-util: 27.5.1 419 | jest-util: 27.5.1 420 | slash: 3.0.0 421 | dev: true 422 | 423 | /@jest/core/27.5.1_ts-node@10.7.0: 424 | resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} 425 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 426 | peerDependencies: 427 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 428 | peerDependenciesMeta: 429 | node-notifier: 430 | optional: true 431 | dependencies: 432 | '@jest/console': 27.5.1 433 | '@jest/reporters': 27.5.1 434 | '@jest/test-result': 27.5.1 435 | '@jest/transform': 27.5.1 436 | '@jest/types': 27.5.1 437 | '@types/node': 17.0.23 438 | ansi-escapes: 4.3.2 439 | chalk: 4.1.2 440 | emittery: 0.8.1 441 | exit: 0.1.2 442 | graceful-fs: 4.2.10 443 | jest-changed-files: 27.5.1 444 | jest-config: 27.5.1_ts-node@10.7.0 445 | jest-haste-map: 27.5.1 446 | jest-message-util: 27.5.1 447 | jest-regex-util: 27.5.1 448 | jest-resolve: 27.5.1 449 | jest-resolve-dependencies: 27.5.1 450 | jest-runner: 27.5.1 451 | jest-runtime: 27.5.1 452 | jest-snapshot: 27.5.1 453 | jest-util: 27.5.1 454 | jest-validate: 27.5.1 455 | jest-watcher: 27.5.1 456 | micromatch: 4.0.5 457 | rimraf: 3.0.2 458 | slash: 3.0.0 459 | strip-ansi: 6.0.1 460 | transitivePeerDependencies: 461 | - bufferutil 462 | - canvas 463 | - supports-color 464 | - ts-node 465 | - utf-8-validate 466 | dev: true 467 | 468 | /@jest/environment/27.5.1: 469 | resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} 470 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 471 | dependencies: 472 | '@jest/fake-timers': 27.5.1 473 | '@jest/types': 27.5.1 474 | '@types/node': 17.0.23 475 | jest-mock: 27.5.1 476 | dev: true 477 | 478 | /@jest/fake-timers/27.5.1: 479 | resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} 480 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 481 | dependencies: 482 | '@jest/types': 27.5.1 483 | '@sinonjs/fake-timers': 8.1.0 484 | '@types/node': 17.0.23 485 | jest-message-util: 27.5.1 486 | jest-mock: 27.5.1 487 | jest-util: 27.5.1 488 | dev: true 489 | 490 | /@jest/globals/27.5.1: 491 | resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} 492 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 493 | dependencies: 494 | '@jest/environment': 27.5.1 495 | '@jest/types': 27.5.1 496 | expect: 27.5.1 497 | dev: true 498 | 499 | /@jest/reporters/27.5.1: 500 | resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} 501 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 502 | peerDependencies: 503 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 504 | peerDependenciesMeta: 505 | node-notifier: 506 | optional: true 507 | dependencies: 508 | '@bcoe/v8-coverage': 0.2.3 509 | '@jest/console': 27.5.1 510 | '@jest/test-result': 27.5.1 511 | '@jest/transform': 27.5.1 512 | '@jest/types': 27.5.1 513 | '@types/node': 17.0.23 514 | chalk: 4.1.2 515 | collect-v8-coverage: 1.0.1 516 | exit: 0.1.2 517 | glob: 7.2.0 518 | graceful-fs: 4.2.10 519 | istanbul-lib-coverage: 3.2.0 520 | istanbul-lib-instrument: 5.1.0 521 | istanbul-lib-report: 3.0.0 522 | istanbul-lib-source-maps: 4.0.1 523 | istanbul-reports: 3.1.4 524 | jest-haste-map: 27.5.1 525 | jest-resolve: 27.5.1 526 | jest-util: 27.5.1 527 | jest-worker: 27.5.1 528 | slash: 3.0.0 529 | source-map: 0.6.1 530 | string-length: 4.0.2 531 | terminal-link: 2.1.1 532 | v8-to-istanbul: 8.1.1 533 | transitivePeerDependencies: 534 | - supports-color 535 | dev: true 536 | 537 | /@jest/source-map/27.5.1: 538 | resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} 539 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 540 | dependencies: 541 | callsites: 3.1.0 542 | graceful-fs: 4.2.10 543 | source-map: 0.6.1 544 | dev: true 545 | 546 | /@jest/test-result/27.5.1: 547 | resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} 548 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 549 | dependencies: 550 | '@jest/console': 27.5.1 551 | '@jest/types': 27.5.1 552 | '@types/istanbul-lib-coverage': 2.0.4 553 | collect-v8-coverage: 1.0.1 554 | dev: true 555 | 556 | /@jest/test-sequencer/27.5.1: 557 | resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} 558 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 559 | dependencies: 560 | '@jest/test-result': 27.5.1 561 | graceful-fs: 4.2.10 562 | jest-haste-map: 27.5.1 563 | jest-runtime: 27.5.1 564 | transitivePeerDependencies: 565 | - supports-color 566 | dev: true 567 | 568 | /@jest/transform/27.5.1: 569 | resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} 570 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 571 | dependencies: 572 | '@babel/core': 7.17.8 573 | '@jest/types': 27.5.1 574 | babel-plugin-istanbul: 6.1.1 575 | chalk: 4.1.2 576 | convert-source-map: 1.8.0 577 | fast-json-stable-stringify: 2.1.0 578 | graceful-fs: 4.2.10 579 | jest-haste-map: 27.5.1 580 | jest-regex-util: 27.5.1 581 | jest-util: 27.5.1 582 | micromatch: 4.0.5 583 | pirates: 4.0.5 584 | slash: 3.0.0 585 | source-map: 0.6.1 586 | write-file-atomic: 3.0.3 587 | transitivePeerDependencies: 588 | - supports-color 589 | dev: true 590 | 591 | /@jest/types/27.5.1: 592 | resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} 593 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 594 | dependencies: 595 | '@types/istanbul-lib-coverage': 2.0.4 596 | '@types/istanbul-reports': 3.0.1 597 | '@types/node': 17.0.23 598 | '@types/yargs': 16.0.4 599 | chalk: 4.1.2 600 | dev: true 601 | 602 | /@jridgewell/resolve-uri/3.0.5: 603 | resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} 604 | engines: {node: '>=6.0.0'} 605 | dev: true 606 | 607 | /@jridgewell/sourcemap-codec/1.4.11: 608 | resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} 609 | dev: true 610 | 611 | /@jridgewell/trace-mapping/0.3.4: 612 | resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} 613 | dependencies: 614 | '@jridgewell/resolve-uri': 3.0.5 615 | '@jridgewell/sourcemap-codec': 1.4.11 616 | dev: true 617 | 618 | /@sinonjs/commons/1.8.3: 619 | resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} 620 | dependencies: 621 | type-detect: 4.0.8 622 | dev: true 623 | 624 | /@sinonjs/fake-timers/8.1.0: 625 | resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} 626 | dependencies: 627 | '@sinonjs/commons': 1.8.3 628 | dev: true 629 | 630 | /@tootallnate/once/1.1.2: 631 | resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} 632 | engines: {node: '>= 6'} 633 | dev: true 634 | 635 | /@tsconfig/node10/1.0.8: 636 | resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} 637 | dev: true 638 | 639 | /@tsconfig/node12/1.0.9: 640 | resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} 641 | dev: true 642 | 643 | /@tsconfig/node14/1.0.1: 644 | resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} 645 | dev: true 646 | 647 | /@tsconfig/node16/1.0.2: 648 | resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} 649 | dev: true 650 | 651 | /@types/babel__core/7.1.19: 652 | resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} 653 | dependencies: 654 | '@babel/parser': 7.17.8 655 | '@babel/types': 7.17.0 656 | '@types/babel__generator': 7.6.4 657 | '@types/babel__template': 7.4.1 658 | '@types/babel__traverse': 7.14.2 659 | dev: true 660 | 661 | /@types/babel__generator/7.6.4: 662 | resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} 663 | dependencies: 664 | '@babel/types': 7.17.0 665 | dev: true 666 | 667 | /@types/babel__template/7.4.1: 668 | resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} 669 | dependencies: 670 | '@babel/parser': 7.17.8 671 | '@babel/types': 7.17.0 672 | dev: true 673 | 674 | /@types/babel__traverse/7.14.2: 675 | resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} 676 | dependencies: 677 | '@babel/types': 7.17.0 678 | dev: true 679 | 680 | /@types/graceful-fs/4.1.5: 681 | resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} 682 | dependencies: 683 | '@types/node': 17.0.23 684 | dev: true 685 | 686 | /@types/istanbul-lib-coverage/2.0.4: 687 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 688 | dev: true 689 | 690 | /@types/istanbul-lib-report/3.0.0: 691 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} 692 | dependencies: 693 | '@types/istanbul-lib-coverage': 2.0.4 694 | dev: true 695 | 696 | /@types/istanbul-reports/3.0.1: 697 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} 698 | dependencies: 699 | '@types/istanbul-lib-report': 3.0.0 700 | dev: true 701 | 702 | /@types/jest/27.4.1: 703 | resolution: {integrity: sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==} 704 | dependencies: 705 | jest-matcher-utils: 27.5.1 706 | pretty-format: 27.5.1 707 | dev: true 708 | 709 | /@types/node/17.0.23: 710 | resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} 711 | dev: true 712 | 713 | /@types/prettier/2.4.4: 714 | resolution: {integrity: sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==} 715 | dev: true 716 | 717 | /@types/stack-utils/2.0.1: 718 | resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} 719 | dev: true 720 | 721 | /@types/yargs-parser/21.0.0: 722 | resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} 723 | dev: true 724 | 725 | /@types/yargs/16.0.4: 726 | resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} 727 | dependencies: 728 | '@types/yargs-parser': 21.0.0 729 | dev: true 730 | 731 | /abab/2.0.5: 732 | resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==} 733 | dev: true 734 | 735 | /acorn-globals/6.0.0: 736 | resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} 737 | dependencies: 738 | acorn: 7.4.1 739 | acorn-walk: 7.2.0 740 | dev: true 741 | 742 | /acorn-jsx/5.3.2_acorn@8.7.0: 743 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 744 | peerDependencies: 745 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 746 | dependencies: 747 | acorn: 8.7.0 748 | dev: true 749 | 750 | /acorn-walk/7.2.0: 751 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 752 | engines: {node: '>=0.4.0'} 753 | dev: true 754 | 755 | /acorn-walk/8.2.0: 756 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 757 | engines: {node: '>=0.4.0'} 758 | dev: true 759 | 760 | /acorn/7.4.1: 761 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 762 | engines: {node: '>=0.4.0'} 763 | hasBin: true 764 | dev: true 765 | 766 | /acorn/8.7.0: 767 | resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} 768 | engines: {node: '>=0.4.0'} 769 | hasBin: true 770 | dev: true 771 | 772 | /agent-base/6.0.2: 773 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 774 | engines: {node: '>= 6.0.0'} 775 | dependencies: 776 | debug: 4.3.4 777 | transitivePeerDependencies: 778 | - supports-color 779 | dev: true 780 | 781 | /ajv/6.12.6: 782 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 783 | dependencies: 784 | fast-deep-equal: 3.1.3 785 | fast-json-stable-stringify: 2.1.0 786 | json-schema-traverse: 0.4.1 787 | uri-js: 4.4.1 788 | dev: true 789 | 790 | /ansi-escapes/4.3.2: 791 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 792 | engines: {node: '>=8'} 793 | dependencies: 794 | type-fest: 0.21.3 795 | dev: true 796 | 797 | /ansi-regex/5.0.1: 798 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 799 | engines: {node: '>=8'} 800 | dev: true 801 | 802 | /ansi-styles/3.2.1: 803 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 804 | engines: {node: '>=4'} 805 | dependencies: 806 | color-convert: 1.9.3 807 | dev: true 808 | 809 | /ansi-styles/4.3.0: 810 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 811 | engines: {node: '>=8'} 812 | dependencies: 813 | color-convert: 2.0.1 814 | dev: true 815 | 816 | /ansi-styles/5.2.0: 817 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 818 | engines: {node: '>=10'} 819 | dev: true 820 | 821 | /anymatch/3.1.2: 822 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 823 | engines: {node: '>= 8'} 824 | dependencies: 825 | normalize-path: 3.0.0 826 | picomatch: 2.3.1 827 | dev: true 828 | 829 | /arg/4.1.3: 830 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 831 | dev: true 832 | 833 | /argparse/1.0.10: 834 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 835 | dependencies: 836 | sprintf-js: 1.0.3 837 | dev: true 838 | 839 | /argparse/2.0.1: 840 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 841 | dev: true 842 | 843 | /asynckit/0.4.0: 844 | resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} 845 | dev: true 846 | 847 | /babel-jest/27.5.1_@babel+core@7.17.8: 848 | resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} 849 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 850 | peerDependencies: 851 | '@babel/core': ^7.8.0 852 | dependencies: 853 | '@babel/core': 7.17.8 854 | '@jest/transform': 27.5.1 855 | '@jest/types': 27.5.1 856 | '@types/babel__core': 7.1.19 857 | babel-plugin-istanbul: 6.1.1 858 | babel-preset-jest: 27.5.1_@babel+core@7.17.8 859 | chalk: 4.1.2 860 | graceful-fs: 4.2.10 861 | slash: 3.0.0 862 | transitivePeerDependencies: 863 | - supports-color 864 | dev: true 865 | 866 | /babel-plugin-istanbul/6.1.1: 867 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 868 | engines: {node: '>=8'} 869 | dependencies: 870 | '@babel/helper-plugin-utils': 7.16.7 871 | '@istanbuljs/load-nyc-config': 1.1.0 872 | '@istanbuljs/schema': 0.1.3 873 | istanbul-lib-instrument: 5.1.0 874 | test-exclude: 6.0.0 875 | transitivePeerDependencies: 876 | - supports-color 877 | dev: true 878 | 879 | /babel-plugin-jest-hoist/27.5.1: 880 | resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} 881 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 882 | dependencies: 883 | '@babel/template': 7.16.7 884 | '@babel/types': 7.17.0 885 | '@types/babel__core': 7.1.19 886 | '@types/babel__traverse': 7.14.2 887 | dev: true 888 | 889 | /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.8: 890 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} 891 | peerDependencies: 892 | '@babel/core': ^7.0.0 893 | dependencies: 894 | '@babel/core': 7.17.8 895 | '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 896 | '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.17.8 897 | '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.8 898 | '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.17.8 899 | '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 900 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 901 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 902 | '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 903 | '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 904 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 905 | '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 906 | '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.8 907 | dev: true 908 | 909 | /babel-preset-jest/27.5.1_@babel+core@7.17.8: 910 | resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} 911 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 912 | peerDependencies: 913 | '@babel/core': ^7.0.0 914 | dependencies: 915 | '@babel/core': 7.17.8 916 | babel-plugin-jest-hoist: 27.5.1 917 | babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 918 | dev: true 919 | 920 | /balanced-match/1.0.2: 921 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 922 | dev: true 923 | 924 | /brace-expansion/1.1.11: 925 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 926 | dependencies: 927 | balanced-match: 1.0.2 928 | concat-map: 0.0.1 929 | dev: true 930 | 931 | /braces/3.0.2: 932 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 933 | engines: {node: '>=8'} 934 | dependencies: 935 | fill-range: 7.0.1 936 | dev: true 937 | 938 | /browser-process-hrtime/1.0.0: 939 | resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} 940 | dev: true 941 | 942 | /browserslist/4.20.2: 943 | resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} 944 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 945 | hasBin: true 946 | dependencies: 947 | caniuse-lite: 1.0.30001325 948 | electron-to-chromium: 1.4.103 949 | escalade: 3.1.1 950 | node-releases: 2.0.2 951 | picocolors: 1.0.0 952 | dev: true 953 | 954 | /bser/2.1.1: 955 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 956 | dependencies: 957 | node-int64: 0.4.0 958 | dev: true 959 | 960 | /buffer-from/1.1.2: 961 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 962 | dev: true 963 | 964 | /callsites/3.1.0: 965 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 966 | engines: {node: '>=6'} 967 | dev: true 968 | 969 | /camelcase/5.3.1: 970 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 971 | engines: {node: '>=6'} 972 | dev: true 973 | 974 | /camelcase/6.3.0: 975 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 976 | engines: {node: '>=10'} 977 | dev: true 978 | 979 | /caniuse-lite/1.0.30001325: 980 | resolution: {integrity: sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==} 981 | dev: true 982 | 983 | /chalk/2.4.2: 984 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 985 | engines: {node: '>=4'} 986 | dependencies: 987 | ansi-styles: 3.2.1 988 | escape-string-regexp: 1.0.5 989 | supports-color: 5.5.0 990 | dev: true 991 | 992 | /chalk/4.1.2: 993 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 994 | engines: {node: '>=10'} 995 | dependencies: 996 | ansi-styles: 4.3.0 997 | supports-color: 7.2.0 998 | dev: true 999 | 1000 | /char-regex/1.0.2: 1001 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 1002 | engines: {node: '>=10'} 1003 | dev: true 1004 | 1005 | /ci-info/3.3.0: 1006 | resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} 1007 | dev: true 1008 | 1009 | /cjs-module-lexer/1.2.2: 1010 | resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} 1011 | dev: true 1012 | 1013 | /cliui/7.0.4: 1014 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 1015 | dependencies: 1016 | string-width: 4.2.3 1017 | strip-ansi: 6.0.1 1018 | wrap-ansi: 7.0.0 1019 | dev: true 1020 | 1021 | /co/4.6.0: 1022 | resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} 1023 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 1024 | dev: true 1025 | 1026 | /collect-v8-coverage/1.0.1: 1027 | resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} 1028 | dev: true 1029 | 1030 | /color-convert/1.9.3: 1031 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1032 | dependencies: 1033 | color-name: 1.1.3 1034 | dev: true 1035 | 1036 | /color-convert/2.0.1: 1037 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1038 | engines: {node: '>=7.0.0'} 1039 | dependencies: 1040 | color-name: 1.1.4 1041 | dev: true 1042 | 1043 | /color-name/1.1.3: 1044 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 1045 | dev: true 1046 | 1047 | /color-name/1.1.4: 1048 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1049 | dev: true 1050 | 1051 | /combined-stream/1.0.8: 1052 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1053 | engines: {node: '>= 0.8'} 1054 | dependencies: 1055 | delayed-stream: 1.0.0 1056 | dev: true 1057 | 1058 | /concat-map/0.0.1: 1059 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 1060 | dev: true 1061 | 1062 | /convert-source-map/1.8.0: 1063 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} 1064 | dependencies: 1065 | safe-buffer: 5.1.2 1066 | dev: true 1067 | 1068 | /create-require/1.1.1: 1069 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 1070 | dev: true 1071 | 1072 | /cross-spawn/7.0.3: 1073 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1074 | engines: {node: '>= 8'} 1075 | dependencies: 1076 | path-key: 3.1.1 1077 | shebang-command: 2.0.0 1078 | which: 2.0.2 1079 | dev: true 1080 | 1081 | /cssom/0.3.8: 1082 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 1083 | dev: true 1084 | 1085 | /cssom/0.4.4: 1086 | resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} 1087 | dev: true 1088 | 1089 | /cssstyle/2.3.0: 1090 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 1091 | engines: {node: '>=8'} 1092 | dependencies: 1093 | cssom: 0.3.8 1094 | dev: true 1095 | 1096 | /data-urls/2.0.0: 1097 | resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} 1098 | engines: {node: '>=10'} 1099 | dependencies: 1100 | abab: 2.0.5 1101 | whatwg-mimetype: 2.3.0 1102 | whatwg-url: 8.7.0 1103 | dev: true 1104 | 1105 | /debug/4.3.4: 1106 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1107 | engines: {node: '>=6.0'} 1108 | peerDependencies: 1109 | supports-color: '*' 1110 | peerDependenciesMeta: 1111 | supports-color: 1112 | optional: true 1113 | dependencies: 1114 | ms: 2.1.2 1115 | dev: true 1116 | 1117 | /decimal.js/10.3.1: 1118 | resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} 1119 | dev: true 1120 | 1121 | /dedent/0.7.0: 1122 | resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} 1123 | dev: true 1124 | 1125 | /deep-is/0.1.4: 1126 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1127 | dev: true 1128 | 1129 | /deepmerge/4.2.2: 1130 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 1131 | engines: {node: '>=0.10.0'} 1132 | dev: true 1133 | 1134 | /delayed-stream/1.0.0: 1135 | resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} 1136 | engines: {node: '>=0.4.0'} 1137 | dev: true 1138 | 1139 | /detect-newline/3.1.0: 1140 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1141 | engines: {node: '>=8'} 1142 | dev: true 1143 | 1144 | /diff-sequences/27.5.1: 1145 | resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} 1146 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1147 | dev: true 1148 | 1149 | /diff/4.0.2: 1150 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 1151 | engines: {node: '>=0.3.1'} 1152 | dev: true 1153 | 1154 | /doctrine/3.0.0: 1155 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1156 | engines: {node: '>=6.0.0'} 1157 | dependencies: 1158 | esutils: 2.0.3 1159 | dev: true 1160 | 1161 | /domexception/2.0.1: 1162 | resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} 1163 | engines: {node: '>=8'} 1164 | dependencies: 1165 | webidl-conversions: 5.0.0 1166 | dev: true 1167 | 1168 | /electron-to-chromium/1.4.103: 1169 | resolution: {integrity: sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==} 1170 | dev: true 1171 | 1172 | /emittery/0.8.1: 1173 | resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} 1174 | engines: {node: '>=10'} 1175 | dev: true 1176 | 1177 | /emoji-regex/8.0.0: 1178 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1179 | dev: true 1180 | 1181 | /error-ex/1.3.2: 1182 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1183 | dependencies: 1184 | is-arrayish: 0.2.1 1185 | dev: true 1186 | 1187 | /escalade/3.1.1: 1188 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1189 | engines: {node: '>=6'} 1190 | dev: true 1191 | 1192 | /escape-string-regexp/1.0.5: 1193 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 1194 | engines: {node: '>=0.8.0'} 1195 | dev: true 1196 | 1197 | /escape-string-regexp/2.0.0: 1198 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1199 | engines: {node: '>=8'} 1200 | dev: true 1201 | 1202 | /escape-string-regexp/4.0.0: 1203 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1204 | engines: {node: '>=10'} 1205 | dev: true 1206 | 1207 | /escodegen/2.0.0: 1208 | resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} 1209 | engines: {node: '>=6.0'} 1210 | hasBin: true 1211 | dependencies: 1212 | esprima: 4.0.1 1213 | estraverse: 5.3.0 1214 | esutils: 2.0.3 1215 | optionator: 0.8.3 1216 | optionalDependencies: 1217 | source-map: 0.6.1 1218 | dev: true 1219 | 1220 | /eslint-scope/7.1.1: 1221 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1222 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1223 | dependencies: 1224 | esrecurse: 4.3.0 1225 | estraverse: 5.3.0 1226 | dev: true 1227 | 1228 | /eslint-utils/3.0.0_eslint@8.12.0: 1229 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1230 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1231 | peerDependencies: 1232 | eslint: '>=5' 1233 | dependencies: 1234 | eslint: 8.12.0 1235 | eslint-visitor-keys: 2.1.0 1236 | dev: true 1237 | 1238 | /eslint-visitor-keys/2.1.0: 1239 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1240 | engines: {node: '>=10'} 1241 | dev: true 1242 | 1243 | /eslint-visitor-keys/3.3.0: 1244 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1245 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1246 | dev: true 1247 | 1248 | /eslint/8.12.0: 1249 | resolution: {integrity: sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==} 1250 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1251 | hasBin: true 1252 | dependencies: 1253 | '@eslint/eslintrc': 1.2.1 1254 | '@humanwhocodes/config-array': 0.9.5 1255 | ajv: 6.12.6 1256 | chalk: 4.1.2 1257 | cross-spawn: 7.0.3 1258 | debug: 4.3.4 1259 | doctrine: 3.0.0 1260 | escape-string-regexp: 4.0.0 1261 | eslint-scope: 7.1.1 1262 | eslint-utils: 3.0.0_eslint@8.12.0 1263 | eslint-visitor-keys: 3.3.0 1264 | espree: 9.3.1 1265 | esquery: 1.4.0 1266 | esutils: 2.0.3 1267 | fast-deep-equal: 3.1.3 1268 | file-entry-cache: 6.0.1 1269 | functional-red-black-tree: 1.0.1 1270 | glob-parent: 6.0.2 1271 | globals: 13.13.0 1272 | ignore: 5.2.0 1273 | import-fresh: 3.3.0 1274 | imurmurhash: 0.1.4 1275 | is-glob: 4.0.3 1276 | js-yaml: 4.1.0 1277 | json-stable-stringify-without-jsonify: 1.0.1 1278 | levn: 0.4.1 1279 | lodash.merge: 4.6.2 1280 | minimatch: 3.1.2 1281 | natural-compare: 1.4.0 1282 | optionator: 0.9.1 1283 | regexpp: 3.2.0 1284 | strip-ansi: 6.0.1 1285 | strip-json-comments: 3.1.1 1286 | text-table: 0.2.0 1287 | v8-compile-cache: 2.3.0 1288 | transitivePeerDependencies: 1289 | - supports-color 1290 | dev: true 1291 | 1292 | /espree/9.3.1: 1293 | resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} 1294 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1295 | dependencies: 1296 | acorn: 8.7.0 1297 | acorn-jsx: 5.3.2_acorn@8.7.0 1298 | eslint-visitor-keys: 3.3.0 1299 | dev: true 1300 | 1301 | /esprima/4.0.1: 1302 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1303 | engines: {node: '>=4'} 1304 | hasBin: true 1305 | dev: true 1306 | 1307 | /esquery/1.4.0: 1308 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1309 | engines: {node: '>=0.10'} 1310 | dependencies: 1311 | estraverse: 5.3.0 1312 | dev: true 1313 | 1314 | /esrecurse/4.3.0: 1315 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1316 | engines: {node: '>=4.0'} 1317 | dependencies: 1318 | estraverse: 5.3.0 1319 | dev: true 1320 | 1321 | /estraverse/5.3.0: 1322 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1323 | engines: {node: '>=4.0'} 1324 | dev: true 1325 | 1326 | /esutils/2.0.3: 1327 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1328 | engines: {node: '>=0.10.0'} 1329 | dev: true 1330 | 1331 | /execa/5.1.1: 1332 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1333 | engines: {node: '>=10'} 1334 | dependencies: 1335 | cross-spawn: 7.0.3 1336 | get-stream: 6.0.1 1337 | human-signals: 2.1.0 1338 | is-stream: 2.0.1 1339 | merge-stream: 2.0.0 1340 | npm-run-path: 4.0.1 1341 | onetime: 5.1.2 1342 | signal-exit: 3.0.7 1343 | strip-final-newline: 2.0.0 1344 | dev: true 1345 | 1346 | /exit/0.1.2: 1347 | resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} 1348 | engines: {node: '>= 0.8.0'} 1349 | dev: true 1350 | 1351 | /expect/27.5.1: 1352 | resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} 1353 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1354 | dependencies: 1355 | '@jest/types': 27.5.1 1356 | jest-get-type: 27.5.1 1357 | jest-matcher-utils: 27.5.1 1358 | jest-message-util: 27.5.1 1359 | dev: true 1360 | 1361 | /fast-deep-equal/3.1.3: 1362 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1363 | dev: true 1364 | 1365 | /fast-json-stable-stringify/2.1.0: 1366 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1367 | dev: true 1368 | 1369 | /fast-levenshtein/2.0.6: 1370 | resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} 1371 | dev: true 1372 | 1373 | /fb-watchman/2.0.1: 1374 | resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} 1375 | dependencies: 1376 | bser: 2.1.1 1377 | dev: true 1378 | 1379 | /file-entry-cache/6.0.1: 1380 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1381 | engines: {node: ^10.12.0 || >=12.0.0} 1382 | dependencies: 1383 | flat-cache: 3.0.4 1384 | dev: true 1385 | 1386 | /fill-range/7.0.1: 1387 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1388 | engines: {node: '>=8'} 1389 | dependencies: 1390 | to-regex-range: 5.0.1 1391 | dev: true 1392 | 1393 | /find-up/4.1.0: 1394 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1395 | engines: {node: '>=8'} 1396 | dependencies: 1397 | locate-path: 5.0.0 1398 | path-exists: 4.0.0 1399 | dev: true 1400 | 1401 | /flat-cache/3.0.4: 1402 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1403 | engines: {node: ^10.12.0 || >=12.0.0} 1404 | dependencies: 1405 | flatted: 3.2.5 1406 | rimraf: 3.0.2 1407 | dev: true 1408 | 1409 | /flatted/3.2.5: 1410 | resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} 1411 | dev: true 1412 | 1413 | /form-data/3.0.1: 1414 | resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 1415 | engines: {node: '>= 6'} 1416 | dependencies: 1417 | asynckit: 0.4.0 1418 | combined-stream: 1.0.8 1419 | mime-types: 2.1.35 1420 | dev: true 1421 | 1422 | /fs.realpath/1.0.0: 1423 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 1424 | dev: true 1425 | 1426 | /fsevents/2.3.2: 1427 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1428 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1429 | os: [darwin] 1430 | requiresBuild: true 1431 | dev: true 1432 | optional: true 1433 | 1434 | /function-bind/1.1.1: 1435 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1436 | dev: true 1437 | 1438 | /functional-red-black-tree/1.0.1: 1439 | resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} 1440 | dev: true 1441 | 1442 | /gensync/1.0.0-beta.2: 1443 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1444 | engines: {node: '>=6.9.0'} 1445 | dev: true 1446 | 1447 | /get-caller-file/2.0.5: 1448 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1449 | engines: {node: 6.* || 8.* || >= 10.*} 1450 | dev: true 1451 | 1452 | /get-package-type/0.1.0: 1453 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 1454 | engines: {node: '>=8.0.0'} 1455 | dev: true 1456 | 1457 | /get-stream/6.0.1: 1458 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1459 | engines: {node: '>=10'} 1460 | dev: true 1461 | 1462 | /glob-parent/6.0.2: 1463 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1464 | engines: {node: '>=10.13.0'} 1465 | dependencies: 1466 | is-glob: 4.0.3 1467 | dev: true 1468 | 1469 | /glob/7.2.0: 1470 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 1471 | dependencies: 1472 | fs.realpath: 1.0.0 1473 | inflight: 1.0.6 1474 | inherits: 2.0.4 1475 | minimatch: 3.1.2 1476 | once: 1.4.0 1477 | path-is-absolute: 1.0.1 1478 | dev: true 1479 | 1480 | /globals/11.12.0: 1481 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1482 | engines: {node: '>=4'} 1483 | dev: true 1484 | 1485 | /globals/13.13.0: 1486 | resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} 1487 | engines: {node: '>=8'} 1488 | dependencies: 1489 | type-fest: 0.20.2 1490 | dev: true 1491 | 1492 | /graceful-fs/4.2.10: 1493 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1494 | dev: true 1495 | 1496 | /has-flag/3.0.0: 1497 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 1498 | engines: {node: '>=4'} 1499 | dev: true 1500 | 1501 | /has-flag/4.0.0: 1502 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1503 | engines: {node: '>=8'} 1504 | dev: true 1505 | 1506 | /has/1.0.3: 1507 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1508 | engines: {node: '>= 0.4.0'} 1509 | dependencies: 1510 | function-bind: 1.1.1 1511 | dev: true 1512 | 1513 | /html-encoding-sniffer/2.0.1: 1514 | resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} 1515 | engines: {node: '>=10'} 1516 | dependencies: 1517 | whatwg-encoding: 1.0.5 1518 | dev: true 1519 | 1520 | /html-escaper/2.0.2: 1521 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1522 | dev: true 1523 | 1524 | /http-proxy-agent/4.0.1: 1525 | resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} 1526 | engines: {node: '>= 6'} 1527 | dependencies: 1528 | '@tootallnate/once': 1.1.2 1529 | agent-base: 6.0.2 1530 | debug: 4.3.4 1531 | transitivePeerDependencies: 1532 | - supports-color 1533 | dev: true 1534 | 1535 | /https-proxy-agent/5.0.0: 1536 | resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} 1537 | engines: {node: '>= 6'} 1538 | dependencies: 1539 | agent-base: 6.0.2 1540 | debug: 4.3.4 1541 | transitivePeerDependencies: 1542 | - supports-color 1543 | dev: true 1544 | 1545 | /human-signals/2.1.0: 1546 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1547 | engines: {node: '>=10.17.0'} 1548 | dev: true 1549 | 1550 | /iconv-lite/0.4.24: 1551 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1552 | engines: {node: '>=0.10.0'} 1553 | dependencies: 1554 | safer-buffer: 2.1.2 1555 | dev: true 1556 | 1557 | /ignore/5.2.0: 1558 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 1559 | engines: {node: '>= 4'} 1560 | dev: true 1561 | 1562 | /import-fresh/3.3.0: 1563 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1564 | engines: {node: '>=6'} 1565 | dependencies: 1566 | parent-module: 1.0.1 1567 | resolve-from: 4.0.0 1568 | dev: true 1569 | 1570 | /import-local/3.1.0: 1571 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 1572 | engines: {node: '>=8'} 1573 | hasBin: true 1574 | dependencies: 1575 | pkg-dir: 4.2.0 1576 | resolve-cwd: 3.0.0 1577 | dev: true 1578 | 1579 | /imurmurhash/0.1.4: 1580 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 1581 | engines: {node: '>=0.8.19'} 1582 | dev: true 1583 | 1584 | /inflight/1.0.6: 1585 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 1586 | dependencies: 1587 | once: 1.4.0 1588 | wrappy: 1.0.2 1589 | dev: true 1590 | 1591 | /inherits/2.0.4: 1592 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1593 | dev: true 1594 | 1595 | /is-arrayish/0.2.1: 1596 | resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} 1597 | dev: true 1598 | 1599 | /is-core-module/2.8.1: 1600 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 1601 | dependencies: 1602 | has: 1.0.3 1603 | dev: true 1604 | 1605 | /is-extglob/2.1.1: 1606 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 1607 | engines: {node: '>=0.10.0'} 1608 | dev: true 1609 | 1610 | /is-fullwidth-code-point/3.0.0: 1611 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1612 | engines: {node: '>=8'} 1613 | dev: true 1614 | 1615 | /is-generator-fn/2.1.0: 1616 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1617 | engines: {node: '>=6'} 1618 | dev: true 1619 | 1620 | /is-glob/4.0.3: 1621 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1622 | engines: {node: '>=0.10.0'} 1623 | dependencies: 1624 | is-extglob: 2.1.1 1625 | dev: true 1626 | 1627 | /is-number/7.0.0: 1628 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1629 | engines: {node: '>=0.12.0'} 1630 | dev: true 1631 | 1632 | /is-potential-custom-element-name/1.0.1: 1633 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 1634 | dev: true 1635 | 1636 | /is-stream/2.0.1: 1637 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1638 | engines: {node: '>=8'} 1639 | dev: true 1640 | 1641 | /is-typedarray/1.0.0: 1642 | resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} 1643 | dev: true 1644 | 1645 | /isexe/2.0.0: 1646 | resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 1647 | dev: true 1648 | 1649 | /istanbul-lib-coverage/3.2.0: 1650 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} 1651 | engines: {node: '>=8'} 1652 | dev: true 1653 | 1654 | /istanbul-lib-instrument/5.1.0: 1655 | resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} 1656 | engines: {node: '>=8'} 1657 | dependencies: 1658 | '@babel/core': 7.17.8 1659 | '@babel/parser': 7.17.8 1660 | '@istanbuljs/schema': 0.1.3 1661 | istanbul-lib-coverage: 3.2.0 1662 | semver: 6.3.0 1663 | transitivePeerDependencies: 1664 | - supports-color 1665 | dev: true 1666 | 1667 | /istanbul-lib-report/3.0.0: 1668 | resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} 1669 | engines: {node: '>=8'} 1670 | dependencies: 1671 | istanbul-lib-coverage: 3.2.0 1672 | make-dir: 3.1.0 1673 | supports-color: 7.2.0 1674 | dev: true 1675 | 1676 | /istanbul-lib-source-maps/4.0.1: 1677 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1678 | engines: {node: '>=10'} 1679 | dependencies: 1680 | debug: 4.3.4 1681 | istanbul-lib-coverage: 3.2.0 1682 | source-map: 0.6.1 1683 | transitivePeerDependencies: 1684 | - supports-color 1685 | dev: true 1686 | 1687 | /istanbul-reports/3.1.4: 1688 | resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} 1689 | engines: {node: '>=8'} 1690 | dependencies: 1691 | html-escaper: 2.0.2 1692 | istanbul-lib-report: 3.0.0 1693 | dev: true 1694 | 1695 | /jest-changed-files/27.5.1: 1696 | resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} 1697 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1698 | dependencies: 1699 | '@jest/types': 27.5.1 1700 | execa: 5.1.1 1701 | throat: 6.0.1 1702 | dev: true 1703 | 1704 | /jest-circus/27.5.1: 1705 | resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} 1706 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1707 | dependencies: 1708 | '@jest/environment': 27.5.1 1709 | '@jest/test-result': 27.5.1 1710 | '@jest/types': 27.5.1 1711 | '@types/node': 17.0.23 1712 | chalk: 4.1.2 1713 | co: 4.6.0 1714 | dedent: 0.7.0 1715 | expect: 27.5.1 1716 | is-generator-fn: 2.1.0 1717 | jest-each: 27.5.1 1718 | jest-matcher-utils: 27.5.1 1719 | jest-message-util: 27.5.1 1720 | jest-runtime: 27.5.1 1721 | jest-snapshot: 27.5.1 1722 | jest-util: 27.5.1 1723 | pretty-format: 27.5.1 1724 | slash: 3.0.0 1725 | stack-utils: 2.0.5 1726 | throat: 6.0.1 1727 | transitivePeerDependencies: 1728 | - supports-color 1729 | dev: true 1730 | 1731 | /jest-cli/27.5.1_ts-node@10.7.0: 1732 | resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} 1733 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1734 | hasBin: true 1735 | peerDependencies: 1736 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1737 | peerDependenciesMeta: 1738 | node-notifier: 1739 | optional: true 1740 | dependencies: 1741 | '@jest/core': 27.5.1_ts-node@10.7.0 1742 | '@jest/test-result': 27.5.1 1743 | '@jest/types': 27.5.1 1744 | chalk: 4.1.2 1745 | exit: 0.1.2 1746 | graceful-fs: 4.2.10 1747 | import-local: 3.1.0 1748 | jest-config: 27.5.1_ts-node@10.7.0 1749 | jest-util: 27.5.1 1750 | jest-validate: 27.5.1 1751 | prompts: 2.4.2 1752 | yargs: 16.2.0 1753 | transitivePeerDependencies: 1754 | - bufferutil 1755 | - canvas 1756 | - supports-color 1757 | - ts-node 1758 | - utf-8-validate 1759 | dev: true 1760 | 1761 | /jest-config/27.5.1_ts-node@10.7.0: 1762 | resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} 1763 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1764 | peerDependencies: 1765 | ts-node: '>=9.0.0' 1766 | peerDependenciesMeta: 1767 | ts-node: 1768 | optional: true 1769 | dependencies: 1770 | '@babel/core': 7.17.8 1771 | '@jest/test-sequencer': 27.5.1 1772 | '@jest/types': 27.5.1 1773 | babel-jest: 27.5.1_@babel+core@7.17.8 1774 | chalk: 4.1.2 1775 | ci-info: 3.3.0 1776 | deepmerge: 4.2.2 1777 | glob: 7.2.0 1778 | graceful-fs: 4.2.10 1779 | jest-circus: 27.5.1 1780 | jest-environment-jsdom: 27.5.1 1781 | jest-environment-node: 27.5.1 1782 | jest-get-type: 27.5.1 1783 | jest-jasmine2: 27.5.1 1784 | jest-regex-util: 27.5.1 1785 | jest-resolve: 27.5.1 1786 | jest-runner: 27.5.1 1787 | jest-util: 27.5.1 1788 | jest-validate: 27.5.1 1789 | micromatch: 4.0.5 1790 | parse-json: 5.2.0 1791 | pretty-format: 27.5.1 1792 | slash: 3.0.0 1793 | strip-json-comments: 3.1.1 1794 | ts-node: 10.7.0_ee885bc7281b682b6adbed6ae09ee090 1795 | transitivePeerDependencies: 1796 | - bufferutil 1797 | - canvas 1798 | - supports-color 1799 | - utf-8-validate 1800 | dev: true 1801 | 1802 | /jest-diff/27.5.1: 1803 | resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} 1804 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1805 | dependencies: 1806 | chalk: 4.1.2 1807 | diff-sequences: 27.5.1 1808 | jest-get-type: 27.5.1 1809 | pretty-format: 27.5.1 1810 | dev: true 1811 | 1812 | /jest-docblock/27.5.1: 1813 | resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} 1814 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1815 | dependencies: 1816 | detect-newline: 3.1.0 1817 | dev: true 1818 | 1819 | /jest-each/27.5.1: 1820 | resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} 1821 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1822 | dependencies: 1823 | '@jest/types': 27.5.1 1824 | chalk: 4.1.2 1825 | jest-get-type: 27.5.1 1826 | jest-util: 27.5.1 1827 | pretty-format: 27.5.1 1828 | dev: true 1829 | 1830 | /jest-environment-jsdom/27.5.1: 1831 | resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} 1832 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1833 | dependencies: 1834 | '@jest/environment': 27.5.1 1835 | '@jest/fake-timers': 27.5.1 1836 | '@jest/types': 27.5.1 1837 | '@types/node': 17.0.23 1838 | jest-mock: 27.5.1 1839 | jest-util: 27.5.1 1840 | jsdom: 16.7.0 1841 | transitivePeerDependencies: 1842 | - bufferutil 1843 | - canvas 1844 | - supports-color 1845 | - utf-8-validate 1846 | dev: true 1847 | 1848 | /jest-environment-node/27.5.1: 1849 | resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} 1850 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1851 | dependencies: 1852 | '@jest/environment': 27.5.1 1853 | '@jest/fake-timers': 27.5.1 1854 | '@jest/types': 27.5.1 1855 | '@types/node': 17.0.23 1856 | jest-mock: 27.5.1 1857 | jest-util: 27.5.1 1858 | dev: true 1859 | 1860 | /jest-get-type/27.5.1: 1861 | resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} 1862 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1863 | dev: true 1864 | 1865 | /jest-haste-map/27.5.1: 1866 | resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} 1867 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1868 | dependencies: 1869 | '@jest/types': 27.5.1 1870 | '@types/graceful-fs': 4.1.5 1871 | '@types/node': 17.0.23 1872 | anymatch: 3.1.2 1873 | fb-watchman: 2.0.1 1874 | graceful-fs: 4.2.10 1875 | jest-regex-util: 27.5.1 1876 | jest-serializer: 27.5.1 1877 | jest-util: 27.5.1 1878 | jest-worker: 27.5.1 1879 | micromatch: 4.0.5 1880 | walker: 1.0.8 1881 | optionalDependencies: 1882 | fsevents: 2.3.2 1883 | dev: true 1884 | 1885 | /jest-jasmine2/27.5.1: 1886 | resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} 1887 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1888 | dependencies: 1889 | '@jest/environment': 27.5.1 1890 | '@jest/source-map': 27.5.1 1891 | '@jest/test-result': 27.5.1 1892 | '@jest/types': 27.5.1 1893 | '@types/node': 17.0.23 1894 | chalk: 4.1.2 1895 | co: 4.6.0 1896 | expect: 27.5.1 1897 | is-generator-fn: 2.1.0 1898 | jest-each: 27.5.1 1899 | jest-matcher-utils: 27.5.1 1900 | jest-message-util: 27.5.1 1901 | jest-runtime: 27.5.1 1902 | jest-snapshot: 27.5.1 1903 | jest-util: 27.5.1 1904 | pretty-format: 27.5.1 1905 | throat: 6.0.1 1906 | transitivePeerDependencies: 1907 | - supports-color 1908 | dev: true 1909 | 1910 | /jest-leak-detector/27.5.1: 1911 | resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} 1912 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1913 | dependencies: 1914 | jest-get-type: 27.5.1 1915 | pretty-format: 27.5.1 1916 | dev: true 1917 | 1918 | /jest-matcher-utils/27.5.1: 1919 | resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} 1920 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1921 | dependencies: 1922 | chalk: 4.1.2 1923 | jest-diff: 27.5.1 1924 | jest-get-type: 27.5.1 1925 | pretty-format: 27.5.1 1926 | dev: true 1927 | 1928 | /jest-message-util/27.5.1: 1929 | resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} 1930 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1931 | dependencies: 1932 | '@babel/code-frame': 7.16.7 1933 | '@jest/types': 27.5.1 1934 | '@types/stack-utils': 2.0.1 1935 | chalk: 4.1.2 1936 | graceful-fs: 4.2.10 1937 | micromatch: 4.0.5 1938 | pretty-format: 27.5.1 1939 | slash: 3.0.0 1940 | stack-utils: 2.0.5 1941 | dev: true 1942 | 1943 | /jest-mock/27.5.1: 1944 | resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} 1945 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1946 | dependencies: 1947 | '@jest/types': 27.5.1 1948 | '@types/node': 17.0.23 1949 | dev: true 1950 | 1951 | /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: 1952 | resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} 1953 | engines: {node: '>=6'} 1954 | peerDependencies: 1955 | jest-resolve: '*' 1956 | peerDependenciesMeta: 1957 | jest-resolve: 1958 | optional: true 1959 | dependencies: 1960 | jest-resolve: 27.5.1 1961 | dev: true 1962 | 1963 | /jest-regex-util/27.5.1: 1964 | resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} 1965 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1966 | dev: true 1967 | 1968 | /jest-resolve-dependencies/27.5.1: 1969 | resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} 1970 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1971 | dependencies: 1972 | '@jest/types': 27.5.1 1973 | jest-regex-util: 27.5.1 1974 | jest-snapshot: 27.5.1 1975 | transitivePeerDependencies: 1976 | - supports-color 1977 | dev: true 1978 | 1979 | /jest-resolve/27.5.1: 1980 | resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} 1981 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1982 | dependencies: 1983 | '@jest/types': 27.5.1 1984 | chalk: 4.1.2 1985 | graceful-fs: 4.2.10 1986 | jest-haste-map: 27.5.1 1987 | jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 1988 | jest-util: 27.5.1 1989 | jest-validate: 27.5.1 1990 | resolve: 1.22.0 1991 | resolve.exports: 1.1.0 1992 | slash: 3.0.0 1993 | dev: true 1994 | 1995 | /jest-runner/27.5.1: 1996 | resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} 1997 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1998 | dependencies: 1999 | '@jest/console': 27.5.1 2000 | '@jest/environment': 27.5.1 2001 | '@jest/test-result': 27.5.1 2002 | '@jest/transform': 27.5.1 2003 | '@jest/types': 27.5.1 2004 | '@types/node': 17.0.23 2005 | chalk: 4.1.2 2006 | emittery: 0.8.1 2007 | graceful-fs: 4.2.10 2008 | jest-docblock: 27.5.1 2009 | jest-environment-jsdom: 27.5.1 2010 | jest-environment-node: 27.5.1 2011 | jest-haste-map: 27.5.1 2012 | jest-leak-detector: 27.5.1 2013 | jest-message-util: 27.5.1 2014 | jest-resolve: 27.5.1 2015 | jest-runtime: 27.5.1 2016 | jest-util: 27.5.1 2017 | jest-worker: 27.5.1 2018 | source-map-support: 0.5.21 2019 | throat: 6.0.1 2020 | transitivePeerDependencies: 2021 | - bufferutil 2022 | - canvas 2023 | - supports-color 2024 | - utf-8-validate 2025 | dev: true 2026 | 2027 | /jest-runtime/27.5.1: 2028 | resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} 2029 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2030 | dependencies: 2031 | '@jest/environment': 27.5.1 2032 | '@jest/fake-timers': 27.5.1 2033 | '@jest/globals': 27.5.1 2034 | '@jest/source-map': 27.5.1 2035 | '@jest/test-result': 27.5.1 2036 | '@jest/transform': 27.5.1 2037 | '@jest/types': 27.5.1 2038 | chalk: 4.1.2 2039 | cjs-module-lexer: 1.2.2 2040 | collect-v8-coverage: 1.0.1 2041 | execa: 5.1.1 2042 | glob: 7.2.0 2043 | graceful-fs: 4.2.10 2044 | jest-haste-map: 27.5.1 2045 | jest-message-util: 27.5.1 2046 | jest-mock: 27.5.1 2047 | jest-regex-util: 27.5.1 2048 | jest-resolve: 27.5.1 2049 | jest-snapshot: 27.5.1 2050 | jest-util: 27.5.1 2051 | slash: 3.0.0 2052 | strip-bom: 4.0.0 2053 | transitivePeerDependencies: 2054 | - supports-color 2055 | dev: true 2056 | 2057 | /jest-serializer/27.5.1: 2058 | resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} 2059 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2060 | dependencies: 2061 | '@types/node': 17.0.23 2062 | graceful-fs: 4.2.10 2063 | dev: true 2064 | 2065 | /jest-snapshot/27.5.1: 2066 | resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} 2067 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2068 | dependencies: 2069 | '@babel/core': 7.17.8 2070 | '@babel/generator': 7.17.7 2071 | '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.8 2072 | '@babel/traverse': 7.17.3 2073 | '@babel/types': 7.17.0 2074 | '@jest/transform': 27.5.1 2075 | '@jest/types': 27.5.1 2076 | '@types/babel__traverse': 7.14.2 2077 | '@types/prettier': 2.4.4 2078 | babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 2079 | chalk: 4.1.2 2080 | expect: 27.5.1 2081 | graceful-fs: 4.2.10 2082 | jest-diff: 27.5.1 2083 | jest-get-type: 27.5.1 2084 | jest-haste-map: 27.5.1 2085 | jest-matcher-utils: 27.5.1 2086 | jest-message-util: 27.5.1 2087 | jest-util: 27.5.1 2088 | natural-compare: 1.4.0 2089 | pretty-format: 27.5.1 2090 | semver: 7.3.5 2091 | transitivePeerDependencies: 2092 | - supports-color 2093 | dev: true 2094 | 2095 | /jest-util/27.5.1: 2096 | resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} 2097 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2098 | dependencies: 2099 | '@jest/types': 27.5.1 2100 | '@types/node': 17.0.23 2101 | chalk: 4.1.2 2102 | ci-info: 3.3.0 2103 | graceful-fs: 4.2.10 2104 | picomatch: 2.3.1 2105 | dev: true 2106 | 2107 | /jest-validate/27.5.1: 2108 | resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} 2109 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2110 | dependencies: 2111 | '@jest/types': 27.5.1 2112 | camelcase: 6.3.0 2113 | chalk: 4.1.2 2114 | jest-get-type: 27.5.1 2115 | leven: 3.1.0 2116 | pretty-format: 27.5.1 2117 | dev: true 2118 | 2119 | /jest-watcher/27.5.1: 2120 | resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} 2121 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2122 | dependencies: 2123 | '@jest/test-result': 27.5.1 2124 | '@jest/types': 27.5.1 2125 | '@types/node': 17.0.23 2126 | ansi-escapes: 4.3.2 2127 | chalk: 4.1.2 2128 | jest-util: 27.5.1 2129 | string-length: 4.0.2 2130 | dev: true 2131 | 2132 | /jest-worker/27.5.1: 2133 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 2134 | engines: {node: '>= 10.13.0'} 2135 | dependencies: 2136 | '@types/node': 17.0.23 2137 | merge-stream: 2.0.0 2138 | supports-color: 8.1.1 2139 | dev: true 2140 | 2141 | /jest/27.5.1_ts-node@10.7.0: 2142 | resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} 2143 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2144 | hasBin: true 2145 | peerDependencies: 2146 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2147 | peerDependenciesMeta: 2148 | node-notifier: 2149 | optional: true 2150 | dependencies: 2151 | '@jest/core': 27.5.1_ts-node@10.7.0 2152 | import-local: 3.1.0 2153 | jest-cli: 27.5.1_ts-node@10.7.0 2154 | transitivePeerDependencies: 2155 | - bufferutil 2156 | - canvas 2157 | - supports-color 2158 | - ts-node 2159 | - utf-8-validate 2160 | dev: true 2161 | 2162 | /js-tokens/4.0.0: 2163 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2164 | dev: true 2165 | 2166 | /js-yaml/3.14.1: 2167 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2168 | hasBin: true 2169 | dependencies: 2170 | argparse: 1.0.10 2171 | esprima: 4.0.1 2172 | dev: true 2173 | 2174 | /js-yaml/4.1.0: 2175 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2176 | hasBin: true 2177 | dependencies: 2178 | argparse: 2.0.1 2179 | dev: true 2180 | 2181 | /jsdom/16.7.0: 2182 | resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} 2183 | engines: {node: '>=10'} 2184 | peerDependencies: 2185 | canvas: ^2.5.0 2186 | peerDependenciesMeta: 2187 | canvas: 2188 | optional: true 2189 | dependencies: 2190 | abab: 2.0.5 2191 | acorn: 8.7.0 2192 | acorn-globals: 6.0.0 2193 | cssom: 0.4.4 2194 | cssstyle: 2.3.0 2195 | data-urls: 2.0.0 2196 | decimal.js: 10.3.1 2197 | domexception: 2.0.1 2198 | escodegen: 2.0.0 2199 | form-data: 3.0.1 2200 | html-encoding-sniffer: 2.0.1 2201 | http-proxy-agent: 4.0.1 2202 | https-proxy-agent: 5.0.0 2203 | is-potential-custom-element-name: 1.0.1 2204 | nwsapi: 2.2.0 2205 | parse5: 6.0.1 2206 | saxes: 5.0.1 2207 | symbol-tree: 3.2.4 2208 | tough-cookie: 4.0.0 2209 | w3c-hr-time: 1.0.2 2210 | w3c-xmlserializer: 2.0.0 2211 | webidl-conversions: 6.1.0 2212 | whatwg-encoding: 1.0.5 2213 | whatwg-mimetype: 2.3.0 2214 | whatwg-url: 8.7.0 2215 | ws: 7.5.7 2216 | xml-name-validator: 3.0.0 2217 | transitivePeerDependencies: 2218 | - bufferutil 2219 | - supports-color 2220 | - utf-8-validate 2221 | dev: true 2222 | 2223 | /jsesc/2.5.2: 2224 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2225 | engines: {node: '>=4'} 2226 | hasBin: true 2227 | dev: true 2228 | 2229 | /json-parse-even-better-errors/2.3.1: 2230 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2231 | dev: true 2232 | 2233 | /json-schema-traverse/0.4.1: 2234 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2235 | dev: true 2236 | 2237 | /json-stable-stringify-without-jsonify/1.0.1: 2238 | resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} 2239 | dev: true 2240 | 2241 | /json5/2.2.1: 2242 | resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} 2243 | engines: {node: '>=6'} 2244 | hasBin: true 2245 | dev: true 2246 | 2247 | /kleur/3.0.3: 2248 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2249 | engines: {node: '>=6'} 2250 | dev: true 2251 | 2252 | /leven/3.1.0: 2253 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 2254 | engines: {node: '>=6'} 2255 | dev: true 2256 | 2257 | /levn/0.3.0: 2258 | resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} 2259 | engines: {node: '>= 0.8.0'} 2260 | dependencies: 2261 | prelude-ls: 1.1.2 2262 | type-check: 0.3.2 2263 | dev: true 2264 | 2265 | /levn/0.4.1: 2266 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2267 | engines: {node: '>= 0.8.0'} 2268 | dependencies: 2269 | prelude-ls: 1.2.1 2270 | type-check: 0.4.0 2271 | dev: true 2272 | 2273 | /lines-and-columns/1.2.4: 2274 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2275 | dev: true 2276 | 2277 | /locate-path/5.0.0: 2278 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2279 | engines: {node: '>=8'} 2280 | dependencies: 2281 | p-locate: 4.1.0 2282 | dev: true 2283 | 2284 | /lodash.merge/4.6.2: 2285 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2286 | dev: true 2287 | 2288 | /lodash/4.17.21: 2289 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2290 | dev: true 2291 | 2292 | /lru-cache/6.0.0: 2293 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2294 | engines: {node: '>=10'} 2295 | dependencies: 2296 | yallist: 4.0.0 2297 | dev: true 2298 | 2299 | /make-dir/3.1.0: 2300 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 2301 | engines: {node: '>=8'} 2302 | dependencies: 2303 | semver: 6.3.0 2304 | dev: true 2305 | 2306 | /make-error/1.3.6: 2307 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2308 | dev: true 2309 | 2310 | /makeerror/1.0.12: 2311 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2312 | dependencies: 2313 | tmpl: 1.0.5 2314 | dev: true 2315 | 2316 | /merge-stream/2.0.0: 2317 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2318 | dev: true 2319 | 2320 | /micromatch/4.0.5: 2321 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2322 | engines: {node: '>=8.6'} 2323 | dependencies: 2324 | braces: 3.0.2 2325 | picomatch: 2.3.1 2326 | dev: true 2327 | 2328 | /mime-db/1.52.0: 2329 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2330 | engines: {node: '>= 0.6'} 2331 | dev: true 2332 | 2333 | /mime-types/2.1.35: 2334 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2335 | engines: {node: '>= 0.6'} 2336 | dependencies: 2337 | mime-db: 1.52.0 2338 | dev: true 2339 | 2340 | /mimic-fn/2.1.0: 2341 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2342 | engines: {node: '>=6'} 2343 | dev: true 2344 | 2345 | /minimatch/3.1.2: 2346 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2347 | dependencies: 2348 | brace-expansion: 1.1.11 2349 | dev: true 2350 | 2351 | /ms/2.1.2: 2352 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2353 | dev: true 2354 | 2355 | /natural-compare/1.4.0: 2356 | resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} 2357 | dev: true 2358 | 2359 | /node-int64/0.4.0: 2360 | resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} 2361 | dev: true 2362 | 2363 | /node-releases/2.0.2: 2364 | resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} 2365 | dev: true 2366 | 2367 | /normalize-path/3.0.0: 2368 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2369 | engines: {node: '>=0.10.0'} 2370 | dev: true 2371 | 2372 | /npm-run-path/4.0.1: 2373 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2374 | engines: {node: '>=8'} 2375 | dependencies: 2376 | path-key: 3.1.1 2377 | dev: true 2378 | 2379 | /nwsapi/2.2.0: 2380 | resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} 2381 | dev: true 2382 | 2383 | /once/1.4.0: 2384 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 2385 | dependencies: 2386 | wrappy: 1.0.2 2387 | dev: true 2388 | 2389 | /onetime/5.1.2: 2390 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2391 | engines: {node: '>=6'} 2392 | dependencies: 2393 | mimic-fn: 2.1.0 2394 | dev: true 2395 | 2396 | /optionator/0.8.3: 2397 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 2398 | engines: {node: '>= 0.8.0'} 2399 | dependencies: 2400 | deep-is: 0.1.4 2401 | fast-levenshtein: 2.0.6 2402 | levn: 0.3.0 2403 | prelude-ls: 1.1.2 2404 | type-check: 0.3.2 2405 | word-wrap: 1.2.3 2406 | dev: true 2407 | 2408 | /optionator/0.9.1: 2409 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 2410 | engines: {node: '>= 0.8.0'} 2411 | dependencies: 2412 | deep-is: 0.1.4 2413 | fast-levenshtein: 2.0.6 2414 | levn: 0.4.1 2415 | prelude-ls: 1.2.1 2416 | type-check: 0.4.0 2417 | word-wrap: 1.2.3 2418 | dev: true 2419 | 2420 | /p-limit/2.3.0: 2421 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2422 | engines: {node: '>=6'} 2423 | dependencies: 2424 | p-try: 2.2.0 2425 | dev: true 2426 | 2427 | /p-locate/4.1.0: 2428 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2429 | engines: {node: '>=8'} 2430 | dependencies: 2431 | p-limit: 2.3.0 2432 | dev: true 2433 | 2434 | /p-try/2.2.0: 2435 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2436 | engines: {node: '>=6'} 2437 | dev: true 2438 | 2439 | /parent-module/1.0.1: 2440 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2441 | engines: {node: '>=6'} 2442 | dependencies: 2443 | callsites: 3.1.0 2444 | dev: true 2445 | 2446 | /parse-json/5.2.0: 2447 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2448 | engines: {node: '>=8'} 2449 | dependencies: 2450 | '@babel/code-frame': 7.16.7 2451 | error-ex: 1.3.2 2452 | json-parse-even-better-errors: 2.3.1 2453 | lines-and-columns: 1.2.4 2454 | dev: true 2455 | 2456 | /parse5/6.0.1: 2457 | resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} 2458 | dev: true 2459 | 2460 | /path-exists/4.0.0: 2461 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2462 | engines: {node: '>=8'} 2463 | dev: true 2464 | 2465 | /path-is-absolute/1.0.1: 2466 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 2467 | engines: {node: '>=0.10.0'} 2468 | dev: true 2469 | 2470 | /path-key/3.1.1: 2471 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2472 | engines: {node: '>=8'} 2473 | dev: true 2474 | 2475 | /path-parse/1.0.7: 2476 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2477 | dev: true 2478 | 2479 | /picocolors/1.0.0: 2480 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2481 | dev: true 2482 | 2483 | /picomatch/2.3.1: 2484 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2485 | engines: {node: '>=8.6'} 2486 | dev: true 2487 | 2488 | /pirates/4.0.5: 2489 | resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} 2490 | engines: {node: '>= 6'} 2491 | dev: true 2492 | 2493 | /pkg-dir/4.2.0: 2494 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 2495 | engines: {node: '>=8'} 2496 | dependencies: 2497 | find-up: 4.1.0 2498 | dev: true 2499 | 2500 | /prelude-ls/1.1.2: 2501 | resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} 2502 | engines: {node: '>= 0.8.0'} 2503 | dev: true 2504 | 2505 | /prelude-ls/1.2.1: 2506 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2507 | engines: {node: '>= 0.8.0'} 2508 | dev: true 2509 | 2510 | /pretty-format/27.5.1: 2511 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 2512 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2513 | dependencies: 2514 | ansi-regex: 5.0.1 2515 | ansi-styles: 5.2.0 2516 | react-is: 17.0.2 2517 | dev: true 2518 | 2519 | /prompts/2.4.2: 2520 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 2521 | engines: {node: '>= 6'} 2522 | dependencies: 2523 | kleur: 3.0.3 2524 | sisteransi: 1.0.5 2525 | dev: true 2526 | 2527 | /psl/1.8.0: 2528 | resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} 2529 | dev: true 2530 | 2531 | /punycode/2.1.1: 2532 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 2533 | engines: {node: '>=6'} 2534 | dev: true 2535 | 2536 | /react-is/17.0.2: 2537 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 2538 | dev: true 2539 | 2540 | /regexpp/3.2.0: 2541 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2542 | engines: {node: '>=8'} 2543 | dev: true 2544 | 2545 | /require-directory/2.1.1: 2546 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 2547 | engines: {node: '>=0.10.0'} 2548 | dev: true 2549 | 2550 | /resolve-cwd/3.0.0: 2551 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 2552 | engines: {node: '>=8'} 2553 | dependencies: 2554 | resolve-from: 5.0.0 2555 | dev: true 2556 | 2557 | /resolve-from/4.0.0: 2558 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2559 | engines: {node: '>=4'} 2560 | dev: true 2561 | 2562 | /resolve-from/5.0.0: 2563 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2564 | engines: {node: '>=8'} 2565 | dev: true 2566 | 2567 | /resolve.exports/1.1.0: 2568 | resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} 2569 | engines: {node: '>=10'} 2570 | dev: true 2571 | 2572 | /resolve/1.22.0: 2573 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 2574 | hasBin: true 2575 | dependencies: 2576 | is-core-module: 2.8.1 2577 | path-parse: 1.0.7 2578 | supports-preserve-symlinks-flag: 1.0.0 2579 | dev: true 2580 | 2581 | /rimraf/3.0.2: 2582 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2583 | hasBin: true 2584 | dependencies: 2585 | glob: 7.2.0 2586 | dev: true 2587 | 2588 | /safe-buffer/5.1.2: 2589 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 2590 | dev: true 2591 | 2592 | /safer-buffer/2.1.2: 2593 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2594 | dev: true 2595 | 2596 | /saxes/5.0.1: 2597 | resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} 2598 | engines: {node: '>=10'} 2599 | dependencies: 2600 | xmlchars: 2.2.0 2601 | dev: true 2602 | 2603 | /semver/6.3.0: 2604 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 2605 | hasBin: true 2606 | dev: true 2607 | 2608 | /semver/7.3.5: 2609 | resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} 2610 | engines: {node: '>=10'} 2611 | hasBin: true 2612 | dependencies: 2613 | lru-cache: 6.0.0 2614 | dev: true 2615 | 2616 | /shebang-command/2.0.0: 2617 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2618 | engines: {node: '>=8'} 2619 | dependencies: 2620 | shebang-regex: 3.0.0 2621 | dev: true 2622 | 2623 | /shebang-regex/3.0.0: 2624 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2625 | engines: {node: '>=8'} 2626 | dev: true 2627 | 2628 | /signal-exit/3.0.7: 2629 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2630 | dev: true 2631 | 2632 | /sisteransi/1.0.5: 2633 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2634 | dev: true 2635 | 2636 | /slash/3.0.0: 2637 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2638 | engines: {node: '>=8'} 2639 | dev: true 2640 | 2641 | /source-map-support/0.5.21: 2642 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2643 | dependencies: 2644 | buffer-from: 1.1.2 2645 | source-map: 0.6.1 2646 | dev: true 2647 | 2648 | /source-map/0.5.7: 2649 | resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} 2650 | engines: {node: '>=0.10.0'} 2651 | dev: true 2652 | 2653 | /source-map/0.6.1: 2654 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2655 | engines: {node: '>=0.10.0'} 2656 | dev: true 2657 | 2658 | /source-map/0.7.3: 2659 | resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} 2660 | engines: {node: '>= 8'} 2661 | dev: true 2662 | 2663 | /sprintf-js/1.0.3: 2664 | resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} 2665 | dev: true 2666 | 2667 | /stack-utils/2.0.5: 2668 | resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} 2669 | engines: {node: '>=10'} 2670 | dependencies: 2671 | escape-string-regexp: 2.0.0 2672 | dev: true 2673 | 2674 | /string-length/4.0.2: 2675 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 2676 | engines: {node: '>=10'} 2677 | dependencies: 2678 | char-regex: 1.0.2 2679 | strip-ansi: 6.0.1 2680 | dev: true 2681 | 2682 | /string-width/4.2.3: 2683 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2684 | engines: {node: '>=8'} 2685 | dependencies: 2686 | emoji-regex: 8.0.0 2687 | is-fullwidth-code-point: 3.0.0 2688 | strip-ansi: 6.0.1 2689 | dev: true 2690 | 2691 | /strip-ansi/6.0.1: 2692 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2693 | engines: {node: '>=8'} 2694 | dependencies: 2695 | ansi-regex: 5.0.1 2696 | dev: true 2697 | 2698 | /strip-bom/4.0.0: 2699 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 2700 | engines: {node: '>=8'} 2701 | dev: true 2702 | 2703 | /strip-final-newline/2.0.0: 2704 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2705 | engines: {node: '>=6'} 2706 | dev: true 2707 | 2708 | /strip-json-comments/3.1.1: 2709 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2710 | engines: {node: '>=8'} 2711 | dev: true 2712 | 2713 | /supports-color/5.5.0: 2714 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2715 | engines: {node: '>=4'} 2716 | dependencies: 2717 | has-flag: 3.0.0 2718 | dev: true 2719 | 2720 | /supports-color/7.2.0: 2721 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2722 | engines: {node: '>=8'} 2723 | dependencies: 2724 | has-flag: 4.0.0 2725 | dev: true 2726 | 2727 | /supports-color/8.1.1: 2728 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2729 | engines: {node: '>=10'} 2730 | dependencies: 2731 | has-flag: 4.0.0 2732 | dev: true 2733 | 2734 | /supports-hyperlinks/2.2.0: 2735 | resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} 2736 | engines: {node: '>=8'} 2737 | dependencies: 2738 | has-flag: 4.0.0 2739 | supports-color: 7.2.0 2740 | dev: true 2741 | 2742 | /supports-preserve-symlinks-flag/1.0.0: 2743 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2744 | engines: {node: '>= 0.4'} 2745 | dev: true 2746 | 2747 | /symbol-tree/3.2.4: 2748 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 2749 | dev: true 2750 | 2751 | /terminal-link/2.1.1: 2752 | resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} 2753 | engines: {node: '>=8'} 2754 | dependencies: 2755 | ansi-escapes: 4.3.2 2756 | supports-hyperlinks: 2.2.0 2757 | dev: true 2758 | 2759 | /test-exclude/6.0.0: 2760 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 2761 | engines: {node: '>=8'} 2762 | dependencies: 2763 | '@istanbuljs/schema': 0.1.3 2764 | glob: 7.2.0 2765 | minimatch: 3.1.2 2766 | dev: true 2767 | 2768 | /text-table/0.2.0: 2769 | resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} 2770 | dev: true 2771 | 2772 | /throat/6.0.1: 2773 | resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} 2774 | dev: true 2775 | 2776 | /tmpl/1.0.5: 2777 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 2778 | dev: true 2779 | 2780 | /to-fast-properties/2.0.0: 2781 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 2782 | engines: {node: '>=4'} 2783 | dev: true 2784 | 2785 | /to-regex-range/5.0.1: 2786 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2787 | engines: {node: '>=8.0'} 2788 | dependencies: 2789 | is-number: 7.0.0 2790 | dev: true 2791 | 2792 | /tough-cookie/4.0.0: 2793 | resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} 2794 | engines: {node: '>=6'} 2795 | dependencies: 2796 | psl: 1.8.0 2797 | punycode: 2.1.1 2798 | universalify: 0.1.2 2799 | dev: true 2800 | 2801 | /tr46/2.1.0: 2802 | resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} 2803 | engines: {node: '>=8'} 2804 | dependencies: 2805 | punycode: 2.1.1 2806 | dev: true 2807 | 2808 | /ts-node/10.7.0_ee885bc7281b682b6adbed6ae09ee090: 2809 | resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} 2810 | hasBin: true 2811 | peerDependencies: 2812 | '@swc/core': '>=1.2.50' 2813 | '@swc/wasm': '>=1.2.50' 2814 | '@types/node': '*' 2815 | typescript: '>=2.7' 2816 | peerDependenciesMeta: 2817 | '@swc/core': 2818 | optional: true 2819 | '@swc/wasm': 2820 | optional: true 2821 | dependencies: 2822 | '@cspotcode/source-map-support': 0.7.0 2823 | '@tsconfig/node10': 1.0.8 2824 | '@tsconfig/node12': 1.0.9 2825 | '@tsconfig/node14': 1.0.1 2826 | '@tsconfig/node16': 1.0.2 2827 | '@types/node': 17.0.23 2828 | acorn: 8.7.0 2829 | acorn-walk: 8.2.0 2830 | arg: 4.1.3 2831 | create-require: 1.1.1 2832 | diff: 4.0.2 2833 | make-error: 1.3.6 2834 | typescript: 4.6.3 2835 | v8-compile-cache-lib: 3.0.0 2836 | yn: 3.1.1 2837 | dev: true 2838 | 2839 | /type-check/0.3.2: 2840 | resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} 2841 | engines: {node: '>= 0.8.0'} 2842 | dependencies: 2843 | prelude-ls: 1.1.2 2844 | dev: true 2845 | 2846 | /type-check/0.4.0: 2847 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2848 | engines: {node: '>= 0.8.0'} 2849 | dependencies: 2850 | prelude-ls: 1.2.1 2851 | dev: true 2852 | 2853 | /type-detect/4.0.8: 2854 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2855 | engines: {node: '>=4'} 2856 | dev: true 2857 | 2858 | /type-fest/0.20.2: 2859 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2860 | engines: {node: '>=10'} 2861 | dev: true 2862 | 2863 | /type-fest/0.21.3: 2864 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2865 | engines: {node: '>=10'} 2866 | dev: true 2867 | 2868 | /typedarray-to-buffer/3.1.5: 2869 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 2870 | dependencies: 2871 | is-typedarray: 1.0.0 2872 | dev: true 2873 | 2874 | /typescript/4.6.3: 2875 | resolution: {integrity: sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==} 2876 | engines: {node: '>=4.2.0'} 2877 | hasBin: true 2878 | dev: true 2879 | 2880 | /universalify/0.1.2: 2881 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 2882 | engines: {node: '>= 4.0.0'} 2883 | dev: true 2884 | 2885 | /uri-js/4.4.1: 2886 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2887 | dependencies: 2888 | punycode: 2.1.1 2889 | dev: true 2890 | 2891 | /v8-compile-cache-lib/3.0.0: 2892 | resolution: {integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==} 2893 | dev: true 2894 | 2895 | /v8-compile-cache/2.3.0: 2896 | resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} 2897 | dev: true 2898 | 2899 | /v8-to-istanbul/8.1.1: 2900 | resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} 2901 | engines: {node: '>=10.12.0'} 2902 | dependencies: 2903 | '@types/istanbul-lib-coverage': 2.0.4 2904 | convert-source-map: 1.8.0 2905 | source-map: 0.7.3 2906 | dev: true 2907 | 2908 | /w3c-hr-time/1.0.2: 2909 | resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} 2910 | dependencies: 2911 | browser-process-hrtime: 1.0.0 2912 | dev: true 2913 | 2914 | /w3c-xmlserializer/2.0.0: 2915 | resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} 2916 | engines: {node: '>=10'} 2917 | dependencies: 2918 | xml-name-validator: 3.0.0 2919 | dev: true 2920 | 2921 | /walker/1.0.8: 2922 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 2923 | dependencies: 2924 | makeerror: 1.0.12 2925 | dev: true 2926 | 2927 | /webidl-conversions/5.0.0: 2928 | resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} 2929 | engines: {node: '>=8'} 2930 | dev: true 2931 | 2932 | /webidl-conversions/6.1.0: 2933 | resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} 2934 | engines: {node: '>=10.4'} 2935 | dev: true 2936 | 2937 | /whatwg-encoding/1.0.5: 2938 | resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} 2939 | dependencies: 2940 | iconv-lite: 0.4.24 2941 | dev: true 2942 | 2943 | /whatwg-mimetype/2.3.0: 2944 | resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} 2945 | dev: true 2946 | 2947 | /whatwg-url/8.7.0: 2948 | resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} 2949 | engines: {node: '>=10'} 2950 | dependencies: 2951 | lodash: 4.17.21 2952 | tr46: 2.1.0 2953 | webidl-conversions: 6.1.0 2954 | dev: true 2955 | 2956 | /which/2.0.2: 2957 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2958 | engines: {node: '>= 8'} 2959 | hasBin: true 2960 | dependencies: 2961 | isexe: 2.0.0 2962 | dev: true 2963 | 2964 | /word-wrap/1.2.3: 2965 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2966 | engines: {node: '>=0.10.0'} 2967 | dev: true 2968 | 2969 | /wrap-ansi/7.0.0: 2970 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2971 | engines: {node: '>=10'} 2972 | dependencies: 2973 | ansi-styles: 4.3.0 2974 | string-width: 4.2.3 2975 | strip-ansi: 6.0.1 2976 | dev: true 2977 | 2978 | /wrappy/1.0.2: 2979 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 2980 | dev: true 2981 | 2982 | /write-file-atomic/3.0.3: 2983 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 2984 | dependencies: 2985 | imurmurhash: 0.1.4 2986 | is-typedarray: 1.0.0 2987 | signal-exit: 3.0.7 2988 | typedarray-to-buffer: 3.1.5 2989 | dev: true 2990 | 2991 | /ws/7.5.7: 2992 | resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} 2993 | engines: {node: '>=8.3.0'} 2994 | peerDependencies: 2995 | bufferutil: ^4.0.1 2996 | utf-8-validate: ^5.0.2 2997 | peerDependenciesMeta: 2998 | bufferutil: 2999 | optional: true 3000 | utf-8-validate: 3001 | optional: true 3002 | dev: true 3003 | 3004 | /xml-name-validator/3.0.0: 3005 | resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} 3006 | dev: true 3007 | 3008 | /xmlchars/2.2.0: 3009 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 3010 | dev: true 3011 | 3012 | /y18n/5.0.8: 3013 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 3014 | engines: {node: '>=10'} 3015 | dev: true 3016 | 3017 | /yallist/4.0.0: 3018 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 3019 | dev: true 3020 | 3021 | /yargs-parser/20.2.9: 3022 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 3023 | engines: {node: '>=10'} 3024 | dev: true 3025 | 3026 | /yargs/16.2.0: 3027 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 3028 | engines: {node: '>=10'} 3029 | dependencies: 3030 | cliui: 7.0.4 3031 | escalade: 3.1.1 3032 | get-caller-file: 2.0.5 3033 | require-directory: 2.1.1 3034 | string-width: 4.2.3 3035 | y18n: 5.0.8 3036 | yargs-parser: 20.2.9 3037 | dev: true 3038 | 3039 | /yn/3.1.1: 3040 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 3041 | engines: {node: '>=6'} 3042 | dev: true 3043 | -------------------------------------------------------------------------------- /src-reactivity/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | es2021: true, 6 | }, 7 | extends: [ 8 | "eslint:recommended", 9 | // "plugin:react/recommended", 10 | // "plugin:react-hooks/recommended", 11 | "plugin:@typescript-eslint/recommended", 12 | ], 13 | parser: "@typescript-eslint/parser", 14 | parserOptions: { 15 | ecmaFeatures: { 16 | jsx: true, 17 | }, 18 | ecmaVersion: "latest", 19 | sourceType: "module", 20 | }, 21 | plugins: [ 22 | // "react", 23 | // "react-hooks", 24 | "@typescript-eslint", 25 | ], 26 | ignorePatterns: ["*.js"], 27 | rules: { 28 | "react-hooks/rules-of-hooks": "error", 29 | "react-hooks/exhaustive-deps": "warn", 30 | // enable additional rules 31 | // indent: ["error", 2], 32 | indent: "off", 33 | "@typescript-eslint/indent": ["warn", 2], 34 | "linebreak-style": ["error", "unix"], 35 | quotes: ["error", "double"], 36 | semi: ["error", "always"], 37 | 38 | // override configuration set by extending "eslint:recommended" 39 | "no-empty": "warn", 40 | "no-cond-assign": ["error", "always"], 41 | 42 | // disable rules from base configurations 43 | "for-direction": "off", 44 | 45 | "react/no-set-state": "off", 46 | }, 47 | }; 48 | -------------------------------------------------------------------------------- /src-reactivity/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | dist 3 | coverage -------------------------------------------------------------------------------- /src-reactivity/.prettierignore: -------------------------------------------------------------------------------- 1 | *.md 2 | -------------------------------------------------------------------------------- /src-reactivity/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "printWidth": 80, 4 | "semi": true, 5 | "singleQuote": false, 6 | "tabWidth": 2, 7 | "useTabs": false, 8 | "endOfLine": "lf" 9 | } 10 | -------------------------------------------------------------------------------- /src-reactivity/README.md: -------------------------------------------------------------------------------- 1 | # playground-mini-vue 2 | 3 | > A minimal vue3. 4 | > 最小vue3的实现。 5 | 6 | ## 功能 7 | 8 | - 直接运行(ts-node) 9 | 10 | ## 构建指南 11 | -------------------------------------------------------------------------------- /src-reactivity/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | ["@babel/preset-env", { targets: { node: "current" } }], 4 | "@babel/preset-typescript", 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/computed.spec.ts: -------------------------------------------------------------------------------- 1 | import { computed } from "../src/computed"; 2 | import { reactive } from "../src/reactive"; 3 | 4 | describe("computed", () => { 5 | it("happy path", () => { 6 | const value = reactive({ 7 | foo: 1, 8 | }); 9 | 10 | const getter = computed(() => { 11 | return value.foo; 12 | }); 13 | 14 | value.foo = 2; 15 | expect(getter.value).toBe(2); 16 | }); 17 | 18 | it("should compute lazily", () => { 19 | const value = reactive({ 20 | foo: 1, 21 | }); 22 | const getter = jest.fn(() => { 23 | return value.foo; 24 | }); 25 | const cValue = computed(getter); 26 | 27 | // lazy 28 | expect(getter).not.toHaveBeenCalled(); 29 | 30 | expect(cValue.value).toBe(1); 31 | expect(getter).toHaveBeenCalledTimes(1); 32 | 33 | // should not compute again 34 | cValue.value; 35 | expect(getter).toHaveBeenCalledTimes(1); 36 | 37 | // should not compute until needed 38 | value.foo = 2; 39 | expect(getter).toHaveBeenCalledTimes(1); 40 | 41 | // now it should compute 42 | expect(cValue.value).toBe(2); 43 | expect(getter).toHaveBeenCalledTimes(2); 44 | 45 | // should not compute again 46 | cValue.value; 47 | expect(getter).toHaveBeenCalledTimes(2); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/dep.spec.ts: -------------------------------------------------------------------------------- 1 | 2 | describe('Dep', () => { 3 | 4 | 5 | it('new Set ', () => { 6 | // const set = new Set([1]) 7 | 8 | // console.log(set) 9 | 10 | 11 | }); 12 | 13 | 14 | }); -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/effect.spec.ts: -------------------------------------------------------------------------------- 1 | import { reactive } from "../src/reactive"; 2 | import { effect, stop } from "../src/effect"; 3 | 4 | describe("effect", () => { 5 | it("should run the passed function once (wrapped by a effect)", () => { 6 | const fnSpy = jest.fn(() => {}); 7 | effect(fnSpy); 8 | expect(fnSpy).toHaveBeenCalledTimes(1); 9 | }); 10 | 11 | it("should observe basic properties", () => { 12 | let dummy; 13 | const counter = reactive({ num: 0 }); 14 | effect(() => (dummy = counter.num)); 15 | 16 | expect(dummy).toBe(0); 17 | counter.num = 7; 18 | expect(dummy).toBe(7); 19 | }); 20 | 21 | it("should observe multiple properties", () => { 22 | let dummy; 23 | const counter = reactive({ num1: 0, num2: 0 }); 24 | effect(() => (dummy = counter.num1 + counter.num1 + counter.num2)); 25 | 26 | expect(dummy).toBe(0); 27 | counter.num1 = counter.num2 = 7; 28 | expect(dummy).toBe(21); 29 | }); 30 | it("should handle multiple effects", () => { 31 | let dummy1, dummy2; 32 | const counter = reactive({ num: 0 }); 33 | effect(() => (dummy1 = counter.num)); 34 | effect(() => (dummy2 = counter.num)); 35 | 36 | expect(dummy1).toBe(0); 37 | expect(dummy2).toBe(0); 38 | counter.num++; 39 | expect(dummy1).toBe(1); 40 | expect(dummy2).toBe(1); 41 | }); 42 | 43 | it("should observe nested properties", () => { 44 | let dummy; 45 | const counter = reactive({ nested: { num: 0 } }); 46 | effect(() => (dummy = counter.nested.num)); 47 | 48 | expect(dummy).toBe(0); 49 | counter.nested.num = 8; 50 | expect(dummy).toBe(8); 51 | }); 52 | 53 | it("should observe function call chains", () => { 54 | let dummy; 55 | const counter = reactive({ num: 0 }); 56 | effect(() => (dummy = getNum())); 57 | 58 | function getNum() { 59 | return counter.num; 60 | } 61 | 62 | expect(dummy).toBe(0); 63 | counter.num = 2; 64 | expect(dummy).toBe(2); 65 | }); 66 | it("scheduler", () => { 67 | let dummy; 68 | let run: any; 69 | const scheduler = jest.fn(() => { 70 | run = runner; 71 | }); 72 | const obj = reactive({ foo: 1 }); 73 | const runner = effect( 74 | () => { 75 | dummy = obj.foo; 76 | }, 77 | { scheduler } 78 | ); 79 | expect(scheduler).not.toHaveBeenCalled(); 80 | expect(dummy).toBe(1); 81 | // should be called on first trigger 82 | obj.foo++; 83 | expect(scheduler).toHaveBeenCalledTimes(1); 84 | // // should not run yet 85 | expect(dummy).toBe(1); 86 | // // manually run 87 | run(); 88 | // // should have run 89 | expect(dummy).toBe(2); 90 | }); 91 | 92 | it("stop", () => { 93 | let dummy; 94 | const obj = reactive({ prop: 1 }); 95 | const runner = effect(() => { 96 | dummy = obj.prop; 97 | }); 98 | obj.prop = 2; 99 | expect(dummy).toBe(2); 100 | stop(runner); 101 | // obj.prop = 3 102 | obj.prop++; 103 | expect(dummy).toBe(2); 104 | 105 | // stopped effect should still be manually callable 106 | runner(); 107 | expect(dummy).toBe(3); 108 | }); 109 | 110 | it("events: onStop", () => { 111 | const onStop = jest.fn(); 112 | const runner = effect(() => {}, { 113 | onStop, 114 | }); 115 | 116 | stop(runner); 117 | expect(onStop).toHaveBeenCalled(); 118 | }); 119 | }); 120 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/reactive.spec.ts: -------------------------------------------------------------------------------- 1 | import { reactive, isReactive, toRaw, reactiveMap } from "../src/reactive"; 2 | describe("reactive", () => { 3 | test("Object", () => { 4 | const original = { foo: 1 }; 5 | const observed = reactive(original); 6 | expect(observed).not.toBe(original); 7 | expect(isReactive(observed)).toBe(true); 8 | expect(isReactive(original)).toBe(false); 9 | // get 10 | expect(observed.foo).toBe(1); 11 | // // has 12 | expect("foo" in observed).toBe(true); 13 | // // ownKeys 14 | expect(Object.keys(observed)).toEqual(["foo"]); 15 | }); 16 | 17 | test("nested reactives", () => { 18 | const original = { 19 | nested: { 20 | foo: 1, 21 | }, 22 | array: [{ bar: 2 }], 23 | }; 24 | const observed = reactive(original); 25 | expect(isReactive(observed.nested)).toBe(true); 26 | expect(isReactive(observed.array)).toBe(true); 27 | expect(isReactive(observed.array[0])).toBe(true); 28 | }); 29 | 30 | test("toRaw", () => { 31 | const original = { foo: 1 }; 32 | const observed = reactive(original); 33 | expect(toRaw(observed)).toBe(original); 34 | expect(toRaw(original)).toBe(original); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/readonly.spec.ts: -------------------------------------------------------------------------------- 1 | import { isProxy, isReactive, isReadonly, readonly } from "../src/reactive"; 2 | 3 | describe("readonly", () => { 4 | it("should make nested values readonly", () => { 5 | const original = { foo: 1, bar: { baz: 2 } }; 6 | const wrapped = readonly(original); 7 | expect(wrapped).not.toBe(original); 8 | expect(isProxy(wrapped)).toBe(true); 9 | expect(isReactive(wrapped)).toBe(false); 10 | expect(isReadonly(wrapped)).toBe(true); 11 | expect(isReactive(original)).toBe(false); 12 | expect(isReadonly(original)).toBe(false); 13 | expect(isReactive(wrapped.bar)).toBe(false); 14 | expect(isReadonly(wrapped.bar)).toBe(true); 15 | expect(isReactive(original.bar)).toBe(false); 16 | expect(isReadonly(original.bar)).toBe(false); 17 | // get 18 | expect(wrapped.foo).toBe(1); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/ref.spec.ts: -------------------------------------------------------------------------------- 1 | import { effect } from "../src/effect"; 2 | import { reactive } from "../src/reactive"; 3 | import { isRef, ref, unRef,proxyRefs } from "../src/ref"; 4 | describe("ref", () => { 5 | it("should be reactive", () => { 6 | const a = ref(1); 7 | let dummy; 8 | let calls = 0; 9 | effect(() => { 10 | calls++; 11 | dummy = a.value; 12 | }); 13 | expect(calls).toBe(1); 14 | expect(dummy).toBe(1); 15 | a.value = 2; 16 | expect(calls).toBe(2); 17 | expect(dummy).toBe(2); 18 | // same value should not trigger 19 | a.value = 2; 20 | expect(calls).toBe(2); 21 | expect(dummy).toBe(2); 22 | }); 23 | 24 | it("should make nested properties reactive", () => { 25 | const a = ref({ 26 | count: 1, 27 | }); 28 | let dummy; 29 | effect(() => { 30 | dummy = a.value.count; 31 | }); 32 | expect(dummy).toBe(1); 33 | a.value.count = 2; 34 | expect(dummy).toBe(2); 35 | }); 36 | 37 | it("proxyRefs", () => { 38 | const user = { 39 | age: ref(10), 40 | name: "xiaohong", 41 | }; 42 | const proxyUser = proxyRefs(user); 43 | expect(user.age.value).toBe(10); 44 | expect(proxyUser.age).toBe(10); 45 | expect(proxyUser.name).toBe("xiaohong"); 46 | 47 | (proxyUser as any).age = 20; 48 | expect(proxyUser.age).toBe(20); 49 | expect(user.age.value).toBe(20); 50 | 51 | proxyUser.age = ref(10); 52 | expect(proxyUser.age).toBe(10); 53 | expect(user.age.value).toBe(10); 54 | }); 55 | 56 | it("isRef", () => { 57 | const a = ref(1); 58 | const user = reactive({ 59 | age: 1, 60 | }); 61 | expect(isRef(a)).toBe(true); 62 | expect(isRef(1)).toBe(false); 63 | expect(isRef(user)).toBe(false); 64 | }); 65 | 66 | it("unRef", () => { 67 | const a = ref(1); 68 | expect(unRef(a)).toBe(1); 69 | expect(unRef(1)).toBe(1); 70 | }); 71 | }); 72 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/__tests__/shallowReadonly.spec.ts: -------------------------------------------------------------------------------- 1 | import { isReactive, isReadonly, readonly, shallowReadonly } from "../src/reactive"; 2 | 3 | describe("shallowReadonly", () => { 4 | test("should not make non-reactive properties reactive", () => { 5 | const props = shallowReadonly({ n: { foo: 1 } }); 6 | expect(isReactive(props.n)).toBe(false); 7 | }); 8 | test("should differentiate from normal readonly calls", async () => { 9 | const original = { foo: {} }; 10 | const shallowProxy = shallowReadonly(original); 11 | const reactiveProxy = readonly(original); 12 | expect(shallowProxy).not.toBe(reactiveProxy); 13 | expect(isReadonly(shallowProxy.foo)).toBe(false); 14 | expect(isReadonly(reactiveProxy.foo)).toBe(true); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | ["@babel/preset-env", { targets: { node: "current" } }], 4 | "@babel/preset-typescript", 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactivity", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@babel/core": "^7.15.0", 14 | "@babel/preset-env": "^7.15.0", 15 | "@babel/preset-typescript": "^7.15.0", 16 | "@types/jest": "^27.0.0", 17 | "babel-jest": "^27.0.6", 18 | "jest": "^27.1.1" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/baseHandlers.ts: -------------------------------------------------------------------------------- 1 | import { ReactiveEffect, track, trigger } from "./effect"; 2 | import { 3 | reactive, 4 | ReactiveFlags, 5 | reactiveMap, 6 | readonly, 7 | readonlyMap, 8 | shallowReadonlyMap, 9 | } from "./reactive"; 10 | import { isObject } from "../../shared/index"; 11 | 12 | const get = createGetter(); 13 | const set = createSetter(); 14 | const readonlyGet = createGetter(true); 15 | const shallowReadonlyGet = createGetter(true, true); 16 | 17 | function createGetter(isReadonly = false, shallow = false) { 18 | return function get(target, key, receiver) { 19 | const isExistInReactiveMap = () => 20 | key === ReactiveFlags.RAW && receiver === reactiveMap.get(target); 21 | 22 | const isExistInReadonlyMap = () => 23 | key === ReactiveFlags.RAW && receiver === readonlyMap.get(target); 24 | 25 | const isExistInShallowReadonlyMap = () => 26 | key === ReactiveFlags.RAW && receiver === shallowReadonlyMap.get(target); 27 | 28 | if (key === ReactiveFlags.IS_REACTIVE) { 29 | return !isReadonly; 30 | } else if (key === ReactiveFlags.IS_READONLY) { 31 | return isReadonly; 32 | } else if ( 33 | isExistInReactiveMap() || 34 | isExistInReadonlyMap() || 35 | isExistInShallowReadonlyMap() 36 | ) { 37 | return target; 38 | } 39 | 40 | const res = Reflect.get(target, key, receiver); 41 | 42 | // 问题:为什么是 readonly 的时候不做依赖收集呢 43 | // readonly 的话,是不可以被 set 的, 那不可以被 set 就意味着不会触发 trigger 44 | // 所有就没有收集依赖的必要了 45 | 46 | if (!isReadonly) { 47 | // 在触发 get 的时候进行依赖收集 48 | track(target, "get", key); 49 | } 50 | 51 | if (shallow) { 52 | return res; 53 | } 54 | 55 | if (isObject(res)) { 56 | // 把内部所有的是 object 的值都用 reactive 包裹,变成响应式对象 57 | // 如果说这个 res 值是一个对象的话,那么我们需要把获取到的 res 也转换成 reactive 58 | // res 等于 target[key] 59 | return isReadonly ? readonly(res) : reactive(res); 60 | } 61 | 62 | return res; 63 | }; 64 | } 65 | 66 | function createSetter() { 67 | return function set(target, key, value, receiver) { 68 | const result = Reflect.set(target, key, value, receiver); 69 | 70 | // 在触发 set 的时候进行触发依赖 71 | trigger(target, "set", key); 72 | 73 | return result; 74 | }; 75 | } 76 | 77 | export const readonlyHandlers = { 78 | get: readonlyGet, 79 | set(target, key) { 80 | // readonly 的响应式对象不可以修改值 81 | console.warn( 82 | `Set operation on key "${String(key)}" failed: target is readonly.`, 83 | target 84 | ); 85 | return true; 86 | }, 87 | }; 88 | 89 | export const mutableHandlers = { 90 | get, 91 | set, 92 | }; 93 | 94 | export const shallowReadonlyHandlers = { 95 | get: shallowReadonlyGet, 96 | set(target, key) { 97 | // readonly 的响应式对象不可以修改值 98 | console.warn( 99 | `Set operation on key "${String(key)}" failed: target is readonly.`, 100 | target 101 | ); 102 | return true; 103 | }, 104 | }; 105 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/computed.ts: -------------------------------------------------------------------------------- 1 | import { createDep } from "./dep"; 2 | import { ReactiveEffect } from "./effect"; 3 | import { trackRefValue, triggerRefValue } from "./ref"; 4 | 5 | export class ComputedRefImpl { 6 | public dep: any; 7 | public effect: ReactiveEffect; 8 | 9 | private _dirty: boolean; 10 | private _value 11 | 12 | constructor(getter) { 13 | this._dirty = true; 14 | this.dep = createDep(); 15 | this.effect = new ReactiveEffect(getter, () => { 16 | // scheduler 17 | // 只要触发了这个函数说明响应式对象的值发生改变了 18 | // 那么就解锁,后续在调用 get 的时候就会重新执行,所以会得到最新的值 19 | if (this._dirty) return; 20 | 21 | this._dirty = true; 22 | triggerRefValue(this); 23 | }); 24 | } 25 | 26 | get value() { 27 | // 收集依赖 28 | trackRefValue(this); 29 | // 锁上,只可以调用一次 30 | // 当数据改变的时候才会解锁 31 | // 这里就是缓存实现的核心 32 | // 解锁是在 scheduler 里面做的 33 | if (this._dirty) { 34 | this._dirty = false; 35 | // 这里执行 run 的话,就是执行用户传入的 fn 36 | this._value = this.effect.run(); 37 | } 38 | 39 | return this._value; 40 | } 41 | } 42 | 43 | export function computed(getter) { 44 | return new ComputedRefImpl(getter); 45 | } 46 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/dep.ts: -------------------------------------------------------------------------------- 1 | // 用于存储所有的 effect 对象 2 | export function createDep(effects?) { 3 | const dep = new Set(effects); 4 | return dep; 5 | } 6 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/effect.ts: -------------------------------------------------------------------------------- 1 | import { createDep } from "./dep"; 2 | import { extend } from "../../shared/index"; 3 | 4 | let activeEffect = void 0; 5 | let shouldTrack = false; 6 | const targetMap = new WeakMap(); 7 | 8 | // 用于依赖收集 9 | export class ReactiveEffect { 10 | active = true; 11 | deps = []; 12 | public onStop?: () => void; 13 | constructor(public fn, public scheduler?) { 14 | console.log("创建 ReactiveEffect 对象"); 15 | } 16 | 17 | run() { 18 | console.log("run"); 19 | // 运行 run 的时候,可以控制 要不要执行后续收集依赖的一步 20 | // 目前来看的话,只要执行了 fn 那么就默认执行了收集依赖 21 | // 这里就需要控制了 22 | 23 | // 是不是收集依赖的变量 24 | 25 | // 执行 fn 但是不收集依赖 26 | if (!this.active) { 27 | return this.fn(); 28 | } 29 | 30 | // 执行 fn 收集依赖 31 | // 可以开始收集依赖了 32 | shouldTrack = true; 33 | 34 | // 执行的时候给全局的 activeEffect 赋值 35 | // 利用全局属性来获取当前的 effect 36 | activeEffect = this as any; 37 | // 执行用户传入的 fn 38 | console.log("执行用户传入的 fn"); 39 | const result = this.fn(); 40 | // 重置 41 | shouldTrack = false; 42 | activeEffect = undefined; 43 | 44 | return result; 45 | } 46 | 47 | stop() { 48 | if (this.active) { 49 | // 如果第一次执行 stop 后 active 就 false 了 50 | // 这是为了防止重复的调用,执行 stop 逻辑 51 | cleanupEffect(this); 52 | if (this.onStop) { 53 | this.onStop(); 54 | } 55 | this.active = false; 56 | } 57 | } 58 | } 59 | 60 | function cleanupEffect(effect) { 61 | // 找到所有依赖这个 effect 的响应式对象 62 | // 从这些响应式对象里面把 effect 给删除掉 63 | effect.deps.forEach((dep) => { 64 | dep.delete(effect); 65 | }); 66 | 67 | effect.deps.length = 0; 68 | } 69 | 70 | export function effect(fn, options = {}) { 71 | const _effect = new ReactiveEffect(fn); 72 | 73 | // 把用户传过来的值合并到 _effect 对象上去 74 | // 缺点就是不是显式的,看代码的时候并不知道有什么值 75 | extend(_effect, options); 76 | _effect.run(); 77 | 78 | // 把 _effect.run 这个方法返回 79 | // 让用户可以自行选择调用的时机(调用 fn) 80 | const runner: any = _effect.run.bind(_effect); 81 | runner.effect = _effect; 82 | return runner; 83 | } 84 | 85 | export function stop(runner) { 86 | runner.effect.stop(); 87 | } 88 | 89 | export function track(target, type, key) { 90 | if (!isTracking()) { 91 | return; 92 | } 93 | console.log(`触发 track -> target: ${target} type:${type} key:${key}`); 94 | // 1. 先基于 target 找到对应的 dep 95 | // 如果是第一次的话,那么就需要初始化 96 | let depsMap = targetMap.get(target); 97 | if (!depsMap) { 98 | // 初始化 depsMap 的逻辑 99 | depsMap = new Map(); 100 | targetMap.set(target, depsMap); 101 | } 102 | 103 | let dep = depsMap.get(key); 104 | 105 | if (!dep) { 106 | dep = createDep(); 107 | 108 | depsMap.set(key, dep); 109 | } 110 | 111 | trackEffects(dep); 112 | } 113 | 114 | export function trackEffects(dep) { 115 | // 用 dep 来存放所有的 effect 116 | 117 | // TODO 118 | // 这里是一个优化点 119 | // 先看看这个依赖是不是已经收集了, 120 | // 已经收集的话,那么就不需要在收集一次了 121 | // 可能会影响 code path change 的情况 122 | // 需要每次都 cleanupEffect 123 | // shouldTrack = !dep.has(activeEffect!); 124 | if (!dep.has(activeEffect)) { 125 | dep.add(activeEffect); 126 | (activeEffect as any).deps.push(dep); 127 | } 128 | } 129 | 130 | export function trigger(target, type, key) { 131 | // 1. 先收集所有的 dep 放到 deps 里面, 132 | // 后面会统一处理 133 | let deps: Array = []; 134 | // dep 135 | 136 | const depsMap = targetMap.get(target); 137 | 138 | if (!depsMap) return; 139 | 140 | // 暂时只实现了 GET 类型 141 | // get 类型只需要取出来就可以 142 | const dep = depsMap.get(key); 143 | 144 | // 最后收集到 deps 内 145 | deps.push(dep); 146 | 147 | const effects: Array = []; 148 | deps.forEach((dep) => { 149 | // 这里解构 dep 得到的是 dep 内部存储的 effect 150 | effects.push(...dep); 151 | }); 152 | // 这里的目的是只有一个 dep ,这个dep 里面包含所有的 effect 153 | // 这里的目前应该是为了 triggerEffects 这个函数的复用 154 | triggerEffects(createDep(effects)); 155 | } 156 | 157 | export function isTracking() { 158 | return shouldTrack && activeEffect !== undefined; 159 | } 160 | 161 | export function triggerEffects(dep) { 162 | // 执行收集到的所有的 effect 的 run 方法 163 | for (const effect of dep) { 164 | if (effect.scheduler) { 165 | // scheduler 可以让用户自己选择调用的时机 166 | // 这样就可以灵活的控制调用了 167 | // 在 runtime-core 中,就是使用了 scheduler 实现了在 next ticker 中调用的逻辑 168 | effect.scheduler(); 169 | } else { 170 | effect.run(); 171 | } 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | reactive, 3 | readonly, 4 | shallowReadonly, 5 | isReadonly, 6 | isReactive, 7 | isProxy, 8 | } from "./reactive"; 9 | 10 | export { ref, proxyRefs, unRef, isRef } from "./ref"; 11 | 12 | export { effect, stop } from "./effect"; 13 | 14 | export { computed } from "./computed"; 15 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/reactive.ts: -------------------------------------------------------------------------------- 1 | import { 2 | mutableHandlers, 3 | readonlyHandlers, 4 | shallowReadonlyHandlers, 5 | } from "./baseHandlers"; 6 | 7 | export const reactiveMap = new WeakMap(); 8 | export const readonlyMap = new WeakMap(); 9 | export const shallowReadonlyMap = new WeakMap(); 10 | 11 | export const enum ReactiveFlags { 12 | IS_REACTIVE = "__v_isReactive", 13 | IS_READONLY = "__v_isReadonly", 14 | RAW = "__v_raw", 15 | } 16 | 17 | export function reactive(target) { 18 | return createReactiveObject(target, reactiveMap, mutableHandlers); 19 | } 20 | 21 | export function readonly(target) { 22 | return createReactiveObject(target, readonlyMap, readonlyHandlers); 23 | } 24 | 25 | export function shallowReadonly(target) { 26 | return createReactiveObject( 27 | target, 28 | shallowReadonlyMap, 29 | shallowReadonlyHandlers 30 | ); 31 | } 32 | 33 | export function isProxy(value) { 34 | return isReactive(value) || isReadonly(value); 35 | } 36 | 37 | export function isReadonly(value) { 38 | return !!value[ReactiveFlags.IS_READONLY]; 39 | } 40 | 41 | export function isReactive(value) { 42 | // 如果 value 是 proxy 的话 43 | // 会触发 get 操作,而在 createGetter 里面会判断 44 | // 如果 value 是普通对象的话 45 | // 那么会返回 undefined ,那么就需要转换成布尔值 46 | return !!value[ReactiveFlags.IS_REACTIVE]; 47 | } 48 | 49 | export function toRaw(value) { 50 | // 如果 value 是 proxy 的话 ,那么直接返回就可以了 51 | // 因为会触发 createGetter 内的逻辑 52 | // 如果 value 是普通对象的话, 53 | // 我们就应该返回普通对象 54 | // 只要不是 proxy ,只要是得到了 undefined 的话,那么就一定是普通对象 55 | // TODO 这里和源码里面实现的不一样,不确定后面会不会有问题 56 | if (!value[ReactiveFlags.RAW]) { 57 | return value; 58 | } 59 | 60 | return value[ReactiveFlags.RAW]; 61 | } 62 | 63 | function createReactiveObject(target, proxyMap, baseHandlers) { 64 | // 核心就是 proxy 65 | // 目的是可以侦听到用户 get 或者 set 的动作 66 | 67 | // 如果命中的话就直接返回就好了 68 | // 使用缓存做的优化点 69 | const existingProxy = proxyMap.get(target); 70 | if (existingProxy) { 71 | return existingProxy; 72 | } 73 | 74 | const proxy = new Proxy(target, baseHandlers); 75 | 76 | // 把创建好的 proxy 给存起来, 77 | proxyMap.set(target, proxy); 78 | return proxy; 79 | } 80 | -------------------------------------------------------------------------------- /src-reactivity/example-reactivity/src/ref.ts: -------------------------------------------------------------------------------- 1 | import { trackEffects, triggerEffects, isTracking } from "./effect"; 2 | import { createDep } from "./dep"; 3 | import { isObject, hasChanged } from "../../shared"; 4 | import { reactive } from "./reactive"; 5 | 6 | export class RefImpl { 7 | private _rawValue: any; 8 | private _value: any; 9 | public dep; 10 | public __v_isRef = true; 11 | 12 | constructor(value) { 13 | this._rawValue = value; 14 | // 看看value 是不是一个对象,如果是一个对象的话 15 | // 那么需要用 reactive 包裹一下 16 | this._value = convert(value); 17 | this.dep = createDep(); 18 | } 19 | 20 | get value() { 21 | // 收集依赖 22 | trackRefValue(this); 23 | return this._value; 24 | } 25 | 26 | set value(newValue) { 27 | // 当新的值不等于老的值的话, 28 | // 那么才需要触发依赖 29 | if (hasChanged(newValue, this._rawValue)) { 30 | // 更新值 31 | this._value = convert(newValue); 32 | this._rawValue = newValue; 33 | // 触发依赖 34 | triggerRefValue(this); 35 | } 36 | } 37 | } 38 | 39 | export function ref(value) { 40 | return createRef(value); 41 | } 42 | 43 | function convert(value) { 44 | return isObject(value) ? reactive(value) : value; 45 | } 46 | 47 | function createRef(value) { 48 | const refImpl = new RefImpl(value); 49 | 50 | return refImpl; 51 | } 52 | 53 | export function triggerRefValue(ref) { 54 | triggerEffects(ref.dep); 55 | } 56 | 57 | export function trackRefValue(ref) { 58 | if (isTracking()) { 59 | trackEffects(ref.dep); 60 | } 61 | } 62 | 63 | // 这个函数的目的是 64 | // 帮助解构 ref 65 | // 比如在 template 中使用 ref 的时候,直接使用就可以了 66 | // 例如: const count = ref(0) -> 在 template 中使用的话 可以直接 count 67 | // 解决方案就是通过 proxy 来对 ref 做处理 68 | 69 | const shallowUnwrapHandlers = { 70 | get(target, key, receiver) { 71 | // 如果里面是一个 ref 类型的话,那么就返回 .value 72 | // 如果不是的话,那么直接返回value 就可以了 73 | return unRef(Reflect.get(target, key, receiver)); 74 | }, 75 | set(target, key, value, receiver) { 76 | const oldValue = target[key]; 77 | if (isRef(oldValue) && !isRef(value)) { 78 | return (target[key].value = value); 79 | } else { 80 | return Reflect.set(target, key, value, receiver); 81 | } 82 | }, 83 | }; 84 | 85 | // 这里没有处理 objectWithRefs 是 reactive 类型的时候 86 | // TODO reactive 里面如果有 ref 类型的 key 的话, 那么也是不需要调用 ref.value 的 87 | // (but 这个逻辑在 reactive 里面没有实现) 88 | export function proxyRefs(objectWithRefs) { 89 | return new Proxy(objectWithRefs, shallowUnwrapHandlers); 90 | } 91 | 92 | // 把 ref 里面的值拿到 93 | export function unRef(ref) { 94 | return isRef(ref) ? ref.value : ref; 95 | } 96 | 97 | export function isRef(value) { 98 | return !!value.__v_isRef; 99 | } 100 | -------------------------------------------------------------------------------- /src-reactivity/jest.config.ts: -------------------------------------------------------------------------------- 1 | import { Config } from "@jest/types"; 2 | 3 | export default async (): Promise => { 4 | return { 5 | verbose: true, 6 | testPathIgnorePatterns: ["/node_modules/", "build", "example-*"], 7 | rootDir: "", 8 | testEnvironment: "jsdom", 9 | }; 10 | }; 11 | -------------------------------------------------------------------------------- /src-reactivity/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "template-typescript", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest", 8 | "testCoverage": "jest --coverage", 9 | "run": "ts-node -P ./tsconfig.json --files ./src/index.ts", 10 | "build": "tsc" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "@babel/core": "^7.17.9", 16 | "@babel/preset-env": "^7.16.11", 17 | "@babel/preset-typescript": "^7.16.7", 18 | "@types/jest": "^27.4.1", 19 | "@types/node": "^17.0.23", 20 | "eslint": "^8.12.0", 21 | "jest": "^27.5.1", 22 | "ts-node": "^10.7.0", 23 | "typescript": "^4.6.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src-reactivity/src/__test__/reactive.spec.ts: -------------------------------------------------------------------------------- 1 | import { isReactive, reactive, toRaw } from "../reactive"; 2 | 3 | describe("reactive.spec", () => { 4 | it("should", () => { 5 | const original = { foo: 0 }; 6 | const observed = reactive(original); 7 | expect(observed).not.toBe(original); 8 | 9 | expect(isReactive(original)).toBe(false); 10 | expect(isReactive(observed)).toBe(true); 11 | 12 | expect(observed.foo).toEqual(0); 13 | // TODO: 这些操作符啥意思 14 | expect("foo" in observed).toEqual(true); 15 | expect(Object.keys(observed)).toEqual(["foo"]); 16 | }); 17 | 18 | it("should nested", () => { 19 | const original = { nested: { foo: 0 }, array: [{ bar: 1 }] }; 20 | const observed = reactive(original); 21 | expect(isReactive(observed.nested)).toBe(true); 22 | expect(isReactive(observed.array)).toBe(true); 23 | expect(isReactive(observed.array[0])).toBe(true); 24 | }); 25 | 26 | it("should toRaw", () => { 27 | const original = { foo: 0 }; 28 | const observed = reactive(original); 29 | expect(toRaw(observed)).toBe(original); 30 | expect(toRaw(original)).toBe(original); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /src-reactivity/src/__test__/sum.spec copy.ts: -------------------------------------------------------------------------------- 1 | import { sum } from "../sum"; 2 | 3 | describe("computed.spec", () => { 4 | it("should", () => { 5 | expect(sum(1, 2)).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /src-reactivity/src/__test__/sum.spec.ts: -------------------------------------------------------------------------------- 1 | import { sum } from "../sum"; 2 | 3 | describe("sum.spec", () => { 4 | it("should", () => { 5 | expect(sum(1, 2)).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /src-reactivity/src/baseHandlers.ts: -------------------------------------------------------------------------------- 1 | // TODO: 2 | /** 3 | * - reflect 4 | * - 闭包? 5 | * - trigger? 6 | */ 7 | 8 | import { 9 | ReactiveFlags, 10 | reactiveMap, 11 | readonlyMap, 12 | shallowReadonlyMap, 13 | } from "./const"; 14 | import { track } from "./effect"; 15 | import { reactive, readonly } from "./reactive"; 16 | import { isObject } from "./share"; 17 | 18 | const createGetter = 19 | (isReadonly = false, shallow = false) => 20 | (target: any, key: ReactiveFlags, receiver: any) => { 21 | const isRaw = key === ReactiveFlags.RAW; 22 | const isExistInReactiveMap = receiver === reactiveMap.get(target); 23 | const isExistInReadonlyMap = receiver === readonlyMap.get(target); 24 | const isExistInShallowReadonlyMap = 25 | receiver === shallowReadonlyMap.get(target); 26 | 27 | /** 添加特殊的get属性判断 */ 28 | if (key === ReactiveFlags.IS_REACTIVE) { 29 | return !isReadonly; 30 | } else if (key === ReactiveFlags.IS_READONLY) { 31 | return isReadonly; 32 | } else if ( 33 | isRaw && 34 | (isExistInReactiveMap || 35 | isExistInReadonlyMap || 36 | isExistInShallowReadonlyMap) 37 | ) { 38 | return target; 39 | } 40 | 41 | const res = Reflect.get(target, key, receiver); 42 | 43 | if (!isReadonly) { 44 | track(target, "get", key); 45 | } 46 | 47 | if (shallow) { 48 | return res; 49 | } 50 | 51 | /** 递归 */ 52 | if (isObject(res)) { 53 | return isReadonly ? readonly(res) : reactive(res); 54 | } 55 | 56 | return res; 57 | }; 58 | 59 | const createSetter = () => (target, key, value, receiver) => { 60 | const res = Reflect.set(target, key, value, receiver); 61 | //TODO: trigger(target, "get", key); 62 | return res; 63 | }; 64 | 65 | export const readonlyHandlers = { 66 | get: createGetter(true), 67 | set: (target, key) => { 68 | console.warn( 69 | `Set operation on key '${String(key)}' failed: target is readonly.`, 70 | target 71 | ); 72 | return true; 73 | }, 74 | }; 75 | 76 | export const mutableHandlers = { 77 | get: createGetter(), 78 | set: createSetter(), 79 | }; 80 | 81 | export const shallowReadonlyHandlers = { 82 | get: createGetter(true, true), 83 | set: (target, key) => { 84 | console.warn( 85 | `Set operation on key '${String(key)}' failed: target is readonly.`, 86 | target 87 | ); 88 | return true; 89 | }, 90 | }; 91 | -------------------------------------------------------------------------------- /src-reactivity/src/const.ts: -------------------------------------------------------------------------------- 1 | export enum ReactiveFlags { 2 | RAW = "__v_raw", 3 | IS_REACTIVE = "__v_isReactive", 4 | IS_READONLY = "__v_isReadonly", 5 | } 6 | 7 | export const reactiveMap = new WeakMap(); 8 | export const readonlyMap = new WeakMap(); 9 | export const shallowReadonlyMap = new WeakMap(); 10 | -------------------------------------------------------------------------------- /src-reactivity/src/effect.ts: -------------------------------------------------------------------------------- 1 | import { extend } from "./share"; 2 | 3 | type Deps = Set; 4 | type DepsMap = Map; 5 | 6 | /** 标志 */ 7 | let activeEffect: ReactiveEffect | undefined; 8 | let shouldTrack = false; 9 | const targetMap = new WeakMap(); 10 | 11 | const isTracking = (): boolean => shouldTrack && !!activeEffect; 12 | 13 | const cleanupEffect = (effect: ReactiveEffect) => { 14 | effect.deps.forEach((d) => { 15 | d.delete(effect); 16 | }); 17 | effect.deps.length = 0; 18 | }; 19 | 20 | /** 新建一个响应对象集合 */ 21 | const createDep = (effects?: ReactiveEffect[]) => new Set(effects); 22 | 23 | export class ReactiveEffect { 24 | /** 收集开关 */ 25 | active = true; 26 | deps: Deps[] = []; 27 | 28 | //TODO: ? 29 | public onStop?: () => void; 30 | constructor(public fn, public scheduler?) { 31 | console.log("ReactiveEffect init."); 32 | } 33 | 34 | run() { 35 | console.log("run"); 36 | if (this.active) { 37 | // 38 | shouldTrack = true; 39 | activeEffect = this; 40 | const res = this.fn(); 41 | shouldTrack = false; 42 | activeEffect = undefined; 43 | return res; 44 | } else { 45 | return this.fn(); 46 | } 47 | } 48 | 49 | stop() { 50 | if (this.active) { 51 | cleanupEffect(this); 52 | if (this.onStop) { 53 | this.onStop(); 54 | } 55 | this.active = false; 56 | } 57 | } 58 | } 59 | 60 | export const effect = (fn, option = {}) => { 61 | const _effect = new ReactiveEffect(fn); 62 | extend(_effect, option); 63 | _effect.run(); 64 | const runner: any = _effect.run.bind(_effect); 65 | runner.effect = _effect; 66 | return runner; 67 | }; 68 | 69 | export const stop = (runner) => { 70 | runner.effect.stop(); 71 | }; 72 | 73 | /** 收集依赖 全局的响应影响对象 */ 74 | export const trackEffects = (deps: Deps) => { 75 | if (activeEffect) { 76 | if (!deps.has(activeEffect)) { 77 | deps.add(activeEffect); 78 | activeEffect.deps.push(deps); 79 | } 80 | } 81 | }; 82 | 83 | /** 收集依赖 */ 84 | export const track = (target: any, type: "get" | "set", key) => { 85 | if (isTracking()) { 86 | return; 87 | } 88 | console.log("track", target, type, key); 89 | /** 两层map */ 90 | let depsMap: DepsMap; 91 | let deps: Deps; 92 | 93 | /** 缓存 */ 94 | const existDepsMap = targetMap.get(target); 95 | if (existDepsMap) { 96 | depsMap = existDepsMap; 97 | } else { 98 | depsMap = new Map(); 99 | targetMap.set(target, depsMap); 100 | } 101 | 102 | const existDeps = depsMap.get(key); 103 | if (existDeps) { 104 | deps = existDeps; 105 | } else { 106 | deps = createDep(); 107 | depsMap.set(key, deps); 108 | } 109 | 110 | trackEffects(deps); 111 | }; 112 | 113 | /** 调起run */ 114 | const triggerEffects = (deps: Deps) => { 115 | for (const effect of deps) { 116 | if (effect.scheduler) { 117 | effect.scheduler(); 118 | } else { 119 | effect.run(); 120 | } 121 | } 122 | }; 123 | 124 | export const trigger = (target, type, key) => { 125 | const depsArray: Deps[] = []; 126 | const existDepsMap = targetMap.get(target); 127 | if (!existDepsMap) { 128 | return; 129 | } 130 | const deps = existDepsMap.get(key); 131 | if (deps) { 132 | depsArray.push(deps); 133 | /** 扁平化flattening 提取所有元素 */ 134 | const effects: ReactiveEffect[] = []; 135 | //TODO: 也就一个啊? 136 | depsArray.forEach((d) => { 137 | effects.push(...Array.from(d)); 138 | }); 139 | 140 | triggerEffects(createDep(effects)); 141 | } 142 | }; 143 | -------------------------------------------------------------------------------- /src-reactivity/src/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/czzonet/playground-mini-vue/d6d18aa32be6e0022aaafdcbd8d0e2171834198d/src-reactivity/src/index.ts -------------------------------------------------------------------------------- /src-reactivity/src/reactive.ts: -------------------------------------------------------------------------------- 1 | import { 2 | mutableHandlers, 3 | readonlyHandlers, 4 | shallowReadonlyHandlers, 5 | } from "./baseHandlers"; 6 | import { 7 | ReactiveFlags, 8 | reactiveMap, 9 | readonlyMap, 10 | shallowReadonlyMap, 11 | } from "./const"; 12 | 13 | const createReactiveObject = ( 14 | target: any, 15 | proxyMap: WeakMap, 16 | baseHandlers: ProxyHandler 17 | ): any => { 18 | /** 检查缓存 */ 19 | const existingProxy = proxyMap.get(target); 20 | if (existingProxy) { 21 | return existingProxy; 22 | } 23 | const proxy = new Proxy(target, baseHandlers); 24 | proxyMap.set(target, proxy); 25 | 26 | return proxy; 27 | }; 28 | 29 | export const reactive = (target: T): T => 30 | createReactiveObject(target, reactiveMap, mutableHandlers); 31 | export const readonly = (target: T): T => 32 | createReactiveObject(target, readonlyMap, readonlyHandlers); 33 | export const shallowReadonly = (target: T): T => 34 | createReactiveObject(target, shallowReadonlyMap, shallowReadonlyHandlers); 35 | 36 | export const isReactive = (value: any): boolean => 37 | !!value[ReactiveFlags.IS_REACTIVE]; 38 | export const isReadonly = (value: any): boolean => 39 | !!value[ReactiveFlags.IS_REACTIVE]; 40 | export const isProxy = (value: any): boolean => 41 | isReactive(value) || isReadonly(value); 42 | 43 | // TODO: ? 44 | export const toRaw = (value: any) => { 45 | /** 普通对象直接返回 */ 46 | if (!value[ReactiveFlags.RAW]) { 47 | return value; 48 | } else { 49 | return value[ReactiveFlags.RAW]; 50 | } 51 | }; 52 | -------------------------------------------------------------------------------- /src-reactivity/src/share.ts: -------------------------------------------------------------------------------- 1 | /** object assign的一个简单封装 */ 2 | export const extend = Object.assign; 3 | 4 | export const isObject = (source: any) => 5 | source != null && typeof source == "object"; 6 | -------------------------------------------------------------------------------- /src-reactivity/src/sum.ts: -------------------------------------------------------------------------------- 1 | export const sum = (a: number, b: number) => a + b; 2 | -------------------------------------------------------------------------------- /src-reactivity/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es2019" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./dist" /* Redirect output structure to the directory. */, 18 | "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true /* Enable all strict type-checking options. */, 29 | "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */, 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | 43 | /* Module Resolution Options */ 44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | 65 | /* Advanced Options */ 66 | "skipLibCheck": true /* Skip type checking of declaration files. */, 67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 68 | }, 69 | "include": ["src"] 70 | } 71 | -------------------------------------------------------------------------------- /src-rollup-vue/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /src-rollup-vue/README.md: -------------------------------------------------------------------------------- 1 | # rollup-vue 2 | 3 | ## 概述 4 | 5 | 编译.vue 单文件组件为 js 的简单例子,使用了 rollup 插件 rollup-plugin-vue 6 | 7 | 参考完整项目:[vuejs/rollup-plugin-vue: Roll .vue files](https://github.com/vuejs/rollup-plugin-vue) 8 | 9 | ## 构建 10 | 11 | 安装依赖 12 | 13 | ``` 14 | pnpm add -D @vue/compiler-sfc rollup rollup-plugin-vue 15 | ``` 16 | 17 | 解释: 18 | 19 | - 安装 rollup 20 | - 安装 rollup-plugin-vue 21 | - 注意安装依赖@vue/compiler-sfc 22 | 23 | ## 运行 24 | 25 | 添加运行脚本 26 | 27 | ``` 28 | "dev": "rollup -c rollup.config.js" 29 | ``` 30 | 31 | 运行 32 | 33 | ``` 34 | pnpm run dev 35 | ``` 36 | 37 | ## 总结 38 | 39 | 看到了编译后的代码,从 vue 文件打包成 js 的效果 40 | 41 | ## Reference 42 | 43 | 1. [vuejs/rollup-plugin-vue: Roll .vue files](https://github.com/vuejs/rollup-plugin-vue) 44 | -------------------------------------------------------------------------------- /src-rollup-vue/lib/mini-vue.esm.js: -------------------------------------------------------------------------------- 1 | var script = { 2 | name: "app", 3 | }; 4 | 5 | function render(_ctx, _cache, $props, $setup, $data, $options) { 6 | return null 7 | } 8 | 9 | script.render = render; 10 | script.__file = "src/App.vue"; 11 | 12 | export { script as default }; 13 | -------------------------------------------------------------------------------- /src-rollup-vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "src-rollup-vue", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "dev": "rollup -c rollup.config.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@vue/compiler-sfc": "^3.2.33", 14 | "rollup": "^2.70.2", 15 | "rollup-plugin-vue": "^6.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src-rollup-vue/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@vue/compiler-sfc': ^3.2.33 5 | rollup: ^2.70.2 6 | rollup-plugin-vue: ^6.0.0 7 | 8 | devDependencies: 9 | '@vue/compiler-sfc': 3.2.33 10 | rollup: 2.70.2 11 | rollup-plugin-vue: 6.0.0_@vue+compiler-sfc@3.2.33 12 | 13 | packages: 14 | 15 | /@babel/parser/7.17.9: 16 | resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} 17 | engines: {node: '>=6.0.0'} 18 | hasBin: true 19 | dev: true 20 | 21 | /@vue/compiler-core/3.2.33: 22 | resolution: {integrity: sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==} 23 | dependencies: 24 | '@babel/parser': 7.17.9 25 | '@vue/shared': 3.2.33 26 | estree-walker: 2.0.2 27 | source-map: 0.6.1 28 | dev: true 29 | 30 | /@vue/compiler-dom/3.2.33: 31 | resolution: {integrity: sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==} 32 | dependencies: 33 | '@vue/compiler-core': 3.2.33 34 | '@vue/shared': 3.2.33 35 | dev: true 36 | 37 | /@vue/compiler-sfc/3.2.33: 38 | resolution: {integrity: sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==} 39 | dependencies: 40 | '@babel/parser': 7.17.9 41 | '@vue/compiler-core': 3.2.33 42 | '@vue/compiler-dom': 3.2.33 43 | '@vue/compiler-ssr': 3.2.33 44 | '@vue/reactivity-transform': 3.2.33 45 | '@vue/shared': 3.2.33 46 | estree-walker: 2.0.2 47 | magic-string: 0.25.9 48 | postcss: 8.4.12 49 | source-map: 0.6.1 50 | dev: true 51 | 52 | /@vue/compiler-ssr/3.2.33: 53 | resolution: {integrity: sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==} 54 | dependencies: 55 | '@vue/compiler-dom': 3.2.33 56 | '@vue/shared': 3.2.33 57 | dev: true 58 | 59 | /@vue/reactivity-transform/3.2.33: 60 | resolution: {integrity: sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==} 61 | dependencies: 62 | '@babel/parser': 7.17.9 63 | '@vue/compiler-core': 3.2.33 64 | '@vue/shared': 3.2.33 65 | estree-walker: 2.0.2 66 | magic-string: 0.25.9 67 | dev: true 68 | 69 | /@vue/shared/3.2.33: 70 | resolution: {integrity: sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==} 71 | dev: true 72 | 73 | /debug/4.3.4: 74 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 75 | engines: {node: '>=6.0'} 76 | peerDependencies: 77 | supports-color: '*' 78 | peerDependenciesMeta: 79 | supports-color: 80 | optional: true 81 | dependencies: 82 | ms: 2.1.2 83 | dev: true 84 | 85 | /estree-walker/0.6.1: 86 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 87 | dev: true 88 | 89 | /estree-walker/2.0.2: 90 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 91 | dev: true 92 | 93 | /fsevents/2.3.2: 94 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 95 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 96 | os: [darwin] 97 | requiresBuild: true 98 | dev: true 99 | optional: true 100 | 101 | /hash-sum/2.0.0: 102 | resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} 103 | dev: true 104 | 105 | /magic-string/0.25.9: 106 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 107 | dependencies: 108 | sourcemap-codec: 1.4.8 109 | dev: true 110 | 111 | /ms/2.1.2: 112 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 113 | dev: true 114 | 115 | /nanoid/3.3.3: 116 | resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} 117 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 118 | hasBin: true 119 | dev: true 120 | 121 | /picocolors/1.0.0: 122 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 123 | dev: true 124 | 125 | /postcss/8.4.12: 126 | resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} 127 | engines: {node: ^10 || ^12 || >=14} 128 | dependencies: 129 | nanoid: 3.3.3 130 | picocolors: 1.0.0 131 | source-map-js: 1.0.2 132 | dev: true 133 | 134 | /rollup-plugin-vue/6.0.0_@vue+compiler-sfc@3.2.33: 135 | resolution: {integrity: sha512-oVvUd84d5u73M2HYM3XsMDLtZRIA/tw2U0dmHlXU2UWP5JARYHzh/U9vcxaN/x/9MrepY7VH3pHFeOhrWpxs/Q==} 136 | peerDependencies: 137 | '@vue/compiler-sfc': '*' 138 | dependencies: 139 | '@vue/compiler-sfc': 3.2.33 140 | debug: 4.3.4 141 | hash-sum: 2.0.0 142 | rollup-pluginutils: 2.8.2 143 | transitivePeerDependencies: 144 | - supports-color 145 | dev: true 146 | 147 | /rollup-pluginutils/2.8.2: 148 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 149 | dependencies: 150 | estree-walker: 0.6.1 151 | dev: true 152 | 153 | /rollup/2.70.2: 154 | resolution: {integrity: sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==} 155 | engines: {node: '>=10.0.0'} 156 | hasBin: true 157 | optionalDependencies: 158 | fsevents: 2.3.2 159 | dev: true 160 | 161 | /source-map-js/1.0.2: 162 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 163 | engines: {node: '>=0.10.0'} 164 | dev: true 165 | 166 | /source-map/0.6.1: 167 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 168 | engines: {node: '>=0.10.0'} 169 | dev: true 170 | 171 | /sourcemap-codec/1.4.8: 172 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 173 | dev: true 174 | -------------------------------------------------------------------------------- /src-rollup-vue/rollup.config.js: -------------------------------------------------------------------------------- 1 | import vuePlugin from "rollup-plugin-vue"; 2 | 3 | export default { 4 | input: "./src/App.vue", 5 | output: { 6 | name: "vue", 7 | format: "es", 8 | file: "lib/mini-vue.esm.js", 9 | }, 10 | plugins: [vuePlugin()], 11 | }; 12 | -------------------------------------------------------------------------------- /src-rollup-vue/src/App.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | console.log(0); 2 | -------------------------------------------------------------------------------- /test/sum.spec.ts: -------------------------------------------------------------------------------- 1 | describe("sum.spec", () => { 2 | it("should", () => { 3 | expect(0).toBe(0); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es2019" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./dist" /* Redirect output structure to the directory. */, 18 | "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true /* Enable all strict type-checking options. */, 29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | 43 | /* Module Resolution Options */ 44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | 65 | /* Advanced Options */ 66 | "skipLibCheck": true /* Skip type checking of declaration files. */, 67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 68 | }, 69 | "include": ["src"] 70 | } 71 | --------------------------------------------------------------------------------