├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── .travis.yml ├── .vscode └── tasks.json ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── smpte-timecode.js └── test ├── mocha.opts ├── smpte-timecode-test.html └── smpte-timecode-test.js /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages 3 | 4 | name: Node.js Package 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 16 18 | - run: npm ci 19 | - run: npm test 20 | 21 | publish-npm: 22 | needs: build 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: actions/setup-node@v3 27 | with: 28 | node-version: 16 29 | registry-url: https://registry.npmjs.org/ 30 | - run: npm ci 31 | - run: npm publish 32 | env: 33 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # nyc test coverage 20 | .nyc_output 21 | 22 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 23 | .grunt 24 | 25 | # node-waf configuration 26 | .lock-wscript 27 | 28 | # Compiled binary addons (http://nodejs.org/api/addons.html) 29 | build/Release 30 | 31 | # Dependency directories 32 | node_modules 33 | jspm_packages 34 | 35 | # Optional npm cache directory 36 | .npm 37 | 38 | # Optional REPL history 39 | .node_repl_history 40 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7" 4 | script: "npm run-script test-travis && codecov --file=coverage/lcov.info --disable=gcov" 5 | after_script: "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "command": "npm", 6 | "tasks": [ 7 | { 8 | "label": "test", 9 | "type": "shell", 10 | "args": [ 11 | "test" 12 | ], 13 | "problemMatcher": [], 14 | "group": { 15 | "_id": "build", 16 | "isDefault": false 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Crystal Computer Corp 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 | # smpte-timecode 2 | [![npm](https://img.shields.io/npm/v/smpte-timecode.svg)](http://www.npmjs.com/package/smpte-timecode) [![npm](https://img.shields.io/npm/dt/smpte-timecode.svg)](https://www.npmjs.com/package/smpte-timecode) [![npm](https://img.shields.io/npm/l/smpte-timecode.svg)]() 3 | 4 | `smpte-timecode` is a JavaScript library for operations with [SMPTE timecodes](https://en.wikipedia.org/wiki/SMPTE_timecode). 5 | 6 | ## Features 7 | 8 | - usable in browser and Node environments; 9 | - supports drop-frame and non-drop-frame codes; 10 | - instantiate timecodes from frame count, string time code or JavaScript Date() objects; 11 | - timecode arithmetics: adding frame counts and other timecodes; 12 | - support of implicit conversiont to `string` (`toString()`) and `number` (`valueOf()`); 13 | 14 | ## Usage 15 | 16 | ```javascript 17 | const Timecode = require('smpte-timecode') 18 | var t = Timecode('00:15:10;03'); 19 | t.add('00:02:30;00'); 20 | console.log(t.frameCount); 21 | t.subtract(100); //frames 22 | console.log(t.toString()); 23 | ``` 24 | 25 | ## Creating Timecode() Objects 26 | ```javascript 27 | Timecode = function (timecode, frameRate, dropFrame) {...}; 28 | ``` 29 | 30 | - `timecode`: number, string or Date 31 | - Numbers are interpreted as frame count. 32 | - Strings are expected as `"HH:MM:SS:FF"` (non-drop-frame) or 33 | `"HH:MM:SS;FF"` (drop-frame). The constructor will throw if the string contains invalid timecode, for example frame count above framerate or 0 frames in a drop-frame second. 34 | - If `Date()` is passed, it is converted to the timecode a master 35 | clock would have with a given framerate. Month, date and 36 | year discarded. 37 | 38 | - `frameRate`: number (frames per second) or Array ([numerator,denominator]), optional 39 | - if a non-integer number is passed that is near 24, 30 or 60, (i.e. 23.97 or 29.97 for example) the fractional 24000/1001, 30000/1001 or 60000/1001 rates will be assumed. 40 | - If an array is passed, the framerate is assumed to be a natural fraction, with first element the numerator and second the denominator (for example, [60000,1001]). 41 | - 30000/1001 (29.97) is assumed if the parameter is omitted. 42 | 43 | - `dropFrame`: boolean, optional 44 | whether the timecode is using drop-frame or non-drop-frame mode. 45 | If omitted, and `timecode` is a string, the drop-frame mode is determined based on 46 | the ":" or ";" characters separating the frames in the `timecode` parameter. 47 | If `timecode` parameter is not a string, drop-frame assumed for 29.97 and 59.94 framerates, non-drop-frame for all others. 48 | 49 | Examples: 50 | ```javascript 51 | var minute = new Timecode('00:01:00:00'); 52 | var eightHundredFrames = new Timecode(800,29.97,true); 53 | var nineHundredFrames = new Timecode(900,[60000,1001],true); 54 | var wallClock = new Timecode(new Date()); 55 | ``` 56 | 57 | Note: a direct call to `Timecode()` returns a `Timecode` object too, so both direct 58 | calls and instantiating with `new` return the same result: 59 | ```javascript 60 | console.log((new Timecode('00:15:00;00')).toString()); 61 | // is the same as 62 | console.log(Timecode('00:15:00;00').toString()); 63 | ``` 64 | 65 | ## Using Timecode() Objects 66 | 67 | Once a `Timecode` object is created, the following member variables are available: 68 | 69 | - `frameCount`: number, total number of frames 70 | - `frameRate`: number, framerate in FPS 71 | - `hours`: number 72 | - `minutes`: number 73 | - `seconds`: number 74 | - `frames`: number 75 | - `dropFrame`: boolean, whether timecode is drop-frame or not 76 | 77 | The `Timecode` object also provides the following member functions: 78 | 79 | - `add(x)`: Timecode, adds `x` to timecode, `x` can be a number, `Date` or `Timecode` 80 | - `subtract(x)`: Timecode, subtracts `x` from timecode, `x` can be a number, `Date` 81 | or `Timecode` 82 | - `toString()`: string, returns the timecode in "HH:MM:SS:FF" or "HH:MM:SS;FF" format 83 | - `toString('field')`: string, returns the timecode in VITC format, where timecodes above 30fps are represented as frame.field, i.e. HH:MM:SS:FF.f 84 | - `toDate()`: date, returns a `Date` object using today's date and timecode as wall clock 85 | - `valueOf()`: number, returns `this.frameCount` 86 | 87 | For more usage examples, see the unit tests. 88 | 89 | ## Running Tests 90 | To run tests, make sure you run 91 | 92 | npm ci 93 | 94 | The tests can be run in Node using: 95 | 96 | npm test 97 | npm run coverage 98 | 99 | To run the tests in a browser environment, open the `test/smpte-timecode-test.html` file 100 | in a browser. 101 | 102 | ## Update History 103 | - 1.3.6 104 | - fix for #42 - 59.94 and 29.97 non-drop-frame timecodes would not initialize properly 105 | - 1.3.5 106 | - packaging fix 107 | - 1.3.4 108 | - fix for #37 - support for framerates above 100 109 | - 1.3.3 110 | - fix for #36 - 23.976 is never a drop frame timecode. 111 | - 1.3.2 112 | - fixed to browser-based tests, documentation. 113 | - 1.3.1 114 | - Coverage tests changed to nyc 115 | - Support for fractional framerates and framerates above 60fps 116 | - 1.2.3 117 | - Fix for adding a string-based timecode to already initialized timecode with original framerate (@tommilburn) 118 | - A couple of other date conversion issues (@nkurdybakha & @74ls04) 119 | - 1.2.1 120 | - Added support for 23.976 fps framerate (@funkelodeon) 121 | - 1.2.0 122 | - Added support for 59.94 fps drop-frame expressed without fields - i.e. 00:00:00;59 is 1 frame short of a second; 123 | - Added `.ToString('field')` output in HH:MM:SS;FF.f format; 124 | - 1.1.0 125 | - Fixed the problem with Timecode.add(0) subtracting the frameCount for drop frame timecodes 126 | 127 | ## Credits 128 | - [https://www.npmjs.com/package/timecode](https://www.npmjs.com/package/timecode) 129 | NPM module, which in the end I decided to rewrite. The things I needed would have 130 | been breaking changes for anyone who used it. 131 | - [http://andrewduncan.net/timecodes/](http://andrewduncan.net/timecodes/) by Andrew Duncan 132 | 133 | ## Legal 134 | License: MIT 135 | 136 | Copyright © 2023 LTN Global Communications, Inc. [http://www.ltnglobal.com](http://www.ltnglobal.com)
137 | Copyright © 2017 Crystal Computer Corp. [http://www.crystalcc.com](http://www.crystalcc.com) 138 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "smpte-timecode", 3 | "version": "1.2.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "smpte-timecode", 9 | "version": "1.2.3", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "expect.js": "^0.3.1", 13 | "lodash.isequal": "^4.5.0", 14 | "mocha": "^10.2.0", 15 | "nyc": "^15.1.0", 16 | "sinon": "^7.1.1" 17 | } 18 | }, 19 | "node_modules/@ampproject/remapping": { 20 | "version": "2.2.0", 21 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 22 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 23 | "dev": true, 24 | "dependencies": { 25 | "@jridgewell/gen-mapping": "^0.1.0", 26 | "@jridgewell/trace-mapping": "^0.3.9" 27 | }, 28 | "engines": { 29 | "node": ">=6.0.0" 30 | } 31 | }, 32 | "node_modules/@babel/code-frame": { 33 | "version": "7.18.6", 34 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 35 | "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 36 | "dev": true, 37 | "dependencies": { 38 | "@babel/highlight": "^7.18.6" 39 | }, 40 | "engines": { 41 | "node": ">=6.9.0" 42 | } 43 | }, 44 | "node_modules/@babel/compat-data": { 45 | "version": "7.20.10", 46 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", 47 | "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", 48 | "dev": true, 49 | "engines": { 50 | "node": ">=6.9.0" 51 | } 52 | }, 53 | "node_modules/@babel/core": { 54 | "version": "7.20.7", 55 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", 56 | "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", 57 | "dev": true, 58 | "dependencies": { 59 | "@ampproject/remapping": "^2.1.0", 60 | "@babel/code-frame": "^7.18.6", 61 | "@babel/generator": "^7.20.7", 62 | "@babel/helper-compilation-targets": "^7.20.7", 63 | "@babel/helper-module-transforms": "^7.20.7", 64 | "@babel/helpers": "^7.20.7", 65 | "@babel/parser": "^7.20.7", 66 | "@babel/template": "^7.20.7", 67 | "@babel/traverse": "^7.20.7", 68 | "@babel/types": "^7.20.7", 69 | "convert-source-map": "^1.7.0", 70 | "debug": "^4.1.0", 71 | "gensync": "^1.0.0-beta.2", 72 | "json5": "^2.2.1", 73 | "semver": "^6.3.0" 74 | }, 75 | "engines": { 76 | "node": ">=6.9.0" 77 | }, 78 | "funding": { 79 | "type": "opencollective", 80 | "url": "https://opencollective.com/babel" 81 | } 82 | }, 83 | "node_modules/@babel/generator": { 84 | "version": "7.20.7", 85 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", 86 | "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", 87 | "dev": true, 88 | "dependencies": { 89 | "@babel/types": "^7.20.7", 90 | "@jridgewell/gen-mapping": "^0.3.2", 91 | "jsesc": "^2.5.1" 92 | }, 93 | "engines": { 94 | "node": ">=6.9.0" 95 | } 96 | }, 97 | "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 98 | "version": "0.3.2", 99 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 100 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 101 | "dev": true, 102 | "dependencies": { 103 | "@jridgewell/set-array": "^1.0.1", 104 | "@jridgewell/sourcemap-codec": "^1.4.10", 105 | "@jridgewell/trace-mapping": "^0.3.9" 106 | }, 107 | "engines": { 108 | "node": ">=6.0.0" 109 | } 110 | }, 111 | "node_modules/@babel/helper-compilation-targets": { 112 | "version": "7.20.7", 113 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", 114 | "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", 115 | "dev": true, 116 | "dependencies": { 117 | "@babel/compat-data": "^7.20.5", 118 | "@babel/helper-validator-option": "^7.18.6", 119 | "browserslist": "^4.21.3", 120 | "lru-cache": "^5.1.1", 121 | "semver": "^6.3.0" 122 | }, 123 | "engines": { 124 | "node": ">=6.9.0" 125 | }, 126 | "peerDependencies": { 127 | "@babel/core": "^7.0.0" 128 | } 129 | }, 130 | "node_modules/@babel/helper-environment-visitor": { 131 | "version": "7.18.9", 132 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 133 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 134 | "dev": true, 135 | "engines": { 136 | "node": ">=6.9.0" 137 | } 138 | }, 139 | "node_modules/@babel/helper-function-name": { 140 | "version": "7.19.0", 141 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", 142 | "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", 143 | "dev": true, 144 | "dependencies": { 145 | "@babel/template": "^7.18.10", 146 | "@babel/types": "^7.19.0" 147 | }, 148 | "engines": { 149 | "node": ">=6.9.0" 150 | } 151 | }, 152 | "node_modules/@babel/helper-hoist-variables": { 153 | "version": "7.18.6", 154 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 155 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 156 | "dev": true, 157 | "dependencies": { 158 | "@babel/types": "^7.18.6" 159 | }, 160 | "engines": { 161 | "node": ">=6.9.0" 162 | } 163 | }, 164 | "node_modules/@babel/helper-module-imports": { 165 | "version": "7.18.6", 166 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 167 | "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 168 | "dev": true, 169 | "dependencies": { 170 | "@babel/types": "^7.18.6" 171 | }, 172 | "engines": { 173 | "node": ">=6.9.0" 174 | } 175 | }, 176 | "node_modules/@babel/helper-module-transforms": { 177 | "version": "7.20.11", 178 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", 179 | "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", 180 | "dev": true, 181 | "dependencies": { 182 | "@babel/helper-environment-visitor": "^7.18.9", 183 | "@babel/helper-module-imports": "^7.18.6", 184 | "@babel/helper-simple-access": "^7.20.2", 185 | "@babel/helper-split-export-declaration": "^7.18.6", 186 | "@babel/helper-validator-identifier": "^7.19.1", 187 | "@babel/template": "^7.20.7", 188 | "@babel/traverse": "^7.20.10", 189 | "@babel/types": "^7.20.7" 190 | }, 191 | "engines": { 192 | "node": ">=6.9.0" 193 | } 194 | }, 195 | "node_modules/@babel/helper-simple-access": { 196 | "version": "7.20.2", 197 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", 198 | "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", 199 | "dev": true, 200 | "dependencies": { 201 | "@babel/types": "^7.20.2" 202 | }, 203 | "engines": { 204 | "node": ">=6.9.0" 205 | } 206 | }, 207 | "node_modules/@babel/helper-split-export-declaration": { 208 | "version": "7.18.6", 209 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 210 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 211 | "dev": true, 212 | "dependencies": { 213 | "@babel/types": "^7.18.6" 214 | }, 215 | "engines": { 216 | "node": ">=6.9.0" 217 | } 218 | }, 219 | "node_modules/@babel/helper-string-parser": { 220 | "version": "7.19.4", 221 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 222 | "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 223 | "dev": true, 224 | "engines": { 225 | "node": ">=6.9.0" 226 | } 227 | }, 228 | "node_modules/@babel/helper-validator-identifier": { 229 | "version": "7.19.1", 230 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 231 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 232 | "dev": true, 233 | "engines": { 234 | "node": ">=6.9.0" 235 | } 236 | }, 237 | "node_modules/@babel/helper-validator-option": { 238 | "version": "7.18.6", 239 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", 240 | "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", 241 | "dev": true, 242 | "engines": { 243 | "node": ">=6.9.0" 244 | } 245 | }, 246 | "node_modules/@babel/helpers": { 247 | "version": "7.20.7", 248 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", 249 | "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", 250 | "dev": true, 251 | "dependencies": { 252 | "@babel/template": "^7.20.7", 253 | "@babel/traverse": "^7.20.7", 254 | "@babel/types": "^7.20.7" 255 | }, 256 | "engines": { 257 | "node": ">=6.9.0" 258 | } 259 | }, 260 | "node_modules/@babel/highlight": { 261 | "version": "7.18.6", 262 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 263 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 264 | "dev": true, 265 | "dependencies": { 266 | "@babel/helper-validator-identifier": "^7.18.6", 267 | "chalk": "^2.0.0", 268 | "js-tokens": "^4.0.0" 269 | }, 270 | "engines": { 271 | "node": ">=6.9.0" 272 | } 273 | }, 274 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 275 | "version": "3.2.1", 276 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 277 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 278 | "dev": true, 279 | "dependencies": { 280 | "color-convert": "^1.9.0" 281 | }, 282 | "engines": { 283 | "node": ">=4" 284 | } 285 | }, 286 | "node_modules/@babel/highlight/node_modules/chalk": { 287 | "version": "2.4.2", 288 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 289 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 290 | "dev": true, 291 | "dependencies": { 292 | "ansi-styles": "^3.2.1", 293 | "escape-string-regexp": "^1.0.5", 294 | "supports-color": "^5.3.0" 295 | }, 296 | "engines": { 297 | "node": ">=4" 298 | } 299 | }, 300 | "node_modules/@babel/highlight/node_modules/color-convert": { 301 | "version": "1.9.3", 302 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 303 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 304 | "dev": true, 305 | "dependencies": { 306 | "color-name": "1.1.3" 307 | } 308 | }, 309 | "node_modules/@babel/highlight/node_modules/color-name": { 310 | "version": "1.1.3", 311 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 312 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 313 | "dev": true 314 | }, 315 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 316 | "version": "1.0.5", 317 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 318 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 319 | "dev": true, 320 | "engines": { 321 | "node": ">=0.8.0" 322 | } 323 | }, 324 | "node_modules/@babel/highlight/node_modules/has-flag": { 325 | "version": "3.0.0", 326 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 327 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 328 | "dev": true, 329 | "engines": { 330 | "node": ">=4" 331 | } 332 | }, 333 | "node_modules/@babel/highlight/node_modules/supports-color": { 334 | "version": "5.5.0", 335 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 336 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 337 | "dev": true, 338 | "dependencies": { 339 | "has-flag": "^3.0.0" 340 | }, 341 | "engines": { 342 | "node": ">=4" 343 | } 344 | }, 345 | "node_modules/@babel/parser": { 346 | "version": "7.20.7", 347 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", 348 | "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", 349 | "dev": true, 350 | "bin": { 351 | "parser": "bin/babel-parser.js" 352 | }, 353 | "engines": { 354 | "node": ">=6.0.0" 355 | } 356 | }, 357 | "node_modules/@babel/template": { 358 | "version": "7.20.7", 359 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", 360 | "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", 361 | "dev": true, 362 | "dependencies": { 363 | "@babel/code-frame": "^7.18.6", 364 | "@babel/parser": "^7.20.7", 365 | "@babel/types": "^7.20.7" 366 | }, 367 | "engines": { 368 | "node": ">=6.9.0" 369 | } 370 | }, 371 | "node_modules/@babel/traverse": { 372 | "version": "7.20.10", 373 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", 374 | "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", 375 | "dev": true, 376 | "dependencies": { 377 | "@babel/code-frame": "^7.18.6", 378 | "@babel/generator": "^7.20.7", 379 | "@babel/helper-environment-visitor": "^7.18.9", 380 | "@babel/helper-function-name": "^7.19.0", 381 | "@babel/helper-hoist-variables": "^7.18.6", 382 | "@babel/helper-split-export-declaration": "^7.18.6", 383 | "@babel/parser": "^7.20.7", 384 | "@babel/types": "^7.20.7", 385 | "debug": "^4.1.0", 386 | "globals": "^11.1.0" 387 | }, 388 | "engines": { 389 | "node": ">=6.9.0" 390 | } 391 | }, 392 | "node_modules/@babel/types": { 393 | "version": "7.20.7", 394 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", 395 | "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", 396 | "dev": true, 397 | "dependencies": { 398 | "@babel/helper-string-parser": "^7.19.4", 399 | "@babel/helper-validator-identifier": "^7.19.1", 400 | "to-fast-properties": "^2.0.0" 401 | }, 402 | "engines": { 403 | "node": ">=6.9.0" 404 | } 405 | }, 406 | "node_modules/@istanbuljs/load-nyc-config": { 407 | "version": "1.1.0", 408 | "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", 409 | "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", 410 | "dev": true, 411 | "dependencies": { 412 | "camelcase": "^5.3.1", 413 | "find-up": "^4.1.0", 414 | "get-package-type": "^0.1.0", 415 | "js-yaml": "^3.13.1", 416 | "resolve-from": "^5.0.0" 417 | }, 418 | "engines": { 419 | "node": ">=8" 420 | } 421 | }, 422 | "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { 423 | "version": "1.0.10", 424 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 425 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 426 | "dev": true, 427 | "dependencies": { 428 | "sprintf-js": "~1.0.2" 429 | } 430 | }, 431 | "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { 432 | "version": "4.1.0", 433 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 434 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 435 | "dev": true, 436 | "dependencies": { 437 | "locate-path": "^5.0.0", 438 | "path-exists": "^4.0.0" 439 | }, 440 | "engines": { 441 | "node": ">=8" 442 | } 443 | }, 444 | "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { 445 | "version": "3.14.1", 446 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 447 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 448 | "dev": true, 449 | "dependencies": { 450 | "argparse": "^1.0.7", 451 | "esprima": "^4.0.0" 452 | }, 453 | "bin": { 454 | "js-yaml": "bin/js-yaml.js" 455 | } 456 | }, 457 | "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { 458 | "version": "5.0.0", 459 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 460 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 461 | "dev": true, 462 | "dependencies": { 463 | "p-locate": "^4.1.0" 464 | }, 465 | "engines": { 466 | "node": ">=8" 467 | } 468 | }, 469 | "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { 470 | "version": "2.3.0", 471 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 472 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 473 | "dev": true, 474 | "dependencies": { 475 | "p-try": "^2.0.0" 476 | }, 477 | "engines": { 478 | "node": ">=6" 479 | }, 480 | "funding": { 481 | "url": "https://github.com/sponsors/sindresorhus" 482 | } 483 | }, 484 | "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { 485 | "version": "4.1.0", 486 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 487 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 488 | "dev": true, 489 | "dependencies": { 490 | "p-limit": "^2.2.0" 491 | }, 492 | "engines": { 493 | "node": ">=8" 494 | } 495 | }, 496 | "node_modules/@istanbuljs/schema": { 497 | "version": "0.1.3", 498 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 499 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 500 | "dev": true, 501 | "engines": { 502 | "node": ">=8" 503 | } 504 | }, 505 | "node_modules/@jridgewell/gen-mapping": { 506 | "version": "0.1.1", 507 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 508 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 509 | "dev": true, 510 | "dependencies": { 511 | "@jridgewell/set-array": "^1.0.0", 512 | "@jridgewell/sourcemap-codec": "^1.4.10" 513 | }, 514 | "engines": { 515 | "node": ">=6.0.0" 516 | } 517 | }, 518 | "node_modules/@jridgewell/resolve-uri": { 519 | "version": "3.1.0", 520 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 521 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 522 | "dev": true, 523 | "engines": { 524 | "node": ">=6.0.0" 525 | } 526 | }, 527 | "node_modules/@jridgewell/set-array": { 528 | "version": "1.1.2", 529 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 530 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 531 | "dev": true, 532 | "engines": { 533 | "node": ">=6.0.0" 534 | } 535 | }, 536 | "node_modules/@jridgewell/sourcemap-codec": { 537 | "version": "1.4.14", 538 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 539 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 540 | "dev": true 541 | }, 542 | "node_modules/@jridgewell/trace-mapping": { 543 | "version": "0.3.17", 544 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 545 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 546 | "dev": true, 547 | "dependencies": { 548 | "@jridgewell/resolve-uri": "3.1.0", 549 | "@jridgewell/sourcemap-codec": "1.4.14" 550 | } 551 | }, 552 | "node_modules/@sinonjs/commons": { 553 | "version": "1.8.6", 554 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", 555 | "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", 556 | "dev": true, 557 | "dependencies": { 558 | "type-detect": "4.0.8" 559 | } 560 | }, 561 | "node_modules/@sinonjs/formatio": { 562 | "version": "3.2.2", 563 | "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", 564 | "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", 565 | "dev": true, 566 | "dependencies": { 567 | "@sinonjs/commons": "^1", 568 | "@sinonjs/samsam": "^3.1.0" 569 | } 570 | }, 571 | "node_modules/@sinonjs/samsam": { 572 | "version": "3.3.3", 573 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", 574 | "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", 575 | "dev": true, 576 | "dependencies": { 577 | "@sinonjs/commons": "^1.3.0", 578 | "array-from": "^2.1.1", 579 | "lodash": "^4.17.15" 580 | } 581 | }, 582 | "node_modules/@sinonjs/text-encoding": { 583 | "version": "0.7.2", 584 | "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", 585 | "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", 586 | "dev": true 587 | }, 588 | "node_modules/aggregate-error": { 589 | "version": "3.1.0", 590 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 591 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 592 | "dev": true, 593 | "dependencies": { 594 | "clean-stack": "^2.0.0", 595 | "indent-string": "^4.0.0" 596 | }, 597 | "engines": { 598 | "node": ">=8" 599 | } 600 | }, 601 | "node_modules/ansi-colors": { 602 | "version": "4.1.1", 603 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 604 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 605 | "dev": true, 606 | "engines": { 607 | "node": ">=6" 608 | } 609 | }, 610 | "node_modules/ansi-regex": { 611 | "version": "5.0.1", 612 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 613 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 614 | "dev": true, 615 | "engines": { 616 | "node": ">=8" 617 | } 618 | }, 619 | "node_modules/ansi-styles": { 620 | "version": "4.3.0", 621 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 622 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 623 | "dev": true, 624 | "dependencies": { 625 | "color-convert": "^2.0.1" 626 | }, 627 | "engines": { 628 | "node": ">=8" 629 | }, 630 | "funding": { 631 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 632 | } 633 | }, 634 | "node_modules/anymatch": { 635 | "version": "3.1.3", 636 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 637 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 638 | "dev": true, 639 | "dependencies": { 640 | "normalize-path": "^3.0.0", 641 | "picomatch": "^2.0.4" 642 | }, 643 | "engines": { 644 | "node": ">= 8" 645 | } 646 | }, 647 | "node_modules/append-transform": { 648 | "version": "2.0.0", 649 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", 650 | "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", 651 | "dev": true, 652 | "dependencies": { 653 | "default-require-extensions": "^3.0.0" 654 | }, 655 | "engines": { 656 | "node": ">=8" 657 | } 658 | }, 659 | "node_modules/archy": { 660 | "version": "1.0.0", 661 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 662 | "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", 663 | "dev": true 664 | }, 665 | "node_modules/argparse": { 666 | "version": "2.0.1", 667 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 668 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 669 | "dev": true 670 | }, 671 | "node_modules/array-from": { 672 | "version": "2.1.1", 673 | "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", 674 | "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", 675 | "dev": true 676 | }, 677 | "node_modules/balanced-match": { 678 | "version": "1.0.2", 679 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 680 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 681 | "dev": true 682 | }, 683 | "node_modules/binary-extensions": { 684 | "version": "2.2.0", 685 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 686 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 687 | "dev": true, 688 | "engines": { 689 | "node": ">=8" 690 | } 691 | }, 692 | "node_modules/brace-expansion": { 693 | "version": "2.0.1", 694 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 695 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 696 | "dev": true, 697 | "dependencies": { 698 | "balanced-match": "^1.0.0" 699 | } 700 | }, 701 | "node_modules/braces": { 702 | "version": "3.0.2", 703 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 704 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 705 | "dev": true, 706 | "dependencies": { 707 | "fill-range": "^7.0.1" 708 | }, 709 | "engines": { 710 | "node": ">=8" 711 | } 712 | }, 713 | "node_modules/browser-stdout": { 714 | "version": "1.3.1", 715 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 716 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 717 | "dev": true 718 | }, 719 | "node_modules/browserslist": { 720 | "version": "4.21.4", 721 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 722 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 723 | "dev": true, 724 | "funding": [ 725 | { 726 | "type": "opencollective", 727 | "url": "https://opencollective.com/browserslist" 728 | }, 729 | { 730 | "type": "tidelift", 731 | "url": "https://tidelift.com/funding/github/npm/browserslist" 732 | } 733 | ], 734 | "dependencies": { 735 | "caniuse-lite": "^1.0.30001400", 736 | "electron-to-chromium": "^1.4.251", 737 | "node-releases": "^2.0.6", 738 | "update-browserslist-db": "^1.0.9" 739 | }, 740 | "bin": { 741 | "browserslist": "cli.js" 742 | }, 743 | "engines": { 744 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 745 | } 746 | }, 747 | "node_modules/caching-transform": { 748 | "version": "4.0.0", 749 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", 750 | "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", 751 | "dev": true, 752 | "dependencies": { 753 | "hasha": "^5.0.0", 754 | "make-dir": "^3.0.0", 755 | "package-hash": "^4.0.0", 756 | "write-file-atomic": "^3.0.0" 757 | }, 758 | "engines": { 759 | "node": ">=8" 760 | } 761 | }, 762 | "node_modules/camelcase": { 763 | "version": "5.3.1", 764 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 765 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 766 | "dev": true, 767 | "engines": { 768 | "node": ">=6" 769 | } 770 | }, 771 | "node_modules/caniuse-lite": { 772 | "version": "1.0.30001441", 773 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", 774 | "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", 775 | "dev": true, 776 | "funding": [ 777 | { 778 | "type": "opencollective", 779 | "url": "https://opencollective.com/browserslist" 780 | }, 781 | { 782 | "type": "tidelift", 783 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 784 | } 785 | ] 786 | }, 787 | "node_modules/chalk": { 788 | "version": "4.1.2", 789 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 790 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 791 | "dev": true, 792 | "dependencies": { 793 | "ansi-styles": "^4.1.0", 794 | "supports-color": "^7.1.0" 795 | }, 796 | "engines": { 797 | "node": ">=10" 798 | }, 799 | "funding": { 800 | "url": "https://github.com/chalk/chalk?sponsor=1" 801 | } 802 | }, 803 | "node_modules/chalk/node_modules/supports-color": { 804 | "version": "7.2.0", 805 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 806 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 807 | "dev": true, 808 | "dependencies": { 809 | "has-flag": "^4.0.0" 810 | }, 811 | "engines": { 812 | "node": ">=8" 813 | } 814 | }, 815 | "node_modules/chokidar": { 816 | "version": "3.5.3", 817 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 818 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 819 | "dev": true, 820 | "funding": [ 821 | { 822 | "type": "individual", 823 | "url": "https://paulmillr.com/funding/" 824 | } 825 | ], 826 | "dependencies": { 827 | "anymatch": "~3.1.2", 828 | "braces": "~3.0.2", 829 | "glob-parent": "~5.1.2", 830 | "is-binary-path": "~2.1.0", 831 | "is-glob": "~4.0.1", 832 | "normalize-path": "~3.0.0", 833 | "readdirp": "~3.6.0" 834 | }, 835 | "engines": { 836 | "node": ">= 8.10.0" 837 | }, 838 | "optionalDependencies": { 839 | "fsevents": "~2.3.2" 840 | } 841 | }, 842 | "node_modules/clean-stack": { 843 | "version": "2.2.0", 844 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 845 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 846 | "dev": true, 847 | "engines": { 848 | "node": ">=6" 849 | } 850 | }, 851 | "node_modules/cliui": { 852 | "version": "7.0.4", 853 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 854 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 855 | "dev": true, 856 | "dependencies": { 857 | "string-width": "^4.2.0", 858 | "strip-ansi": "^6.0.0", 859 | "wrap-ansi": "^7.0.0" 860 | } 861 | }, 862 | "node_modules/color-convert": { 863 | "version": "2.0.1", 864 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 865 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 866 | "dev": true, 867 | "dependencies": { 868 | "color-name": "~1.1.4" 869 | }, 870 | "engines": { 871 | "node": ">=7.0.0" 872 | } 873 | }, 874 | "node_modules/color-name": { 875 | "version": "1.1.4", 876 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 877 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 878 | "dev": true 879 | }, 880 | "node_modules/commondir": { 881 | "version": "1.0.1", 882 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 883 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 884 | "dev": true 885 | }, 886 | "node_modules/concat-map": { 887 | "version": "0.0.1", 888 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 889 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 890 | "dev": true 891 | }, 892 | "node_modules/convert-source-map": { 893 | "version": "1.9.0", 894 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 895 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 896 | "dev": true 897 | }, 898 | "node_modules/cross-spawn": { 899 | "version": "7.0.3", 900 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 901 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 902 | "dev": true, 903 | "dependencies": { 904 | "path-key": "^3.1.0", 905 | "shebang-command": "^2.0.0", 906 | "which": "^2.0.1" 907 | }, 908 | "engines": { 909 | "node": ">= 8" 910 | } 911 | }, 912 | "node_modules/debug": { 913 | "version": "4.3.4", 914 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 915 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 916 | "dev": true, 917 | "dependencies": { 918 | "ms": "2.1.2" 919 | }, 920 | "engines": { 921 | "node": ">=6.0" 922 | }, 923 | "peerDependenciesMeta": { 924 | "supports-color": { 925 | "optional": true 926 | } 927 | } 928 | }, 929 | "node_modules/debug/node_modules/ms": { 930 | "version": "2.1.2", 931 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 932 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 933 | "dev": true 934 | }, 935 | "node_modules/decamelize": { 936 | "version": "1.2.0", 937 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 938 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 939 | "dev": true, 940 | "engines": { 941 | "node": ">=0.10.0" 942 | } 943 | }, 944 | "node_modules/default-require-extensions": { 945 | "version": "3.0.1", 946 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", 947 | "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", 948 | "dev": true, 949 | "dependencies": { 950 | "strip-bom": "^4.0.0" 951 | }, 952 | "engines": { 953 | "node": ">=8" 954 | }, 955 | "funding": { 956 | "url": "https://github.com/sponsors/sindresorhus" 957 | } 958 | }, 959 | "node_modules/diff": { 960 | "version": "5.0.0", 961 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 962 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 963 | "dev": true, 964 | "engines": { 965 | "node": ">=0.3.1" 966 | } 967 | }, 968 | "node_modules/electron-to-chromium": { 969 | "version": "1.4.284", 970 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 971 | "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 972 | "dev": true 973 | }, 974 | "node_modules/emoji-regex": { 975 | "version": "8.0.0", 976 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 977 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 978 | "dev": true 979 | }, 980 | "node_modules/es6-error": { 981 | "version": "4.1.1", 982 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 983 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", 984 | "dev": true 985 | }, 986 | "node_modules/escalade": { 987 | "version": "3.1.1", 988 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 989 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 990 | "dev": true, 991 | "engines": { 992 | "node": ">=6" 993 | } 994 | }, 995 | "node_modules/escape-string-regexp": { 996 | "version": "4.0.0", 997 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 998 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 999 | "dev": true, 1000 | "engines": { 1001 | "node": ">=10" 1002 | }, 1003 | "funding": { 1004 | "url": "https://github.com/sponsors/sindresorhus" 1005 | } 1006 | }, 1007 | "node_modules/esprima": { 1008 | "version": "4.0.1", 1009 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1010 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1011 | "dev": true, 1012 | "bin": { 1013 | "esparse": "bin/esparse.js", 1014 | "esvalidate": "bin/esvalidate.js" 1015 | }, 1016 | "engines": { 1017 | "node": ">=4" 1018 | } 1019 | }, 1020 | "node_modules/expect.js": { 1021 | "version": "0.3.1", 1022 | "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", 1023 | "integrity": "sha512-okDF/FAPEul1ZFLae4hrgpIqAeapoo5TRdcg/lD0iN9S3GWrBFIJwNezGH1DMtIz+RxU4RrFmMq7WUUvDg3J6A==", 1024 | "dev": true 1025 | }, 1026 | "node_modules/fill-range": { 1027 | "version": "7.0.1", 1028 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1029 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1030 | "dev": true, 1031 | "dependencies": { 1032 | "to-regex-range": "^5.0.1" 1033 | }, 1034 | "engines": { 1035 | "node": ">=8" 1036 | } 1037 | }, 1038 | "node_modules/find-cache-dir": { 1039 | "version": "3.3.2", 1040 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", 1041 | "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "commondir": "^1.0.1", 1045 | "make-dir": "^3.0.2", 1046 | "pkg-dir": "^4.1.0" 1047 | }, 1048 | "engines": { 1049 | "node": ">=8" 1050 | }, 1051 | "funding": { 1052 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1" 1053 | } 1054 | }, 1055 | "node_modules/find-up": { 1056 | "version": "5.0.0", 1057 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1058 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1059 | "dev": true, 1060 | "dependencies": { 1061 | "locate-path": "^6.0.0", 1062 | "path-exists": "^4.0.0" 1063 | }, 1064 | "engines": { 1065 | "node": ">=10" 1066 | }, 1067 | "funding": { 1068 | "url": "https://github.com/sponsors/sindresorhus" 1069 | } 1070 | }, 1071 | "node_modules/flat": { 1072 | "version": "5.0.2", 1073 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1074 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1075 | "dev": true, 1076 | "bin": { 1077 | "flat": "cli.js" 1078 | } 1079 | }, 1080 | "node_modules/foreground-child": { 1081 | "version": "2.0.0", 1082 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 1083 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 1084 | "dev": true, 1085 | "dependencies": { 1086 | "cross-spawn": "^7.0.0", 1087 | "signal-exit": "^3.0.2" 1088 | }, 1089 | "engines": { 1090 | "node": ">=8.0.0" 1091 | } 1092 | }, 1093 | "node_modules/fromentries": { 1094 | "version": "1.3.2", 1095 | "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", 1096 | "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", 1097 | "dev": true, 1098 | "funding": [ 1099 | { 1100 | "type": "github", 1101 | "url": "https://github.com/sponsors/feross" 1102 | }, 1103 | { 1104 | "type": "patreon", 1105 | "url": "https://www.patreon.com/feross" 1106 | }, 1107 | { 1108 | "type": "consulting", 1109 | "url": "https://feross.org/support" 1110 | } 1111 | ] 1112 | }, 1113 | "node_modules/fs.realpath": { 1114 | "version": "1.0.0", 1115 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1116 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1117 | "dev": true 1118 | }, 1119 | "node_modules/fsevents": { 1120 | "version": "2.3.2", 1121 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1122 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1123 | "dev": true, 1124 | "hasInstallScript": true, 1125 | "optional": true, 1126 | "os": [ 1127 | "darwin" 1128 | ], 1129 | "engines": { 1130 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1131 | } 1132 | }, 1133 | "node_modules/gensync": { 1134 | "version": "1.0.0-beta.2", 1135 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1136 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1137 | "dev": true, 1138 | "engines": { 1139 | "node": ">=6.9.0" 1140 | } 1141 | }, 1142 | "node_modules/get-caller-file": { 1143 | "version": "2.0.5", 1144 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1145 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1146 | "dev": true, 1147 | "engines": { 1148 | "node": "6.* || 8.* || >= 10.*" 1149 | } 1150 | }, 1151 | "node_modules/get-package-type": { 1152 | "version": "0.1.0", 1153 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 1154 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 1155 | "dev": true, 1156 | "engines": { 1157 | "node": ">=8.0.0" 1158 | } 1159 | }, 1160 | "node_modules/glob": { 1161 | "version": "7.2.0", 1162 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1163 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1164 | "dev": true, 1165 | "dependencies": { 1166 | "fs.realpath": "^1.0.0", 1167 | "inflight": "^1.0.4", 1168 | "inherits": "2", 1169 | "minimatch": "^3.0.4", 1170 | "once": "^1.3.0", 1171 | "path-is-absolute": "^1.0.0" 1172 | }, 1173 | "engines": { 1174 | "node": "*" 1175 | }, 1176 | "funding": { 1177 | "url": "https://github.com/sponsors/isaacs" 1178 | } 1179 | }, 1180 | "node_modules/glob-parent": { 1181 | "version": "5.1.2", 1182 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1183 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1184 | "dev": true, 1185 | "dependencies": { 1186 | "is-glob": "^4.0.1" 1187 | }, 1188 | "engines": { 1189 | "node": ">= 6" 1190 | } 1191 | }, 1192 | "node_modules/glob/node_modules/brace-expansion": { 1193 | "version": "1.1.11", 1194 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1195 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "balanced-match": "^1.0.0", 1199 | "concat-map": "0.0.1" 1200 | } 1201 | }, 1202 | "node_modules/glob/node_modules/minimatch": { 1203 | "version": "3.1.2", 1204 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1205 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "brace-expansion": "^1.1.7" 1209 | }, 1210 | "engines": { 1211 | "node": "*" 1212 | } 1213 | }, 1214 | "node_modules/globals": { 1215 | "version": "11.12.0", 1216 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1217 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1218 | "dev": true, 1219 | "engines": { 1220 | "node": ">=4" 1221 | } 1222 | }, 1223 | "node_modules/graceful-fs": { 1224 | "version": "4.2.10", 1225 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1226 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 1227 | "dev": true 1228 | }, 1229 | "node_modules/has-flag": { 1230 | "version": "4.0.0", 1231 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1232 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1233 | "dev": true, 1234 | "engines": { 1235 | "node": ">=8" 1236 | } 1237 | }, 1238 | "node_modules/hasha": { 1239 | "version": "5.2.2", 1240 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", 1241 | "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", 1242 | "dev": true, 1243 | "dependencies": { 1244 | "is-stream": "^2.0.0", 1245 | "type-fest": "^0.8.0" 1246 | }, 1247 | "engines": { 1248 | "node": ">=8" 1249 | }, 1250 | "funding": { 1251 | "url": "https://github.com/sponsors/sindresorhus" 1252 | } 1253 | }, 1254 | "node_modules/he": { 1255 | "version": "1.2.0", 1256 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1257 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1258 | "dev": true, 1259 | "bin": { 1260 | "he": "bin/he" 1261 | } 1262 | }, 1263 | "node_modules/html-escaper": { 1264 | "version": "2.0.2", 1265 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1266 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1267 | "dev": true 1268 | }, 1269 | "node_modules/imurmurhash": { 1270 | "version": "0.1.4", 1271 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1272 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1273 | "dev": true, 1274 | "engines": { 1275 | "node": ">=0.8.19" 1276 | } 1277 | }, 1278 | "node_modules/indent-string": { 1279 | "version": "4.0.0", 1280 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1281 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1282 | "dev": true, 1283 | "engines": { 1284 | "node": ">=8" 1285 | } 1286 | }, 1287 | "node_modules/inflight": { 1288 | "version": "1.0.6", 1289 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1290 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1291 | "dev": true, 1292 | "dependencies": { 1293 | "once": "^1.3.0", 1294 | "wrappy": "1" 1295 | } 1296 | }, 1297 | "node_modules/inherits": { 1298 | "version": "2.0.4", 1299 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1300 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1301 | "dev": true 1302 | }, 1303 | "node_modules/is-binary-path": { 1304 | "version": "2.1.0", 1305 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1306 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1307 | "dev": true, 1308 | "dependencies": { 1309 | "binary-extensions": "^2.0.0" 1310 | }, 1311 | "engines": { 1312 | "node": ">=8" 1313 | } 1314 | }, 1315 | "node_modules/is-extglob": { 1316 | "version": "2.1.1", 1317 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1318 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1319 | "dev": true, 1320 | "engines": { 1321 | "node": ">=0.10.0" 1322 | } 1323 | }, 1324 | "node_modules/is-fullwidth-code-point": { 1325 | "version": "3.0.0", 1326 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1327 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1328 | "dev": true, 1329 | "engines": { 1330 | "node": ">=8" 1331 | } 1332 | }, 1333 | "node_modules/is-glob": { 1334 | "version": "4.0.3", 1335 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1336 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1337 | "dev": true, 1338 | "dependencies": { 1339 | "is-extglob": "^2.1.1" 1340 | }, 1341 | "engines": { 1342 | "node": ">=0.10.0" 1343 | } 1344 | }, 1345 | "node_modules/is-number": { 1346 | "version": "7.0.0", 1347 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1348 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1349 | "dev": true, 1350 | "engines": { 1351 | "node": ">=0.12.0" 1352 | } 1353 | }, 1354 | "node_modules/is-plain-obj": { 1355 | "version": "2.1.0", 1356 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1357 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1358 | "dev": true, 1359 | "engines": { 1360 | "node": ">=8" 1361 | } 1362 | }, 1363 | "node_modules/is-stream": { 1364 | "version": "2.0.1", 1365 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1366 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1367 | "dev": true, 1368 | "engines": { 1369 | "node": ">=8" 1370 | }, 1371 | "funding": { 1372 | "url": "https://github.com/sponsors/sindresorhus" 1373 | } 1374 | }, 1375 | "node_modules/is-typedarray": { 1376 | "version": "1.0.0", 1377 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1378 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", 1379 | "dev": true 1380 | }, 1381 | "node_modules/is-unicode-supported": { 1382 | "version": "0.1.0", 1383 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1384 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1385 | "dev": true, 1386 | "engines": { 1387 | "node": ">=10" 1388 | }, 1389 | "funding": { 1390 | "url": "https://github.com/sponsors/sindresorhus" 1391 | } 1392 | }, 1393 | "node_modules/is-windows": { 1394 | "version": "1.0.2", 1395 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1396 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1397 | "dev": true, 1398 | "engines": { 1399 | "node": ">=0.10.0" 1400 | } 1401 | }, 1402 | "node_modules/isarray": { 1403 | "version": "0.0.1", 1404 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1405 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", 1406 | "dev": true 1407 | }, 1408 | "node_modules/isexe": { 1409 | "version": "2.0.0", 1410 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1411 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1412 | "dev": true 1413 | }, 1414 | "node_modules/istanbul-lib-coverage": { 1415 | "version": "3.2.0", 1416 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 1417 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 1418 | "dev": true, 1419 | "engines": { 1420 | "node": ">=8" 1421 | } 1422 | }, 1423 | "node_modules/istanbul-lib-hook": { 1424 | "version": "3.0.0", 1425 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", 1426 | "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", 1427 | "dev": true, 1428 | "dependencies": { 1429 | "append-transform": "^2.0.0" 1430 | }, 1431 | "engines": { 1432 | "node": ">=8" 1433 | } 1434 | }, 1435 | "node_modules/istanbul-lib-instrument": { 1436 | "version": "4.0.3", 1437 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", 1438 | "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", 1439 | "dev": true, 1440 | "dependencies": { 1441 | "@babel/core": "^7.7.5", 1442 | "@istanbuljs/schema": "^0.1.2", 1443 | "istanbul-lib-coverage": "^3.0.0", 1444 | "semver": "^6.3.0" 1445 | }, 1446 | "engines": { 1447 | "node": ">=8" 1448 | } 1449 | }, 1450 | "node_modules/istanbul-lib-processinfo": { 1451 | "version": "2.0.3", 1452 | "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", 1453 | "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", 1454 | "dev": true, 1455 | "dependencies": { 1456 | "archy": "^1.0.0", 1457 | "cross-spawn": "^7.0.3", 1458 | "istanbul-lib-coverage": "^3.2.0", 1459 | "p-map": "^3.0.0", 1460 | "rimraf": "^3.0.0", 1461 | "uuid": "^8.3.2" 1462 | }, 1463 | "engines": { 1464 | "node": ">=8" 1465 | } 1466 | }, 1467 | "node_modules/istanbul-lib-report": { 1468 | "version": "3.0.0", 1469 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1470 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "istanbul-lib-coverage": "^3.0.0", 1474 | "make-dir": "^3.0.0", 1475 | "supports-color": "^7.1.0" 1476 | }, 1477 | "engines": { 1478 | "node": ">=8" 1479 | } 1480 | }, 1481 | "node_modules/istanbul-lib-report/node_modules/supports-color": { 1482 | "version": "7.2.0", 1483 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1484 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1485 | "dev": true, 1486 | "dependencies": { 1487 | "has-flag": "^4.0.0" 1488 | }, 1489 | "engines": { 1490 | "node": ">=8" 1491 | } 1492 | }, 1493 | "node_modules/istanbul-lib-source-maps": { 1494 | "version": "4.0.1", 1495 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", 1496 | "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", 1497 | "dev": true, 1498 | "dependencies": { 1499 | "debug": "^4.1.1", 1500 | "istanbul-lib-coverage": "^3.0.0", 1501 | "source-map": "^0.6.1" 1502 | }, 1503 | "engines": { 1504 | "node": ">=10" 1505 | } 1506 | }, 1507 | "node_modules/istanbul-reports": { 1508 | "version": "3.1.5", 1509 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 1510 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 1511 | "dev": true, 1512 | "dependencies": { 1513 | "html-escaper": "^2.0.0", 1514 | "istanbul-lib-report": "^3.0.0" 1515 | }, 1516 | "engines": { 1517 | "node": ">=8" 1518 | } 1519 | }, 1520 | "node_modules/js-tokens": { 1521 | "version": "4.0.0", 1522 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1523 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1524 | "dev": true 1525 | }, 1526 | "node_modules/js-yaml": { 1527 | "version": "4.1.0", 1528 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1529 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "argparse": "^2.0.1" 1533 | }, 1534 | "bin": { 1535 | "js-yaml": "bin/js-yaml.js" 1536 | } 1537 | }, 1538 | "node_modules/jsesc": { 1539 | "version": "2.5.2", 1540 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1541 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1542 | "dev": true, 1543 | "bin": { 1544 | "jsesc": "bin/jsesc" 1545 | }, 1546 | "engines": { 1547 | "node": ">=4" 1548 | } 1549 | }, 1550 | "node_modules/json5": { 1551 | "version": "2.2.2", 1552 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", 1553 | "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", 1554 | "dev": true, 1555 | "bin": { 1556 | "json5": "lib/cli.js" 1557 | }, 1558 | "engines": { 1559 | "node": ">=6" 1560 | } 1561 | }, 1562 | "node_modules/just-extend": { 1563 | "version": "4.2.1", 1564 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", 1565 | "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", 1566 | "dev": true 1567 | }, 1568 | "node_modules/locate-path": { 1569 | "version": "6.0.0", 1570 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1571 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1572 | "dev": true, 1573 | "dependencies": { 1574 | "p-locate": "^5.0.0" 1575 | }, 1576 | "engines": { 1577 | "node": ">=10" 1578 | }, 1579 | "funding": { 1580 | "url": "https://github.com/sponsors/sindresorhus" 1581 | } 1582 | }, 1583 | "node_modules/lodash": { 1584 | "version": "4.17.21", 1585 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1586 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1587 | "dev": true 1588 | }, 1589 | "node_modules/lodash.flattendeep": { 1590 | "version": "4.4.0", 1591 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", 1592 | "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", 1593 | "dev": true 1594 | }, 1595 | "node_modules/lodash.isequal": { 1596 | "version": "4.5.0", 1597 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1598 | "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", 1599 | "dev": true 1600 | }, 1601 | "node_modules/log-symbols": { 1602 | "version": "4.1.0", 1603 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1604 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1605 | "dev": true, 1606 | "dependencies": { 1607 | "chalk": "^4.1.0", 1608 | "is-unicode-supported": "^0.1.0" 1609 | }, 1610 | "engines": { 1611 | "node": ">=10" 1612 | }, 1613 | "funding": { 1614 | "url": "https://github.com/sponsors/sindresorhus" 1615 | } 1616 | }, 1617 | "node_modules/lolex": { 1618 | "version": "4.2.0", 1619 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", 1620 | "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", 1621 | "dev": true 1622 | }, 1623 | "node_modules/lru-cache": { 1624 | "version": "5.1.1", 1625 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1626 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1627 | "dev": true, 1628 | "dependencies": { 1629 | "yallist": "^3.0.2" 1630 | } 1631 | }, 1632 | "node_modules/make-dir": { 1633 | "version": "3.1.0", 1634 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1635 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1636 | "dev": true, 1637 | "dependencies": { 1638 | "semver": "^6.0.0" 1639 | }, 1640 | "engines": { 1641 | "node": ">=8" 1642 | }, 1643 | "funding": { 1644 | "url": "https://github.com/sponsors/sindresorhus" 1645 | } 1646 | }, 1647 | "node_modules/minimatch": { 1648 | "version": "5.0.1", 1649 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1650 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1651 | "dev": true, 1652 | "dependencies": { 1653 | "brace-expansion": "^2.0.1" 1654 | }, 1655 | "engines": { 1656 | "node": ">=10" 1657 | } 1658 | }, 1659 | "node_modules/mocha": { 1660 | "version": "10.2.0", 1661 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1662 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1663 | "dev": true, 1664 | "dependencies": { 1665 | "ansi-colors": "4.1.1", 1666 | "browser-stdout": "1.3.1", 1667 | "chokidar": "3.5.3", 1668 | "debug": "4.3.4", 1669 | "diff": "5.0.0", 1670 | "escape-string-regexp": "4.0.0", 1671 | "find-up": "5.0.0", 1672 | "glob": "7.2.0", 1673 | "he": "1.2.0", 1674 | "js-yaml": "4.1.0", 1675 | "log-symbols": "4.1.0", 1676 | "minimatch": "5.0.1", 1677 | "ms": "2.1.3", 1678 | "nanoid": "3.3.3", 1679 | "serialize-javascript": "6.0.0", 1680 | "strip-json-comments": "3.1.1", 1681 | "supports-color": "8.1.1", 1682 | "workerpool": "6.2.1", 1683 | "yargs": "16.2.0", 1684 | "yargs-parser": "20.2.4", 1685 | "yargs-unparser": "2.0.0" 1686 | }, 1687 | "bin": { 1688 | "_mocha": "bin/_mocha", 1689 | "mocha": "bin/mocha.js" 1690 | }, 1691 | "engines": { 1692 | "node": ">= 14.0.0" 1693 | }, 1694 | "funding": { 1695 | "type": "opencollective", 1696 | "url": "https://opencollective.com/mochajs" 1697 | } 1698 | }, 1699 | "node_modules/ms": { 1700 | "version": "2.1.3", 1701 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1702 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1703 | "dev": true 1704 | }, 1705 | "node_modules/nanoid": { 1706 | "version": "3.3.3", 1707 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1708 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1709 | "dev": true, 1710 | "bin": { 1711 | "nanoid": "bin/nanoid.cjs" 1712 | }, 1713 | "engines": { 1714 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1715 | } 1716 | }, 1717 | "node_modules/nise": { 1718 | "version": "1.5.3", 1719 | "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", 1720 | "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", 1721 | "dev": true, 1722 | "dependencies": { 1723 | "@sinonjs/formatio": "^3.2.1", 1724 | "@sinonjs/text-encoding": "^0.7.1", 1725 | "just-extend": "^4.0.2", 1726 | "lolex": "^5.0.1", 1727 | "path-to-regexp": "^1.7.0" 1728 | } 1729 | }, 1730 | "node_modules/nise/node_modules/lolex": { 1731 | "version": "5.1.2", 1732 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", 1733 | "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", 1734 | "dev": true, 1735 | "dependencies": { 1736 | "@sinonjs/commons": "^1.7.0" 1737 | } 1738 | }, 1739 | "node_modules/node-preload": { 1740 | "version": "0.2.1", 1741 | "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", 1742 | "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", 1743 | "dev": true, 1744 | "dependencies": { 1745 | "process-on-spawn": "^1.0.0" 1746 | }, 1747 | "engines": { 1748 | "node": ">=8" 1749 | } 1750 | }, 1751 | "node_modules/node-releases": { 1752 | "version": "2.0.8", 1753 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", 1754 | "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", 1755 | "dev": true 1756 | }, 1757 | "node_modules/normalize-path": { 1758 | "version": "3.0.0", 1759 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1760 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1761 | "dev": true, 1762 | "engines": { 1763 | "node": ">=0.10.0" 1764 | } 1765 | }, 1766 | "node_modules/nyc": { 1767 | "version": "15.1.0", 1768 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", 1769 | "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", 1770 | "dev": true, 1771 | "dependencies": { 1772 | "@istanbuljs/load-nyc-config": "^1.0.0", 1773 | "@istanbuljs/schema": "^0.1.2", 1774 | "caching-transform": "^4.0.0", 1775 | "convert-source-map": "^1.7.0", 1776 | "decamelize": "^1.2.0", 1777 | "find-cache-dir": "^3.2.0", 1778 | "find-up": "^4.1.0", 1779 | "foreground-child": "^2.0.0", 1780 | "get-package-type": "^0.1.0", 1781 | "glob": "^7.1.6", 1782 | "istanbul-lib-coverage": "^3.0.0", 1783 | "istanbul-lib-hook": "^3.0.0", 1784 | "istanbul-lib-instrument": "^4.0.0", 1785 | "istanbul-lib-processinfo": "^2.0.2", 1786 | "istanbul-lib-report": "^3.0.0", 1787 | "istanbul-lib-source-maps": "^4.0.0", 1788 | "istanbul-reports": "^3.0.2", 1789 | "make-dir": "^3.0.0", 1790 | "node-preload": "^0.2.1", 1791 | "p-map": "^3.0.0", 1792 | "process-on-spawn": "^1.0.0", 1793 | "resolve-from": "^5.0.0", 1794 | "rimraf": "^3.0.0", 1795 | "signal-exit": "^3.0.2", 1796 | "spawn-wrap": "^2.0.0", 1797 | "test-exclude": "^6.0.0", 1798 | "yargs": "^15.0.2" 1799 | }, 1800 | "bin": { 1801 | "nyc": "bin/nyc.js" 1802 | }, 1803 | "engines": { 1804 | "node": ">=8.9" 1805 | } 1806 | }, 1807 | "node_modules/nyc/node_modules/cliui": { 1808 | "version": "6.0.0", 1809 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 1810 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 1811 | "dev": true, 1812 | "dependencies": { 1813 | "string-width": "^4.2.0", 1814 | "strip-ansi": "^6.0.0", 1815 | "wrap-ansi": "^6.2.0" 1816 | } 1817 | }, 1818 | "node_modules/nyc/node_modules/find-up": { 1819 | "version": "4.1.0", 1820 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1821 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1822 | "dev": true, 1823 | "dependencies": { 1824 | "locate-path": "^5.0.0", 1825 | "path-exists": "^4.0.0" 1826 | }, 1827 | "engines": { 1828 | "node": ">=8" 1829 | } 1830 | }, 1831 | "node_modules/nyc/node_modules/locate-path": { 1832 | "version": "5.0.0", 1833 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1834 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1835 | "dev": true, 1836 | "dependencies": { 1837 | "p-locate": "^4.1.0" 1838 | }, 1839 | "engines": { 1840 | "node": ">=8" 1841 | } 1842 | }, 1843 | "node_modules/nyc/node_modules/p-limit": { 1844 | "version": "2.3.0", 1845 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1846 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1847 | "dev": true, 1848 | "dependencies": { 1849 | "p-try": "^2.0.0" 1850 | }, 1851 | "engines": { 1852 | "node": ">=6" 1853 | }, 1854 | "funding": { 1855 | "url": "https://github.com/sponsors/sindresorhus" 1856 | } 1857 | }, 1858 | "node_modules/nyc/node_modules/p-locate": { 1859 | "version": "4.1.0", 1860 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1861 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1862 | "dev": true, 1863 | "dependencies": { 1864 | "p-limit": "^2.2.0" 1865 | }, 1866 | "engines": { 1867 | "node": ">=8" 1868 | } 1869 | }, 1870 | "node_modules/nyc/node_modules/wrap-ansi": { 1871 | "version": "6.2.0", 1872 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 1873 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 1874 | "dev": true, 1875 | "dependencies": { 1876 | "ansi-styles": "^4.0.0", 1877 | "string-width": "^4.1.0", 1878 | "strip-ansi": "^6.0.0" 1879 | }, 1880 | "engines": { 1881 | "node": ">=8" 1882 | } 1883 | }, 1884 | "node_modules/nyc/node_modules/y18n": { 1885 | "version": "4.0.3", 1886 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 1887 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 1888 | "dev": true 1889 | }, 1890 | "node_modules/nyc/node_modules/yargs": { 1891 | "version": "15.4.1", 1892 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 1893 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 1894 | "dev": true, 1895 | "dependencies": { 1896 | "cliui": "^6.0.0", 1897 | "decamelize": "^1.2.0", 1898 | "find-up": "^4.1.0", 1899 | "get-caller-file": "^2.0.1", 1900 | "require-directory": "^2.1.1", 1901 | "require-main-filename": "^2.0.0", 1902 | "set-blocking": "^2.0.0", 1903 | "string-width": "^4.2.0", 1904 | "which-module": "^2.0.0", 1905 | "y18n": "^4.0.0", 1906 | "yargs-parser": "^18.1.2" 1907 | }, 1908 | "engines": { 1909 | "node": ">=8" 1910 | } 1911 | }, 1912 | "node_modules/nyc/node_modules/yargs-parser": { 1913 | "version": "18.1.3", 1914 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 1915 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 1916 | "dev": true, 1917 | "dependencies": { 1918 | "camelcase": "^5.0.0", 1919 | "decamelize": "^1.2.0" 1920 | }, 1921 | "engines": { 1922 | "node": ">=6" 1923 | } 1924 | }, 1925 | "node_modules/once": { 1926 | "version": "1.4.0", 1927 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1928 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1929 | "dev": true, 1930 | "dependencies": { 1931 | "wrappy": "1" 1932 | } 1933 | }, 1934 | "node_modules/p-limit": { 1935 | "version": "3.1.0", 1936 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1937 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1938 | "dev": true, 1939 | "dependencies": { 1940 | "yocto-queue": "^0.1.0" 1941 | }, 1942 | "engines": { 1943 | "node": ">=10" 1944 | }, 1945 | "funding": { 1946 | "url": "https://github.com/sponsors/sindresorhus" 1947 | } 1948 | }, 1949 | "node_modules/p-locate": { 1950 | "version": "5.0.0", 1951 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1952 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1953 | "dev": true, 1954 | "dependencies": { 1955 | "p-limit": "^3.0.2" 1956 | }, 1957 | "engines": { 1958 | "node": ">=10" 1959 | }, 1960 | "funding": { 1961 | "url": "https://github.com/sponsors/sindresorhus" 1962 | } 1963 | }, 1964 | "node_modules/p-map": { 1965 | "version": "3.0.0", 1966 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", 1967 | "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", 1968 | "dev": true, 1969 | "dependencies": { 1970 | "aggregate-error": "^3.0.0" 1971 | }, 1972 | "engines": { 1973 | "node": ">=8" 1974 | } 1975 | }, 1976 | "node_modules/p-try": { 1977 | "version": "2.2.0", 1978 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1979 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1980 | "dev": true, 1981 | "engines": { 1982 | "node": ">=6" 1983 | } 1984 | }, 1985 | "node_modules/package-hash": { 1986 | "version": "4.0.0", 1987 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", 1988 | "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", 1989 | "dev": true, 1990 | "dependencies": { 1991 | "graceful-fs": "^4.1.15", 1992 | "hasha": "^5.0.0", 1993 | "lodash.flattendeep": "^4.4.0", 1994 | "release-zalgo": "^1.0.0" 1995 | }, 1996 | "engines": { 1997 | "node": ">=8" 1998 | } 1999 | }, 2000 | "node_modules/path-exists": { 2001 | "version": "4.0.0", 2002 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2003 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2004 | "dev": true, 2005 | "engines": { 2006 | "node": ">=8" 2007 | } 2008 | }, 2009 | "node_modules/path-is-absolute": { 2010 | "version": "1.0.1", 2011 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2012 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2013 | "dev": true, 2014 | "engines": { 2015 | "node": ">=0.10.0" 2016 | } 2017 | }, 2018 | "node_modules/path-key": { 2019 | "version": "3.1.1", 2020 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2021 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2022 | "dev": true, 2023 | "engines": { 2024 | "node": ">=8" 2025 | } 2026 | }, 2027 | "node_modules/path-to-regexp": { 2028 | "version": "1.8.0", 2029 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 2030 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 2031 | "dev": true, 2032 | "dependencies": { 2033 | "isarray": "0.0.1" 2034 | } 2035 | }, 2036 | "node_modules/picocolors": { 2037 | "version": "1.0.0", 2038 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2039 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2040 | "dev": true 2041 | }, 2042 | "node_modules/picomatch": { 2043 | "version": "2.3.1", 2044 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2045 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2046 | "dev": true, 2047 | "engines": { 2048 | "node": ">=8.6" 2049 | }, 2050 | "funding": { 2051 | "url": "https://github.com/sponsors/jonschlinkert" 2052 | } 2053 | }, 2054 | "node_modules/pkg-dir": { 2055 | "version": "4.2.0", 2056 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2057 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2058 | "dev": true, 2059 | "dependencies": { 2060 | "find-up": "^4.0.0" 2061 | }, 2062 | "engines": { 2063 | "node": ">=8" 2064 | } 2065 | }, 2066 | "node_modules/pkg-dir/node_modules/find-up": { 2067 | "version": "4.1.0", 2068 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2069 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2070 | "dev": true, 2071 | "dependencies": { 2072 | "locate-path": "^5.0.0", 2073 | "path-exists": "^4.0.0" 2074 | }, 2075 | "engines": { 2076 | "node": ">=8" 2077 | } 2078 | }, 2079 | "node_modules/pkg-dir/node_modules/locate-path": { 2080 | "version": "5.0.0", 2081 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2082 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2083 | "dev": true, 2084 | "dependencies": { 2085 | "p-locate": "^4.1.0" 2086 | }, 2087 | "engines": { 2088 | "node": ">=8" 2089 | } 2090 | }, 2091 | "node_modules/pkg-dir/node_modules/p-limit": { 2092 | "version": "2.3.0", 2093 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2094 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2095 | "dev": true, 2096 | "dependencies": { 2097 | "p-try": "^2.0.0" 2098 | }, 2099 | "engines": { 2100 | "node": ">=6" 2101 | }, 2102 | "funding": { 2103 | "url": "https://github.com/sponsors/sindresorhus" 2104 | } 2105 | }, 2106 | "node_modules/pkg-dir/node_modules/p-locate": { 2107 | "version": "4.1.0", 2108 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2109 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2110 | "dev": true, 2111 | "dependencies": { 2112 | "p-limit": "^2.2.0" 2113 | }, 2114 | "engines": { 2115 | "node": ">=8" 2116 | } 2117 | }, 2118 | "node_modules/process-on-spawn": { 2119 | "version": "1.0.0", 2120 | "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", 2121 | "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", 2122 | "dev": true, 2123 | "dependencies": { 2124 | "fromentries": "^1.2.0" 2125 | }, 2126 | "engines": { 2127 | "node": ">=8" 2128 | } 2129 | }, 2130 | "node_modules/randombytes": { 2131 | "version": "2.1.0", 2132 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2133 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2134 | "dev": true, 2135 | "dependencies": { 2136 | "safe-buffer": "^5.1.0" 2137 | } 2138 | }, 2139 | "node_modules/readdirp": { 2140 | "version": "3.6.0", 2141 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2142 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2143 | "dev": true, 2144 | "dependencies": { 2145 | "picomatch": "^2.2.1" 2146 | }, 2147 | "engines": { 2148 | "node": ">=8.10.0" 2149 | } 2150 | }, 2151 | "node_modules/release-zalgo": { 2152 | "version": "1.0.0", 2153 | "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", 2154 | "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", 2155 | "dev": true, 2156 | "dependencies": { 2157 | "es6-error": "^4.0.1" 2158 | }, 2159 | "engines": { 2160 | "node": ">=4" 2161 | } 2162 | }, 2163 | "node_modules/require-directory": { 2164 | "version": "2.1.1", 2165 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2166 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2167 | "dev": true, 2168 | "engines": { 2169 | "node": ">=0.10.0" 2170 | } 2171 | }, 2172 | "node_modules/require-main-filename": { 2173 | "version": "2.0.0", 2174 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2175 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2176 | "dev": true 2177 | }, 2178 | "node_modules/resolve-from": { 2179 | "version": "5.0.0", 2180 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2181 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2182 | "dev": true, 2183 | "engines": { 2184 | "node": ">=8" 2185 | } 2186 | }, 2187 | "node_modules/rimraf": { 2188 | "version": "3.0.2", 2189 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2190 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2191 | "dev": true, 2192 | "dependencies": { 2193 | "glob": "^7.1.3" 2194 | }, 2195 | "bin": { 2196 | "rimraf": "bin.js" 2197 | }, 2198 | "funding": { 2199 | "url": "https://github.com/sponsors/isaacs" 2200 | } 2201 | }, 2202 | "node_modules/safe-buffer": { 2203 | "version": "5.2.1", 2204 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2205 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2206 | "dev": true, 2207 | "funding": [ 2208 | { 2209 | "type": "github", 2210 | "url": "https://github.com/sponsors/feross" 2211 | }, 2212 | { 2213 | "type": "patreon", 2214 | "url": "https://www.patreon.com/feross" 2215 | }, 2216 | { 2217 | "type": "consulting", 2218 | "url": "https://feross.org/support" 2219 | } 2220 | ] 2221 | }, 2222 | "node_modules/semver": { 2223 | "version": "6.3.0", 2224 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2225 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2226 | "dev": true, 2227 | "bin": { 2228 | "semver": "bin/semver.js" 2229 | } 2230 | }, 2231 | "node_modules/serialize-javascript": { 2232 | "version": "6.0.0", 2233 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2234 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2235 | "dev": true, 2236 | "dependencies": { 2237 | "randombytes": "^2.1.0" 2238 | } 2239 | }, 2240 | "node_modules/set-blocking": { 2241 | "version": "2.0.0", 2242 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2243 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 2244 | "dev": true 2245 | }, 2246 | "node_modules/shebang-command": { 2247 | "version": "2.0.0", 2248 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2249 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2250 | "dev": true, 2251 | "dependencies": { 2252 | "shebang-regex": "^3.0.0" 2253 | }, 2254 | "engines": { 2255 | "node": ">=8" 2256 | } 2257 | }, 2258 | "node_modules/shebang-regex": { 2259 | "version": "3.0.0", 2260 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2261 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2262 | "dev": true, 2263 | "engines": { 2264 | "node": ">=8" 2265 | } 2266 | }, 2267 | "node_modules/signal-exit": { 2268 | "version": "3.0.7", 2269 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2270 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2271 | "dev": true 2272 | }, 2273 | "node_modules/sinon": { 2274 | "version": "7.5.0", 2275 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", 2276 | "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", 2277 | "dev": true, 2278 | "dependencies": { 2279 | "@sinonjs/commons": "^1.4.0", 2280 | "@sinonjs/formatio": "^3.2.1", 2281 | "@sinonjs/samsam": "^3.3.3", 2282 | "diff": "^3.5.0", 2283 | "lolex": "^4.2.0", 2284 | "nise": "^1.5.2", 2285 | "supports-color": "^5.5.0" 2286 | } 2287 | }, 2288 | "node_modules/sinon/node_modules/diff": { 2289 | "version": "3.5.0", 2290 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 2291 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 2292 | "dev": true, 2293 | "engines": { 2294 | "node": ">=0.3.1" 2295 | } 2296 | }, 2297 | "node_modules/sinon/node_modules/has-flag": { 2298 | "version": "3.0.0", 2299 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2300 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2301 | "dev": true, 2302 | "engines": { 2303 | "node": ">=4" 2304 | } 2305 | }, 2306 | "node_modules/sinon/node_modules/supports-color": { 2307 | "version": "5.5.0", 2308 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2309 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2310 | "dev": true, 2311 | "dependencies": { 2312 | "has-flag": "^3.0.0" 2313 | }, 2314 | "engines": { 2315 | "node": ">=4" 2316 | } 2317 | }, 2318 | "node_modules/source-map": { 2319 | "version": "0.6.1", 2320 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2321 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2322 | "dev": true, 2323 | "engines": { 2324 | "node": ">=0.10.0" 2325 | } 2326 | }, 2327 | "node_modules/spawn-wrap": { 2328 | "version": "2.0.0", 2329 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", 2330 | "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", 2331 | "dev": true, 2332 | "dependencies": { 2333 | "foreground-child": "^2.0.0", 2334 | "is-windows": "^1.0.2", 2335 | "make-dir": "^3.0.0", 2336 | "rimraf": "^3.0.0", 2337 | "signal-exit": "^3.0.2", 2338 | "which": "^2.0.1" 2339 | }, 2340 | "engines": { 2341 | "node": ">=8" 2342 | } 2343 | }, 2344 | "node_modules/sprintf-js": { 2345 | "version": "1.0.3", 2346 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2347 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 2348 | "dev": true 2349 | }, 2350 | "node_modules/string-width": { 2351 | "version": "4.2.3", 2352 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2353 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2354 | "dev": true, 2355 | "dependencies": { 2356 | "emoji-regex": "^8.0.0", 2357 | "is-fullwidth-code-point": "^3.0.0", 2358 | "strip-ansi": "^6.0.1" 2359 | }, 2360 | "engines": { 2361 | "node": ">=8" 2362 | } 2363 | }, 2364 | "node_modules/strip-ansi": { 2365 | "version": "6.0.1", 2366 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2367 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2368 | "dev": true, 2369 | "dependencies": { 2370 | "ansi-regex": "^5.0.1" 2371 | }, 2372 | "engines": { 2373 | "node": ">=8" 2374 | } 2375 | }, 2376 | "node_modules/strip-bom": { 2377 | "version": "4.0.0", 2378 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 2379 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 2380 | "dev": true, 2381 | "engines": { 2382 | "node": ">=8" 2383 | } 2384 | }, 2385 | "node_modules/strip-json-comments": { 2386 | "version": "3.1.1", 2387 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2388 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2389 | "dev": true, 2390 | "engines": { 2391 | "node": ">=8" 2392 | }, 2393 | "funding": { 2394 | "url": "https://github.com/sponsors/sindresorhus" 2395 | } 2396 | }, 2397 | "node_modules/supports-color": { 2398 | "version": "8.1.1", 2399 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2400 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2401 | "dev": true, 2402 | "dependencies": { 2403 | "has-flag": "^4.0.0" 2404 | }, 2405 | "engines": { 2406 | "node": ">=10" 2407 | }, 2408 | "funding": { 2409 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2410 | } 2411 | }, 2412 | "node_modules/test-exclude": { 2413 | "version": "6.0.0", 2414 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 2415 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 2416 | "dev": true, 2417 | "dependencies": { 2418 | "@istanbuljs/schema": "^0.1.2", 2419 | "glob": "^7.1.4", 2420 | "minimatch": "^3.0.4" 2421 | }, 2422 | "engines": { 2423 | "node": ">=8" 2424 | } 2425 | }, 2426 | "node_modules/test-exclude/node_modules/brace-expansion": { 2427 | "version": "1.1.11", 2428 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2429 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2430 | "dev": true, 2431 | "dependencies": { 2432 | "balanced-match": "^1.0.0", 2433 | "concat-map": "0.0.1" 2434 | } 2435 | }, 2436 | "node_modules/test-exclude/node_modules/minimatch": { 2437 | "version": "3.1.2", 2438 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2439 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2440 | "dev": true, 2441 | "dependencies": { 2442 | "brace-expansion": "^1.1.7" 2443 | }, 2444 | "engines": { 2445 | "node": "*" 2446 | } 2447 | }, 2448 | "node_modules/to-fast-properties": { 2449 | "version": "2.0.0", 2450 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2451 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2452 | "dev": true, 2453 | "engines": { 2454 | "node": ">=4" 2455 | } 2456 | }, 2457 | "node_modules/to-regex-range": { 2458 | "version": "5.0.1", 2459 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2460 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2461 | "dev": true, 2462 | "dependencies": { 2463 | "is-number": "^7.0.0" 2464 | }, 2465 | "engines": { 2466 | "node": ">=8.0" 2467 | } 2468 | }, 2469 | "node_modules/type-detect": { 2470 | "version": "4.0.8", 2471 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 2472 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 2473 | "dev": true, 2474 | "engines": { 2475 | "node": ">=4" 2476 | } 2477 | }, 2478 | "node_modules/type-fest": { 2479 | "version": "0.8.1", 2480 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2481 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2482 | "dev": true, 2483 | "engines": { 2484 | "node": ">=8" 2485 | } 2486 | }, 2487 | "node_modules/typedarray-to-buffer": { 2488 | "version": "3.1.5", 2489 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 2490 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 2491 | "dev": true, 2492 | "dependencies": { 2493 | "is-typedarray": "^1.0.0" 2494 | } 2495 | }, 2496 | "node_modules/update-browserslist-db": { 2497 | "version": "1.0.10", 2498 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 2499 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 2500 | "dev": true, 2501 | "funding": [ 2502 | { 2503 | "type": "opencollective", 2504 | "url": "https://opencollective.com/browserslist" 2505 | }, 2506 | { 2507 | "type": "tidelift", 2508 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2509 | } 2510 | ], 2511 | "dependencies": { 2512 | "escalade": "^3.1.1", 2513 | "picocolors": "^1.0.0" 2514 | }, 2515 | "bin": { 2516 | "browserslist-lint": "cli.js" 2517 | }, 2518 | "peerDependencies": { 2519 | "browserslist": ">= 4.21.0" 2520 | } 2521 | }, 2522 | "node_modules/uuid": { 2523 | "version": "8.3.2", 2524 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2525 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 2526 | "dev": true, 2527 | "bin": { 2528 | "uuid": "dist/bin/uuid" 2529 | } 2530 | }, 2531 | "node_modules/which": { 2532 | "version": "2.0.2", 2533 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2534 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2535 | "dev": true, 2536 | "dependencies": { 2537 | "isexe": "^2.0.0" 2538 | }, 2539 | "bin": { 2540 | "node-which": "bin/node-which" 2541 | }, 2542 | "engines": { 2543 | "node": ">= 8" 2544 | } 2545 | }, 2546 | "node_modules/which-module": { 2547 | "version": "2.0.0", 2548 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2549 | "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", 2550 | "dev": true 2551 | }, 2552 | "node_modules/workerpool": { 2553 | "version": "6.2.1", 2554 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2555 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2556 | "dev": true 2557 | }, 2558 | "node_modules/wrap-ansi": { 2559 | "version": "7.0.0", 2560 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2561 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2562 | "dev": true, 2563 | "dependencies": { 2564 | "ansi-styles": "^4.0.0", 2565 | "string-width": "^4.1.0", 2566 | "strip-ansi": "^6.0.0" 2567 | }, 2568 | "engines": { 2569 | "node": ">=10" 2570 | }, 2571 | "funding": { 2572 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2573 | } 2574 | }, 2575 | "node_modules/wrappy": { 2576 | "version": "1.0.2", 2577 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2578 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2579 | "dev": true 2580 | }, 2581 | "node_modules/write-file-atomic": { 2582 | "version": "3.0.3", 2583 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 2584 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 2585 | "dev": true, 2586 | "dependencies": { 2587 | "imurmurhash": "^0.1.4", 2588 | "is-typedarray": "^1.0.0", 2589 | "signal-exit": "^3.0.2", 2590 | "typedarray-to-buffer": "^3.1.5" 2591 | } 2592 | }, 2593 | "node_modules/y18n": { 2594 | "version": "5.0.8", 2595 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2596 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2597 | "dev": true, 2598 | "engines": { 2599 | "node": ">=10" 2600 | } 2601 | }, 2602 | "node_modules/yallist": { 2603 | "version": "3.1.1", 2604 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2605 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 2606 | "dev": true 2607 | }, 2608 | "node_modules/yargs": { 2609 | "version": "16.2.0", 2610 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2611 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2612 | "dev": true, 2613 | "dependencies": { 2614 | "cliui": "^7.0.2", 2615 | "escalade": "^3.1.1", 2616 | "get-caller-file": "^2.0.5", 2617 | "require-directory": "^2.1.1", 2618 | "string-width": "^4.2.0", 2619 | "y18n": "^5.0.5", 2620 | "yargs-parser": "^20.2.2" 2621 | }, 2622 | "engines": { 2623 | "node": ">=10" 2624 | } 2625 | }, 2626 | "node_modules/yargs-parser": { 2627 | "version": "20.2.4", 2628 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2629 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2630 | "dev": true, 2631 | "engines": { 2632 | "node": ">=10" 2633 | } 2634 | }, 2635 | "node_modules/yargs-unparser": { 2636 | "version": "2.0.0", 2637 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2638 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2639 | "dev": true, 2640 | "dependencies": { 2641 | "camelcase": "^6.0.0", 2642 | "decamelize": "^4.0.0", 2643 | "flat": "^5.0.2", 2644 | "is-plain-obj": "^2.1.0" 2645 | }, 2646 | "engines": { 2647 | "node": ">=10" 2648 | } 2649 | }, 2650 | "node_modules/yargs-unparser/node_modules/camelcase": { 2651 | "version": "6.3.0", 2652 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2653 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2654 | "dev": true, 2655 | "engines": { 2656 | "node": ">=10" 2657 | }, 2658 | "funding": { 2659 | "url": "https://github.com/sponsors/sindresorhus" 2660 | } 2661 | }, 2662 | "node_modules/yargs-unparser/node_modules/decamelize": { 2663 | "version": "4.0.0", 2664 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 2665 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 2666 | "dev": true, 2667 | "engines": { 2668 | "node": ">=10" 2669 | }, 2670 | "funding": { 2671 | "url": "https://github.com/sponsors/sindresorhus" 2672 | } 2673 | }, 2674 | "node_modules/yocto-queue": { 2675 | "version": "0.1.0", 2676 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2677 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2678 | "dev": true, 2679 | "engines": { 2680 | "node": ">=10" 2681 | }, 2682 | "funding": { 2683 | "url": "https://github.com/sponsors/sindresorhus" 2684 | } 2685 | } 2686 | } 2687 | } 2688 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "smpte-timecode", 3 | "version": "1.3.6", 4 | "description": "JavaScript implementation of SMPTE timecode type", 5 | "main": "smpte-timecode.js", 6 | "scripts": { 7 | "test": "mocha", 8 | "coverage": "nyc npm run test" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/CrystalComputerCorp/smpte-timecode.git" 13 | }, 14 | "keywords": [ 15 | "SMPTE", 16 | "Timecode", 17 | "dropframe", 18 | "drop-frame", 19 | "video", 20 | "time" 21 | ], 22 | "author": "Dimitri Tarassenko", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/CrystalComputerCorp/smpte-timecode/issues" 26 | }, 27 | "homepage": "https://github.com/CrystalComputerCorp/smpte-timecode#readme", 28 | "devDependencies": { 29 | "expect.js": "^0.3.1", 30 | "lodash.isequal": "^4.5.0", 31 | "mocha": "^10.2.0", 32 | "nyc": "^15.1.0", 33 | "sinon": "^7.1.1" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /smpte-timecode.js: -------------------------------------------------------------------------------- 1 | // This should work both in node and in the browsers, so that's what this wrapper is about 2 | ;(function(root, undefined) { 3 | 4 | 5 | /** 6 | * Timecode object constructor 7 | * @param {number|String|Date|Object} timeCode Frame count as number, "HH:MM:SS(:|;|.)FF", Date(), or object. 8 | * @param {number|Array} [frameRate=29.97] Frame rate, either as a number or as numerator/denominator 9 | * @param {boolean} [dropFrame=true] Whether the timecode is drop-frame or not 10 | * @constructor 11 | * @returns {Timecode} timecode 12 | */ 13 | var Timecode = function ( timeCode, frameRate, dropFrame ) { 14 | 15 | // Make this class safe for use without "new" 16 | if (!(this instanceof Timecode)) return new Timecode( timeCode, frameRate, dropFrame); 17 | 18 | // If we are passed dropFrame, we need to use it 19 | if (typeof dropFrame === 'boolean') this.dropFrame = dropFrame; 20 | else this.dropFrame = false; 21 | 22 | // Get frame rate 23 | this.frameRateDen = 0; 24 | switch (typeof (frameRate)) { 25 | 26 | case 'undefined': 27 | this.frameRateNum = 30000; 28 | this.frameRateDen = 1001; 29 | this.dropFrame = true; 30 | break; 31 | 32 | case 'object': 33 | if (Array.isArray(frameRate) && frameRate.length>=2 && typeof(frameRate[0]) == 'number' && typeof(frameRate[1]) == 'number') { 34 | this.frameRateNum = frameRate[0]; 35 | this.frameRateDen = frameRate[1]; 36 | } 37 | break; 38 | 39 | case 'number': 40 | if (frameRate>0) { 41 | let frameRateRound = Math.round(frameRate); 42 | if (frameRate === frameRateRound) { // Whole number of frames per second 43 | this.frameRateNum = frameRate; 44 | this.frameRateDen = 1; 45 | } else if (frameRate < frameRateRound && (frameRateRound == 24 || frameRateRound == 30 || frameRateRound == 60)) { 46 | // we got a fractional, we'll assume it's a 29.97, 23.98, 59.94 or something of the sort 47 | this.frameRateNum = frameRateRound*1000; 48 | this.frameRateDen = 1001; 49 | if (frameRateRound != 24 && typeof(dropFrame) !== 'boolean') this.dropFrame = true; 50 | } 51 | } 52 | break; 53 | } 54 | if (this.frameRateDen == 0) throw new Error('Invalid framerate. Either a number or an array of [numerator,denominator] are expected.'); 55 | this.frameRate = this.frameRateNum / this.frameRateDen; 56 | if (this.frameRateDen!=1) this.frameRate = Math.round((this.frameRate + Number.EPSILON) * 100) / 100 57 | 58 | // Now either get the frame count, string or datetime 59 | if (typeof timeCode === 'number') { 60 | this.frameCount = Math.round(timeCode); 61 | this._frameCountToTimeCode(); 62 | } 63 | else if (typeof timeCode === 'string') { 64 | // pick it apart 65 | var parts = timeCode.match('^([012]\\d):(\\d\\d):(\\d\\d)(:|;|\\.)(\\d+)$'); 66 | if (!parts) throw new Error("Timecode string expected as HH:MM:SS:FF or HH:MM:SS;FF"); 67 | this.hours = parseInt(parts[1]); 68 | this.minutes = parseInt(parts[2]); 69 | this.seconds = parseInt(parts[3]); 70 | // do not override input parameters 71 | if (typeof dropFrame !== 'boolean') { 72 | this.dropFrame = ( parts[4]!==':' && this.frameRate>25 ); 73 | } 74 | this.frames = parseInt(parts[5]); 75 | this._timeCodeToFrameCount(); 76 | } 77 | else if (typeof timeCode === 'object' && timeCode instanceof Date) { 78 | var midnight = new Date(timeCode.getFullYear(), timeCode.getMonth(), timeCode.getDate(),0,0,0); 79 | var midnight_tz = midnight.getTimezoneOffset() * 60 * 1000; 80 | var timecode_tz = timeCode.getTimezoneOffset() * 60 * 1000; 81 | this.frameCount = Math.round(((timeCode-midnight + (midnight_tz - timecode_tz))*this.frameRate)/1000); 82 | this._frameCountToTimeCode(); 83 | } 84 | else if (typeof timeCode === 'object' && typeof (timeCode.hours) != 'undefined') { 85 | if (!frameRate && timeCode.frameRate) { 86 | this.frameRate = timeCode.frameRate; 87 | this.frameRateDen = timeCode.frameRateDen; 88 | this.frameRateNum = timeCode.frameRateNum; 89 | } 90 | if (typeof timeCode.dropFrame === 'boolean') this.dropFrame = timeCode.dropFrame; 91 | this.hours = timeCode.hours; 92 | this.minutes = timeCode.minutes; 93 | this.seconds = timeCode.seconds; 94 | this.frames = timeCode.frames; 95 | this._timeCodeToFrameCount(); 96 | } 97 | else if (typeof timeCode === 'undefined') { 98 | this.frameCount = 0; 99 | } 100 | else { 101 | throw new Error('Timecode() constructor expects a number, timecode string, or Date()'); 102 | } 103 | 104 | this._validate(timeCode); 105 | 106 | return this; 107 | }; 108 | 109 | /** 110 | * Validates timecode 111 | * @private 112 | * @param {number|String|Date|Object} timeCode for the reference 113 | */ 114 | Timecode.prototype._validate = function (timeCode) { 115 | 116 | // Make sure dropFrame is only for 29.97 & 59.94 117 | if (this.dropFrame && this.frameRateDen != 1001) { 118 | throw new Error('Drop frame is only supported for 23.976, 29.97, and 59.94 fps'); 119 | } 120 | 121 | // make sure the numbers make sense 122 | if (this.hours > 23 || this.minutes > 59 || this.seconds > 59 || this.frames >= this.frameRate || 123 | (this.dropFrame && this.seconds === 0 && this.minutes % 10 && this.frames < 2 * (this.frameRate / 29.97))) { 124 | throw new Error("Invalid timecode" + JSON.stringify(timeCode)); 125 | } 126 | }; 127 | 128 | /** 129 | * Calculate timecode based on frame count 130 | * @private 131 | */ 132 | Timecode.prototype._frameCountToTimeCode = function() { 133 | var fc = this.frameCount; 134 | // adjust for dropFrame 135 | if (this.dropFrame) { 136 | var df = this.frameRate<=30 ? 2 : 4; // 59.94 skips 4 frames 137 | var d = Math.floor(this.frameCount / (17982*df/2)); 138 | var m = this.frameCount % (17982*df/2); 139 | if (m 0) { 212 | newFrameCount = (Math.round(this.frameRate*86400)) + newFrameCount; 213 | if (((newFrameCount / this.frameRate) / 3600) > rollOverMaxHours) { 214 | throw new Error('Rollover arithmetic exceeds max permitted'); 215 | } 216 | } 217 | if (newFrameCount<0) { 218 | throw new Error("Negative timecodes not supported"); 219 | } 220 | this.frameCount = newFrameCount; 221 | } 222 | else { 223 | if (!(t instanceof Timecode)) t = new Timecode(t, [this.frameRateNum,this.frameRateDen], this.dropFrame); 224 | return this.add(t.frameCount,negative,rollOverMaxHours); 225 | } 226 | 227 | this.frameCount = this.frameCount % (Math.round(this.frameRate*86400)); // wraparound 24h 228 | this._frameCountToTimeCode(); 229 | return this; 230 | }; 231 | 232 | 233 | Timecode.prototype.subtract = function(t, rollOverMaxHours) { 234 | return this.add(t,true,rollOverMaxHours); 235 | }; 236 | 237 | /** 238 | * Converts timecode to a Date() object 239 | * @returns {Date} date 240 | */ 241 | Timecode.prototype.toDate = function() { 242 | var ms = this.frameCount/(this.frameRateNum/this.frameRateDen)*1000; 243 | var midnight = new Date(); 244 | midnight.setHours(0); 245 | midnight.setMinutes(0); 246 | midnight.setSeconds(0); 247 | midnight.setMilliseconds(0); 248 | 249 | var d = new Date( midnight.valueOf() + ms ); 250 | var midnight_tz = midnight.getTimezoneOffset() * 60 * 1000; 251 | var timecode_tz = d.getTimezoneOffset() * 60 * 1000; 252 | return new Date( midnight.valueOf() + ms + (timecode_tz-midnight_tz)); 253 | }; 254 | 255 | // Export it for Node or attach to root for in-browser 256 | /* istanbul ignore else */ 257 | if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 258 | module.exports = Timecode; 259 | } else if (root) { 260 | root.Timecode = Timecode; 261 | } 262 | 263 | 264 | }(this)); 265 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --reporter spec 2 | --ui bdd 3 | --recursive -------------------------------------------------------------------------------- /test/smpte-timecode-test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Mocha Tests 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 19 | 20 | 21 | 24 | 25 | 26 | 29 | 30 | -------------------------------------------------------------------------------- /test/smpte-timecode-test.js: -------------------------------------------------------------------------------- 1 | 2 | // If we are running under Node, we need to add expect and load our module 3 | if (typeof module !== 'undefined' && module.exports) { 4 | global.expect = require('expect.js'); 5 | global.isEqual = require('lodash.isequal'); 6 | global.Timecode = require('../smpte-timecode.js'); 7 | global.sinon = require('sinon'); 8 | var runInBrowser = false; 9 | } 10 | else { 11 | var runInBrowser = true; 12 | } 13 | 14 | describe('Constructor tests', function(){ 15 | 16 | var t = Timecode(100); 17 | 18 | it ('no new still gets you Timecode()', function() { 19 | expect(Timecode(3)).to.be.a(Timecode); 20 | }); 21 | 22 | it ('numbers converted to framecounts', function() { 23 | expect(Timecode(15).frameCount).to.be(15); 24 | expect(Timecode(323.443).frameCount).to.be(323); 25 | }); 26 | 27 | it ('incorrect initializers throw', function() { 28 | expect(function(){Timecode(1,-1)}).to.throwException(); 29 | expect(function(){Timecode(1,66.1)}).to.throwException(); 30 | expect(function(){Timecode('dewdew');}).to.throwException(); 31 | expect(function(){Timecode('dewdew');}).to.throwException(); 32 | expect(function(){Timecode({w:3});}).to.throwException(); 33 | }); 34 | 35 | it ('string initializers work', function(){ 36 | var t = new Timecode('12:33:44;12'); 37 | expect(t.hours).to.be(12); 38 | expect(t.minutes).to.be(33); 39 | expect(t.seconds).to.be(44); 40 | expect(t.frames).to.be(12); 41 | expect(t.dropFrame).to.be(true); 42 | expect(t.frameRateNum).to.be(30000); 43 | expect(t.frameRateDen).to.be(1001); 44 | expect(t.frameRate).to.be(29.97); 45 | t = new Timecode('12:33:44:12'); 46 | expect(t.hours).to.be(12); 47 | expect(t.minutes).to.be(33); 48 | expect(t.seconds).to.be(44); 49 | expect(t.frames).to.be(12); 50 | expect(t.dropFrame).to.be(false); 51 | expect(t.frameRateNum).to.be(30000); 52 | expect(t.frameRateDen).to.be(1001); 53 | expect(t.frameRate).to.be(29.97); 54 | 55 | expect(function(){Timecode('40:02:00;02')}).to.throwError(); 56 | expect(function(){Timecode('00:99:00;02')}).to.throwError(); 57 | expect(function(){Timecode('00:02:99;02')}).to.throwError(); 58 | expect(function(){Timecode('00:02:00;35')}).to.throwError(); 59 | 60 | }); 61 | 62 | it ('initializing from an object',function(){ 63 | var t = new Timecode( {hours:12, minutes:34, seconds:56, frames:2 } ); 64 | expect(t.toString()).to.be('12:34:56;02'); 65 | expect(function(){Timecode(0,{})}).to.throwException(); 66 | }); 67 | 68 | it ('initialization defaults', function() { 69 | var t = Timecode(); 70 | expect(t.frameCount).to.be(0); 71 | expect(t.frameRate).to.be(29.97); 72 | expect(t.dropFrame).to.be(true); 73 | expect(Timecode(1).dropFrame).to.be(true); 74 | expect(Timecode(1).frameRate).to.be(29.97); 75 | expect(Timecode(1,29.97).dropFrame).to.be(true); 76 | expect(Timecode(1,59.94).dropFrame).to.be(true); 77 | expect(Timecode(1,25).dropFrame).to.be(false); 78 | }); 79 | 80 | it ('natural fraction timecodes', function() { 81 | var t = Timecode('00:02:10;34',[60000,1001]); 82 | expect(t.frameRate).to.be(59.94); 83 | var t2 = Timecode('00:02:10;14',[25000,1001]); 84 | expect(t2.frameRate).to.be(24.98); 85 | }); 86 | 87 | it ('drop-frame only for 29.97 and 59.94', function() { 88 | expect(function(){Timecode(0,30,true)}).to.throwException(); 89 | expect(function(){Timecode(0,59.94,true)}).to.not.throwException(); 90 | }); 91 | 92 | it ('drop-frame counts', function() { 93 | expect(Timecode('00:10:00;00').frameCount).to.be(17982); 94 | expect(Timecode('00:10:00;00',59.94).frameCount).to.be(17982*2); 95 | expect(Timecode('10:00:00;00').frameCount).to.be(1078920); 96 | expect(Timecode('10:00:00;00',59.94).frameCount).to.be(1078920*2); 97 | expect(function(){Timecode('00:02:00;00')}).to.throwError(); 98 | expect(function(){Timecode('00:02:00;02')}).to.not.throwError(); 99 | expect(function(){Timecode('00:02:00;00',59.94)}).to.throwError(); 100 | expect(function(){Timecode('00:02:00;02',59.94)}).to.throwError(); 101 | expect(function(){Timecode('00:02:00;04',59.94)}).to.not.throwError(); 102 | expect(Timecode('00:01:59;29').frameCount).to.be(3597); 103 | expect(Timecode('00:01:59;59',59.94).frameCount).to.be(3597*2+1); 104 | expect(Timecode(17982,29.97,true).toString()).to.be('00:10:00;00'); 105 | expect(Timecode(1078920,29.97,true).toString()).to.be('10:00:00;00'); 106 | expect(Timecode(3597,29.97,true).toString()).to.be('00:01:59;29'); 107 | expect(Timecode(17982*2,59.94,true).toString()).to.be('00:10:00;00'); 108 | expect(Timecode(1078920*2,59.94,true).toString()).to.be('10:00:00;00'); 109 | expect(Timecode(3597*2+1,59.94,true).toString()).to.be('00:01:59;59'); 110 | }); 111 | 112 | it ('non-drop-frame counts', function() { 113 | expect(Timecode('00:10:00:00',25).frameCount).to.be(15000); 114 | expect(Timecode('10:00:00:00',25).frameCount).to.be(900000); 115 | expect(Timecode('00:02:00:00',25).frameCount).to.be(3000); 116 | expect(Timecode('00:01:59:24',25).frameCount).to.be(2999); 117 | expect(Timecode(15000,25).toString()).to.be('00:10:00:00'); 118 | expect(Timecode(900000,25).toString()).to.be('10:00:00:00'); 119 | expect(Timecode(2999,25).toString()).to.be('00:01:59:24'); 120 | }); 121 | 122 | it("preserves drop frame and frame rate from 'other' timecode", function() { 123 | const tc = new Timecode('05:27:00;57', 59.94, true); 124 | let constructed; 125 | expect(() => { constructed = Timecode(tc); }).not.to.throwException(); 126 | expect(isEqual(constructed, tc)).to.be(true); 127 | }); 128 | 129 | it("allows override of drop frame and frame rate from 'other' timecode", function() { 130 | { 131 | const tc = new Timecode('05:27:00;57', 59.94, true); 132 | expect(() => { Timecode(tc, 29.97); }).to.throwException(); 133 | } 134 | { 135 | const tc = new Timecode('05:27:00;27', 59.94, true); 136 | let constructed; 137 | expect(() => { constructed = Timecode(tc, 29.97); }).not.to.throwException(); 138 | expect(isEqual(constructed, new Timecode('05:27:00;27', 29.97, true))).to.be(true); 139 | } 140 | }); 141 | }); 142 | 143 | describe('String conversions', function(){ 144 | it ('back and forth works',function(){ 145 | expect(Timecode('12:34:56;23').toString()).to.be('12:34:56;23'); 146 | expect(Timecode('01:02:03;04').toString()).to.be('01:02:03;04'); 147 | expect(Timecode('12:34:56;57',59.94).toString()).to.be('12:34:56;57'); 148 | expect(Timecode('01:02:03;04',59.94).toString()).to.be('01:02:03;04'); 149 | }); 150 | it ('implicit calls to toString()',function(){ 151 | expect('+'.concat(Timecode('12:34:56;23'),'+')).to.be('+12:34:56;23+'); 152 | expect(/12.34.56.23/.test(Timecode('12:34:56;23'))); 153 | }); 154 | it ('toString(\'field\')',function(){ 155 | expect(Timecode('12:34:56;23').toString('field')).to.be('12:34:56;23.0'); 156 | expect(Timecode('01:02:03;04').toString('field')).to.be('01:02:03;04.0'); 157 | expect(Timecode('12:34:56;57',59.94).toString('field')).to.be('12:34:56;28.1'); 158 | expect(Timecode('01:02:03;04',59.94).toString('field')).to.be('01:02:03;02.0'); 159 | }); 160 | it ('toString(\'unknown-format\')',function(){ 161 | expect(function() {Timecode('12:34:56;23').toString('unknown-format')}).to.throwException(); 162 | }); 163 | }); 164 | 165 | describe('Timecode arithmetic', function(){ 166 | it ('Timecode() as primitive', function() { 167 | var t = Timecode('01:23:45;06'); 168 | expect(t.frameCount).to.be(150606); 169 | expect(t+1).to.be(150607); 170 | expect(12*t).to.be(150606*12); 171 | expect(-t).to.be(-150606); 172 | expect(Math.round(t)).to.be(150606); 173 | t++; 174 | expect(t).to.be(150607); 175 | expect(t).to.be.a('number'); // t is not a timecode anymore! 176 | }); 177 | it ('Timecode().add() and .subtract()', function() { 178 | var t = Timecode('01:23:45;06'); 179 | expect(t.add(60).toString()).to.be('01:23:47;06') 180 | expect(function(){Timecode('00:00:10;00').add(-301)}).to.throwError(); // below zero 181 | expect(Timecode('23:59:40;00').add(Timecode('00:00:21;00')).toString()).to.be('00:00:01;00'); // wraparound 182 | 183 | t = Timecode('01:23:45;06'); 184 | expect(t.subtract(60).toString()).to.be('01:23:43;06') 185 | expect(function(){Timecode('00:00:10;00').subtract(301)}).to.throwError(); // below zero 186 | 187 | expect(Timecode('01:23:45;06').add('01:23:13;01').toString()).to.be('02:46:58;07'); 188 | 189 | // Covering the error with _frameCountToTimeCode() altering this.frameCount 190 | t = Timecode('00:01:15;00'); 191 | var t2 = Timecode('00:01:15;00'); 192 | t2.add(0); 193 | expect(t.frameCount).to.be(t2.frameCount); 194 | t2.add(12345); 195 | expect(t.frameCount).to.be(t2.frameCount-12345); 196 | }); 197 | it('handles rollover to new day when permitted', function() { 198 | expect(function() { new Timecode().subtract(new Timecode('23:00:01;00')); }).to.throwError(); 199 | expect(new Timecode().subtract(new Timecode('23:30:00;00'), 1).toString()).to.be('00:30:00;00'); 200 | expect(function() { new Timecode().subtract(new Timecode('22:30:00;00'), 1); }).to.throwError(); 201 | expect(new Timecode('01:00:00;00').subtract(new Timecode('23:30:00;00'), 2).toString()).to.be('01:30:00;00'); 202 | }); 203 | it('Ensures source frame rate is kept when adding two Timecode objects', function() { 204 | expect(new Timecode('00:00:00:00', 25, false).add('00:01:00:00').frameCount).to.be(1500); 205 | }); 206 | }); 207 | 208 | describe('Date() operations', function(){ 209 | it ('Date() initializers work', function(){ 210 | var t = new Timecode( new Date(0,0,0,1,2,13,200), 29.97, true ); 211 | expect( t.frameCount ).to.be(111884); 212 | expect( t.toString()).to.be('01:02:13;06'); 213 | 214 | var t2 = new Timecode( new Date(0,0,0,10,40,15,520), 25, false ); 215 | expect( t2.frameCount ).to.be(960388); 216 | expect( t2.toString()).to.be('10:40:15:13'); 217 | }); 218 | it ('Timecode to Date()', function(){ 219 | var d = Timecode('01:23:45;10').toDate(); 220 | expect( d.getHours()).to.be(1); 221 | expect( d.getMinutes()).to.be(23); 222 | expect( d.getSeconds()).to.be(45); 223 | expect( d.getMilliseconds()).to.be(353); 224 | }); 225 | }); 226 | 227 | describe('DST handling', function() { 228 | var clock; 229 | 230 | function clearDate(d) { 231 | d.setYear(0); 232 | d.setMonth(0); 233 | d.setDate(1); 234 | } 235 | 236 | function checkDst(d) { 237 | // we need to fake out 'new Date()', since this issue only happens day of. 238 | clock = sinon.useFakeTimers(d); 239 | 240 | var t = new Timecode(d, 29.97, true); 241 | var o = t.toDate(); 242 | // console.log(d.toString(), '->', o.toString()); 243 | clearDate(d); 244 | clearDate(o); 245 | expect(o.toString()).to.be(d.toString()); 246 | } 247 | 248 | afterEach(function() { 249 | if (!runInBrowser) clock.restore(); 250 | }); 251 | 252 | it ('handles DST start 1am', function() { 253 | if (runInBrowser) this.skip(); 254 | checkDst(new Date(2018,2,11,1,0,0,200)); 255 | checkDst(new Date(2018,2,11,1,59,59,200)); 256 | }); 257 | 258 | it ('handles DST start 2am', function() { 259 | if (runInBrowser) this.skip(); 260 | checkDst(new Date(2018,2,11,2,0,0,200)); 261 | checkDst(new Date(2018,2,11,2,59,59,200)); 262 | checkDst(new Date(2018,2,11,3,0,0,200)); 263 | }); 264 | 265 | it ('handles DST end 1am', function() { 266 | if (runInBrowser) this.skip(); 267 | checkDst(new Date(2018,10,4,1,0,0,200)); 268 | checkDst(new Date(2018,10,4,1,59,59,200)); 269 | }); 270 | 271 | it ('handles DST end 2am', function() { 272 | if (runInBrowser) this.skip(); 273 | checkDst(new Date(2018,10,4,2,0,0,200)); 274 | checkDst(new Date(2018,10,4,2,59,59,200)); 275 | checkDst(new Date(2018,10,4,3,0,0,200)); 276 | }); 277 | 278 | }); 279 | 280 | describe('Issues', function() { 281 | it ('#36 23.976 Time Code', function(){ 282 | var t = new Timecode("10:00:00;06", 23.976, false); 283 | expect(t.dropFrame).to.be(false); 284 | var t1 = new Timecode("10:00:00;06", 23.976); 285 | expect(t1.dropFrame).to.be(false); 286 | }); 287 | 288 | 289 | it ('#37 Time Codes >100', function(){ 290 | var t = new Timecode("00:00:10;112", 200, false); 291 | expect(t.dropFrame).to.be(false); 292 | expect(t.frameCount).to.be(2112); 293 | expect(Timecode('12:34:56:578',600).toString()).to.be('12:34:56:578'); 294 | }); 295 | 296 | it ('#42 59.94 NDF Time Codes', function(){ 297 | var t = new Timecode(123456, 59.95, false); 298 | expect(t.dropFrame).to.be(false); 299 | }); 300 | 301 | }); 302 | --------------------------------------------------------------------------------