├── .gitignore ├── .vscode └── launch.json ├── CHANGELOG.md ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test └── index.test.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directory 7 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 8 | node_modules 9 | coverage 10 | 11 | #nyc 12 | .nyc_output -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | // List of configurations. Add new configurations or edit existing ones. 4 | "configurations": [ 5 | { 6 | // Name of configuration; appears in the launch configuration drop down menu. 7 | "name": "Launch test debug", 8 | // Type of configuration. 9 | "type": "node", 10 | // Workspace relative or absolute path to the program. 11 | "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", 12 | // Automatically stop program after launch. 13 | "stopOnEntry": false, 14 | // Command line arguments passed to the program. 15 | "args": [], 16 | // Workspace relative or absolute path to the runtime executable to be used. Default is the runtime executable on the PATH. 17 | "runtimeExecutable": null, 18 | // Optional arguments passed to the runtime executable. 19 | "runtimeArgs": ["--nolazy"], 20 | // Environment variables passed to the program. 21 | "env": { 22 | "NODE_ENV": "development" 23 | }, 24 | // Use JavaScript source maps (if they exist). 25 | "sourceMaps": false, 26 | // If JavaScript source maps are enabled, the generated code is expected in this directory. 27 | "outDir": null, 28 | "request": "launch" 29 | }, 30 | { 31 | "name": "Attach", 32 | "type": "node", 33 | // TCP/IP address. Default is "localhost". 34 | "address": "localhost", 35 | // Port to attach to. 36 | "port": 5858, 37 | "sourceMaps": true 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [1.0.12] - 2023-08-07 4 | 5 | - add zip-support when filling the cache on startup 6 | - work on unittests 7 | - add CHANGELOG.md 8 | - publish new version 9 | 10 | ## [1.0.11] - 2023-08-07 11 | 12 | - added open pullrequests 13 | - published new version 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-cache-manager-fs 2 | Node Cache Manager store for Filesystem 3 | ======================================= 4 | 5 | The Filesystem store for the [node-cache-manager](https://github.com/BryanDonovan/node-cache-manager) module. 6 | 7 | ## Installation 8 | 9 | ```sh 10 | npm install cache-manager-fs --save 11 | ``` 12 | 13 | ## Features 14 | 15 | * Saves anything that is `JSON.stringify`-able to disk 16 | * limit maximum size on disk 17 | * refill cache on startup (in case of application restart) 18 | * "Callback"-interface style (no promises, no async) 19 | 20 | ## Usage example 21 | 22 | Here are examples that demonstrate how to implement the Filesystem cache store. 23 | 24 | ## Single store 25 | 26 | ```javascript 27 | // node cachemanager 28 | var cacheManager = require('cache-manager'); 29 | // storage for the cachemanager 30 | var fsStore = require('cache-manager-fs'); 31 | // initialize caching on disk 32 | const diskCache = cacheManager.caching({ 33 | store: fsStore, 34 | options: { 35 | path: 'diskcache', //path for cached files 36 | ttl: 60 * 60, //time to life in seconds 37 | maxsize: 1000*1000*1000, // max size in bytes on disk 38 | zip: true, //zip files to save diskspace (default: false) 39 | preventfill:true 40 | } 41 | }); 42 | 43 | (async () => { 44 | 45 | await diskCache.set('key', 'value'); 46 | console.log(await diskCache.get('key')); //"value" 47 | console.log(await diskCache.ttl('key')); //3600 seconds 48 | await diskCache.del('key'); 49 | console.log(await diskCache.get('key')); //undefined 50 | 51 | console.log(await getUserCached(5)); //{id: 5, name: '...'} 52 | console.log(await getUserCached(5)); //{id: 5, name: '...'} 53 | 54 | await diskCache.reset(); 55 | 56 | function getUserCached(userId) { 57 | return diskCache.wrap(userId /* cache key */, function () { 58 | return getUser(userId); 59 | }); 60 | } 61 | 62 | async function getUser(userId) { 63 | return {id: userId, name: '...'}; 64 | } 65 | 66 | })(); 67 | 68 | ``` 69 | 70 | ### Options 71 | 72 | options for store initialization 73 | 74 | ```javascript 75 | 76 | options.ttl = 60; // time to life in seconds 77 | options.path = 'cache/'; // path for cached files 78 | options.preventfill = false; // prevent filling of the cache with the files from the cache-directory 79 | options.fillcallback = null; // callback fired after the initial cache filling is completed 80 | options.zip = false; // if true the cached files will be zipped to save diskspace 81 | options.reviveBuffers = true; // if true buffers are returned from cache as buffers, not objects 82 | 83 | ``` 84 | ## Installation 85 | 86 | npm install cache-manager-fs 87 | 88 | ## Tests 89 | 90 | To run tests: 91 | 92 | npm test 93 | 94 | ## Code Coverage 95 | 96 | To run Coverage: 97 | 98 | npm run coverage 99 | 100 | ## License 101 | 102 | cache-manager-fs is licensed under the MIT license. 103 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Module dependencies 5 | */ 6 | var noop = function () {}; 7 | var fs = require("fs"); 8 | var fsp = require("fs-promise"); 9 | var crypto = require('crypto'); 10 | var path = require('path'); 11 | var async = require('async'); 12 | var extend = require('extend'); 13 | var uuid = require('uuid'); 14 | var zlib = require('zlib'); 15 | const gzip = zlib.createGzip(); 16 | 17 | /** 18 | * Export 'DiskStore' 19 | */ 20 | 21 | module.exports = { 22 | create : function (args) { 23 | return new DiskStore(args && args.options ? args.options : args); 24 | } 25 | }; 26 | 27 | /** 28 | * Helper function that revives buffers from object representation on JSON.parse 29 | */ 30 | function bufferReviver(k, v) { 31 | if ( 32 | v !== null && 33 | typeof v === 'object' && 34 | 'type' in v && 35 | v.type === 'Buffer' && 36 | 'data' in v && 37 | Array.isArray(v.data)) { 38 | return new Buffer(v.data); 39 | } 40 | return v; 41 | } 42 | 43 | /** 44 | * helper object with meta-informations about the cached data 45 | */ 46 | function MetaData () { 47 | 48 | // the key for the storing 49 | this.key = null; 50 | // data to store 51 | this.value = null; 52 | // temporary filename for the cached file because filenames cannot represend urls completely 53 | this.filename = null; 54 | // expirydate of the entry 55 | this.expires = null; 56 | // size of the current entry 57 | this.size = null; 58 | } 59 | 60 | /** 61 | * construction of the disk storage 62 | */ 63 | function DiskStore (options) { 64 | options = options || {}; 65 | 66 | this.options = extend({ 67 | path: 'cache/', 68 | ttl: 60, 69 | maxsize: 0, 70 | zip: false 71 | }, options); 72 | 73 | // check storage directory for existence (or create it) 74 | if (!fs.existsSync(this.options.path)) { 75 | fs.mkdirSync(this.options.path); 76 | } 77 | 78 | this.name = 'diskstore'; 79 | 80 | // current size of the cache 81 | this.currentsize = 0; 82 | 83 | // internal array for informations about the cached files - resists in memory 84 | this.collection = {}; 85 | 86 | // fill the cache on startup with already existing files 87 | if (!options.preventfill) { 88 | this.intializefill(options.fillcallback); 89 | } 90 | } 91 | 92 | /** 93 | * indicate, whether a key is cacheable 94 | */ 95 | DiskStore.prototype.isCacheableValue = function (value) { 96 | 97 | return value !== null && value !== undefined; 98 | }; 99 | 100 | /** 101 | * delete an entry from the cache 102 | */ 103 | DiskStore.prototype.del = function (key, options, cb) { 104 | 105 | if (typeof options === 'function') { 106 | cb = options; 107 | options = null; 108 | } 109 | cb = typeof cb === 'function' ? cb : noop; 110 | 111 | // get the metainformations for the key 112 | var metaData = this.collection[key]; 113 | if (!metaData) { 114 | return cb(null); 115 | } 116 | 117 | // check if the filename is set 118 | if (!metaData.filename) { 119 | return cb(null); 120 | } 121 | // check for existance of the file 122 | fsp.exists(metaData.filename). 123 | then(function(exists) { 124 | if (exists) { 125 | return; 126 | } 127 | reject(); 128 | }) 129 | .then(function() { 130 | // delete the file 131 | return fsp.unlink(metaData.filename); 132 | }, function() { 133 | // not found 134 | cb(null); 135 | }).then(function() { 136 | // update internal properties 137 | this.currentsize -= metaData.size; 138 | this.collection[key] = null; 139 | delete this.collection[key]; 140 | cb(null); 141 | }.bind(this)).catch(function(err) { 142 | cb(null); 143 | }); 144 | }; 145 | 146 | 147 | /** 148 | * zip an input string if options want that 149 | */ 150 | DiskStore.prototype.zipIfNeeded = function(data, cb) 151 | { 152 | if (this.options.zip) 153 | { 154 | zlib.deflate(data, function(err, buffer) { 155 | if (!err) { 156 | cb(null, buffer); 157 | } 158 | else 159 | { 160 | cb(err, null); 161 | } 162 | }); 163 | } 164 | else 165 | { 166 | cb(null, data); 167 | } 168 | } 169 | 170 | /** 171 | *unpzip an input string if options want that 172 | */ 173 | DiskStore.prototype.unzipIfNeeded = function (data, cb) { 174 | if (this.options.zip) { 175 | zlib.unzip(data, function (err, buffer) { 176 | if (!err) { 177 | cb(null, buffer); 178 | } 179 | else { 180 | cb(err, null); 181 | } 182 | }); 183 | } 184 | else { 185 | cb(null, data); 186 | } 187 | } 188 | 189 | /** 190 | * set a key into the cache 191 | */ 192 | DiskStore.prototype.set = function (key, val, options, cb) { 193 | 194 | cb = typeof cb === 'function' ? cb : noop; 195 | 196 | if (typeof options === 'function') { 197 | cb = options; 198 | options = null; 199 | } 200 | 201 | // get ttl 202 | var ttl = (options && (options.ttl || options.ttl === 0)) ? options.ttl : this.options.ttl; 203 | 204 | var metaData = extend({}, new MetaData(), { 205 | key: key, 206 | value: val, 207 | expires: Date.now() + ((ttl || 60) * 1000), 208 | filename: this.options.path + '/cache_' + uuid.v4() + '.dat' 209 | }); 210 | 211 | var stream = JSON.stringify(metaData); 212 | 213 | metaData.size = stream.length; 214 | 215 | if (this.options.maxsize && metaData.size > this.options.maxsize) { 216 | return cb('Item size too big.'); 217 | } 218 | 219 | 220 | // remove the key from the cache (if it already existed, this updates also the current size of the store) 221 | this.del(key, function (err) { 222 | 223 | if (err) { 224 | return cb(err); 225 | } 226 | 227 | // check used space and remove entries if we use to much space 228 | this.freeupspace(function () { 229 | 230 | try { 231 | this.zipIfNeeded(stream, function(err, processedStream) { 232 | 233 | // write data into the cache-file 234 | fs.writeFile(metaData.filename, processedStream, function (err) { 235 | 236 | if (err) { 237 | return cb(err); 238 | } 239 | 240 | // remove data value from memory 241 | metaData.value = null; 242 | delete metaData.value; 243 | 244 | this.currentsize += metaData.size; 245 | 246 | // place element with metainfos in internal collection 247 | this.collection[metaData.key] = metaData; 248 | return cb(null, val); 249 | 250 | }.bind(this)); 251 | }.bind(this)); 252 | 253 | } catch(err) { 254 | 255 | return cb(err); 256 | } 257 | 258 | }.bind(this)); 259 | 260 | }.bind(this)); 261 | 262 | }; 263 | 264 | /** 265 | * helper method to free up space in the cache (regarding the given spacelimit) 266 | */ 267 | DiskStore.prototype.freeupspace = function (cb) { 268 | 269 | cb = typeof cb === 'function' ? cb : noop; 270 | 271 | if (!this.options.maxsize) { 272 | return cb(null); 273 | } 274 | 275 | // do we use to much space? then cleanup first the expired elements 276 | if (this.currentsize > this.options.maxsize) { 277 | this.cleanExpired(); 278 | } 279 | 280 | // when the spaceusage is to high, remove the oldest entries until we gain enough diskspace 281 | if (this.currentsize <= this.options.maxsize) { 282 | return cb(null); 283 | } 284 | 285 | // for this we need a sorted list basend on the expire date of the entries (descending) 286 | var tuples = [], key; 287 | for (key in this.collection) { 288 | tuples.push([key, this.collection[key].expires]); 289 | } 290 | 291 | tuples.sort(function sort (a, b) { 292 | 293 | a = a[1]; 294 | b = b[1]; 295 | return a < b ? 1 : (a > b ? -1 : 0); 296 | }); 297 | 298 | return this.freeupspacehelper(tuples, cb); 299 | }; 300 | 301 | /** 302 | * freeup helper for asnyc space freeup 303 | */ 304 | DiskStore.prototype.freeupspacehelper = function (tuples, cb) { 305 | 306 | // check, if we have any entry to process 307 | if (tuples.length === 0) { 308 | return cb(null); 309 | } 310 | 311 | // get an entry from the list 312 | var tuple = tuples.pop(); 313 | var key = tuple[0]; 314 | 315 | // delete an entry from the store 316 | this.del(key, function deleted (err) { 317 | 318 | // return when an error occures 319 | if (err) { 320 | return cb(err); 321 | } 322 | 323 | // stop processing when enouth space has been cleaned up 324 | if (this.currentsize <= this.options.maxsize) { 325 | return cb(err); 326 | } 327 | 328 | // ok - we need to free up more space 329 | return this.freeupspacehelper(tuples, cb); 330 | }.bind(this)); 331 | }; 332 | 333 | /** 334 | * get entry from the cache 335 | */ 336 | DiskStore.prototype.get = function (key, options, cb) { 337 | 338 | if (typeof options === 'function') { 339 | cb = options; 340 | } 341 | 342 | cb = typeof cb === 'function' ? cb : noop; 343 | 344 | // get the metadata from the collection 345 | var data = this.collection[key]; 346 | 347 | if (!data) { 348 | 349 | // not found 350 | return cb(null, null); 351 | } 352 | 353 | // found but expired 354 | if (data.expires < new Date()) { 355 | 356 | // delete the elemente from the store 357 | this.del(key, function (err) { 358 | return cb(err, null); 359 | }); 360 | } else { 361 | 362 | // try to read the file 363 | try { 364 | 365 | fs.readFile(data.filename, function (err, fileContent) { 366 | if (err) { 367 | return cb(err); 368 | } 369 | 370 | this.unzipIfNeeded(fileContent, function(err, decompressedContent) { 371 | if (err) { 372 | return cb(err); 373 | } 374 | 375 | var diskdata; 376 | if(this.options.reviveBuffers) { 377 | diskdata = JSON.parse(decompressedContent, bufferReviver); 378 | } else { 379 | diskdata = JSON.parse(decompressedContent); 380 | } 381 | cb(null, diskdata.value); 382 | }.bind(this)); 383 | }.bind(this)); 384 | } catch(err) { 385 | cb(err); 386 | } 387 | } 388 | }; 389 | 390 | /** 391 | * get keys stored in cache 392 | * @param {Function} cb 393 | */ 394 | DiskStore.prototype.keys = function (cb) { 395 | 396 | cb = typeof cb === 'function' ? cb : noop; 397 | 398 | var keys = Object.keys(this.collection); 399 | 400 | cb(null, keys); 401 | }; 402 | 403 | /** 404 | * cleanup cache on disk -> delete all used files from the cache 405 | */ 406 | DiskStore.prototype.reset = function (key, cb) { 407 | 408 | cb = typeof cb === 'function' ? cb : noop; 409 | 410 | if (typeof key === 'function') { 411 | cb = key; 412 | key = null; 413 | } 414 | 415 | if (Object.keys(this.collection).length === 0) { 416 | return cb(null); 417 | } 418 | 419 | try { 420 | 421 | // delete special key 422 | if (key !== null) { 423 | 424 | this.del(key); 425 | return cb(null); 426 | } 427 | 428 | async.eachSeries(this.collection, 429 | function (elementKey, callback) { 430 | this.del(elementKey.key, callback); 431 | }.bind(this), 432 | function (err) { 433 | cb(null); 434 | } 435 | ); 436 | 437 | } catch(err) { 438 | 439 | return cb(err); 440 | } 441 | 442 | }; 443 | 444 | /** 445 | * helper method to clean all expired files 446 | */ 447 | DiskStore.prototype.cleanExpired = function () { 448 | 449 | var key, entry; 450 | 451 | for (key in this.collection) { 452 | 453 | entry = this.collection[key]; 454 | 455 | if (entry.expires < new Date()) { 456 | 457 | this.del(entry.key); 458 | } 459 | } 460 | } 461 | 462 | /** 463 | * clean the complete cache and all(!) files in the cache directory 464 | */ 465 | DiskStore.prototype.cleancache = function (cb) { 466 | 467 | cb = typeof cb === 'function' ? cb : noop; 468 | 469 | // clean all current used files 470 | this.reset(); 471 | 472 | // check, if other files still resist in the cache and clean them, too 473 | var files = fs.readdirSync(this.options.path); 474 | 475 | files 476 | .map(function (file) { 477 | 478 | return path.join(this.options.path, file); 479 | }.bind(this)) 480 | .filter(function (file) { 481 | 482 | return fs.statSync(file).isFile(); 483 | }.bind(this)) 484 | .forEach(function (file) { 485 | 486 | fs.unlinkSync(file); 487 | }.bind(this)); 488 | 489 | cb(null); 490 | 491 | }; 492 | 493 | /** 494 | * fill the cache from the cache directory (usefull e.g. on server/service restart) 495 | */ 496 | DiskStore.prototype.intializefill = function (cb) { 497 | 498 | cb = typeof cb === 'function' ? cb : noop; 499 | 500 | // get the current working directory 501 | fs.readdir(this.options.path, function (err, files) { 502 | 503 | // get potential files from disk 504 | files = files.map(function (filename) { 505 | 506 | return path.join(this.options.path, filename); 507 | }.bind(this)).filter(function (filename) { 508 | 509 | return fs.statSync(filename).isFile(); 510 | }).filter(function (filename) { 511 | 512 | var re = /^cache_[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}.dat$/i 513 | return re.test(path.basename(filename)); 514 | }); 515 | 516 | // use async to process the files and send a callback after completion 517 | async.eachSeries(files, function (filename, callback) { 518 | 519 | fs.readFile(filename, function (err, data) { 520 | 521 | // stop file processing when there was an reading error 522 | if (err) { 523 | return callback(); 524 | } 525 | 526 | this.unzipIfNeeded(data, function(err, unzippedData) { 527 | try { 528 | 529 | // get the json out of the data 530 | var diskdata = JSON.parse(unzippedData); 531 | 532 | } catch(err) { 533 | 534 | // when the deserialize doesn't work, probably the file is uncomplete - so we delete it and ignore the error 535 | try { 536 | fs.unlinkSync(filename); 537 | } catch(ignore) { 538 | 539 | } 540 | 541 | return callback(); 542 | } 543 | 544 | // update the size in the metadata - this value isn't correctly stored in the file 545 | diskdata.size = data.length; 546 | 547 | // update collection size 548 | this.currentsize+=data.length; 549 | 550 | // remove the entrys content - we don't want the content in the memory (only the meta informations) 551 | diskdata.value = null; 552 | delete diskdata.value; 553 | 554 | // and put the entry in the store 555 | this.collection[diskdata.key] = diskdata; 556 | 557 | // check for expiry - in this case we instantly delete the entry 558 | if (diskdata.expires < new Date()) { 559 | 560 | this.del(diskdata.key, function () { 561 | 562 | return callback(); 563 | }); 564 | } else { 565 | 566 | return callback(); 567 | } 568 | }.bind(this)); 569 | }.bind(this)); 570 | }.bind(this), function (err) { 571 | cb(err || null); 572 | }); 573 | }.bind(this)); 574 | 575 | }; 576 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cache-manager-fs", 3 | "version": "1.0.10", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "cache-manager-fs", 9 | "version": "1.0.10", 10 | "license": "ISC", 11 | "dependencies": { 12 | "async": "^2.6.4", 13 | "cache-manager": "^1.1.0", 14 | "extend": "^3.0.0", 15 | "fs-promise": "^0.3.1", 16 | "uuid": "^2.0.1" 17 | }, 18 | "devDependencies": { 19 | "chai": "^3.3.0", 20 | "mocha": "^10.2.0", 21 | "nyc": "^14.1.1" 22 | } 23 | }, 24 | "node_modules/@babel/code-frame": { 25 | "version": "7.0.0", 26 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 27 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 28 | "dev": true, 29 | "dependencies": { 30 | "@babel/highlight": "^7.0.0" 31 | } 32 | }, 33 | "node_modules/@babel/generator": { 34 | "version": "7.5.0", 35 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz", 36 | "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==", 37 | "dev": true, 38 | "dependencies": { 39 | "@babel/types": "^7.5.0", 40 | "jsesc": "^2.5.1", 41 | "lodash": "^4.17.11", 42 | "source-map": "^0.5.0", 43 | "trim-right": "^1.0.1" 44 | } 45 | }, 46 | "node_modules/@babel/generator/node_modules/source-map": { 47 | "version": "0.5.7", 48 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 49 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 50 | "dev": true, 51 | "engines": { 52 | "node": ">=0.10.0" 53 | } 54 | }, 55 | "node_modules/@babel/helper-function-name": { 56 | "version": "7.1.0", 57 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", 58 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", 59 | "dev": true, 60 | "dependencies": { 61 | "@babel/helper-get-function-arity": "^7.0.0", 62 | "@babel/template": "^7.1.0", 63 | "@babel/types": "^7.0.0" 64 | } 65 | }, 66 | "node_modules/@babel/helper-get-function-arity": { 67 | "version": "7.0.0", 68 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", 69 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", 70 | "dev": true, 71 | "dependencies": { 72 | "@babel/types": "^7.0.0" 73 | } 74 | }, 75 | "node_modules/@babel/helper-split-export-declaration": { 76 | "version": "7.4.4", 77 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", 78 | "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", 79 | "dev": true, 80 | "dependencies": { 81 | "@babel/types": "^7.4.4" 82 | } 83 | }, 84 | "node_modules/@babel/highlight": { 85 | "version": "7.5.0", 86 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 87 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 88 | "dev": true, 89 | "dependencies": { 90 | "chalk": "^2.0.0", 91 | "esutils": "^2.0.2", 92 | "js-tokens": "^4.0.0" 93 | } 94 | }, 95 | "node_modules/@babel/parser": { 96 | "version": "7.5.0", 97 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz", 98 | "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA==", 99 | "dev": true, 100 | "bin": { 101 | "parser": "bin/babel-parser.js" 102 | }, 103 | "engines": { 104 | "node": ">=6.0.0" 105 | } 106 | }, 107 | "node_modules/@babel/template": { 108 | "version": "7.4.4", 109 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", 110 | "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", 111 | "dev": true, 112 | "dependencies": { 113 | "@babel/code-frame": "^7.0.0", 114 | "@babel/parser": "^7.4.4", 115 | "@babel/types": "^7.4.4" 116 | } 117 | }, 118 | "node_modules/@babel/traverse": { 119 | "version": "7.5.0", 120 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz", 121 | "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==", 122 | "dev": true, 123 | "dependencies": { 124 | "@babel/code-frame": "^7.0.0", 125 | "@babel/generator": "^7.5.0", 126 | "@babel/helper-function-name": "^7.1.0", 127 | "@babel/helper-split-export-declaration": "^7.4.4", 128 | "@babel/parser": "^7.5.0", 129 | "@babel/types": "^7.5.0", 130 | "debug": "^4.1.0", 131 | "globals": "^11.1.0", 132 | "lodash": "^4.17.11" 133 | } 134 | }, 135 | "node_modules/@babel/traverse/node_modules/debug": { 136 | "version": "4.1.1", 137 | "resolved": "http://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 138 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 139 | "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", 140 | "dev": true, 141 | "dependencies": { 142 | "ms": "^2.1.1" 143 | } 144 | }, 145 | "node_modules/@babel/traverse/node_modules/ms": { 146 | "version": "2.1.2", 147 | "resolved": "http://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 148 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 149 | "dev": true 150 | }, 151 | "node_modules/@babel/types": { 152 | "version": "7.5.0", 153 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz", 154 | "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==", 155 | "dev": true, 156 | "dependencies": { 157 | "esutils": "^2.0.2", 158 | "lodash": "^4.17.11", 159 | "to-fast-properties": "^2.0.0" 160 | } 161 | }, 162 | "node_modules/ansi-colors": { 163 | "version": "4.1.1", 164 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 165 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 166 | "dev": true, 167 | "engines": { 168 | "node": ">=6" 169 | } 170 | }, 171 | "node_modules/ansi-regex": { 172 | "version": "4.1.1", 173 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 174 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 175 | "dev": true, 176 | "engines": { 177 | "node": ">=6" 178 | } 179 | }, 180 | "node_modules/ansi-styles": { 181 | "version": "3.2.1", 182 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 183 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 184 | "dev": true, 185 | "dependencies": { 186 | "color-convert": "^1.9.0" 187 | }, 188 | "engines": { 189 | "node": ">=4" 190 | } 191 | }, 192 | "node_modules/any-promise": { 193 | "version": "0.1.0", 194 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", 195 | "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=" 196 | }, 197 | "node_modules/anymatch": { 198 | "version": "3.1.3", 199 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 200 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 201 | "dev": true, 202 | "dependencies": { 203 | "normalize-path": "^3.0.0", 204 | "picomatch": "^2.0.4" 205 | }, 206 | "engines": { 207 | "node": ">= 8" 208 | } 209 | }, 210 | "node_modules/append-transform": { 211 | "version": "1.0.0", 212 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", 213 | "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", 214 | "dev": true, 215 | "dependencies": { 216 | "default-require-extensions": "^2.0.0" 217 | }, 218 | "engines": { 219 | "node": ">=4" 220 | } 221 | }, 222 | "node_modules/archy": { 223 | "version": "1.0.0", 224 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 225 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", 226 | "dev": true 227 | }, 228 | "node_modules/argparse": { 229 | "version": "1.0.10", 230 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 231 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 232 | "dev": true, 233 | "dependencies": { 234 | "sprintf-js": "~1.0.2" 235 | } 236 | }, 237 | "node_modules/assertion-error": { 238 | "version": "1.1.0", 239 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 240 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 241 | "dev": true, 242 | "engines": { 243 | "node": "*" 244 | } 245 | }, 246 | "node_modules/async": { 247 | "version": "2.6.4", 248 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 249 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 250 | "dependencies": { 251 | "lodash": "^4.17.14" 252 | } 253 | }, 254 | "node_modules/balanced-match": { 255 | "version": "1.0.0", 256 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 257 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 258 | "dev": true 259 | }, 260 | "node_modules/binary-extensions": { 261 | "version": "2.2.0", 262 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 263 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 264 | "dev": true, 265 | "engines": { 266 | "node": ">=8" 267 | } 268 | }, 269 | "node_modules/brace-expansion": { 270 | "version": "1.1.11", 271 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 272 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 273 | "dev": true, 274 | "dependencies": { 275 | "balanced-match": "^1.0.0", 276 | "concat-map": "0.0.1" 277 | } 278 | }, 279 | "node_modules/braces": { 280 | "version": "3.0.2", 281 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 282 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 283 | "dev": true, 284 | "dependencies": { 285 | "fill-range": "^7.0.1" 286 | }, 287 | "engines": { 288 | "node": ">=8" 289 | } 290 | }, 291 | "node_modules/browser-stdout": { 292 | "version": "1.3.1", 293 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 294 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 295 | "dev": true 296 | }, 297 | "node_modules/cache-manager": { 298 | "version": "1.5.0", 299 | "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-1.5.0.tgz", 300 | "integrity": "sha1-UpIUvaV/oZUU0QbwcPq7FsMZCBE=", 301 | "dependencies": { 302 | "async": "^1.5.2", 303 | "lru-cache": "4.0.0" 304 | } 305 | }, 306 | "node_modules/cache-manager/node_modules/async": { 307 | "version": "1.5.2", 308 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 309 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 310 | }, 311 | "node_modules/caching-transform": { 312 | "version": "3.0.2", 313 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", 314 | "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", 315 | "dev": true, 316 | "dependencies": { 317 | "hasha": "^3.0.0", 318 | "make-dir": "^2.0.0", 319 | "package-hash": "^3.0.0", 320 | "write-file-atomic": "^2.4.2" 321 | }, 322 | "engines": { 323 | "node": ">=6" 324 | } 325 | }, 326 | "node_modules/camelcase": { 327 | "version": "5.3.1", 328 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 329 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 330 | "dev": true, 331 | "engines": { 332 | "node": ">=6" 333 | } 334 | }, 335 | "node_modules/chai": { 336 | "version": "3.5.0", 337 | "resolved": "http://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 338 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 339 | "dev": true, 340 | "dependencies": { 341 | "assertion-error": "^1.0.1", 342 | "deep-eql": "^0.1.3", 343 | "type-detect": "^1.0.0" 344 | }, 345 | "engines": { 346 | "node": ">= 0.4.0" 347 | } 348 | }, 349 | "node_modules/chalk": { 350 | "version": "2.4.2", 351 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 352 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 353 | "dev": true, 354 | "dependencies": { 355 | "ansi-styles": "^3.2.1", 356 | "escape-string-regexp": "^1.0.5", 357 | "supports-color": "^5.3.0" 358 | }, 359 | "engines": { 360 | "node": ">=4" 361 | } 362 | }, 363 | "node_modules/chalk/node_modules/escape-string-regexp": { 364 | "version": "1.0.5", 365 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 366 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 367 | "dev": true, 368 | "engines": { 369 | "node": ">=0.8.0" 370 | } 371 | }, 372 | "node_modules/chalk/node_modules/has-flag": { 373 | "version": "3.0.0", 374 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 375 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 376 | "dev": true, 377 | "engines": { 378 | "node": ">=4" 379 | } 380 | }, 381 | "node_modules/chalk/node_modules/supports-color": { 382 | "version": "5.5.0", 383 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 384 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 385 | "dev": true, 386 | "dependencies": { 387 | "has-flag": "^3.0.0" 388 | }, 389 | "engines": { 390 | "node": ">=4" 391 | } 392 | }, 393 | "node_modules/chokidar": { 394 | "version": "3.5.3", 395 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 396 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 397 | "dev": true, 398 | "funding": [ 399 | { 400 | "type": "individual", 401 | "url": "https://paulmillr.com/funding/" 402 | } 403 | ], 404 | "dependencies": { 405 | "anymatch": "~3.1.2", 406 | "braces": "~3.0.2", 407 | "glob-parent": "~5.1.2", 408 | "is-binary-path": "~2.1.0", 409 | "is-glob": "~4.0.1", 410 | "normalize-path": "~3.0.0", 411 | "readdirp": "~3.6.0" 412 | }, 413 | "engines": { 414 | "node": ">= 8.10.0" 415 | }, 416 | "optionalDependencies": { 417 | "fsevents": "~2.3.2" 418 | } 419 | }, 420 | "node_modules/cliui": { 421 | "version": "5.0.0", 422 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 423 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 424 | "dev": true, 425 | "dependencies": { 426 | "string-width": "^3.1.0", 427 | "strip-ansi": "^5.2.0", 428 | "wrap-ansi": "^5.1.0" 429 | } 430 | }, 431 | "node_modules/color-convert": { 432 | "version": "1.9.3", 433 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 434 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 435 | "dev": true, 436 | "dependencies": { 437 | "color-name": "1.1.3" 438 | } 439 | }, 440 | "node_modules/color-name": { 441 | "version": "1.1.3", 442 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 443 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 444 | "dev": true 445 | }, 446 | "node_modules/commondir": { 447 | "version": "1.0.1", 448 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 449 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 450 | "dev": true 451 | }, 452 | "node_modules/concat-map": { 453 | "version": "0.0.1", 454 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 455 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 456 | "dev": true 457 | }, 458 | "node_modules/convert-source-map": { 459 | "version": "1.6.0", 460 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", 461 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", 462 | "dev": true, 463 | "dependencies": { 464 | "safe-buffer": "~5.1.1" 465 | } 466 | }, 467 | "node_modules/cp-file": { 468 | "version": "6.2.0", 469 | "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", 470 | "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", 471 | "dev": true, 472 | "dependencies": { 473 | "graceful-fs": "^4.1.2", 474 | "make-dir": "^2.0.0", 475 | "nested-error-stacks": "^2.0.0", 476 | "pify": "^4.0.1", 477 | "safe-buffer": "^5.0.1" 478 | }, 479 | "engines": { 480 | "node": ">=6" 481 | } 482 | }, 483 | "node_modules/cross-spawn": { 484 | "version": "4.0.2", 485 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 486 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", 487 | "dev": true, 488 | "dependencies": { 489 | "lru-cache": "^4.0.1", 490 | "which": "^1.2.9" 491 | } 492 | }, 493 | "node_modules/cross-spawn/node_modules/lru-cache": { 494 | "version": "4.1.5", 495 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 496 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 497 | "dev": true, 498 | "dependencies": { 499 | "pseudomap": "^1.0.2", 500 | "yallist": "^2.1.2" 501 | } 502 | }, 503 | "node_modules/debug": { 504 | "version": "4.3.4", 505 | "resolved": "http://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 506 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 507 | "dev": true, 508 | "dependencies": { 509 | "ms": "2.1.2" 510 | }, 511 | "engines": { 512 | "node": ">=6.0" 513 | }, 514 | "peerDependenciesMeta": { 515 | "supports-color": { 516 | "optional": true 517 | } 518 | } 519 | }, 520 | "node_modules/debug/node_modules/ms": { 521 | "version": "2.1.2", 522 | "resolved": "http://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 523 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 524 | "dev": true 525 | }, 526 | "node_modules/decamelize": { 527 | "version": "1.2.0", 528 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 529 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 530 | "dev": true, 531 | "engines": { 532 | "node": ">=0.10.0" 533 | } 534 | }, 535 | "node_modules/deep-eql": { 536 | "version": "0.1.3", 537 | "resolved": "http://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 538 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 539 | "dev": true, 540 | "dependencies": { 541 | "type-detect": "0.1.1" 542 | }, 543 | "engines": { 544 | "node": "*" 545 | } 546 | }, 547 | "node_modules/deep-eql/node_modules/type-detect": { 548 | "version": "0.1.1", 549 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 550 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 551 | "dev": true, 552 | "engines": { 553 | "node": "*" 554 | } 555 | }, 556 | "node_modules/default-require-extensions": { 557 | "version": "2.0.0", 558 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", 559 | "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", 560 | "dev": true, 561 | "dependencies": { 562 | "strip-bom": "^3.0.0" 563 | }, 564 | "engines": { 565 | "node": ">=4" 566 | } 567 | }, 568 | "node_modules/diff": { 569 | "version": "5.0.0", 570 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 571 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">=0.3.1" 575 | } 576 | }, 577 | "node_modules/emoji-regex": { 578 | "version": "7.0.3", 579 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 580 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 581 | "dev": true 582 | }, 583 | "node_modules/end-of-stream": { 584 | "version": "1.4.1", 585 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 586 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 587 | "dev": true, 588 | "dependencies": { 589 | "once": "^1.4.0" 590 | } 591 | }, 592 | "node_modules/error-ex": { 593 | "version": "1.3.2", 594 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 595 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 596 | "dev": true, 597 | "dependencies": { 598 | "is-arrayish": "^0.2.1" 599 | } 600 | }, 601 | "node_modules/es6-error": { 602 | "version": "4.1.1", 603 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 604 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", 605 | "dev": true 606 | }, 607 | "node_modules/escalade": { 608 | "version": "3.1.1", 609 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 610 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 611 | "dev": true, 612 | "engines": { 613 | "node": ">=6" 614 | } 615 | }, 616 | "node_modules/escape-string-regexp": { 617 | "version": "4.0.0", 618 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 619 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 620 | "dev": true, 621 | "engines": { 622 | "node": ">=10" 623 | }, 624 | "funding": { 625 | "url": "https://github.com/sponsors/sindresorhus" 626 | } 627 | }, 628 | "node_modules/esutils": { 629 | "version": "2.0.2", 630 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 631 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 632 | "dev": true, 633 | "engines": { 634 | "node": ">=0.10.0" 635 | } 636 | }, 637 | "node_modules/execa": { 638 | "version": "1.0.0", 639 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 640 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 641 | "dev": true, 642 | "dependencies": { 643 | "cross-spawn": "^6.0.0", 644 | "get-stream": "^4.0.0", 645 | "is-stream": "^1.1.0", 646 | "npm-run-path": "^2.0.0", 647 | "p-finally": "^1.0.0", 648 | "signal-exit": "^3.0.0", 649 | "strip-eof": "^1.0.0" 650 | }, 651 | "engines": { 652 | "node": ">=6" 653 | } 654 | }, 655 | "node_modules/execa/node_modules/cross-spawn": { 656 | "version": "6.0.5", 657 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 658 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 659 | "dev": true, 660 | "dependencies": { 661 | "nice-try": "^1.0.4", 662 | "path-key": "^2.0.1", 663 | "semver": "^5.5.0", 664 | "shebang-command": "^1.2.0", 665 | "which": "^1.2.9" 666 | }, 667 | "engines": { 668 | "node": ">=4.8" 669 | } 670 | }, 671 | "node_modules/extend": { 672 | "version": "3.0.2", 673 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 674 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 675 | }, 676 | "node_modules/fill-range": { 677 | "version": "7.0.1", 678 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 679 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 680 | "dev": true, 681 | "dependencies": { 682 | "to-regex-range": "^5.0.1" 683 | }, 684 | "engines": { 685 | "node": ">=8" 686 | } 687 | }, 688 | "node_modules/find-cache-dir": { 689 | "version": "2.1.0", 690 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", 691 | "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", 692 | "dev": true, 693 | "dependencies": { 694 | "commondir": "^1.0.1", 695 | "make-dir": "^2.0.0", 696 | "pkg-dir": "^3.0.0" 697 | }, 698 | "engines": { 699 | "node": ">=6" 700 | } 701 | }, 702 | "node_modules/find-up": { 703 | "version": "3.0.0", 704 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 705 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 706 | "dev": true, 707 | "dependencies": { 708 | "locate-path": "^3.0.0" 709 | }, 710 | "engines": { 711 | "node": ">=6" 712 | } 713 | }, 714 | "node_modules/flat": { 715 | "version": "5.0.2", 716 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 717 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 718 | "dev": true, 719 | "bin": { 720 | "flat": "cli.js" 721 | } 722 | }, 723 | "node_modules/foreground-child": { 724 | "version": "1.5.6", 725 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", 726 | "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", 727 | "dev": true, 728 | "dependencies": { 729 | "cross-spawn": "^4", 730 | "signal-exit": "^3.0.0" 731 | } 732 | }, 733 | "node_modules/fs-promise": { 734 | "version": "0.3.1", 735 | "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.3.1.tgz", 736 | "integrity": "sha1-vzQFA2jyTW3J38ZoirXOrY+GhCo=", 737 | "deprecated": "Use mz or fs-extra^3.0 with Promise Support", 738 | "dependencies": { 739 | "any-promise": "~0.1.0" 740 | } 741 | }, 742 | "node_modules/fs.realpath": { 743 | "version": "1.0.0", 744 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 745 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 746 | "dev": true 747 | }, 748 | "node_modules/fsevents": { 749 | "version": "2.3.2", 750 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 751 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 752 | "dev": true, 753 | "hasInstallScript": true, 754 | "optional": true, 755 | "os": [ 756 | "darwin" 757 | ], 758 | "engines": { 759 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 760 | } 761 | }, 762 | "node_modules/get-caller-file": { 763 | "version": "2.0.5", 764 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 765 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 766 | "dev": true, 767 | "engines": { 768 | "node": "6.* || 8.* || >= 10.*" 769 | } 770 | }, 771 | "node_modules/get-stream": { 772 | "version": "4.1.0", 773 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 774 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 775 | "dev": true, 776 | "dependencies": { 777 | "pump": "^3.0.0" 778 | }, 779 | "engines": { 780 | "node": ">=6" 781 | } 782 | }, 783 | "node_modules/glob": { 784 | "version": "7.2.0", 785 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 786 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 787 | "dev": true, 788 | "dependencies": { 789 | "fs.realpath": "^1.0.0", 790 | "inflight": "^1.0.4", 791 | "inherits": "2", 792 | "minimatch": "^3.0.4", 793 | "once": "^1.3.0", 794 | "path-is-absolute": "^1.0.0" 795 | }, 796 | "engines": { 797 | "node": "*" 798 | }, 799 | "funding": { 800 | "url": "https://github.com/sponsors/isaacs" 801 | } 802 | }, 803 | "node_modules/glob-parent": { 804 | "version": "5.1.2", 805 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 806 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 807 | "dev": true, 808 | "dependencies": { 809 | "is-glob": "^4.0.1" 810 | }, 811 | "engines": { 812 | "node": ">= 6" 813 | } 814 | }, 815 | "node_modules/globals": { 816 | "version": "11.12.0", 817 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 818 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 819 | "dev": true, 820 | "engines": { 821 | "node": ">=4" 822 | } 823 | }, 824 | "node_modules/graceful-fs": { 825 | "version": "4.2.0", 826 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", 827 | "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", 828 | "dev": true 829 | }, 830 | "node_modules/handlebars": { 831 | "version": "4.7.7", 832 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 833 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 834 | "dev": true, 835 | "dependencies": { 836 | "minimist": "^1.2.5", 837 | "neo-async": "^2.6.0", 838 | "source-map": "^0.6.1", 839 | "wordwrap": "^1.0.0" 840 | }, 841 | "bin": { 842 | "handlebars": "bin/handlebars" 843 | }, 844 | "engines": { 845 | "node": ">=0.4.7" 846 | }, 847 | "optionalDependencies": { 848 | "uglify-js": "^3.1.4" 849 | } 850 | }, 851 | "node_modules/has-flag": { 852 | "version": "4.0.0", 853 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 854 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 855 | "dev": true, 856 | "engines": { 857 | "node": ">=8" 858 | } 859 | }, 860 | "node_modules/hasha": { 861 | "version": "3.0.0", 862 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", 863 | "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", 864 | "dev": true, 865 | "dependencies": { 866 | "is-stream": "^1.0.1" 867 | }, 868 | "engines": { 869 | "node": ">=4" 870 | } 871 | }, 872 | "node_modules/he": { 873 | "version": "1.2.0", 874 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 875 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 876 | "dev": true, 877 | "bin": { 878 | "he": "bin/he" 879 | } 880 | }, 881 | "node_modules/hosted-git-info": { 882 | "version": "2.8.9", 883 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 884 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 885 | "dev": true 886 | }, 887 | "node_modules/imurmurhash": { 888 | "version": "0.1.4", 889 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 890 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=0.8.19" 894 | } 895 | }, 896 | "node_modules/inflight": { 897 | "version": "1.0.6", 898 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 899 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 900 | "dev": true, 901 | "dependencies": { 902 | "once": "^1.3.0", 903 | "wrappy": "1" 904 | } 905 | }, 906 | "node_modules/inherits": { 907 | "version": "2.0.3", 908 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 909 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 910 | "dev": true 911 | }, 912 | "node_modules/invert-kv": { 913 | "version": "2.0.0", 914 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 915 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", 916 | "dev": true, 917 | "engines": { 918 | "node": ">=4" 919 | } 920 | }, 921 | "node_modules/is-arrayish": { 922 | "version": "0.2.1", 923 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 924 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 925 | "dev": true 926 | }, 927 | "node_modules/is-binary-path": { 928 | "version": "2.1.0", 929 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 930 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 931 | "dev": true, 932 | "dependencies": { 933 | "binary-extensions": "^2.0.0" 934 | }, 935 | "engines": { 936 | "node": ">=8" 937 | } 938 | }, 939 | "node_modules/is-extglob": { 940 | "version": "2.1.1", 941 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 942 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 943 | "dev": true, 944 | "engines": { 945 | "node": ">=0.10.0" 946 | } 947 | }, 948 | "node_modules/is-fullwidth-code-point": { 949 | "version": "2.0.0", 950 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 951 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 952 | "dev": true, 953 | "engines": { 954 | "node": ">=4" 955 | } 956 | }, 957 | "node_modules/is-glob": { 958 | "version": "4.0.3", 959 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 960 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 961 | "dev": true, 962 | "dependencies": { 963 | "is-extglob": "^2.1.1" 964 | }, 965 | "engines": { 966 | "node": ">=0.10.0" 967 | } 968 | }, 969 | "node_modules/is-number": { 970 | "version": "7.0.0", 971 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 972 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 973 | "dev": true, 974 | "engines": { 975 | "node": ">=0.12.0" 976 | } 977 | }, 978 | "node_modules/is-plain-obj": { 979 | "version": "2.1.0", 980 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 981 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 982 | "dev": true, 983 | "engines": { 984 | "node": ">=8" 985 | } 986 | }, 987 | "node_modules/is-stream": { 988 | "version": "1.1.0", 989 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 990 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 991 | "dev": true, 992 | "engines": { 993 | "node": ">=0.10.0" 994 | } 995 | }, 996 | "node_modules/is-unicode-supported": { 997 | "version": "0.1.0", 998 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 999 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1000 | "dev": true, 1001 | "engines": { 1002 | "node": ">=10" 1003 | }, 1004 | "funding": { 1005 | "url": "https://github.com/sponsors/sindresorhus" 1006 | } 1007 | }, 1008 | "node_modules/isexe": { 1009 | "version": "2.0.0", 1010 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1011 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1012 | "dev": true 1013 | }, 1014 | "node_modules/istanbul-lib-coverage": { 1015 | "version": "2.0.5", 1016 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", 1017 | "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", 1018 | "dev": true, 1019 | "engines": { 1020 | "node": ">=6" 1021 | } 1022 | }, 1023 | "node_modules/istanbul-lib-hook": { 1024 | "version": "2.0.7", 1025 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", 1026 | "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", 1027 | "dev": true, 1028 | "dependencies": { 1029 | "append-transform": "^1.0.0" 1030 | }, 1031 | "engines": { 1032 | "node": ">=6" 1033 | } 1034 | }, 1035 | "node_modules/istanbul-lib-instrument": { 1036 | "version": "3.3.0", 1037 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", 1038 | "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", 1039 | "dev": true, 1040 | "dependencies": { 1041 | "@babel/generator": "^7.4.0", 1042 | "@babel/parser": "^7.4.3", 1043 | "@babel/template": "^7.4.0", 1044 | "@babel/traverse": "^7.4.3", 1045 | "@babel/types": "^7.4.0", 1046 | "istanbul-lib-coverage": "^2.0.5", 1047 | "semver": "^6.0.0" 1048 | }, 1049 | "engines": { 1050 | "node": ">=6" 1051 | } 1052 | }, 1053 | "node_modules/istanbul-lib-instrument/node_modules/semver": { 1054 | "version": "6.3.1", 1055 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1056 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1057 | "dev": true, 1058 | "bin": { 1059 | "semver": "bin/semver.js" 1060 | } 1061 | }, 1062 | "node_modules/istanbul-lib-report": { 1063 | "version": "2.0.8", 1064 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", 1065 | "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", 1066 | "dev": true, 1067 | "dependencies": { 1068 | "istanbul-lib-coverage": "^2.0.5", 1069 | "make-dir": "^2.1.0", 1070 | "supports-color": "^6.1.0" 1071 | }, 1072 | "engines": { 1073 | "node": ">=6" 1074 | } 1075 | }, 1076 | "node_modules/istanbul-lib-report/node_modules/has-flag": { 1077 | "version": "3.0.0", 1078 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1079 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1080 | "dev": true, 1081 | "engines": { 1082 | "node": ">=4" 1083 | } 1084 | }, 1085 | "node_modules/istanbul-lib-report/node_modules/supports-color": { 1086 | "version": "6.1.0", 1087 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 1088 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 1089 | "dev": true, 1090 | "dependencies": { 1091 | "has-flag": "^3.0.0" 1092 | }, 1093 | "engines": { 1094 | "node": ">=6" 1095 | } 1096 | }, 1097 | "node_modules/istanbul-lib-source-maps": { 1098 | "version": "3.0.6", 1099 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", 1100 | "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", 1101 | "dev": true, 1102 | "dependencies": { 1103 | "debug": "^4.1.1", 1104 | "istanbul-lib-coverage": "^2.0.5", 1105 | "make-dir": "^2.1.0", 1106 | "rimraf": "^2.6.3", 1107 | "source-map": "^0.6.1" 1108 | }, 1109 | "engines": { 1110 | "node": ">=6" 1111 | } 1112 | }, 1113 | "node_modules/istanbul-lib-source-maps/node_modules/debug": { 1114 | "version": "4.1.1", 1115 | "resolved": "http://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1116 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1117 | "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "ms": "^2.1.1" 1121 | } 1122 | }, 1123 | "node_modules/istanbul-lib-source-maps/node_modules/ms": { 1124 | "version": "2.1.2", 1125 | "resolved": "http://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1126 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1127 | "dev": true 1128 | }, 1129 | "node_modules/istanbul-lib-source-maps/node_modules/source-map": { 1130 | "version": "0.6.1", 1131 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1132 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1133 | "dev": true, 1134 | "engines": { 1135 | "node": ">=0.10.0" 1136 | } 1137 | }, 1138 | "node_modules/istanbul-reports": { 1139 | "version": "2.2.6", 1140 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", 1141 | "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", 1142 | "dev": true, 1143 | "dependencies": { 1144 | "handlebars": "^4.1.2" 1145 | }, 1146 | "engines": { 1147 | "node": ">=6" 1148 | } 1149 | }, 1150 | "node_modules/js-tokens": { 1151 | "version": "4.0.0", 1152 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1153 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1154 | "dev": true 1155 | }, 1156 | "node_modules/js-yaml": { 1157 | "version": "4.1.0", 1158 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1159 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1160 | "dev": true, 1161 | "dependencies": { 1162 | "argparse": "^2.0.1" 1163 | }, 1164 | "bin": { 1165 | "js-yaml": "bin/js-yaml.js" 1166 | } 1167 | }, 1168 | "node_modules/js-yaml/node_modules/argparse": { 1169 | "version": "2.0.1", 1170 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1171 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1172 | "dev": true 1173 | }, 1174 | "node_modules/jsesc": { 1175 | "version": "2.5.2", 1176 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1177 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1178 | "dev": true, 1179 | "bin": { 1180 | "jsesc": "bin/jsesc" 1181 | }, 1182 | "engines": { 1183 | "node": ">=4" 1184 | } 1185 | }, 1186 | "node_modules/json-parse-better-errors": { 1187 | "version": "1.0.2", 1188 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1189 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1190 | "dev": true 1191 | }, 1192 | "node_modules/lcid": { 1193 | "version": "2.0.0", 1194 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 1195 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "invert-kv": "^2.0.0" 1199 | }, 1200 | "engines": { 1201 | "node": ">=6" 1202 | } 1203 | }, 1204 | "node_modules/load-json-file": { 1205 | "version": "4.0.0", 1206 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 1207 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "graceful-fs": "^4.1.2", 1211 | "parse-json": "^4.0.0", 1212 | "pify": "^3.0.0", 1213 | "strip-bom": "^3.0.0" 1214 | }, 1215 | "engines": { 1216 | "node": ">=4" 1217 | } 1218 | }, 1219 | "node_modules/load-json-file/node_modules/pify": { 1220 | "version": "3.0.0", 1221 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1222 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1223 | "dev": true, 1224 | "engines": { 1225 | "node": ">=4" 1226 | } 1227 | }, 1228 | "node_modules/locate-path": { 1229 | "version": "3.0.0", 1230 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1231 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1232 | "dev": true, 1233 | "dependencies": { 1234 | "p-locate": "^3.0.0", 1235 | "path-exists": "^3.0.0" 1236 | }, 1237 | "engines": { 1238 | "node": ">=6" 1239 | } 1240 | }, 1241 | "node_modules/lodash": { 1242 | "version": "4.17.21", 1243 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1244 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1245 | }, 1246 | "node_modules/lodash.flattendeep": { 1247 | "version": "4.4.0", 1248 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", 1249 | "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", 1250 | "dev": true 1251 | }, 1252 | "node_modules/log-symbols": { 1253 | "version": "4.1.0", 1254 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1255 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1256 | "dev": true, 1257 | "dependencies": { 1258 | "chalk": "^4.1.0", 1259 | "is-unicode-supported": "^0.1.0" 1260 | }, 1261 | "engines": { 1262 | "node": ">=10" 1263 | }, 1264 | "funding": { 1265 | "url": "https://github.com/sponsors/sindresorhus" 1266 | } 1267 | }, 1268 | "node_modules/log-symbols/node_modules/ansi-styles": { 1269 | "version": "4.3.0", 1270 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1271 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1272 | "dev": true, 1273 | "dependencies": { 1274 | "color-convert": "^2.0.1" 1275 | }, 1276 | "engines": { 1277 | "node": ">=8" 1278 | }, 1279 | "funding": { 1280 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1281 | } 1282 | }, 1283 | "node_modules/log-symbols/node_modules/chalk": { 1284 | "version": "4.1.2", 1285 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1286 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1287 | "dev": true, 1288 | "dependencies": { 1289 | "ansi-styles": "^4.1.0", 1290 | "supports-color": "^7.1.0" 1291 | }, 1292 | "engines": { 1293 | "node": ">=10" 1294 | }, 1295 | "funding": { 1296 | "url": "https://github.com/chalk/chalk?sponsor=1" 1297 | } 1298 | }, 1299 | "node_modules/log-symbols/node_modules/color-convert": { 1300 | "version": "2.0.1", 1301 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1302 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1303 | "dev": true, 1304 | "dependencies": { 1305 | "color-name": "~1.1.4" 1306 | }, 1307 | "engines": { 1308 | "node": ">=7.0.0" 1309 | } 1310 | }, 1311 | "node_modules/log-symbols/node_modules/color-name": { 1312 | "version": "1.1.4", 1313 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1314 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1315 | "dev": true 1316 | }, 1317 | "node_modules/log-symbols/node_modules/supports-color": { 1318 | "version": "7.2.0", 1319 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1320 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1321 | "dev": true, 1322 | "dependencies": { 1323 | "has-flag": "^4.0.0" 1324 | }, 1325 | "engines": { 1326 | "node": ">=8" 1327 | } 1328 | }, 1329 | "node_modules/lru-cache": { 1330 | "version": "4.0.0", 1331 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", 1332 | "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", 1333 | "dependencies": { 1334 | "pseudomap": "^1.0.1", 1335 | "yallist": "^2.0.0" 1336 | } 1337 | }, 1338 | "node_modules/make-dir": { 1339 | "version": "2.1.0", 1340 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", 1341 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 1342 | "dev": true, 1343 | "dependencies": { 1344 | "pify": "^4.0.1", 1345 | "semver": "^5.6.0" 1346 | }, 1347 | "engines": { 1348 | "node": ">=6" 1349 | } 1350 | }, 1351 | "node_modules/map-age-cleaner": { 1352 | "version": "0.1.3", 1353 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1354 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1355 | "dev": true, 1356 | "dependencies": { 1357 | "p-defer": "^1.0.0" 1358 | }, 1359 | "engines": { 1360 | "node": ">=6" 1361 | } 1362 | }, 1363 | "node_modules/mem": { 1364 | "version": "4.3.0", 1365 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 1366 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 1367 | "dev": true, 1368 | "dependencies": { 1369 | "map-age-cleaner": "^0.1.1", 1370 | "mimic-fn": "^2.0.0", 1371 | "p-is-promise": "^2.0.0" 1372 | }, 1373 | "engines": { 1374 | "node": ">=6" 1375 | } 1376 | }, 1377 | "node_modules/merge-source-map": { 1378 | "version": "1.1.0", 1379 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", 1380 | "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", 1381 | "dev": true, 1382 | "dependencies": { 1383 | "source-map": "^0.6.1" 1384 | } 1385 | }, 1386 | "node_modules/merge-source-map/node_modules/source-map": { 1387 | "version": "0.6.1", 1388 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1389 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1390 | "dev": true, 1391 | "engines": { 1392 | "node": ">=0.10.0" 1393 | } 1394 | }, 1395 | "node_modules/mimic-fn": { 1396 | "version": "2.1.0", 1397 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1398 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1399 | "dev": true, 1400 | "engines": { 1401 | "node": ">=6" 1402 | } 1403 | }, 1404 | "node_modules/minimatch": { 1405 | "version": "3.1.2", 1406 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1407 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1408 | "dev": true, 1409 | "dependencies": { 1410 | "brace-expansion": "^1.1.7" 1411 | }, 1412 | "engines": { 1413 | "node": "*" 1414 | } 1415 | }, 1416 | "node_modules/minimist": { 1417 | "version": "1.2.6", 1418 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1419 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1420 | "dev": true 1421 | }, 1422 | "node_modules/mkdirp": { 1423 | "version": "0.5.6", 1424 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1425 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1426 | "dev": true, 1427 | "dependencies": { 1428 | "minimist": "^1.2.6" 1429 | }, 1430 | "bin": { 1431 | "mkdirp": "bin/cmd.js" 1432 | } 1433 | }, 1434 | "node_modules/mocha": { 1435 | "version": "10.2.0", 1436 | "resolved": "http://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1437 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1438 | "dev": true, 1439 | "dependencies": { 1440 | "ansi-colors": "4.1.1", 1441 | "browser-stdout": "1.3.1", 1442 | "chokidar": "3.5.3", 1443 | "debug": "4.3.4", 1444 | "diff": "5.0.0", 1445 | "escape-string-regexp": "4.0.0", 1446 | "find-up": "5.0.0", 1447 | "glob": "7.2.0", 1448 | "he": "1.2.0", 1449 | "js-yaml": "4.1.0", 1450 | "log-symbols": "4.1.0", 1451 | "minimatch": "5.0.1", 1452 | "ms": "2.1.3", 1453 | "nanoid": "3.3.3", 1454 | "serialize-javascript": "6.0.0", 1455 | "strip-json-comments": "3.1.1", 1456 | "supports-color": "8.1.1", 1457 | "workerpool": "6.2.1", 1458 | "yargs": "16.2.0", 1459 | "yargs-parser": "20.2.4", 1460 | "yargs-unparser": "2.0.0" 1461 | }, 1462 | "bin": { 1463 | "_mocha": "bin/_mocha", 1464 | "mocha": "bin/mocha.js" 1465 | }, 1466 | "engines": { 1467 | "node": ">= 14.0.0" 1468 | }, 1469 | "funding": { 1470 | "type": "opencollective", 1471 | "url": "https://opencollective.com/mochajs" 1472 | } 1473 | }, 1474 | "node_modules/mocha/node_modules/ansi-regex": { 1475 | "version": "5.0.1", 1476 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1477 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1478 | "dev": true, 1479 | "engines": { 1480 | "node": ">=8" 1481 | } 1482 | }, 1483 | "node_modules/mocha/node_modules/ansi-styles": { 1484 | "version": "4.3.0", 1485 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1486 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1487 | "dev": true, 1488 | "dependencies": { 1489 | "color-convert": "^2.0.1" 1490 | }, 1491 | "engines": { 1492 | "node": ">=8" 1493 | }, 1494 | "funding": { 1495 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1496 | } 1497 | }, 1498 | "node_modules/mocha/node_modules/brace-expansion": { 1499 | "version": "2.0.1", 1500 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1501 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1502 | "dev": true, 1503 | "dependencies": { 1504 | "balanced-match": "^1.0.0" 1505 | } 1506 | }, 1507 | "node_modules/mocha/node_modules/cliui": { 1508 | "version": "7.0.4", 1509 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1510 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1511 | "dev": true, 1512 | "dependencies": { 1513 | "string-width": "^4.2.0", 1514 | "strip-ansi": "^6.0.0", 1515 | "wrap-ansi": "^7.0.0" 1516 | } 1517 | }, 1518 | "node_modules/mocha/node_modules/color-convert": { 1519 | "version": "2.0.1", 1520 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1521 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1522 | "dev": true, 1523 | "dependencies": { 1524 | "color-name": "~1.1.4" 1525 | }, 1526 | "engines": { 1527 | "node": ">=7.0.0" 1528 | } 1529 | }, 1530 | "node_modules/mocha/node_modules/color-name": { 1531 | "version": "1.1.4", 1532 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1533 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1534 | "dev": true 1535 | }, 1536 | "node_modules/mocha/node_modules/emoji-regex": { 1537 | "version": "8.0.0", 1538 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1539 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1540 | "dev": true 1541 | }, 1542 | "node_modules/mocha/node_modules/find-up": { 1543 | "version": "5.0.0", 1544 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1545 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1546 | "dev": true, 1547 | "dependencies": { 1548 | "locate-path": "^6.0.0", 1549 | "path-exists": "^4.0.0" 1550 | }, 1551 | "engines": { 1552 | "node": ">=10" 1553 | }, 1554 | "funding": { 1555 | "url": "https://github.com/sponsors/sindresorhus" 1556 | } 1557 | }, 1558 | "node_modules/mocha/node_modules/is-fullwidth-code-point": { 1559 | "version": "3.0.0", 1560 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1561 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1562 | "dev": true, 1563 | "engines": { 1564 | "node": ">=8" 1565 | } 1566 | }, 1567 | "node_modules/mocha/node_modules/locate-path": { 1568 | "version": "6.0.0", 1569 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1570 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1571 | "dev": true, 1572 | "dependencies": { 1573 | "p-locate": "^5.0.0" 1574 | }, 1575 | "engines": { 1576 | "node": ">=10" 1577 | }, 1578 | "funding": { 1579 | "url": "https://github.com/sponsors/sindresorhus" 1580 | } 1581 | }, 1582 | "node_modules/mocha/node_modules/minimatch": { 1583 | "version": "5.0.1", 1584 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1585 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1586 | "dev": true, 1587 | "dependencies": { 1588 | "brace-expansion": "^2.0.1" 1589 | }, 1590 | "engines": { 1591 | "node": ">=10" 1592 | } 1593 | }, 1594 | "node_modules/mocha/node_modules/p-limit": { 1595 | "version": "3.1.0", 1596 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1597 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1598 | "dev": true, 1599 | "dependencies": { 1600 | "yocto-queue": "^0.1.0" 1601 | }, 1602 | "engines": { 1603 | "node": ">=10" 1604 | }, 1605 | "funding": { 1606 | "url": "https://github.com/sponsors/sindresorhus" 1607 | } 1608 | }, 1609 | "node_modules/mocha/node_modules/p-locate": { 1610 | "version": "5.0.0", 1611 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1612 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1613 | "dev": true, 1614 | "dependencies": { 1615 | "p-limit": "^3.0.2" 1616 | }, 1617 | "engines": { 1618 | "node": ">=10" 1619 | }, 1620 | "funding": { 1621 | "url": "https://github.com/sponsors/sindresorhus" 1622 | } 1623 | }, 1624 | "node_modules/mocha/node_modules/path-exists": { 1625 | "version": "4.0.0", 1626 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1627 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1628 | "dev": true, 1629 | "engines": { 1630 | "node": ">=8" 1631 | } 1632 | }, 1633 | "node_modules/mocha/node_modules/string-width": { 1634 | "version": "4.2.3", 1635 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1636 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1637 | "dev": true, 1638 | "dependencies": { 1639 | "emoji-regex": "^8.0.0", 1640 | "is-fullwidth-code-point": "^3.0.0", 1641 | "strip-ansi": "^6.0.1" 1642 | }, 1643 | "engines": { 1644 | "node": ">=8" 1645 | } 1646 | }, 1647 | "node_modules/mocha/node_modules/strip-ansi": { 1648 | "version": "6.0.1", 1649 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1650 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1651 | "dev": true, 1652 | "dependencies": { 1653 | "ansi-regex": "^5.0.1" 1654 | }, 1655 | "engines": { 1656 | "node": ">=8" 1657 | } 1658 | }, 1659 | "node_modules/mocha/node_modules/wrap-ansi": { 1660 | "version": "7.0.0", 1661 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1662 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1663 | "dev": true, 1664 | "dependencies": { 1665 | "ansi-styles": "^4.0.0", 1666 | "string-width": "^4.1.0", 1667 | "strip-ansi": "^6.0.0" 1668 | }, 1669 | "engines": { 1670 | "node": ">=10" 1671 | }, 1672 | "funding": { 1673 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1674 | } 1675 | }, 1676 | "node_modules/mocha/node_modules/y18n": { 1677 | "version": "5.0.8", 1678 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1679 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1680 | "dev": true, 1681 | "engines": { 1682 | "node": ">=10" 1683 | } 1684 | }, 1685 | "node_modules/mocha/node_modules/yargs": { 1686 | "version": "16.2.0", 1687 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1688 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1689 | "dev": true, 1690 | "dependencies": { 1691 | "cliui": "^7.0.2", 1692 | "escalade": "^3.1.1", 1693 | "get-caller-file": "^2.0.5", 1694 | "require-directory": "^2.1.1", 1695 | "string-width": "^4.2.0", 1696 | "y18n": "^5.0.5", 1697 | "yargs-parser": "^20.2.2" 1698 | }, 1699 | "engines": { 1700 | "node": ">=10" 1701 | } 1702 | }, 1703 | "node_modules/mocha/node_modules/yargs-parser": { 1704 | "version": "20.2.4", 1705 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1706 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1707 | "dev": true, 1708 | "engines": { 1709 | "node": ">=10" 1710 | } 1711 | }, 1712 | "node_modules/ms": { 1713 | "version": "2.1.3", 1714 | "resolved": "http://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1715 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1716 | "dev": true 1717 | }, 1718 | "node_modules/nanoid": { 1719 | "version": "3.3.3", 1720 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1721 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1722 | "dev": true, 1723 | "bin": { 1724 | "nanoid": "bin/nanoid.cjs" 1725 | }, 1726 | "engines": { 1727 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1728 | } 1729 | }, 1730 | "node_modules/neo-async": { 1731 | "version": "2.6.2", 1732 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1733 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 1734 | "dev": true 1735 | }, 1736 | "node_modules/nested-error-stacks": { 1737 | "version": "2.1.0", 1738 | "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", 1739 | "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", 1740 | "dev": true 1741 | }, 1742 | "node_modules/nice-try": { 1743 | "version": "1.0.5", 1744 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1745 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1746 | "dev": true 1747 | }, 1748 | "node_modules/normalize-package-data": { 1749 | "version": "2.5.0", 1750 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1751 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1752 | "dev": true, 1753 | "dependencies": { 1754 | "hosted-git-info": "^2.1.4", 1755 | "resolve": "^1.10.0", 1756 | "semver": "2 || 3 || 4 || 5", 1757 | "validate-npm-package-license": "^3.0.1" 1758 | } 1759 | }, 1760 | "node_modules/normalize-package-data/node_modules/resolve": { 1761 | "version": "1.11.1", 1762 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 1763 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 1764 | "dev": true, 1765 | "dependencies": { 1766 | "path-parse": "^1.0.6" 1767 | } 1768 | }, 1769 | "node_modules/normalize-path": { 1770 | "version": "3.0.0", 1771 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1772 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1773 | "dev": true, 1774 | "engines": { 1775 | "node": ">=0.10.0" 1776 | } 1777 | }, 1778 | "node_modules/npm-run-path": { 1779 | "version": "2.0.2", 1780 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1781 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1782 | "dev": true, 1783 | "dependencies": { 1784 | "path-key": "^2.0.0" 1785 | }, 1786 | "engines": { 1787 | "node": ">=4" 1788 | } 1789 | }, 1790 | "node_modules/nyc": { 1791 | "version": "14.1.1", 1792 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", 1793 | "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", 1794 | "dev": true, 1795 | "dependencies": { 1796 | "archy": "^1.0.0", 1797 | "caching-transform": "^3.0.2", 1798 | "convert-source-map": "^1.6.0", 1799 | "cp-file": "^6.2.0", 1800 | "find-cache-dir": "^2.1.0", 1801 | "find-up": "^3.0.0", 1802 | "foreground-child": "^1.5.6", 1803 | "glob": "^7.1.3", 1804 | "istanbul-lib-coverage": "^2.0.5", 1805 | "istanbul-lib-hook": "^2.0.7", 1806 | "istanbul-lib-instrument": "^3.3.0", 1807 | "istanbul-lib-report": "^2.0.8", 1808 | "istanbul-lib-source-maps": "^3.0.6", 1809 | "istanbul-reports": "^2.2.4", 1810 | "js-yaml": "^3.13.1", 1811 | "make-dir": "^2.1.0", 1812 | "merge-source-map": "^1.1.0", 1813 | "resolve-from": "^4.0.0", 1814 | "rimraf": "^2.6.3", 1815 | "signal-exit": "^3.0.2", 1816 | "spawn-wrap": "^1.4.2", 1817 | "test-exclude": "^5.2.3", 1818 | "uuid": "^3.3.2", 1819 | "yargs": "^13.2.2", 1820 | "yargs-parser": "^13.0.0" 1821 | }, 1822 | "bin": { 1823 | "nyc": "bin/nyc.js" 1824 | }, 1825 | "engines": { 1826 | "node": ">=6" 1827 | } 1828 | }, 1829 | "node_modules/nyc/node_modules/esprima": { 1830 | "version": "4.0.1", 1831 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1832 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1833 | "dev": true, 1834 | "bin": { 1835 | "esparse": "bin/esparse.js", 1836 | "esvalidate": "bin/esvalidate.js" 1837 | }, 1838 | "engines": { 1839 | "node": ">=4" 1840 | } 1841 | }, 1842 | "node_modules/nyc/node_modules/glob": { 1843 | "version": "7.1.4", 1844 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 1845 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 1846 | "dev": true, 1847 | "dependencies": { 1848 | "fs.realpath": "^1.0.0", 1849 | "inflight": "^1.0.4", 1850 | "inherits": "2", 1851 | "minimatch": "^3.0.4", 1852 | "once": "^1.3.0", 1853 | "path-is-absolute": "^1.0.0" 1854 | }, 1855 | "engines": { 1856 | "node": "*" 1857 | } 1858 | }, 1859 | "node_modules/nyc/node_modules/js-yaml": { 1860 | "version": "3.13.1", 1861 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1862 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1863 | "dev": true, 1864 | "dependencies": { 1865 | "argparse": "^1.0.7", 1866 | "esprima": "^4.0.0" 1867 | }, 1868 | "bin": { 1869 | "js-yaml": "bin/js-yaml.js" 1870 | } 1871 | }, 1872 | "node_modules/nyc/node_modules/uuid": { 1873 | "version": "3.3.2", 1874 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1875 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1876 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1877 | "dev": true, 1878 | "bin": { 1879 | "uuid": "bin/uuid" 1880 | } 1881 | }, 1882 | "node_modules/once": { 1883 | "version": "1.4.0", 1884 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1885 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1886 | "dev": true, 1887 | "dependencies": { 1888 | "wrappy": "1" 1889 | } 1890 | }, 1891 | "node_modules/os-homedir": { 1892 | "version": "1.0.2", 1893 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1894 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1895 | "dev": true, 1896 | "engines": { 1897 | "node": ">=0.10.0" 1898 | } 1899 | }, 1900 | "node_modules/os-locale": { 1901 | "version": "3.1.0", 1902 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 1903 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 1904 | "dev": true, 1905 | "dependencies": { 1906 | "execa": "^1.0.0", 1907 | "lcid": "^2.0.0", 1908 | "mem": "^4.0.0" 1909 | }, 1910 | "engines": { 1911 | "node": ">=6" 1912 | } 1913 | }, 1914 | "node_modules/p-defer": { 1915 | "version": "1.0.0", 1916 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1917 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 1918 | "dev": true, 1919 | "engines": { 1920 | "node": ">=4" 1921 | } 1922 | }, 1923 | "node_modules/p-finally": { 1924 | "version": "1.0.0", 1925 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1926 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1927 | "dev": true, 1928 | "engines": { 1929 | "node": ">=4" 1930 | } 1931 | }, 1932 | "node_modules/p-is-promise": { 1933 | "version": "2.1.0", 1934 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 1935 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", 1936 | "dev": true, 1937 | "engines": { 1938 | "node": ">=6" 1939 | } 1940 | }, 1941 | "node_modules/p-limit": { 1942 | "version": "2.2.0", 1943 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", 1944 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", 1945 | "dev": true, 1946 | "dependencies": { 1947 | "p-try": "^2.0.0" 1948 | }, 1949 | "engines": { 1950 | "node": ">=6" 1951 | } 1952 | }, 1953 | "node_modules/p-locate": { 1954 | "version": "3.0.0", 1955 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1956 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1957 | "dev": true, 1958 | "dependencies": { 1959 | "p-limit": "^2.0.0" 1960 | }, 1961 | "engines": { 1962 | "node": ">=6" 1963 | } 1964 | }, 1965 | "node_modules/p-try": { 1966 | "version": "2.2.0", 1967 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1968 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1969 | "dev": true, 1970 | "engines": { 1971 | "node": ">=6" 1972 | } 1973 | }, 1974 | "node_modules/package-hash": { 1975 | "version": "3.0.0", 1976 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", 1977 | "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", 1978 | "dev": true, 1979 | "dependencies": { 1980 | "graceful-fs": "^4.1.15", 1981 | "hasha": "^3.0.0", 1982 | "lodash.flattendeep": "^4.4.0", 1983 | "release-zalgo": "^1.0.0" 1984 | }, 1985 | "engines": { 1986 | "node": ">=6" 1987 | } 1988 | }, 1989 | "node_modules/parse-json": { 1990 | "version": "4.0.0", 1991 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1992 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1993 | "dev": true, 1994 | "dependencies": { 1995 | "error-ex": "^1.3.1", 1996 | "json-parse-better-errors": "^1.0.1" 1997 | }, 1998 | "engines": { 1999 | "node": ">=4" 2000 | } 2001 | }, 2002 | "node_modules/path-exists": { 2003 | "version": "3.0.0", 2004 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2005 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2006 | "dev": true, 2007 | "engines": { 2008 | "node": ">=4" 2009 | } 2010 | }, 2011 | "node_modules/path-is-absolute": { 2012 | "version": "1.0.1", 2013 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2014 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2015 | "dev": true, 2016 | "engines": { 2017 | "node": ">=0.10.0" 2018 | } 2019 | }, 2020 | "node_modules/path-key": { 2021 | "version": "2.0.1", 2022 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2023 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2024 | "dev": true, 2025 | "engines": { 2026 | "node": ">=4" 2027 | } 2028 | }, 2029 | "node_modules/path-parse": { 2030 | "version": "1.0.7", 2031 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2032 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2033 | "dev": true 2034 | }, 2035 | "node_modules/path-type": { 2036 | "version": "3.0.0", 2037 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 2038 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 2039 | "dev": true, 2040 | "dependencies": { 2041 | "pify": "^3.0.0" 2042 | }, 2043 | "engines": { 2044 | "node": ">=4" 2045 | } 2046 | }, 2047 | "node_modules/path-type/node_modules/pify": { 2048 | "version": "3.0.0", 2049 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2050 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2051 | "dev": true, 2052 | "engines": { 2053 | "node": ">=4" 2054 | } 2055 | }, 2056 | "node_modules/picomatch": { 2057 | "version": "2.3.1", 2058 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2059 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2060 | "dev": true, 2061 | "engines": { 2062 | "node": ">=8.6" 2063 | }, 2064 | "funding": { 2065 | "url": "https://github.com/sponsors/jonschlinkert" 2066 | } 2067 | }, 2068 | "node_modules/pify": { 2069 | "version": "4.0.1", 2070 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 2071 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 2072 | "dev": true, 2073 | "engines": { 2074 | "node": ">=6" 2075 | } 2076 | }, 2077 | "node_modules/pkg-dir": { 2078 | "version": "3.0.0", 2079 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", 2080 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", 2081 | "dev": true, 2082 | "dependencies": { 2083 | "find-up": "^3.0.0" 2084 | }, 2085 | "engines": { 2086 | "node": ">=6" 2087 | } 2088 | }, 2089 | "node_modules/pseudomap": { 2090 | "version": "1.0.2", 2091 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2092 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 2093 | }, 2094 | "node_modules/pump": { 2095 | "version": "3.0.0", 2096 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2097 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2098 | "dev": true, 2099 | "dependencies": { 2100 | "end-of-stream": "^1.1.0", 2101 | "once": "^1.3.1" 2102 | } 2103 | }, 2104 | "node_modules/randombytes": { 2105 | "version": "2.1.0", 2106 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2107 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2108 | "dev": true, 2109 | "dependencies": { 2110 | "safe-buffer": "^5.1.0" 2111 | } 2112 | }, 2113 | "node_modules/read-pkg": { 2114 | "version": "3.0.0", 2115 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 2116 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 2117 | "dev": true, 2118 | "dependencies": { 2119 | "load-json-file": "^4.0.0", 2120 | "normalize-package-data": "^2.3.2", 2121 | "path-type": "^3.0.0" 2122 | }, 2123 | "engines": { 2124 | "node": ">=4" 2125 | } 2126 | }, 2127 | "node_modules/read-pkg-up": { 2128 | "version": "4.0.0", 2129 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", 2130 | "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", 2131 | "dev": true, 2132 | "dependencies": { 2133 | "find-up": "^3.0.0", 2134 | "read-pkg": "^3.0.0" 2135 | }, 2136 | "engines": { 2137 | "node": ">=6" 2138 | } 2139 | }, 2140 | "node_modules/readdirp": { 2141 | "version": "3.6.0", 2142 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2143 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2144 | "dev": true, 2145 | "dependencies": { 2146 | "picomatch": "^2.2.1" 2147 | }, 2148 | "engines": { 2149 | "node": ">=8.10.0" 2150 | } 2151 | }, 2152 | "node_modules/release-zalgo": { 2153 | "version": "1.0.0", 2154 | "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", 2155 | "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", 2156 | "dev": true, 2157 | "dependencies": { 2158 | "es6-error": "^4.0.1" 2159 | }, 2160 | "engines": { 2161 | "node": ">=4" 2162 | } 2163 | }, 2164 | "node_modules/require-directory": { 2165 | "version": "2.1.1", 2166 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2167 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2168 | "dev": true, 2169 | "engines": { 2170 | "node": ">=0.10.0" 2171 | } 2172 | }, 2173 | "node_modules/require-main-filename": { 2174 | "version": "2.0.0", 2175 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2176 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2177 | "dev": true 2178 | }, 2179 | "node_modules/resolve-from": { 2180 | "version": "4.0.0", 2181 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2182 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2183 | "dev": true, 2184 | "engines": { 2185 | "node": ">=4" 2186 | } 2187 | }, 2188 | "node_modules/rimraf": { 2189 | "version": "2.6.3", 2190 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2191 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2192 | "dev": true, 2193 | "dependencies": { 2194 | "glob": "^7.1.3" 2195 | }, 2196 | "bin": { 2197 | "rimraf": "bin.js" 2198 | } 2199 | }, 2200 | "node_modules/rimraf/node_modules/glob": { 2201 | "version": "7.1.4", 2202 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 2203 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 2204 | "dev": true, 2205 | "dependencies": { 2206 | "fs.realpath": "^1.0.0", 2207 | "inflight": "^1.0.4", 2208 | "inherits": "2", 2209 | "minimatch": "^3.0.4", 2210 | "once": "^1.3.0", 2211 | "path-is-absolute": "^1.0.0" 2212 | }, 2213 | "engines": { 2214 | "node": "*" 2215 | } 2216 | }, 2217 | "node_modules/safe-buffer": { 2218 | "version": "5.1.2", 2219 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2220 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2221 | "dev": true 2222 | }, 2223 | "node_modules/semver": { 2224 | "version": "5.7.2", 2225 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 2226 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 2227 | "dev": true, 2228 | "bin": { 2229 | "semver": "bin/semver" 2230 | } 2231 | }, 2232 | "node_modules/serialize-javascript": { 2233 | "version": "6.0.0", 2234 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2235 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2236 | "dev": true, 2237 | "dependencies": { 2238 | "randombytes": "^2.1.0" 2239 | } 2240 | }, 2241 | "node_modules/set-blocking": { 2242 | "version": "2.0.0", 2243 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2244 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 2245 | "dev": true 2246 | }, 2247 | "node_modules/shebang-command": { 2248 | "version": "1.2.0", 2249 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2250 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2251 | "dev": true, 2252 | "dependencies": { 2253 | "shebang-regex": "^1.0.0" 2254 | }, 2255 | "engines": { 2256 | "node": ">=0.10.0" 2257 | } 2258 | }, 2259 | "node_modules/shebang-regex": { 2260 | "version": "1.0.0", 2261 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2262 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2263 | "dev": true, 2264 | "engines": { 2265 | "node": ">=0.10.0" 2266 | } 2267 | }, 2268 | "node_modules/signal-exit": { 2269 | "version": "3.0.2", 2270 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2271 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2272 | "dev": true 2273 | }, 2274 | "node_modules/source-map": { 2275 | "version": "0.6.1", 2276 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2277 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2278 | "dev": true, 2279 | "engines": { 2280 | "node": ">=0.10.0" 2281 | } 2282 | }, 2283 | "node_modules/spawn-wrap": { 2284 | "version": "1.4.2", 2285 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", 2286 | "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", 2287 | "dev": true, 2288 | "dependencies": { 2289 | "foreground-child": "^1.5.6", 2290 | "mkdirp": "^0.5.0", 2291 | "os-homedir": "^1.0.1", 2292 | "rimraf": "^2.6.2", 2293 | "signal-exit": "^3.0.2", 2294 | "which": "^1.3.0" 2295 | } 2296 | }, 2297 | "node_modules/spdx-correct": { 2298 | "version": "3.1.0", 2299 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 2300 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 2301 | "dev": true, 2302 | "dependencies": { 2303 | "spdx-expression-parse": "^3.0.0", 2304 | "spdx-license-ids": "^3.0.0" 2305 | } 2306 | }, 2307 | "node_modules/spdx-exceptions": { 2308 | "version": "2.2.0", 2309 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 2310 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 2311 | "dev": true 2312 | }, 2313 | "node_modules/spdx-expression-parse": { 2314 | "version": "3.0.0", 2315 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 2316 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 2317 | "dev": true, 2318 | "dependencies": { 2319 | "spdx-exceptions": "^2.1.0", 2320 | "spdx-license-ids": "^3.0.0" 2321 | } 2322 | }, 2323 | "node_modules/spdx-license-ids": { 2324 | "version": "3.0.5", 2325 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 2326 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 2327 | "dev": true 2328 | }, 2329 | "node_modules/sprintf-js": { 2330 | "version": "1.0.3", 2331 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2332 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2333 | "dev": true 2334 | }, 2335 | "node_modules/string-width": { 2336 | "version": "3.1.0", 2337 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2338 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2339 | "dev": true, 2340 | "dependencies": { 2341 | "emoji-regex": "^7.0.1", 2342 | "is-fullwidth-code-point": "^2.0.0", 2343 | "strip-ansi": "^5.1.0" 2344 | }, 2345 | "engines": { 2346 | "node": ">=6" 2347 | } 2348 | }, 2349 | "node_modules/strip-ansi": { 2350 | "version": "5.2.0", 2351 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2352 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2353 | "dev": true, 2354 | "dependencies": { 2355 | "ansi-regex": "^4.1.0" 2356 | }, 2357 | "engines": { 2358 | "node": ">=6" 2359 | } 2360 | }, 2361 | "node_modules/strip-bom": { 2362 | "version": "3.0.0", 2363 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2364 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2365 | "dev": true, 2366 | "engines": { 2367 | "node": ">=4" 2368 | } 2369 | }, 2370 | "node_modules/strip-eof": { 2371 | "version": "1.0.0", 2372 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2373 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 2374 | "dev": true, 2375 | "engines": { 2376 | "node": ">=0.10.0" 2377 | } 2378 | }, 2379 | "node_modules/strip-json-comments": { 2380 | "version": "3.1.1", 2381 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2382 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2383 | "dev": true, 2384 | "engines": { 2385 | "node": ">=8" 2386 | }, 2387 | "funding": { 2388 | "url": "https://github.com/sponsors/sindresorhus" 2389 | } 2390 | }, 2391 | "node_modules/supports-color": { 2392 | "version": "8.1.1", 2393 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2394 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2395 | "dev": true, 2396 | "dependencies": { 2397 | "has-flag": "^4.0.0" 2398 | }, 2399 | "engines": { 2400 | "node": ">=10" 2401 | }, 2402 | "funding": { 2403 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2404 | } 2405 | }, 2406 | "node_modules/test-exclude": { 2407 | "version": "5.2.3", 2408 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", 2409 | "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", 2410 | "dev": true, 2411 | "dependencies": { 2412 | "glob": "^7.1.3", 2413 | "minimatch": "^3.0.4", 2414 | "read-pkg-up": "^4.0.0", 2415 | "require-main-filename": "^2.0.0" 2416 | }, 2417 | "engines": { 2418 | "node": ">=6" 2419 | } 2420 | }, 2421 | "node_modules/test-exclude/node_modules/glob": { 2422 | "version": "7.1.4", 2423 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 2424 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 2425 | "dev": true, 2426 | "dependencies": { 2427 | "fs.realpath": "^1.0.0", 2428 | "inflight": "^1.0.4", 2429 | "inherits": "2", 2430 | "minimatch": "^3.0.4", 2431 | "once": "^1.3.0", 2432 | "path-is-absolute": "^1.0.0" 2433 | }, 2434 | "engines": { 2435 | "node": "*" 2436 | } 2437 | }, 2438 | "node_modules/to-fast-properties": { 2439 | "version": "2.0.0", 2440 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2441 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2442 | "dev": true, 2443 | "engines": { 2444 | "node": ">=4" 2445 | } 2446 | }, 2447 | "node_modules/to-regex-range": { 2448 | "version": "5.0.1", 2449 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2450 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2451 | "dev": true, 2452 | "dependencies": { 2453 | "is-number": "^7.0.0" 2454 | }, 2455 | "engines": { 2456 | "node": ">=8.0" 2457 | } 2458 | }, 2459 | "node_modules/trim-right": { 2460 | "version": "1.0.1", 2461 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 2462 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 2463 | "dev": true, 2464 | "engines": { 2465 | "node": ">=0.10.0" 2466 | } 2467 | }, 2468 | "node_modules/type-detect": { 2469 | "version": "1.0.0", 2470 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 2471 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 2472 | "dev": true, 2473 | "engines": { 2474 | "node": "*" 2475 | } 2476 | }, 2477 | "node_modules/uglify-js": { 2478 | "version": "3.15.3", 2479 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", 2480 | "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", 2481 | "dev": true, 2482 | "optional": true, 2483 | "bin": { 2484 | "uglifyjs": "bin/uglifyjs" 2485 | }, 2486 | "engines": { 2487 | "node": ">=0.8.0" 2488 | } 2489 | }, 2490 | "node_modules/uuid": { 2491 | "version": "2.0.3", 2492 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 2493 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", 2494 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." 2495 | }, 2496 | "node_modules/validate-npm-package-license": { 2497 | "version": "3.0.4", 2498 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2499 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2500 | "dev": true, 2501 | "dependencies": { 2502 | "spdx-correct": "^3.0.0", 2503 | "spdx-expression-parse": "^3.0.0" 2504 | } 2505 | }, 2506 | "node_modules/which": { 2507 | "version": "1.3.1", 2508 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2509 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2510 | "dev": true, 2511 | "dependencies": { 2512 | "isexe": "^2.0.0" 2513 | }, 2514 | "bin": { 2515 | "which": "bin/which" 2516 | } 2517 | }, 2518 | "node_modules/which-module": { 2519 | "version": "2.0.0", 2520 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2521 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2522 | "dev": true 2523 | }, 2524 | "node_modules/wordwrap": { 2525 | "version": "1.0.0", 2526 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2527 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2528 | "dev": true 2529 | }, 2530 | "node_modules/workerpool": { 2531 | "version": "6.2.1", 2532 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2533 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2534 | "dev": true 2535 | }, 2536 | "node_modules/wrap-ansi": { 2537 | "version": "5.1.0", 2538 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 2539 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 2540 | "dev": true, 2541 | "dependencies": { 2542 | "ansi-styles": "^3.2.0", 2543 | "string-width": "^3.0.0", 2544 | "strip-ansi": "^5.0.0" 2545 | }, 2546 | "engines": { 2547 | "node": ">=6" 2548 | } 2549 | }, 2550 | "node_modules/wrappy": { 2551 | "version": "1.0.2", 2552 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2553 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2554 | "dev": true 2555 | }, 2556 | "node_modules/write-file-atomic": { 2557 | "version": "2.4.3", 2558 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", 2559 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", 2560 | "dev": true, 2561 | "dependencies": { 2562 | "graceful-fs": "^4.1.11", 2563 | "imurmurhash": "^0.1.4", 2564 | "signal-exit": "^3.0.2" 2565 | } 2566 | }, 2567 | "node_modules/y18n": { 2568 | "version": "4.0.1", 2569 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 2570 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", 2571 | "dev": true 2572 | }, 2573 | "node_modules/yallist": { 2574 | "version": "2.1.2", 2575 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2576 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 2577 | }, 2578 | "node_modules/yargs": { 2579 | "version": "13.2.4", 2580 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", 2581 | "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", 2582 | "dev": true, 2583 | "dependencies": { 2584 | "cliui": "^5.0.0", 2585 | "find-up": "^3.0.0", 2586 | "get-caller-file": "^2.0.1", 2587 | "os-locale": "^3.1.0", 2588 | "require-directory": "^2.1.1", 2589 | "require-main-filename": "^2.0.0", 2590 | "set-blocking": "^2.0.0", 2591 | "string-width": "^3.0.0", 2592 | "which-module": "^2.0.0", 2593 | "y18n": "^4.0.0", 2594 | "yargs-parser": "^13.1.0" 2595 | } 2596 | }, 2597 | "node_modules/yargs-parser": { 2598 | "version": "13.1.2", 2599 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 2600 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 2601 | "dev": true, 2602 | "dependencies": { 2603 | "camelcase": "^5.0.0", 2604 | "decamelize": "^1.2.0" 2605 | } 2606 | }, 2607 | "node_modules/yargs-unparser": { 2608 | "version": "2.0.0", 2609 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2610 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2611 | "dev": true, 2612 | "dependencies": { 2613 | "camelcase": "^6.0.0", 2614 | "decamelize": "^4.0.0", 2615 | "flat": "^5.0.2", 2616 | "is-plain-obj": "^2.1.0" 2617 | }, 2618 | "engines": { 2619 | "node": ">=10" 2620 | } 2621 | }, 2622 | "node_modules/yargs-unparser/node_modules/camelcase": { 2623 | "version": "6.3.0", 2624 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2625 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2626 | "dev": true, 2627 | "engines": { 2628 | "node": ">=10" 2629 | }, 2630 | "funding": { 2631 | "url": "https://github.com/sponsors/sindresorhus" 2632 | } 2633 | }, 2634 | "node_modules/yargs-unparser/node_modules/decamelize": { 2635 | "version": "4.0.0", 2636 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 2637 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 2638 | "dev": true, 2639 | "engines": { 2640 | "node": ">=10" 2641 | }, 2642 | "funding": { 2643 | "url": "https://github.com/sponsors/sindresorhus" 2644 | } 2645 | }, 2646 | "node_modules/yocto-queue": { 2647 | "version": "0.1.0", 2648 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2649 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2650 | "dev": true, 2651 | "engines": { 2652 | "node": ">=10" 2653 | }, 2654 | "funding": { 2655 | "url": "https://github.com/sponsors/sindresorhus" 2656 | } 2657 | } 2658 | } 2659 | } 2660 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cache-manager-fs", 3 | "version": "1.0.12", 4 | "description": "file system store for node cache manager", 5 | "keywords": [ 6 | "cache-manager", 7 | "storage", 8 | "filesystem" 9 | ], 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/hotelde/node-cache-manager-fs.git" 13 | }, 14 | "bugs": { 15 | "url": "https://github.com/hotelde/node-cache-manager-fs/issues" 16 | }, 17 | "main": "index.js", 18 | "scripts": { 19 | "test": "mocha", 20 | "cover": "nyc --no-clean npm run test", 21 | "report": "nyc report --reporter=lcov --reporter=text", 22 | "show-coverage": "start coverage\\lcov-report\\index.html", 23 | "coverage": "npm run cover && npm run report && npm run show-coverage" 24 | }, 25 | "author": "Markus Pfann", 26 | "license": "ISC", 27 | "dependencies": { 28 | "async": "^2.6.4", 29 | "cache-manager": "^1.1.0", 30 | "extend": "^3.0.0", 31 | "fs-promise": "^0.3.1", 32 | "uuid": "^2.0.1" 33 | }, 34 | "devDependencies": { 35 | "chai": "^3.3.0", 36 | "mocha": "^10.2.0", 37 | "nyc": "^14.1.1" 38 | }, 39 | "nyc": { 40 | "all": true 41 | }, 42 | "homepage": "https://github.com/hotelde/node-cache-manager-fs#readme", 43 | "directories": { 44 | "test": "test" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | var assert = require('chai').assert; 2 | var store = require('../index.js') 3 | var fs = require('fs'); 4 | const removeDir = require('rimraf'); 5 | var path = require('path'); 6 | var uuid = require('uuid'); 7 | const cacheDirectory = __dirname + '/cache'; 8 | 9 | function countFilesInCacheDir() { 10 | return fs.readdirSync(cacheDirectory).length; 11 | } 12 | 13 | describe('tests for the disk-store module', function () { 14 | 15 | // remove test directory before each test 16 | beforeEach(function (done) { 17 | removeDir(cacheDirectory, function (err) { 18 | cache = store.create({path: cacheDirectory}); 19 | done(err); 20 | }); 21 | }); 22 | // remove test directory after last test 23 | after(function (done) { 24 | removeDir(cacheDirectory, done); 25 | }); 26 | 27 | describe('construction', function () { 28 | it('should create cache dir', function () { 29 | assert(fs.existsSync(cache.options.path)); 30 | }); 31 | 32 | it('simple create cache test', function () 33 | { 34 | // create a store with default values 35 | var s = store.create(); 36 | // check the creation result 37 | assert.isObject(s); 38 | assert.isObject(s.options); 39 | assert.isTrue(fs.existsSync(s.options.path)); 40 | }); 41 | 42 | it('create cache with option path test', function () { 43 | // create a store 44 | var s = store.create({options: {path:cacheDirectory, preventfill:true}}); 45 | // check path option creation 46 | assert.isObject(s); 47 | assert.isObject(s.options); 48 | assert.isTrue(fs.existsSync(s.options.path)); 49 | assert(s.options.path == cacheDirectory); 50 | }); 51 | }); 52 | 53 | describe('get', function () { 54 | 55 | it('should return undefined on non existing key callback', function (done) 56 | { 57 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 58 | s.get('asdf', function (err, data) 59 | { 60 | assert.strictEqual(null, err); 61 | assert.strictEqual(null, data); 62 | // assert(data === null); 63 | done(); 64 | }); 65 | }); 66 | 67 | describe('test missing file on disk', function() { 68 | it('filename empty', function (done){ 69 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 70 | s.set('test','test', function (err) 71 | { 72 | assert(err === null); 73 | var tmpfilename = s.collection['test'].filename; 74 | s.collection['test'].filename = null; 75 | s.get('test', function (err,data) { 76 | assert(err !== null); 77 | assert(data == null); 78 | s.collection['test'].filename = tmpfilename; 79 | s.del('test', function (err) 80 | { 81 | assert(err == null); 82 | done(); 83 | }); 84 | }) 85 | }); 86 | }); 87 | 88 | it('file does not exist', function (done){ 89 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 90 | s.set('test','test', function (err) 91 | { 92 | assert(err === null); 93 | var tmpfilename = s.collection['test'].filename; 94 | s.collection['test'].filename = "bla"; 95 | s.get('test', function (err,data) { 96 | assert(err !== null); 97 | assert(data == null); 98 | s.collection['test'].filename = tmpfilename; 99 | s.del('test', function (err) 100 | { 101 | assert(err == null); 102 | done(); 103 | }); 104 | }) 105 | }); 106 | }); 107 | }); 108 | 109 | it('test expired of key (and also ttl option on setting)', function (done) 110 | { 111 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 112 | s.set('asdf','blabla', {ttl:-1000}, function (err) 113 | { 114 | assert(err === null) 115 | s.get('asdf',function (err,data){ 116 | assert(err === null, 'error is not null!'+err); 117 | assert(data === null); 118 | done(); 119 | }) 120 | }); 121 | }) 122 | }); 123 | 124 | describe('set', function () { 125 | 126 | it('simple set test', function (done) 127 | { 128 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 129 | var data = 'a lot of data in a file' 130 | s.set('asdf',data, function (err,data2) 131 | { 132 | assert(err === null); 133 | assert(data2,'check if entry has been returned on insert'); 134 | s.get('asdf', function (err, data2) 135 | { 136 | assert(data2,'check if entry could be retrieved'); 137 | assert(data === data2); 138 | done(); 139 | }); 140 | }); 141 | }); 142 | }); 143 | 144 | describe('keys', function() { 145 | 146 | it('simple keys test', function (done) { 147 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 148 | var data = 'just a string with data'; 149 | s.set('key123', data, function (err, data2) { 150 | assert(err === null); 151 | s.keys(function(err, keys) { 152 | assert(err === null); 153 | assert(keys.length === 1); 154 | assert(keys[0] === 'key123'); 155 | done(); 156 | }); 157 | }); 158 | }); 159 | }); 160 | 161 | describe('del / reset', function () { 162 | 163 | it('simple del test for not existing key', function (done) 164 | { 165 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 166 | s.del('not existing', function (err) { 167 | done(); 168 | }); 169 | }); 170 | 171 | it('successfull deletion', function (done) 172 | { 173 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 174 | s.set('nix','empty', function (err) { 175 | assert(err === null); 176 | s.reset('nix', function (err) { 177 | done(); 178 | }); 179 | }); 180 | }); 181 | 182 | describe('delete errorhandling', function() { 183 | it('file not exists', function(done) { 184 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 185 | s.set('test','empty', function(err) { 186 | assert(err === null); 187 | var fn = s.collection['test'].filename; 188 | s.collection['test'].filename = s.collection['test'].filename+".not_here"; 189 | s.del('test', function(err) { 190 | s.collection['test'].filename = fn; 191 | assert(err==null); 192 | done(); 193 | }); 194 | }); 195 | }); 196 | 197 | 198 | it('filename not set', function(done) { 199 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 200 | s.set('test','empty', function(err) { 201 | assert(err === null); 202 | var fn = s.collection['test'].filename; 203 | s.collection['test'].filename = null; 204 | s.del('test', function(err) { 205 | s.collection['test'].filename = fn; 206 | assert(err==null); 207 | done(); 208 | }); 209 | }) 210 | }); 211 | 212 | }) 213 | 214 | it('reset all', function(done) { 215 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 216 | s.set('test', 'test', function(err){ 217 | assert(err === null); 218 | 219 | s.set('test2', 'test2', function(err) { 220 | assert(err === null); 221 | s.reset(function(err) { 222 | assert(err === null); 223 | 224 | s.keys(function(err, keys) { 225 | assert(err === null); 226 | assert(keys.length === 0); 227 | done(); 228 | }); 229 | }); 230 | }); 231 | }); 232 | }); 233 | 234 | it('reset callback', function (done) 235 | { 236 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 237 | s.set('test','test', function (err) 238 | { 239 | assert(err === null); 240 | s.reset(function (error) { 241 | assert(err === null); 242 | done(); 243 | }) 244 | }); 245 | }); 246 | }); 247 | 248 | describe('isCacheableValue', function () { 249 | 250 | it('works', function () { 251 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 252 | assert(!s.isCacheableValue(null)); 253 | assert(!s.isCacheableValue(undefined)); 254 | }); 255 | }); 256 | 257 | describe('zip test', function() { 258 | it('save and load again', function(done) { 259 | // create store 260 | var s=store.create({options: {zip:true, path:cacheDirectory, preventfill:true}}); 261 | var datastring = "bla only for test \n and so on..."; 262 | var dataKey = "zipDataTest"; 263 | s.set(dataKey, datastring, function (err) { 264 | assert(err === null); 265 | s.get(dataKey, function (err, data) { 266 | assert.strictEqual(err, null); 267 | assert.strictEqual(data, datastring); 268 | done(); 269 | }); 270 | }); 271 | }) 272 | }); 273 | 274 | describe('integrationtests', function () { 275 | 276 | it('cache initialization on start', function (done) { 277 | // create store 278 | var s=store.create({options: {path:cacheDirectory, preventfill:true}}); 279 | // save element 280 | s.set('RestoreDontSurvive', 'data', {ttl:-1}, function (err) { 281 | assert(err === null); 282 | s.set('RestoreTest','test', function (err) 283 | { 284 | var t=store.create({options: {path:cacheDirectory, fillcallback: function () { 285 | //fill complete 286 | t.get('RestoreTest', function (err, data) { 287 | assert(data === 'test'); 288 | t.get('RestoreDontSurvive', function (err,data) { 289 | assert.strictEqual(err, null); 290 | assert.strictEqual(data, null); 291 | assert(s.currentsize > 0, 'current size not correctly initialized - '+s.currentsize); 292 | done(); 293 | }); 294 | }); 295 | } 296 | }}); 297 | }); 298 | }); 299 | }); 300 | 301 | it('cache initialization with zip', function (done) { 302 | var s=store.create({options: {path:cacheDirectory, preventfill:true, zip:true}}); 303 | s.set('testkey','value', function (err) { 304 | var t = store.create({ options: {path:cacheDirectory, zip:true, fillcallback: function () { 305 | //fill complete 306 | t.get('testkey', function (err, data) { 307 | assert.equal('value',data); 308 | done(); 309 | }); 310 | }}}); 311 | }); 312 | }); 313 | 314 | it('max size option', function (done) { 315 | // create store 316 | var s = store.create({ 317 | options: { 318 | path: cacheDirectory, 319 | preventfill: true, 320 | maxsize: 1 321 | } 322 | }); 323 | 324 | s.set('one', 'dataone', {}, function (err, val) { 325 | assert.strictEqual(err, 'Item size too big.'); 326 | assert.strictEqual(Object.keys(s.collection).length, 0); 327 | 328 | s.set('x', 'x', { ttl: -1 }, function (err, val) { 329 | assert.strictEqual(err, 'Item size too big.'); 330 | assert(Object.keys(s.collection).length === 0); 331 | 332 | s.options.maxsize = 300; 333 | s.set('a', 'a', { ttl: 10000 }, function (err, val) { 334 | assert.strictEqual(err, null); 335 | assert.equal(Object.keys(s.collection).length, 1); 336 | 337 | s.set('b', 'b', { ttl: 0 }, function (err){ 338 | assert.strictEqual(err, null); 339 | 340 | s.set('c', 'c', { ttl: 100 }, function (err){ 341 | assert.strictEqual(err, null); 342 | 343 | // now b should be removed from the cache, a should exists 344 | s.get('a', function (err, data) { 345 | assert.strictEqual(err, null); 346 | assert.equal(data,'a'); 347 | 348 | s.get('b', function (err,data){ 349 | assert.strictEqual(err, null); 350 | assert.strictEqual(data, null); 351 | done(); 352 | }); 353 | }); 354 | }); 355 | }); 356 | }); 357 | }); 358 | }); 359 | }); 360 | 361 | describe('can handle unexpected files in the cache directory', function () { 362 | var originalUUIDv4; 363 | var mockUUID; 364 | var s; 365 | 366 | beforeEach(function () { 367 | originalUUIDv4 = uuid.v4; 368 | uuid.v4 = function mockv4() { 369 | if (mockUUID) { 370 | return mockUUID 371 | }; 372 | return originalUUIDv4(); 373 | } 374 | s = store.create({ options: { path:cacheDirectory, preventfill: true } }); 375 | 376 | // simulate cruft files that may exist in the cache directory 377 | fs.writeFileSync(path.join(cacheDirectory, '.DS_Store'), 'not JSON data'); 378 | }); 379 | 380 | afterEach(function () { 381 | s.cleancache(); 382 | }); 383 | 384 | after(function () { 385 | uuid.v4 = originalUUIDv4; 386 | }) 387 | 388 | it('skips over non-cache files', function (done) { 389 | // create store and set some entries 390 | s.set('key0', 'data0', function (err) { 391 | 392 | // ungracefully reset the cache 393 | s.collection = {}; 394 | s.currentsize = 0; 395 | 396 | s.intializefill(function (err) { 397 | s.get('key0', function (err, data) { 398 | assert.equal(data, 'data0', `expected "data0", but received "${data}"`); 399 | fs.readdir(cacheDirectory, function (err, files) { 400 | assert.isTrue(files.includes('.DS_Store'), '".DS_Store" should exist.'); 401 | done(); 402 | }); 403 | }); 404 | }); 405 | }); 406 | }); 407 | 408 | it('truncated JSON files', function (done) { 409 | mockUUID = '8f1a33a9-9984-4e98-9c72-3bea37dab031'; 410 | var cacheFileName = 'cache_' + mockUUID + '.dat'; 411 | var cachedFilePath = path.join(cacheDirectory, cacheFileName); 412 | 413 | // set an entry 414 | s.set('getTruncated', 'some data...', function (err) { 415 | // simulate truncated .dat file 416 | var tmpData = fs.readFileSync(cachedFilePath, 'utf8'); 417 | fs.writeFileSync(cachedFilePath, tmpData.substring(0, 20), 'utf8'); 418 | 419 | // ungracefully reset the cache 420 | s.collection = {}; 421 | s.currentsize = 0; 422 | 423 | // re-init the cache from files saved in directory 424 | s.intializefill(function () { 425 | // Callback to run after fill has completed 426 | s.get('getTruncated', function (err, data) { 427 | var files = fs.readdirSync(cacheDirectory); 428 | assert.equal(data, null, `expected null but received "${data}"`); 429 | assert.isFalse(files.includes(cacheFileName), `"${cacheFileName}" should not exist`); 430 | done(); 431 | }); 432 | }); 433 | }); 434 | }); 435 | }); 436 | }); 437 | }); 438 | --------------------------------------------------------------------------------