├── .gitignore ├── LICENSE ├── README.md ├── dist ├── auth_header.d.ts ├── extract_jwt.d.ts ├── index.d.ts └── strategy.d.ts ├── lib ├── auth_header.js ├── extract_jwt.js ├── index.js └── strategy.js ├── package-lock.json ├── package.json ├── test ├── auth_header-test.js ├── bootstrap.js ├── extractors-test.js ├── mock_request.js ├── strategy-init-test.js └── testdata.js └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Martijn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # passport-firebase-jwt 2 | 3 | Based on [passport-jwt](https://github.com/mikenicholson/passport-jwt) 4 | 5 | A [Passport](http://passportjs.org/) strategy to authenticate with Firebase Auth. 6 | 7 | This module lets you authenticate endpoints when using Firebase Auth in a Node.js application. 8 | 9 | ## Install 10 | 11 | npm install passport-firebase-jwt 12 | 13 | ## Usage 14 | 15 | NestJS TypeScript usage example: 16 | 17 | Strategy name is: `firebase-jwt`. 18 | 19 | #### index.ts 20 | Make sure firebase is initialized before starting NestJs 21 | ```ts 22 | import { credential, initializeApp } from 'firebase-admin'; 23 | import * as express from 'express'; 24 | import * as serviceAccount from './serviceAccountKey.json'; 25 | 26 | const config = { 27 | apiKey: '***', 28 | authDomain: '***.firebaseapp.com', 29 | databaseURL: 'https://***.firebaseio.com', 30 | projectId: '***', 31 | storageBucket: '***.appspot.com', 32 | messagingSenderId: '***', 33 | credential: credential.cert(***) 34 | }; 35 | initializeApp(config); 36 | ``` 37 | 38 | #### firebase-auth.strategy.ts 39 | ```ts 40 | import { PassportStrategy } from '@nestjs/passport'; 41 | import { Injectable, UnauthorizedException } from '@nestjs/common'; 42 | import { Strategy, ExtractJwt } from 'passport-firebase-jwt'; 43 | import { auth } from 'firebase-admin'; 44 | 45 | @Injectable() 46 | export class FirebaseAuthStrategy extends PassportStrategy(Strategy) { 47 | 48 | constructor() { 49 | super({ 50 | jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken() 51 | }); 52 | } 53 | 54 | validate(token) { 55 | return auth() 56 | .verifyIdToken(token, true) 57 | .catch((err) => { 58 | console.log(err); 59 | throw new UnauthorizedException(); 60 | }); 61 | } 62 | } 63 | ``` 64 | 65 | #### auth.module.ts 66 | ```ts 67 | import { Module } from '@nestjs/common'; 68 | import { PassportModule } from '@nestjs/passport'; 69 | import { FirebaseAuthStrategy } from './firebase-auth.strategy'; 70 | 71 | @Module({ 72 | imports: [ 73 | PassportModule.register({ defaultStrategy: 'firebase-jwt' }) 74 | ], 75 | providers: [ 76 | FirebaseAuthStrategy 77 | ], 78 | exports: [ 79 | PassportModule 80 | ] 81 | }) 82 | export class AuthModule {} 83 | ``` 84 | 85 | ### Extracting the JWT from the request 86 | 87 | There are a number of ways the JWT may be included in a request. In order to remain as flexible as 88 | possible the JWT is parsed from the request by a user-supplied callback passed in as the 89 | `jwtFromRequest` parameter. This callback, from now on referred to as an extractor, 90 | accepts a request object as an argument and returns the encoded JWT string or *null*. 91 | 92 | #### Included extractors 93 | 94 | A number of extractor factory functions are provided in passport-jwt.ExtractJwt. These factory 95 | functions return a new extractor configured with the given parameters. 96 | 97 | * ```fromHeader(header_name)``` creates a new extractor that looks for the JWT in the given http 98 | header 99 | * ```fromBodyField(field_name)``` creates a new extractor that looks for the JWT in the given body 100 | field. You must have a body parser configured in order to use this method. 101 | * ```fromUrlQueryParameter(param_name)``` creates a new extractor that looks for the JWT in the given 102 | URL query parameter. 103 | * ```fromAuthHeaderWithScheme(auth_scheme)``` creates a new extractor that looks for the JWT in the 104 | authorization header, expecting the scheme to match auth_scheme. 105 | * ```fromAuthHeaderAsBearerToken()``` creates a new extractor that looks for the JWT in the authorization header 106 | with the scheme 'bearer' 107 | * ```fromExtractors([array of extractor functions])``` creates a new extractor using an array of 108 | extractors provided. Each extractor is attempted in order until one returns a token. 109 | -------------------------------------------------------------------------------- /dist/auth_header.d.ts: -------------------------------------------------------------------------------- 1 | declare function parseAuthHeader(hdrValue: any): { 2 | scheme: string; 3 | value: string; 4 | }; 5 | export { parseAuthHeader as parse }; 6 | -------------------------------------------------------------------------------- /dist/extract_jwt.d.ts: -------------------------------------------------------------------------------- 1 | export function fromHeader(header_name: any): (request: any) => any; 2 | export function fromBodyField(field_name: any): (request: any) => any; 3 | export function fromUrlQueryParameter(param_name: any): (request: any) => any; 4 | export function fromAuthHeaderWithScheme(auth_scheme: any): (request: any) => string; 5 | export function fromAuthHeaderAsBearerToken(): (request: any) => string; 6 | export function fromExtractors(extractors: any): (request: any) => any; 7 | /** 8 | * This extractor mimics the behavior of the v1.*.* extraction logic. 9 | * 10 | * This extractor exists only to provide an easy transition from the v1.*.* API to the v2.0.0 11 | * API. 12 | * 13 | * This extractor first checks the auth header, if it doesn't find a token there then it checks the 14 | * specified body field and finally the url query parameters. 15 | * 16 | * @param options 17 | * authScheme: Expected scheme when JWT can be found in HTTP Authorize header. Default is JWT. 18 | * tokenBodyField: Field in request body containing token. Default is auth_token. 19 | * tokenQueryParameterName: Query parameter name containing the token. Default is auth_token. 20 | */ 21 | export function versionOneCompatibility(options: any): (request: any) => string; 22 | -------------------------------------------------------------------------------- /dist/index.d.ts: -------------------------------------------------------------------------------- 1 | import Strategy = require("./strategy"); 2 | import ExtractJwt = require("./extract_jwt.js"); 3 | export { Strategy, ExtractJwt }; 4 | -------------------------------------------------------------------------------- /dist/strategy.d.ts: -------------------------------------------------------------------------------- 1 | export = FirebaseJwtStrategy; 2 | /** 3 | * Strategy constructor 4 | * 5 | * @param options 6 | * jwtFromRequest: (REQUIRED) Function that accepts a request as the only parameter and returns the either JWT as a string or null 7 | * passReqToCallback: If true the verify callback will be called with args (request, jwt_payload, done_callback). 8 | * @param verify - Verify callback with args (jwt_payload, done_callback) if passReqToCallback is false, 9 | * (request, jwt_payload, done_callback) if true. 10 | */ 11 | declare function FirebaseJwtStrategy(options: any, verify: any): void; 12 | declare class FirebaseJwtStrategy { 13 | /** 14 | * Strategy constructor 15 | * 16 | * @param options 17 | * jwtFromRequest: (REQUIRED) Function that accepts a request as the only parameter and returns the either JWT as a string or null 18 | * passReqToCallback: If true the verify callback will be called with args (request, jwt_payload, done_callback). 19 | * @param verify - Verify callback with args (jwt_payload, done_callback) if passReqToCallback is false, 20 | * (request, jwt_payload, done_callback) if true. 21 | */ 22 | constructor(options: any, verify: any); 23 | name: string; 24 | _jwtFromRequest: any; 25 | _verify: any; 26 | _passReqToCallback: any; 27 | /** 28 | * Authenticate request based on JWT obtained from header or post body 29 | */ 30 | authenticate(req: any, options: any): any; 31 | } 32 | -------------------------------------------------------------------------------- /lib/auth_header.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var re = /(\S+)\s+(\S+)/; 4 | 5 | function parseAuthHeader(hdrValue) { 6 | if (typeof hdrValue !== 'string') { 7 | return null; 8 | } 9 | var matches = hdrValue.match(re); 10 | return matches && { scheme: matches[1], value: matches[2] }; 11 | } 12 | 13 | module.exports = { 14 | parse: parseAuthHeader 15 | }; 16 | -------------------------------------------------------------------------------- /lib/extract_jwt.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var url = require('url'), 4 | auth_hdr = require('./auth_header'); 5 | 6 | // Note: express http converts all headers 7 | // to lower case. 8 | var AUTH_HEADER = "authorization", 9 | LEGACY_AUTH_SCHEME = "JWT", 10 | BEARER_AUTH_SCHEME = 'bearer'; 11 | 12 | 13 | var extractors = {}; 14 | 15 | extractors.fromHeader = function (header_name) { 16 | return function (request) { 17 | var token = null; 18 | if (request.headers[header_name]) { 19 | token = request.headers[header_name]; 20 | } 21 | return token; 22 | }; 23 | }; 24 | 25 | extractors.fromBodyField = function (field_name) { 26 | return function (request) { 27 | var token = null; 28 | if (request.body && Object.prototype.hasOwnProperty.call(request.body, field_name)) { 29 | token = request.body[field_name]; 30 | } 31 | return token; 32 | }; 33 | }; 34 | 35 | extractors.fromUrlQueryParameter = function (param_name) { 36 | return function (request) { 37 | var token = null, 38 | parsed_url = url.parse(request.url, true); 39 | if (parsed_url.query && Object.prototype.hasOwnProperty.call(parsed_url.query, param_name)) { 40 | token = parsed_url.query[param_name]; 41 | } 42 | return token; 43 | }; 44 | }; 45 | 46 | extractors.fromAuthHeaderWithScheme = function (auth_scheme) { 47 | var auth_scheme_lower = auth_scheme.toLowerCase(); 48 | return function (request) { 49 | 50 | var token = null; 51 | if (request.headers[AUTH_HEADER]) { 52 | var auth_params = auth_hdr.parse(request.headers[AUTH_HEADER]); 53 | if (auth_params && auth_scheme_lower === auth_params.scheme.toLowerCase()) { 54 | token = auth_params.value; 55 | } 56 | } 57 | return token; 58 | }; 59 | }; 60 | 61 | extractors.fromAuthHeaderAsBearerToken = function () { 62 | return extractors.fromAuthHeaderWithScheme(BEARER_AUTH_SCHEME); 63 | }; 64 | 65 | extractors.fromExtractors = function(extractors) { 66 | if (!Array.isArray(extractors)) { 67 | throw new TypeError('extractors.fromExtractors expects an array') 68 | } 69 | 70 | return function (request) { 71 | var token = null; 72 | var index = 0; 73 | while(!token && index < extractors.length) { 74 | token = extractors[index].call(this, request); 75 | index ++; 76 | } 77 | return token; 78 | } 79 | }; 80 | 81 | /** 82 | * This extractor mimics the behavior of the v1.*.* extraction logic. 83 | * 84 | * This extractor exists only to provide an easy transition from the v1.*.* API to the v2.0.0 85 | * API. 86 | * 87 | * This extractor first checks the auth header, if it doesn't find a token there then it checks the 88 | * specified body field and finally the url query parameters. 89 | * 90 | * @param options 91 | * authScheme: Expected scheme when JWT can be found in HTTP Authorize header. Default is JWT. 92 | * tokenBodyField: Field in request body containing token. Default is auth_token. 93 | * tokenQueryParameterName: Query parameter name containing the token. Default is auth_token. 94 | */ 95 | extractors.versionOneCompatibility = function (options) { 96 | var authScheme = options.authScheme || LEGACY_AUTH_SCHEME, 97 | bodyField = options.tokenBodyField || 'auth_token', 98 | queryParam = options.tokenQueryParameterName || 'auth_token'; 99 | 100 | return function (request) { 101 | var authHeaderExtractor = extractors.fromAuthHeaderWithScheme(authScheme); 102 | var token = authHeaderExtractor(request); 103 | 104 | if (!token) { 105 | var bodyExtractor = extractors.fromBodyField(bodyField); 106 | token = bodyExtractor(request); 107 | } 108 | 109 | if (!token) { 110 | var queryExtractor = extractors.fromUrlQueryParameter(queryParam); 111 | token = queryExtractor(request); 112 | } 113 | 114 | return token; 115 | }; 116 | } 117 | 118 | /** 119 | * Export the Jwt extraction functions 120 | */ 121 | module.exports = extractors; 122 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Strategy = require('./strategy'), 4 | ExtractJwt = require('./extract_jwt.js'); 5 | 6 | 7 | module.exports = { 8 | Strategy: Strategy, 9 | ExtractJwt : ExtractJwt 10 | }; 11 | -------------------------------------------------------------------------------- /lib/strategy.js: -------------------------------------------------------------------------------- 1 | var passport = require('passport-strategy') 2 | , util = require('util'); 3 | 4 | /** 5 | * Strategy constructor 6 | * 7 | * @param options 8 | * jwtFromRequest: (REQUIRED) Function that accepts a request as the only parameter and returns the either JWT as a string or null 9 | * passReqToCallback: If true the verify callback will be called with args (request, jwt_payload, done_callback). 10 | * @param verify - Verify callback with args (jwt_payload, done_callback) if passReqToCallback is false, 11 | * (request, jwt_payload, done_callback) if true. 12 | */ 13 | function FirebaseJwtStrategy(options, verify) { 14 | 15 | passport.Strategy.call(this); 16 | this.name = 'firebase-jwt'; 17 | 18 | this._jwtFromRequest = options.jwtFromRequest; 19 | if (!this._jwtFromRequest) { 20 | throw new TypeError('FirebaseJwtStrategy requires a function to retrieve jwt from requests (see option jwtFromRequest)'); 21 | } 22 | 23 | this._verify = verify; 24 | if (!this._verify) { 25 | throw new TypeError('JwtStrategy requires a verify callback'); 26 | } 27 | this._passReqToCallback = options.passReqToCallback; 28 | } 29 | util.inherits(FirebaseJwtStrategy, passport.Strategy); 30 | 31 | 32 | /** 33 | * Authenticate request based on JWT obtained from header or post body 34 | */ 35 | FirebaseJwtStrategy.prototype.authenticate = function(req, options) { 36 | var self = this; 37 | var token = self._jwtFromRequest(req); 38 | 39 | if (!token) { 40 | return self.fail(new Error('No auth token')); 41 | } 42 | 43 | var verified = function(err, user, info) { 44 | if(err) { 45 | return self.error(err); 46 | } else if (!user) { 47 | return self.fail(info); 48 | } else { 49 | return self.success(user, info); 50 | } 51 | }; 52 | 53 | if (self._passReqToCallback) { 54 | self._verify(req, token, verified); 55 | } else { 56 | self._verify(token, verified); 57 | } 58 | }; 59 | 60 | /** 61 | * Export the Jwt Strategy 62 | */ 63 | module.exports = FirebaseJwtStrategy; 64 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passport-firebase-jwt", 3 | "version": "1.2.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "1.2.1", 9 | "license": "MIT", 10 | "dependencies": { 11 | "passport-strategy": "^1.0.0" 12 | }, 13 | "devDependencies": { 14 | "chai": "^3.0.0", 15 | "chai-passport-strategy": "^1.0.0", 16 | "istanbul": "^0.4.5", 17 | "mocha": "^10.2.0", 18 | "sinon": "^1.0.0", 19 | "typescript": "^4.3.2" 20 | } 21 | }, 22 | "node_modules/abbrev": { 23 | "version": "1.0.9", 24 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 25 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 26 | "dev": true 27 | }, 28 | "node_modules/amdefine": { 29 | "version": "1.0.1", 30 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 31 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 32 | "dev": true, 33 | "optional": true, 34 | "engines": { 35 | "node": ">=0.4.2" 36 | } 37 | }, 38 | "node_modules/ansi-colors": { 39 | "version": "4.1.1", 40 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 41 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 42 | "dev": true, 43 | "engines": { 44 | "node": ">=6" 45 | } 46 | }, 47 | "node_modules/ansi-regex": { 48 | "version": "5.0.1", 49 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 50 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 51 | "dev": true, 52 | "engines": { 53 | "node": ">=8" 54 | } 55 | }, 56 | "node_modules/ansi-styles": { 57 | "version": "4.3.0", 58 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 59 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 60 | "dev": true, 61 | "dependencies": { 62 | "color-convert": "^2.0.1" 63 | }, 64 | "engines": { 65 | "node": ">=8" 66 | }, 67 | "funding": { 68 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 69 | } 70 | }, 71 | "node_modules/anymatch": { 72 | "version": "3.1.3", 73 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 74 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 75 | "dev": true, 76 | "dependencies": { 77 | "normalize-path": "^3.0.0", 78 | "picomatch": "^2.0.4" 79 | }, 80 | "engines": { 81 | "node": ">= 8" 82 | } 83 | }, 84 | "node_modules/argparse": { 85 | "version": "1.0.10", 86 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 87 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 88 | "dev": true, 89 | "dependencies": { 90 | "sprintf-js": "~1.0.2" 91 | } 92 | }, 93 | "node_modules/assertion-error": { 94 | "version": "1.1.0", 95 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 96 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 97 | "dev": true, 98 | "engines": { 99 | "node": "*" 100 | } 101 | }, 102 | "node_modules/async": { 103 | "version": "1.5.2", 104 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 105 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 106 | "dev": true 107 | }, 108 | "node_modules/balanced-match": { 109 | "version": "1.0.0", 110 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 111 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 112 | "dev": true 113 | }, 114 | "node_modules/binary-extensions": { 115 | "version": "2.2.0", 116 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 117 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 118 | "dev": true, 119 | "engines": { 120 | "node": ">=8" 121 | } 122 | }, 123 | "node_modules/brace-expansion": { 124 | "version": "1.1.11", 125 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 126 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 127 | "dev": true, 128 | "dependencies": { 129 | "balanced-match": "^1.0.0", 130 | "concat-map": "0.0.1" 131 | } 132 | }, 133 | "node_modules/braces": { 134 | "version": "3.0.2", 135 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 136 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 137 | "dev": true, 138 | "dependencies": { 139 | "fill-range": "^7.0.1" 140 | }, 141 | "engines": { 142 | "node": ">=8" 143 | } 144 | }, 145 | "node_modules/browser-stdout": { 146 | "version": "1.3.1", 147 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 148 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 149 | "dev": true 150 | }, 151 | "node_modules/camelcase": { 152 | "version": "6.3.0", 153 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 154 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 155 | "dev": true, 156 | "engines": { 157 | "node": ">=10" 158 | }, 159 | "funding": { 160 | "url": "https://github.com/sponsors/sindresorhus" 161 | } 162 | }, 163 | "node_modules/chai": { 164 | "version": "3.5.0", 165 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 166 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 167 | "dev": true, 168 | "dependencies": { 169 | "assertion-error": "^1.0.1", 170 | "deep-eql": "^0.1.3", 171 | "type-detect": "^1.0.0" 172 | }, 173 | "engines": { 174 | "node": ">= 0.4.0" 175 | } 176 | }, 177 | "node_modules/chai-passport-strategy": { 178 | "version": "1.0.1", 179 | "resolved": "https://registry.npmjs.org/chai-passport-strategy/-/chai-passport-strategy-1.0.1.tgz", 180 | "integrity": "sha1-2rGASPbqeG7JjLlNS3nAxi/z8gQ=", 181 | "dev": true, 182 | "engines": { 183 | "node": ">= 0.4.0" 184 | } 185 | }, 186 | "node_modules/chalk": { 187 | "version": "4.1.2", 188 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 189 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 190 | "dev": true, 191 | "dependencies": { 192 | "ansi-styles": "^4.1.0", 193 | "supports-color": "^7.1.0" 194 | }, 195 | "engines": { 196 | "node": ">=10" 197 | }, 198 | "funding": { 199 | "url": "https://github.com/chalk/chalk?sponsor=1" 200 | } 201 | }, 202 | "node_modules/chalk/node_modules/has-flag": { 203 | "version": "4.0.0", 204 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 205 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 206 | "dev": true, 207 | "engines": { 208 | "node": ">=8" 209 | } 210 | }, 211 | "node_modules/chalk/node_modules/supports-color": { 212 | "version": "7.2.0", 213 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 214 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 215 | "dev": true, 216 | "dependencies": { 217 | "has-flag": "^4.0.0" 218 | }, 219 | "engines": { 220 | "node": ">=8" 221 | } 222 | }, 223 | "node_modules/chokidar": { 224 | "version": "3.5.3", 225 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 226 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 227 | "dev": true, 228 | "funding": [ 229 | { 230 | "type": "individual", 231 | "url": "https://paulmillr.com/funding/" 232 | } 233 | ], 234 | "dependencies": { 235 | "anymatch": "~3.1.2", 236 | "braces": "~3.0.2", 237 | "glob-parent": "~5.1.2", 238 | "is-binary-path": "~2.1.0", 239 | "is-glob": "~4.0.1", 240 | "normalize-path": "~3.0.0", 241 | "readdirp": "~3.6.0" 242 | }, 243 | "engines": { 244 | "node": ">= 8.10.0" 245 | }, 246 | "optionalDependencies": { 247 | "fsevents": "~2.3.2" 248 | } 249 | }, 250 | "node_modules/cliui": { 251 | "version": "7.0.4", 252 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 253 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 254 | "dev": true, 255 | "dependencies": { 256 | "string-width": "^4.2.0", 257 | "strip-ansi": "^6.0.0", 258 | "wrap-ansi": "^7.0.0" 259 | } 260 | }, 261 | "node_modules/color-convert": { 262 | "version": "2.0.1", 263 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 264 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 265 | "dev": true, 266 | "dependencies": { 267 | "color-name": "~1.1.4" 268 | }, 269 | "engines": { 270 | "node": ">=7.0.0" 271 | } 272 | }, 273 | "node_modules/color-name": { 274 | "version": "1.1.4", 275 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 276 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 277 | "dev": true 278 | }, 279 | "node_modules/concat-map": { 280 | "version": "0.0.1", 281 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 282 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 283 | "dev": true 284 | }, 285 | "node_modules/debug": { 286 | "version": "4.3.4", 287 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 288 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 289 | "dev": true, 290 | "dependencies": { 291 | "ms": "2.1.2" 292 | }, 293 | "engines": { 294 | "node": ">=6.0" 295 | }, 296 | "peerDependenciesMeta": { 297 | "supports-color": { 298 | "optional": true 299 | } 300 | } 301 | }, 302 | "node_modules/debug/node_modules/ms": { 303 | "version": "2.1.2", 304 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 305 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 306 | "dev": true 307 | }, 308 | "node_modules/decamelize": { 309 | "version": "4.0.0", 310 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 311 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 312 | "dev": true, 313 | "engines": { 314 | "node": ">=10" 315 | }, 316 | "funding": { 317 | "url": "https://github.com/sponsors/sindresorhus" 318 | } 319 | }, 320 | "node_modules/deep-eql": { 321 | "version": "0.1.3", 322 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 323 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 324 | "dev": true, 325 | "dependencies": { 326 | "type-detect": "0.1.1" 327 | }, 328 | "engines": { 329 | "node": "*" 330 | } 331 | }, 332 | "node_modules/deep-eql/node_modules/type-detect": { 333 | "version": "0.1.1", 334 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 335 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 336 | "dev": true, 337 | "engines": { 338 | "node": "*" 339 | } 340 | }, 341 | "node_modules/deep-is": { 342 | "version": "0.1.3", 343 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 344 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 345 | "dev": true 346 | }, 347 | "node_modules/diff": { 348 | "version": "5.0.0", 349 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 350 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 351 | "dev": true, 352 | "engines": { 353 | "node": ">=0.3.1" 354 | } 355 | }, 356 | "node_modules/emoji-regex": { 357 | "version": "8.0.0", 358 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 359 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 360 | "dev": true 361 | }, 362 | "node_modules/escalade": { 363 | "version": "3.1.1", 364 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 365 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 366 | "dev": true, 367 | "engines": { 368 | "node": ">=6" 369 | } 370 | }, 371 | "node_modules/escape-string-regexp": { 372 | "version": "4.0.0", 373 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 374 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 375 | "dev": true, 376 | "engines": { 377 | "node": ">=10" 378 | }, 379 | "funding": { 380 | "url": "https://github.com/sponsors/sindresorhus" 381 | } 382 | }, 383 | "node_modules/escodegen": { 384 | "version": "1.8.1", 385 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 386 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 387 | "dev": true, 388 | "dependencies": { 389 | "esprima": "^2.7.1", 390 | "estraverse": "^1.9.1", 391 | "esutils": "^2.0.2", 392 | "optionator": "^0.8.1" 393 | }, 394 | "bin": { 395 | "escodegen": "bin/escodegen.js", 396 | "esgenerate": "bin/esgenerate.js" 397 | }, 398 | "engines": { 399 | "node": ">=0.12.0" 400 | }, 401 | "optionalDependencies": { 402 | "source-map": "~0.2.0" 403 | } 404 | }, 405 | "node_modules/esprima": { 406 | "version": "2.7.3", 407 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 408 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 409 | "dev": true, 410 | "bin": { 411 | "esparse": "bin/esparse.js", 412 | "esvalidate": "bin/esvalidate.js" 413 | }, 414 | "engines": { 415 | "node": ">=0.10.0" 416 | } 417 | }, 418 | "node_modules/estraverse": { 419 | "version": "1.9.3", 420 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 421 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 422 | "dev": true, 423 | "engines": { 424 | "node": ">=0.10.0" 425 | } 426 | }, 427 | "node_modules/esutils": { 428 | "version": "2.0.2", 429 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 430 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 431 | "dev": true, 432 | "engines": { 433 | "node": ">=0.10.0" 434 | } 435 | }, 436 | "node_modules/fast-levenshtein": { 437 | "version": "2.0.6", 438 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 439 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 440 | "dev": true 441 | }, 442 | "node_modules/fill-range": { 443 | "version": "7.0.1", 444 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 445 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 446 | "dev": true, 447 | "dependencies": { 448 | "to-regex-range": "^5.0.1" 449 | }, 450 | "engines": { 451 | "node": ">=8" 452 | } 453 | }, 454 | "node_modules/find-up": { 455 | "version": "5.0.0", 456 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 457 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 458 | "dev": true, 459 | "dependencies": { 460 | "locate-path": "^6.0.0", 461 | "path-exists": "^4.0.0" 462 | }, 463 | "engines": { 464 | "node": ">=10" 465 | }, 466 | "funding": { 467 | "url": "https://github.com/sponsors/sindresorhus" 468 | } 469 | }, 470 | "node_modules/flat": { 471 | "version": "5.0.2", 472 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 473 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 474 | "dev": true, 475 | "bin": { 476 | "flat": "cli.js" 477 | } 478 | }, 479 | "node_modules/formatio": { 480 | "version": "1.1.1", 481 | "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", 482 | "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", 483 | "dev": true, 484 | "dependencies": { 485 | "samsam": "~1.1" 486 | } 487 | }, 488 | "node_modules/fs.realpath": { 489 | "version": "1.0.0", 490 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 491 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 492 | "dev": true 493 | }, 494 | "node_modules/fsevents": { 495 | "version": "2.3.2", 496 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 497 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 498 | "dev": true, 499 | "hasInstallScript": true, 500 | "optional": true, 501 | "os": [ 502 | "darwin" 503 | ], 504 | "engines": { 505 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 506 | } 507 | }, 508 | "node_modules/get-caller-file": { 509 | "version": "2.0.5", 510 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 511 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 512 | "dev": true, 513 | "engines": { 514 | "node": "6.* || 8.* || >= 10.*" 515 | } 516 | }, 517 | "node_modules/glob": { 518 | "version": "5.0.15", 519 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 520 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 521 | "dev": true, 522 | "dependencies": { 523 | "inflight": "^1.0.4", 524 | "inherits": "2", 525 | "minimatch": "2 || 3", 526 | "once": "^1.3.0", 527 | "path-is-absolute": "^1.0.0" 528 | }, 529 | "engines": { 530 | "node": "*" 531 | } 532 | }, 533 | "node_modules/glob-parent": { 534 | "version": "5.1.2", 535 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 536 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 537 | "dev": true, 538 | "dependencies": { 539 | "is-glob": "^4.0.1" 540 | }, 541 | "engines": { 542 | "node": ">= 6" 543 | } 544 | }, 545 | "node_modules/handlebars": { 546 | "version": "4.7.7", 547 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 548 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 549 | "dev": true, 550 | "dependencies": { 551 | "minimist": "^1.2.5", 552 | "neo-async": "^2.6.0", 553 | "source-map": "^0.6.1", 554 | "wordwrap": "^1.0.0" 555 | }, 556 | "bin": { 557 | "handlebars": "bin/handlebars" 558 | }, 559 | "engines": { 560 | "node": ">=0.4.7" 561 | }, 562 | "optionalDependencies": { 563 | "uglify-js": "^3.1.4" 564 | } 565 | }, 566 | "node_modules/handlebars/node_modules/source-map": { 567 | "version": "0.6.1", 568 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 569 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 570 | "dev": true, 571 | "engines": { 572 | "node": ">=0.10.0" 573 | } 574 | }, 575 | "node_modules/has-flag": { 576 | "version": "1.0.0", 577 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 578 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 579 | "dev": true, 580 | "engines": { 581 | "node": ">=0.10.0" 582 | } 583 | }, 584 | "node_modules/he": { 585 | "version": "1.2.0", 586 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 587 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 588 | "dev": true, 589 | "bin": { 590 | "he": "bin/he" 591 | } 592 | }, 593 | "node_modules/inflight": { 594 | "version": "1.0.6", 595 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 596 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 597 | "dev": true, 598 | "dependencies": { 599 | "once": "^1.3.0", 600 | "wrappy": "1" 601 | } 602 | }, 603 | "node_modules/inherits": { 604 | "version": "2.0.3", 605 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 606 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 607 | "dev": true 608 | }, 609 | "node_modules/is-binary-path": { 610 | "version": "2.1.0", 611 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 612 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 613 | "dev": true, 614 | "dependencies": { 615 | "binary-extensions": "^2.0.0" 616 | }, 617 | "engines": { 618 | "node": ">=8" 619 | } 620 | }, 621 | "node_modules/is-extglob": { 622 | "version": "2.1.1", 623 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 624 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 625 | "dev": true, 626 | "engines": { 627 | "node": ">=0.10.0" 628 | } 629 | }, 630 | "node_modules/is-fullwidth-code-point": { 631 | "version": "3.0.0", 632 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 633 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 634 | "dev": true, 635 | "engines": { 636 | "node": ">=8" 637 | } 638 | }, 639 | "node_modules/is-glob": { 640 | "version": "4.0.3", 641 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 642 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 643 | "dev": true, 644 | "dependencies": { 645 | "is-extglob": "^2.1.1" 646 | }, 647 | "engines": { 648 | "node": ">=0.10.0" 649 | } 650 | }, 651 | "node_modules/is-number": { 652 | "version": "7.0.0", 653 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 654 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 655 | "dev": true, 656 | "engines": { 657 | "node": ">=0.12.0" 658 | } 659 | }, 660 | "node_modules/is-plain-obj": { 661 | "version": "2.1.0", 662 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 663 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 664 | "dev": true, 665 | "engines": { 666 | "node": ">=8" 667 | } 668 | }, 669 | "node_modules/is-unicode-supported": { 670 | "version": "0.1.0", 671 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 672 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 673 | "dev": true, 674 | "engines": { 675 | "node": ">=10" 676 | }, 677 | "funding": { 678 | "url": "https://github.com/sponsors/sindresorhus" 679 | } 680 | }, 681 | "node_modules/isexe": { 682 | "version": "2.0.0", 683 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 684 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 685 | "dev": true 686 | }, 687 | "node_modules/istanbul": { 688 | "version": "0.4.5", 689 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 690 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 691 | "dev": true, 692 | "dependencies": { 693 | "abbrev": "1.0.x", 694 | "async": "1.x", 695 | "escodegen": "1.8.x", 696 | "esprima": "2.7.x", 697 | "glob": "^5.0.15", 698 | "handlebars": "^4.0.1", 699 | "js-yaml": "3.x", 700 | "mkdirp": "0.5.x", 701 | "nopt": "3.x", 702 | "once": "1.x", 703 | "resolve": "1.1.x", 704 | "supports-color": "^3.1.0", 705 | "which": "^1.1.1", 706 | "wordwrap": "^1.0.0" 707 | }, 708 | "bin": { 709 | "istanbul": "lib/cli.js" 710 | } 711 | }, 712 | "node_modules/js-yaml": { 713 | "version": "3.13.1", 714 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 715 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 716 | "dev": true, 717 | "dependencies": { 718 | "argparse": "^1.0.7", 719 | "esprima": "^4.0.0" 720 | }, 721 | "bin": { 722 | "js-yaml": "bin/js-yaml.js" 723 | } 724 | }, 725 | "node_modules/js-yaml/node_modules/esprima": { 726 | "version": "4.0.1", 727 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 728 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 729 | "dev": true, 730 | "bin": { 731 | "esparse": "bin/esparse.js", 732 | "esvalidate": "bin/esvalidate.js" 733 | }, 734 | "engines": { 735 | "node": ">=4" 736 | } 737 | }, 738 | "node_modules/levn": { 739 | "version": "0.3.0", 740 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 741 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 742 | "dev": true, 743 | "dependencies": { 744 | "prelude-ls": "~1.1.2", 745 | "type-check": "~0.3.2" 746 | }, 747 | "engines": { 748 | "node": ">= 0.8.0" 749 | } 750 | }, 751 | "node_modules/locate-path": { 752 | "version": "6.0.0", 753 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 754 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 755 | "dev": true, 756 | "dependencies": { 757 | "p-locate": "^5.0.0" 758 | }, 759 | "engines": { 760 | "node": ">=10" 761 | }, 762 | "funding": { 763 | "url": "https://github.com/sponsors/sindresorhus" 764 | } 765 | }, 766 | "node_modules/log-symbols": { 767 | "version": "4.1.0", 768 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 769 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 770 | "dev": true, 771 | "dependencies": { 772 | "chalk": "^4.1.0", 773 | "is-unicode-supported": "^0.1.0" 774 | }, 775 | "engines": { 776 | "node": ">=10" 777 | }, 778 | "funding": { 779 | "url": "https://github.com/sponsors/sindresorhus" 780 | } 781 | }, 782 | "node_modules/lolex": { 783 | "version": "1.3.2", 784 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", 785 | "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", 786 | "dev": true 787 | }, 788 | "node_modules/minimatch": { 789 | "version": "3.1.2", 790 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 791 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 792 | "dev": true, 793 | "dependencies": { 794 | "brace-expansion": "^1.1.7" 795 | }, 796 | "engines": { 797 | "node": "*" 798 | } 799 | }, 800 | "node_modules/minimist": { 801 | "version": "1.2.8", 802 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 803 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 804 | "dev": true, 805 | "funding": { 806 | "url": "https://github.com/sponsors/ljharb" 807 | } 808 | }, 809 | "node_modules/mkdirp": { 810 | "version": "0.5.4", 811 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", 812 | "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", 813 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 814 | "dev": true, 815 | "dependencies": { 816 | "minimist": "^1.2.5" 817 | }, 818 | "bin": { 819 | "mkdirp": "bin/cmd.js" 820 | } 821 | }, 822 | "node_modules/mocha": { 823 | "version": "10.2.0", 824 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 825 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 826 | "dev": true, 827 | "dependencies": { 828 | "ansi-colors": "4.1.1", 829 | "browser-stdout": "1.3.1", 830 | "chokidar": "3.5.3", 831 | "debug": "4.3.4", 832 | "diff": "5.0.0", 833 | "escape-string-regexp": "4.0.0", 834 | "find-up": "5.0.0", 835 | "glob": "7.2.0", 836 | "he": "1.2.0", 837 | "js-yaml": "4.1.0", 838 | "log-symbols": "4.1.0", 839 | "minimatch": "5.0.1", 840 | "ms": "2.1.3", 841 | "nanoid": "3.3.3", 842 | "serialize-javascript": "6.0.0", 843 | "strip-json-comments": "3.1.1", 844 | "supports-color": "8.1.1", 845 | "workerpool": "6.2.1", 846 | "yargs": "16.2.0", 847 | "yargs-parser": "20.2.4", 848 | "yargs-unparser": "2.0.0" 849 | }, 850 | "bin": { 851 | "_mocha": "bin/_mocha", 852 | "mocha": "bin/mocha.js" 853 | }, 854 | "engines": { 855 | "node": ">= 14.0.0" 856 | }, 857 | "funding": { 858 | "type": "opencollective", 859 | "url": "https://opencollective.com/mochajs" 860 | } 861 | }, 862 | "node_modules/mocha/node_modules/argparse": { 863 | "version": "2.0.1", 864 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 865 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 866 | "dev": true 867 | }, 868 | "node_modules/mocha/node_modules/glob": { 869 | "version": "7.2.0", 870 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 871 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 872 | "dev": true, 873 | "dependencies": { 874 | "fs.realpath": "^1.0.0", 875 | "inflight": "^1.0.4", 876 | "inherits": "2", 877 | "minimatch": "^3.0.4", 878 | "once": "^1.3.0", 879 | "path-is-absolute": "^1.0.0" 880 | }, 881 | "engines": { 882 | "node": "*" 883 | }, 884 | "funding": { 885 | "url": "https://github.com/sponsors/isaacs" 886 | } 887 | }, 888 | "node_modules/mocha/node_modules/glob/node_modules/minimatch": { 889 | "version": "3.1.2", 890 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 891 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 892 | "dev": true, 893 | "dependencies": { 894 | "brace-expansion": "^1.1.7" 895 | }, 896 | "engines": { 897 | "node": "*" 898 | } 899 | }, 900 | "node_modules/mocha/node_modules/has-flag": { 901 | "version": "4.0.0", 902 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 903 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 904 | "dev": true, 905 | "engines": { 906 | "node": ">=8" 907 | } 908 | }, 909 | "node_modules/mocha/node_modules/js-yaml": { 910 | "version": "4.1.0", 911 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 912 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 913 | "dev": true, 914 | "dependencies": { 915 | "argparse": "^2.0.1" 916 | }, 917 | "bin": { 918 | "js-yaml": "bin/js-yaml.js" 919 | } 920 | }, 921 | "node_modules/mocha/node_modules/minimatch": { 922 | "version": "5.0.1", 923 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 924 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 925 | "dev": true, 926 | "dependencies": { 927 | "brace-expansion": "^2.0.1" 928 | }, 929 | "engines": { 930 | "node": ">=10" 931 | } 932 | }, 933 | "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { 934 | "version": "2.0.1", 935 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 936 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 937 | "dev": true, 938 | "dependencies": { 939 | "balanced-match": "^1.0.0" 940 | } 941 | }, 942 | "node_modules/mocha/node_modules/supports-color": { 943 | "version": "8.1.1", 944 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 945 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 946 | "dev": true, 947 | "dependencies": { 948 | "has-flag": "^4.0.0" 949 | }, 950 | "engines": { 951 | "node": ">=10" 952 | }, 953 | "funding": { 954 | "url": "https://github.com/chalk/supports-color?sponsor=1" 955 | } 956 | }, 957 | "node_modules/ms": { 958 | "version": "2.1.3", 959 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 960 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 961 | "dev": true 962 | }, 963 | "node_modules/nanoid": { 964 | "version": "3.3.3", 965 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 966 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 967 | "dev": true, 968 | "bin": { 969 | "nanoid": "bin/nanoid.cjs" 970 | }, 971 | "engines": { 972 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 973 | } 974 | }, 975 | "node_modules/neo-async": { 976 | "version": "2.6.1", 977 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", 978 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", 979 | "dev": true 980 | }, 981 | "node_modules/nopt": { 982 | "version": "3.0.6", 983 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 984 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 985 | "dev": true, 986 | "dependencies": { 987 | "abbrev": "1" 988 | }, 989 | "bin": { 990 | "nopt": "bin/nopt.js" 991 | } 992 | }, 993 | "node_modules/normalize-path": { 994 | "version": "3.0.0", 995 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 996 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 997 | "dev": true, 998 | "engines": { 999 | "node": ">=0.10.0" 1000 | } 1001 | }, 1002 | "node_modules/once": { 1003 | "version": "1.4.0", 1004 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1005 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1006 | "dev": true, 1007 | "dependencies": { 1008 | "wrappy": "1" 1009 | } 1010 | }, 1011 | "node_modules/optionator": { 1012 | "version": "0.8.2", 1013 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1014 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1015 | "dev": true, 1016 | "dependencies": { 1017 | "deep-is": "~0.1.3", 1018 | "fast-levenshtein": "~2.0.4", 1019 | "levn": "~0.3.0", 1020 | "prelude-ls": "~1.1.2", 1021 | "type-check": "~0.3.2", 1022 | "wordwrap": "~1.0.0" 1023 | }, 1024 | "engines": { 1025 | "node": ">= 0.8.0" 1026 | } 1027 | }, 1028 | "node_modules/p-limit": { 1029 | "version": "3.1.0", 1030 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1031 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1032 | "dev": true, 1033 | "dependencies": { 1034 | "yocto-queue": "^0.1.0" 1035 | }, 1036 | "engines": { 1037 | "node": ">=10" 1038 | }, 1039 | "funding": { 1040 | "url": "https://github.com/sponsors/sindresorhus" 1041 | } 1042 | }, 1043 | "node_modules/p-locate": { 1044 | "version": "5.0.0", 1045 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1046 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1047 | "dev": true, 1048 | "dependencies": { 1049 | "p-limit": "^3.0.2" 1050 | }, 1051 | "engines": { 1052 | "node": ">=10" 1053 | }, 1054 | "funding": { 1055 | "url": "https://github.com/sponsors/sindresorhus" 1056 | } 1057 | }, 1058 | "node_modules/passport-strategy": { 1059 | "version": "1.0.0", 1060 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 1061 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", 1062 | "engines": { 1063 | "node": ">= 0.4.0" 1064 | } 1065 | }, 1066 | "node_modules/path-exists": { 1067 | "version": "4.0.0", 1068 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1069 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1070 | "dev": true, 1071 | "engines": { 1072 | "node": ">=8" 1073 | } 1074 | }, 1075 | "node_modules/path-is-absolute": { 1076 | "version": "1.0.1", 1077 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1078 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1079 | "dev": true, 1080 | "engines": { 1081 | "node": ">=0.10.0" 1082 | } 1083 | }, 1084 | "node_modules/picomatch": { 1085 | "version": "2.3.1", 1086 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1087 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1088 | "dev": true, 1089 | "engines": { 1090 | "node": ">=8.6" 1091 | }, 1092 | "funding": { 1093 | "url": "https://github.com/sponsors/jonschlinkert" 1094 | } 1095 | }, 1096 | "node_modules/prelude-ls": { 1097 | "version": "1.1.2", 1098 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1099 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1100 | "dev": true, 1101 | "engines": { 1102 | "node": ">= 0.8.0" 1103 | } 1104 | }, 1105 | "node_modules/randombytes": { 1106 | "version": "2.1.0", 1107 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1108 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "safe-buffer": "^5.1.0" 1112 | } 1113 | }, 1114 | "node_modules/readdirp": { 1115 | "version": "3.6.0", 1116 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1117 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "picomatch": "^2.2.1" 1121 | }, 1122 | "engines": { 1123 | "node": ">=8.10.0" 1124 | } 1125 | }, 1126 | "node_modules/require-directory": { 1127 | "version": "2.1.1", 1128 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1129 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1130 | "dev": true, 1131 | "engines": { 1132 | "node": ">=0.10.0" 1133 | } 1134 | }, 1135 | "node_modules/resolve": { 1136 | "version": "1.1.7", 1137 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 1138 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 1139 | "dev": true 1140 | }, 1141 | "node_modules/safe-buffer": { 1142 | "version": "5.2.1", 1143 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1144 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1145 | "dev": true, 1146 | "funding": [ 1147 | { 1148 | "type": "github", 1149 | "url": "https://github.com/sponsors/feross" 1150 | }, 1151 | { 1152 | "type": "patreon", 1153 | "url": "https://www.patreon.com/feross" 1154 | }, 1155 | { 1156 | "type": "consulting", 1157 | "url": "https://feross.org/support" 1158 | } 1159 | ] 1160 | }, 1161 | "node_modules/samsam": { 1162 | "version": "1.1.2", 1163 | "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", 1164 | "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", 1165 | "dev": true 1166 | }, 1167 | "node_modules/serialize-javascript": { 1168 | "version": "6.0.0", 1169 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1170 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1171 | "dev": true, 1172 | "dependencies": { 1173 | "randombytes": "^2.1.0" 1174 | } 1175 | }, 1176 | "node_modules/sinon": { 1177 | "version": "1.17.7", 1178 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", 1179 | "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", 1180 | "dev": true, 1181 | "dependencies": { 1182 | "formatio": "1.1.1", 1183 | "lolex": "1.3.2", 1184 | "samsam": "1.1.2", 1185 | "util": ">=0.10.3 <1" 1186 | }, 1187 | "engines": { 1188 | "node": ">=0.1.103" 1189 | } 1190 | }, 1191 | "node_modules/source-map": { 1192 | "version": "0.2.0", 1193 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 1194 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 1195 | "dev": true, 1196 | "optional": true, 1197 | "dependencies": { 1198 | "amdefine": ">=0.0.4" 1199 | }, 1200 | "engines": { 1201 | "node": ">=0.8.0" 1202 | } 1203 | }, 1204 | "node_modules/sprintf-js": { 1205 | "version": "1.0.3", 1206 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1207 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1208 | "dev": true 1209 | }, 1210 | "node_modules/string-width": { 1211 | "version": "4.2.3", 1212 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1213 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1214 | "dev": true, 1215 | "dependencies": { 1216 | "emoji-regex": "^8.0.0", 1217 | "is-fullwidth-code-point": "^3.0.0", 1218 | "strip-ansi": "^6.0.1" 1219 | }, 1220 | "engines": { 1221 | "node": ">=8" 1222 | } 1223 | }, 1224 | "node_modules/strip-ansi": { 1225 | "version": "6.0.1", 1226 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1227 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "ansi-regex": "^5.0.1" 1231 | }, 1232 | "engines": { 1233 | "node": ">=8" 1234 | } 1235 | }, 1236 | "node_modules/strip-json-comments": { 1237 | "version": "3.1.1", 1238 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1239 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1240 | "dev": true, 1241 | "engines": { 1242 | "node": ">=8" 1243 | }, 1244 | "funding": { 1245 | "url": "https://github.com/sponsors/sindresorhus" 1246 | } 1247 | }, 1248 | "node_modules/supports-color": { 1249 | "version": "3.2.3", 1250 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 1251 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 1252 | "dev": true, 1253 | "dependencies": { 1254 | "has-flag": "^1.0.0" 1255 | }, 1256 | "engines": { 1257 | "node": ">=0.8.0" 1258 | } 1259 | }, 1260 | "node_modules/to-regex-range": { 1261 | "version": "5.0.1", 1262 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1263 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1264 | "dev": true, 1265 | "dependencies": { 1266 | "is-number": "^7.0.0" 1267 | }, 1268 | "engines": { 1269 | "node": ">=8.0" 1270 | } 1271 | }, 1272 | "node_modules/type-check": { 1273 | "version": "0.3.2", 1274 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1275 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1276 | "dev": true, 1277 | "dependencies": { 1278 | "prelude-ls": "~1.1.2" 1279 | }, 1280 | "engines": { 1281 | "node": ">= 0.8.0" 1282 | } 1283 | }, 1284 | "node_modules/type-detect": { 1285 | "version": "1.0.0", 1286 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 1287 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 1288 | "dev": true, 1289 | "engines": { 1290 | "node": "*" 1291 | } 1292 | }, 1293 | "node_modules/typescript": { 1294 | "version": "4.3.2", 1295 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", 1296 | "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", 1297 | "dev": true, 1298 | "bin": { 1299 | "tsc": "bin/tsc", 1300 | "tsserver": "bin/tsserver" 1301 | }, 1302 | "engines": { 1303 | "node": ">=4.2.0" 1304 | } 1305 | }, 1306 | "node_modules/uglify-js": { 1307 | "version": "3.5.15", 1308 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", 1309 | "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", 1310 | "dev": true, 1311 | "optional": true, 1312 | "dependencies": { 1313 | "commander": "~2.20.0", 1314 | "source-map": "~0.6.1" 1315 | }, 1316 | "bin": { 1317 | "uglifyjs": "bin/uglifyjs" 1318 | }, 1319 | "engines": { 1320 | "node": ">=0.8.0" 1321 | } 1322 | }, 1323 | "node_modules/uglify-js/node_modules/commander": { 1324 | "version": "2.20.0", 1325 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 1326 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 1327 | "dev": true, 1328 | "optional": true 1329 | }, 1330 | "node_modules/uglify-js/node_modules/source-map": { 1331 | "version": "0.6.1", 1332 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1333 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1334 | "dev": true, 1335 | "optional": true, 1336 | "engines": { 1337 | "node": ">=0.10.0" 1338 | } 1339 | }, 1340 | "node_modules/util": { 1341 | "version": "0.10.3", 1342 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 1343 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 1344 | "dev": true, 1345 | "dependencies": { 1346 | "inherits": "2.0.1" 1347 | } 1348 | }, 1349 | "node_modules/util/node_modules/inherits": { 1350 | "version": "2.0.1", 1351 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 1352 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 1353 | "dev": true 1354 | }, 1355 | "node_modules/which": { 1356 | "version": "1.3.0", 1357 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 1358 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 1359 | "dev": true, 1360 | "dependencies": { 1361 | "isexe": "^2.0.0" 1362 | }, 1363 | "bin": { 1364 | "which": "bin/which" 1365 | } 1366 | }, 1367 | "node_modules/wordwrap": { 1368 | "version": "1.0.0", 1369 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1370 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1371 | "dev": true 1372 | }, 1373 | "node_modules/workerpool": { 1374 | "version": "6.2.1", 1375 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 1376 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 1377 | "dev": true 1378 | }, 1379 | "node_modules/wrap-ansi": { 1380 | "version": "7.0.0", 1381 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1382 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1383 | "dev": true, 1384 | "dependencies": { 1385 | "ansi-styles": "^4.0.0", 1386 | "string-width": "^4.1.0", 1387 | "strip-ansi": "^6.0.0" 1388 | }, 1389 | "engines": { 1390 | "node": ">=10" 1391 | }, 1392 | "funding": { 1393 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1394 | } 1395 | }, 1396 | "node_modules/wrappy": { 1397 | "version": "1.0.2", 1398 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1399 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1400 | "dev": true 1401 | }, 1402 | "node_modules/y18n": { 1403 | "version": "5.0.8", 1404 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1405 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1406 | "dev": true, 1407 | "engines": { 1408 | "node": ">=10" 1409 | } 1410 | }, 1411 | "node_modules/yargs": { 1412 | "version": "16.2.0", 1413 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1414 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1415 | "dev": true, 1416 | "dependencies": { 1417 | "cliui": "^7.0.2", 1418 | "escalade": "^3.1.1", 1419 | "get-caller-file": "^2.0.5", 1420 | "require-directory": "^2.1.1", 1421 | "string-width": "^4.2.0", 1422 | "y18n": "^5.0.5", 1423 | "yargs-parser": "^20.2.2" 1424 | }, 1425 | "engines": { 1426 | "node": ">=10" 1427 | } 1428 | }, 1429 | "node_modules/yargs-parser": { 1430 | "version": "20.2.4", 1431 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1432 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1433 | "dev": true, 1434 | "engines": { 1435 | "node": ">=10" 1436 | } 1437 | }, 1438 | "node_modules/yargs-unparser": { 1439 | "version": "2.0.0", 1440 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1441 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1442 | "dev": true, 1443 | "dependencies": { 1444 | "camelcase": "^6.0.0", 1445 | "decamelize": "^4.0.0", 1446 | "flat": "^5.0.2", 1447 | "is-plain-obj": "^2.1.0" 1448 | }, 1449 | "engines": { 1450 | "node": ">=10" 1451 | } 1452 | }, 1453 | "node_modules/yocto-queue": { 1454 | "version": "0.1.0", 1455 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1456 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1457 | "dev": true, 1458 | "engines": { 1459 | "node": ">=10" 1460 | }, 1461 | "funding": { 1462 | "url": "https://github.com/sponsors/sindresorhus" 1463 | } 1464 | } 1465 | }, 1466 | "dependencies": { 1467 | "abbrev": { 1468 | "version": "1.0.9", 1469 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 1470 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 1471 | "dev": true 1472 | }, 1473 | "amdefine": { 1474 | "version": "1.0.1", 1475 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 1476 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 1477 | "dev": true, 1478 | "optional": true 1479 | }, 1480 | "ansi-colors": { 1481 | "version": "4.1.1", 1482 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1483 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1484 | "dev": true 1485 | }, 1486 | "ansi-regex": { 1487 | "version": "5.0.1", 1488 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1489 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1490 | "dev": true 1491 | }, 1492 | "ansi-styles": { 1493 | "version": "4.3.0", 1494 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1495 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1496 | "dev": true, 1497 | "requires": { 1498 | "color-convert": "^2.0.1" 1499 | } 1500 | }, 1501 | "anymatch": { 1502 | "version": "3.1.3", 1503 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1504 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1505 | "dev": true, 1506 | "requires": { 1507 | "normalize-path": "^3.0.0", 1508 | "picomatch": "^2.0.4" 1509 | } 1510 | }, 1511 | "argparse": { 1512 | "version": "1.0.10", 1513 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1514 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1515 | "dev": true, 1516 | "requires": { 1517 | "sprintf-js": "~1.0.2" 1518 | } 1519 | }, 1520 | "assertion-error": { 1521 | "version": "1.1.0", 1522 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1523 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1524 | "dev": true 1525 | }, 1526 | "async": { 1527 | "version": "1.5.2", 1528 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 1529 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 1530 | "dev": true 1531 | }, 1532 | "balanced-match": { 1533 | "version": "1.0.0", 1534 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 1535 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 1536 | "dev": true 1537 | }, 1538 | "binary-extensions": { 1539 | "version": "2.2.0", 1540 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1541 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1542 | "dev": true 1543 | }, 1544 | "brace-expansion": { 1545 | "version": "1.1.11", 1546 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1547 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1548 | "dev": true, 1549 | "requires": { 1550 | "balanced-match": "^1.0.0", 1551 | "concat-map": "0.0.1" 1552 | } 1553 | }, 1554 | "braces": { 1555 | "version": "3.0.2", 1556 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1557 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1558 | "dev": true, 1559 | "requires": { 1560 | "fill-range": "^7.0.1" 1561 | } 1562 | }, 1563 | "browser-stdout": { 1564 | "version": "1.3.1", 1565 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1566 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1567 | "dev": true 1568 | }, 1569 | "camelcase": { 1570 | "version": "6.3.0", 1571 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1572 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1573 | "dev": true 1574 | }, 1575 | "chai": { 1576 | "version": "3.5.0", 1577 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 1578 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 1579 | "dev": true, 1580 | "requires": { 1581 | "assertion-error": "^1.0.1", 1582 | "deep-eql": "^0.1.3", 1583 | "type-detect": "^1.0.0" 1584 | } 1585 | }, 1586 | "chai-passport-strategy": { 1587 | "version": "1.0.1", 1588 | "resolved": "https://registry.npmjs.org/chai-passport-strategy/-/chai-passport-strategy-1.0.1.tgz", 1589 | "integrity": "sha1-2rGASPbqeG7JjLlNS3nAxi/z8gQ=", 1590 | "dev": true 1591 | }, 1592 | "chalk": { 1593 | "version": "4.1.2", 1594 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1595 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1596 | "dev": true, 1597 | "requires": { 1598 | "ansi-styles": "^4.1.0", 1599 | "supports-color": "^7.1.0" 1600 | }, 1601 | "dependencies": { 1602 | "has-flag": { 1603 | "version": "4.0.0", 1604 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1605 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1606 | "dev": true 1607 | }, 1608 | "supports-color": { 1609 | "version": "7.2.0", 1610 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1611 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1612 | "dev": true, 1613 | "requires": { 1614 | "has-flag": "^4.0.0" 1615 | } 1616 | } 1617 | } 1618 | }, 1619 | "chokidar": { 1620 | "version": "3.5.3", 1621 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1622 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1623 | "dev": true, 1624 | "requires": { 1625 | "anymatch": "~3.1.2", 1626 | "braces": "~3.0.2", 1627 | "fsevents": "~2.3.2", 1628 | "glob-parent": "~5.1.2", 1629 | "is-binary-path": "~2.1.0", 1630 | "is-glob": "~4.0.1", 1631 | "normalize-path": "~3.0.0", 1632 | "readdirp": "~3.6.0" 1633 | } 1634 | }, 1635 | "cliui": { 1636 | "version": "7.0.4", 1637 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1638 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1639 | "dev": true, 1640 | "requires": { 1641 | "string-width": "^4.2.0", 1642 | "strip-ansi": "^6.0.0", 1643 | "wrap-ansi": "^7.0.0" 1644 | } 1645 | }, 1646 | "color-convert": { 1647 | "version": "2.0.1", 1648 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1649 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1650 | "dev": true, 1651 | "requires": { 1652 | "color-name": "~1.1.4" 1653 | } 1654 | }, 1655 | "color-name": { 1656 | "version": "1.1.4", 1657 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1658 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1659 | "dev": true 1660 | }, 1661 | "concat-map": { 1662 | "version": "0.0.1", 1663 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1664 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1665 | "dev": true 1666 | }, 1667 | "debug": { 1668 | "version": "4.3.4", 1669 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1670 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1671 | "dev": true, 1672 | "requires": { 1673 | "ms": "2.1.2" 1674 | }, 1675 | "dependencies": { 1676 | "ms": { 1677 | "version": "2.1.2", 1678 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1679 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1680 | "dev": true 1681 | } 1682 | } 1683 | }, 1684 | "decamelize": { 1685 | "version": "4.0.0", 1686 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1687 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1688 | "dev": true 1689 | }, 1690 | "deep-eql": { 1691 | "version": "0.1.3", 1692 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 1693 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 1694 | "dev": true, 1695 | "requires": { 1696 | "type-detect": "0.1.1" 1697 | }, 1698 | "dependencies": { 1699 | "type-detect": { 1700 | "version": "0.1.1", 1701 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 1702 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 1703 | "dev": true 1704 | } 1705 | } 1706 | }, 1707 | "deep-is": { 1708 | "version": "0.1.3", 1709 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 1710 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 1711 | "dev": true 1712 | }, 1713 | "diff": { 1714 | "version": "5.0.0", 1715 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 1716 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 1717 | "dev": true 1718 | }, 1719 | "emoji-regex": { 1720 | "version": "8.0.0", 1721 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1722 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1723 | "dev": true 1724 | }, 1725 | "escalade": { 1726 | "version": "3.1.1", 1727 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1728 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1729 | "dev": true 1730 | }, 1731 | "escape-string-regexp": { 1732 | "version": "4.0.0", 1733 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1734 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1735 | "dev": true 1736 | }, 1737 | "escodegen": { 1738 | "version": "1.8.1", 1739 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 1740 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 1741 | "dev": true, 1742 | "requires": { 1743 | "esprima": "^2.7.1", 1744 | "estraverse": "^1.9.1", 1745 | "esutils": "^2.0.2", 1746 | "optionator": "^0.8.1", 1747 | "source-map": "~0.2.0" 1748 | } 1749 | }, 1750 | "esprima": { 1751 | "version": "2.7.3", 1752 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1753 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1754 | "dev": true 1755 | }, 1756 | "estraverse": { 1757 | "version": "1.9.3", 1758 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 1759 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 1760 | "dev": true 1761 | }, 1762 | "esutils": { 1763 | "version": "2.0.2", 1764 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 1765 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 1766 | "dev": true 1767 | }, 1768 | "fast-levenshtein": { 1769 | "version": "2.0.6", 1770 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1771 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1772 | "dev": true 1773 | }, 1774 | "fill-range": { 1775 | "version": "7.0.1", 1776 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1777 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1778 | "dev": true, 1779 | "requires": { 1780 | "to-regex-range": "^5.0.1" 1781 | } 1782 | }, 1783 | "find-up": { 1784 | "version": "5.0.0", 1785 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1786 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1787 | "dev": true, 1788 | "requires": { 1789 | "locate-path": "^6.0.0", 1790 | "path-exists": "^4.0.0" 1791 | } 1792 | }, 1793 | "flat": { 1794 | "version": "5.0.2", 1795 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1796 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1797 | "dev": true 1798 | }, 1799 | "formatio": { 1800 | "version": "1.1.1", 1801 | "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", 1802 | "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", 1803 | "dev": true, 1804 | "requires": { 1805 | "samsam": "~1.1" 1806 | } 1807 | }, 1808 | "fs.realpath": { 1809 | "version": "1.0.0", 1810 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1811 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1812 | "dev": true 1813 | }, 1814 | "fsevents": { 1815 | "version": "2.3.2", 1816 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1817 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1818 | "dev": true, 1819 | "optional": true 1820 | }, 1821 | "get-caller-file": { 1822 | "version": "2.0.5", 1823 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1824 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1825 | "dev": true 1826 | }, 1827 | "glob": { 1828 | "version": "5.0.15", 1829 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1830 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1831 | "dev": true, 1832 | "requires": { 1833 | "inflight": "^1.0.4", 1834 | "inherits": "2", 1835 | "minimatch": "2 || 3", 1836 | "once": "^1.3.0", 1837 | "path-is-absolute": "^1.0.0" 1838 | } 1839 | }, 1840 | "glob-parent": { 1841 | "version": "5.1.2", 1842 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1843 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1844 | "dev": true, 1845 | "requires": { 1846 | "is-glob": "^4.0.1" 1847 | } 1848 | }, 1849 | "handlebars": { 1850 | "version": "4.7.7", 1851 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 1852 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 1853 | "dev": true, 1854 | "requires": { 1855 | "minimist": "^1.2.5", 1856 | "neo-async": "^2.6.0", 1857 | "source-map": "^0.6.1", 1858 | "uglify-js": "^3.1.4", 1859 | "wordwrap": "^1.0.0" 1860 | }, 1861 | "dependencies": { 1862 | "source-map": { 1863 | "version": "0.6.1", 1864 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1865 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1866 | "dev": true 1867 | } 1868 | } 1869 | }, 1870 | "has-flag": { 1871 | "version": "1.0.0", 1872 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1873 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1874 | "dev": true 1875 | }, 1876 | "he": { 1877 | "version": "1.2.0", 1878 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1879 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1880 | "dev": true 1881 | }, 1882 | "inflight": { 1883 | "version": "1.0.6", 1884 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1885 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1886 | "dev": true, 1887 | "requires": { 1888 | "once": "^1.3.0", 1889 | "wrappy": "1" 1890 | } 1891 | }, 1892 | "inherits": { 1893 | "version": "2.0.3", 1894 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1895 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1896 | "dev": true 1897 | }, 1898 | "is-binary-path": { 1899 | "version": "2.1.0", 1900 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1901 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1902 | "dev": true, 1903 | "requires": { 1904 | "binary-extensions": "^2.0.0" 1905 | } 1906 | }, 1907 | "is-extglob": { 1908 | "version": "2.1.1", 1909 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1910 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1911 | "dev": true 1912 | }, 1913 | "is-fullwidth-code-point": { 1914 | "version": "3.0.0", 1915 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1916 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1917 | "dev": true 1918 | }, 1919 | "is-glob": { 1920 | "version": "4.0.3", 1921 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1922 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1923 | "dev": true, 1924 | "requires": { 1925 | "is-extglob": "^2.1.1" 1926 | } 1927 | }, 1928 | "is-number": { 1929 | "version": "7.0.0", 1930 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1931 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1932 | "dev": true 1933 | }, 1934 | "is-plain-obj": { 1935 | "version": "2.1.0", 1936 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1937 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1938 | "dev": true 1939 | }, 1940 | "is-unicode-supported": { 1941 | "version": "0.1.0", 1942 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1943 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1944 | "dev": true 1945 | }, 1946 | "isexe": { 1947 | "version": "2.0.0", 1948 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1949 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1950 | "dev": true 1951 | }, 1952 | "istanbul": { 1953 | "version": "0.4.5", 1954 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 1955 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 1956 | "dev": true, 1957 | "requires": { 1958 | "abbrev": "1.0.x", 1959 | "async": "1.x", 1960 | "escodegen": "1.8.x", 1961 | "esprima": "2.7.x", 1962 | "glob": "^5.0.15", 1963 | "handlebars": "^4.0.1", 1964 | "js-yaml": "3.x", 1965 | "mkdirp": "0.5.x", 1966 | "nopt": "3.x", 1967 | "once": "1.x", 1968 | "resolve": "1.1.x", 1969 | "supports-color": "^3.1.0", 1970 | "which": "^1.1.1", 1971 | "wordwrap": "^1.0.0" 1972 | } 1973 | }, 1974 | "js-yaml": { 1975 | "version": "3.13.1", 1976 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1977 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1978 | "dev": true, 1979 | "requires": { 1980 | "argparse": "^1.0.7", 1981 | "esprima": "^4.0.0" 1982 | }, 1983 | "dependencies": { 1984 | "esprima": { 1985 | "version": "4.0.1", 1986 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1987 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1988 | "dev": true 1989 | } 1990 | } 1991 | }, 1992 | "levn": { 1993 | "version": "0.3.0", 1994 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1995 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1996 | "dev": true, 1997 | "requires": { 1998 | "prelude-ls": "~1.1.2", 1999 | "type-check": "~0.3.2" 2000 | } 2001 | }, 2002 | "locate-path": { 2003 | "version": "6.0.0", 2004 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2005 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2006 | "dev": true, 2007 | "requires": { 2008 | "p-locate": "^5.0.0" 2009 | } 2010 | }, 2011 | "log-symbols": { 2012 | "version": "4.1.0", 2013 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2014 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2015 | "dev": true, 2016 | "requires": { 2017 | "chalk": "^4.1.0", 2018 | "is-unicode-supported": "^0.1.0" 2019 | } 2020 | }, 2021 | "lolex": { 2022 | "version": "1.3.2", 2023 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", 2024 | "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", 2025 | "dev": true 2026 | }, 2027 | "minimatch": { 2028 | "version": "3.1.2", 2029 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2030 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2031 | "dev": true, 2032 | "requires": { 2033 | "brace-expansion": "^1.1.7" 2034 | } 2035 | }, 2036 | "minimist": { 2037 | "version": "1.2.8", 2038 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 2039 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 2040 | "dev": true 2041 | }, 2042 | "mkdirp": { 2043 | "version": "0.5.4", 2044 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", 2045 | "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", 2046 | "dev": true, 2047 | "requires": { 2048 | "minimist": "^1.2.5" 2049 | } 2050 | }, 2051 | "mocha": { 2052 | "version": "10.2.0", 2053 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 2054 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 2055 | "dev": true, 2056 | "requires": { 2057 | "ansi-colors": "4.1.1", 2058 | "browser-stdout": "1.3.1", 2059 | "chokidar": "3.5.3", 2060 | "debug": "4.3.4", 2061 | "diff": "5.0.0", 2062 | "escape-string-regexp": "4.0.0", 2063 | "find-up": "5.0.0", 2064 | "glob": "7.2.0", 2065 | "he": "1.2.0", 2066 | "js-yaml": "4.1.0", 2067 | "log-symbols": "4.1.0", 2068 | "minimatch": "5.0.1", 2069 | "ms": "2.1.3", 2070 | "nanoid": "3.3.3", 2071 | "serialize-javascript": "6.0.0", 2072 | "strip-json-comments": "3.1.1", 2073 | "supports-color": "8.1.1", 2074 | "workerpool": "6.2.1", 2075 | "yargs": "16.2.0", 2076 | "yargs-parser": "20.2.4", 2077 | "yargs-unparser": "2.0.0" 2078 | }, 2079 | "dependencies": { 2080 | "argparse": { 2081 | "version": "2.0.1", 2082 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2083 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2084 | "dev": true 2085 | }, 2086 | "glob": { 2087 | "version": "7.2.0", 2088 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2089 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2090 | "dev": true, 2091 | "requires": { 2092 | "fs.realpath": "^1.0.0", 2093 | "inflight": "^1.0.4", 2094 | "inherits": "2", 2095 | "minimatch": "^3.0.4", 2096 | "once": "^1.3.0", 2097 | "path-is-absolute": "^1.0.0" 2098 | }, 2099 | "dependencies": { 2100 | "minimatch": { 2101 | "version": "3.1.2", 2102 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2103 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2104 | "dev": true, 2105 | "requires": { 2106 | "brace-expansion": "^1.1.7" 2107 | } 2108 | } 2109 | } 2110 | }, 2111 | "has-flag": { 2112 | "version": "4.0.0", 2113 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2114 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2115 | "dev": true 2116 | }, 2117 | "js-yaml": { 2118 | "version": "4.1.0", 2119 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2120 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2121 | "dev": true, 2122 | "requires": { 2123 | "argparse": "^2.0.1" 2124 | } 2125 | }, 2126 | "minimatch": { 2127 | "version": "5.0.1", 2128 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 2129 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 2130 | "dev": true, 2131 | "requires": { 2132 | "brace-expansion": "^2.0.1" 2133 | }, 2134 | "dependencies": { 2135 | "brace-expansion": { 2136 | "version": "2.0.1", 2137 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2138 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2139 | "dev": true, 2140 | "requires": { 2141 | "balanced-match": "^1.0.0" 2142 | } 2143 | } 2144 | } 2145 | }, 2146 | "supports-color": { 2147 | "version": "8.1.1", 2148 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2149 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2150 | "dev": true, 2151 | "requires": { 2152 | "has-flag": "^4.0.0" 2153 | } 2154 | } 2155 | } 2156 | }, 2157 | "ms": { 2158 | "version": "2.1.3", 2159 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2160 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2161 | "dev": true 2162 | }, 2163 | "nanoid": { 2164 | "version": "3.3.3", 2165 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 2166 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 2167 | "dev": true 2168 | }, 2169 | "neo-async": { 2170 | "version": "2.6.1", 2171 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", 2172 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", 2173 | "dev": true 2174 | }, 2175 | "nopt": { 2176 | "version": "3.0.6", 2177 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 2178 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 2179 | "dev": true, 2180 | "requires": { 2181 | "abbrev": "1" 2182 | } 2183 | }, 2184 | "normalize-path": { 2185 | "version": "3.0.0", 2186 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2187 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2188 | "dev": true 2189 | }, 2190 | "once": { 2191 | "version": "1.4.0", 2192 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2193 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2194 | "dev": true, 2195 | "requires": { 2196 | "wrappy": "1" 2197 | } 2198 | }, 2199 | "optionator": { 2200 | "version": "0.8.2", 2201 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 2202 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2203 | "dev": true, 2204 | "requires": { 2205 | "deep-is": "~0.1.3", 2206 | "fast-levenshtein": "~2.0.4", 2207 | "levn": "~0.3.0", 2208 | "prelude-ls": "~1.1.2", 2209 | "type-check": "~0.3.2", 2210 | "wordwrap": "~1.0.0" 2211 | } 2212 | }, 2213 | "p-limit": { 2214 | "version": "3.1.0", 2215 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2216 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2217 | "dev": true, 2218 | "requires": { 2219 | "yocto-queue": "^0.1.0" 2220 | } 2221 | }, 2222 | "p-locate": { 2223 | "version": "5.0.0", 2224 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2225 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2226 | "dev": true, 2227 | "requires": { 2228 | "p-limit": "^3.0.2" 2229 | } 2230 | }, 2231 | "passport-strategy": { 2232 | "version": "1.0.0", 2233 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 2234 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" 2235 | }, 2236 | "path-exists": { 2237 | "version": "4.0.0", 2238 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2239 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2240 | "dev": true 2241 | }, 2242 | "path-is-absolute": { 2243 | "version": "1.0.1", 2244 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2245 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2246 | "dev": true 2247 | }, 2248 | "picomatch": { 2249 | "version": "2.3.1", 2250 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2251 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2252 | "dev": true 2253 | }, 2254 | "prelude-ls": { 2255 | "version": "1.1.2", 2256 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2257 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2258 | "dev": true 2259 | }, 2260 | "randombytes": { 2261 | "version": "2.1.0", 2262 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2263 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2264 | "dev": true, 2265 | "requires": { 2266 | "safe-buffer": "^5.1.0" 2267 | } 2268 | }, 2269 | "readdirp": { 2270 | "version": "3.6.0", 2271 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2272 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2273 | "dev": true, 2274 | "requires": { 2275 | "picomatch": "^2.2.1" 2276 | } 2277 | }, 2278 | "require-directory": { 2279 | "version": "2.1.1", 2280 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2281 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2282 | "dev": true 2283 | }, 2284 | "resolve": { 2285 | "version": "1.1.7", 2286 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 2287 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 2288 | "dev": true 2289 | }, 2290 | "safe-buffer": { 2291 | "version": "5.2.1", 2292 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2293 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2294 | "dev": true 2295 | }, 2296 | "samsam": { 2297 | "version": "1.1.2", 2298 | "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", 2299 | "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", 2300 | "dev": true 2301 | }, 2302 | "serialize-javascript": { 2303 | "version": "6.0.0", 2304 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2305 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2306 | "dev": true, 2307 | "requires": { 2308 | "randombytes": "^2.1.0" 2309 | } 2310 | }, 2311 | "sinon": { 2312 | "version": "1.17.7", 2313 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", 2314 | "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", 2315 | "dev": true, 2316 | "requires": { 2317 | "formatio": "1.1.1", 2318 | "lolex": "1.3.2", 2319 | "samsam": "1.1.2", 2320 | "util": ">=0.10.3 <1" 2321 | } 2322 | }, 2323 | "source-map": { 2324 | "version": "0.2.0", 2325 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 2326 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 2327 | "dev": true, 2328 | "optional": true, 2329 | "requires": { 2330 | "amdefine": ">=0.0.4" 2331 | } 2332 | }, 2333 | "sprintf-js": { 2334 | "version": "1.0.3", 2335 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2336 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2337 | "dev": true 2338 | }, 2339 | "string-width": { 2340 | "version": "4.2.3", 2341 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2342 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2343 | "dev": true, 2344 | "requires": { 2345 | "emoji-regex": "^8.0.0", 2346 | "is-fullwidth-code-point": "^3.0.0", 2347 | "strip-ansi": "^6.0.1" 2348 | } 2349 | }, 2350 | "strip-ansi": { 2351 | "version": "6.0.1", 2352 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2353 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2354 | "dev": true, 2355 | "requires": { 2356 | "ansi-regex": "^5.0.1" 2357 | } 2358 | }, 2359 | "strip-json-comments": { 2360 | "version": "3.1.1", 2361 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2362 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2363 | "dev": true 2364 | }, 2365 | "supports-color": { 2366 | "version": "3.2.3", 2367 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 2368 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 2369 | "dev": true, 2370 | "requires": { 2371 | "has-flag": "^1.0.0" 2372 | } 2373 | }, 2374 | "to-regex-range": { 2375 | "version": "5.0.1", 2376 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2377 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2378 | "dev": true, 2379 | "requires": { 2380 | "is-number": "^7.0.0" 2381 | } 2382 | }, 2383 | "type-check": { 2384 | "version": "0.3.2", 2385 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2386 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2387 | "dev": true, 2388 | "requires": { 2389 | "prelude-ls": "~1.1.2" 2390 | } 2391 | }, 2392 | "type-detect": { 2393 | "version": "1.0.0", 2394 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 2395 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 2396 | "dev": true 2397 | }, 2398 | "typescript": { 2399 | "version": "4.3.2", 2400 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", 2401 | "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", 2402 | "dev": true 2403 | }, 2404 | "uglify-js": { 2405 | "version": "3.5.15", 2406 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", 2407 | "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", 2408 | "dev": true, 2409 | "optional": true, 2410 | "requires": { 2411 | "commander": "~2.20.0", 2412 | "source-map": "~0.6.1" 2413 | }, 2414 | "dependencies": { 2415 | "commander": { 2416 | "version": "2.20.0", 2417 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 2418 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 2419 | "dev": true, 2420 | "optional": true 2421 | }, 2422 | "source-map": { 2423 | "version": "0.6.1", 2424 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2425 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2426 | "dev": true, 2427 | "optional": true 2428 | } 2429 | } 2430 | }, 2431 | "util": { 2432 | "version": "0.10.3", 2433 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 2434 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 2435 | "dev": true, 2436 | "requires": { 2437 | "inherits": "2.0.1" 2438 | }, 2439 | "dependencies": { 2440 | "inherits": { 2441 | "version": "2.0.1", 2442 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 2443 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 2444 | "dev": true 2445 | } 2446 | } 2447 | }, 2448 | "which": { 2449 | "version": "1.3.0", 2450 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 2451 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 2452 | "dev": true, 2453 | "requires": { 2454 | "isexe": "^2.0.0" 2455 | } 2456 | }, 2457 | "wordwrap": { 2458 | "version": "1.0.0", 2459 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2460 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2461 | "dev": true 2462 | }, 2463 | "workerpool": { 2464 | "version": "6.2.1", 2465 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2466 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2467 | "dev": true 2468 | }, 2469 | "wrap-ansi": { 2470 | "version": "7.0.0", 2471 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2472 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2473 | "dev": true, 2474 | "requires": { 2475 | "ansi-styles": "^4.0.0", 2476 | "string-width": "^4.1.0", 2477 | "strip-ansi": "^6.0.0" 2478 | } 2479 | }, 2480 | "wrappy": { 2481 | "version": "1.0.2", 2482 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2483 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2484 | "dev": true 2485 | }, 2486 | "y18n": { 2487 | "version": "5.0.8", 2488 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2489 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2490 | "dev": true 2491 | }, 2492 | "yargs": { 2493 | "version": "16.2.0", 2494 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2495 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2496 | "dev": true, 2497 | "requires": { 2498 | "cliui": "^7.0.2", 2499 | "escalade": "^3.1.1", 2500 | "get-caller-file": "^2.0.5", 2501 | "require-directory": "^2.1.1", 2502 | "string-width": "^4.2.0", 2503 | "y18n": "^5.0.5", 2504 | "yargs-parser": "^20.2.2" 2505 | } 2506 | }, 2507 | "yargs-parser": { 2508 | "version": "20.2.4", 2509 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2510 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2511 | "dev": true 2512 | }, 2513 | "yargs-unparser": { 2514 | "version": "2.0.0", 2515 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2516 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2517 | "dev": true, 2518 | "requires": { 2519 | "camelcase": "^6.0.0", 2520 | "decamelize": "^4.0.0", 2521 | "flat": "^5.0.2", 2522 | "is-plain-obj": "^2.1.0" 2523 | } 2524 | }, 2525 | "yocto-queue": { 2526 | "version": "0.1.0", 2527 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2528 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2529 | "dev": true 2530 | } 2531 | } 2532 | } 2533 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passport-firebase-jwt", 3 | "version": "1.2.1", 4 | "description": "Passport authentication strategy for Firebase JWT token", 5 | "main": "./lib", 6 | "types": "./dist/index.d.ts", 7 | "scripts": { 8 | "test": "./node_modules/.bin/mocha --reporter spec --require test/bootstrap test/*test.js", 9 | "testcov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter spec --require test/bootstrap test/*test.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/Mawi137/passport-firebase-jwt.git" 14 | }, 15 | "keywords": [ 16 | "Passport", 17 | "Strategy", 18 | "JSON", 19 | "Web", 20 | "Token", 21 | "JWT" 22 | ], 23 | "author": "Martijn Willekens", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/Mawi137/passport-firebase-jwt/issues" 27 | }, 28 | "homepage": "https://github.com/Mawi137/passport-firebase-jwt", 29 | "devDependencies": { 30 | "chai": "^3.0.0", 31 | "chai-passport-strategy": "^1.0.0", 32 | "istanbul": "^0.4.5", 33 | "mocha": "^10.2.0", 34 | "sinon": "^1.0.0", 35 | "typescript": "^4.3.2" 36 | }, 37 | "dependencies": { 38 | "passport-strategy": "^1.0.0" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /test/auth_header-test.js: -------------------------------------------------------------------------------- 1 | var auth_hdr = require('../lib/auth_header') 2 | 3 | 4 | describe('Parsing Auth Header field-value', function() { 5 | 6 | it('Should handle single space separated values', function() { 7 | var res = auth_hdr.parse("SCHEME VALUE"); 8 | expect(res).to.deep.equal({scheme: "SCHEME", value: "VALUE"}); 9 | }); 10 | 11 | 12 | it('Should handle CRLF separator', function() { 13 | var res = auth_hdr.parse("SCHEME\nVALUE"); 14 | expect(res).to.deep.equal({scheme: "SCHEME", value: "VALUE"}); 15 | }); 16 | 17 | 18 | it('Should handle malformed authentication headers with no scheme', function() { 19 | var res = auth_hdr.parse("malformed"); 20 | expect(res).to.not.be.ok; 21 | }); 22 | 23 | 24 | it('Should return null when the auth header is not a string', function() { 25 | var res = auth_hdr.parse({}); 26 | expect(res).to.be.null; 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /test/bootstrap.js: -------------------------------------------------------------------------------- 1 | var chai = require('chai'); 2 | chai.use(require('chai-passport-strategy')); 3 | global.expect = chai.expect; 4 | -------------------------------------------------------------------------------- /test/extractors-test.js: -------------------------------------------------------------------------------- 1 | var extract_jwt = require('../lib/extract_jwt'), 2 | Request = require('./mock_request'); 3 | 4 | describe('Token extractor', function() { 5 | 6 | describe('fromHeader', function() { 7 | 8 | var extractor = extract_jwt.fromHeader('test_header'); 9 | 10 | it('should return null no when token is present', function() { 11 | var req = new Request(); 12 | 13 | var token = extractor(req); 14 | 15 | expect(token).to.be.null; 16 | }); 17 | 18 | 19 | it('should return the value from the specified header', function() { 20 | var req = new Request(); 21 | req.headers['test_header'] = 'abcd123' 22 | 23 | var token = extractor(req) 24 | 25 | expect(token).to.equal('abcd123'); 26 | }); 27 | }); 28 | 29 | 30 | describe('fromBodyField', function() { 31 | 32 | var extractor = extract_jwt.fromBodyField('test_field'); 33 | 34 | it('should return null when no body is present', function() { 35 | var req = new Request(); 36 | 37 | var token = extractor(req); 38 | 39 | expect(token).to.be.null; 40 | }); 41 | 42 | 43 | it('should return null when the specified body field is not present', function() { 44 | var req = new Request(); 45 | req.body = {}; 46 | 47 | var token = extractor(req); 48 | 49 | expect(token).to.be.null; 50 | }); 51 | 52 | 53 | it('should return the value from the specified body field', function() { 54 | var req = new Request(); 55 | req.body = {}; 56 | req.body.test_field = 'abcd123'; 57 | 58 | var token = extractor(req); 59 | 60 | expect(token).to.equal('abcd123'); 61 | }); 62 | 63 | 64 | it('should work properly with querystring', function() { 65 | var req = new Request(); 66 | const querystring = require('querystring'); 67 | req.body = querystring.parse('test_field=abcd123') 68 | 69 | var token = extractor(req); 70 | 71 | expect(token).to.equal('abcd123') 72 | }); 73 | }); 74 | 75 | 76 | describe('fromUrlQueryParameter', function() { 77 | 78 | var extractor = extract_jwt.fromUrlQueryParameter('test_param'); 79 | 80 | 81 | it('should return null when the specified paramter is not present', function() { 82 | var req = new Request(); 83 | 84 | var token = extractor(req); 85 | 86 | expect(token).to.be.null; 87 | }); 88 | 89 | 90 | it('should return the value from the specified parameter', function() { 91 | var req = new Request(); 92 | req.url += '?test_param=abcd123'; 93 | 94 | var token = extractor(req); 95 | 96 | expect(token).to.equal('abcd123'); 97 | }); 98 | }); 99 | 100 | 101 | describe('fromAuthHeaderWithScheme', function() { 102 | 103 | var extractor = extract_jwt.fromAuthHeaderWithScheme('TEST_SCHEME'); 104 | 105 | it('should return null when no auth header is present', function() { 106 | var req = new Request(); 107 | 108 | var token = extractor(req); 109 | 110 | expect(token).to.be.null; 111 | }); 112 | 113 | 114 | it('should return null when the auth header is present but the auth scheme doesnt match', function() { 115 | var req = new Request() 116 | req.headers['authorization'] = "NOT_TEST_SCHEME abcd123"; 117 | 118 | var token = extractor(req); 119 | 120 | expect(token).to.be.null; 121 | }); 122 | 123 | 124 | it('should return the value from the authorization header with specified auth scheme', function() { 125 | var req = new Request() 126 | req.headers['authorization'] = "TEST_SCHEME abcd123"; 127 | 128 | var token = extractor(req); 129 | 130 | expect(token).to.equal('abcd123'); 131 | }); 132 | 133 | 134 | it('should perform a case-insensivite string comparison', function () { 135 | var req = new Request() 136 | req.headers['authorization'] = 'test_scheme abcd123'; 137 | 138 | var token = extractor(req); 139 | 140 | expect(token).to.equal('abcd123'); 141 | }); 142 | }); 143 | 144 | 145 | describe('fromAuthHeader', function() { 146 | 147 | var extractor = extract_jwt.fromAuthHeaderAsBearerToken(); 148 | 149 | it('should return the value from the authorization header with default JWT auth scheme', function() { 150 | var req = new Request() 151 | req.headers['authorization'] = "bearer abcd123"; 152 | 153 | var token = extractor(req); 154 | 155 | expect(token).to.equal('abcd123'); 156 | }); 157 | 158 | 159 | }); 160 | 161 | describe('fromExtractors', function() { 162 | 163 | it('should raise a type error when the extractor is constructed with a non-array argument', function() { 164 | this_should_throw = function() { 165 | var extractor = extract_jwt.fromExtractors({}) 166 | } 167 | 168 | expect(this_should_throw).to.throw(TypeError) 169 | }); 170 | 171 | 172 | var extractor = extract_jwt.fromExtractors([extract_jwt.fromAuthHeaderAsBearerToken(), extract_jwt.fromHeader('authorization')]); 173 | 174 | it('should return null when no extractor extracts token', function() { 175 | var req = new Request(); 176 | 177 | var token = extractor(req); 178 | 179 | expect(token).to.be.null; 180 | }); 181 | 182 | 183 | it('should return token found by least extractor', function() { 184 | var req = new Request() 185 | req.headers['authorization'] = "abcd123"; 186 | 187 | var token = extractor(req); 188 | 189 | expect(token).to.equal('abcd123'); 190 | }); 191 | 192 | 193 | it('should return token found by first extractor', function() { 194 | var req = new Request() 195 | req.headers['authorization'] = "bearer abcd123"; 196 | 197 | var token = extractor(req); 198 | 199 | expect(token).to.equal('abcd123'); 200 | }); 201 | 202 | }); 203 | 204 | 205 | describe('versionOneCompatibility', function () { 206 | 207 | describe('default behavior', function() { 208 | 209 | var extractor = extract_jwt.versionOneCompatibility({}); 210 | 211 | it('should return the token in the default "JWT" auth header', function () { 212 | var req = new Request(); 213 | req.headers['authorization'] = "JWT abcd123"; 214 | 215 | var token = extractor(req); 216 | 217 | expect(token).to.equal('abcd123'); 218 | }); 219 | 220 | 221 | it('should return the token in the default "auth_token" body field', function () { 222 | var req = new Request(); 223 | req.body = {}; 224 | req.body['auth_token'] = 'xyzabcd'; 225 | 226 | var token = extractor(req); 227 | 228 | expect(token).to.equal('xyzabcd'); 229 | }); 230 | 231 | 232 | it('should return then token in the default "auth_token" query parameter', function () { 233 | var req = new Request(); 234 | req.url += '?auth_token=abcd123'; 235 | 236 | var token = extractor(req); 237 | 238 | expect(token).to.equal('abcd123'); 239 | }); 240 | }); 241 | 242 | 243 | describe('user supplied parameters', function() { 244 | 245 | it('should return the token in an auth header with a user specified auth scheme', function() { 246 | var opts = { authScheme: 'MY_CUSTOM_AUTH_SCHEME' }; 247 | var extractor = extract_jwt.versionOneCompatibility(opts); 248 | var req = new Request(); 249 | req.headers['authorization'] = 'MY_CUSTOM_AUTH_SCHEME deadbeef'; 250 | 251 | var token = extractor(req); 252 | 253 | expect(token).to.equal('deadbeef'); 254 | }); 255 | 256 | 257 | it('should return the token in a user supplied body field', function () { 258 | var opts = { tokenBodyField: 'CUSTOM_BODY_FIELD' }; 259 | var extractor = extract_jwt.versionOneCompatibility(opts); 260 | var req = new Request(); 261 | req.body = {}; 262 | req.body['CUSTOM_BODY_FIELD'] = 'badbeef'; 263 | 264 | var token = extractor(req); 265 | 266 | expect(token).to.equal('badbeef'); 267 | }); 268 | 269 | 270 | it('should return the token in a user specified query parameter', function () { 271 | var opts = { tokenQueryParameterName: 'CustomQueryParam' }; 272 | var extractor = extract_jwt.versionOneCompatibility(opts); 273 | var req = new Request(); 274 | req.url += '?CustomQueryParam=deadbeef'; 275 | 276 | var token = extractor(req); 277 | 278 | expect(token).to.equal('deadbeef'); 279 | }); 280 | 281 | }); 282 | 283 | 284 | }); 285 | 286 | }); 287 | 288 | -------------------------------------------------------------------------------- /test/mock_request.js: -------------------------------------------------------------------------------- 1 | /** 2 | A mock Request for testing jwt extractor functions 3 | */ 4 | function Request() { 5 | this.method = 'GET'; 6 | this.url = '/'; 7 | this.headers = {}; 8 | } 9 | 10 | module.exports = Request; 11 | -------------------------------------------------------------------------------- /test/strategy-init-test.js: -------------------------------------------------------------------------------- 1 | var Strategy = require('../lib/strategy'); 2 | 3 | describe('Strategy', function() { 4 | var strategy = new Strategy({jwtFromRequest: function(){}, secretOrKey: 'secret', passReqToCallback: false}, function() {}); 5 | 6 | it('should be named jwt', function() { 7 | expect(strategy.name).to.equal('firebase-jwt'); 8 | }); 9 | 10 | it('should throw if constructed without a verify callback', function() { 11 | expect(function() { 12 | var s = new Strategy({jwtFromRequest: function(r) {}, secretOrKey: 'secret'}); 13 | }).to.throw(TypeError, "JwtStrategy requires a verify callback"); 14 | }); 15 | 16 | it('should throw if constructed with both a secretOrKey and a secretOrKeyProvider', function () { 17 | expect(function() { 18 | var s = new Strategy({ 19 | jwtFromRequest: function(r) {} 20 | }); 21 | }).to.throw(TypeError); 22 | }); 23 | 24 | it('should throw if constructed without a jwtFromRequest arg', function() { 25 | expect(function() { 26 | var s = new Strategy({secretOrKey: 'secret'}, function() {}); 27 | }).to.throw(TypeError); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /test/testdata.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // Note, this JWT will expire sometime in 2286. If unit tests are failing around this time try 3 | // generating a new, valid token :) 4 | token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMzQ1Njc4OTAsIm5hbWUiOiJKb2huIERvZSIsImlzcyI6ImV4YW1wbGVzb2Z0LmNvbSIsImV4cCI6Ijk5OTk5OTk5OTkifQ.CbpI0TNI-FYXe6p3PgM__jwlz6aCT1qpUBsTVCfWuBM" 5 | }; 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["lib/**/*"], 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "declaration": true, 6 | "emitDeclarationOnly": true, 7 | "outDir": "dist" 8 | } 9 | } --------------------------------------------------------------------------------