├── .gitignore ├── LICENSE ├── README.md ├── jest.config.ts ├── package-lock.json ├── package.json ├── src ├── made_functional.test.ts ├── made_functional.ts ├── made_more_functional.ts ├── share.ts ├── split_aggregate.ts ├── victim_completeness.test.ts ├── victim_completeness.ts ├── victim_performance.test.ts ├── victim_performance.ts ├── victim_purity.test.ts └── victim_purity.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | *.swp 10 | 11 | pids 12 | logs 13 | results 14 | tmp 15 | 16 | # Build 17 | public/css/main.css 18 | 19 | # Coverage reports 20 | coverage 21 | 22 | # API keys and secrets 23 | .env 24 | 25 | # Dependency directory 26 | node_modules 27 | bower_components 28 | 29 | # Editors 30 | .idea 31 | *.iml 32 | 33 | # OS metadata 34 | .DS_Store 35 | Thumbs.db 36 | 37 | # Ignore built ts files 38 | dist/**/* 39 | 40 | # ignore yarn.lock 41 | yarn.lock 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Yoshitaka Kawashima 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Revisiting Domain Model 2 | 3 | ドメインモデルの設計において、現実問題、性能と純粋性、完全性の間にトリレンマがあって、一度に全部満たすことができない、と言われている。 4 | https://enterprisecraftsmanship.com/posts/domain-model-purity-completeness/ 5 | 6 | この問題を実装例とともに考えてみよう、という試みです。 7 | 8 | * [純粋性+完全性](./src/victim_performance.ts) 9 | * [性能+完全性](./src/victim_purity.ts) 10 | * [性能+純粋性](./src/victim_completeness.ts) 11 | * [集約分割](./src/split_aggregate.ts): 集約を分割するとマシになる? 12 | * [関数型DDDアプローチ](./src/made_functional.ts): Domain Modeling Made Functionalなアプローチ 13 | 14 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * For a detailed explanation regarding each configuration property and type check, visit: 3 | * https://jestjs.io/docs/configuration 4 | */ 5 | 6 | export default { 7 | // All imported modules in your tests should be mocked automatically 8 | // automock: false, 9 | 10 | // Stop running tests after `n` failures 11 | // bail: 0, 12 | 13 | // The directory where Jest should store its cached dependency information 14 | // cacheDirectory: "/private/var/folders/n9/tyr09n1960g7y_pg4ztvdqnr0000gn/T/jest_dx", 15 | 16 | // Automatically clear mock calls, instances, contexts and results before every test 17 | // clearMocks: false, 18 | 19 | // Indicates whether the coverage information should be collected while executing the test 20 | // collectCoverage: false, 21 | 22 | // An array of glob patterns indicating a set of files for which coverage information should be collected 23 | // collectCoverageFrom: undefined, 24 | 25 | // The directory where Jest should output its coverage files 26 | // coverageDirectory: undefined, 27 | 28 | // An array of regexp pattern strings used to skip coverage collection 29 | // coveragePathIgnorePatterns: [ 30 | // "/node_modules/" 31 | // ], 32 | 33 | // Indicates which provider should be used to instrument code for coverage 34 | coverageProvider: "v8", 35 | 36 | // A list of reporter names that Jest uses when writing coverage reports 37 | // coverageReporters: [ 38 | // "json", 39 | // "text", 40 | // "lcov", 41 | // "clover" 42 | // ], 43 | 44 | // An object that configures minimum threshold enforcement for coverage results 45 | // coverageThreshold: undefined, 46 | 47 | // A path to a custom dependency extractor 48 | // dependencyExtractor: undefined, 49 | 50 | // Make calling deprecated APIs throw helpful error messages 51 | // errorOnDeprecated: false, 52 | 53 | // The default configuration for fake timers 54 | // fakeTimers: { 55 | // "enableGlobally": false 56 | // }, 57 | 58 | // Force coverage collection from ignored files using an array of glob patterns 59 | // forceCoverageMatch: [], 60 | 61 | // A path to a module which exports an async function that is triggered once before all test suites 62 | // globalSetup: undefined, 63 | 64 | // A path to a module which exports an async function that is triggered once after all test suites 65 | // globalTeardown: undefined, 66 | 67 | // A set of global variables that need to be available in all test environments 68 | // globals: {}, 69 | 70 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. 71 | // maxWorkers: "50%", 72 | 73 | // An array of directory names to be searched recursively up from the requiring module's location 74 | // moduleDirectories: [ 75 | // "node_modules" 76 | // ], 77 | 78 | // An array of file extensions your modules use 79 | // moduleFileExtensions: [ 80 | // "js", 81 | // "mjs", 82 | // "cjs", 83 | // "jsx", 84 | // "ts", 85 | // "tsx", 86 | // "json", 87 | // "node" 88 | // ], 89 | 90 | // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module 91 | // moduleNameMapper: {}, 92 | 93 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader 94 | // modulePathIgnorePatterns: [], 95 | 96 | // Activates notifications for test results 97 | // notify: false, 98 | 99 | // An enum that specifies notification mode. Requires { notify: true } 100 | // notifyMode: "failure-change", 101 | 102 | // A preset that is used as a base for Jest's configuration 103 | preset: "ts-jest", 104 | 105 | // Run tests from one or more projects 106 | // projects: undefined, 107 | 108 | // Use this configuration option to add custom reporters to Jest 109 | // reporters: undefined, 110 | 111 | // Automatically reset mock state before every test 112 | // resetMocks: false, 113 | 114 | // Reset the module registry before running each individual test 115 | // resetModules: false, 116 | 117 | // A path to a custom resolver 118 | // resolver: undefined, 119 | 120 | // Automatically restore mock state and implementation before every test 121 | // restoreMocks: false, 122 | 123 | // The root directory that Jest should scan for tests and modules within 124 | // rootDir: undefined, 125 | 126 | // A list of paths to directories that Jest should use to search for files in 127 | // roots: [ 128 | // "" 129 | // ], 130 | 131 | // Allows you to use a custom runner instead of Jest's default test runner 132 | // runner: "jest-runner", 133 | 134 | // The paths to modules that run some code to configure or set up the testing environment before each test 135 | // setupFiles: [], 136 | 137 | // A list of paths to modules that run some code to configure or set up the testing framework before each test 138 | // setupFilesAfterEnv: [], 139 | 140 | // The number of seconds after which a test is considered as slow and reported as such in the results. 141 | // slowTestThreshold: 5, 142 | 143 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing 144 | // snapshotSerializers: [], 145 | 146 | // The test environment that will be used for testing 147 | // testEnvironment: "jest-environment-node", 148 | 149 | // Options that will be passed to the testEnvironment 150 | // testEnvironmentOptions: {}, 151 | 152 | // Adds a location field to test results 153 | // testLocationInResults: false, 154 | 155 | // The glob patterns Jest uses to detect test files 156 | // testMatch: [ 157 | // "**/__tests__/**/*.[jt]s?(x)", 158 | // "**/?(*.)+(spec|test).[tj]s?(x)" 159 | // ], 160 | 161 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped 162 | // testPathIgnorePatterns: [ 163 | // "/node_modules/" 164 | // ], 165 | 166 | // The regexp pattern or array of patterns that Jest uses to detect test files 167 | // testRegex: [], 168 | 169 | // This option allows the use of a custom results processor 170 | // testResultsProcessor: undefined, 171 | 172 | // This option allows use of a custom test runner 173 | // testRunner: "jest-circus/runner", 174 | 175 | // A map from regular expressions to paths to transformers 176 | // transform: undefined, 177 | 178 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation 179 | // transformIgnorePatterns: [ 180 | // "/node_modules/", 181 | // "\\.pnp\\.[^\\/]+$" 182 | // ], 183 | 184 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them 185 | // unmockedModulePathPatterns: undefined, 186 | 187 | // Indicates whether each individual test should be reported during the run 188 | // verbose: undefined, 189 | 190 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode 191 | // watchPathIgnorePatterns: [], 192 | 193 | // Whether to use watchman for file crawling 194 | // watchman: true, 195 | }; 196 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "revisit-domain-model", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "revisit-domain-model", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "fp-ts": "^2.13.1", 13 | "zod": "^3.20.2" 14 | }, 15 | "devDependencies": { 16 | "@types/jest": "^29.2.6", 17 | "@types/node": "^18.11.18", 18 | "ts-jest": "^29.0.5", 19 | "ts-node": "^10.9.1", 20 | "typescript": "^4.9.4" 21 | } 22 | }, 23 | "node_modules/@ampproject/remapping": { 24 | "version": "2.2.0", 25 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 26 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 27 | "dev": true, 28 | "peer": true, 29 | "dependencies": { 30 | "@jridgewell/gen-mapping": "^0.1.0", 31 | "@jridgewell/trace-mapping": "^0.3.9" 32 | }, 33 | "engines": { 34 | "node": ">=6.0.0" 35 | } 36 | }, 37 | "node_modules/@babel/code-frame": { 38 | "version": "7.18.6", 39 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 40 | "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 41 | "dev": true, 42 | "dependencies": { 43 | "@babel/highlight": "^7.18.6" 44 | }, 45 | "engines": { 46 | "node": ">=6.9.0" 47 | } 48 | }, 49 | "node_modules/@babel/compat-data": { 50 | "version": "7.20.10", 51 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", 52 | "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", 53 | "dev": true, 54 | "peer": true, 55 | "engines": { 56 | "node": ">=6.9.0" 57 | } 58 | }, 59 | "node_modules/@babel/core": { 60 | "version": "7.20.12", 61 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", 62 | "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", 63 | "dev": true, 64 | "peer": true, 65 | "dependencies": { 66 | "@ampproject/remapping": "^2.1.0", 67 | "@babel/code-frame": "^7.18.6", 68 | "@babel/generator": "^7.20.7", 69 | "@babel/helper-compilation-targets": "^7.20.7", 70 | "@babel/helper-module-transforms": "^7.20.11", 71 | "@babel/helpers": "^7.20.7", 72 | "@babel/parser": "^7.20.7", 73 | "@babel/template": "^7.20.7", 74 | "@babel/traverse": "^7.20.12", 75 | "@babel/types": "^7.20.7", 76 | "convert-source-map": "^1.7.0", 77 | "debug": "^4.1.0", 78 | "gensync": "^1.0.0-beta.2", 79 | "json5": "^2.2.2", 80 | "semver": "^6.3.0" 81 | }, 82 | "engines": { 83 | "node": ">=6.9.0" 84 | }, 85 | "funding": { 86 | "type": "opencollective", 87 | "url": "https://opencollective.com/babel" 88 | } 89 | }, 90 | "node_modules/@babel/core/node_modules/convert-source-map": { 91 | "version": "1.9.0", 92 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 93 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 94 | "dev": true, 95 | "peer": true 96 | }, 97 | "node_modules/@babel/generator": { 98 | "version": "7.20.7", 99 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", 100 | "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", 101 | "dev": true, 102 | "peer": true, 103 | "dependencies": { 104 | "@babel/types": "^7.20.7", 105 | "@jridgewell/gen-mapping": "^0.3.2", 106 | "jsesc": "^2.5.1" 107 | }, 108 | "engines": { 109 | "node": ">=6.9.0" 110 | } 111 | }, 112 | "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 113 | "version": "0.3.2", 114 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 115 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 116 | "dev": true, 117 | "peer": true, 118 | "dependencies": { 119 | "@jridgewell/set-array": "^1.0.1", 120 | "@jridgewell/sourcemap-codec": "^1.4.10", 121 | "@jridgewell/trace-mapping": "^0.3.9" 122 | }, 123 | "engines": { 124 | "node": ">=6.0.0" 125 | } 126 | }, 127 | "node_modules/@babel/helper-compilation-targets": { 128 | "version": "7.20.7", 129 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", 130 | "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", 131 | "dev": true, 132 | "peer": true, 133 | "dependencies": { 134 | "@babel/compat-data": "^7.20.5", 135 | "@babel/helper-validator-option": "^7.18.6", 136 | "browserslist": "^4.21.3", 137 | "lru-cache": "^5.1.1", 138 | "semver": "^6.3.0" 139 | }, 140 | "engines": { 141 | "node": ">=6.9.0" 142 | }, 143 | "peerDependencies": { 144 | "@babel/core": "^7.0.0" 145 | } 146 | }, 147 | "node_modules/@babel/helper-environment-visitor": { 148 | "version": "7.18.9", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 150 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 151 | "dev": true, 152 | "peer": true, 153 | "engines": { 154 | "node": ">=6.9.0" 155 | } 156 | }, 157 | "node_modules/@babel/helper-function-name": { 158 | "version": "7.19.0", 159 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", 160 | "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", 161 | "dev": true, 162 | "peer": true, 163 | "dependencies": { 164 | "@babel/template": "^7.18.10", 165 | "@babel/types": "^7.19.0" 166 | }, 167 | "engines": { 168 | "node": ">=6.9.0" 169 | } 170 | }, 171 | "node_modules/@babel/helper-hoist-variables": { 172 | "version": "7.18.6", 173 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 174 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 175 | "dev": true, 176 | "peer": true, 177 | "dependencies": { 178 | "@babel/types": "^7.18.6" 179 | }, 180 | "engines": { 181 | "node": ">=6.9.0" 182 | } 183 | }, 184 | "node_modules/@babel/helper-module-imports": { 185 | "version": "7.18.6", 186 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 187 | "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 188 | "dev": true, 189 | "peer": true, 190 | "dependencies": { 191 | "@babel/types": "^7.18.6" 192 | }, 193 | "engines": { 194 | "node": ">=6.9.0" 195 | } 196 | }, 197 | "node_modules/@babel/helper-module-transforms": { 198 | "version": "7.20.11", 199 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", 200 | "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", 201 | "dev": true, 202 | "peer": true, 203 | "dependencies": { 204 | "@babel/helper-environment-visitor": "^7.18.9", 205 | "@babel/helper-module-imports": "^7.18.6", 206 | "@babel/helper-simple-access": "^7.20.2", 207 | "@babel/helper-split-export-declaration": "^7.18.6", 208 | "@babel/helper-validator-identifier": "^7.19.1", 209 | "@babel/template": "^7.20.7", 210 | "@babel/traverse": "^7.20.10", 211 | "@babel/types": "^7.20.7" 212 | }, 213 | "engines": { 214 | "node": ">=6.9.0" 215 | } 216 | }, 217 | "node_modules/@babel/helper-plugin-utils": { 218 | "version": "7.20.2", 219 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", 220 | "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", 221 | "dev": true, 222 | "peer": true, 223 | "engines": { 224 | "node": ">=6.9.0" 225 | } 226 | }, 227 | "node_modules/@babel/helper-simple-access": { 228 | "version": "7.20.2", 229 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", 230 | "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", 231 | "dev": true, 232 | "peer": true, 233 | "dependencies": { 234 | "@babel/types": "^7.20.2" 235 | }, 236 | "engines": { 237 | "node": ">=6.9.0" 238 | } 239 | }, 240 | "node_modules/@babel/helper-split-export-declaration": { 241 | "version": "7.18.6", 242 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 243 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 244 | "dev": true, 245 | "peer": true, 246 | "dependencies": { 247 | "@babel/types": "^7.18.6" 248 | }, 249 | "engines": { 250 | "node": ">=6.9.0" 251 | } 252 | }, 253 | "node_modules/@babel/helper-string-parser": { 254 | "version": "7.19.4", 255 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 256 | "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 257 | "dev": true, 258 | "peer": true, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | } 262 | }, 263 | "node_modules/@babel/helper-validator-identifier": { 264 | "version": "7.19.1", 265 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 266 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 267 | "dev": true, 268 | "engines": { 269 | "node": ">=6.9.0" 270 | } 271 | }, 272 | "node_modules/@babel/helper-validator-option": { 273 | "version": "7.18.6", 274 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", 275 | "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", 276 | "dev": true, 277 | "peer": true, 278 | "engines": { 279 | "node": ">=6.9.0" 280 | } 281 | }, 282 | "node_modules/@babel/helpers": { 283 | "version": "7.20.13", 284 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", 285 | "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", 286 | "dev": true, 287 | "peer": true, 288 | "dependencies": { 289 | "@babel/template": "^7.20.7", 290 | "@babel/traverse": "^7.20.13", 291 | "@babel/types": "^7.20.7" 292 | }, 293 | "engines": { 294 | "node": ">=6.9.0" 295 | } 296 | }, 297 | "node_modules/@babel/highlight": { 298 | "version": "7.18.6", 299 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 300 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 301 | "dev": true, 302 | "dependencies": { 303 | "@babel/helper-validator-identifier": "^7.18.6", 304 | "chalk": "^2.0.0", 305 | "js-tokens": "^4.0.0" 306 | }, 307 | "engines": { 308 | "node": ">=6.9.0" 309 | } 310 | }, 311 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 312 | "version": "3.2.1", 313 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 314 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 315 | "dev": true, 316 | "dependencies": { 317 | "color-convert": "^1.9.0" 318 | }, 319 | "engines": { 320 | "node": ">=4" 321 | } 322 | }, 323 | "node_modules/@babel/highlight/node_modules/chalk": { 324 | "version": "2.4.2", 325 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 326 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 327 | "dev": true, 328 | "dependencies": { 329 | "ansi-styles": "^3.2.1", 330 | "escape-string-regexp": "^1.0.5", 331 | "supports-color": "^5.3.0" 332 | }, 333 | "engines": { 334 | "node": ">=4" 335 | } 336 | }, 337 | "node_modules/@babel/highlight/node_modules/color-convert": { 338 | "version": "1.9.3", 339 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 340 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 341 | "dev": true, 342 | "dependencies": { 343 | "color-name": "1.1.3" 344 | } 345 | }, 346 | "node_modules/@babel/highlight/node_modules/color-name": { 347 | "version": "1.1.3", 348 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 349 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 350 | "dev": true 351 | }, 352 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 353 | "version": "1.0.5", 354 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 355 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 356 | "dev": true, 357 | "engines": { 358 | "node": ">=0.8.0" 359 | } 360 | }, 361 | "node_modules/@babel/highlight/node_modules/has-flag": { 362 | "version": "3.0.0", 363 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 364 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 365 | "dev": true, 366 | "engines": { 367 | "node": ">=4" 368 | } 369 | }, 370 | "node_modules/@babel/highlight/node_modules/supports-color": { 371 | "version": "5.5.0", 372 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 373 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 374 | "dev": true, 375 | "dependencies": { 376 | "has-flag": "^3.0.0" 377 | }, 378 | "engines": { 379 | "node": ">=4" 380 | } 381 | }, 382 | "node_modules/@babel/parser": { 383 | "version": "7.20.13", 384 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", 385 | "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", 386 | "dev": true, 387 | "peer": true, 388 | "bin": { 389 | "parser": "bin/babel-parser.js" 390 | }, 391 | "engines": { 392 | "node": ">=6.0.0" 393 | } 394 | }, 395 | "node_modules/@babel/plugin-syntax-async-generators": { 396 | "version": "7.8.4", 397 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 398 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 399 | "dev": true, 400 | "peer": true, 401 | "dependencies": { 402 | "@babel/helper-plugin-utils": "^7.8.0" 403 | }, 404 | "peerDependencies": { 405 | "@babel/core": "^7.0.0-0" 406 | } 407 | }, 408 | "node_modules/@babel/plugin-syntax-bigint": { 409 | "version": "7.8.3", 410 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", 411 | "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", 412 | "dev": true, 413 | "peer": true, 414 | "dependencies": { 415 | "@babel/helper-plugin-utils": "^7.8.0" 416 | }, 417 | "peerDependencies": { 418 | "@babel/core": "^7.0.0-0" 419 | } 420 | }, 421 | "node_modules/@babel/plugin-syntax-class-properties": { 422 | "version": "7.12.13", 423 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 424 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 425 | "dev": true, 426 | "peer": true, 427 | "dependencies": { 428 | "@babel/helper-plugin-utils": "^7.12.13" 429 | }, 430 | "peerDependencies": { 431 | "@babel/core": "^7.0.0-0" 432 | } 433 | }, 434 | "node_modules/@babel/plugin-syntax-import-meta": { 435 | "version": "7.10.4", 436 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 437 | "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 438 | "dev": true, 439 | "peer": true, 440 | "dependencies": { 441 | "@babel/helper-plugin-utils": "^7.10.4" 442 | }, 443 | "peerDependencies": { 444 | "@babel/core": "^7.0.0-0" 445 | } 446 | }, 447 | "node_modules/@babel/plugin-syntax-json-strings": { 448 | "version": "7.8.3", 449 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 450 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 451 | "dev": true, 452 | "peer": true, 453 | "dependencies": { 454 | "@babel/helper-plugin-utils": "^7.8.0" 455 | }, 456 | "peerDependencies": { 457 | "@babel/core": "^7.0.0-0" 458 | } 459 | }, 460 | "node_modules/@babel/plugin-syntax-jsx": { 461 | "version": "7.18.6", 462 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", 463 | "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", 464 | "dev": true, 465 | "peer": true, 466 | "dependencies": { 467 | "@babel/helper-plugin-utils": "^7.18.6" 468 | }, 469 | "engines": { 470 | "node": ">=6.9.0" 471 | }, 472 | "peerDependencies": { 473 | "@babel/core": "^7.0.0-0" 474 | } 475 | }, 476 | "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 477 | "version": "7.10.4", 478 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 479 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 480 | "dev": true, 481 | "peer": true, 482 | "dependencies": { 483 | "@babel/helper-plugin-utils": "^7.10.4" 484 | }, 485 | "peerDependencies": { 486 | "@babel/core": "^7.0.0-0" 487 | } 488 | }, 489 | "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 490 | "version": "7.8.3", 491 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 492 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 493 | "dev": true, 494 | "peer": true, 495 | "dependencies": { 496 | "@babel/helper-plugin-utils": "^7.8.0" 497 | }, 498 | "peerDependencies": { 499 | "@babel/core": "^7.0.0-0" 500 | } 501 | }, 502 | "node_modules/@babel/plugin-syntax-numeric-separator": { 503 | "version": "7.10.4", 504 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 505 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 506 | "dev": true, 507 | "peer": true, 508 | "dependencies": { 509 | "@babel/helper-plugin-utils": "^7.10.4" 510 | }, 511 | "peerDependencies": { 512 | "@babel/core": "^7.0.0-0" 513 | } 514 | }, 515 | "node_modules/@babel/plugin-syntax-object-rest-spread": { 516 | "version": "7.8.3", 517 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 518 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 519 | "dev": true, 520 | "peer": true, 521 | "dependencies": { 522 | "@babel/helper-plugin-utils": "^7.8.0" 523 | }, 524 | "peerDependencies": { 525 | "@babel/core": "^7.0.0-0" 526 | } 527 | }, 528 | "node_modules/@babel/plugin-syntax-optional-catch-binding": { 529 | "version": "7.8.3", 530 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 531 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 532 | "dev": true, 533 | "peer": true, 534 | "dependencies": { 535 | "@babel/helper-plugin-utils": "^7.8.0" 536 | }, 537 | "peerDependencies": { 538 | "@babel/core": "^7.0.0-0" 539 | } 540 | }, 541 | "node_modules/@babel/plugin-syntax-optional-chaining": { 542 | "version": "7.8.3", 543 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 544 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 545 | "dev": true, 546 | "peer": true, 547 | "dependencies": { 548 | "@babel/helper-plugin-utils": "^7.8.0" 549 | }, 550 | "peerDependencies": { 551 | "@babel/core": "^7.0.0-0" 552 | } 553 | }, 554 | "node_modules/@babel/plugin-syntax-top-level-await": { 555 | "version": "7.14.5", 556 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 557 | "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 558 | "dev": true, 559 | "peer": true, 560 | "dependencies": { 561 | "@babel/helper-plugin-utils": "^7.14.5" 562 | }, 563 | "engines": { 564 | "node": ">=6.9.0" 565 | }, 566 | "peerDependencies": { 567 | "@babel/core": "^7.0.0-0" 568 | } 569 | }, 570 | "node_modules/@babel/plugin-syntax-typescript": { 571 | "version": "7.20.0", 572 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", 573 | "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", 574 | "dev": true, 575 | "peer": true, 576 | "dependencies": { 577 | "@babel/helper-plugin-utils": "^7.19.0" 578 | }, 579 | "engines": { 580 | "node": ">=6.9.0" 581 | }, 582 | "peerDependencies": { 583 | "@babel/core": "^7.0.0-0" 584 | } 585 | }, 586 | "node_modules/@babel/template": { 587 | "version": "7.20.7", 588 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", 589 | "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", 590 | "dev": true, 591 | "peer": true, 592 | "dependencies": { 593 | "@babel/code-frame": "^7.18.6", 594 | "@babel/parser": "^7.20.7", 595 | "@babel/types": "^7.20.7" 596 | }, 597 | "engines": { 598 | "node": ">=6.9.0" 599 | } 600 | }, 601 | "node_modules/@babel/traverse": { 602 | "version": "7.20.13", 603 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", 604 | "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", 605 | "dev": true, 606 | "peer": true, 607 | "dependencies": { 608 | "@babel/code-frame": "^7.18.6", 609 | "@babel/generator": "^7.20.7", 610 | "@babel/helper-environment-visitor": "^7.18.9", 611 | "@babel/helper-function-name": "^7.19.0", 612 | "@babel/helper-hoist-variables": "^7.18.6", 613 | "@babel/helper-split-export-declaration": "^7.18.6", 614 | "@babel/parser": "^7.20.13", 615 | "@babel/types": "^7.20.7", 616 | "debug": "^4.1.0", 617 | "globals": "^11.1.0" 618 | }, 619 | "engines": { 620 | "node": ">=6.9.0" 621 | } 622 | }, 623 | "node_modules/@babel/types": { 624 | "version": "7.20.7", 625 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", 626 | "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", 627 | "dev": true, 628 | "peer": true, 629 | "dependencies": { 630 | "@babel/helper-string-parser": "^7.19.4", 631 | "@babel/helper-validator-identifier": "^7.19.1", 632 | "to-fast-properties": "^2.0.0" 633 | }, 634 | "engines": { 635 | "node": ">=6.9.0" 636 | } 637 | }, 638 | "node_modules/@bcoe/v8-coverage": { 639 | "version": "0.2.3", 640 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 641 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 642 | "dev": true, 643 | "peer": true 644 | }, 645 | "node_modules/@cspotcode/source-map-support": { 646 | "version": "0.8.1", 647 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 648 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 649 | "dev": true, 650 | "dependencies": { 651 | "@jridgewell/trace-mapping": "0.3.9" 652 | }, 653 | "engines": { 654 | "node": ">=12" 655 | } 656 | }, 657 | "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { 658 | "version": "0.3.9", 659 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 660 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 661 | "dev": true, 662 | "dependencies": { 663 | "@jridgewell/resolve-uri": "^3.0.3", 664 | "@jridgewell/sourcemap-codec": "^1.4.10" 665 | } 666 | }, 667 | "node_modules/@istanbuljs/load-nyc-config": { 668 | "version": "1.1.0", 669 | "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", 670 | "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", 671 | "dev": true, 672 | "peer": true, 673 | "dependencies": { 674 | "camelcase": "^5.3.1", 675 | "find-up": "^4.1.0", 676 | "get-package-type": "^0.1.0", 677 | "js-yaml": "^3.13.1", 678 | "resolve-from": "^5.0.0" 679 | }, 680 | "engines": { 681 | "node": ">=8" 682 | } 683 | }, 684 | "node_modules/@istanbuljs/schema": { 685 | "version": "0.1.3", 686 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 687 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 688 | "dev": true, 689 | "peer": true, 690 | "engines": { 691 | "node": ">=8" 692 | } 693 | }, 694 | "node_modules/@jest/console": { 695 | "version": "29.3.1", 696 | "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", 697 | "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", 698 | "dev": true, 699 | "peer": true, 700 | "dependencies": { 701 | "@jest/types": "^29.3.1", 702 | "@types/node": "*", 703 | "chalk": "^4.0.0", 704 | "jest-message-util": "^29.3.1", 705 | "jest-util": "^29.3.1", 706 | "slash": "^3.0.0" 707 | }, 708 | "engines": { 709 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 710 | } 711 | }, 712 | "node_modules/@jest/core": { 713 | "version": "29.3.1", 714 | "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", 715 | "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", 716 | "dev": true, 717 | "peer": true, 718 | "dependencies": { 719 | "@jest/console": "^29.3.1", 720 | "@jest/reporters": "^29.3.1", 721 | "@jest/test-result": "^29.3.1", 722 | "@jest/transform": "^29.3.1", 723 | "@jest/types": "^29.3.1", 724 | "@types/node": "*", 725 | "ansi-escapes": "^4.2.1", 726 | "chalk": "^4.0.0", 727 | "ci-info": "^3.2.0", 728 | "exit": "^0.1.2", 729 | "graceful-fs": "^4.2.9", 730 | "jest-changed-files": "^29.2.0", 731 | "jest-config": "^29.3.1", 732 | "jest-haste-map": "^29.3.1", 733 | "jest-message-util": "^29.3.1", 734 | "jest-regex-util": "^29.2.0", 735 | "jest-resolve": "^29.3.1", 736 | "jest-resolve-dependencies": "^29.3.1", 737 | "jest-runner": "^29.3.1", 738 | "jest-runtime": "^29.3.1", 739 | "jest-snapshot": "^29.3.1", 740 | "jest-util": "^29.3.1", 741 | "jest-validate": "^29.3.1", 742 | "jest-watcher": "^29.3.1", 743 | "micromatch": "^4.0.4", 744 | "pretty-format": "^29.3.1", 745 | "slash": "^3.0.0", 746 | "strip-ansi": "^6.0.0" 747 | }, 748 | "engines": { 749 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 750 | }, 751 | "peerDependencies": { 752 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 753 | }, 754 | "peerDependenciesMeta": { 755 | "node-notifier": { 756 | "optional": true 757 | } 758 | } 759 | }, 760 | "node_modules/@jest/environment": { 761 | "version": "29.3.1", 762 | "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", 763 | "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", 764 | "dev": true, 765 | "peer": true, 766 | "dependencies": { 767 | "@jest/fake-timers": "^29.3.1", 768 | "@jest/types": "^29.3.1", 769 | "@types/node": "*", 770 | "jest-mock": "^29.3.1" 771 | }, 772 | "engines": { 773 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 774 | } 775 | }, 776 | "node_modules/@jest/expect": { 777 | "version": "29.3.1", 778 | "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", 779 | "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", 780 | "dev": true, 781 | "peer": true, 782 | "dependencies": { 783 | "expect": "^29.3.1", 784 | "jest-snapshot": "^29.3.1" 785 | }, 786 | "engines": { 787 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 788 | } 789 | }, 790 | "node_modules/@jest/expect-utils": { 791 | "version": "29.3.1", 792 | "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", 793 | "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", 794 | "dev": true, 795 | "dependencies": { 796 | "jest-get-type": "^29.2.0" 797 | }, 798 | "engines": { 799 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 800 | } 801 | }, 802 | "node_modules/@jest/fake-timers": { 803 | "version": "29.3.1", 804 | "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", 805 | "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", 806 | "dev": true, 807 | "peer": true, 808 | "dependencies": { 809 | "@jest/types": "^29.3.1", 810 | "@sinonjs/fake-timers": "^9.1.2", 811 | "@types/node": "*", 812 | "jest-message-util": "^29.3.1", 813 | "jest-mock": "^29.3.1", 814 | "jest-util": "^29.3.1" 815 | }, 816 | "engines": { 817 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 818 | } 819 | }, 820 | "node_modules/@jest/globals": { 821 | "version": "29.3.1", 822 | "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", 823 | "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", 824 | "dev": true, 825 | "peer": true, 826 | "dependencies": { 827 | "@jest/environment": "^29.3.1", 828 | "@jest/expect": "^29.3.1", 829 | "@jest/types": "^29.3.1", 830 | "jest-mock": "^29.3.1" 831 | }, 832 | "engines": { 833 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 834 | } 835 | }, 836 | "node_modules/@jest/reporters": { 837 | "version": "29.3.1", 838 | "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", 839 | "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", 840 | "dev": true, 841 | "peer": true, 842 | "dependencies": { 843 | "@bcoe/v8-coverage": "^0.2.3", 844 | "@jest/console": "^29.3.1", 845 | "@jest/test-result": "^29.3.1", 846 | "@jest/transform": "^29.3.1", 847 | "@jest/types": "^29.3.1", 848 | "@jridgewell/trace-mapping": "^0.3.15", 849 | "@types/node": "*", 850 | "chalk": "^4.0.0", 851 | "collect-v8-coverage": "^1.0.0", 852 | "exit": "^0.1.2", 853 | "glob": "^7.1.3", 854 | "graceful-fs": "^4.2.9", 855 | "istanbul-lib-coverage": "^3.0.0", 856 | "istanbul-lib-instrument": "^5.1.0", 857 | "istanbul-lib-report": "^3.0.0", 858 | "istanbul-lib-source-maps": "^4.0.0", 859 | "istanbul-reports": "^3.1.3", 860 | "jest-message-util": "^29.3.1", 861 | "jest-util": "^29.3.1", 862 | "jest-worker": "^29.3.1", 863 | "slash": "^3.0.0", 864 | "string-length": "^4.0.1", 865 | "strip-ansi": "^6.0.0", 866 | "v8-to-istanbul": "^9.0.1" 867 | }, 868 | "engines": { 869 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 870 | }, 871 | "peerDependencies": { 872 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 873 | }, 874 | "peerDependenciesMeta": { 875 | "node-notifier": { 876 | "optional": true 877 | } 878 | } 879 | }, 880 | "node_modules/@jest/schemas": { 881 | "version": "29.0.0", 882 | "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", 883 | "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", 884 | "dev": true, 885 | "dependencies": { 886 | "@sinclair/typebox": "^0.24.1" 887 | }, 888 | "engines": { 889 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 890 | } 891 | }, 892 | "node_modules/@jest/source-map": { 893 | "version": "29.2.0", 894 | "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", 895 | "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", 896 | "dev": true, 897 | "peer": true, 898 | "dependencies": { 899 | "@jridgewell/trace-mapping": "^0.3.15", 900 | "callsites": "^3.0.0", 901 | "graceful-fs": "^4.2.9" 902 | }, 903 | "engines": { 904 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 905 | } 906 | }, 907 | "node_modules/@jest/test-result": { 908 | "version": "29.3.1", 909 | "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", 910 | "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", 911 | "dev": true, 912 | "peer": true, 913 | "dependencies": { 914 | "@jest/console": "^29.3.1", 915 | "@jest/types": "^29.3.1", 916 | "@types/istanbul-lib-coverage": "^2.0.0", 917 | "collect-v8-coverage": "^1.0.0" 918 | }, 919 | "engines": { 920 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 921 | } 922 | }, 923 | "node_modules/@jest/test-sequencer": { 924 | "version": "29.3.1", 925 | "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", 926 | "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", 927 | "dev": true, 928 | "peer": true, 929 | "dependencies": { 930 | "@jest/test-result": "^29.3.1", 931 | "graceful-fs": "^4.2.9", 932 | "jest-haste-map": "^29.3.1", 933 | "slash": "^3.0.0" 934 | }, 935 | "engines": { 936 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 937 | } 938 | }, 939 | "node_modules/@jest/transform": { 940 | "version": "29.3.1", 941 | "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", 942 | "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", 943 | "dev": true, 944 | "peer": true, 945 | "dependencies": { 946 | "@babel/core": "^7.11.6", 947 | "@jest/types": "^29.3.1", 948 | "@jridgewell/trace-mapping": "^0.3.15", 949 | "babel-plugin-istanbul": "^6.1.1", 950 | "chalk": "^4.0.0", 951 | "convert-source-map": "^2.0.0", 952 | "fast-json-stable-stringify": "^2.1.0", 953 | "graceful-fs": "^4.2.9", 954 | "jest-haste-map": "^29.3.1", 955 | "jest-regex-util": "^29.2.0", 956 | "jest-util": "^29.3.1", 957 | "micromatch": "^4.0.4", 958 | "pirates": "^4.0.4", 959 | "slash": "^3.0.0", 960 | "write-file-atomic": "^4.0.1" 961 | }, 962 | "engines": { 963 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 964 | } 965 | }, 966 | "node_modules/@jest/types": { 967 | "version": "29.3.1", 968 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", 969 | "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", 970 | "dev": true, 971 | "dependencies": { 972 | "@jest/schemas": "^29.0.0", 973 | "@types/istanbul-lib-coverage": "^2.0.0", 974 | "@types/istanbul-reports": "^3.0.0", 975 | "@types/node": "*", 976 | "@types/yargs": "^17.0.8", 977 | "chalk": "^4.0.0" 978 | }, 979 | "engines": { 980 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 981 | } 982 | }, 983 | "node_modules/@jridgewell/gen-mapping": { 984 | "version": "0.1.1", 985 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 986 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 987 | "dev": true, 988 | "peer": true, 989 | "dependencies": { 990 | "@jridgewell/set-array": "^1.0.0", 991 | "@jridgewell/sourcemap-codec": "^1.4.10" 992 | }, 993 | "engines": { 994 | "node": ">=6.0.0" 995 | } 996 | }, 997 | "node_modules/@jridgewell/resolve-uri": { 998 | "version": "3.1.0", 999 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 1000 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 1001 | "dev": true, 1002 | "engines": { 1003 | "node": ">=6.0.0" 1004 | } 1005 | }, 1006 | "node_modules/@jridgewell/set-array": { 1007 | "version": "1.1.2", 1008 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 1009 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 1010 | "dev": true, 1011 | "peer": true, 1012 | "engines": { 1013 | "node": ">=6.0.0" 1014 | } 1015 | }, 1016 | "node_modules/@jridgewell/sourcemap-codec": { 1017 | "version": "1.4.14", 1018 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 1019 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 1020 | "dev": true 1021 | }, 1022 | "node_modules/@jridgewell/trace-mapping": { 1023 | "version": "0.3.17", 1024 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 1025 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 1026 | "dev": true, 1027 | "peer": true, 1028 | "dependencies": { 1029 | "@jridgewell/resolve-uri": "3.1.0", 1030 | "@jridgewell/sourcemap-codec": "1.4.14" 1031 | } 1032 | }, 1033 | "node_modules/@sinclair/typebox": { 1034 | "version": "0.24.51", 1035 | "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", 1036 | "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", 1037 | "dev": true 1038 | }, 1039 | "node_modules/@sinonjs/commons": { 1040 | "version": "1.8.6", 1041 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", 1042 | "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", 1043 | "dev": true, 1044 | "peer": true, 1045 | "dependencies": { 1046 | "type-detect": "4.0.8" 1047 | } 1048 | }, 1049 | "node_modules/@sinonjs/fake-timers": { 1050 | "version": "9.1.2", 1051 | "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", 1052 | "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", 1053 | "dev": true, 1054 | "peer": true, 1055 | "dependencies": { 1056 | "@sinonjs/commons": "^1.7.0" 1057 | } 1058 | }, 1059 | "node_modules/@tsconfig/node10": { 1060 | "version": "1.0.9", 1061 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 1062 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 1063 | "dev": true 1064 | }, 1065 | "node_modules/@tsconfig/node12": { 1066 | "version": "1.0.11", 1067 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 1068 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 1069 | "dev": true 1070 | }, 1071 | "node_modules/@tsconfig/node14": { 1072 | "version": "1.0.3", 1073 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 1074 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 1075 | "dev": true 1076 | }, 1077 | "node_modules/@tsconfig/node16": { 1078 | "version": "1.0.3", 1079 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 1080 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 1081 | "dev": true 1082 | }, 1083 | "node_modules/@types/babel__core": { 1084 | "version": "7.20.0", 1085 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", 1086 | "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", 1087 | "dev": true, 1088 | "peer": true, 1089 | "dependencies": { 1090 | "@babel/parser": "^7.20.7", 1091 | "@babel/types": "^7.20.7", 1092 | "@types/babel__generator": "*", 1093 | "@types/babel__template": "*", 1094 | "@types/babel__traverse": "*" 1095 | } 1096 | }, 1097 | "node_modules/@types/babel__generator": { 1098 | "version": "7.6.4", 1099 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", 1100 | "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", 1101 | "dev": true, 1102 | "peer": true, 1103 | "dependencies": { 1104 | "@babel/types": "^7.0.0" 1105 | } 1106 | }, 1107 | "node_modules/@types/babel__template": { 1108 | "version": "7.4.1", 1109 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", 1110 | "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", 1111 | "dev": true, 1112 | "peer": true, 1113 | "dependencies": { 1114 | "@babel/parser": "^7.1.0", 1115 | "@babel/types": "^7.0.0" 1116 | } 1117 | }, 1118 | "node_modules/@types/babel__traverse": { 1119 | "version": "7.18.3", 1120 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", 1121 | "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", 1122 | "dev": true, 1123 | "peer": true, 1124 | "dependencies": { 1125 | "@babel/types": "^7.3.0" 1126 | } 1127 | }, 1128 | "node_modules/@types/graceful-fs": { 1129 | "version": "4.1.6", 1130 | "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", 1131 | "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", 1132 | "dev": true, 1133 | "peer": true, 1134 | "dependencies": { 1135 | "@types/node": "*" 1136 | } 1137 | }, 1138 | "node_modules/@types/istanbul-lib-coverage": { 1139 | "version": "2.0.4", 1140 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 1141 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 1142 | "dev": true 1143 | }, 1144 | "node_modules/@types/istanbul-lib-report": { 1145 | "version": "3.0.0", 1146 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1147 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 1148 | "dev": true, 1149 | "dependencies": { 1150 | "@types/istanbul-lib-coverage": "*" 1151 | } 1152 | }, 1153 | "node_modules/@types/istanbul-reports": { 1154 | "version": "3.0.1", 1155 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", 1156 | "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", 1157 | "dev": true, 1158 | "dependencies": { 1159 | "@types/istanbul-lib-report": "*" 1160 | } 1161 | }, 1162 | "node_modules/@types/jest": { 1163 | "version": "29.2.6", 1164 | "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.6.tgz", 1165 | "integrity": "sha512-XEUC/Tgw3uMh6Ho8GkUtQ2lPhY5Fmgyp3TdlkTJs1W9VgNxs+Ow/x3Elh8lHQKqCbZL0AubQuqWjHVT033Hhrw==", 1166 | "dev": true, 1167 | "dependencies": { 1168 | "expect": "^29.0.0", 1169 | "pretty-format": "^29.0.0" 1170 | } 1171 | }, 1172 | "node_modules/@types/node": { 1173 | "version": "18.11.18", 1174 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", 1175 | "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", 1176 | "dev": true 1177 | }, 1178 | "node_modules/@types/prettier": { 1179 | "version": "2.7.2", 1180 | "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", 1181 | "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", 1182 | "dev": true, 1183 | "peer": true 1184 | }, 1185 | "node_modules/@types/stack-utils": { 1186 | "version": "2.0.1", 1187 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", 1188 | "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", 1189 | "dev": true 1190 | }, 1191 | "node_modules/@types/yargs": { 1192 | "version": "17.0.20", 1193 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", 1194 | "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", 1195 | "dev": true, 1196 | "dependencies": { 1197 | "@types/yargs-parser": "*" 1198 | } 1199 | }, 1200 | "node_modules/@types/yargs-parser": { 1201 | "version": "21.0.0", 1202 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", 1203 | "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", 1204 | "dev": true 1205 | }, 1206 | "node_modules/acorn": { 1207 | "version": "8.8.2", 1208 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 1209 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 1210 | "dev": true, 1211 | "bin": { 1212 | "acorn": "bin/acorn" 1213 | }, 1214 | "engines": { 1215 | "node": ">=0.4.0" 1216 | } 1217 | }, 1218 | "node_modules/acorn-walk": { 1219 | "version": "8.2.0", 1220 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1221 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 1222 | "dev": true, 1223 | "engines": { 1224 | "node": ">=0.4.0" 1225 | } 1226 | }, 1227 | "node_modules/ansi-escapes": { 1228 | "version": "4.3.2", 1229 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1230 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1231 | "dev": true, 1232 | "peer": true, 1233 | "dependencies": { 1234 | "type-fest": "^0.21.3" 1235 | }, 1236 | "engines": { 1237 | "node": ">=8" 1238 | }, 1239 | "funding": { 1240 | "url": "https://github.com/sponsors/sindresorhus" 1241 | } 1242 | }, 1243 | "node_modules/ansi-regex": { 1244 | "version": "5.0.1", 1245 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1246 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1247 | "dev": true, 1248 | "peer": true, 1249 | "engines": { 1250 | "node": ">=8" 1251 | } 1252 | }, 1253 | "node_modules/ansi-styles": { 1254 | "version": "4.3.0", 1255 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1256 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1257 | "dev": true, 1258 | "dependencies": { 1259 | "color-convert": "^2.0.1" 1260 | }, 1261 | "engines": { 1262 | "node": ">=8" 1263 | }, 1264 | "funding": { 1265 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1266 | } 1267 | }, 1268 | "node_modules/anymatch": { 1269 | "version": "3.1.3", 1270 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1271 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1272 | "dev": true, 1273 | "peer": true, 1274 | "dependencies": { 1275 | "normalize-path": "^3.0.0", 1276 | "picomatch": "^2.0.4" 1277 | }, 1278 | "engines": { 1279 | "node": ">= 8" 1280 | } 1281 | }, 1282 | "node_modules/arg": { 1283 | "version": "4.1.3", 1284 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1285 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 1286 | "dev": true 1287 | }, 1288 | "node_modules/argparse": { 1289 | "version": "1.0.10", 1290 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1291 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1292 | "dev": true, 1293 | "peer": true, 1294 | "dependencies": { 1295 | "sprintf-js": "~1.0.2" 1296 | } 1297 | }, 1298 | "node_modules/babel-jest": { 1299 | "version": "29.3.1", 1300 | "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", 1301 | "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", 1302 | "dev": true, 1303 | "peer": true, 1304 | "dependencies": { 1305 | "@jest/transform": "^29.3.1", 1306 | "@types/babel__core": "^7.1.14", 1307 | "babel-plugin-istanbul": "^6.1.1", 1308 | "babel-preset-jest": "^29.2.0", 1309 | "chalk": "^4.0.0", 1310 | "graceful-fs": "^4.2.9", 1311 | "slash": "^3.0.0" 1312 | }, 1313 | "engines": { 1314 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1315 | }, 1316 | "peerDependencies": { 1317 | "@babel/core": "^7.8.0" 1318 | } 1319 | }, 1320 | "node_modules/babel-plugin-istanbul": { 1321 | "version": "6.1.1", 1322 | "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", 1323 | "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", 1324 | "dev": true, 1325 | "peer": true, 1326 | "dependencies": { 1327 | "@babel/helper-plugin-utils": "^7.0.0", 1328 | "@istanbuljs/load-nyc-config": "^1.0.0", 1329 | "@istanbuljs/schema": "^0.1.2", 1330 | "istanbul-lib-instrument": "^5.0.4", 1331 | "test-exclude": "^6.0.0" 1332 | }, 1333 | "engines": { 1334 | "node": ">=8" 1335 | } 1336 | }, 1337 | "node_modules/babel-plugin-jest-hoist": { 1338 | "version": "29.2.0", 1339 | "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", 1340 | "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", 1341 | "dev": true, 1342 | "peer": true, 1343 | "dependencies": { 1344 | "@babel/template": "^7.3.3", 1345 | "@babel/types": "^7.3.3", 1346 | "@types/babel__core": "^7.1.14", 1347 | "@types/babel__traverse": "^7.0.6" 1348 | }, 1349 | "engines": { 1350 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1351 | } 1352 | }, 1353 | "node_modules/babel-preset-current-node-syntax": { 1354 | "version": "1.0.1", 1355 | "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", 1356 | "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", 1357 | "dev": true, 1358 | "peer": true, 1359 | "dependencies": { 1360 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1361 | "@babel/plugin-syntax-bigint": "^7.8.3", 1362 | "@babel/plugin-syntax-class-properties": "^7.8.3", 1363 | "@babel/plugin-syntax-import-meta": "^7.8.3", 1364 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1365 | "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", 1366 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1367 | "@babel/plugin-syntax-numeric-separator": "^7.8.3", 1368 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1369 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1370 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1371 | "@babel/plugin-syntax-top-level-await": "^7.8.3" 1372 | }, 1373 | "peerDependencies": { 1374 | "@babel/core": "^7.0.0" 1375 | } 1376 | }, 1377 | "node_modules/babel-preset-jest": { 1378 | "version": "29.2.0", 1379 | "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", 1380 | "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", 1381 | "dev": true, 1382 | "peer": true, 1383 | "dependencies": { 1384 | "babel-plugin-jest-hoist": "^29.2.0", 1385 | "babel-preset-current-node-syntax": "^1.0.0" 1386 | }, 1387 | "engines": { 1388 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1389 | }, 1390 | "peerDependencies": { 1391 | "@babel/core": "^7.0.0" 1392 | } 1393 | }, 1394 | "node_modules/balanced-match": { 1395 | "version": "1.0.2", 1396 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1397 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1398 | "dev": true, 1399 | "peer": true 1400 | }, 1401 | "node_modules/brace-expansion": { 1402 | "version": "1.1.11", 1403 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1404 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1405 | "dev": true, 1406 | "peer": true, 1407 | "dependencies": { 1408 | "balanced-match": "^1.0.0", 1409 | "concat-map": "0.0.1" 1410 | } 1411 | }, 1412 | "node_modules/braces": { 1413 | "version": "3.0.2", 1414 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1415 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1416 | "dev": true, 1417 | "dependencies": { 1418 | "fill-range": "^7.0.1" 1419 | }, 1420 | "engines": { 1421 | "node": ">=8" 1422 | } 1423 | }, 1424 | "node_modules/browserslist": { 1425 | "version": "4.21.4", 1426 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 1427 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 1428 | "dev": true, 1429 | "funding": [ 1430 | { 1431 | "type": "opencollective", 1432 | "url": "https://opencollective.com/browserslist" 1433 | }, 1434 | { 1435 | "type": "tidelift", 1436 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1437 | } 1438 | ], 1439 | "peer": true, 1440 | "dependencies": { 1441 | "caniuse-lite": "^1.0.30001400", 1442 | "electron-to-chromium": "^1.4.251", 1443 | "node-releases": "^2.0.6", 1444 | "update-browserslist-db": "^1.0.9" 1445 | }, 1446 | "bin": { 1447 | "browserslist": "cli.js" 1448 | }, 1449 | "engines": { 1450 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1451 | } 1452 | }, 1453 | "node_modules/bs-logger": { 1454 | "version": "0.2.6", 1455 | "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", 1456 | "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", 1457 | "dev": true, 1458 | "dependencies": { 1459 | "fast-json-stable-stringify": "2.x" 1460 | }, 1461 | "engines": { 1462 | "node": ">= 6" 1463 | } 1464 | }, 1465 | "node_modules/bser": { 1466 | "version": "2.1.1", 1467 | "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", 1468 | "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", 1469 | "dev": true, 1470 | "peer": true, 1471 | "dependencies": { 1472 | "node-int64": "^0.4.0" 1473 | } 1474 | }, 1475 | "node_modules/buffer-from": { 1476 | "version": "1.1.2", 1477 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1478 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1479 | "dev": true, 1480 | "peer": true 1481 | }, 1482 | "node_modules/callsites": { 1483 | "version": "3.1.0", 1484 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1485 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1486 | "dev": true, 1487 | "peer": true, 1488 | "engines": { 1489 | "node": ">=6" 1490 | } 1491 | }, 1492 | "node_modules/camelcase": { 1493 | "version": "5.3.1", 1494 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1495 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 1496 | "dev": true, 1497 | "peer": true, 1498 | "engines": { 1499 | "node": ">=6" 1500 | } 1501 | }, 1502 | "node_modules/caniuse-lite": { 1503 | "version": "1.0.30001447", 1504 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001447.tgz", 1505 | "integrity": "sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw==", 1506 | "dev": true, 1507 | "funding": [ 1508 | { 1509 | "type": "opencollective", 1510 | "url": "https://opencollective.com/browserslist" 1511 | }, 1512 | { 1513 | "type": "tidelift", 1514 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1515 | } 1516 | ], 1517 | "peer": true 1518 | }, 1519 | "node_modules/chalk": { 1520 | "version": "4.1.2", 1521 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1522 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1523 | "dev": true, 1524 | "dependencies": { 1525 | "ansi-styles": "^4.1.0", 1526 | "supports-color": "^7.1.0" 1527 | }, 1528 | "engines": { 1529 | "node": ">=10" 1530 | }, 1531 | "funding": { 1532 | "url": "https://github.com/chalk/chalk?sponsor=1" 1533 | } 1534 | }, 1535 | "node_modules/char-regex": { 1536 | "version": "1.0.2", 1537 | "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", 1538 | "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", 1539 | "dev": true, 1540 | "peer": true, 1541 | "engines": { 1542 | "node": ">=10" 1543 | } 1544 | }, 1545 | "node_modules/ci-info": { 1546 | "version": "3.7.1", 1547 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", 1548 | "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", 1549 | "dev": true, 1550 | "funding": [ 1551 | { 1552 | "type": "github", 1553 | "url": "https://github.com/sponsors/sibiraj-s" 1554 | } 1555 | ], 1556 | "engines": { 1557 | "node": ">=8" 1558 | } 1559 | }, 1560 | "node_modules/cjs-module-lexer": { 1561 | "version": "1.2.2", 1562 | "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", 1563 | "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", 1564 | "dev": true, 1565 | "peer": true 1566 | }, 1567 | "node_modules/cliui": { 1568 | "version": "8.0.1", 1569 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1570 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1571 | "dev": true, 1572 | "peer": true, 1573 | "dependencies": { 1574 | "string-width": "^4.2.0", 1575 | "strip-ansi": "^6.0.1", 1576 | "wrap-ansi": "^7.0.0" 1577 | }, 1578 | "engines": { 1579 | "node": ">=12" 1580 | } 1581 | }, 1582 | "node_modules/co": { 1583 | "version": "4.6.0", 1584 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 1585 | "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", 1586 | "dev": true, 1587 | "peer": true, 1588 | "engines": { 1589 | "iojs": ">= 1.0.0", 1590 | "node": ">= 0.12.0" 1591 | } 1592 | }, 1593 | "node_modules/collect-v8-coverage": { 1594 | "version": "1.0.1", 1595 | "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", 1596 | "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", 1597 | "dev": true, 1598 | "peer": true 1599 | }, 1600 | "node_modules/color-convert": { 1601 | "version": "2.0.1", 1602 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1603 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1604 | "dev": true, 1605 | "dependencies": { 1606 | "color-name": "~1.1.4" 1607 | }, 1608 | "engines": { 1609 | "node": ">=7.0.0" 1610 | } 1611 | }, 1612 | "node_modules/color-name": { 1613 | "version": "1.1.4", 1614 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1615 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1616 | "dev": true 1617 | }, 1618 | "node_modules/concat-map": { 1619 | "version": "0.0.1", 1620 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1621 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1622 | "dev": true, 1623 | "peer": true 1624 | }, 1625 | "node_modules/convert-source-map": { 1626 | "version": "2.0.0", 1627 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1628 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1629 | "dev": true, 1630 | "peer": true 1631 | }, 1632 | "node_modules/create-require": { 1633 | "version": "1.1.1", 1634 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1635 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1636 | "dev": true 1637 | }, 1638 | "node_modules/cross-spawn": { 1639 | "version": "7.0.3", 1640 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1641 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1642 | "dev": true, 1643 | "peer": true, 1644 | "dependencies": { 1645 | "path-key": "^3.1.0", 1646 | "shebang-command": "^2.0.0", 1647 | "which": "^2.0.1" 1648 | }, 1649 | "engines": { 1650 | "node": ">= 8" 1651 | } 1652 | }, 1653 | "node_modules/debug": { 1654 | "version": "4.3.4", 1655 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1656 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1657 | "dev": true, 1658 | "peer": true, 1659 | "dependencies": { 1660 | "ms": "2.1.2" 1661 | }, 1662 | "engines": { 1663 | "node": ">=6.0" 1664 | }, 1665 | "peerDependenciesMeta": { 1666 | "supports-color": { 1667 | "optional": true 1668 | } 1669 | } 1670 | }, 1671 | "node_modules/dedent": { 1672 | "version": "0.7.0", 1673 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 1674 | "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", 1675 | "dev": true, 1676 | "peer": true 1677 | }, 1678 | "node_modules/deepmerge": { 1679 | "version": "4.2.2", 1680 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", 1681 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", 1682 | "dev": true, 1683 | "peer": true, 1684 | "engines": { 1685 | "node": ">=0.10.0" 1686 | } 1687 | }, 1688 | "node_modules/detect-newline": { 1689 | "version": "3.1.0", 1690 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", 1691 | "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", 1692 | "dev": true, 1693 | "peer": true, 1694 | "engines": { 1695 | "node": ">=8" 1696 | } 1697 | }, 1698 | "node_modules/diff": { 1699 | "version": "4.0.2", 1700 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1701 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1702 | "dev": true, 1703 | "engines": { 1704 | "node": ">=0.3.1" 1705 | } 1706 | }, 1707 | "node_modules/diff-sequences": { 1708 | "version": "29.3.1", 1709 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", 1710 | "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", 1711 | "dev": true, 1712 | "engines": { 1713 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1714 | } 1715 | }, 1716 | "node_modules/electron-to-chromium": { 1717 | "version": "1.4.284", 1718 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 1719 | "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 1720 | "dev": true, 1721 | "peer": true 1722 | }, 1723 | "node_modules/emittery": { 1724 | "version": "0.13.1", 1725 | "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", 1726 | "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", 1727 | "dev": true, 1728 | "peer": true, 1729 | "engines": { 1730 | "node": ">=12" 1731 | }, 1732 | "funding": { 1733 | "url": "https://github.com/sindresorhus/emittery?sponsor=1" 1734 | } 1735 | }, 1736 | "node_modules/emoji-regex": { 1737 | "version": "8.0.0", 1738 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1739 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1740 | "dev": true, 1741 | "peer": true 1742 | }, 1743 | "node_modules/error-ex": { 1744 | "version": "1.3.2", 1745 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1746 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1747 | "dev": true, 1748 | "peer": true, 1749 | "dependencies": { 1750 | "is-arrayish": "^0.2.1" 1751 | } 1752 | }, 1753 | "node_modules/escalade": { 1754 | "version": "3.1.1", 1755 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1756 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1757 | "dev": true, 1758 | "peer": true, 1759 | "engines": { 1760 | "node": ">=6" 1761 | } 1762 | }, 1763 | "node_modules/escape-string-regexp": { 1764 | "version": "2.0.0", 1765 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1766 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1767 | "dev": true, 1768 | "engines": { 1769 | "node": ">=8" 1770 | } 1771 | }, 1772 | "node_modules/esprima": { 1773 | "version": "4.0.1", 1774 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1775 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1776 | "dev": true, 1777 | "peer": true, 1778 | "bin": { 1779 | "esparse": "bin/esparse.js", 1780 | "esvalidate": "bin/esvalidate.js" 1781 | }, 1782 | "engines": { 1783 | "node": ">=4" 1784 | } 1785 | }, 1786 | "node_modules/execa": { 1787 | "version": "5.1.1", 1788 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1789 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1790 | "dev": true, 1791 | "peer": true, 1792 | "dependencies": { 1793 | "cross-spawn": "^7.0.3", 1794 | "get-stream": "^6.0.0", 1795 | "human-signals": "^2.1.0", 1796 | "is-stream": "^2.0.0", 1797 | "merge-stream": "^2.0.0", 1798 | "npm-run-path": "^4.0.1", 1799 | "onetime": "^5.1.2", 1800 | "signal-exit": "^3.0.3", 1801 | "strip-final-newline": "^2.0.0" 1802 | }, 1803 | "engines": { 1804 | "node": ">=10" 1805 | }, 1806 | "funding": { 1807 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1808 | } 1809 | }, 1810 | "node_modules/exit": { 1811 | "version": "0.1.2", 1812 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 1813 | "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", 1814 | "dev": true, 1815 | "peer": true, 1816 | "engines": { 1817 | "node": ">= 0.8.0" 1818 | } 1819 | }, 1820 | "node_modules/expect": { 1821 | "version": "29.3.1", 1822 | "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", 1823 | "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", 1824 | "dev": true, 1825 | "dependencies": { 1826 | "@jest/expect-utils": "^29.3.1", 1827 | "jest-get-type": "^29.2.0", 1828 | "jest-matcher-utils": "^29.3.1", 1829 | "jest-message-util": "^29.3.1", 1830 | "jest-util": "^29.3.1" 1831 | }, 1832 | "engines": { 1833 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1834 | } 1835 | }, 1836 | "node_modules/fast-json-stable-stringify": { 1837 | "version": "2.1.0", 1838 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1839 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1840 | "dev": true 1841 | }, 1842 | "node_modules/fb-watchman": { 1843 | "version": "2.0.2", 1844 | "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", 1845 | "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", 1846 | "dev": true, 1847 | "peer": true, 1848 | "dependencies": { 1849 | "bser": "2.1.1" 1850 | } 1851 | }, 1852 | "node_modules/fill-range": { 1853 | "version": "7.0.1", 1854 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1855 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1856 | "dev": true, 1857 | "dependencies": { 1858 | "to-regex-range": "^5.0.1" 1859 | }, 1860 | "engines": { 1861 | "node": ">=8" 1862 | } 1863 | }, 1864 | "node_modules/find-up": { 1865 | "version": "4.1.0", 1866 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1867 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1868 | "dev": true, 1869 | "peer": true, 1870 | "dependencies": { 1871 | "locate-path": "^5.0.0", 1872 | "path-exists": "^4.0.0" 1873 | }, 1874 | "engines": { 1875 | "node": ">=8" 1876 | } 1877 | }, 1878 | "node_modules/fp-ts": { 1879 | "version": "2.13.1", 1880 | "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.13.1.tgz", 1881 | "integrity": "sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==" 1882 | }, 1883 | "node_modules/fs.realpath": { 1884 | "version": "1.0.0", 1885 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1886 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1887 | "dev": true, 1888 | "peer": true 1889 | }, 1890 | "node_modules/fsevents": { 1891 | "version": "2.3.2", 1892 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1893 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1894 | "dev": true, 1895 | "hasInstallScript": true, 1896 | "optional": true, 1897 | "os": [ 1898 | "darwin" 1899 | ], 1900 | "peer": true, 1901 | "engines": { 1902 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1903 | } 1904 | }, 1905 | "node_modules/function-bind": { 1906 | "version": "1.1.1", 1907 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1908 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1909 | "dev": true, 1910 | "peer": true 1911 | }, 1912 | "node_modules/gensync": { 1913 | "version": "1.0.0-beta.2", 1914 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1915 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1916 | "dev": true, 1917 | "peer": true, 1918 | "engines": { 1919 | "node": ">=6.9.0" 1920 | } 1921 | }, 1922 | "node_modules/get-caller-file": { 1923 | "version": "2.0.5", 1924 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1925 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1926 | "dev": true, 1927 | "peer": true, 1928 | "engines": { 1929 | "node": "6.* || 8.* || >= 10.*" 1930 | } 1931 | }, 1932 | "node_modules/get-package-type": { 1933 | "version": "0.1.0", 1934 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 1935 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 1936 | "dev": true, 1937 | "peer": true, 1938 | "engines": { 1939 | "node": ">=8.0.0" 1940 | } 1941 | }, 1942 | "node_modules/get-stream": { 1943 | "version": "6.0.1", 1944 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1945 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1946 | "dev": true, 1947 | "peer": true, 1948 | "engines": { 1949 | "node": ">=10" 1950 | }, 1951 | "funding": { 1952 | "url": "https://github.com/sponsors/sindresorhus" 1953 | } 1954 | }, 1955 | "node_modules/glob": { 1956 | "version": "7.2.3", 1957 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1958 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1959 | "dev": true, 1960 | "peer": true, 1961 | "dependencies": { 1962 | "fs.realpath": "^1.0.0", 1963 | "inflight": "^1.0.4", 1964 | "inherits": "2", 1965 | "minimatch": "^3.1.1", 1966 | "once": "^1.3.0", 1967 | "path-is-absolute": "^1.0.0" 1968 | }, 1969 | "engines": { 1970 | "node": "*" 1971 | }, 1972 | "funding": { 1973 | "url": "https://github.com/sponsors/isaacs" 1974 | } 1975 | }, 1976 | "node_modules/globals": { 1977 | "version": "11.12.0", 1978 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1979 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1980 | "dev": true, 1981 | "peer": true, 1982 | "engines": { 1983 | "node": ">=4" 1984 | } 1985 | }, 1986 | "node_modules/graceful-fs": { 1987 | "version": "4.2.10", 1988 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1989 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 1990 | "dev": true 1991 | }, 1992 | "node_modules/has": { 1993 | "version": "1.0.3", 1994 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1995 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1996 | "dev": true, 1997 | "peer": true, 1998 | "dependencies": { 1999 | "function-bind": "^1.1.1" 2000 | }, 2001 | "engines": { 2002 | "node": ">= 0.4.0" 2003 | } 2004 | }, 2005 | "node_modules/has-flag": { 2006 | "version": "4.0.0", 2007 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2008 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2009 | "dev": true, 2010 | "engines": { 2011 | "node": ">=8" 2012 | } 2013 | }, 2014 | "node_modules/html-escaper": { 2015 | "version": "2.0.2", 2016 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 2017 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 2018 | "dev": true, 2019 | "peer": true 2020 | }, 2021 | "node_modules/human-signals": { 2022 | "version": "2.1.0", 2023 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 2024 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 2025 | "dev": true, 2026 | "peer": true, 2027 | "engines": { 2028 | "node": ">=10.17.0" 2029 | } 2030 | }, 2031 | "node_modules/import-local": { 2032 | "version": "3.1.0", 2033 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 2034 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 2035 | "dev": true, 2036 | "peer": true, 2037 | "dependencies": { 2038 | "pkg-dir": "^4.2.0", 2039 | "resolve-cwd": "^3.0.0" 2040 | }, 2041 | "bin": { 2042 | "import-local-fixture": "fixtures/cli.js" 2043 | }, 2044 | "engines": { 2045 | "node": ">=8" 2046 | }, 2047 | "funding": { 2048 | "url": "https://github.com/sponsors/sindresorhus" 2049 | } 2050 | }, 2051 | "node_modules/imurmurhash": { 2052 | "version": "0.1.4", 2053 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2054 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2055 | "dev": true, 2056 | "peer": true, 2057 | "engines": { 2058 | "node": ">=0.8.19" 2059 | } 2060 | }, 2061 | "node_modules/inflight": { 2062 | "version": "1.0.6", 2063 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2064 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2065 | "dev": true, 2066 | "peer": true, 2067 | "dependencies": { 2068 | "once": "^1.3.0", 2069 | "wrappy": "1" 2070 | } 2071 | }, 2072 | "node_modules/inherits": { 2073 | "version": "2.0.4", 2074 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2075 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2076 | "dev": true, 2077 | "peer": true 2078 | }, 2079 | "node_modules/is-arrayish": { 2080 | "version": "0.2.1", 2081 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2082 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 2083 | "dev": true, 2084 | "peer": true 2085 | }, 2086 | "node_modules/is-core-module": { 2087 | "version": "2.11.0", 2088 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2089 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2090 | "dev": true, 2091 | "peer": true, 2092 | "dependencies": { 2093 | "has": "^1.0.3" 2094 | }, 2095 | "funding": { 2096 | "url": "https://github.com/sponsors/ljharb" 2097 | } 2098 | }, 2099 | "node_modules/is-fullwidth-code-point": { 2100 | "version": "3.0.0", 2101 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2102 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2103 | "dev": true, 2104 | "peer": true, 2105 | "engines": { 2106 | "node": ">=8" 2107 | } 2108 | }, 2109 | "node_modules/is-generator-fn": { 2110 | "version": "2.1.0", 2111 | "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", 2112 | "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", 2113 | "dev": true, 2114 | "peer": true, 2115 | "engines": { 2116 | "node": ">=6" 2117 | } 2118 | }, 2119 | "node_modules/is-number": { 2120 | "version": "7.0.0", 2121 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2122 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2123 | "dev": true, 2124 | "engines": { 2125 | "node": ">=0.12.0" 2126 | } 2127 | }, 2128 | "node_modules/is-stream": { 2129 | "version": "2.0.1", 2130 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 2131 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 2132 | "dev": true, 2133 | "peer": true, 2134 | "engines": { 2135 | "node": ">=8" 2136 | }, 2137 | "funding": { 2138 | "url": "https://github.com/sponsors/sindresorhus" 2139 | } 2140 | }, 2141 | "node_modules/isexe": { 2142 | "version": "2.0.0", 2143 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2144 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2145 | "dev": true, 2146 | "peer": true 2147 | }, 2148 | "node_modules/istanbul-lib-coverage": { 2149 | "version": "3.2.0", 2150 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 2151 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 2152 | "dev": true, 2153 | "peer": true, 2154 | "engines": { 2155 | "node": ">=8" 2156 | } 2157 | }, 2158 | "node_modules/istanbul-lib-instrument": { 2159 | "version": "5.2.1", 2160 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", 2161 | "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", 2162 | "dev": true, 2163 | "peer": true, 2164 | "dependencies": { 2165 | "@babel/core": "^7.12.3", 2166 | "@babel/parser": "^7.14.7", 2167 | "@istanbuljs/schema": "^0.1.2", 2168 | "istanbul-lib-coverage": "^3.2.0", 2169 | "semver": "^6.3.0" 2170 | }, 2171 | "engines": { 2172 | "node": ">=8" 2173 | } 2174 | }, 2175 | "node_modules/istanbul-lib-report": { 2176 | "version": "3.0.0", 2177 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 2178 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 2179 | "dev": true, 2180 | "peer": true, 2181 | "dependencies": { 2182 | "istanbul-lib-coverage": "^3.0.0", 2183 | "make-dir": "^3.0.0", 2184 | "supports-color": "^7.1.0" 2185 | }, 2186 | "engines": { 2187 | "node": ">=8" 2188 | } 2189 | }, 2190 | "node_modules/istanbul-lib-source-maps": { 2191 | "version": "4.0.1", 2192 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", 2193 | "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", 2194 | "dev": true, 2195 | "peer": true, 2196 | "dependencies": { 2197 | "debug": "^4.1.1", 2198 | "istanbul-lib-coverage": "^3.0.0", 2199 | "source-map": "^0.6.1" 2200 | }, 2201 | "engines": { 2202 | "node": ">=10" 2203 | } 2204 | }, 2205 | "node_modules/istanbul-reports": { 2206 | "version": "3.1.5", 2207 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 2208 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 2209 | "dev": true, 2210 | "peer": true, 2211 | "dependencies": { 2212 | "html-escaper": "^2.0.0", 2213 | "istanbul-lib-report": "^3.0.0" 2214 | }, 2215 | "engines": { 2216 | "node": ">=8" 2217 | } 2218 | }, 2219 | "node_modules/jest": { 2220 | "version": "29.3.1", 2221 | "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", 2222 | "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", 2223 | "dev": true, 2224 | "peer": true, 2225 | "dependencies": { 2226 | "@jest/core": "^29.3.1", 2227 | "@jest/types": "^29.3.1", 2228 | "import-local": "^3.0.2", 2229 | "jest-cli": "^29.3.1" 2230 | }, 2231 | "bin": { 2232 | "jest": "bin/jest.js" 2233 | }, 2234 | "engines": { 2235 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2236 | }, 2237 | "peerDependencies": { 2238 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2239 | }, 2240 | "peerDependenciesMeta": { 2241 | "node-notifier": { 2242 | "optional": true 2243 | } 2244 | } 2245 | }, 2246 | "node_modules/jest-changed-files": { 2247 | "version": "29.2.0", 2248 | "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", 2249 | "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", 2250 | "dev": true, 2251 | "peer": true, 2252 | "dependencies": { 2253 | "execa": "^5.0.0", 2254 | "p-limit": "^3.1.0" 2255 | }, 2256 | "engines": { 2257 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2258 | } 2259 | }, 2260 | "node_modules/jest-circus": { 2261 | "version": "29.3.1", 2262 | "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", 2263 | "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", 2264 | "dev": true, 2265 | "peer": true, 2266 | "dependencies": { 2267 | "@jest/environment": "^29.3.1", 2268 | "@jest/expect": "^29.3.1", 2269 | "@jest/test-result": "^29.3.1", 2270 | "@jest/types": "^29.3.1", 2271 | "@types/node": "*", 2272 | "chalk": "^4.0.0", 2273 | "co": "^4.6.0", 2274 | "dedent": "^0.7.0", 2275 | "is-generator-fn": "^2.0.0", 2276 | "jest-each": "^29.3.1", 2277 | "jest-matcher-utils": "^29.3.1", 2278 | "jest-message-util": "^29.3.1", 2279 | "jest-runtime": "^29.3.1", 2280 | "jest-snapshot": "^29.3.1", 2281 | "jest-util": "^29.3.1", 2282 | "p-limit": "^3.1.0", 2283 | "pretty-format": "^29.3.1", 2284 | "slash": "^3.0.0", 2285 | "stack-utils": "^2.0.3" 2286 | }, 2287 | "engines": { 2288 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2289 | } 2290 | }, 2291 | "node_modules/jest-cli": { 2292 | "version": "29.3.1", 2293 | "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", 2294 | "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", 2295 | "dev": true, 2296 | "peer": true, 2297 | "dependencies": { 2298 | "@jest/core": "^29.3.1", 2299 | "@jest/test-result": "^29.3.1", 2300 | "@jest/types": "^29.3.1", 2301 | "chalk": "^4.0.0", 2302 | "exit": "^0.1.2", 2303 | "graceful-fs": "^4.2.9", 2304 | "import-local": "^3.0.2", 2305 | "jest-config": "^29.3.1", 2306 | "jest-util": "^29.3.1", 2307 | "jest-validate": "^29.3.1", 2308 | "prompts": "^2.0.1", 2309 | "yargs": "^17.3.1" 2310 | }, 2311 | "bin": { 2312 | "jest": "bin/jest.js" 2313 | }, 2314 | "engines": { 2315 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2316 | }, 2317 | "peerDependencies": { 2318 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2319 | }, 2320 | "peerDependenciesMeta": { 2321 | "node-notifier": { 2322 | "optional": true 2323 | } 2324 | } 2325 | }, 2326 | "node_modules/jest-config": { 2327 | "version": "29.3.1", 2328 | "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", 2329 | "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", 2330 | "dev": true, 2331 | "peer": true, 2332 | "dependencies": { 2333 | "@babel/core": "^7.11.6", 2334 | "@jest/test-sequencer": "^29.3.1", 2335 | "@jest/types": "^29.3.1", 2336 | "babel-jest": "^29.3.1", 2337 | "chalk": "^4.0.0", 2338 | "ci-info": "^3.2.0", 2339 | "deepmerge": "^4.2.2", 2340 | "glob": "^7.1.3", 2341 | "graceful-fs": "^4.2.9", 2342 | "jest-circus": "^29.3.1", 2343 | "jest-environment-node": "^29.3.1", 2344 | "jest-get-type": "^29.2.0", 2345 | "jest-regex-util": "^29.2.0", 2346 | "jest-resolve": "^29.3.1", 2347 | "jest-runner": "^29.3.1", 2348 | "jest-util": "^29.3.1", 2349 | "jest-validate": "^29.3.1", 2350 | "micromatch": "^4.0.4", 2351 | "parse-json": "^5.2.0", 2352 | "pretty-format": "^29.3.1", 2353 | "slash": "^3.0.0", 2354 | "strip-json-comments": "^3.1.1" 2355 | }, 2356 | "engines": { 2357 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2358 | }, 2359 | "peerDependencies": { 2360 | "@types/node": "*", 2361 | "ts-node": ">=9.0.0" 2362 | }, 2363 | "peerDependenciesMeta": { 2364 | "@types/node": { 2365 | "optional": true 2366 | }, 2367 | "ts-node": { 2368 | "optional": true 2369 | } 2370 | } 2371 | }, 2372 | "node_modules/jest-diff": { 2373 | "version": "29.3.1", 2374 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", 2375 | "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", 2376 | "dev": true, 2377 | "dependencies": { 2378 | "chalk": "^4.0.0", 2379 | "diff-sequences": "^29.3.1", 2380 | "jest-get-type": "^29.2.0", 2381 | "pretty-format": "^29.3.1" 2382 | }, 2383 | "engines": { 2384 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2385 | } 2386 | }, 2387 | "node_modules/jest-docblock": { 2388 | "version": "29.2.0", 2389 | "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", 2390 | "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", 2391 | "dev": true, 2392 | "peer": true, 2393 | "dependencies": { 2394 | "detect-newline": "^3.0.0" 2395 | }, 2396 | "engines": { 2397 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2398 | } 2399 | }, 2400 | "node_modules/jest-each": { 2401 | "version": "29.3.1", 2402 | "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", 2403 | "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", 2404 | "dev": true, 2405 | "peer": true, 2406 | "dependencies": { 2407 | "@jest/types": "^29.3.1", 2408 | "chalk": "^4.0.0", 2409 | "jest-get-type": "^29.2.0", 2410 | "jest-util": "^29.3.1", 2411 | "pretty-format": "^29.3.1" 2412 | }, 2413 | "engines": { 2414 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2415 | } 2416 | }, 2417 | "node_modules/jest-environment-node": { 2418 | "version": "29.3.1", 2419 | "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", 2420 | "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", 2421 | "dev": true, 2422 | "peer": true, 2423 | "dependencies": { 2424 | "@jest/environment": "^29.3.1", 2425 | "@jest/fake-timers": "^29.3.1", 2426 | "@jest/types": "^29.3.1", 2427 | "@types/node": "*", 2428 | "jest-mock": "^29.3.1", 2429 | "jest-util": "^29.3.1" 2430 | }, 2431 | "engines": { 2432 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2433 | } 2434 | }, 2435 | "node_modules/jest-get-type": { 2436 | "version": "29.2.0", 2437 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", 2438 | "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", 2439 | "dev": true, 2440 | "engines": { 2441 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2442 | } 2443 | }, 2444 | "node_modules/jest-haste-map": { 2445 | "version": "29.3.1", 2446 | "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", 2447 | "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", 2448 | "dev": true, 2449 | "peer": true, 2450 | "dependencies": { 2451 | "@jest/types": "^29.3.1", 2452 | "@types/graceful-fs": "^4.1.3", 2453 | "@types/node": "*", 2454 | "anymatch": "^3.0.3", 2455 | "fb-watchman": "^2.0.0", 2456 | "graceful-fs": "^4.2.9", 2457 | "jest-regex-util": "^29.2.0", 2458 | "jest-util": "^29.3.1", 2459 | "jest-worker": "^29.3.1", 2460 | "micromatch": "^4.0.4", 2461 | "walker": "^1.0.8" 2462 | }, 2463 | "engines": { 2464 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2465 | }, 2466 | "optionalDependencies": { 2467 | "fsevents": "^2.3.2" 2468 | } 2469 | }, 2470 | "node_modules/jest-leak-detector": { 2471 | "version": "29.3.1", 2472 | "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", 2473 | "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", 2474 | "dev": true, 2475 | "peer": true, 2476 | "dependencies": { 2477 | "jest-get-type": "^29.2.0", 2478 | "pretty-format": "^29.3.1" 2479 | }, 2480 | "engines": { 2481 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2482 | } 2483 | }, 2484 | "node_modules/jest-matcher-utils": { 2485 | "version": "29.3.1", 2486 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", 2487 | "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", 2488 | "dev": true, 2489 | "dependencies": { 2490 | "chalk": "^4.0.0", 2491 | "jest-diff": "^29.3.1", 2492 | "jest-get-type": "^29.2.0", 2493 | "pretty-format": "^29.3.1" 2494 | }, 2495 | "engines": { 2496 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2497 | } 2498 | }, 2499 | "node_modules/jest-message-util": { 2500 | "version": "29.3.1", 2501 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", 2502 | "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", 2503 | "dev": true, 2504 | "dependencies": { 2505 | "@babel/code-frame": "^7.12.13", 2506 | "@jest/types": "^29.3.1", 2507 | "@types/stack-utils": "^2.0.0", 2508 | "chalk": "^4.0.0", 2509 | "graceful-fs": "^4.2.9", 2510 | "micromatch": "^4.0.4", 2511 | "pretty-format": "^29.3.1", 2512 | "slash": "^3.0.0", 2513 | "stack-utils": "^2.0.3" 2514 | }, 2515 | "engines": { 2516 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2517 | } 2518 | }, 2519 | "node_modules/jest-mock": { 2520 | "version": "29.3.1", 2521 | "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", 2522 | "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", 2523 | "dev": true, 2524 | "peer": true, 2525 | "dependencies": { 2526 | "@jest/types": "^29.3.1", 2527 | "@types/node": "*", 2528 | "jest-util": "^29.3.1" 2529 | }, 2530 | "engines": { 2531 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2532 | } 2533 | }, 2534 | "node_modules/jest-pnp-resolver": { 2535 | "version": "1.2.3", 2536 | "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", 2537 | "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", 2538 | "dev": true, 2539 | "peer": true, 2540 | "engines": { 2541 | "node": ">=6" 2542 | }, 2543 | "peerDependencies": { 2544 | "jest-resolve": "*" 2545 | }, 2546 | "peerDependenciesMeta": { 2547 | "jest-resolve": { 2548 | "optional": true 2549 | } 2550 | } 2551 | }, 2552 | "node_modules/jest-regex-util": { 2553 | "version": "29.2.0", 2554 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", 2555 | "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", 2556 | "dev": true, 2557 | "peer": true, 2558 | "engines": { 2559 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2560 | } 2561 | }, 2562 | "node_modules/jest-resolve": { 2563 | "version": "29.3.1", 2564 | "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", 2565 | "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", 2566 | "dev": true, 2567 | "peer": true, 2568 | "dependencies": { 2569 | "chalk": "^4.0.0", 2570 | "graceful-fs": "^4.2.9", 2571 | "jest-haste-map": "^29.3.1", 2572 | "jest-pnp-resolver": "^1.2.2", 2573 | "jest-util": "^29.3.1", 2574 | "jest-validate": "^29.3.1", 2575 | "resolve": "^1.20.0", 2576 | "resolve.exports": "^1.1.0", 2577 | "slash": "^3.0.0" 2578 | }, 2579 | "engines": { 2580 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2581 | } 2582 | }, 2583 | "node_modules/jest-resolve-dependencies": { 2584 | "version": "29.3.1", 2585 | "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", 2586 | "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", 2587 | "dev": true, 2588 | "peer": true, 2589 | "dependencies": { 2590 | "jest-regex-util": "^29.2.0", 2591 | "jest-snapshot": "^29.3.1" 2592 | }, 2593 | "engines": { 2594 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2595 | } 2596 | }, 2597 | "node_modules/jest-runner": { 2598 | "version": "29.3.1", 2599 | "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", 2600 | "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", 2601 | "dev": true, 2602 | "peer": true, 2603 | "dependencies": { 2604 | "@jest/console": "^29.3.1", 2605 | "@jest/environment": "^29.3.1", 2606 | "@jest/test-result": "^29.3.1", 2607 | "@jest/transform": "^29.3.1", 2608 | "@jest/types": "^29.3.1", 2609 | "@types/node": "*", 2610 | "chalk": "^4.0.0", 2611 | "emittery": "^0.13.1", 2612 | "graceful-fs": "^4.2.9", 2613 | "jest-docblock": "^29.2.0", 2614 | "jest-environment-node": "^29.3.1", 2615 | "jest-haste-map": "^29.3.1", 2616 | "jest-leak-detector": "^29.3.1", 2617 | "jest-message-util": "^29.3.1", 2618 | "jest-resolve": "^29.3.1", 2619 | "jest-runtime": "^29.3.1", 2620 | "jest-util": "^29.3.1", 2621 | "jest-watcher": "^29.3.1", 2622 | "jest-worker": "^29.3.1", 2623 | "p-limit": "^3.1.0", 2624 | "source-map-support": "0.5.13" 2625 | }, 2626 | "engines": { 2627 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2628 | } 2629 | }, 2630 | "node_modules/jest-runtime": { 2631 | "version": "29.3.1", 2632 | "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", 2633 | "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", 2634 | "dev": true, 2635 | "peer": true, 2636 | "dependencies": { 2637 | "@jest/environment": "^29.3.1", 2638 | "@jest/fake-timers": "^29.3.1", 2639 | "@jest/globals": "^29.3.1", 2640 | "@jest/source-map": "^29.2.0", 2641 | "@jest/test-result": "^29.3.1", 2642 | "@jest/transform": "^29.3.1", 2643 | "@jest/types": "^29.3.1", 2644 | "@types/node": "*", 2645 | "chalk": "^4.0.0", 2646 | "cjs-module-lexer": "^1.0.0", 2647 | "collect-v8-coverage": "^1.0.0", 2648 | "glob": "^7.1.3", 2649 | "graceful-fs": "^4.2.9", 2650 | "jest-haste-map": "^29.3.1", 2651 | "jest-message-util": "^29.3.1", 2652 | "jest-mock": "^29.3.1", 2653 | "jest-regex-util": "^29.2.0", 2654 | "jest-resolve": "^29.3.1", 2655 | "jest-snapshot": "^29.3.1", 2656 | "jest-util": "^29.3.1", 2657 | "slash": "^3.0.0", 2658 | "strip-bom": "^4.0.0" 2659 | }, 2660 | "engines": { 2661 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2662 | } 2663 | }, 2664 | "node_modules/jest-snapshot": { 2665 | "version": "29.3.1", 2666 | "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", 2667 | "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", 2668 | "dev": true, 2669 | "peer": true, 2670 | "dependencies": { 2671 | "@babel/core": "^7.11.6", 2672 | "@babel/generator": "^7.7.2", 2673 | "@babel/plugin-syntax-jsx": "^7.7.2", 2674 | "@babel/plugin-syntax-typescript": "^7.7.2", 2675 | "@babel/traverse": "^7.7.2", 2676 | "@babel/types": "^7.3.3", 2677 | "@jest/expect-utils": "^29.3.1", 2678 | "@jest/transform": "^29.3.1", 2679 | "@jest/types": "^29.3.1", 2680 | "@types/babel__traverse": "^7.0.6", 2681 | "@types/prettier": "^2.1.5", 2682 | "babel-preset-current-node-syntax": "^1.0.0", 2683 | "chalk": "^4.0.0", 2684 | "expect": "^29.3.1", 2685 | "graceful-fs": "^4.2.9", 2686 | "jest-diff": "^29.3.1", 2687 | "jest-get-type": "^29.2.0", 2688 | "jest-haste-map": "^29.3.1", 2689 | "jest-matcher-utils": "^29.3.1", 2690 | "jest-message-util": "^29.3.1", 2691 | "jest-util": "^29.3.1", 2692 | "natural-compare": "^1.4.0", 2693 | "pretty-format": "^29.3.1", 2694 | "semver": "^7.3.5" 2695 | }, 2696 | "engines": { 2697 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2698 | } 2699 | }, 2700 | "node_modules/jest-snapshot/node_modules/lru-cache": { 2701 | "version": "6.0.0", 2702 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2703 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2704 | "dev": true, 2705 | "peer": true, 2706 | "dependencies": { 2707 | "yallist": "^4.0.0" 2708 | }, 2709 | "engines": { 2710 | "node": ">=10" 2711 | } 2712 | }, 2713 | "node_modules/jest-snapshot/node_modules/semver": { 2714 | "version": "7.3.8", 2715 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 2716 | "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 2717 | "dev": true, 2718 | "peer": true, 2719 | "dependencies": { 2720 | "lru-cache": "^6.0.0" 2721 | }, 2722 | "bin": { 2723 | "semver": "bin/semver.js" 2724 | }, 2725 | "engines": { 2726 | "node": ">=10" 2727 | } 2728 | }, 2729 | "node_modules/jest-snapshot/node_modules/yallist": { 2730 | "version": "4.0.0", 2731 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2732 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2733 | "dev": true, 2734 | "peer": true 2735 | }, 2736 | "node_modules/jest-util": { 2737 | "version": "29.3.1", 2738 | "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", 2739 | "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", 2740 | "dev": true, 2741 | "dependencies": { 2742 | "@jest/types": "^29.3.1", 2743 | "@types/node": "*", 2744 | "chalk": "^4.0.0", 2745 | "ci-info": "^3.2.0", 2746 | "graceful-fs": "^4.2.9", 2747 | "picomatch": "^2.2.3" 2748 | }, 2749 | "engines": { 2750 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2751 | } 2752 | }, 2753 | "node_modules/jest-validate": { 2754 | "version": "29.3.1", 2755 | "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", 2756 | "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", 2757 | "dev": true, 2758 | "peer": true, 2759 | "dependencies": { 2760 | "@jest/types": "^29.3.1", 2761 | "camelcase": "^6.2.0", 2762 | "chalk": "^4.0.0", 2763 | "jest-get-type": "^29.2.0", 2764 | "leven": "^3.1.0", 2765 | "pretty-format": "^29.3.1" 2766 | }, 2767 | "engines": { 2768 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2769 | } 2770 | }, 2771 | "node_modules/jest-validate/node_modules/camelcase": { 2772 | "version": "6.3.0", 2773 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2774 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2775 | "dev": true, 2776 | "peer": true, 2777 | "engines": { 2778 | "node": ">=10" 2779 | }, 2780 | "funding": { 2781 | "url": "https://github.com/sponsors/sindresorhus" 2782 | } 2783 | }, 2784 | "node_modules/jest-watcher": { 2785 | "version": "29.3.1", 2786 | "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", 2787 | "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", 2788 | "dev": true, 2789 | "peer": true, 2790 | "dependencies": { 2791 | "@jest/test-result": "^29.3.1", 2792 | "@jest/types": "^29.3.1", 2793 | "@types/node": "*", 2794 | "ansi-escapes": "^4.2.1", 2795 | "chalk": "^4.0.0", 2796 | "emittery": "^0.13.1", 2797 | "jest-util": "^29.3.1", 2798 | "string-length": "^4.0.1" 2799 | }, 2800 | "engines": { 2801 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2802 | } 2803 | }, 2804 | "node_modules/jest-worker": { 2805 | "version": "29.3.1", 2806 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", 2807 | "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", 2808 | "dev": true, 2809 | "peer": true, 2810 | "dependencies": { 2811 | "@types/node": "*", 2812 | "jest-util": "^29.3.1", 2813 | "merge-stream": "^2.0.0", 2814 | "supports-color": "^8.0.0" 2815 | }, 2816 | "engines": { 2817 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2818 | } 2819 | }, 2820 | "node_modules/jest-worker/node_modules/supports-color": { 2821 | "version": "8.1.1", 2822 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2823 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2824 | "dev": true, 2825 | "peer": true, 2826 | "dependencies": { 2827 | "has-flag": "^4.0.0" 2828 | }, 2829 | "engines": { 2830 | "node": ">=10" 2831 | }, 2832 | "funding": { 2833 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2834 | } 2835 | }, 2836 | "node_modules/js-tokens": { 2837 | "version": "4.0.0", 2838 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2839 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2840 | "dev": true 2841 | }, 2842 | "node_modules/js-yaml": { 2843 | "version": "3.14.1", 2844 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2845 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2846 | "dev": true, 2847 | "peer": true, 2848 | "dependencies": { 2849 | "argparse": "^1.0.7", 2850 | "esprima": "^4.0.0" 2851 | }, 2852 | "bin": { 2853 | "js-yaml": "bin/js-yaml.js" 2854 | } 2855 | }, 2856 | "node_modules/jsesc": { 2857 | "version": "2.5.2", 2858 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2859 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2860 | "dev": true, 2861 | "peer": true, 2862 | "bin": { 2863 | "jsesc": "bin/jsesc" 2864 | }, 2865 | "engines": { 2866 | "node": ">=4" 2867 | } 2868 | }, 2869 | "node_modules/json-parse-even-better-errors": { 2870 | "version": "2.3.1", 2871 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2872 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2873 | "dev": true, 2874 | "peer": true 2875 | }, 2876 | "node_modules/json5": { 2877 | "version": "2.2.3", 2878 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2879 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2880 | "dev": true, 2881 | "bin": { 2882 | "json5": "lib/cli.js" 2883 | }, 2884 | "engines": { 2885 | "node": ">=6" 2886 | } 2887 | }, 2888 | "node_modules/kleur": { 2889 | "version": "3.0.3", 2890 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 2891 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 2892 | "dev": true, 2893 | "peer": true, 2894 | "engines": { 2895 | "node": ">=6" 2896 | } 2897 | }, 2898 | "node_modules/leven": { 2899 | "version": "3.1.0", 2900 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 2901 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 2902 | "dev": true, 2903 | "peer": true, 2904 | "engines": { 2905 | "node": ">=6" 2906 | } 2907 | }, 2908 | "node_modules/lines-and-columns": { 2909 | "version": "1.2.4", 2910 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2911 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2912 | "dev": true, 2913 | "peer": true 2914 | }, 2915 | "node_modules/locate-path": { 2916 | "version": "5.0.0", 2917 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2918 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2919 | "dev": true, 2920 | "peer": true, 2921 | "dependencies": { 2922 | "p-locate": "^4.1.0" 2923 | }, 2924 | "engines": { 2925 | "node": ">=8" 2926 | } 2927 | }, 2928 | "node_modules/lodash.memoize": { 2929 | "version": "4.1.2", 2930 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", 2931 | "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", 2932 | "dev": true 2933 | }, 2934 | "node_modules/lru-cache": { 2935 | "version": "5.1.1", 2936 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2937 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2938 | "dev": true, 2939 | "peer": true, 2940 | "dependencies": { 2941 | "yallist": "^3.0.2" 2942 | } 2943 | }, 2944 | "node_modules/make-dir": { 2945 | "version": "3.1.0", 2946 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2947 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2948 | "dev": true, 2949 | "peer": true, 2950 | "dependencies": { 2951 | "semver": "^6.0.0" 2952 | }, 2953 | "engines": { 2954 | "node": ">=8" 2955 | }, 2956 | "funding": { 2957 | "url": "https://github.com/sponsors/sindresorhus" 2958 | } 2959 | }, 2960 | "node_modules/make-error": { 2961 | "version": "1.3.6", 2962 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2963 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2964 | "dev": true 2965 | }, 2966 | "node_modules/makeerror": { 2967 | "version": "1.0.12", 2968 | "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", 2969 | "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", 2970 | "dev": true, 2971 | "peer": true, 2972 | "dependencies": { 2973 | "tmpl": "1.0.5" 2974 | } 2975 | }, 2976 | "node_modules/merge-stream": { 2977 | "version": "2.0.0", 2978 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2979 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2980 | "dev": true, 2981 | "peer": true 2982 | }, 2983 | "node_modules/micromatch": { 2984 | "version": "4.0.5", 2985 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2986 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2987 | "dev": true, 2988 | "dependencies": { 2989 | "braces": "^3.0.2", 2990 | "picomatch": "^2.3.1" 2991 | }, 2992 | "engines": { 2993 | "node": ">=8.6" 2994 | } 2995 | }, 2996 | "node_modules/mimic-fn": { 2997 | "version": "2.1.0", 2998 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2999 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 3000 | "dev": true, 3001 | "peer": true, 3002 | "engines": { 3003 | "node": ">=6" 3004 | } 3005 | }, 3006 | "node_modules/minimatch": { 3007 | "version": "3.1.2", 3008 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3009 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3010 | "dev": true, 3011 | "peer": true, 3012 | "dependencies": { 3013 | "brace-expansion": "^1.1.7" 3014 | }, 3015 | "engines": { 3016 | "node": "*" 3017 | } 3018 | }, 3019 | "node_modules/ms": { 3020 | "version": "2.1.2", 3021 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3022 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 3023 | "dev": true, 3024 | "peer": true 3025 | }, 3026 | "node_modules/natural-compare": { 3027 | "version": "1.4.0", 3028 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3029 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 3030 | "dev": true, 3031 | "peer": true 3032 | }, 3033 | "node_modules/node-int64": { 3034 | "version": "0.4.0", 3035 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 3036 | "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", 3037 | "dev": true, 3038 | "peer": true 3039 | }, 3040 | "node_modules/node-releases": { 3041 | "version": "2.0.8", 3042 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", 3043 | "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", 3044 | "dev": true, 3045 | "peer": true 3046 | }, 3047 | "node_modules/normalize-path": { 3048 | "version": "3.0.0", 3049 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 3050 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 3051 | "dev": true, 3052 | "peer": true, 3053 | "engines": { 3054 | "node": ">=0.10.0" 3055 | } 3056 | }, 3057 | "node_modules/npm-run-path": { 3058 | "version": "4.0.1", 3059 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 3060 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 3061 | "dev": true, 3062 | "peer": true, 3063 | "dependencies": { 3064 | "path-key": "^3.0.0" 3065 | }, 3066 | "engines": { 3067 | "node": ">=8" 3068 | } 3069 | }, 3070 | "node_modules/once": { 3071 | "version": "1.4.0", 3072 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3073 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 3074 | "dev": true, 3075 | "peer": true, 3076 | "dependencies": { 3077 | "wrappy": "1" 3078 | } 3079 | }, 3080 | "node_modules/onetime": { 3081 | "version": "5.1.2", 3082 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 3083 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 3084 | "dev": true, 3085 | "peer": true, 3086 | "dependencies": { 3087 | "mimic-fn": "^2.1.0" 3088 | }, 3089 | "engines": { 3090 | "node": ">=6" 3091 | }, 3092 | "funding": { 3093 | "url": "https://github.com/sponsors/sindresorhus" 3094 | } 3095 | }, 3096 | "node_modules/p-limit": { 3097 | "version": "3.1.0", 3098 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 3099 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 3100 | "dev": true, 3101 | "peer": true, 3102 | "dependencies": { 3103 | "yocto-queue": "^0.1.0" 3104 | }, 3105 | "engines": { 3106 | "node": ">=10" 3107 | }, 3108 | "funding": { 3109 | "url": "https://github.com/sponsors/sindresorhus" 3110 | } 3111 | }, 3112 | "node_modules/p-locate": { 3113 | "version": "4.1.0", 3114 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 3115 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 3116 | "dev": true, 3117 | "peer": true, 3118 | "dependencies": { 3119 | "p-limit": "^2.2.0" 3120 | }, 3121 | "engines": { 3122 | "node": ">=8" 3123 | } 3124 | }, 3125 | "node_modules/p-locate/node_modules/p-limit": { 3126 | "version": "2.3.0", 3127 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 3128 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 3129 | "dev": true, 3130 | "peer": true, 3131 | "dependencies": { 3132 | "p-try": "^2.0.0" 3133 | }, 3134 | "engines": { 3135 | "node": ">=6" 3136 | }, 3137 | "funding": { 3138 | "url": "https://github.com/sponsors/sindresorhus" 3139 | } 3140 | }, 3141 | "node_modules/p-try": { 3142 | "version": "2.2.0", 3143 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 3144 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 3145 | "dev": true, 3146 | "peer": true, 3147 | "engines": { 3148 | "node": ">=6" 3149 | } 3150 | }, 3151 | "node_modules/parse-json": { 3152 | "version": "5.2.0", 3153 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 3154 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 3155 | "dev": true, 3156 | "peer": true, 3157 | "dependencies": { 3158 | "@babel/code-frame": "^7.0.0", 3159 | "error-ex": "^1.3.1", 3160 | "json-parse-even-better-errors": "^2.3.0", 3161 | "lines-and-columns": "^1.1.6" 3162 | }, 3163 | "engines": { 3164 | "node": ">=8" 3165 | }, 3166 | "funding": { 3167 | "url": "https://github.com/sponsors/sindresorhus" 3168 | } 3169 | }, 3170 | "node_modules/path-exists": { 3171 | "version": "4.0.0", 3172 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 3173 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 3174 | "dev": true, 3175 | "peer": true, 3176 | "engines": { 3177 | "node": ">=8" 3178 | } 3179 | }, 3180 | "node_modules/path-is-absolute": { 3181 | "version": "1.0.1", 3182 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3183 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 3184 | "dev": true, 3185 | "peer": true, 3186 | "engines": { 3187 | "node": ">=0.10.0" 3188 | } 3189 | }, 3190 | "node_modules/path-key": { 3191 | "version": "3.1.1", 3192 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3193 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3194 | "dev": true, 3195 | "peer": true, 3196 | "engines": { 3197 | "node": ">=8" 3198 | } 3199 | }, 3200 | "node_modules/path-parse": { 3201 | "version": "1.0.7", 3202 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3203 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3204 | "dev": true, 3205 | "peer": true 3206 | }, 3207 | "node_modules/picocolors": { 3208 | "version": "1.0.0", 3209 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 3210 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 3211 | "dev": true, 3212 | "peer": true 3213 | }, 3214 | "node_modules/picomatch": { 3215 | "version": "2.3.1", 3216 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3217 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3218 | "dev": true, 3219 | "engines": { 3220 | "node": ">=8.6" 3221 | }, 3222 | "funding": { 3223 | "url": "https://github.com/sponsors/jonschlinkert" 3224 | } 3225 | }, 3226 | "node_modules/pirates": { 3227 | "version": "4.0.5", 3228 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", 3229 | "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", 3230 | "dev": true, 3231 | "peer": true, 3232 | "engines": { 3233 | "node": ">= 6" 3234 | } 3235 | }, 3236 | "node_modules/pkg-dir": { 3237 | "version": "4.2.0", 3238 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 3239 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 3240 | "dev": true, 3241 | "peer": true, 3242 | "dependencies": { 3243 | "find-up": "^4.0.0" 3244 | }, 3245 | "engines": { 3246 | "node": ">=8" 3247 | } 3248 | }, 3249 | "node_modules/pretty-format": { 3250 | "version": "29.3.1", 3251 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", 3252 | "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", 3253 | "dev": true, 3254 | "dependencies": { 3255 | "@jest/schemas": "^29.0.0", 3256 | "ansi-styles": "^5.0.0", 3257 | "react-is": "^18.0.0" 3258 | }, 3259 | "engines": { 3260 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3261 | } 3262 | }, 3263 | "node_modules/pretty-format/node_modules/ansi-styles": { 3264 | "version": "5.2.0", 3265 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 3266 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 3267 | "dev": true, 3268 | "engines": { 3269 | "node": ">=10" 3270 | }, 3271 | "funding": { 3272 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3273 | } 3274 | }, 3275 | "node_modules/prompts": { 3276 | "version": "2.4.2", 3277 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 3278 | "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 3279 | "dev": true, 3280 | "peer": true, 3281 | "dependencies": { 3282 | "kleur": "^3.0.3", 3283 | "sisteransi": "^1.0.5" 3284 | }, 3285 | "engines": { 3286 | "node": ">= 6" 3287 | } 3288 | }, 3289 | "node_modules/react-is": { 3290 | "version": "18.2.0", 3291 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", 3292 | "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", 3293 | "dev": true 3294 | }, 3295 | "node_modules/require-directory": { 3296 | "version": "2.1.1", 3297 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3298 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 3299 | "dev": true, 3300 | "peer": true, 3301 | "engines": { 3302 | "node": ">=0.10.0" 3303 | } 3304 | }, 3305 | "node_modules/resolve": { 3306 | "version": "1.22.1", 3307 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3308 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3309 | "dev": true, 3310 | "peer": true, 3311 | "dependencies": { 3312 | "is-core-module": "^2.9.0", 3313 | "path-parse": "^1.0.7", 3314 | "supports-preserve-symlinks-flag": "^1.0.0" 3315 | }, 3316 | "bin": { 3317 | "resolve": "bin/resolve" 3318 | }, 3319 | "funding": { 3320 | "url": "https://github.com/sponsors/ljharb" 3321 | } 3322 | }, 3323 | "node_modules/resolve-cwd": { 3324 | "version": "3.0.0", 3325 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 3326 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 3327 | "dev": true, 3328 | "peer": true, 3329 | "dependencies": { 3330 | "resolve-from": "^5.0.0" 3331 | }, 3332 | "engines": { 3333 | "node": ">=8" 3334 | } 3335 | }, 3336 | "node_modules/resolve-from": { 3337 | "version": "5.0.0", 3338 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 3339 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 3340 | "dev": true, 3341 | "peer": true, 3342 | "engines": { 3343 | "node": ">=8" 3344 | } 3345 | }, 3346 | "node_modules/resolve.exports": { 3347 | "version": "1.1.1", 3348 | "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", 3349 | "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", 3350 | "dev": true, 3351 | "peer": true, 3352 | "engines": { 3353 | "node": ">=10" 3354 | } 3355 | }, 3356 | "node_modules/semver": { 3357 | "version": "6.3.0", 3358 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3359 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3360 | "dev": true, 3361 | "peer": true, 3362 | "bin": { 3363 | "semver": "bin/semver.js" 3364 | } 3365 | }, 3366 | "node_modules/shebang-command": { 3367 | "version": "2.0.0", 3368 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3369 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3370 | "dev": true, 3371 | "peer": true, 3372 | "dependencies": { 3373 | "shebang-regex": "^3.0.0" 3374 | }, 3375 | "engines": { 3376 | "node": ">=8" 3377 | } 3378 | }, 3379 | "node_modules/shebang-regex": { 3380 | "version": "3.0.0", 3381 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3382 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3383 | "dev": true, 3384 | "peer": true, 3385 | "engines": { 3386 | "node": ">=8" 3387 | } 3388 | }, 3389 | "node_modules/signal-exit": { 3390 | "version": "3.0.7", 3391 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3392 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 3393 | "dev": true, 3394 | "peer": true 3395 | }, 3396 | "node_modules/sisteransi": { 3397 | "version": "1.0.5", 3398 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3399 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3400 | "dev": true, 3401 | "peer": true 3402 | }, 3403 | "node_modules/slash": { 3404 | "version": "3.0.0", 3405 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3406 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3407 | "dev": true, 3408 | "engines": { 3409 | "node": ">=8" 3410 | } 3411 | }, 3412 | "node_modules/source-map": { 3413 | "version": "0.6.1", 3414 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3415 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3416 | "dev": true, 3417 | "peer": true, 3418 | "engines": { 3419 | "node": ">=0.10.0" 3420 | } 3421 | }, 3422 | "node_modules/source-map-support": { 3423 | "version": "0.5.13", 3424 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", 3425 | "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", 3426 | "dev": true, 3427 | "peer": true, 3428 | "dependencies": { 3429 | "buffer-from": "^1.0.0", 3430 | "source-map": "^0.6.0" 3431 | } 3432 | }, 3433 | "node_modules/sprintf-js": { 3434 | "version": "1.0.3", 3435 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3436 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 3437 | "dev": true, 3438 | "peer": true 3439 | }, 3440 | "node_modules/stack-utils": { 3441 | "version": "2.0.6", 3442 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", 3443 | "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", 3444 | "dev": true, 3445 | "dependencies": { 3446 | "escape-string-regexp": "^2.0.0" 3447 | }, 3448 | "engines": { 3449 | "node": ">=10" 3450 | } 3451 | }, 3452 | "node_modules/string-length": { 3453 | "version": "4.0.2", 3454 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", 3455 | "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", 3456 | "dev": true, 3457 | "peer": true, 3458 | "dependencies": { 3459 | "char-regex": "^1.0.2", 3460 | "strip-ansi": "^6.0.0" 3461 | }, 3462 | "engines": { 3463 | "node": ">=10" 3464 | } 3465 | }, 3466 | "node_modules/string-width": { 3467 | "version": "4.2.3", 3468 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3469 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3470 | "dev": true, 3471 | "peer": true, 3472 | "dependencies": { 3473 | "emoji-regex": "^8.0.0", 3474 | "is-fullwidth-code-point": "^3.0.0", 3475 | "strip-ansi": "^6.0.1" 3476 | }, 3477 | "engines": { 3478 | "node": ">=8" 3479 | } 3480 | }, 3481 | "node_modules/strip-ansi": { 3482 | "version": "6.0.1", 3483 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3484 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3485 | "dev": true, 3486 | "peer": true, 3487 | "dependencies": { 3488 | "ansi-regex": "^5.0.1" 3489 | }, 3490 | "engines": { 3491 | "node": ">=8" 3492 | } 3493 | }, 3494 | "node_modules/strip-bom": { 3495 | "version": "4.0.0", 3496 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 3497 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 3498 | "dev": true, 3499 | "peer": true, 3500 | "engines": { 3501 | "node": ">=8" 3502 | } 3503 | }, 3504 | "node_modules/strip-final-newline": { 3505 | "version": "2.0.0", 3506 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3507 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 3508 | "dev": true, 3509 | "peer": true, 3510 | "engines": { 3511 | "node": ">=6" 3512 | } 3513 | }, 3514 | "node_modules/strip-json-comments": { 3515 | "version": "3.1.1", 3516 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3517 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3518 | "dev": true, 3519 | "peer": true, 3520 | "engines": { 3521 | "node": ">=8" 3522 | }, 3523 | "funding": { 3524 | "url": "https://github.com/sponsors/sindresorhus" 3525 | } 3526 | }, 3527 | "node_modules/supports-color": { 3528 | "version": "7.2.0", 3529 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3530 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3531 | "dev": true, 3532 | "dependencies": { 3533 | "has-flag": "^4.0.0" 3534 | }, 3535 | "engines": { 3536 | "node": ">=8" 3537 | } 3538 | }, 3539 | "node_modules/supports-preserve-symlinks-flag": { 3540 | "version": "1.0.0", 3541 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3542 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3543 | "dev": true, 3544 | "peer": true, 3545 | "engines": { 3546 | "node": ">= 0.4" 3547 | }, 3548 | "funding": { 3549 | "url": "https://github.com/sponsors/ljharb" 3550 | } 3551 | }, 3552 | "node_modules/test-exclude": { 3553 | "version": "6.0.0", 3554 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 3555 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 3556 | "dev": true, 3557 | "peer": true, 3558 | "dependencies": { 3559 | "@istanbuljs/schema": "^0.1.2", 3560 | "glob": "^7.1.4", 3561 | "minimatch": "^3.0.4" 3562 | }, 3563 | "engines": { 3564 | "node": ">=8" 3565 | } 3566 | }, 3567 | "node_modules/tmpl": { 3568 | "version": "1.0.5", 3569 | "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", 3570 | "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", 3571 | "dev": true, 3572 | "peer": true 3573 | }, 3574 | "node_modules/to-fast-properties": { 3575 | "version": "2.0.0", 3576 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3577 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3578 | "dev": true, 3579 | "peer": true, 3580 | "engines": { 3581 | "node": ">=4" 3582 | } 3583 | }, 3584 | "node_modules/to-regex-range": { 3585 | "version": "5.0.1", 3586 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3587 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3588 | "dev": true, 3589 | "dependencies": { 3590 | "is-number": "^7.0.0" 3591 | }, 3592 | "engines": { 3593 | "node": ">=8.0" 3594 | } 3595 | }, 3596 | "node_modules/ts-jest": { 3597 | "version": "29.0.5", 3598 | "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", 3599 | "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", 3600 | "dev": true, 3601 | "dependencies": { 3602 | "bs-logger": "0.x", 3603 | "fast-json-stable-stringify": "2.x", 3604 | "jest-util": "^29.0.0", 3605 | "json5": "^2.2.3", 3606 | "lodash.memoize": "4.x", 3607 | "make-error": "1.x", 3608 | "semver": "7.x", 3609 | "yargs-parser": "^21.0.1" 3610 | }, 3611 | "bin": { 3612 | "ts-jest": "cli.js" 3613 | }, 3614 | "engines": { 3615 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3616 | }, 3617 | "peerDependencies": { 3618 | "@babel/core": ">=7.0.0-beta.0 <8", 3619 | "@jest/types": "^29.0.0", 3620 | "babel-jest": "^29.0.0", 3621 | "jest": "^29.0.0", 3622 | "typescript": ">=4.3" 3623 | }, 3624 | "peerDependenciesMeta": { 3625 | "@babel/core": { 3626 | "optional": true 3627 | }, 3628 | "@jest/types": { 3629 | "optional": true 3630 | }, 3631 | "babel-jest": { 3632 | "optional": true 3633 | }, 3634 | "esbuild": { 3635 | "optional": true 3636 | } 3637 | } 3638 | }, 3639 | "node_modules/ts-jest/node_modules/lru-cache": { 3640 | "version": "6.0.0", 3641 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 3642 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 3643 | "dev": true, 3644 | "dependencies": { 3645 | "yallist": "^4.0.0" 3646 | }, 3647 | "engines": { 3648 | "node": ">=10" 3649 | } 3650 | }, 3651 | "node_modules/ts-jest/node_modules/semver": { 3652 | "version": "7.3.8", 3653 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 3654 | "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 3655 | "dev": true, 3656 | "dependencies": { 3657 | "lru-cache": "^6.0.0" 3658 | }, 3659 | "bin": { 3660 | "semver": "bin/semver.js" 3661 | }, 3662 | "engines": { 3663 | "node": ">=10" 3664 | } 3665 | }, 3666 | "node_modules/ts-jest/node_modules/yallist": { 3667 | "version": "4.0.0", 3668 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3669 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3670 | "dev": true 3671 | }, 3672 | "node_modules/ts-node": { 3673 | "version": "10.9.1", 3674 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 3675 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 3676 | "dev": true, 3677 | "dependencies": { 3678 | "@cspotcode/source-map-support": "^0.8.0", 3679 | "@tsconfig/node10": "^1.0.7", 3680 | "@tsconfig/node12": "^1.0.7", 3681 | "@tsconfig/node14": "^1.0.0", 3682 | "@tsconfig/node16": "^1.0.2", 3683 | "acorn": "^8.4.1", 3684 | "acorn-walk": "^8.1.1", 3685 | "arg": "^4.1.0", 3686 | "create-require": "^1.1.0", 3687 | "diff": "^4.0.1", 3688 | "make-error": "^1.1.1", 3689 | "v8-compile-cache-lib": "^3.0.1", 3690 | "yn": "3.1.1" 3691 | }, 3692 | "bin": { 3693 | "ts-node": "dist/bin.js", 3694 | "ts-node-cwd": "dist/bin-cwd.js", 3695 | "ts-node-esm": "dist/bin-esm.js", 3696 | "ts-node-script": "dist/bin-script.js", 3697 | "ts-node-transpile-only": "dist/bin-transpile.js", 3698 | "ts-script": "dist/bin-script-deprecated.js" 3699 | }, 3700 | "peerDependencies": { 3701 | "@swc/core": ">=1.2.50", 3702 | "@swc/wasm": ">=1.2.50", 3703 | "@types/node": "*", 3704 | "typescript": ">=2.7" 3705 | }, 3706 | "peerDependenciesMeta": { 3707 | "@swc/core": { 3708 | "optional": true 3709 | }, 3710 | "@swc/wasm": { 3711 | "optional": true 3712 | } 3713 | } 3714 | }, 3715 | "node_modules/type-detect": { 3716 | "version": "4.0.8", 3717 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 3718 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 3719 | "dev": true, 3720 | "peer": true, 3721 | "engines": { 3722 | "node": ">=4" 3723 | } 3724 | }, 3725 | "node_modules/type-fest": { 3726 | "version": "0.21.3", 3727 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 3728 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 3729 | "dev": true, 3730 | "peer": true, 3731 | "engines": { 3732 | "node": ">=10" 3733 | }, 3734 | "funding": { 3735 | "url": "https://github.com/sponsors/sindresorhus" 3736 | } 3737 | }, 3738 | "node_modules/typescript": { 3739 | "version": "4.9.4", 3740 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", 3741 | "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", 3742 | "dev": true, 3743 | "bin": { 3744 | "tsc": "bin/tsc", 3745 | "tsserver": "bin/tsserver" 3746 | }, 3747 | "engines": { 3748 | "node": ">=4.2.0" 3749 | } 3750 | }, 3751 | "node_modules/update-browserslist-db": { 3752 | "version": "1.0.10", 3753 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 3754 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 3755 | "dev": true, 3756 | "funding": [ 3757 | { 3758 | "type": "opencollective", 3759 | "url": "https://opencollective.com/browserslist" 3760 | }, 3761 | { 3762 | "type": "tidelift", 3763 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3764 | } 3765 | ], 3766 | "peer": true, 3767 | "dependencies": { 3768 | "escalade": "^3.1.1", 3769 | "picocolors": "^1.0.0" 3770 | }, 3771 | "bin": { 3772 | "browserslist-lint": "cli.js" 3773 | }, 3774 | "peerDependencies": { 3775 | "browserslist": ">= 4.21.0" 3776 | } 3777 | }, 3778 | "node_modules/v8-compile-cache-lib": { 3779 | "version": "3.0.1", 3780 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 3781 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 3782 | "dev": true 3783 | }, 3784 | "node_modules/v8-to-istanbul": { 3785 | "version": "9.0.1", 3786 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", 3787 | "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", 3788 | "dev": true, 3789 | "peer": true, 3790 | "dependencies": { 3791 | "@jridgewell/trace-mapping": "^0.3.12", 3792 | "@types/istanbul-lib-coverage": "^2.0.1", 3793 | "convert-source-map": "^1.6.0" 3794 | }, 3795 | "engines": { 3796 | "node": ">=10.12.0" 3797 | } 3798 | }, 3799 | "node_modules/v8-to-istanbul/node_modules/convert-source-map": { 3800 | "version": "1.9.0", 3801 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 3802 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 3803 | "dev": true, 3804 | "peer": true 3805 | }, 3806 | "node_modules/walker": { 3807 | "version": "1.0.8", 3808 | "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", 3809 | "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", 3810 | "dev": true, 3811 | "peer": true, 3812 | "dependencies": { 3813 | "makeerror": "1.0.12" 3814 | } 3815 | }, 3816 | "node_modules/which": { 3817 | "version": "2.0.2", 3818 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3819 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3820 | "dev": true, 3821 | "peer": true, 3822 | "dependencies": { 3823 | "isexe": "^2.0.0" 3824 | }, 3825 | "bin": { 3826 | "node-which": "bin/node-which" 3827 | }, 3828 | "engines": { 3829 | "node": ">= 8" 3830 | } 3831 | }, 3832 | "node_modules/wrap-ansi": { 3833 | "version": "7.0.0", 3834 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3835 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3836 | "dev": true, 3837 | "peer": true, 3838 | "dependencies": { 3839 | "ansi-styles": "^4.0.0", 3840 | "string-width": "^4.1.0", 3841 | "strip-ansi": "^6.0.0" 3842 | }, 3843 | "engines": { 3844 | "node": ">=10" 3845 | }, 3846 | "funding": { 3847 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3848 | } 3849 | }, 3850 | "node_modules/wrappy": { 3851 | "version": "1.0.2", 3852 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3853 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3854 | "dev": true, 3855 | "peer": true 3856 | }, 3857 | "node_modules/write-file-atomic": { 3858 | "version": "4.0.2", 3859 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", 3860 | "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", 3861 | "dev": true, 3862 | "peer": true, 3863 | "dependencies": { 3864 | "imurmurhash": "^0.1.4", 3865 | "signal-exit": "^3.0.7" 3866 | }, 3867 | "engines": { 3868 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 3869 | } 3870 | }, 3871 | "node_modules/y18n": { 3872 | "version": "5.0.8", 3873 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3874 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3875 | "dev": true, 3876 | "peer": true, 3877 | "engines": { 3878 | "node": ">=10" 3879 | } 3880 | }, 3881 | "node_modules/yallist": { 3882 | "version": "3.1.1", 3883 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3884 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3885 | "dev": true, 3886 | "peer": true 3887 | }, 3888 | "node_modules/yargs": { 3889 | "version": "17.6.2", 3890 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", 3891 | "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", 3892 | "dev": true, 3893 | "peer": true, 3894 | "dependencies": { 3895 | "cliui": "^8.0.1", 3896 | "escalade": "^3.1.1", 3897 | "get-caller-file": "^2.0.5", 3898 | "require-directory": "^2.1.1", 3899 | "string-width": "^4.2.3", 3900 | "y18n": "^5.0.5", 3901 | "yargs-parser": "^21.1.1" 3902 | }, 3903 | "engines": { 3904 | "node": ">=12" 3905 | } 3906 | }, 3907 | "node_modules/yargs-parser": { 3908 | "version": "21.1.1", 3909 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3910 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3911 | "dev": true, 3912 | "engines": { 3913 | "node": ">=12" 3914 | } 3915 | }, 3916 | "node_modules/yn": { 3917 | "version": "3.1.1", 3918 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3919 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 3920 | "dev": true, 3921 | "engines": { 3922 | "node": ">=6" 3923 | } 3924 | }, 3925 | "node_modules/yocto-queue": { 3926 | "version": "0.1.0", 3927 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3928 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3929 | "dev": true, 3930 | "peer": true, 3931 | "engines": { 3932 | "node": ">=10" 3933 | }, 3934 | "funding": { 3935 | "url": "https://github.com/sponsors/sindresorhus" 3936 | } 3937 | }, 3938 | "node_modules/zod": { 3939 | "version": "3.20.2", 3940 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.2.tgz", 3941 | "integrity": "sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==", 3942 | "funding": { 3943 | "url": "https://github.com/sponsors/colinhacks" 3944 | } 3945 | } 3946 | } 3947 | } 3948 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "revisit-domain-model", 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 | "@types/jest": "^29.2.6", 14 | "@types/node": "^18.11.18", 15 | "ts-jest": "^29.0.5", 16 | "ts-node": "^10.9.1", 17 | "typescript": "^4.9.4" 18 | }, 19 | "dependencies": { 20 | "fp-ts": "^2.13.1", 21 | "zod": "^3.20.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/made_functional.test.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID } from 'crypto'; 2 | import { 3 | addItemToCartUseCase, CartItemRepository, CartRepository, ProductRepository 4 | } from './made_functional'; 5 | 6 | const cartRepository: CartRepository = { 7 | load: userId => ({ 8 | id: randomUUID(), 9 | }), 10 | isInCart: (cartId, productId) => false, 11 | getItemCount: cartId => 100, 12 | } 13 | 14 | const cartItemRepository: CartItemRepository = { 15 | insert(cartItem) { 16 | expect(cartItem.quantity).toBe(8) 17 | }, 18 | update(cartItem) { 19 | fail(); 20 | } 21 | } 22 | 23 | const productRepository: ProductRepository = { 24 | findOnSale(productId) { 25 | return { 26 | id: randomUUID() 27 | } 28 | } 29 | } 30 | test("add new item", () => { 31 | addItemToCartUseCase( 32 | cartRepository, 33 | cartItemRepository, 34 | productRepository 35 | )({ 36 | userId: randomUUID(), 37 | productId: randomUUID(), 38 | quantity: 8 39 | }); 40 | }); -------------------------------------------------------------------------------- /src/made_functional.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AddItemToCartCommand, 3 | Page, 4 | UserId, 5 | CartId, 6 | ProductId, 7 | Quantity, 8 | } from './share'; 9 | import { z } from "zod"; 10 | 11 | const Cart = z.object({ 12 | id: CartId 13 | }) 14 | type Cart = z.infer 15 | 16 | type cartItems = (cart: Cart, page: number) => Page 17 | 18 | type OnSaleProduct = { 19 | id: ProductId 20 | } 21 | const CartItem = z.object({ 22 | cartId: CartId, 23 | productId: ProductId, 24 | quantity: Quantity, 25 | }); 26 | type CartItem = z.infer 27 | 28 | type AddableCartItem = { 29 | isNew: boolean; 30 | cartId: CartId; 31 | product: OnSaleProduct; 32 | quantity: Quantity; 33 | } 34 | 35 | type ParseCartItem = (command: AddItemToCartCommand, cart: Cart) => CartItem 36 | type ParseAddableCartItem = (cartItem: CartItem) => AddableCartItem 37 | type SaveCartItem = (cartItem: AddableCartItem) => void 38 | type FetchCart = (userId: UserId) => Cart 39 | 40 | export interface CartRepository { 41 | load: (userId: UserId) => Cart; 42 | getItemCount: (cartId: CartId) => number; 43 | isInCart: (cartId: CartId, productId: ProductId) => boolean; 44 | } 45 | 46 | export interface CartItemRepository { 47 | insert: (cartItem: CartItem) => void; 48 | update: (cartItem: CartItem) => void; 49 | } 50 | 51 | export interface ProductRepository { 52 | findOnSale: (productId: ProductId) => OnSaleProduct; 53 | } 54 | 55 | const parseCartItem: ParseCartItem = (command: AddItemToCartCommand, cart: Cart) => { 56 | return CartItem.parse({ 57 | cartId: command.userId, 58 | productId: command.productId, 59 | quantity: command.quantity, 60 | }) 61 | } 62 | 63 | // 本当はもっと小さなFunctionに分解すべき 64 | function parseAddableCartItem( 65 | cartRepository: CartRepository, 66 | productRepository: ProductRepository, 67 | ): ParseAddableCartItem { 68 | return (cartItem: CartItem) => { 69 | if (cartRepository.getItemCount(cartItem.cartId) + cartItem.quantity > 10000) { 70 | throw Error(`商品数の上限に達しています`) 71 | } 72 | return { 73 | isNew: cartRepository.isInCart(cartItem.cartId, cartItem.productId), 74 | cartId: cartItem.cartId, 75 | product: productRepository.findOnSale(cartItem.productId), 76 | quantity: cartItem.quantity, 77 | } 78 | } 79 | } 80 | function saveCartItem(cartItemRepository: CartItemRepository): SaveCartItem { 81 | return (cartItem: AddableCartItem) => { 82 | if (cartItem.isNew) { 83 | cartItemRepository.insert({ 84 | cartId: cartItem.cartId, 85 | productId: cartItem.product.id, 86 | quantity: cartItem.quantity 87 | }) 88 | } else { 89 | cartItemRepository.insert({ 90 | cartId: cartItem.cartId, 91 | productId: cartItem.product.id, 92 | quantity: cartItem.quantity 93 | }) 94 | } 95 | } 96 | } 97 | 98 | function fetchCart(cartRepository: CartRepository): FetchCart { 99 | return (userId: UserId) => { 100 | return cartRepository.load(userId) 101 | } 102 | } 103 | 104 | export function addItemToCartUseCase( 105 | cartRepository: CartRepository, 106 | cartItemRepository: CartItemRepository, 107 | productRepository: ProductRepository, 108 | ) { 109 | return (command: AddItemToCartCommand) => { 110 | const cart = fetchCart(cartRepository)(UserId.parse(command.userId)); 111 | const cartItem = parseCartItem(command, cart); 112 | const addableCartItem = parseAddableCartItem(cartRepository, productRepository)(cartItem); 113 | saveCartItem(cartItemRepository)(addableCartItem); 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /src/made_more_functional.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AddItemToCartCommand, 3 | Page, 4 | UserId, 5 | CartId, 6 | ProductId, 7 | Quantity, 8 | } from './share' 9 | import * as E from "fp-ts/Either" 10 | import { pipe } from 'fp-ts/lib/function' 11 | import { z } from "zod" 12 | 13 | const Cart = z.object({ 14 | id: CartId 15 | }) 16 | type Cart = z.infer 17 | 18 | type cartItems = (cart: Cart, page: number) => Page 19 | 20 | const OnSaleProduct = z.object({ 21 | id: ProductId 22 | }) 23 | type OnSaleProduct = z.infer 24 | 25 | const CartItem = z.object({ 26 | cartId: CartId, 27 | productId: ProductId, 28 | quantity: Quantity, 29 | }) 30 | type CartItem = z.infer 31 | 32 | const AddableCartItem = z.object({ 33 | isNew: z.boolean(), 34 | cartId: CartId, 35 | product: OnSaleProduct, 36 | quantity: Quantity, 37 | }) 38 | type AddableCartItem = z.infer 39 | 40 | type FetchCart = (userId: UserId) => E.Either 41 | type ParseCartItem = (command: AddItemToCartCommand, cart: Cart) => E.Either 42 | type ParseAddableCartItem = (cartItem: CartItem) => E.Either 43 | type SaveCartItem = (cartItem: AddableCartItem) => E.Either 44 | 45 | export interface CartRepository { 46 | load: (userId: UserId) => Cart | null; 47 | getItemCount: (cartId: CartId) => number; 48 | isInCart: (cartId: CartId, productId: ProductId) => boolean; 49 | } 50 | 51 | export interface CartItemRepository { 52 | insert: (cartItem: CartItem) => void; 53 | update: (cartItem: CartItem) => void; 54 | } 55 | 56 | export interface ProductRepository { 57 | findOnSale: (productId: ProductId) => OnSaleProduct | null; 58 | } 59 | 60 | const parseCartItem: ParseCartItem = (command: AddItemToCartCommand, cart: Cart) => { 61 | const res = CartItem.safeParse({ 62 | cartId: command.userId, 63 | productId: command.productId, 64 | quantity: command.quantity, 65 | }) 66 | return res.success ? E.right(res.data) : E.left(res.error) 67 | } 68 | 69 | function validateCartCapacity(cartRepository: CartRepository) { 70 | return (cartItem: CartItem): E.Either => { 71 | if (cartRepository.getItemCount(cartItem.cartId) + cartItem.quantity > 10000) { 72 | return fail(new Error(`商品数の上限に達しています`)) 73 | } 74 | return E.right(cartItem) 75 | } 76 | } 77 | 78 | function validateOnSaleProduct(productRepository: ProductRepository) { 79 | return (cartItem: CartItem): E.Either => { 80 | const product = productRepository.findOnSale(cartItem.productId) 81 | return product != null ? E.right(product) : E.left(new Error(``)) 82 | } 83 | } 84 | 85 | function existsInCart(cartRepository: CartRepository) { 86 | return (cartItem: CartItem): E.Either => E.right(cartRepository.isInCart(cartItem.cartId, cartItem.productId)) 87 | } 88 | 89 | function parseAddableCartItem( 90 | cartRepository: CartRepository, 91 | productRepository: ProductRepository, 92 | ): ParseAddableCartItem { 93 | return (cartItem: CartItem): E.Either => 94 | pipe(validateCartCapacity(cartRepository)(cartItem), 95 | E.chain(item => E.sequenceArray([ 96 | validateOnSaleProduct(productRepository)(item) as any, // FIXME 97 | existsInCart(cartRepository)(item) 98 | ])), 99 | E.map(([product, isNew]) => 100 | AddableCartItem.parse({ 101 | isNew, 102 | product, 103 | cartId: cartItem.cartId, 104 | quantity: cartItem.quantity, 105 | }) 106 | ) 107 | ) 108 | } 109 | 110 | function saveCartItem(cartItemRepository: CartItemRepository): SaveCartItem { 111 | return (cartItem: AddableCartItem) => { 112 | if (cartItem.isNew) { 113 | cartItemRepository.insert({ 114 | cartId: cartItem.cartId, 115 | productId: cartItem.product.id, 116 | quantity: cartItem.quantity 117 | }) 118 | } else { 119 | cartItemRepository.insert({ 120 | cartId: cartItem.cartId, 121 | productId: cartItem.product.id, 122 | quantity: cartItem.quantity 123 | }) 124 | } 125 | return E.right(undefined) 126 | } 127 | } 128 | 129 | function fetchCart(cartRepository: CartRepository): FetchCart { 130 | return (userId: UserId) => { 131 | const cart = cartRepository.load(userId) 132 | return cart != null ? E.right(cart) : E.left(new Error('')) 133 | } 134 | } 135 | 136 | export function addItemToCartUseCase( 137 | cartRepository: CartRepository, 138 | cartItemRepository: CartItemRepository, 139 | productRepository: ProductRepository, 140 | ) { 141 | return (command: AddItemToCartCommand) => 142 | pipe(fetchCart(cartRepository)(UserId.parse(command.userId)), 143 | E.chain(cart => parseCartItem(command, cart)), 144 | E.chain(parseAddableCartItem(cartRepository, productRepository)), 145 | E.chain(saveCartItem(cartItemRepository))) 146 | } 147 | -------------------------------------------------------------------------------- /src/share.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const CartId = z.string().uuid(); 4 | export type CartId = z.infer; 5 | 6 | export const ProductId = z.string().uuid(); 7 | export type ProductId = z.infer; 8 | 9 | export const CartItemId = z.string().uuid(); 10 | export type CartItemId = z.infer; 11 | 12 | export const UserId = z.string().uuid(); 13 | export type UserId = z.infer; 14 | 15 | export const Quantity = z.number().positive(); 16 | export type Quantity = z.infer; 17 | 18 | export type Page = { 19 | total: number; 20 | page: number; 21 | sze: number; 22 | items: T; 23 | } 24 | 25 | export type CartItem = { 26 | productId: ProductId; 27 | quantity: Quantity; 28 | } 29 | 30 | export type AddItemToCartCommand = { 31 | productId: string; 32 | quantity: number; 33 | userId: string; 34 | } 35 | -------------------------------------------------------------------------------- /src/split_aggregate.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID } from 'crypto'; 2 | import { isGeneratorFunction } from 'util/types'; 3 | import { 4 | UserId, 5 | ProductId, 6 | CartItemId, 7 | CartId, 8 | Quantity, 9 | AddItemToCartCommand, 10 | } from './share' 11 | 12 | // 集約を分ける。 13 | // 実際には、カートとカートアイテムは、カートアイテムが強くカートに依存するので、 14 | // これは良い分割とはならないだろう。 15 | 16 | type CartItem = { 17 | id: CartItemId; 18 | cartId: CartId; 19 | productId: ProductId; 20 | quantity: Quantity; 21 | } 22 | 23 | class Cart { 24 | private itemIds: CartItemId[]; 25 | readonly id: CartId; 26 | public static UPPER_BOUND: number = 10000; 27 | 28 | constructor(id: CartId, itemIds: CartItemId[]|undefined) { 29 | this.id = id; 30 | this.itemIds = itemIds || []; 31 | } 32 | } 33 | 34 | interface CartRepository { 35 | loadCart(userId: UserId): Cart; 36 | saveCart(cart: Cart): void; 37 | getItemCount(cartId: CartId): number; 38 | } 39 | 40 | interface CartItemRepository { 41 | insert(cartItem: CartItem): void; 42 | } 43 | 44 | interface ProductRepository { 45 | isNowOnSale(productId: ProductId): boolean; 46 | } 47 | 48 | type AddItemToCartUseCase = (command: AddItemToCartCommand) => void; 49 | 50 | function validateCartInvariant( 51 | cartRepository: CartRepository, 52 | ) { 53 | return (cartId: CartId, quantity: Quantity) => { 54 | if (cartRepository.getItemCount(cartId) + quantity > Cart.UPPER_BOUND) { 55 | throw new Error(`商品数が上限に達しています`) 56 | } 57 | } 58 | } 59 | 60 | function addItemToCartUseCase( 61 | cartRepository: CartRepository, 62 | cartItemRepository: CartItemRepository, 63 | productRepository: ProductRepository, 64 | ) { 65 | return (command: AddItemToCartCommand) => { 66 | const userId = UserId.parse(command.userId); 67 | const productId = ProductId.parse(command.productId); 68 | if (!productRepository.isNowOnSale(productId)) { 69 | throw Error(`販売が終了しました`); 70 | } 71 | const cart = cartRepository.loadCart(userId); 72 | const quantity = Quantity.parse(command.quantity); 73 | // カートアイテムの数量チェック 74 | validateCartInvariant(cartRepository)(cart.id, quantity); 75 | cartItemRepository.insert({ 76 | id: randomUUID(), 77 | cartId: cart.id, 78 | productId, quantity 79 | }); 80 | } 81 | } -------------------------------------------------------------------------------- /src/victim_completeness.test.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID } from 'crypto' 2 | import { addItemToCartUseCase, Cart, CartRepository, ProductRepository } from './victim_completeness' 3 | 4 | test('add an item successfully', () => { 5 | const cartRepository: CartRepository = { 6 | loadCart: userId => new Cart(randomUUID()), 7 | saveCart: cart => {}, 8 | getItemCount: cartId => 0, 9 | addItem: (productId, quantity) => { 10 | expect(quantity).toBe(8) 11 | } 12 | } 13 | const productRepository: ProductRepository = { 14 | isNowOnSale: productId => true, 15 | } 16 | 17 | addItemToCartUseCase( 18 | cartRepository, 19 | productRepository, 20 | )({ 21 | userId: randomUUID(), 22 | productId: randomUUID(), 23 | quantity: 8, 24 | }) 25 | }) 26 | 27 | test('cart full', () => { 28 | const cartRepository: CartRepository = { 29 | loadCart: userId => new Cart(randomUUID()), 30 | saveCart: cart => {}, 31 | getItemCount: cartId => 10000, 32 | addItem: (productId, quantity) => { 33 | fail() 34 | } 35 | } 36 | const productRepository: ProductRepository = { 37 | isNowOnSale: productId => true, 38 | } 39 | expect(() => addItemToCartUseCase( 40 | cartRepository, 41 | productRepository 42 | )({ 43 | userId: randomUUID(), 44 | productId: randomUUID(), 45 | quantity: 1, 46 | }) 47 | ).toThrow(/上限/) 48 | 49 | }) -------------------------------------------------------------------------------- /src/victim_completeness.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ProductId, 3 | Quantity, 4 | CartItem, 5 | UserId, 6 | AddItemToCartCommand, 7 | CartId, 8 | } from './share' 9 | 10 | export interface CartRepository { 11 | getItemCount(cartId: CartId): number; 12 | loadCart(userId: UserId): Cart; 13 | saveCart(cart: Cart): void; 14 | addItem(productId: ProductId, quantity: Quantity): void; 15 | } 16 | 17 | export interface ProductRepository { 18 | isNowOnSale(productId: ProductId): boolean; 19 | } 20 | 21 | // 性能を犠牲にせず、かつドメイン層に外界とのやり取りを持ち込まないようにする 22 | export class Cart { 23 | private id: CartId; 24 | public static UPPER_BOUND: number = 10000; 25 | 26 | constructor(id: CartId) { 27 | this.id = id; 28 | } 29 | } 30 | 31 | export function addItemToCartUseCase( 32 | cartRepository: CartRepository, 33 | productRepository: ProductRepository) { 34 | return (command: AddItemToCartCommand) => { 35 | const userId = UserId.parse(command.userId); 36 | const productId = ProductId.parse(command.productId); 37 | if (!productRepository.isNowOnSale(productId)) { 38 | throw Error(`販売が終了しました`); 39 | }; 40 | const quantity = Quantity.parse(command.quantity); 41 | if (cartRepository.getItemCount(userId) + quantity > Cart.UPPER_BOUND) { 42 | throw new Error(`商品数の上限に達しています`) 43 | } 44 | cartRepository.addItem(productId, quantity); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/victim_performance.test.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID } from 'crypto' 2 | import { addItemToCartUseCase, Cart, CartRepository, ProductRepository } from './victim_performance' 3 | 4 | test('add a new item', () => { 5 | const cartRepository: CartRepository = { 6 | loadCart: (userId) => new Cart(), 7 | saveCart: (cart) => { 8 | expect(cart.items.length).toBe(1) 9 | }, 10 | } 11 | 12 | const productRepository: ProductRepository = { 13 | isNowOnSale: (productId) => true, 14 | } 15 | addItemToCartUseCase( 16 | cartRepository, 17 | productRepository 18 | )({ 19 | userId: randomUUID(), 20 | productId: randomUUID(), 21 | quantity: 8, 22 | }) 23 | }) 24 | 25 | test('Cart full', () => { 26 | const cartRepository: CartRepository = { 27 | loadCart: (userId) => new Cart(), 28 | saveCart: (cart) => { 29 | expect(cart.items.length).toBe(1) 30 | }, 31 | } 32 | 33 | const productRepository: ProductRepository = { 34 | isNowOnSale: (productId) => true, 35 | } 36 | 37 | expect(() => addItemToCartUseCase( 38 | cartRepository, 39 | productRepository 40 | )({ 41 | userId: randomUUID(), 42 | productId: randomUUID(), 43 | quantity: 101, 44 | }) 45 | ).toThrow(/上限/) 46 | }) -------------------------------------------------------------------------------- /src/victim_performance.ts: -------------------------------------------------------------------------------- 1 | import { 2 | UserId, 3 | ProductId, 4 | Quantity, 5 | CartItem, 6 | AddItemToCartCommand, 7 | } from './share' 8 | 9 | // 純粋性と完全性を両立させた設計 10 | export class Cart { 11 | readonly items: CartItem[]; 12 | // ここの数を増やすと危険なので、触らないこと! (コメント例) 13 | private static UPPER_BOUND: number = 100; 14 | 15 | constructor(items?: CartItem[]) { 16 | this.items = items || []; 17 | this.isValid(); 18 | } 19 | 20 | private isValid(): boolean { 21 | const total = this.items 22 | .map(item => item.quantity) 23 | .reduce((prev, cur) => prev + cur, 0); 24 | 25 | return total <= Cart.UPPER_BOUND; 26 | } 27 | 28 | add(productId: ProductId, quantity: Quantity): void { 29 | const item = this.items.find(item => item.productId === productId); 30 | if (item === undefined) { 31 | this.items.push({ productId, quantity }) 32 | } else { 33 | item.quantity = item?.quantity + quantity; 34 | } 35 | if (!this.isValid()) { 36 | throw new Error(`商品数の上限に達しています`) 37 | } 38 | } 39 | } 40 | 41 | export interface CartRepository { 42 | loadCart(userId: UserId): Cart; 43 | saveCart(cart: Cart): void; 44 | } 45 | 46 | export interface ProductRepository { 47 | isNowOnSale(productId: ProductId): boolean; 48 | } 49 | 50 | type AddItemToCartUseCase = (command: AddItemToCartCommand) => void; 51 | 52 | export function addItemToCartUseCase( 53 | cartRepository: CartRepository, 54 | productRepository: ProductRepository) { 55 | return (command: AddItemToCartCommand) => { 56 | const userId = UserId.parse(command.userId); 57 | const productId = ProductId.parse(command.productId); 58 | if (!productRepository.isNowOnSale(productId)) { 59 | throw Error(`販売が終了しました`); 60 | }; 61 | const cart = cartRepository.loadCart(userId); 62 | const quantity = Quantity.parse(command.quantity); 63 | cart.add(productId, quantity); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/victim_purity.test.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID } from 'crypto' 2 | import { addItemToCartUseCase, CartForUpdate, CartWriteRepository, ProductRepository } from './victim_purity' 3 | 4 | test('add an item', () => { 5 | const cartRepository: CartWriteRepository = { 6 | loadCart: (userId) => new CartForUpdate(randomUUID()), 7 | saveCart: (cart) => { 8 | expect(cart) 9 | }, 10 | getItemCount: () => 0, 11 | addItem: (cartItem) => { 12 | }, 13 | } 14 | const productRepository: ProductRepository = { 15 | isNowOnSale: productId => true, 16 | } 17 | 18 | addItemToCartUseCase( 19 | cartRepository, 20 | productRepository 21 | )({ 22 | userId: randomUUID(), 23 | productId: randomUUID(), 24 | quantity: 8, 25 | }) 26 | }) 27 | 28 | test('cart full', () => { 29 | const cartRepository: CartWriteRepository = { 30 | loadCart: (userId) => new CartForUpdate(randomUUID()), 31 | saveCart: (cart) => { 32 | expect(cart) 33 | }, 34 | getItemCount: () => 10000, 35 | addItem: (cartItem) => { 36 | }, 37 | } 38 | const productRepository: ProductRepository = { 39 | isNowOnSale: productId => true, 40 | } 41 | expect(() => addItemToCartUseCase( 42 | cartRepository, 43 | productRepository 44 | )({ 45 | userId: randomUUID(), 46 | productId: randomUUID(), 47 | quantity: 1, 48 | }) 49 | ).toThrow(/上限/) 50 | }) -------------------------------------------------------------------------------- /src/victim_purity.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ProductId, 3 | Quantity, 4 | CartItem, 5 | UserId, 6 | Page, 7 | AddItemToCartCommand, 8 | CartId, 9 | } from './share' 10 | 11 | // 性能を犠牲にせず、かつドメイン層にあるべき責務をドメインレイヤで実装する 12 | 13 | /** 14 | * 更新するときにカートに不変条件のチェックを持たせたい。 15 | * ↓ 16 | * が、そのためにカートアイテムを全部インスタンス化して持たせることは性能観点からやりたくない 17 | * ↓ 18 | * ので、更新用と参照用を分けて、更新時の不変条件チェックを全アイテムロードすることなく実施する 19 | */ 20 | export class CartForUpdate { 21 | private static UPPER_BOUND: number = 10000; 22 | private id: CartId; 23 | constructor(id: CartId) { 24 | this.id = id; 25 | } 26 | 27 | add(productId: ProductId, quantity: Quantity, cartRepository: CartWriteRepository): void { 28 | const total = cartRepository.getItemCount(); 29 | if (total + quantity > CartForUpdate.UPPER_BOUND) { 30 | throw new Error(`商品数の上限に達しています`) 31 | } 32 | cartRepository.addItem({ 33 | productId, 34 | quantity 35 | }); 36 | } 37 | } 38 | 39 | export class Cart { 40 | private id: CartId; 41 | constructor(id: CartId) { 42 | this.id = id; 43 | } 44 | 45 | items(page: number, cartRepository: CartReadRepository) { 46 | return cartRepository.findCartItemsByPage(page); 47 | } 48 | } 49 | 50 | export interface CartWriteRepository { 51 | loadCart(userId: UserId): CartForUpdate; 52 | saveCart(cart: CartForUpdate): void; 53 | getItemCount(): number; 54 | addItem(cartItem: CartItem): void; 55 | } 56 | 57 | export interface CartReadRepository { 58 | findCartItemsByPage(userId: number): Page; 59 | } 60 | 61 | export interface ProductRepository { 62 | isNowOnSale(productId: ProductId): boolean; 63 | } 64 | 65 | type AddItemToCartUseCase = (command: AddItemToCartCommand) => void; 66 | 67 | export function addItemToCartUseCase( 68 | cartRepository: CartWriteRepository, 69 | productRepository: ProductRepository) { 70 | return (command: AddItemToCartCommand) => { 71 | const userId = UserId.parse(command.userId); 72 | const cart = cartRepository.loadCart(userId); 73 | const productId = ProductId.parse(command.productId); 74 | if (!productRepository.isNowOnSale(productId)) { 75 | throw Error(`販売が終了しました`); 76 | } 77 | const quantity = Quantity.parse(command.quantity); 78 | cart.add(productId, quantity, cartRepository); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "resolveJsonModule": true, /* Enable importing .json files. */ 39 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 40 | 41 | /* JavaScript Support */ 42 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 43 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 44 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 45 | 46 | /* Emit */ 47 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 48 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 49 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 50 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 51 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 52 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 53 | // "removeComments": true, /* Disable emitting comments. */ 54 | // "noEmit": true, /* Disable emitting files from a compilation. */ 55 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 56 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 57 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 58 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 59 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 60 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 61 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 62 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 63 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 64 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 65 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 66 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 67 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 68 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 69 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 70 | 71 | /* Interop Constraints */ 72 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 73 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 74 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 75 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 76 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 77 | 78 | /* Type Checking */ 79 | "strict": true, /* Enable all strict type-checking options. */ 80 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 81 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 82 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 83 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 84 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 85 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 86 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 87 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 88 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 89 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 90 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 91 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 92 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 93 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 94 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 95 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 96 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 97 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 98 | 99 | /* Completeness */ 100 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 101 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 102 | } 103 | } 104 | --------------------------------------------------------------------------------