From 8d35b5f22564bd3f18d931dd7b7c3bb3d1197572 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Apr 2021 18:14:11 +0000 Subject: [PATCH 01/68] Bump y18n from 4.0.0 to 4.0.3 Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.3. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/y18n-v4.0.3/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/compare/v4.0.0...y18n-v4.0.3) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16bc9832..079f6df0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5159,9 +5159,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "4.0.0", From b2771999872bc8b3b3d64250af55496759231a81 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Tue, 2 Mar 2021 13:10:58 -0300 Subject: [PATCH 02/68] =?UTF-8?q?ci:=20Detec=C3=A7=C3=A3o=20automatica=20d?= =?UTF-8?q?o=20ambiente=20de=20desenvolvimento=20para=20geracao=20das=20cr?= =?UTF-8?q?edenciais=20do=20GCP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/app.js | 2 +- src/js/models/cloud/FirestoreConnectionSingleton.js | 7 ++++++- src/js/models/cloud/StorageConnectionSingleton.js | 7 ++++++- src/ts/app.ts | 2 +- src/ts/models/cloud/FirestoreConnectionSingleton.ts | 8 ++++++-- src/ts/models/cloud/StorageConnectionSingleton.ts | 8 ++++++-- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/js/app.js b/src/js/app.js index 52cb5d95..7cc51eb5 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -42,7 +42,7 @@ const fileUpload = require('express-fileupload'); const routes_1 = require('./routes/routes'); const dotenv_1 = require('dotenv'); const AuthDAO_1 = require('./models/DAO/AuthDAO'); -dotenv_1.config({ path: __dirname + '/.env' }); +dotenv_1.config({ path: __dirname + '/../../.env' }); const app = express(); app.use( fileUpload({ diff --git a/src/js/models/cloud/FirestoreConnectionSingleton.js b/src/js/models/cloud/FirestoreConnectionSingleton.js index ff7c5b3a..fd6849b6 100644 --- a/src/js/models/cloud/FirestoreConnectionSingleton.js +++ b/src/js/models/cloud/FirestoreConnectionSingleton.js @@ -2,11 +2,16 @@ Object.defineProperty(exports, '__esModule', { value: true }); exports.FirestoreConnectionSingleton = void 0; const firestore_1 = require('@google-cloud/firestore'); +const credentials = require('../../config/gcp_key.json'); const ObjectStore_1 = require('../DAO/ObjectStore'); class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { constructor() { super(); - this._db = new firestore_1.Firestore(); + if (process.env.DEVELOPMENT) { + this._db = new firestore_1.Firestore({ credentials }); + } else { + this._db = new firestore_1.Firestore(); + } } static getInstance() { if (!FirestoreConnectionSingleton._instance) { diff --git a/src/js/models/cloud/StorageConnectionSingleton.js b/src/js/models/cloud/StorageConnectionSingleton.js index 68af5875..5bff8cf5 100644 --- a/src/js/models/cloud/StorageConnectionSingleton.js +++ b/src/js/models/cloud/StorageConnectionSingleton.js @@ -2,12 +2,17 @@ Object.defineProperty(exports, '__esModule', { value: true }); exports.StorageConnectionSingleton = void 0; const storage_1 = require('@google-cloud/storage'); +const credentials = require('../../config/gcp_key.json'); const FileStore_1 = require('../DAO/FileStore'); class StorageConnectionSingleton extends FileStore_1.FileStore { constructor() { super(); this._bucket = `adinfo-dp6-files`; - this._db = new storage_1.Storage(); + if (process.env.DEVELOPMENT) { + this._db = new storage_1.Storage({ credentials }); + } else { + this._db = new storage_1.Storage(); + } } static getInstance() { if (!StorageConnectionSingleton._instance) { diff --git a/src/ts/app.ts b/src/ts/app.ts index f80b4603..1a6c945c 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -7,7 +7,7 @@ import { config } from 'dotenv'; import { Auth } from './models/Auth'; import { AuthDAO } from './models/DAO/AuthDAO'; -config({ path: __dirname + '/.env' }); +config({ path: __dirname + '/../../.env' }); const app = express(); diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index be734a1e..d15fcba8 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -4,7 +4,7 @@ import { Firestore, DocumentData, } from '@google-cloud/firestore'; -// import * as credentials from '../../config/gcp_key.json'; +import * as credentials from '../../config/gcp_key.json'; import { ObjectStore } from '../DAO/ObjectStore'; export class FirestoreConnectionSingleton extends ObjectStore { @@ -13,7 +13,11 @@ export class FirestoreConnectionSingleton extends ObjectStore { private constructor() { super(); - this._db = new Firestore(); + if (process.env.DEVELOPMENT) { + this._db = new Firestore({ credentials }); + } else { + this._db = new Firestore(); + } } /** diff --git a/src/ts/models/cloud/StorageConnectionSingleton.ts b/src/ts/models/cloud/StorageConnectionSingleton.ts index f915b93d..568a43cd 100644 --- a/src/ts/models/cloud/StorageConnectionSingleton.ts +++ b/src/ts/models/cloud/StorageConnectionSingleton.ts @@ -1,5 +1,5 @@ import { DownloadResponse, Storage } from '@google-cloud/storage'; -// import * as credentials from '../../config/gcp_key.json'; +import * as credentials from '../../config/gcp_key.json'; import { FileStore } from '../DAO/FileStore'; import { FileDAO } from '../DAO/FileDAO'; @@ -10,7 +10,11 @@ export class StorageConnectionSingleton extends FileStore { private constructor() { super(); - this._db = new Storage(); + if (process.env.DEVELOPMENT) { + this._db = new Storage({ credentials }); + } else { + this._db = new Storage(); + } } /** From c004cb58bcf5bfcaea40f3af34c2f40baff8a871 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Tue, 2 Mar 2021 15:38:47 -0300 Subject: [PATCH 03/68] fix: Importe das credenciais do GCP no ambiente de producao --- .gitignore | 3 ++- src/js/models/cloud/FirestoreConnectionSingleton.js | 8 ++------ src/js/models/cloud/StorageConnectionSingleton.js | 2 +- src/ts/models/cloud/FirestoreConnectionSingleton.ts | 10 ++++------ src/ts/models/cloud/StorageConnectionSingleton.ts | 4 +++- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index ad389b36..e3766fb5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ node_modules/ .vscode/ config/gcp_key.json src/js/config/gcp_key.json -src/ts/config/gcp_key.json \ No newline at end of file +src/ts/config/gcp_key.json +gcp_key.json \ No newline at end of file diff --git a/src/js/models/cloud/FirestoreConnectionSingleton.js b/src/js/models/cloud/FirestoreConnectionSingleton.js index fd6849b6..9115d421 100644 --- a/src/js/models/cloud/FirestoreConnectionSingleton.js +++ b/src/js/models/cloud/FirestoreConnectionSingleton.js @@ -2,16 +2,12 @@ Object.defineProperty(exports, '__esModule', { value: true }); exports.FirestoreConnectionSingleton = void 0; const firestore_1 = require('@google-cloud/firestore'); -const credentials = require('../../config/gcp_key.json'); const ObjectStore_1 = require('../DAO/ObjectStore'); class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { constructor() { super(); - if (process.env.DEVELOPMENT) { - this._db = new firestore_1.Firestore({ credentials }); - } else { - this._db = new firestore_1.Firestore(); - } + const credentials = require('../../../../gcp_key.json'); + this._db = new firestore_1.Firestore({ credentials }); } static getInstance() { if (!FirestoreConnectionSingleton._instance) { diff --git a/src/js/models/cloud/StorageConnectionSingleton.js b/src/js/models/cloud/StorageConnectionSingleton.js index 5bff8cf5..1c375ba8 100644 --- a/src/js/models/cloud/StorageConnectionSingleton.js +++ b/src/js/models/cloud/StorageConnectionSingleton.js @@ -2,13 +2,13 @@ Object.defineProperty(exports, '__esModule', { value: true }); exports.StorageConnectionSingleton = void 0; const storage_1 = require('@google-cloud/storage'); -const credentials = require('../../config/gcp_key.json'); const FileStore_1 = require('../DAO/FileStore'); class StorageConnectionSingleton extends FileStore_1.FileStore { constructor() { super(); this._bucket = `adinfo-dp6-files`; if (process.env.DEVELOPMENT) { + const credentials = require('../../../../gcp_key.json'); this._db = new storage_1.Storage({ credentials }); } else { this._db = new storage_1.Storage(); diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index d15fcba8..3f5ae103 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -4,7 +4,6 @@ import { Firestore, DocumentData, } from '@google-cloud/firestore'; -import * as credentials from '../../config/gcp_key.json'; import { ObjectStore } from '../DAO/ObjectStore'; export class FirestoreConnectionSingleton extends ObjectStore { @@ -13,11 +12,10 @@ export class FirestoreConnectionSingleton extends ObjectStore { private constructor() { super(); - if (process.env.DEVELOPMENT) { - this._db = new Firestore({ credentials }); - } else { - this._db = new Firestore(); - } + /* eslint-disable @typescript-eslint/no-var-requires */ + const credentials = require('../../../../gcp_key.json'); + /* eslint-enable @typescript-eslint/no-var-requires */ + this._db = new Firestore({ credentials }); } /** diff --git a/src/ts/models/cloud/StorageConnectionSingleton.ts b/src/ts/models/cloud/StorageConnectionSingleton.ts index 568a43cd..fa2b594c 100644 --- a/src/ts/models/cloud/StorageConnectionSingleton.ts +++ b/src/ts/models/cloud/StorageConnectionSingleton.ts @@ -1,5 +1,4 @@ import { DownloadResponse, Storage } from '@google-cloud/storage'; -import * as credentials from '../../config/gcp_key.json'; import { FileStore } from '../DAO/FileStore'; import { FileDAO } from '../DAO/FileDAO'; @@ -11,6 +10,9 @@ export class StorageConnectionSingleton extends FileStore { private constructor() { super(); if (process.env.DEVELOPMENT) { + /* eslint-disable @typescript-eslint/no-var-requires */ + const credentials = require('../../../../gcp_key.json'); + /* eslint-enable @typescript-eslint/no-var-requires */ this._db = new Storage({ credentials }); } else { this._db = new Storage(); From 535ff10fa8df1790d56b210d663710798d5b9111 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Tue, 2 Mar 2021 15:45:39 -0300 Subject: [PATCH 04/68] fix: Instancia do objeto de Firestore nos ambientes de desenvolvimento e producao --- src/js/models/cloud/FirestoreConnectionSingleton.js | 8 ++++++-- src/ts/models/cloud/FirestoreConnectionSingleton.ts | 12 ++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/js/models/cloud/FirestoreConnectionSingleton.js b/src/js/models/cloud/FirestoreConnectionSingleton.js index 9115d421..3b05c193 100644 --- a/src/js/models/cloud/FirestoreConnectionSingleton.js +++ b/src/js/models/cloud/FirestoreConnectionSingleton.js @@ -6,8 +6,12 @@ const ObjectStore_1 = require('../DAO/ObjectStore'); class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { constructor() { super(); - const credentials = require('../../../../gcp_key.json'); - this._db = new firestore_1.Firestore({ credentials }); + if (process.env.DEVELOPMENT) { + const credentials = require('../../../../gcp_key.json'); + this._db = new firestore_1.Firestore({ credentials }); + } else { + this._db = new firestore_1.Firestore(); + } } static getInstance() { if (!FirestoreConnectionSingleton._instance) { diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index 3f5ae103..f44e6c99 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -12,10 +12,14 @@ export class FirestoreConnectionSingleton extends ObjectStore { private constructor() { super(); - /* eslint-disable @typescript-eslint/no-var-requires */ - const credentials = require('../../../../gcp_key.json'); - /* eslint-enable @typescript-eslint/no-var-requires */ - this._db = new Firestore({ credentials }); + if (process.env.DEVELOPMENT) { + /* eslint-disable @typescript-eslint/no-var-requires */ + const credentials = require('../../../../gcp_key.json'); + /* eslint-enable @typescript-eslint/no-var-requires */ + this._db = new Firestore({ credentials }); + } else { + this._db = new Firestore(); + } } /** From d2785dfc11570755400ac1c48b0058ef783b228a Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Mon, 8 Mar 2021 18:35:46 -0300 Subject: [PATCH 05/68] =?UTF-8?q?feat:=20Configura=C3=A7=C3=A3o=20de=20dep?= =?UTF-8?q?end=C3=AAncia=20de=20campos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Criação da feature de dependência de campos, quando um campo assume um determinado valor o outro campo deve passar por uma segunda validação de preenchimento Escrita dos testes unitários --- src/js/models/Adobe.js | 8 +- src/js/models/Config.js | 98 +++++++++--- src/js/models/DependencyConfig.js | 44 ++++++ src/js/models/FacebookAds.js | 9 +- src/js/models/GA.js | 8 +- src/js/models/GeneralVehicle.js | 8 +- src/js/models/GoogleAds.js | 8 +- .../cloud/FirestoreConnectionSingleton.js | 5 +- .../cloud/StorageConnectionSingleton.js | 5 +- src/ts/models/Adobe.ts | 9 +- src/ts/models/Config.ts | 144 +++++++++++++++--- src/ts/models/DependencyConfig.ts | 67 ++++++++ src/ts/models/FacebookAds.ts | 9 +- src/ts/models/GA.ts | 8 +- src/ts/models/GeneralVehicle.ts | 8 +- src/ts/models/GoogleAds.ts | 8 +- .../cloud/FirestoreConnectionSingleton.ts | 2 +- .../cloud/StorageConnectionSingleton.ts | 2 +- test/models/Adobe.spec.ts | 76 +++++++++ test/models/Config.spec.ts | 128 ++++++++++++++++ test/models/FacebookAds.spec.ts | 100 ++++++++++++ test/models/GA.spec.ts | 88 +++++++++++ test/models/GeneralVehicle.spec.ts | 95 +++++++++++- test/models/GoogleAds.spec.ts | 71 ++++++++- 24 files changed, 918 insertions(+), 90 deletions(-) create mode 100644 src/js/models/DependencyConfig.js create mode 100644 src/ts/models/DependencyConfig.ts diff --git a/src/js/models/Adobe.js b/src/js/models/Adobe.js index 14c423f6..1e1b6d25 100644 --- a/src/js/models/Adobe.js +++ b/src/js/models/Adobe.js @@ -53,10 +53,10 @@ class Adobe extends AnalyticsTool_1.AnalyticsTool { return; } if ( - this.config.validationRules[column].length > 0 && - !StringUtils_1.StringUtils.validateString( - this.csvLine[columnNormalized], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[columnNormalized] ) ) { this._hasValidationError = true; diff --git a/src/js/models/Config.js b/src/js/models/Config.js index 0a155949..65e42f2f 100644 --- a/src/js/models/Config.js +++ b/src/js/models/Config.js @@ -2,6 +2,8 @@ Object.defineProperty(exports, '__esModule', { value: true }); exports.Config = void 0; const JsonUtils_1 = require('../utils/JsonUtils'); +const DependencyConfig_1 = require('./DependencyConfig'); +const StringUtils_1 = require('../utils/StringUtils'); class Config { constructor(jsonConfig) { this._csvSeparator = ','; @@ -12,6 +14,10 @@ class Config { this._csvSeparator = jsonConfigTemp.csvSeparator; delete jsonConfigTemp.csvSeparator; } + this._dependenciesConfig = this._buildDependenciesConfig( + jsonConfigTemp.dependenciesConfig + ); + delete jsonConfigTemp.dependenciesConfig; this._spaceSeparator = jsonConfigTemp.spaceSeparator; delete jsonConfigTemp.spaceSeparator; this._insertTime = jsonConfigTemp.insertTime; @@ -40,26 +46,17 @@ class Config { !this._analyticsTool ); } + _buildDependenciesConfig(dependenciesConfig) { + if (!dependenciesConfig) { + return []; + } + return dependenciesConfig.map( + (dependencyConfig) => + new DependencyConfig_1.DependencyConfig(dependencyConfig) + ); + } toString() { - let jsonConfig = {}; - Object.keys(this).forEach((key, index) => { - if (key === '_analyticsTool' || key === '_medias') { - jsonConfig = JsonUtils_1.JsonUtils.addParametersAt( - jsonConfig, - Object.values(this)[index] || {} - ); - } else if (key === '_validationRules') { - jsonConfig = JsonUtils_1.JsonUtils.addParametersAt(jsonConfig, { - columns: this._validationRules, - }); - } else if ( - key !== '_analyticsToolName' && - Object.values(this)[index] - ) { - jsonConfig[key.replace('_', '')] = Object.values(this)[index]; - } - }); - return JSON.stringify(jsonConfig); + return JSON.stringify(this.toJson()); } toJson() { let jsonConfig = {}; @@ -73,6 +70,14 @@ class Config { jsonConfig = JsonUtils_1.JsonUtils.addParametersAt(jsonConfig, { columns: this._validationRules, }); + } else if (key === '_dependenciesConfig') { + if (this._dependenciesConfig.length > 0) { + jsonConfig[ + 'dependenciesConfig' + ] = this._dependenciesConfig.map((dependencyConfig) => { + return dependencyConfig.toJson(); + }); + } } else if ( key !== '_analyticsToolName' && Object.values(this)[index] @@ -90,9 +95,62 @@ class Config { }); return configValues.join(this._csvSeparator); } - existsValidationRuleFor(csvColumn) { + _existsValidationRuleFor(csvColumn) { return this.validationRules[csvColumn].length > 0; } + _validateRulesFor(csvColumn, value) { + if (!this._existsValidationRuleFor(csvColumn)) { + return true; + } + return StringUtils_1.StringUtils.validateString( + value, + this._validationRules[csvColumn] + ); + } + _getDependencyConfigFor(csvColumn) { + let dependencyColumnConfig; + this._dependenciesConfig.forEach((dependencyConfig) => { + if (dependencyConfig.columnDestiny === csvColumn) { + dependencyColumnConfig = dependencyConfig; + } + }); + return dependencyColumnConfig; + } + _validateDependencyRulesFor(csvLine, csvColumn, value) { + const dependencyConfigForCsvColumn = this._getDependencyConfigFor( + csvColumn + ); + if ( + !dependencyConfigForCsvColumn || + !StringUtils_1.StringUtils.validateString( + csvLine[ + StringUtils_1.StringUtils.normalize( + dependencyConfigForCsvColumn.columnReference + ) + ], + dependencyConfigForCsvColumn.valuesReference + ) + ) { + return true; + } + if (dependencyConfigForCsvColumn.hasMatch) { + return StringUtils_1.StringUtils.validateString( + value, + dependencyConfigForCsvColumn.matches + ); + } else { + return !StringUtils_1.StringUtils.validateString( + value, + dependencyConfigForCsvColumn.matches + ); + } + } + validateField(csvLine, csvColumn, value) { + return ( + this._validateRulesFor(csvColumn, value) && + this._validateDependencyRulesFor(csvLine, csvColumn, value) + ); + } existsColumn(csvColumn) { return !!this.validationRules[csvColumn]; } diff --git a/src/js/models/DependencyConfig.js b/src/js/models/DependencyConfig.js new file mode 100644 index 00000000..5801322f --- /dev/null +++ b/src/js/models/DependencyConfig.js @@ -0,0 +1,44 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +exports.DependencyConfig = void 0; +class DependencyConfig { + constructor(dependencyConfig) { + const { + columnReference, + hasMatch, + matches, + valuesReference, + columnDestiny, + } = dependencyConfig; + this._columnReference = columnReference; + this._hasMatch = hasMatch; + this._matches = matches; + this._valuesReference = valuesReference; + this._columnDestiny = columnDestiny; + } + toJson() { + return { + columnReference: this._columnReference, + valuesReference: this._valuesReference, + hasMatch: this._hasMatch, + columnDestiny: this._columnDestiny, + matches: this._matches, + }; + } + get columnDestiny() { + return this._columnDestiny; + } + get matches() { + return this._matches; + } + get hasMatch() { + return this._hasMatch; + } + get columnReference() { + return this._columnReference; + } + get valuesReference() { + return this._valuesReference; + } +} +exports.DependencyConfig = DependencyConfig; diff --git a/src/js/models/FacebookAds.js b/src/js/models/FacebookAds.js index 4d24da4e..3ffe3e81 100644 --- a/src/js/models/FacebookAds.js +++ b/src/js/models/FacebookAds.js @@ -43,11 +43,10 @@ class FacebookAds extends Vehicle_1.Vehicle { column ); if ( - this.config.validationRules[column].length > - 0 && - !StringUtils_1.StringUtils.validateString( - this.csvLine[normalizedColumn], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[normalizedColumn] ) ) { this._hasValidationError = true; diff --git a/src/js/models/GA.js b/src/js/models/GA.js index 9109b323..56038cc2 100644 --- a/src/js/models/GA.js +++ b/src/js/models/GA.js @@ -80,10 +80,10 @@ class GA extends AnalyticsTool_1.AnalyticsTool { return; } if ( - this.config.validationRules[column].length > 0 && - !StringUtils_1.StringUtils.validateString( - this.csvLine[columnNormalized], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[columnNormalized] ) ) { this._hasValidationError[utm] = true; diff --git a/src/js/models/GeneralVehicle.js b/src/js/models/GeneralVehicle.js index e479a49b..8c29d402 100644 --- a/src/js/models/GeneralVehicle.js +++ b/src/js/models/GeneralVehicle.js @@ -34,10 +34,10 @@ class GeneralVehicle extends Vehicle_1.Vehicle { csvColumn ); if ( - this.config.existsValidationRuleFor(csvColumn) && - !StringUtils_1.StringUtils.validateString( - this.csvLine[normalizedColumn], - this.config.validationRules[csvColumn] + !this.config.validateField( + this.csvLine, + csvColumn, + this.csvLine[normalizedColumn] ) ) { this._validationErrorFounded(param, csvColumn); diff --git a/src/js/models/GoogleAds.js b/src/js/models/GoogleAds.js index 8274f75e..5d59950c 100644 --- a/src/js/models/GoogleAds.js +++ b/src/js/models/GoogleAds.js @@ -36,10 +36,10 @@ class GoogleAds extends Vehicle_1.Vehicle { column ); if ( - this.config.validationRules[column].length > 0 && - !StringUtils_1.StringUtils.validateString( - this.csvLine[normalizedColumn], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[normalizedColumn] ) ) { this._hasValidationError = true; diff --git a/src/js/models/cloud/FirestoreConnectionSingleton.js b/src/js/models/cloud/FirestoreConnectionSingleton.js index 3b05c193..3163824f 100644 --- a/src/js/models/cloud/FirestoreConnectionSingleton.js +++ b/src/js/models/cloud/FirestoreConnectionSingleton.js @@ -8,7 +8,10 @@ class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { super(); if (process.env.DEVELOPMENT) { const credentials = require('../../../../gcp_key.json'); - this._db = new firestore_1.Firestore({ credentials }); + this._db = new firestore_1.Firestore({ + projectId: 'adinfo', + credentials, + }); } else { this._db = new firestore_1.Firestore(); } diff --git a/src/js/models/cloud/StorageConnectionSingleton.js b/src/js/models/cloud/StorageConnectionSingleton.js index 1c375ba8..ca178f1a 100644 --- a/src/js/models/cloud/StorageConnectionSingleton.js +++ b/src/js/models/cloud/StorageConnectionSingleton.js @@ -9,7 +9,10 @@ class StorageConnectionSingleton extends FileStore_1.FileStore { this._bucket = `adinfo-dp6-files`; if (process.env.DEVELOPMENT) { const credentials = require('../../../../gcp_key.json'); - this._db = new storage_1.Storage({ credentials }); + this._db = new storage_1.Storage({ + projectId: 'adinfo', + credentials, + }); } else { this._db = new storage_1.Storage(); } diff --git a/src/ts/models/Adobe.ts b/src/ts/models/Adobe.ts index 241fb8cc..f348757c 100644 --- a/src/ts/models/Adobe.ts +++ b/src/ts/models/Adobe.ts @@ -78,7 +78,6 @@ export class Adobe extends AnalyticsTool { }; } - //TODO padronizar columns /** * Constroi o Cid da linha e preenche o atributo hasErrorAtCid */ @@ -92,10 +91,10 @@ export class Adobe extends AnalyticsTool { return; } if ( - this.config.validationRules[column].length > 0 && - !StringUtils.validateString( - this.csvLine[columnNormalized], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[columnNormalized] ) ) { this._hasValidationError = true; diff --git a/src/ts/models/Config.ts b/src/ts/models/Config.ts index 4d221fb8..5ed93933 100644 --- a/src/ts/models/Config.ts +++ b/src/ts/models/Config.ts @@ -1,4 +1,6 @@ import { JsonUtils } from '../utils/JsonUtils'; +import { DependencyConfig } from './DependencyConfig'; +import { StringUtils } from '../utils/StringUtils'; export class Config { private _separator: string; @@ -10,6 +12,7 @@ export class Config { private _analyticsToolName: string; private _medias: { [key: string]: any }; private _validationRules: { [key: string]: string[] }; + private _dependenciesConfig: DependencyConfig[]; constructor(jsonConfig: { [key: string]: any }) { const jsonConfigTemp = { ...jsonConfig }; @@ -19,6 +22,10 @@ export class Config { this._csvSeparator = jsonConfigTemp.csvSeparator; delete jsonConfigTemp.csvSeparator; } + this._dependenciesConfig = this._buildDependenciesConfig( + jsonConfigTemp.dependenciesConfig + ); + delete jsonConfigTemp.dependenciesConfig; this._spaceSeparator = jsonConfigTemp.spaceSeparator; delete jsonConfigTemp.spaceSeparator; this._insertTime = jsonConfigTemp.insertTime; @@ -52,29 +59,28 @@ export class Config { ); } + private _buildDependenciesConfig( + dependenciesConfig: { + columnReference: string; + valuesReference: string[]; + hasMatch: boolean; + columnDestiny: string; + matches: string[]; + }[] + ): DependencyConfig[] { + if (!dependenciesConfig) { + return []; + } + return dependenciesConfig.map( + (dependencyConfig) => new DependencyConfig(dependencyConfig) + ); + } + /** * Transforma o objeto Config numa string */ public toString(): string { - let jsonConfig: { [key: string]: any } = {}; - Object.keys(this).forEach((key: string, index: number) => { - if (key === '_analyticsTool' || key === '_medias') { - jsonConfig = JsonUtils.addParametersAt( - jsonConfig, - Object.values(this)[index] || {} - ); - } else if (key === '_validationRules') { - jsonConfig = JsonUtils.addParametersAt(jsonConfig, { - columns: this._validationRules, - }); - } else if ( - key !== '_analyticsToolName' && - Object.values(this)[index] - ) { - jsonConfig[key.replace('_', '')] = Object.values(this)[index]; - } - }); - return JSON.stringify(jsonConfig); + return JSON.stringify(this.toJson()); } /** @@ -92,6 +98,16 @@ export class Config { jsonConfig = JsonUtils.addParametersAt(jsonConfig, { columns: this._validationRules, }); + } else if (key === '_dependenciesConfig') { + if (this._dependenciesConfig.length > 0) { + jsonConfig[ + 'dependenciesConfig' + ] = this._dependenciesConfig.map( + (dependencyConfig: DependencyConfig) => { + return dependencyConfig.toJson(); + } + ); + } } else if ( key !== '_analyticsToolName' && Object.values(this)[index] @@ -117,13 +133,99 @@ export class Config { } /** - * Verifica se existe alguam regra de validação cadastrada para a coluna especificada do csv + * Verifica se existe alguma regra de validação cadastrada para a coluna especificada do csv * @param csvColumn coluna do CSV a ser conferida */ - public existsValidationRuleFor(csvColumn: string): boolean { + private _existsValidationRuleFor(csvColumn: string): boolean { return this.validationRules[csvColumn].length > 0; } + /** + * Valida se a coluna do CSV foi preenchida corretamente + * @param csvColumn Coluna do CSV a ser validada + * @param value Valor da coluna + */ + private _validateRulesFor(csvColumn: string, value: string): boolean { + if (!this._existsValidationRuleFor(csvColumn)) { + return true; + } + return StringUtils.validateString( + value, + this._validationRules[csvColumn] + ); + } + + /** + * Pega a regra de dependência para a coluna do CSV + * @param csvColumn Coluan do csv de referência + */ + private _getDependencyConfigFor(csvColumn: string): DependencyConfig { + let dependencyColumnConfig: DependencyConfig; + this._dependenciesConfig.forEach((dependencyConfig) => { + if (dependencyConfig.columnDestiny === csvColumn) { + dependencyColumnConfig = dependencyConfig; + } + }); + return dependencyColumnConfig; + } + + /** + * Valida as regras de dependência para a coluna especificada + * @param csvLine Linha do CSV + * @param csvColumn Coluna do CSV a ser validada + * @param value Valor da coluna + */ + private _validateDependencyRulesFor( + csvLine: { [key: string]: string }, + csvColumn: string, + value: string + ): boolean { + const dependencyConfigForCsvColumn = this._getDependencyConfigFor( + csvColumn + ); + if ( + !dependencyConfigForCsvColumn || + !StringUtils.validateString( + csvLine[ + StringUtils.normalize( + dependencyConfigForCsvColumn.columnReference + ) + ], + dependencyConfigForCsvColumn.valuesReference + ) + ) { + return true; + } + if (dependencyConfigForCsvColumn.hasMatch) { + return StringUtils.validateString( + value, + dependencyConfigForCsvColumn.matches + ); + } else { + return !StringUtils.validateString( + value, + dependencyConfigForCsvColumn.matches + ); + } + } + + /** + * Valida se o campo está de acordo com as regras de validação e de dependência + * @param csvLine Linha do CSV + * @param csvColumn Coluna do CSV de referência + * @param value Valor da coluna + */ + public validateField( + csvLine: { [key: string]: string }, + csvColumn: string, + value: string + ): boolean { + return ( + this._validateRulesFor(csvColumn, value) && + this._validateDependencyRulesFor(csvLine, csvColumn, value) + ); + } + /** * Verifica se a coluna informada existe no atributo columns da configuração * @param csvColumn diff --git a/src/ts/models/DependencyConfig.ts b/src/ts/models/DependencyConfig.ts new file mode 100644 index 00000000..07ff717b --- /dev/null +++ b/src/ts/models/DependencyConfig.ts @@ -0,0 +1,67 @@ +export class DependencyConfig { + private _columnReference: string; + private _valuesReference: string[]; + private _hasMatch: boolean; + private _columnDestiny: string; + private _matches: string[]; + + constructor(dependencyConfig: { + columnReference: string; + valuesReference: string[]; + hasMatch: boolean; + columnDestiny: string; + matches: string[]; + }) { + const { + columnReference, + hasMatch, + matches, + valuesReference, + columnDestiny, + } = dependencyConfig; + this._columnReference = columnReference; + this._hasMatch = hasMatch; + this._matches = matches; + this._valuesReference = valuesReference; + this._columnDestiny = columnDestiny; + } + + /** + * Transforma a configuração em um objeto JSON + */ + public toJson(): { + columnReference: string; + valuesReference: string[]; + hasMatch: boolean; + columnDestiny: string; + matches: string[]; + } { + return { + columnReference: this._columnReference, + valuesReference: this._valuesReference, + hasMatch: this._hasMatch, + columnDestiny: this._columnDestiny, + matches: this._matches, + }; + } + + get columnDestiny(): string { + return this._columnDestiny; + } + + get matches(): string[] { + return this._matches; + } + + get hasMatch(): boolean { + return this._hasMatch; + } + + get columnReference(): string { + return this._columnReference; + } + + get valuesReference(): string[] { + return this._valuesReference; + } +} diff --git a/src/ts/models/FacebookAds.ts b/src/ts/models/FacebookAds.ts index 7185ccc3..bdc56410 100644 --- a/src/ts/models/FacebookAds.ts +++ b/src/ts/models/FacebookAds.ts @@ -97,11 +97,10 @@ export class FacebookAds extends Vehicle { column ); if ( - this.config.validationRules[column].length > - 0 && - !StringUtils.validateString( - this.csvLine[normalizedColumn], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[normalizedColumn] ) ) { this._hasValidationError = true; diff --git a/src/ts/models/GA.ts b/src/ts/models/GA.ts index 838958aa..c32ab9a5 100644 --- a/src/ts/models/GA.ts +++ b/src/ts/models/GA.ts @@ -123,10 +123,10 @@ export class GA extends AnalyticsTool { return; } if ( - this.config.validationRules[column].length > 0 && - !StringUtils.validateString( - this.csvLine[columnNormalized], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[columnNormalized] ) ) { this._hasValidationError[utm] = true; diff --git a/src/ts/models/GeneralVehicle.ts b/src/ts/models/GeneralVehicle.ts index 0eda5fcf..323f3595 100644 --- a/src/ts/models/GeneralVehicle.ts +++ b/src/ts/models/GeneralVehicle.ts @@ -52,10 +52,10 @@ export class GeneralVehicle extends Vehicle { } else { const normalizedColumn = StringUtils.normalize(csvColumn); if ( - this.config.existsValidationRuleFor(csvColumn) && - !StringUtils.validateString( - this.csvLine[normalizedColumn], - this.config.validationRules[csvColumn] + !this.config.validateField( + this.csvLine, + csvColumn, + this.csvLine[normalizedColumn] ) ) { this._validationErrorFounded(param, csvColumn); diff --git a/src/ts/models/GoogleAds.ts b/src/ts/models/GoogleAds.ts index b283060f..e4eb3d57 100644 --- a/src/ts/models/GoogleAds.ts +++ b/src/ts/models/GoogleAds.ts @@ -87,10 +87,10 @@ export class GoogleAds extends Vehicle { const normalizedColumn = StringUtils.normalize(column); //TODO testar caso a coluna não existir no csv if ( - this.config.validationRules[column].length > 0 && - !StringUtils.validateString( - this.csvLine[normalizedColumn], - this.config.validationRules[column] + !this.config.validateField( + this.csvLine, + column, + this.csvLine[normalizedColumn] ) ) { this._hasValidationError = true; diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index f44e6c99..70a45984 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -16,7 +16,7 @@ export class FirestoreConnectionSingleton extends ObjectStore { /* eslint-disable @typescript-eslint/no-var-requires */ const credentials = require('../../../../gcp_key.json'); /* eslint-enable @typescript-eslint/no-var-requires */ - this._db = new Firestore({ credentials }); + this._db = new Firestore({ projectId: 'adinfo', credentials }); } else { this._db = new Firestore(); } diff --git a/src/ts/models/cloud/StorageConnectionSingleton.ts b/src/ts/models/cloud/StorageConnectionSingleton.ts index fa2b594c..3fad91a5 100644 --- a/src/ts/models/cloud/StorageConnectionSingleton.ts +++ b/src/ts/models/cloud/StorageConnectionSingleton.ts @@ -13,7 +13,7 @@ export class StorageConnectionSingleton extends FileStore { /* eslint-disable @typescript-eslint/no-var-requires */ const credentials = require('../../../../gcp_key.json'); /* eslint-enable @typescript-eslint/no-var-requires */ - this._db = new Storage({ credentials }); + this._db = new Storage({ projectId: 'adinfo', credentials }); } else { this._db = new Storage(); } diff --git a/test/models/Adobe.spec.ts b/test/models/Adobe.spec.ts index 48864d33..145a69a6 100644 --- a/test/models/Adobe.spec.ts +++ b/test/models/Adobe.spec.ts @@ -90,4 +90,80 @@ describe('Adobe', () => { ); }); }); + describe('Valida a geração da linha do Adobe com configuração de dependência', () => { + it('Validação caso todos os parâmetros sejam informados corretamente', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Bandeira: [], + Veículo: [], + }, + adobe: { + cid: ['Tipo de Compra', 'Bandeira', 'Veículo'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dipositivo', + matches: ['/desktop/'], + }, + ], + }); + const adobe = new Adobe(csvLine, config); + const abodeFields = { + cid: 'Parâmetros não encontrados: Bandeira - Veículo', + 'url adobe': 'Corrija os parâmetros para gerar a URL', + }; + expect(JSON.stringify(adobe.buildedLine())).to.equal( + JSON.stringify(abodeFields) + ); + }); + it('Validação caso os parâmetros não correspondam as configurações de dependência', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Bandeira: 'meu Produto', + Veículo: 'meuVeículo', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Bandeira: ['/meu\\ ?Produto/'], + Veículo: [], + }, + adobe: { + cid: ['Tipo de Compra', 'Bandeira', 'Veículo'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpa'], + hasMatch: true, + columnDestiny: 'Dipositivo', + matches: ['dispositivo'], + }, + ], + }); + const adobe = new Adobe(csvLine, config); + const abodeFields = { + cid: 'cpc:meu_produto:meuveiculo', + 'url adobe': 'www.teste.com.br?cid=cpc:meu_produto:meuveiculo', + }; + expect(JSON.stringify(adobe.buildedLine())).to.equal( + JSON.stringify(abodeFields) + ); + }); + }); }); diff --git a/test/models/Config.spec.ts b/test/models/Config.spec.ts index 47c1254a..2280c09f 100644 --- a/test/models/Config.spec.ts +++ b/test/models/Config.spec.ts @@ -7,6 +7,22 @@ describe('Config', () => { const jsonConfig = { csvSeparator: ',', separator: ':', + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], spaceSeparator: '+', adobe: { cid: [ @@ -64,6 +80,22 @@ describe('Config', () => { const jsonConfig = { csvSeparator: ',', separator: ':', + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], spaceSeparator: '+', adobe: { cid: [ @@ -119,6 +151,22 @@ describe('Config', () => { const jsonConfig = { csvSeparator: ',', separator: ':', + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], spaceSeparator: '+', columns: { Veículo: [ @@ -157,6 +205,22 @@ describe('Config', () => { csvSeparator: ',', separator: ':', spaceSeparator: '+', + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], adobe: { cid: [ 'Veículo', @@ -195,6 +259,22 @@ describe('Config', () => { const jsonConfig = { csvSeparator: ',', separator: ':', + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], spaceSeparator: '+', ga: { utm_source: ['Veículo', 'Inserção'], @@ -228,6 +308,22 @@ describe('Config', () => { const jsonConfig = { csvSeparator: ',', separator: ':', + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], spaceSeparator: '+', ga: { utm_source: ['Veículo', 'Inserção'], @@ -282,6 +378,22 @@ describe('Config', () => { utm_source: ['Veículo', 'Inserção'], utm_campaign: ['campanha', 'categoriaDoProduto'], }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], }; const config = new Config(jsonConfig); expect(config.toCsvTemplate()).to.equal( @@ -315,6 +427,22 @@ describe('Config', () => { utm_source: ['Veículo', 'Inserção'], utm_campaign: ['campanha', 'categoriaDoProduto'], }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], }; const config = new Config(jsonConfig); expect(JSON.stringify(config.validationRules)).to.equal( diff --git a/test/models/FacebookAds.spec.ts b/test/models/FacebookAds.spec.ts index dac79edb..4e37d3f9 100644 --- a/test/models/FacebookAds.spec.ts +++ b/test/models/FacebookAds.spec.ts @@ -103,4 +103,104 @@ describe('FacebookAds', () => { ); }); }); + describe('Valida a geração da linha do FacebookAds para GA com dependência de campos', () => { + it('Validar a geração de uma linha para o GA com valores dinâmicos e sem parametros compostos > Todos os parâmetros informados corretamente', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fifinha', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['/.*/'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + facebookads: { + 'ad.name': ['Tipo de Compra', 'Dispositivo'], + 'campaign.name': ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: false, + columnDestiny: 'Dipositivo', + matches: ['/.*fifa.*/'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['/fifinha/'], + }, + ], + }); + const facebookAds = new FacebookAds(csvLine, config); + const facebookAdsFields = { + 'ad name': 'cpc:desktop_e_mobile', + 'campaign name': 'fifinha', + }; + expect(JSON.stringify(facebookAds.buildedLine())).to.equal( + JSON.stringify(facebookAdsFields) + ); + }); + it('Validar a geração de uma linha para o GA com valores dinâmicos e sem parametros compostos', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fif', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['fif'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + facebookads: { + 'ad.name': ['Tipo de Compra', 'Dispositivo'], + 'campaign.name': ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: false, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['/.*/'], + }, + ], + }); + const facebookAds = new FacebookAds(csvLine, config); + const facebookAdsFields = { + 'ad name': 'cpc:desktop_e_mobile', + 'campaign name': 'Parâmetros incorretos: Produto', + }; + expect(JSON.stringify(facebookAds.buildedLine())).to.equal( + JSON.stringify(facebookAdsFields) + ); + }); + }); }); diff --git a/test/models/GA.spec.ts b/test/models/GA.spec.ts index e7b08e75..8d7b572b 100644 --- a/test/models/GA.spec.ts +++ b/test/models/GA.spec.ts @@ -1,6 +1,7 @@ import { expect } from 'chai'; import { GA } from '../../src/ts/models/GA'; import { Config } from '../../src/ts/models/Config'; +import { DependencyConfig } from '../../src/ts/models/DependencyConfig'; describe('GA', () => { describe('Valida a geração da linha do GA', () => { @@ -104,4 +105,91 @@ describe('GA', () => { ); }); }); + describe('Valida a geração da linha do GA com configuração de dependência', () => { + it('Validação caso todos os parâmetros sejam informados corretamente', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Período: 'Maio 2020', + Bandeira: 'Minha Bandeira', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Período: ['/[a-zA-Z]* [0-9]{4}/'], + Bandeira: [], + }, + ga: { + utm_medium: ['Tipo de Compra'], + utm_campaign: ['Período', 'Bandeira'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpa'], + hasMatch: true, + columnDestiny: 'Bandeira', + matches: ['minhaBandeirinha'], + }, + ], + }); + const ga = new GA(csvLine, config); + const gaFields = { + utms: { + utm_medium: 'cpc', + utm_campaign: 'maio_2020:minha_bandeira', + }, + 'url ga': + 'www.teste.com.br?utm_medium=cpc&utm_campaign=maio_2020:minha_bandeira', + }; + expect(JSON.stringify(ga.buildedLine())).to.equal( + JSON.stringify(gaFields) + ); + }); + it('Validação caso os parâmetros não correspondam as configurações de dependência', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Período: 'Maio 2020', + Bandeira: 'Minha Bandeira', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Período: ['/[a-zA-Z]* [0-9]{4}/'], + Bandeira: [], + }, + ga: { + utm_medium: ['Tipo de Compra'], + utm_campaign: ['Período', 'Bandeira'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Bandeira', + matches: ['bandeira1', 'bandeira2'], + }, + ], + }); + const ga = new GA(csvLine, config); + const gaFields = { + utms: { + utm_medium: 'cpc', + utm_campaign: 'Parâmetros incorretos: Bandeira', + }, + 'url ga': 'Corrija os parâmetros para gerar a URL', + }; + expect(JSON.stringify(ga.buildedLine())).to.equal( + JSON.stringify(gaFields) + ); + }); + }); }); diff --git a/test/models/GeneralVehicle.spec.ts b/test/models/GeneralVehicle.spec.ts index a0f51430..211b932f 100644 --- a/test/models/GeneralVehicle.spec.ts +++ b/test/models/GeneralVehicle.spec.ts @@ -37,7 +37,7 @@ describe('Veículo Genérico', () => { JSON.stringify(criteoFields) ); }); - it('Validar a geração de uma linha para o GA com Parâmetros não encontrados', () => { + it('Validar a geração de uma linha para o GA com Parâmetros incorretos', () => { const csvLine = { Url: 'www.teste.com.br', 'Tipo de Compra': 'cpc', @@ -102,4 +102,97 @@ describe('Veículo Genérico', () => { ); }); }); + describe('Valida a geração da linha do GeneralVehicle para GA com dependência de campos', () => { + it('Validar a geração de uma linha para o GA com todos Parâmetros corretos', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fifinha', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['/.*/'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + criteo: { + campanha: ['Tipo de Compra', 'Dispositivo'], + ad: ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: false, + columnDestiny: 'Produto', + matches: ['fif'], + }, + ], + }); + const criteo = new GeneralVehicle(csvLine, config, 'criteo'); + let criteoFields = { + campanha: 'cpc:desktop_e_mobile', + ad: 'fifinha', + }; + expect(JSON.stringify(criteo.buildedLine())).to.equal( + JSON.stringify(criteoFields) + ); + }); + it('Validar a geração de uma linha para o GA com Parâmetros incorretos', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fifinha', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['fif'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + criteo: { + campanha: ['Tipo de Compra', 'Dispositivo'], + ad: ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc', 'cpa'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Tipo de Compra', + matches: ['cpc', 'cpa'], + }, + ], + }); + const criteo = new GeneralVehicle(csvLine, config, 'criteo'); + const criteoFields = { + campanha: 'cpc:desktop_e_mobile', + ad: 'Parâmetro(s) incorreto(s): Produto', + }; + expect(JSON.stringify(criteo.buildedLine())).to.equal( + JSON.stringify(criteoFields) + ); + }); + }); }); diff --git a/test/models/GoogleAds.spec.ts b/test/models/GoogleAds.spec.ts index 6176ac71..63c2f2aa 100644 --- a/test/models/GoogleAds.spec.ts +++ b/test/models/GoogleAds.spec.ts @@ -70,6 +70,57 @@ describe('GoogleAds', () => { JSON.stringify(googleAdsFields) ); }); + }); + describe('Valida a geração da linha do GoogleAds para GA com dependência de Configuração', () => { + it('Validar a geração de uma linha para o GA com todos Parâmetros corretos', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fifinha', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['/.*/'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + googleads: { + campanha: ['Tipo de Compra', 'Dispositivo'], + ad: ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dipositivo', + matches: ['/.*desktop.*/'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['/fifinha/'], + }, + ], + }); + const googleAds = new GoogleAds(csvLine, config); + let googleAdsFields = { + campanha: 'cpc:desktop_e_mobile', + ad: 'fifinha', + }; + expect(JSON.stringify(googleAds.buildedLine())).to.equal( + JSON.stringify(googleAdsFields) + ); + }); it('Validar a geração de uma linha para o GA com Parâmetros não encontrados', () => { const csvLine = { Url: 'www.teste.com.br', @@ -83,19 +134,37 @@ describe('GoogleAds', () => { columns: { 'Tipo de Compra': ['cpa', 'cpc'], Dispositivo: ['desktop e mobile'], + Produto: ['fif'], }, ga: { utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], }, googleads: { campanha: ['Tipo de Compra', 'Dispositivo'], ad: ['Produto'], }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dipositivo', + matches: ['/.*desktop.*/'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['/fifinha/'], + }, + ], }); const googleAds = new GoogleAds(csvLine, config); const googleAdsFields = { campanha: 'cpc:desktop_e_mobile', - ad: 'Parâmetro(s) não encontrado(s) na configuração: Produto', + ad: 'Parâmetro(s) incorreto(s): Produto', }; expect(JSON.stringify(googleAds.buildedLine())).to.equal( JSON.stringify(googleAdsFields) From a893eb422b46b42af75f01c44e354ddd2cfe19be Mon Sep 17 00:00:00 2001 From: Labanca Date: Tue, 9 Mar 2021 13:06:21 -0300 Subject: [PATCH 06/68] =?UTF-8?q?Removendo=20conflito=20da=20cria=C3=A7?= =?UTF-8?q?=C3=A3o=20da=20pasta=20congig=20di=20git=20e=20edi=C3=A7=C3=A3o?= =?UTF-8?q?=20do=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +---- README.md | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e3766fb5..bfef9035 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ node_modules/ .env .vscode/ -config/gcp_key.json -src/js/config/gcp_key.json -src/ts/config/gcp_key.json -gcp_key.json \ No newline at end of file +config/ \ No newline at end of file diff --git a/README.md b/README.md index c23486ff..93b66360 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,23 @@ # adinfo -Repositório do Adinfo DP6 +#Repositório do Adinfo DP6 + +##Configuração do ambiente de desenvolvimento + +1. Arquivo .env + +O arquivo .env deve estar localizado na raiz do projeto. + +2. Configurações do .env + +É necessário editar as seguintes variáveis + +- DEVELOPMENT: Deve apresentar o valor true, caso o ambiente atual seja o ambiente de desenvolvimento local. Caso nenhum valor seja informado, a API irá assumir como padrão o valor false, indicando o ambiente de produção; + +- PORT: Deve conter o número da porta onde a API será acessada. Em caso de omissão desse parâmetro, a porta considerada será 443. + +2. Chave de acesso - GCP + +A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json. + +3. checar se o arquivo gitignore está ignorando o versionamento da chave e do arquivo .env. From e7121114f2e3151047a3bb677e4368d08f9b63f9 Mon Sep 17 00:00:00 2001 From: Labanca Date: Tue, 9 Mar 2021 13:08:14 -0300 Subject: [PATCH 07/68] =?UTF-8?q?Edi=C3=A7=C3=A3o=20do=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93b66360..20d00840 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # adinfo -#Repositório do Adinfo DP6 +## Repositório do Adinfo DP6 -##Configuração do ambiente de desenvolvimento +### Configuração do ambiente de desenvolvimento 1. Arquivo .env From 2070fdd9fa8d1434d0155ea4aba7d5a75e4c6b2d Mon Sep 17 00:00:00 2001 From: Labanca Date: Tue, 9 Mar 2021 13:10:52 -0300 Subject: [PATCH 08/68] =?UTF-8?q?Edi=C3=A7=C3=A3o=20do=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 20d00840..e5dc9d9b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# adinfo - ## Repositório do Adinfo DP6 ### Configuração do ambiente de desenvolvimento @@ -7,9 +5,6 @@ 1. Arquivo .env O arquivo .env deve estar localizado na raiz do projeto. - -2. Configurações do .env - É necessário editar as seguintes variáveis - DEVELOPMENT: Deve apresentar o valor true, caso o ambiente atual seja o ambiente de desenvolvimento local. Caso nenhum valor seja informado, a API irá assumir como padrão o valor false, indicando o ambiente de produção; From d7048f153d66df1be13eecdc62ee3c40ba5db969 Mon Sep 17 00:00:00 2001 From: Labanca Date: Tue, 16 Mar 2021 09:29:13 -0300 Subject: [PATCH 09/68] =?UTF-8?q?fix:=20corre=C3=A7=C3=A3o=20arquivo=20.gi?= =?UTF-8?q?tignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bfef9035..a4091012 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ .env .vscode/ -config/ \ No newline at end of file +config/ +gcp_key.json \ No newline at end of file From e70a6fdec74e819b5b034cba4ec6fe5c313415c2 Mon Sep 17 00:00:00 2001 From: Labanca Date: Tue, 16 Mar 2021 09:35:46 -0300 Subject: [PATCH 10/68] =?UTF-8?q?fix:=20corre=C3=A7=C3=A3o=20arquivo=20REA?= =?UTF-8?q?DME.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e5dc9d9b..852e8194 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ 1. Arquivo .env -O arquivo .env deve estar localizado na raiz do projeto. -É necessário editar as seguintes variáveis + O arquivo .env deve estar localizado na raiz do projeto. + É necessário editar as seguintes variáveis - DEVELOPMENT: Deve apresentar o valor true, caso o ambiente atual seja o ambiente de desenvolvimento local. Caso nenhum valor seja informado, a API irá assumir como padrão o valor false, indicando o ambiente de produção; @@ -13,6 +13,6 @@ O arquivo .env deve estar localizado na raiz do projeto. 2. Chave de acesso - GCP -A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json. + A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json. -3. checar se o arquivo gitignore está ignorando o versionamento da chave e do arquivo .env. +3. Checar se o arquivo .gitignore está ignorando o versionamento da chave e do arquivo .env. From aaa761905d40eddd2f42c5109c5c527e6049a0b0 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Wed, 17 Mar 2021 13:22:27 -0300 Subject: [PATCH 11/68] fix: Duas configuracoes de dependencias para um mesmo campo Corrigido o problema onde, quando havia mais de uma configuracao de dependencia para um mesmo campo, a validacao era feita apenas para um deles. O model do GoogleAds precisou ser corrigido para gerar as mensagens de erro Foram escritos testes de duas dependencias para um unico campo para os models de: GoogleAds, Adobe, Facebook, GA --- src/js/models/Config.js | 59 +++++++++++--------- src/js/models/GoogleAds.js | 29 ++++++---- src/ts/models/Config.ts | 60 +++++++++++--------- src/ts/models/GoogleAds.ts | 30 ++++++---- test/models/Adobe.spec.ts | 97 +++++++++++++++++++++++++++++++- test/models/FacebookAds.spec.ts | 98 ++++++++++++++++++++++++++++++++ test/models/GA.spec.ts | 99 +++++++++++++++++++++++++++++++++ test/models/GoogleAds.spec.ts | 98 ++++++++++++++++++++++++++++++++ 8 files changed, 491 insertions(+), 79 deletions(-) diff --git a/src/js/models/Config.js b/src/js/models/Config.js index 65e42f2f..c08656a8 100644 --- a/src/js/models/Config.js +++ b/src/js/models/Config.js @@ -107,43 +107,48 @@ class Config { this._validationRules[csvColumn] ); } - _getDependencyConfigFor(csvColumn) { - let dependencyColumnConfig; + _getAllDependencyConfigFor(csvColumn) { + const dependenciesColumnConfig = []; this._dependenciesConfig.forEach((dependencyConfig) => { if (dependencyConfig.columnDestiny === csvColumn) { - dependencyColumnConfig = dependencyConfig; + dependenciesColumnConfig.push(dependencyConfig); } }); - return dependencyColumnConfig; + return dependenciesColumnConfig; } _validateDependencyRulesFor(csvLine, csvColumn, value) { - const dependencyConfigForCsvColumn = this._getDependencyConfigFor( + const dependenciesConfigForCsvColumn = this._getAllDependencyConfigFor( csvColumn ); - if ( - !dependencyConfigForCsvColumn || - !StringUtils_1.StringUtils.validateString( - csvLine[ - StringUtils_1.StringUtils.normalize( - dependencyConfigForCsvColumn.columnReference - ) - ], - dependencyConfigForCsvColumn.valuesReference - ) - ) { + if (dependenciesConfigForCsvColumn.length === 0) { return true; } - if (dependencyConfigForCsvColumn.hasMatch) { - return StringUtils_1.StringUtils.validateString( - value, - dependencyConfigForCsvColumn.matches - ); - } else { - return !StringUtils_1.StringUtils.validateString( - value, - dependencyConfigForCsvColumn.matches - ); - } + const dependenciesToValidate = dependenciesConfigForCsvColumn.filter( + (dependencyConfig) => + StringUtils_1.StringUtils.validateString( + csvLine[ + StringUtils_1.StringUtils.normalize( + dependencyConfig.columnReference + ) + ], + dependencyConfig.valuesReference + ) + ); + return ( + dependenciesToValidate.filter((dependencyConfig) => { + if (dependencyConfig.hasMatch) { + return StringUtils_1.StringUtils.validateString( + value, + dependencyConfig.matches + ); + } else { + return !StringUtils_1.StringUtils.validateString( + value, + dependencyConfig.matches + ); + } + }).length === dependenciesToValidate.length + ); } validateField(csvLine, csvColumn, value) { return ( diff --git a/src/js/models/GoogleAds.js b/src/js/models/GoogleAds.js index 5d59950c..e82ff5f7 100644 --- a/src/js/models/GoogleAds.js +++ b/src/js/models/GoogleAds.js @@ -7,13 +7,20 @@ class GoogleAds extends Vehicle_1.Vehicle { constructor(csvLine, config) { super(csvLine, config); this._adsParams = {}; - this._hasValidationError = false; - this._hasUndefinedParameterError = false; - this._validationErrorMessage = 'Parâmetro(s) incorreto(s): '; + this._hasValidationError = {}; + this._hasUndefinedParameterError = {}; + this._validationErrorMessage = {}; + this._undefinedParameterErrorMessage = {}; this._errorAdsParams = {}; - this._undefinedParameterErrorMessage = - 'Parâmetro(s) não encontrado(s) na configuração: '; this._undefinedParameterErrorFields = {}; + Object.keys(this.config.medias.googleads).map((adsParam) => { + this._hasValidationError[adsParam] = false; + this._hasUndefinedParameterError[adsParam] = false; + this._validationErrorMessage[adsParam] = + 'Parâmetro(s) incorreto(s): '; + this._undefinedParameterErrorMessage[adsParam] = + 'Parâmetro(s) não encontrado(s): '; + }); this._buildAdsParams(); } buildedLine() { @@ -27,7 +34,7 @@ class GoogleAds extends Vehicle_1.Vehicle { const fields = this.config.medias.googleads[googleAdsParam]; fields.forEach((column) => { if (!this.config.validationRules[column]) { - this._hasUndefinedParameterError = true; + this._hasUndefinedParameterError[googleAdsParam] = true; this._undefinedParameterErrorFields[googleAdsParam].push( column ); @@ -42,7 +49,7 @@ class GoogleAds extends Vehicle_1.Vehicle { this.csvLine[normalizedColumn] ) ) { - this._hasValidationError = true; + this._hasValidationError[googleAdsParam] = true; this._errorAdsParams[googleAdsParam].push(column); } else { this._adsParams[ @@ -54,13 +61,13 @@ class GoogleAds extends Vehicle_1.Vehicle { } } }); - if (this._hasValidationError) { + if (this._hasValidationError[googleAdsParam]) { this._adsParams[googleAdsParam] = - this._validationErrorMessage + + this._validationErrorMessage[googleAdsParam] + this._errorAdsParams[googleAdsParam].join(' - '); - } else if (this._hasUndefinedParameterError) { + } else if (this._hasUndefinedParameterError[googleAdsParam]) { this._adsParams[googleAdsParam] = - this._undefinedParameterErrorMessage + + this._undefinedParameterErrorMessage[googleAdsParam] + this._undefinedParameterErrorFields[googleAdsParam].join( ' - ' ); diff --git a/src/ts/models/Config.ts b/src/ts/models/Config.ts index 5ed93933..dfa21db1 100644 --- a/src/ts/models/Config.ts +++ b/src/ts/models/Config.ts @@ -159,14 +159,14 @@ export class Config { * Pega a regra de dependência para a coluna do CSV * @param csvColumn Coluan do csv de referência */ - private _getDependencyConfigFor(csvColumn: string): DependencyConfig { - let dependencyColumnConfig: DependencyConfig; + private _getAllDependencyConfigFor(csvColumn: string): DependencyConfig[] { + const dependenciesColumnConfig: DependencyConfig[] = []; this._dependenciesConfig.forEach((dependencyConfig) => { if (dependencyConfig.columnDestiny === csvColumn) { - dependencyColumnConfig = dependencyConfig; + dependenciesColumnConfig.push(dependencyConfig); } }); - return dependencyColumnConfig; + return dependenciesColumnConfig; } /** @@ -180,33 +180,39 @@ export class Config { csvColumn: string, value: string ): boolean { - const dependencyConfigForCsvColumn = this._getDependencyConfigFor( + const dependenciesConfigForCsvColumn = this._getAllDependencyConfigFor( csvColumn ); - if ( - !dependencyConfigForCsvColumn || - !StringUtils.validateString( - csvLine[ - StringUtils.normalize( - dependencyConfigForCsvColumn.columnReference - ) - ], - dependencyConfigForCsvColumn.valuesReference - ) - ) { + + if (dependenciesConfigForCsvColumn.length === 0) { return true; } - if (dependencyConfigForCsvColumn.hasMatch) { - return StringUtils.validateString( - value, - dependencyConfigForCsvColumn.matches - ); - } else { - return !StringUtils.validateString( - value, - dependencyConfigForCsvColumn.matches - ); - } + + const dependenciesToValidate = dependenciesConfigForCsvColumn.filter( + (dependencyConfig) => + StringUtils.validateString( + csvLine[ + StringUtils.normalize(dependencyConfig.columnReference) + ], + dependencyConfig.valuesReference + ) + ); + + return ( + dependenciesToValidate.filter((dependencyConfig) => { + if (dependencyConfig.hasMatch) { + return StringUtils.validateString( + value, + dependencyConfig.matches + ); + } else { + return !StringUtils.validateString( + value, + dependencyConfig.matches + ); + } + }).length === dependenciesToValidate.length + ); } /** diff --git a/src/ts/models/GoogleAds.ts b/src/ts/models/GoogleAds.ts index e4eb3d57..cedbb960 100644 --- a/src/ts/models/GoogleAds.ts +++ b/src/ts/models/GoogleAds.ts @@ -31,12 +31,11 @@ import { Vehicle } from './Vehicle'; export class GoogleAds extends Vehicle { private _adsParams: { [key: string]: string } = {}; - private _hasValidationError = false; - private _hasUndefinedParameterError = false; - private _validationErrorMessage = 'Parâmetro(s) incorreto(s): '; + private _hasValidationError: { [key: string]: boolean } = {}; + private _hasUndefinedParameterError: { [key: string]: boolean } = {}; + private _validationErrorMessage: { [key: string]: string } = {}; + private _undefinedParameterErrorMessage: { [key: string]: string } = {}; private _errorAdsParams: { [key: string]: string[] } = {}; - private _undefinedParameterErrorMessage = - 'Parâmetro(s) não encontrado(s) na configuração: '; private _undefinedParameterErrorFields: { [key: string]: string[] } = {}; /** @@ -48,7 +47,14 @@ export class GoogleAds extends Vehicle { */ constructor(csvLine: { [key: string]: string }, config: Config) { super(csvLine, config); - // this.url = this._buildUrl(); + Object.keys(this.config.medias.googleads).map((adsParam) => { + this._hasValidationError[adsParam] = false; + this._hasUndefinedParameterError[adsParam] = false; + this._validationErrorMessage[adsParam] = + 'Parâmetro(s) incorreto(s): '; + this._undefinedParameterErrorMessage[adsParam] = + 'Parâmetro(s) não encontrado(s): '; + }); this._buildAdsParams(); } @@ -79,7 +85,7 @@ export class GoogleAds extends Vehicle { ]; fields.forEach((column: string) => { if (!this.config.validationRules[column]) { - this._hasUndefinedParameterError = true; + this._hasUndefinedParameterError[googleAdsParam] = true; this._undefinedParameterErrorFields[googleAdsParam].push( column ); @@ -93,7 +99,7 @@ export class GoogleAds extends Vehicle { this.csvLine[normalizedColumn] ) ) { - this._hasValidationError = true; + this._hasValidationError[googleAdsParam] = true; this._errorAdsParams[googleAdsParam].push(column); } else { this._adsParams[ @@ -105,13 +111,13 @@ export class GoogleAds extends Vehicle { } } }); - if (this._hasValidationError) { + if (this._hasValidationError[googleAdsParam]) { this._adsParams[googleAdsParam] = - this._validationErrorMessage + + this._validationErrorMessage[googleAdsParam] + this._errorAdsParams[googleAdsParam].join(' - '); - } else if (this._hasUndefinedParameterError) { + } else if (this._hasUndefinedParameterError[googleAdsParam]) { this._adsParams[googleAdsParam] = - this._undefinedParameterErrorMessage + + this._undefinedParameterErrorMessage[googleAdsParam] + this._undefinedParameterErrorFields[googleAdsParam].join( ' - ' ); diff --git a/test/models/Adobe.spec.ts b/test/models/Adobe.spec.ts index 145a69a6..e6aff678 100644 --- a/test/models/Adobe.spec.ts +++ b/test/models/Adobe.spec.ts @@ -96,6 +96,45 @@ describe('Adobe', () => { Url: 'www.teste.com.br', 'Tipo de Compra': 'cpc', Dispositivo: 'desktop e mobile', + Veículo: 'facebook', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: [], + Veículo: [], + }, + adobe: { + cid: ['Tipo de Compra', 'Dispositivo', 'Veículo'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dipositivo', + matches: ['/desktop/'], + }, + ], + }); + const adobe = new Adobe(csvLine, config); + const abodeFields = { + cid: 'cpc:desktop_e_mobile:facebook', + 'url adobe': + 'www.teste.com.br?cid=cpc:desktop_e_mobile:facebook', + }; + expect(JSON.stringify(adobe.buildedLine())).to.equal( + JSON.stringify(abodeFields) + ); + }); + it('Validação caso todos os parâmetros sejam informados corretamente com duas dependências para o mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Veículo: 'facebook', }; const config = new Config({ separator: ':', @@ -103,10 +142,11 @@ describe('Adobe', () => { columns: { 'Tipo de Compra': ['cpa', 'cpc'], Bandeira: [], + Dispositivo: [], Veículo: [], }, adobe: { - cid: ['Tipo de Compra', 'Bandeira', 'Veículo'], + cid: ['Tipo de Compra', 'Dispositivo', 'Veículo'], }, dependenciesConfig: [ { @@ -116,11 +156,64 @@ describe('Adobe', () => { columnDestiny: 'Dipositivo', matches: ['/desktop/'], }, + { + columnReference: 'Veículo', + valuesReference: ['/face/'], + hasMatch: false, + columnDestiny: 'Dispositivo', + matches: ['google'], + }, ], }); const adobe = new Adobe(csvLine, config); const abodeFields = { - cid: 'Parâmetros não encontrados: Bandeira - Veículo', + cid: 'cpc:desktop_e_mobile:facebook', + 'url adobe': + 'www.teste.com.br?cid=cpc:desktop_e_mobile:facebook', + }; + expect(JSON.stringify(adobe.buildedLine())).to.equal( + JSON.stringify(abodeFields) + ); + }); + it('Validação com duas dependências para o mesmo campo e um erro em uma delas', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Veículo: 'facebook', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Bandeira: [], + Dispositivo: [], + Veículo: [], + }, + adobe: { + cid: ['Tipo de Compra', 'Dispositivo', 'Veículo'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dipositivo', + matches: ['/desktop/'], + }, + { + columnReference: 'Veículo', + valuesReference: ['/face/'], + hasMatch: false, + columnDestiny: 'Dispositivo', + matches: ['/mobile/'], + }, + ], + }); + const adobe = new Adobe(csvLine, config); + const abodeFields = { + cid: 'Parâmetros incorretos: Dispositivo', 'url adobe': 'Corrija os parâmetros para gerar a URL', }; expect(JSON.stringify(adobe.buildedLine())).to.equal( diff --git a/test/models/FacebookAds.spec.ts b/test/models/FacebookAds.spec.ts index 4e37d3f9..030352d3 100644 --- a/test/models/FacebookAds.spec.ts +++ b/test/models/FacebookAds.spec.ts @@ -202,5 +202,103 @@ describe('FacebookAds', () => { JSON.stringify(facebookAdsFields) ); }); + it('Validar a geração de uma linha para o GA com valores dinâmicos e sem parametros compostos com duas dependências para o mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fif', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['fif'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + facebookads: { + 'ad.name': ['Tipo de Compra', 'Dispositivo'], + 'campaign.name': ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: false, + columnDestiny: 'Produto', + matches: ['fifinha'], + }, + ], + }); + const facebookAds = new FacebookAds(csvLine, config); + const facebookAdsFields = { + 'ad name': 'cpc:desktop_e_mobile', + 'campaign name': 'fif', + }; + expect(JSON.stringify(facebookAds.buildedLine())).to.equal( + JSON.stringify(facebookAdsFields) + ); + }); + it('Validar a geração de uma linha para o GA com valores dinâmicos e sem parametros compostos com erro em uma das dependências para o mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop e mobile', + Produto: 'fif', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop e mobile'], + Produto: ['fif'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + facebookads: { + 'ad.name': ['Tipo de Compra', 'Dispositivo'], + 'campaign.name': ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: false, + columnDestiny: 'Produto', + matches: ['fif'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*mobile.*/'], + hasMatch: false, + columnDestiny: 'Produto', + matches: ['fifinha'], + }, + ], + }); + const facebookAds = new FacebookAds(csvLine, config); + const facebookAdsFields = { + 'ad name': 'cpc:desktop_e_mobile', + 'campaign name': 'Parâmetros incorretos: Produto', + }; + expect(JSON.stringify(facebookAds.buildedLine())).to.equal( + JSON.stringify(facebookAdsFields) + ); + }); }); }); diff --git a/test/models/GA.spec.ts b/test/models/GA.spec.ts index 8d7b572b..ff45b2b0 100644 --- a/test/models/GA.spec.ts +++ b/test/models/GA.spec.ts @@ -149,6 +149,105 @@ describe('GA', () => { JSON.stringify(gaFields) ); }); + it('Validação caso todos os parâmetros sejam informados corretamente com duas dependências para o mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpa', + Dispositivo: 'desktop e mobile', + Período: 'Maio 2020', + Bandeira: 'Minha_Bandeira', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Período: ['/[a-zA-Z]* [0-9]{4}/'], + Bandeira: [], + }, + ga: { + utm_medium: ['Tipo de Compra'], + utm_campaign: ['Período', 'Bandeira'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpa'], + hasMatch: true, + columnDestiny: 'Bandeira', + matches: ['/Minha/'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*desktop.*/'], + hasMatch: true, + columnDestiny: 'Bandeira', + matches: ['/Bandeira/'], + }, + ], + }); + const ga = new GA(csvLine, config); + const gaFields = { + utms: { + utm_medium: 'cpa', + utm_campaign: 'maio_2020:minha_bandeira', + }, + 'url ga': + 'www.teste.com.br?utm_medium=cpa&utm_campaign=maio_2020:minha_bandeira', + }; + expect(JSON.stringify(ga.buildedLine())).to.equal( + JSON.stringify(gaFields) + ); + }); + it('Validação com erro na validação de uma das dependências para um mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpa', + Dispositivo: 'desktop e mobile', + Período: 'Maio 2020', + Bandeira: 'Bandeira', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Período: ['/[a-zA-Z]* [0-9]{4}/'], + Bandeira: [], + }, + ga: { + utm_medium: ['Tipo de Compra'], + utm_campaign: ['Período', 'Bandeira'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpa'], + hasMatch: true, + columnDestiny: 'Bandeira', + matches: ['/Minha/'], + }, + { + columnReference: 'Dispositivo', + valuesReference: ['/.*desktop.*/'], + hasMatch: true, + columnDestiny: 'Bandeira', + matches: ['/Bandeira/'], + }, + ], + }); + const ga = new GA(csvLine, config); + const gaFields = { + utms: { + utm_medium: 'cpa', + utm_campaign: 'Parâmetros incorretos: Bandeira', + }, + 'url ga': 'Corrija os parâmetros para gerar a URL', + }; + expect(JSON.stringify(ga.buildedLine())).to.equal( + JSON.stringify(gaFields) + ); + }); it('Validação caso os parâmetros não correspondam as configurações de dependência', () => { const csvLine = { Url: 'www.teste.com.br', diff --git a/test/models/GoogleAds.spec.ts b/test/models/GoogleAds.spec.ts index 63c2f2aa..a4fd3beb 100644 --- a/test/models/GoogleAds.spec.ts +++ b/test/models/GoogleAds.spec.ts @@ -121,6 +121,104 @@ describe('GoogleAds', () => { JSON.stringify(googleAdsFields) ); }); + it('Validar a geração de uma linha para o GA com todos Parâmetros corretos e duas dependências para o mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop', + Produto: 'fifinha', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop'], + Produto: ['/.*/'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + googleads: { + campanha: ['Tipo de Compra', 'Dispositivo'], + ad: ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dispositivo', + matches: ['/.*desktop.*/'], + }, + { + columnReference: 'Produto', + valuesReference: ['/.*fifinha.*/'], + hasMatch: false, + columnDestiny: 'Dispositivo', + matches: ['/mobile/'], + }, + ], + }); + const googleAds = new GoogleAds(csvLine, config); + let googleAdsFields = { + campanha: 'cpc:desktop', + ad: 'fifinha', + }; + expect(JSON.stringify(googleAds.buildedLine())).to.equal( + JSON.stringify(googleAdsFields) + ); + }); + it('Validar a geração de uma linha para o GA com erro em uma das dependências para o mesmo campo', () => { + const csvLine = { + Url: 'www.teste.com.br', + 'Tipo de Compra': 'cpc', + Dispositivo: 'desktop', + Produto: 'fifinha', + }; + const config = new Config({ + separator: ':', + spaceSeparator: '_', + columns: { + 'Tipo de Compra': ['cpa', 'cpc'], + Dispositivo: ['desktop'], + Produto: ['/.*/'], + }, + ga: { + utm_source: ['Tipo de Compra', 'Dispositivo'], + utm_campaign: ['Produto'], + }, + googleads: { + campanha: ['Tipo de Compra', 'Dispositivo'], + ad: ['Produto'], + }, + dependenciesConfig: [ + { + columnReference: 'Tipo de Compra', + valuesReference: ['cpc'], + hasMatch: true, + columnDestiny: 'Dispositivo', + matches: ['/.*desktop.*/'], + }, + { + columnReference: 'Produto', + valuesReference: ['/fifinha/'], + hasMatch: true, + columnDestiny: 'Dispositivo', + matches: ['/mobile/'], + }, + ], + }); + const googleAds = new GoogleAds(csvLine, config); + let googleAdsFields = { + campanha: 'Parâmetro(s) incorreto(s): Dispositivo', + ad: 'fifinha', + }; + expect(JSON.stringify(googleAds.buildedLine())).to.equal( + JSON.stringify(googleAdsFields) + ); + }); it('Validar a geração de uma linha para o GA com Parâmetros não encontrados', () => { const csvLine = { Url: 'www.teste.com.br', From 277e688e73742a659c54d15a22a26b5195f351ae Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Mon, 19 Apr 2021 13:50:51 -0300 Subject: [PATCH 12/68] build: :hammer: Criacao do Dockerfile Criacao do arquivo Dockerfile para build da aplicacao em Docker --- Dockerfile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..02bf18cf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node +MAINTAINER Lucas Tonetto Firmo @ DP6 +ENV PORT=3000 +COPY . /var/www/adinfo +WORKDIR /var/www/adinfo +RUN npm install +RUN npm test +ENTRYPOINT npm start +EXPOSE $PORT \ No newline at end of file From 7c87165ac832ccc506c306c36be8c0cdbb665b4c Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Tue, 20 Apr 2021 19:05:13 -0300 Subject: [PATCH 13/68] fix: :bug: Ajusta na funcao de adicionar uma nova configuracao MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Buscar pelo atributo version para identificar se há alguma versao no firestore --- src/js/models/DAO/ConfigDAO.js | 2 +- src/ts/models/DAO/ConfigDAO.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/models/DAO/ConfigDAO.js b/src/js/models/DAO/ConfigDAO.js index a0f70e45..9777c82a 100644 --- a/src/js/models/DAO/ConfigDAO.js +++ b/src/js/models/DAO/ConfigDAO.js @@ -30,7 +30,7 @@ class ConfigDAO { return new Promise((resolve, reject) => { this.getLastConfig() .then((lastConfig) => { - if (!lastConfig) { + if (!lastConfig.version) { config.version = 1; } else { config.version = lastConfig.version + 1; diff --git a/src/ts/models/DAO/ConfigDAO.ts b/src/ts/models/DAO/ConfigDAO.ts index 6828fe7d..b835df1a 100644 --- a/src/ts/models/DAO/ConfigDAO.ts +++ b/src/ts/models/DAO/ConfigDAO.ts @@ -46,7 +46,7 @@ export class ConfigDAO { return new Promise((resolve, reject) => { this.getLastConfig() .then((lastConfig: Config) => { - if (!lastConfig) { + if (!lastConfig.version) { config.version = 1; } else { config.version = lastConfig.version + 1; From e2c96d7fece0245e731b61c566460dd44f1e205d Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Mon, 26 Apr 2021 16:19:09 -0300 Subject: [PATCH 14/68] docs: :memo: update readme Insercao do readme de acordo com o padrao DP6 --- README.md | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 116 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 852e8194..a83e7478 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,126 @@ -## Repositório do Adinfo DP6 +# Penguin Adinfo -### Configuração do ambiente de desenvolvimento +
+ +
-1. Arquivo .env +O Penguin Adinfo é um recurso que tem como objetivo o **controle** e **padronização** do uso de parametrização e nomenclatura de mídia digital. - O arquivo .env deve estar localizado na raiz do projeto. - É necessário editar as seguintes variáveis +A solução proposta é uma **API** open source que através de rotas de requisição trabalha *inputs* de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma **validação** dos campos preenchidos e de status de requisição dos links. + +Os principais componentes no uso da aplicação são a **configuração**, um JSON contendo quais campos são aceitos na taxonomia de mídia, o **permissionamento** para controle de ações permitidas por nível de acesso, e o **arquivo de parametrização**, um CSV contendo a lista de URLs e os campos preenchidos conforme o que foi configurado. + +## Principais propostas de valor + +- Independência de qualquer programa para a abertura das planilhas durante o processo de parametrização, o que comumente compromete a performance pelo uso extensivo de fórmulas. +- Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de **acessos**, edição de **configurações**, realização da **parametrização**. +- Os acessos podem ser divididos em grupos ou projetos, para que por exemplo diferentes agências possam todas ter seu nível de configuração, mas apenas para suas próprias campanhas. +- Escalabilidade de uso por suportar grandes tamanhos de arquivo e histórico. + +## NPM Run + +- **start**: executa a aplicação; +- **unit-test**: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/; +- **test**: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/; +- **lint**: Submete o código a uma avaliação do [ESLint](https://eslint.org/); +- **lint-fix**: Submete o código a uma avaliação do [ESLint](https://eslint.org/) e aplica correções automaticamente ao código; +- **compile**: Exclui os arquivos da pasta /src/js e compila o código do typescript para javascript, guardando-o na pasta src/js; +- **auto-compile**: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta src/js, sem excluir o conteúdo anterior; +- **prettier**: Formata todo o código das pastas src/ e test/, utilizando o [Prettier](https://prettier.io/), de acordo com a configuração descrita no arquivo .prettierrc; +- **build**: Executa o compile do código typescript para javascript. + +## Requisitos para utilização + +- Ambiente de hospedagem de aplicações, em nuvem ou on-premise; +- Banco de dados para armazenamento de arquivos no formato csv; +- Banco de dados NoSQL para armazenamento de objetos JSON. + +### Produtos do GCP (sugestão) + +O adinfo pode ser implementado em diferentes provedores de nuvem ou em ambientes on-premise. Listaremos aqui sugestões de serviços do GCP que podem ser utilizados para complementar a infraestrutura da API. + +- App Engine +- Cloud Storage +- Firestore + +## Instalação + +Clone o projeto do github para sua máquina local ou Cloud Shell + +```console +git clone https://github.com/DP6/penguin-adinfo.git +``` + +### Instalação GCP (sugerida) + +Durante toda a etapa de desenvolvimento do adinfo ele é hospedado no serviço de App Engine do GCP, além de armazenar informações no Firestore e Storage. + +#### Configuração do Firestore e Storage + +Por padrão, ao utilizar o adinfo dentro do App Engine, basta conceder acesso à conta de serviço para o Storage e Firestore para que todos os recursos funcionem corretamente. Caso o adinfo esteja hospedado fora do GCP ou em outro projeto, é necessário informar a chave de autenticação na inicialização das classes, dentro nos arquivos **FirestoreConnectionSingleton** e **StorageConnectionSingleton**. + +##### Configuração inicial do Storage + +Crie um bucket para armazenar os arquivos do adinfo. O bucket em questão deve ser informado no atributo _bucket da classe **StorageConnectionSingleton**, por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência. + +##### Configuração inicial do Firestore + +Para a configuração inicial do Firestore, são necessárias duas coleções. + +- **companies**: essa coleção deve ser criada na raiz do firestore e deve conter um documento com o nome da empresa. Dentro desse documento, uma segunda coleção deve ser criada com o nome *config*. Seguindo a estrutura: companies > [nome_empresa] > config; + +- **tokens**: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura: + + ``` + { + company: "arthurltda" (string) + permission: "owner"(string) + } + ``` + + Para esse documento, é importante manter o Código do Documento gerado automaticamente pelo google. O código gerado para cada documento será o token de acesso utilizado na API. + +### Banco de dados alternativos + +Atualmente o adinfo não disponibiliza por padrão um código de acesso à banco de dados diferentes do Storage e Firestore. Para conexões com outros ambientes a criação dos scripts se faz necessária. + +### Criação dos novos scripts + +Caso o usuário opte por utilizar um banco de arquivos diferentes do Storage, é necessário que o script da nova classe herde de **FileStore**. + +No caso de substituir o uso do Firestore para armazenamento de chaves. A nova classe deve herdar de **ObjectStore**. + +## Configuração do ambiente de desenvolvimento + +1. **Arquivo .env**: O arquivo .env deve estar localizado na raiz do projeto. É necessário editar as seguintes variáveis - DEVELOPMENT: Deve apresentar o valor true, caso o ambiente atual seja o ambiente de desenvolvimento local. Caso nenhum valor seja informado, a API irá assumir como padrão o valor false, indicando o ambiente de produção; - PORT: Deve conter o número da porta onde a API será acessada. Em caso de omissão desse parâmetro, a porta considerada será 443. -2. Chave de acesso - GCP +2. **Chave de acesso - GCP**: A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json. + +3. **Arquivo .gitignore**: Checar se o arquivo .gitignore está ignorando o versionamento da chave e do arquivo .env. + +## Como contribuir + +Pull requests são bem-vindos! Nós vamos adorar ajuda para evoluir esse modulo. Sinta-se livre para navegar por issues abertas buscando por algo que possa fazer. Caso tenha uma nova feature ou bug, por favor abra uma nova issue para ser acompanhada pelo nosso time. + +### Requisitos obrigatórios + +Só serão aceitas contribuições que estiverem seguindo os seguintes requisitos: + +- [Padrão de commit](https://www.conventionalcommits.org/en/v1.0.0/) +- [Padrão de criação de branches](https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow) + +### Api Docs + +- [Index.js](https://github.com/dp6/template-js-cloudfunction-with-terraform/blob/master/docs/index.md) + +## Suporte: + +**DP6 Koopa-troopa Team** - A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json. +_e-mail: _ -3. Checar se o arquivo .gitignore está ignorando o versionamento da chave e do arquivo .env. + \ No newline at end of file From c0cbc8eb9d8d9a53d6229be767711098bb3164a6 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Wed, 28 Apr 2021 11:31:16 -0300 Subject: [PATCH 15/68] docs: :memo: Open Source Docs Inclusao das documentacoes necessarias para tornar o projeto publico na DP6 --- .eslintrc | 2 +- .gitattributes | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 27 ++ .github/ISSUE_TEMPLATE/feature_request.md | 19 + .github/PULL_REQUEST_TEMPLATE.md | 5 + .github/dependabot.yml | 13 + .github/workflows/codacy-analysis.yml | 36 ++ .github/workflows/format-lint.yml | 26 ++ .github/workflows/release.yml | 26 ++ .github/workflows/test.yml | 26 ++ .prettierignore | 2 + .prettierrc | 11 +- CODE_OF_CONDUCT.md | 76 ++++ CONTRIBUTING.md | 126 +++++++ LICENSE | 201 ++++++++++ _config.yml | 9 + app.yaml | 2 +- cloudbuild.yaml | 22 +- openapi-appengine.yaml | 330 ++++++++--------- package-lock.json | 432 +++++++++++++++++++++- package.json | 27 +- tsconfig.json | 6 +- 22 files changed, 1234 insertions(+), 191 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/codacy-analysis.yml create mode 100644 .github/workflows/format-lint.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml create mode 100644 .prettierignore create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 _config.yml diff --git a/.eslintrc b/.eslintrc index 9a009185..de23f705 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,7 @@ { "root": true, "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], + "plugins": ["@typescript-eslint", "@typescript-eslint/eslint-plugin"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..30ddbbb6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.js text eol=lf \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..7955b54b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '[BUG]' +labels: bug +assignees: '' +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..9383cc48 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '[NEW]' +labels: enhancement +assignees: '' +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..69fd1516 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +**What issue does this pull request resolve?** + +**What changes did you make?** + +**Is there anything that requires more attention while reviewing?** diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..2522b989 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'weekly' + + # Maintain dependencies for npm + - package-ecosystem: 'npm' + directory: '/' + schedule: + interval: 'weekly' diff --git a/.github/workflows/codacy-analysis.yml b/.github/workflows/codacy-analysis.yml new file mode 100644 index 00000000..7e62010d --- /dev/null +++ b/.github/workflows/codacy-analysis.yml @@ -0,0 +1,36 @@ +# This workflow checks out code, performs a Codacy security scan +# and integrates the results with the +# GitHub Advanced Security code scanning feature. For more information on +# the Codacy security scan action usage and parameters, see +# https://github.com/codacy/codacy-analysis-cli-action. +# For more information on Codacy Analysis CLI in general, see +# https://github.com/codacy/codacy-analysis-cli. + +name: Codacy + +on: ['push'] + +jobs: + codacy-security-scan: + name: Codacy Analysis + runs-on: ubuntu-latest + steps: + # Checkout the repository to the GitHub Actions runner + - name: Checkout code + uses: actions/checkout@v2 + + # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis + - name: Run Codacy Analysis CLI + uses: codacy/codacy-analysis-cli-action@3.0.0 + with: + # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository + # You can also omit the token and run the tools that support default configurations + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + verbose: true + output: results.sarif + format: sarif + # Adjust severity of non-security issues + gh-code-scanning-compat: true + # Force 0 exit code to allow SARIF file generation + # This will handover control about PR rejection to the GitHub side + max-allowed-issues: 2147483647 diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml new file mode 100644 index 00000000..e36df517 --- /dev/null +++ b/.github/workflows/format-lint.yml @@ -0,0 +1,26 @@ +name: Lint and format +on: ['push'] +jobs: + format: + name: Lint and format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - uses: actions/setup-node@v2.1.5 + with: + node-version: '12.x' + - name: Install dependencies + run: npm install + - name: Lint + run: npm run lint + - name: Format + run: | + npm ci + npm run format + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4.10.0 + with: + commit_message: 'style: :lipstick: Apply formatting changes' + branch: ${{ github.head_ref }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..0d71dd4f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,26 @@ +name: Release +on: + push: + branches: + - master +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Setup Node.js + uses: actions/setup-node@v2.1.5 + with: + node-version: 12 + - name: Install dependencies + run: npm ci + - name: Release + if: github.event_name == 'push' && github.ref == 'refs/heads/master' + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + NPM_TOKEN: ${{secrets.NPM_TOKEN}} + run: npx semantic-release diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..8aa22dee --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,26 @@ +name: Test +on: [push, pull_request] +jobs: + run: + name: Test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 2 + - name: Install dependencies + run: npm install + - name: Run tests + run: npm run test + - name: Run coverage + run: npm run coverage + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: unittests,integrationtest + name: codecov-nyc + - name: Upload coverage to Codacy + run: export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_PROJECT_TOKEN }} && bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage/* + continue-on-error: true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..79e6ea4b --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +node_modules +test \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 4dac0800..109e991a 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,7 +1,14 @@ { - "tabWidth": 4, + "tabWidth": 2, "singleQuote": true, "useTabs": true, "semi": true, - "bracketSpacing": true + "bracketSpacing": true, + "printWidth": 120, + "overrides": [ + { + "files": ".prettierr", + "options": { "parser": "json" } + } + ] } diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..f9827c79 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at koopas@dp6.com.br. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..03d64db5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,126 @@ +# Contributing guide + +Thank you for your help making penguin-datalayer-collect better! Every contribution is appreciated. There are many areas where you can contribute. + +::: tip Submit issue first +If you plan to implement a new feature or some other change please create an issue first, to make sure that your work is not lost. +::: + +[[toc]] + +## Documentation + +pinguin-datalayer-collect has a lot of features and maintaining documentation takes time. If anything is unclear, or could be explained better, we appreciate the time you spend correcting or clarifying it. + +There is a link in the bottom of each website page to quickly edit it. + +## Issues + +Before submitting the issue: + +- Search the existing issues +- Review [Frequently Asked Questions](./docs/faq.md). +- Provide all the relevant information, reducing both your schema and data to the smallest possible size when they still have the issue. + +We value simplicity - simplifying the example that shows the issue makes it more valuable for other users. This process helps us reduce situations where an error is occurring due to incorrect usage rather than a bug. + +### Bug reports + +Please make sure to include the following information in the issue: + +1. What version of are you using? +2. Does the issue happen if you use the latest version? +3. Schema and the data you are validating (please make it as small as possible to reproduce the issue). +4. Your code sample (please use `schema` and `data` as variables). +5. Validation result, data AFTER validation, error messages. +6. What results did you expect? + +[Create bug report](https://github.com/dp6/penguin-datalayer-collect/issues/new?template=bug_report.md). + +### Security vulnerabilities + +To report a security vulnerability, please use the e-mail koopas@dp6.com.br. + +Please do NOT report security vulnerabilities via GitHub issues. + +### Change proposals + +[Create a proposal](https://github.com/dp6/penguin-datalayer-collect/issues/new?template=feature_request.md) for a new feature, option or some other improvement. + +Please include this information: + +1. The version you are using. +2. The problem you want to solve. +3. Your solution to the problem. +4. Would you like to implement it? + +If you’re requesting a change, it would be helpful to include this as well: + +1. What you did. +2. What happened. +3. What you would like to happen. + +Please include as much details as possible - the more information, the better. + +### Installation and dependency issues + +[Create an issue](https://github.com/dp6/penguin-datalayer-collect/issues/new?template=bug_report.md) to report problems that happen during penguin-datalayer-collect installation or when penguin-datalayer-collect is missing some dependency. + +Before submitting the issue, please try the following: + +- use the latest stable Node.js and `npm` +- try using `yarn` instead of `npm` - the issue can be related to https://github.com/npm/npm/issues/19877 +- remove `node_modules` and `package-lock.json` and run `npm install` again + +If nothing helps, please submit: + +1. The version you are using +2. Operating system and Node.js version +3. Package manager and its version +4. Link to (or contents of) package.json and package-lock.json +5. Error messages +6. The output of `npm ls` + +## Code + +Thanks a lot for considering contributing to penguin-datalayer-collect! Our users have created many great features, and we look forward to your contributions. + +#### Development + +Running tests: + +```bash +npm install +npm test +``` + +#### Pull requests + +We want to iterate on the code efficiently. To speed up the process, please follow these steps: + +1. Submit an [issue with the bug](https://github.com/dp6/penguin-datalayer-collect/issues/new) or with the proposed change (unless the contribution is to fix the documentation typos and mistakes). +2. Describe the proposed api and implementation plan (unless the issue is a relatively simple bug and fixing it doesn't change any api). +3. Once agreed, please write as little code as possible to achieve the desired result. We are passionate about keeping our library size optimized. +4. Please add the tests both for the added feature and, if you are submitting an option, for the existing behaviour when this option is turned off or not passed. +5. Please avoid unnecessary changes, refactoring or changing coding styles as part of your change (unless the change was proposed as refactoring). +6. Follow the coding conventions even if they are not validated. +7. Please run the tests before committing your code. +8. If tests fail in CI build after you make a PR please investigate and fix the issue. + +#### Contributions license + +When contributing the code you confirm that: + +1. Your contribution is created by you. +2. You have the right to submit it under the Apache-2.0 license. +3. You understand and agree that your contribution is public, will be stored indefinitely, can be redistributed as the part of penguin-datalayer-collect or another related package under Apache-2.0 license, modified or completely removed from penguin-datalayer-collect. +4. You grant irrevocable Apache-2.0 license to use your contribution as part of penguin-datalayer-collect or any other package. +5. You waive all rights to your contribution. +6. Unless you request otherwise, you can be mentioned as the author of the contribution in the penguin-datalayer-collect documentation and change log. + +## Attribution + +This Code of Conduct is adapted from the [Ajv][homepage], +available at https://ajv.js.org/code_of_conduct/ + +[homepage]: https://ajv.js.org/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f49a4e16 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000..8fa30cb7 --- /dev/null +++ b/_config.yml @@ -0,0 +1,9 @@ +title: DP6 - Centro de inovações +initiative: 'penguin-adinfo' + +markdown: kramdown +remote_theme: dp6/dp6.github.io + +plugins: + - jekyll-sitemap + - jekyll-gzip \ No newline at end of file diff --git a/app.yaml b/app.yaml index c23d7b50..516644ad 100644 --- a/app.yaml +++ b/app.yaml @@ -1 +1 @@ -runtime: nodejs12 \ No newline at end of file +runtime: nodejs12 diff --git a/cloudbuild.yaml b/cloudbuild.yaml index a92eb714..612b2058 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,12 +1,12 @@ steps: -# Install dependencies -- name: node - entrypoint: npm - args: ['install'] -# Run tests -- name: node - entrypoint: npm - args: ['run','test'] -- name: 'gcr.io/cloud-builders/gcloud' - args: ['app', 'deploy'] - timeout: '1600s' + # Install dependencies + - name: node + entrypoint: npm + args: ['install'] + # Run tests + - name: node + entrypoint: npm + args: ['run', 'test'] + - name: 'gcr.io/cloud-builders/gcloud' + args: ['app', 'deploy'] + timeout: '1600s' diff --git a/openapi-appengine.yaml b/openapi-appengine.yaml index bbef209a..e76f76c5 100644 --- a/openapi-appengine.yaml +++ b/openapi-appengine.yaml @@ -1,173 +1,171 @@ swagger: '2.0' info: - title: DP6 Adinfo - description: Implementação do Novo AdInfo DP6 usando App Engine. - version: '0.0.1' + title: DP6 Adinfo + description: Implementação do Novo AdInfo DP6 usando App Engine. + version: '0.0.1' host: localhost:443 basePath: / # schemes: - - https + - https paths: - "/csv": - get: - description: Get the csv file from storage - operationId: csv - parameters: - - name: token - in: headers - description: API token - - name: fileName - in: headers - description: name of file - responses: - 200: - description: "Success" - schema: - type: string - 400: - description: "Bad Request" - 500: - description: "Internal server error" - post: - description: Uploads de CSV file to the storage - operationId: csv - parameters: - - name: token - in: headers - description: API token - - name: content - in: files - description: file to upload - responses: - 200: - description: "Success" - schema: - type: string - 400: - description: "Bad Request" - 500: - description: "Internal server error" - "/csv/list": - get: - description: Lists all csv files within a company - operationId: csv_list - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: "Success" - schema: - type: string - 400: - description: "Bad Request2" - 500: - description: "Internal server error" - "/config": - post: - description: Creates a new config in the company - operationId: config - parameters: - - name: token - in: headers - description: API token - - name: configString - in: body - description: String in JSON format - responses: - 200: - description: "Success" - schema: - type: string - 400: - description: "Bad Request" - 500: - description: "Internal server error" - get: - description: Get last config - operationId: config - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: "Success" - schema: - type: string - 400: - description: "Bad Request" - 500: - description: "Internal server error" - "/build/:media": - post: - description: Creates the output csv containing the builded parameters and urls - operationId: build - parameters: - - name: token - in: headers - description: API token - - name: media - in: params - description: media for parametrizer - responses: - 200: - description: "Success" - schema: - type: string - 400: - description: "Bad Request" - 500: - description: "Internal server error" - "/template": - get: - description: Creates the input csv file template - operationId: template - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: "Success" - schema: - type: string - 500: - description: "Internal server error" - "/register": - get: - description: Creates new API Token - operationId: "register" - parameters: - - name: token - in: headers - description: API token - - name: permission - in: headers - description: permission to new user - responses: - 200: - description: "Success" - schema: - type: string - 500: - description: "Internal server error" - "/user": - get: - description: Get User credentials - operationId: "user" - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: "Success" - schema: - type: string - 500: - description: "Internal server error" - - + '/csv': + get: + description: Get the csv file from storage + operationId: csv + parameters: + - name: token + in: headers + description: API token + - name: fileName + in: headers + description: name of file + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + post: + description: Uploads de CSV file to the storage + operationId: csv + parameters: + - name: token + in: headers + description: API token + - name: content + in: files + description: file to upload + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + '/csv/list': + get: + description: Lists all csv files within a company + operationId: csv_list + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request2' + 500: + description: 'Internal server error' + '/config': + post: + description: Creates a new config in the company + operationId: config + parameters: + - name: token + in: headers + description: API token + - name: configString + in: body + description: String in JSON format + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + get: + description: Get last config + operationId: config + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + '/build/:media': + post: + description: Creates the output csv containing the builded parameters and urls + operationId: build + parameters: + - name: token + in: headers + description: API token + - name: media + in: params + description: media for parametrizer + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + '/template': + get: + description: Creates the input csv file template + operationId: template + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 500: + description: 'Internal server error' + '/register': + get: + description: Creates new API Token + operationId: 'register' + parameters: + - name: token + in: headers + description: API token + - name: permission + in: headers + description: permission to new user + responses: + 200: + description: 'Success' + schema: + type: string + 500: + description: 'Internal server error' + '/user': + get: + description: Get User credentials + operationId: 'user' + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 500: + description: 'Internal server error' diff --git a/package-lock.json b/package-lock.json index 079f6df0..c09dd631 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "adinfo", + "name": "penguin-adinfo", "version": "1.0.0", "lockfileVersion": 1, "requires": true, @@ -259,6 +259,36 @@ "protobufjs": "^6.8.6" } }, + "@microsoft/tsdoc": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", + "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", + "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.13.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -481,6 +511,14 @@ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "requires": { + "@types/unist": "*" + } + }, "@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -541,6 +579,11 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, "@typescript-eslint/eslint-plugin": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", @@ -880,6 +923,17 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1217,6 +1271,21 @@ } } }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -1283,6 +1352,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1852,6 +1927,16 @@ "prettier-linter-helpers": "^1.0.0" } }, + "eslint-plugin-tsdoc": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.14.tgz", + "integrity": "sha512-fJ3fnZRsdIoBZgzkQjv8vAj6NeeOoFkTfgosj6mKsFjX70QV256sA/wq+y/R2+OL4L8E79VVaVWrPeZnKNe8Ng==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "0.15.2" + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -2227,6 +2312,18 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2470,6 +2567,27 @@ "mime": "^2.2.0" } }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2627,6 +2745,12 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2637,6 +2761,20 @@ "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2652,6 +2790,11 @@ "binary-extensions": "^2.0.0" } }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -2670,6 +2813,11 @@ "has": "^1.0.3" } }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2696,6 +2844,11 @@ "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, "is-installed-globally": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", @@ -2732,8 +2885,7 @@ "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, "is-stream": { "version": "2.0.0", @@ -2773,6 +2925,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2824,6 +2982,16 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -2927,6 +3095,11 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -2951,6 +3124,12 @@ "yallist": "^4.0.0" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2971,6 +3150,42 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "marked": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.3.tgz", + "integrity": "sha512-5otztIIcJfPc2qGTN8cVtOJEjNJZ0jwa46INMagrYfk0EvqtRuEHLsEe0LrFS0/q+ZRKT0+kXK7P2T1AN5lWRA==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3016,6 +3231,15 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -3505,6 +3729,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -3620,6 +3850,32 @@ "mimic-fn": "^2.1.0" } }, + "onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -3698,6 +3954,19 @@ "callsites": "^3.0.0" } }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -4016,6 +4285,15 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -4055,6 +4333,37 @@ "rc": "^1.2.8" } }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -4280,6 +4589,27 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shiki": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz", + "integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==", + "dev": true, + "requires": { + "onigasm": "^2.2.5", + "vscode-textmate": "^5.2.0" + } + }, "shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -4755,6 +5085,11 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, "ts-node": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", @@ -4879,6 +5214,39 @@ "is-typedarray": "^1.0.0" } }, + "typedoc": { + "version": "0.20.36", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.36.tgz", + "integrity": "sha512-qFU+DWMV/hifQ9ZAlTjdFO9wbUIHuUBpNXzv68ZyURAP9pInjZiO4+jCPeAzHVcaBCHER9WL/+YzzTt6ZlN/Nw==", + "dev": true, + "requires": { + "colors": "^1.4.0", + "fs-extra": "^9.1.0", + "handlebars": "^4.7.7", + "lodash": "^4.17.21", + "lunr": "^2.3.9", + "marked": "^2.0.3", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "shiki": "^0.9.3", + "typedoc-default-themes": "^0.12.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + } + } + }, + "typedoc-default-themes": { + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", + "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", + "dev": true + }, "typescript": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", @@ -4916,6 +5284,19 @@ } } }, + "unified": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", + "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -4924,6 +5305,20 @@ "crypto-random-string": "^2.0.0" } }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -5031,6 +5426,32 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "vscode-textmate": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.4.0.tgz", + "integrity": "sha512-c0Q4zYZkcLizeYJ3hNyaVUM2AA8KDhNCA3JvXY8CeZSJuBdAy3bAvSbv46RClC4P3dSO9BdwhnKEx2zOo6vP/w==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5226,6 +5647,11 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" } } } diff --git a/package.json b/package.json index 9fce230e..0ffaf10e 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,35 @@ { - "name": "adinfo", + "name": "penguin-adinfo", "version": "1.0.0", - "description": "Novo AdInfo", + "description": "O Ad Info Penguin é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital. ", "main": "index.js", "scripts": { "start": "node index.js", - "test": "mocha --require ts-node/register --timeout 2000 --exit ts 'test/**/*.spec.ts'", + "test": "npm run unit-test", + "unit-test": "mocha --require ts-node/register --timeout 2000 --exit ts 'test/**/*.spec.ts'", "lint": "eslint ./src --ext .ts", + "lint-prettier": "npx prettier --check .", "lint-fix": "eslint ./src --ext .ts --fix", "compile": "del /s /q src\\js && tsc", "auto-compile": "tsc -w", - "prettier": "npx prettier --write ./src ./test", - "build": "npm test && npm run lint && npm run compile && npm run prettier" + "format": "npx prettier --write .", + "build": "npm run compile", + "docs": "npx typedoc --out docs" }, "repository": { "type": "git", "url": "https://github.com/DP6/adinfo.git" }, "author": "DP6", + "contributors": [ + { + "name": "Lucas Tonetto Firmo", + "email": "lucasfirmo@hotmail.com" + } + ], + "keywords": [ + "dp6" + ], "license": "ISC", "dependencies": { "@google-cloud/firestore": "^4.8.1", @@ -33,7 +45,8 @@ "express": "^4.17.1", "express-fileupload": "^1.2.0", "json-2-csv": "^3.7.4", - "multer": "^1.4.2" + "multer": "^1.4.2", + "remark": "^13.0.0" }, "devDependencies": { "@types/chai": "^4.2.14", @@ -47,12 +60,14 @@ "eslint": "^7.12.1", "eslint-config-prettier": "^6.15.0", "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-tsdoc": "^0.2.14", "mocha": "^8.2.1", "nodemon": "^2.0.4", "prettier": "^2.1.2", "supertest": "^4.0.2", "ts-node": "^9.0.0", "ts-node-dev": "^1.0.0", + "typedoc": "^0.20.36", "typescript": "^4.0.5" } } diff --git a/tsconfig.json b/tsconfig.json index aeb75334..6608f779 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,5 +8,9 @@ "removeComments": true, "resolveJsonModule": true }, - "include": ["src/ts/**/*"] + "include": ["src/ts/**/*"], + "typedocOptions": { + "entryPoints": ["src/ts/"], + "out": "docs" + } } From f07860be0bc8506a6f42bc2ee6fc31b92630f6e7 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Wed, 28 Apr 2021 11:33:41 -0300 Subject: [PATCH 16/68] docs: :memo: Dev Docs Inclusao da documentacao de desenvolvimento com typedoc --- docs/assets/css/main.css | 2660 +++++++++++++++++ docs/assets/images/icons.png | Bin 0 -> 9615 bytes docs/assets/images/icons@2x.png | Bin 0 -> 28144 bytes docs/assets/images/widgets.png | Bin 0 -> 480 bytes docs/assets/images/widgets@2x.png | Bin 0 -> 855 bytes docs/assets/js/main.js | 248 ++ docs/assets/js/search.js | 1 + docs/classes/controllers_builder.builder.html | 263 ++ docs/classes/models_adobe.adobe.html | 529 ++++ .../models_analyticstool.analyticstool.html | 388 +++ docs/classes/models_auth.auth.html | 380 +++ ...ingleton.firestoreconnectionsingleton.html | 406 +++ ...oud_loggingsingleton.loggingsingleton.html | 338 +++ ...nsingleton.storageconnectionsingleton.html | 373 +++ docs/classes/models_config.config.html | 998 +++++++ docs/classes/models_dao_authdao.authdao.html | 298 ++ .../models_dao_configdao.configdao.html | 278 ++ docs/classes/models_dao_filedao.filedao.html | 361 +++ .../models_dao_filestore.filestore.html | 258 ++ .../models_dao_objectstore.objectstore.html | 293 ++ ...els_dependencyconfig.dependencyconfig.html | 432 +++ .../models_facebookads.facebookads.html | 545 ++++ docs/classes/models_ga.ga.html | 616 ++++ .../models_generalvehicle.generalvehicle.html | 527 ++++ docs/classes/models_googleads.googleads.html | 479 +++ docs/classes/models_log.log.html | 165 + .../models_parametrizer.parametrizer.html | 337 +++ ...rametrizerfactory.parametrizerfactory.html | 268 ++ ...els_routespermission.routespermission.html | 247 ++ docs/classes/models_vehicle.vehicle.html | 302 ++ docs/classes/utils_csvutils.csvutils.html | 291 ++ docs/classes/utils_dateutils.dateutils.html | 265 ++ docs/classes/utils_jsonutils.jsonutils.html | 292 ++ .../utils_stringutils.stringutils.html | 375 +++ docs/index.html | 336 +++ docs/modules.html | 247 ++ docs/modules/app.html | 106 + docs/modules/controllers_builder.html | 122 + docs/modules/models_adobe.html | 122 + docs/modules/models_analyticstool.html | 122 + docs/modules/models_auth.html | 122 + ...ls_cloud_firestoreconnectionsingleton.html | 122 + .../models_cloud_loggingsingleton.html | 122 + ...dels_cloud_storageconnectionsingleton.html | 122 + docs/modules/models_config.html | 122 + docs/modules/models_dao_authdao.html | 122 + docs/modules/models_dao_configdao.html | 122 + docs/modules/models_dao_filedao.html | 122 + docs/modules/models_dao_filestore.html | 122 + docs/modules/models_dao_objectstore.html | 122 + docs/modules/models_dependencyconfig.html | 122 + docs/modules/models_facebookads.html | 122 + docs/modules/models_ga.html | 122 + docs/modules/models_generalvehicle.html | 122 + docs/modules/models_googleads.html | 122 + docs/modules/models_log.html | 122 + docs/modules/models_parametrizer.html | 122 + docs/modules/models_parametrizerfactory.html | 122 + docs/modules/models_routespermission.html | 122 + docs/modules/models_vehicle.html | 122 + docs/modules/routes_build.html | 153 + docs/modules/routes_config.html | 153 + docs/modules/routes_csv.html | 153 + docs/modules/routes_register.html | 153 + docs/modules/routes_routes.html | 153 + docs/modules/routes_template.html | 153 + docs/modules/routes_user.html | 153 + docs/modules/utils_csvutils.html | 122 + docs/modules/utils_dateutils.html | 122 + docs/modules/utils_jsonutils.html | 122 + docs/modules/utils_stringutils.html | 122 + 71 files changed, 18267 insertions(+) create mode 100644 docs/assets/css/main.css create mode 100644 docs/assets/images/icons.png create mode 100644 docs/assets/images/icons@2x.png create mode 100644 docs/assets/images/widgets.png create mode 100644 docs/assets/images/widgets@2x.png create mode 100644 docs/assets/js/main.js create mode 100644 docs/assets/js/search.js create mode 100644 docs/classes/controllers_builder.builder.html create mode 100644 docs/classes/models_adobe.adobe.html create mode 100644 docs/classes/models_analyticstool.analyticstool.html create mode 100644 docs/classes/models_auth.auth.html create mode 100644 docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html create mode 100644 docs/classes/models_cloud_loggingsingleton.loggingsingleton.html create mode 100644 docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html create mode 100644 docs/classes/models_config.config.html create mode 100644 docs/classes/models_dao_authdao.authdao.html create mode 100644 docs/classes/models_dao_configdao.configdao.html create mode 100644 docs/classes/models_dao_filedao.filedao.html create mode 100644 docs/classes/models_dao_filestore.filestore.html create mode 100644 docs/classes/models_dao_objectstore.objectstore.html create mode 100644 docs/classes/models_dependencyconfig.dependencyconfig.html create mode 100644 docs/classes/models_facebookads.facebookads.html create mode 100644 docs/classes/models_ga.ga.html create mode 100644 docs/classes/models_generalvehicle.generalvehicle.html create mode 100644 docs/classes/models_googleads.googleads.html create mode 100644 docs/classes/models_log.log.html create mode 100644 docs/classes/models_parametrizer.parametrizer.html create mode 100644 docs/classes/models_parametrizerfactory.parametrizerfactory.html create mode 100644 docs/classes/models_routespermission.routespermission.html create mode 100644 docs/classes/models_vehicle.vehicle.html create mode 100644 docs/classes/utils_csvutils.csvutils.html create mode 100644 docs/classes/utils_dateutils.dateutils.html create mode 100644 docs/classes/utils_jsonutils.jsonutils.html create mode 100644 docs/classes/utils_stringutils.stringutils.html create mode 100644 docs/index.html create mode 100644 docs/modules.html create mode 100644 docs/modules/app.html create mode 100644 docs/modules/controllers_builder.html create mode 100644 docs/modules/models_adobe.html create mode 100644 docs/modules/models_analyticstool.html create mode 100644 docs/modules/models_auth.html create mode 100644 docs/modules/models_cloud_firestoreconnectionsingleton.html create mode 100644 docs/modules/models_cloud_loggingsingleton.html create mode 100644 docs/modules/models_cloud_storageconnectionsingleton.html create mode 100644 docs/modules/models_config.html create mode 100644 docs/modules/models_dao_authdao.html create mode 100644 docs/modules/models_dao_configdao.html create mode 100644 docs/modules/models_dao_filedao.html create mode 100644 docs/modules/models_dao_filestore.html create mode 100644 docs/modules/models_dao_objectstore.html create mode 100644 docs/modules/models_dependencyconfig.html create mode 100644 docs/modules/models_facebookads.html create mode 100644 docs/modules/models_ga.html create mode 100644 docs/modules/models_generalvehicle.html create mode 100644 docs/modules/models_googleads.html create mode 100644 docs/modules/models_log.html create mode 100644 docs/modules/models_parametrizer.html create mode 100644 docs/modules/models_parametrizerfactory.html create mode 100644 docs/modules/models_routespermission.html create mode 100644 docs/modules/models_vehicle.html create mode 100644 docs/modules/routes_build.html create mode 100644 docs/modules/routes_config.html create mode 100644 docs/modules/routes_csv.html create mode 100644 docs/modules/routes_register.html create mode 100644 docs/modules/routes_routes.html create mode 100644 docs/modules/routes_template.html create mode 100644 docs/modules/routes_user.html create mode 100644 docs/modules/utils_csvutils.html create mode 100644 docs/modules/utils_dateutils.html create mode 100644 docs/modules/utils_jsonutils.html create mode 100644 docs/modules/utils_stringutils.html diff --git a/docs/assets/css/main.css b/docs/assets/css/main.css new file mode 100644 index 00000000..46571c27 --- /dev/null +++ b/docs/assets/css/main.css @@ -0,0 +1,2660 @@ +:root { + --color-background: #fdfdfd; + --color-text: #222; + --color-text-aside: #707070; + --color-link: #4da6ff; + --color-menu-divider: #eee; + --color-menu-divider-focus: #000; + --color-menu-label: #707070; + --color-panel: #fff; + --color-panel-divider: #eee; + --color-comment-tag: #707070; + --color-comment-tag-text: #fff; + --color-code-background: rgba(0, 0, 0, 0.04); + --color-ts: #9600ff; + --color-ts-interface: #647f1b; + --color-ts-enum: #937210; + --color-ts-class: #0672de; + --color-ts-private: #707070; + --color-toolbar: #fff; + --color-toolbar-text: #333; +} + +/*! normalize.css v1.1.3 | MIT License | git.io/normalize */ +/* ========================================================================== + * * HTML5 display definitions + * * ========================================================================== */ +/** + * * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block; +} + +/** + * * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/** + * * Prevent modern browsers from displaying `audio` without controls. + * * Remove excess height in iOS 5 devices. */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + * * Known issue: no IE 6 support. */ +[hidden] { + display: none; +} + +/* ========================================================================== + * * Base + * * ========================================================================== */ +/** + * * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using + * * `em` units. + * * 2. Prevent iOS text size adjust after orientation change, without disabling + * * user zoom. */ +html { + font-size: 100%; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + font-family: sans-serif; +} + +/** + * * Address `font-family` inconsistency between `textarea` and other form + * * elements. */ +button, input, select, textarea { + font-family: sans-serif; +} + +/** + * * Address margins handled incorrectly in IE 6/7. */ +body { + margin: 0; +} + +/* ========================================================================== + * * Links + * * ========================================================================== */ +/** + * * Address `outline` inconsistency between Chrome and other browsers. */ +a:focus { + outline: thin dotted; +} +a:active, a:hover { + outline: 0; +} + +/** + * * Improve readability when focused and also mouse hovered in all browsers. */ +/* ========================================================================== + * * Typography + * * ========================================================================== */ +/** + * * Address font sizes and margins set differently in IE 6/7. + * * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, + * * and Chrome. */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4, .tsd-index-panel h3 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +/** + * * Address styling not present in IE 7/8/9, Safari 5, and Chrome. */ +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */ +b, strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/** + * * Address styling not present in Safari 5 and Chrome. */ +dfn { + font-style: italic; +} + +/** + * * Address differences between Firefox and other browsers. + * * Known issue: no IE 6/7 normalization. */ +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * * Address styling not present in IE 6/7/8/9. */ +mark { + background: #ff0; + color: #000; +} + +/** + * * Address margins set differently in IE 6/7. */ +p, pre { + margin: 1em 0; +} + +/** + * * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */ +code, kbd, pre, samp { + font-family: monospace, serif; + _font-family: "courier new", monospace; + font-size: 1em; +} + +/** + * * Improve readability of pre-formatted text in all browsers. */ +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/** + * * Address CSS quotes not supported in IE 6/7. */ +q { + quotes: none; +} +q:before, q:after { + content: ""; + content: none; +} + +/** + * * Address `quotes` property not supported in Safari 4. */ +/** + * * Address inconsistent and variable font size in all browsers. */ +small { + font-size: 80%; +} + +/** + * * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + * * Lists + * * ========================================================================== */ +/** + * * Address margins set differently in IE 6/7. */ +dl, menu, ol, ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/** + * * Address paddings set differently in IE 6/7. */ +menu, ol, ul { + padding: 0 0 0 40px; +} + +/** + * * Correct list images handled incorrectly in IE 7. */ +nav ul, nav ol { + list-style: none; + list-style-image: none; +} + +/* ========================================================================== + * * Embedded content + * * ========================================================================== */ +/** + * * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * * 2. Improve image quality when scaled in IE 7. */ +img { + border: 0; + /* 1 */ + -ms-interpolation-mode: bicubic; +} + +/* 2 */ +/** + * * Correct overflow displayed oddly in IE 9. */ +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + * * Figures + * * ========================================================================== */ +/** + * * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ +figure, form { + margin: 0; +} + +/* ========================================================================== + * * Forms + * * ========================================================================== */ +/** + * * Correct margin displayed oddly in IE 6/7. */ +/** + * * Define consistent border, margin, and padding. */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * * 1. Correct color not being inherited in IE 6/7/8/9. + * * 2. Correct text not wrapping in Firefox 3. + * * 3. Correct alignment displayed oddly in IE 6/7. */ +legend { + border: 0; + /* 1 */ + padding: 0; + white-space: normal; + /* 2 */ + *margin-left: -7px; +} + +/* 3 */ +/** + * * 1. Correct font size not being inherited in all browsers. + * * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, + * * and Chrome. + * * 3. Improve appearance and consistency in all browsers. */ +button, input, select, textarea { + font-size: 100%; + /* 1 */ + margin: 0; + /* 2 */ + vertical-align: baseline; + /* 3 */ + *vertical-align: middle; +} + +/* 3 */ +/** + * * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * * the UA stylesheet. */ +button, input { + line-height: normal; +} + +/** + * * Address inconsistent `text-transform` inheritance for `button` and `select`. + * * All other form control elements do not inherit `text-transform` values. + * * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * * Correct `select` style inheritance in Firefox 4+ and Opera. */ +button, select { + text-transform: none; +} + +/** + * * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * * and `video` controls. + * * 2. Correct inability to style clickable `input` types in iOS. + * * 3. Improve usability and consistency of cursor style between image-type + * * `input` and others. + * * 4. Remove inner spacing in IE 7 without affecting normal text inputs. + * * Known issue: inner spacing remains in IE 6. */ +button, html input[type=button] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ + *overflow: visible; +} + +/* 4 */ +input[type=reset], input[type=submit] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ + *overflow: visible; +} + +/* 4 */ +/** + * * Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { + cursor: default; +} + +/** + * * 1. Address box sizing set to content-box in IE 8/9. + * * 2. Remove excess padding in IE 8/9. + * * 3. Remove excess padding in IE 7. + * * Known issue: excess padding remains in IE 6. */ +input { + /* 3 */ +} +input[type=checkbox], input[type=radio] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ + *height: 13px; + /* 3 */ + *width: 13px; +} +input[type=search] { + -webkit-appearance: textfield; + /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + /* 2 */ + box-sizing: content-box; +} +input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * * (include `-moz` to future-proof). */ +/** + * * Remove inner padding and search cancel button in Safari 5 and Chrome + * * on OS X. */ +/** + * * Remove inner padding and border in Firefox 3+. */ +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * * 1. Remove default vertical scrollbar in IE 6/7/8/9. + * * 2. Improve readability and alignment in all browsers. */ +textarea { + overflow: auto; + /* 1 */ + vertical-align: top; +} + +/* 2 */ +/* ========================================================================== + * * Tables + * * ========================================================================== */ +/** + * * Remove most spacing between table cells. */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +ul.tsd-descriptions > li > :first-child, .tsd-panel > :first-child, .col > :first-child, .col-11 > :first-child, .col-10 > :first-child, .col-9 > :first-child, .col-8 > :first-child, .col-7 > :first-child, .col-6 > :first-child, .col-5 > :first-child, .col-4 > :first-child, .col-3 > :first-child, .col-2 > :first-child, .col-1 > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child, +.tsd-panel > :first-child > :first-child, +.col > :first-child > :first-child, +.col-11 > :first-child > :first-child, +.col-10 > :first-child > :first-child, +.col-9 > :first-child > :first-child, +.col-8 > :first-child > :first-child, +.col-7 > :first-child > :first-child, +.col-6 > :first-child > :first-child, +.col-5 > :first-child > :first-child, +.col-4 > :first-child > :first-child, +.col-3 > :first-child > :first-child, +.col-2 > :first-child > :first-child, +.col-1 > :first-child > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child > :first-child, +.tsd-panel > :first-child > :first-child > :first-child, +.col > :first-child > :first-child > :first-child, +.col-11 > :first-child > :first-child > :first-child, +.col-10 > :first-child > :first-child > :first-child, +.col-9 > :first-child > :first-child > :first-child, +.col-8 > :first-child > :first-child > :first-child, +.col-7 > :first-child > :first-child > :first-child, +.col-6 > :first-child > :first-child > :first-child, +.col-5 > :first-child > :first-child > :first-child, +.col-4 > :first-child > :first-child > :first-child, +.col-3 > :first-child > :first-child > :first-child, +.col-2 > :first-child > :first-child > :first-child, +.col-1 > :first-child > :first-child > :first-child { + margin-top: 0; +} +ul.tsd-descriptions > li > :last-child, .tsd-panel > :last-child, .col > :last-child, .col-11 > :last-child, .col-10 > :last-child, .col-9 > :last-child, .col-8 > :last-child, .col-7 > :last-child, .col-6 > :last-child, .col-5 > :last-child, .col-4 > :last-child, .col-3 > :last-child, .col-2 > :last-child, .col-1 > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child, +.tsd-panel > :last-child > :last-child, +.col > :last-child > :last-child, +.col-11 > :last-child > :last-child, +.col-10 > :last-child > :last-child, +.col-9 > :last-child > :last-child, +.col-8 > :last-child > :last-child, +.col-7 > :last-child > :last-child, +.col-6 > :last-child > :last-child, +.col-5 > :last-child > :last-child, +.col-4 > :last-child > :last-child, +.col-3 > :last-child > :last-child, +.col-2 > :last-child > :last-child, +.col-1 > :last-child > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child > :last-child, +.tsd-panel > :last-child > :last-child > :last-child, +.col > :last-child > :last-child > :last-child, +.col-11 > :last-child > :last-child > :last-child, +.col-10 > :last-child > :last-child > :last-child, +.col-9 > :last-child > :last-child > :last-child, +.col-8 > :last-child > :last-child > :last-child, +.col-7 > :last-child > :last-child > :last-child, +.col-6 > :last-child > :last-child > :last-child, +.col-5 > :last-child > :last-child > :last-child, +.col-4 > :last-child > :last-child > :last-child, +.col-3 > :last-child > :last-child > :last-child, +.col-2 > :last-child > :last-child > :last-child, +.col-1 > :last-child > :last-child > :last-child { + margin-bottom: 0; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 40px; +} +@media (max-width: 640px) { + .container { + padding: 0 20px; + } +} + +.container-main { + padding-bottom: 200px; +} + +.row { + display: flex; + position: relative; + margin: 0 -10px; +} +.row:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +.col, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + box-sizing: border-box; + float: left; + padding: 0 10px; +} + +.col-1 { + width: 8.3333333333%; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.col-2 { + width: 16.6666666667%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.col-3 { + width: 25%; +} + +.offset-3 { + margin-left: 25%; +} + +.col-4 { + width: 33.3333333333%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.col-5 { + width: 41.6666666667%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.col-6 { + width: 50%; +} + +.offset-6 { + margin-left: 50%; +} + +.col-7 { + width: 58.3333333333%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.col-8 { + width: 66.6666666667%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.col-9 { + width: 75%; +} + +.offset-9 { + margin-left: 75%; +} + +.col-10 { + width: 83.3333333333%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.col-11 { + width: 91.6666666667%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +.tsd-kind-icon { + display: block; + position: relative; + padding-left: 20px; + text-indent: -20px; +} +.tsd-kind-icon:before { + content: ""; + display: inline-block; + vertical-align: middle; + width: 17px; + height: 17px; + margin: 0 3px 2px 0; + background-image: url(../images/icons.png); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-kind-icon:before { + background-image: url(../images/icons@2x.png); + background-size: 238px 204px; + } +} + +.tsd-signature.tsd-kind-icon:before { + background-position: 0 -153px; +} + +.tsd-kind-object-literal > .tsd-kind-icon:before { + background-position: 0px -17px; +} +.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -17px; +} +.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -17px; +} + +.tsd-kind-class > .tsd-kind-icon:before { + background-position: 0px -34px; +} +.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -34px; +} +.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -34px; +} + +.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -51px; +} + +.tsd-kind-interface > .tsd-kind-icon:before { + background-position: 0px -68px; +} +.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -68px; +} +.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -68px; +} + +.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -85px; +} + +.tsd-kind-namespace > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-module > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-enum > .tsd-kind-icon:before { + background-position: 0px -119px; +} +.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -119px; +} +.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -119px; +} + +.tsd-kind-enum-member > .tsd-kind-icon:before { + background-position: 0px -136px; +} +.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -136px; +} +.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -136px; +} + +.tsd-kind-signature > .tsd-kind-icon:before { + background-position: 0px -153px; +} +.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -153px; +} +.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -153px; +} + +.tsd-kind-type-alias > .tsd-kind-icon:before { + background-position: 0px -170px; +} +.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -170px; +} +.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -170px; +} + +.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -187px; +} + +.tsd-kind-variable > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-property > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-get-signature > .tsd-kind-icon:before { + background-position: -136px -17px; +} +.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -17px; +} +.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -17px; +} + +.tsd-kind-set-signature > .tsd-kind-icon:before { + background-position: -136px -34px; +} +.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -34px; +} +.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -34px; +} + +.tsd-kind-accessor > .tsd-kind-icon:before { + background-position: -136px -51px; +} +.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -51px; +} +.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -51px; +} + +.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-constructor > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-constructor-signature > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-index-signature > .tsd-kind-icon:before { + background-position: -136px -119px; +} +.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -119px; +} +.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -119px; +} + +.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -136px; +} +.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -136px; +} +.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -136px; +} + +.tsd-is-static > .tsd-kind-icon:before { + background-position: -136px -153px; +} +.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -153px; +} +.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -153px; +} +.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -153px; +} + +.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -187px; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +code, pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 14px; + background-color: var(--color-code-background); +} + +pre { + padding: 10px; +} +pre code { + padding: 0; + font-size: 100%; + background-color: transparent; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, .tsd-typography h5, .tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, .tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, .tsd-typography ul, .tsd-typography ol { + margin: 1em 0; +} + +@media (min-width: 901px) and (max-width: 1024px) { + html.default .col-content { + width: 72%; + } + html.default .col-menu { + width: 28%; + } + html.default .tsd-navigation { + padding-left: 10px; + } +} +@media (max-width: 900px) { + html.default .col-content { + float: none; + width: 100%; + } + html.default .col-menu { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + width: 100%; + padding: 20px 20px 0 0; + max-width: 450px; + visibility: hidden; + background-color: var(--color-panel); + transform: translate(100%, 0); + } + html.default .col-menu > *:last-child { + padding-bottom: 20px; + } + html.default .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + html.default.to-has-menu .overlay { + animation: fade-in 0.4s; + } + html.default.to-has-menu header, +html.default.to-has-menu footer, +html.default.to-has-menu .col-content { + animation: shift-to-left 0.4s; + } + html.default.to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + html.default.from-has-menu .overlay { + animation: fade-out 0.4s; + } + html.default.from-has-menu header, +html.default.from-has-menu footer, +html.default.from-has-menu .col-content { + animation: unshift-to-left 0.4s; + } + html.default.from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + html.default.has-menu body { + overflow: hidden; + } + html.default.has-menu .overlay { + visibility: visible; + } + html.default.has-menu header, +html.default.has-menu footer, +html.default.has-menu .col-content { + transform: translate(-25%, 0); + } + html.default.has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + } +} + +.tsd-page-title { + padding: 70px 0 20px 0; + margin: 0 0 40px 0; + background: var(--color-panel); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); +} +.tsd-page-title h1 { + margin: 0; +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +html.minimal .container { + margin: 0; +} +html.minimal .container-main { + padding-top: 50px; + padding-bottom: 0; +} +html.minimal .content-wrap { + padding-left: 300px; +} +html.minimal .tsd-navigation { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + box-sizing: border-box; + z-index: 1; + left: 0; + top: 40px; + bottom: 0; + width: 300px; + padding: 20px; + margin: 0; +} +html.minimal .tsd-member .tsd-member { + margin-left: 0; +} +html.minimal .tsd-page-toolbar { + position: fixed; + z-index: 2; +} +html.minimal #tsd-filter .tsd-filter-group { + right: 0; + transform: none; +} +html.minimal footer { + background-color: transparent; +} +html.minimal footer .container { + padding: 0; +} +html.minimal .tsd-generator { + padding: 0; +} +@media (max-width: 900px) { + html.minimal .tsd-navigation { + display: none; + } + html.minimal .content-wrap { + padding-left: 0; + } +} + +dl.tsd-comment-tags { + overflow: hidden; +} +dl.tsd-comment-tags dt { + float: left; + padding: 1px 5px; + margin: 0 10px 0 0; + border-radius: 4px; + border: 1px solid var(--color-comment-tag); + color: var(--color-comment-tag); + font-size: 0.8em; + font-weight: normal; +} +dl.tsd-comment-tags dd { + margin: 0 0 10px 0; +} +dl.tsd-comment-tags dd:before, dl.tsd-comment-tags dd:after { + display: table; + content: " "; +} +dl.tsd-comment-tags dd pre, dl.tsd-comment-tags dd:after { + clear: both; +} +dl.tsd-comment-tags p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.toggle-protected .tsd-is-private { + display: none; +} + +.toggle-public .tsd-is-private, +.toggle-public .tsd-is-protected, +.toggle-public .tsd-is-private-protected { + display: none; +} + +.toggle-inherited .tsd-is-inherited { + display: none; +} + +.toggle-externals .tsd-is-external { + display: none; +} + +#tsd-filter { + position: relative; + display: inline-block; + height: 40px; + vertical-align: bottom; +} +.no-filter #tsd-filter { + display: none; +} +#tsd-filter .tsd-filter-group { + display: inline-block; + height: 40px; + vertical-align: bottom; + white-space: nowrap; +} +#tsd-filter input { + display: none; +} +@media (max-width: 900px) { + #tsd-filter .tsd-filter-group { + display: block; + position: absolute; + top: 40px; + right: 20px; + height: auto; + background-color: var(--color-panel); + visibility: hidden; + transform: translate(50%, 0); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + .has-options #tsd-filter .tsd-filter-group { + visibility: visible; + } + .to-has-options #tsd-filter .tsd-filter-group { + animation: fade-in 0.2s; + } + .from-has-options #tsd-filter .tsd-filter-group { + animation: fade-out 0.2s; + } + #tsd-filter label, +#tsd-filter .tsd-select { + display: block; + padding-right: 20px; + } +} + +footer { + border-top: 1px solid var(--color-panel-divider); + background-color: var(--color-panel); +} +footer.with-border-bottom { + border-bottom: 1px solid var(--color-panel-divider); +} +footer .tsd-legend-group { + font-size: 0; +} +footer .tsd-legend { + display: inline-block; + width: 25%; + padding: 0; + font-size: 16px; + list-style: none; + line-height: 1.333em; + vertical-align: top; +} +@media (max-width: 900px) { + footer .tsd-legend { + width: 50%; + } +} + +.tsd-hierarchy { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-index-panel .tsd-index-content { + margin-bottom: -30px !important; +} +.tsd-index-panel .tsd-index-section { + margin-bottom: 30px !important; +} +.tsd-index-panel h3 { + margin: 0 -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 3; + -moz-column-count: 3; + -ms-column-count: 3; + -o-column-count: 3; + column-count: 3; + -webkit-column-gap: 20px; + -moz-column-gap: 20px; + -ms-column-gap: 20px; + -o-column-gap: 20px; + column-gap: 20px; + padding: 0; + list-style: none; + line-height: 1.333em; +} +@media (max-width: 900px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 1; + -moz-column-count: 1; + -ms-column-count: 1; + -o-column-count: 1; + column-count: 1; + } +} +@media (min-width: 901px) and (max-width: 1024px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 2; + -moz-column-count: 2; + -ms-column-count: 2; + -o-column-count: 2; + column-count: 2; + } +} +.tsd-index-panel ul.tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel .tsd-parent-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-parent-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-parent-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-parent-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-is-private a { + color: var(--color-ts-private); +} + +.tsd-flag { + display: inline-block; + padding: 1px 5px; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 14px; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} +.tsd-member a[data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member a[data-tsd-kind=Interface] { + color: var(--color-ts-interface); +} +.tsd-member a[data-tsd-kind=Enum] { + color: var(--color-ts-enum); +} +.tsd-member a[data-tsd-kind=Class] { + color: var(--color-ts-class); +} +.tsd-member a[data-tsd-kind=Private] { + color: var(--color-ts-private); +} + +.tsd-navigation { + margin: 0 0 0 40px; +} +.tsd-navigation a { + display: block; + padding-top: 2px; + padding-bottom: 2px; + border-left: 2px solid transparent; + color: var(--color-text); + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary { + padding-bottom: 40px; +} +.tsd-navigation.primary a { + display: block; + padding-top: 6px; + padding-bottom: 6px; +} +.tsd-navigation.primary ul li a { + padding-left: 5px; +} +.tsd-navigation.primary ul li li a { + padding-left: 25px; +} +.tsd-navigation.primary ul li li li a { + padding-left: 45px; +} +.tsd-navigation.primary ul li li li li a { + padding-left: 65px; +} +.tsd-navigation.primary ul li li li li li a { + padding-left: 85px; +} +.tsd-navigation.primary ul li li li li li li a { + padding-left: 105px; +} +.tsd-navigation.primary > ul { + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li { + border-top: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li.current > a { + font-weight: bold; +} +.tsd-navigation.primary li.label span { + display: block; + padding: 20px 0 6px 5px; + color: var(--color-menu-label); +} +.tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary { + max-height: calc(100vh - 1rem - 40px); + overflow: auto; + position: -webkit-sticky; + position: sticky; + top: calc(.5rem + 40px); + transition: 0.3s; +} +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary ul { + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 25px; +} +.tsd-navigation.secondary ul li li a { + padding-left: 45px; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 65px; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 85px; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 105px; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 125px; +} +.tsd-navigation.secondary ul.current a { + border-left-color: var(--color-panel-divider); +} +.tsd-navigation.secondary li.focus > a, +.tsd-navigation.secondary ul.current li.focus > a { + border-left-color: var(--color-menu-divider-focus); +} +.tsd-navigation.secondary li.current { + margin-top: 20px; + margin-bottom: 20px; + border-left-color: var(--color-panel-divider); +} +.tsd-navigation.secondary li.current > a { + font-weight: bold; +} + +@media (min-width: 901px) { + .menu-sticky-wrap { + position: static; + } +} + +.tsd-panel { + margin: 20px 0; + padding: 20px; + background-color: var(--color-panel); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, .tsd-panel > h2, .tsd-panel > h3 { + margin: 1.5em -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-panel > h1.tsd-before-signature, .tsd-panel > h2.tsd-before-signature, .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: 0; +} +.tsd-panel table { + display: block; + width: 100%; + overflow: auto; + margin-top: 10px; + word-break: normal; + word-break: keep-all; +} +.tsd-panel table th { + font-weight: bold; +} +.tsd-panel table th, .tsd-panel table td { + padding: 6px 13px; + border: 1px solid #ddd; +} +.tsd-panel table tr { + background-color: #fff; + border-top: 1px solid #ccc; +} +.tsd-panel table tr:nth-child(2n) { + background-color: #f8f8f8; +} + +.tsd-panel-group { + margin: 60px 0; +} +.tsd-panel-group > h1, .tsd-panel-group > h2, .tsd-panel-group > h3 { + padding-left: 20px; + padding-right: 20px; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 40px; + height: 40px; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-panel); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-panel-divider); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-panel-divider); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +.tsd-signature { + margin: 0 0 1em 0; + padding: 10px; + border: 1px solid var(--color-panel-divider); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} +.tsd-signature.tsd-kind-icon { + padding-left: 30px; +} +.tsd-signature.tsd-kind-icon:before { + top: 10px; + left: 10px; +} +.tsd-panel > .tsd-signature { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signature.tsd-kind-icon:before { + left: 20px; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + border: 1px solid var(--color-panel-divider); +} +.tsd-signatures .tsd-signature { + margin: 0; + border-width: 1px 0 0 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-signature:first-child { + border-top-width: 0; +} +.tsd-signatures .tsd-signature.current { + background-color: var(--color-panel-divider); +} +.tsd-signatures.active > .tsd-signature { + cursor: pointer; +} +.tsd-panel > .tsd-signatures { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { + left: 20px; +} +.tsd-panel > a.anchor + .tsd-signatures { + border-top-width: 0; + margin-top: -20px; +} + +ul.tsd-descriptions { + position: relative; + overflow: hidden; + padding: 0; + list-style: none; +} +ul.tsd-descriptions.active > .tsd-description { + display: none; +} +ul.tsd-descriptions.active > .tsd-description.current { + display: block; +} +ul.tsd-descriptions.active > .tsd-description.fade-in { + animation: fade-in-delayed 0.3s; +} +ul.tsd-descriptions.active > .tsd-description.fade-out { + animation: fade-out-delayed 0.3s; + position: absolute; + display: block; + top: 0; + left: 0; + right: 0; + opacity: 0; + visibility: hidden; +} +ul.tsd-descriptions h4, ul.tsd-descriptions .tsd-index-panel h3, .tsd-index-panel ul.tsd-descriptions h3 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} + +ul.tsd-parameters, +ul.tsd-type-parameters { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameters > li.tsd-parameter-signature, +ul.tsd-type-parameters > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameters h5, +ul.tsd-type-parameters h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +ul.tsd-parameters .tsd-comment, +ul.tsd-type-parameters .tsd-comment { + margin-top: -0.5em; +} + +.tsd-sources { + font-size: 14px; + color: var(--color-text-aside); + margin: 0 0 1em 0; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul, .tsd-sources p { + margin: 0 !important; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: fixed; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 40px; + color: var(--color-toolbar-text); + background: var(--color-toolbar); + border-bottom: 1px solid var(--color-panel-divider); + transition: transform 0.3s linear; +} +.tsd-page-toolbar a { + color: var(--color-toolbar-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .table-wrap { + display: table; + width: 100%; + height: 40px; +} +.tsd-page-toolbar .table-cell { + display: table-cell; + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-select .tsd-select-list li:before, .tsd-select .tsd-select-label:before, .tsd-widget:before { + content: ""; + display: inline-block; + width: 40px; + height: 40px; + margin: 0 -8px 0 0; + background-image: url(../images/widgets.png); + background-repeat: no-repeat; + text-indent: -1024px; + vertical-align: bottom; +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-select .tsd-select-list li:before, .tsd-select .tsd-select-label:before, .tsd-widget:before { + background-image: url(../images/widgets@2x.png); + background-size: 320px 40px; + } +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.6; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.8; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-panel-divider); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} +.tsd-widget.search:before { + background-position: 0 0; +} +.tsd-widget.menu:before { + background-position: -40px 0; +} +.tsd-widget.options:before { + background-position: -80px 0; +} +.tsd-widget.options, .tsd-widget.menu { + display: none; +} +@media (max-width: 900px) { + .tsd-widget.options, .tsd-widget.menu { + display: inline-block; + } +} +input[type=checkbox] + .tsd-widget:before { + background-position: -120px 0; +} +input[type=checkbox]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +.tsd-select { + position: relative; + display: inline-block; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-select .tsd-select-label { + opacity: 0.6; + transition: opacity 0.2s; +} +.tsd-select .tsd-select-label:before { + background-position: -240px 0; +} +.tsd-select.active .tsd-select-label { + opacity: 0.8; +} +.tsd-select.active .tsd-select-list { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} +.tsd-select .tsd-select-list { + position: absolute; + visibility: hidden; + top: 40px; + left: 0; + margin: 0; + padding: 0; + opacity: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + transition: visibility 0s 0.2s, opacity 0.2s; +} +.tsd-select .tsd-select-list li { + padding: 0 20px 0 0; + background-color: var(--color-background); +} +.tsd-select .tsd-select-list li:before { + background-position: 40px 0; +} +.tsd-select .tsd-select-list li:nth-child(even) { + background-color: var(--color-panel); +} +.tsd-select .tsd-select-list li:hover { + background-color: var(--color-panel-divider); +} +.tsd-select .tsd-select-list li.selected:before { + background-position: -200px 0; +} +@media (max-width: 900px) { + .tsd-select .tsd-select-list { + top: 0; + left: auto; + right: 100%; + margin-right: -5px; + } + .tsd-select .tsd-select-label:before { + background-position: -280px 0; + } +} + +img { + max-width: 100%; +} diff --git a/docs/assets/images/icons.png b/docs/assets/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3836d5fe46e48bbe186116855aae879c23935327 GIT binary patch literal 9615 zcmZ{Kc_36>+`rwViHMAd#!?~-${LfgP1$7)F~(N1WKRsT#$-?;yNq3ylq}iztr1xY z8DtsBI<`UHtDfii{r-60Kg@OSJ?GqW=bZ2NvwY{NzOLpergKbGR8*&KBGn9m;|lQC z2Vwv|y`nSufCHVQijE2uRauuTeKZL;=kiiF^SbTk;N^?*u%}Y7bF;O-aMK0lXm4nb zvU~Kf+x|Kgl@Ro%nu?L%x8-yetd((kCqY|t;-%}@Y3Ez_m(HTRt=ekeUQ2n4-aRvJ zrlKaWct8JSc8Kxl4KHu+3VW1L`9%n~_KC5}g6&tFXqyKT-}R0?EdkYqCmQot47^9Z z6;opqR@7Nq-s|6=e6*0^`}+X1kg>CpuGnbpL7{xFTa|8nymC0{xgx*tI7n4mTKZNA znsd@3eVsV>YhATuv~+5(^Vu4j?)Tn`{x@8ijIA;wdf`+0P3$vnSrcWFXXc{Lx`1Z7 z%-n(BM(owD$7LzqJx)(f^Cusecq>OW z=h6n4YzSVM-V!-DK(sLT`!W~}($=O$9|ie`>_fpH0=1G1tiIFw($?~{5T>`74|p0H z``5=UydE)!CiFvmECW|s^TzG9*7pN|KknkVm3C{fEu30gffX&8iCm? zTFPm6*k%Hog`Q6JGj@dg9Z5nlAc6ApUe>;6xauB0-u!?wMU92jVL|3EcP9gEu5^wH z%tXRy#>HCEs*?KgMf73UcJ!lJ?x<6+)eJ{mEIS|HMDP7(7!(< z@X;?ACT8mncW9*XIaiJPW}Mw@b0W||)!sYnLw)0j4&-rXQgJhnQ2?frg1Nfk&JpmV8F=dDZl)e%#Grs|&0th7_o) z?7hQn<1078qcq?#;)CH=2kBBiGt37EtcXfpTXtHB59dr9=B~jI`yPm-Q?(ys=ajAu zGY;eS^z&WFvztZI3I~}*l}_lI^}6D<&CZ94;|&G9_pMx!C~$~EL4^8`QjT#|tqxxk zhl4CdxppbDiOk!Ht#SVAK4gf6Cr#=U&1sVxZ`y-X zTSi#@wHf(?(Dd6ypNOyshRZ*tneVP^W?y?$ur_!9iD-vY{&Q5(ooX2;`SkUjwEYA~ zwGcylCT4_`MZobm(0v$U(IhfYXxyjNJ@ztpH0sDmfpn|LMp3eM(R4uqKi_q1=D1-d z%GdV<&2+_9k@sc44xhIjqktRA2!Su|vzM0R-@#MK&{RdLoU#$Hc?{{JItvX{hKCtc zQNqZpkfG^@LGJRZM4H_>`F=N;O*+_`>M_ko_XWCgu@}ntqLX8VSeZQ_25Z8|^!d?o z$~}~9|`ZW9d_o<=8&K^~;Cr08b;qgq{(*e*sNt00lO2lZ;m-b<`Rl}=Lr6iQ8+$&br z!RLn{5a}j1Dh^|_1)Q?<;iBSrS0V|c_D@3}mc2d!%tV1VN?BC@clkFdx?HB&9KOTF z)9eHpmUEYsCqx^%JHuNdwY zz9P3oPYuTAXZVY}LRp&2qNl$pbsXL1GJ@wx?@CTO!acs+OFfW_U6?&As-(GJED}RR zO}B+Kxph7aUUm>i3rbPZQGXN}oQq;u`yTnFDAJ*d$4gjEJH!JPyt6V{cOUp*Jbyol zE$8wh)T=vpJOWRbv}HvR(cUSlO}ePIPdJ`J@yp=IC&E6K%r?QfW7F&%p!H~@?%yj5 z&MpiV!hyfukD56A097f!0+ANt`JSB~oLak75oKQN7FH=rQbX#Eak37|4&mqp@S~TA zOo51)xQxX}5NQ(3I_UeR4B;P0Q#x$_lDce78ET`Blo;`Hj*R;b8slZS7Oak(LjDuE z3z?-~-U@vWe*cEOsf^9|duH9};Pe)!=Ky+QQ!jr2VV-jMUH-F>oB>Ds zDJw}jm%V?OT^fu1y`$`yRdaW03L?)6vmInxhAsGrPhWIP8?=speMFf9Inn4^t zs$!88*B~c1A2J6t0~hgK2BJ_Pl23l=oeQQqjI2(4Mcv6U_#9#$PEN|qz36rCZ5$@I zNF1LpRe%ZG4qwuYr7ZdaynrPs?spt;9VbQM$462zbksMVhAOqPunrR7@Nbv#5;VKk zJB7xC?~QXd(e9REiLixHxRGhLcKR#0va}|LMS`AXKGOIGFKQv?=+>zf^ zN5XLjX6^`zh*%1UG_QV1H`@z!HZgC+OT2`+_B( z)J95hk;3C+K4XCswSP}au;fx=47~*$k`RAaYEU-qb03y0#x|&>LAeiXgri5E(!h9k z|9OVt@sk1-4+>0?ELyw|zs`~<95M=%o?Gix$?8z4Gz3Kpw|b>?BcD&s{X)-aXg!GJ zyq&`ZEP{K^u7ActXP$gGnO#F0Sr+QUZe0&d5*Yhw9A?C4(Sx2j3QKAlUpkQz7nji^ z%y8F|W{ypj(T%Bf#Wgyvq4szMo?*U-;3IGBRg1fK9!h-=YRsZ_+t~2!-)=pr;)Vnk zmt95&wMb02toOf`I9>M^Kv3LqKb_-#jauF&cGrWsCnMt?p7*uh zevugda={D04DB#7wR375=1i5}Z9fi3r)!F#7qmX9`SjppE&%8l8bKt+ADRMTWRv21 z4L&PldV8YpHw3b^`p0uWlIm#J&K65-y4lQW0VzZR!4#gfeT{b#fL1e*)Z*Ux}M^}bO%OM7uXip_4! zL@yo@q{utZeVV?3CtXs}i>nI|%26fwuzt0f#96fQ!{=dEX^YKnvIk*D%y9Cin;9R) zi{?)baJhgFs$1$SOZESTpldw2H&FD=v*v@1cA!`|s;avDKHa>Q+uJ8qhy!9%C4&lJSTN4OeydYOm4S?Bj7*e{xRYbU9Xos)R7qZT3dBBD5{ zo+(E3pR{>>)}hFhE+}!yYP0V+CVhyAq+RV{^X`XA3{iXj(ir$k@u|t8ZJ1ZnHq2dd zD$0RHmGJ=!?T5`*T2zOEJ~y}Nsyt7O)%+!0ulRQdsopJJxoznfpusv=2@zLXIq@^& z>0T5k4lzGCG(DnltLIe@6=ZOG@C(dvmYXfh4IhJfMfY8S?KkT znb7~EDE}Yhg$J1LxB7m`L4VMS(+(SXTQvh_mz!x&M3-6Z zFRB*a%_gVEqI^mL5|c%V=l_oi%|~h>gL0SB4QH5uonWd#={KPg6}6ES)zk0~#3^KJ zJq@{iqbHe3gyC))jeQ`W;(u3|q)JxuF24|GMsh%v5>>VY-bok%* z1Yl@(5G2UCK=fQck}pAyWV0n{`ML|rsl_N7vmW|frii__zB;ozrQ7{z)y}M^Sg@m_ z;+?{q3sUZs3WxnBbp~CyyL(TA?C*0KIeDPp7w0$!Ijd+M8#}r~vYW)NB*$mG*7-vH z@s^wK07OMxq>WveCEQFQ*p&2gjD1j%i+#G9z##Th`gew>H5=`RwyfPDg2G%f>x3@c z14Oy}pQK?(i06GWLWu%4cGjDoE-tTEI$`9^E?nLT663vu_>6K1e!N>A-^q&tfl$0& zy&>w~+yUelAa!c@xd8iyt^`B^$cj+}h}0i!40K2Ve1KFCDezBzZO8@=k&r)`TNTJ* zzF4Pim>SYL^=~7kW>EyiVHXNMT2)8l#v^IW!pLB_8ZvVfK&m8QHkjsZ)mvd?o$VYG zX#HiWwWlW>N{D85URJ-d)}_3h73|)X=E(6hFzi#TF{$4aSka4TeY>1a_(RIkFBL#O zE0_FoSQI)}+si51ufAqRHhDU=actTRQl@y#2h}xaDv-A&GP&0Qu9V4ED5aWnX z1E#mRT1QSvL!4~%Ozt84nP{&F>VIm6w2q!EPhh^BF-94$4JhCTcrdbDXA3Q&8mPTh zqdPv|X}??B?bIZPpl}z%(zr<8U-NoXjb*L#xyqHHfpIGAgN$5i(E9#rYPYq_tISC4 z2TDkd*uZ;CIhVI2o!||T)Kz`ER@%rTf-&SfmJFF>;d(RW(B6k!1<)uxHM_1G+9BWe zc)k`gBxYMcztqY5@jccaU)CqQ@^G5TBVx(nNf2}D@);3+{D)GzyT{>%dO6ibggS({N!!=P4=M8J}5R*&fgd(w36z0M0D$ z(SN5a`i%sZ9vmaEjiC4)DF}ix&`?mc-vYwK@+}8Gqzj6r6y)lT|Iqwlpj(LXqvh;- zb>jECiiOZ%&Q7gQg7(ix-?-RE*c(O6NG0F-+VCr;701@%L~fyfHnU<;Vk`m3A2{1MSmpii@G*k?KDq0GdZ)|hd`8OHep z8@6wv_|9NKNpe*sc#?zZ1S#}*qk{k<(I99u6(QT#>wf9w^u9~9_>;2d20T=^g-;b5 ze9x~fHZ-JL=J`hq-;W{2SgN)&m9RsVo=%?`JYp`pxEA_>`18Y>XA$rfWm^pQfG3MQ zxT^I1*({tZz2}+!5$AyNUE*jiYwu_S8v<#qZS4e!bGGBdY`3RkgLMf%Kz8s-;7PF+ z6w#-FwV#)PiKGR79miXmrDyv=ZTjc)j>N=&h4F+#G;unBZhhZz?a*;8@bi5`fV4)O zuU5pCs;tvRzbV@P5%W5xLI4I+w*^KExeVlzP4kNRGp-wi3g$lf-I|(o`JQ|u^XfkP zcik+g-5~2lG*oHfjLCpfNalFwz=4ZY>$Rc-QGpws&tCfFZUuJDL)3et%ap*$Q=-v0 zgLfsn-&%#+wnox~@)6ppx30sK(UJg1dCAvQF&}DkoPI+uX_wH))iaYvWtl}BtVKpU&MN= z0GdENbhdLgIwL-#_phGK;mZRlk4zq8*)akvV5zRX@jFUmvcr#3p99P@4z@m|bz-)^ zbZl8Wt?hR*z(sEZl;2PaILIG#835i@YoZQ@EwrD9IOBl7BpJX(ilLgcd)KCZAzo^b z6Z{|~=H;$D2dD53tejr_jx7^y-zT{SNZpNjn4+wJQX~K#LcrlKOv=D5xk%QXD{tg; z+xh`PvMV*HC*rF?xyjK5@KsMl5*w`r@wL#r13uFpso~#^oYIFc^&gGNS825eqFttU2_sG%_ z;X8VXD#Ol4X&$2B_Z$*&-)ZIUXf9I%mOOXJ3O%GbGpJfl+9(jY^fF_(b!Gt{{HAA3 zusUOCPDHYT@&*H~7a050c7r-_CaFACp$BXx)5==@fC11Gn|n~~+u@6N-}lvdyl3&6 z<#c_zm0Xp1F!8o2OBbFfgzzC4vno}9XEf40dGaVo;jiwiazo8hZ~iPVD(re=5k;H| zotm286$6nnTeIw>1FY$Ri|t{Lp?o(Fg3g_>|y~Z+16tvyLc@r?t9g7 zBuXyVuu9bC#q`?@OFIhgS)6v^XP@H0ukl2X!RPMsg%`YHMGad z4{VsgxaprFss3X%HbZablb6IdaNdbISVWp7yQXPPn=s7?J9qLEH{4>XAv8}%h&TDg zs()1sh}4at3nL3^%q!?P9BbW80e*ZwU63}CV7pt}gVu;~V6c$9p+*wfhw!zeE-z|V z=k{Ksec2)$Hu&?pRh;*TPk0T$Fc~^oAoBT4q?-Q}Y&3DluXeoMQ0LesTk}pVlf5(I z$dl8;zA0&=L&z*F*H>W7IeiPhTo@P0VTB~vyC2Bm7lCN}t7@NNlKFSHGKkh?z_qij zoYju!#D4b28cdslLdIM5Cmqe&!v^IcRr=qq^?l+P^n@6}fh@)IS81hx)SPAY7osk0)^ulqC1F*{hBNQl+Y}b>XjVXnS_Cc!L zIZ@Jq#mp^E&fKT~t4DM_^S17R@YJ@`(7;zv1mz_Y=~q*Gdg#*yXGxotY=#F|lvhPM zjlE)VHS=8=)njE^c7M|ZiBqARx>9Ib!y91$70iC8jPi$c+ysP}5Q3s`ti&1sx>~oG zI^>^1onS%G`mtq&)cZ15dZ{X^#MOfatyH0I=l%Q)n z7*@kZtC_3?=J_}?_G@?F?UK<0_AhYFclyrS-PkfYhAeVHcF z16x+quy10*2V$A%p_|@C(vlf}j3uY83h(#TSr$(;^8(I={_=YQQWmA9-IlwJv>tQm z=vN-I{TO7X`;qBxwb5w$91YLV?ZD5}pddq(7IdMCH zi>`qAn|#FITi!L5;K!(tYm9r416}Wof}P8~?R9I9Gp(?VA;uQg19MO47*gS7fH*&jBO!+ zA*<^BMccHjJIvGHguBb4a`X z3aZw#!c&Xr8&szD1+gu&;vYfoWo>0Pxfr2%m34tC33fmRbzWF9I_Pqb9nNK@N##9_ z7K)v)des!^owH`MoXY_O?|;^9;comiPx0e78xhnnVvTYt+t+cU1rn_>gaFJsL-iPn)?<9P9cF#4)7q&v+d&6|3G@s-AcJy+m zE&u*GUaMK|x|4GmT(CgBICk`2BP@3rqtjKIRD#uBy}y*d;<>`?W&mGsG;i*_}V&^tlP`%;=g39@jxP z+3lrtg*!i6N;irOpUfKcd;iDl5a`<#kr8RwFm9=^m+ouwwjcXmTB}w5V#9IF^&Bl$ zr1$Ly#cQ<3u86>am9}pk&i%nxu(W&s@>qEDtn_xVtH-_EiQ}iAK4Ssfsdn&L9t=)d z`XOQN7*J)g$Jrtq0=-yeLnHg*23LxYA7$cxz^Yc)I6E-!;{LQwu_wfGw4&MYy7{n< z@{g0Hf)N5gAJKQ1Z&HGPn9x9B7U(m(9K&=+LHAc_D{YdMBZs~x)u1Y8|Oq!`C4(3_9<&$ddi6>R$Nsz z*ti?=jA-Sr_97V}feo+}Lq3-cfpgWR;PLI8s{ve9@?e;2o}0MpquOucipz^DrT}QH z*(<{nLb4h9799hx4&%I8KPj}xcQ}llgcaG1!nRb(PP?m)=CzA4v%6>oOe96H9 zv4mUhw`>V$29k?)$Co>qIqq(~3w4jJ;Hv5(RxjB-j_iEhlF;&|DDC|I8IcT>Vn;RY zhtw5mT0ygXAu=M%{^;GqYuYIMu4H;Mj--5CL}|zMEhOum_o51Y7i|D>$XmUFoe;@1 z%GsTUsKgF4w%-Cr3lg#~h)8;Lk%WQTLBS8r*sE{YBUDw4HU#o}E)8pVIEfWv&14?U z-+Za${OFm=>IA358en)nB5Iaqxw&Xi*ty@uDOX8o2c0tq0^sX>ZXD+Hn|;KY!Omm1 z^%wgf&Zy9Azd?vmU`~zuOOA0{TZ*mAC!_>|avcN83F#c+sFn_6tGo!v?95IUR2bL$ zlO(OlhszqAgy)mNt8PRulC#6u^SL#z-O&@{=_!AzBZ>T4ROorj%fx$A;u8u>saum0ha7p zeHRX-z)PW*@v9bruyAtVI@)PhaEs5kp`xyxTQ`U9$Whwz#z$=U$V|&0w@EfCUS!Ob zACSTE{VeC-0V~ZCpkKq~P4CLgdOeBy>vB+0ZxIt_Cp4aa%vI#LS^K}ui07WNo}5r0 zagMHmq-jqTf-OD<kAvu_ob1mUP%1jxeKqB!1&-)_hP{p74hHE%WM!atyx68j5b zSqwh8aKo|NIOL<2_eiX+iOsRP`{MUt{0iQetB*SL!F_8)_;0f$iJ4(o__4KWuvy_! z8TZ{dTb*rL6VmuN-yl2Z>0glL84u^jAH^DQl}VRI=x0CnuF*|;|My-5aPI;>(mo+m z`nyEOe&k$RG11$vEdDPG7^raBCw|#C*4#pIUoZJNx?4|ZC{)l>+jaSiiJ`GBKf}l) zUk1>%A61hqy!KvfRsM^|u6vwbH5WpfH(I5AdpBAg%rar%zW}nccGxfgRV4&v`tEoGyBq!uz^f zVqWEtxn%j&+Q2Fi$rL)H`M_HExP+?mFyN^){c{JXs{IM}f}p>7lfD zLZ;s)%6a(Ow@`(jP}k~pn@!dv6JhJkZf5UoumHv`g-tcCs)w* z#0sc%t9@Li{p}f*$vg$UiQ*RGZUr=ykDIaxRDU_(QfcURuYrpX*7IQcS$(Buw%VW7 zxaffDgn{-=K@iEh)LlPc3MPzc+qM^>RXr6Y8ASnP&dr6fqmwYILTpmh$E%{Iz%Qz( NZmR35l_G4O{0}dcmS_L~ literal 0 HcmV?d00001 diff --git a/docs/assets/images/icons@2x.png b/docs/assets/images/icons@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a209e2f6d7f915cc9cb6fe7a4264c8be4db87b0 GIT binary patch literal 28144 zcmeFZcUTka`>%_-5TzIqq$xo`r3nZ`iiBRG(z{ZnN$)K|ii-3S5u{fmRRNLEoAh2n z@4X|01dtAA(50@mzH5K?{+)CF+}EWTz2eMdW-{;n-p}WG1C$hCWW;pD1Ox#ad~k9g4`y4!oVfq@3c(iW~uhy*`T7_0aH7`>`EnYuXVq#+YC==3#rnNM4TqqzM zpi2Elr!3hl!ZdK#y0bV+yVc8rwFEtAX3=QlvJ&e-EsBp)Q`0yKXbNuf-yYw7kh0CD z|Flk1UuHgvoR+*QR0ee&IDUfUzE7*`A=P$6nC;BPI@VJs|F#`Xc>X!`<6%M7XXNok zw^unt1h0m>-&2{GiIGsByulr92XZRrazZs&&M3jJintF7A}cE^uW4zt_r81yHt1I! z6-_gmO@78G3$})kfyhR0^qk?zev_%4R$qSjQI3MAg0)9EM#TOAD=_tf(*)S$7yiiR z&5v>wk3Bn**iD9S_I#2%^vi(^O+gpv2i^A);6^AcH%VC>0nH8|O!jN*L<#RtT z@aF9HMNu*d(BdiZq(LBO%(qsjSot+ZXQd{zLYh#CvOrK(?#u+|XYRylqcXOLk=m!) zBp`~~1dg7kF(Q#m)I8ZHMOD5%m&U)5jGOW@7+sm1N+O~^j*zRG;e4x@OteV=T4yo9 zSG`^0j^S)ZYp2DT>}AR|n$S)4FPI#8#(R~;Y**AZ9`&yqT;p`rks7Nhz;)dn-TgXU zw!^Bo@W6|jfp@}ijsSEFo#x3LnG;`o_yXK@2KuG8cTv&K@=dU?_PK*6=YU9!Ix8l;<_!y*Qc2phVpLM}&t|CuHBv&{M$K?VXtTabi(7kUMwV zl!>5cDNNqK6`Br*B~EcVh#5Z!FgiJZBN5nzpC7?UdAc+&AT0ivd;DA2$@YXMPK6=< z+#U~?*!R0i`3uu|#zDrRRN&j-j>ZOu#h-n#7WO^)@0> zCT6a$LGWwFLcPfN=(3#6`*UIS%uIT=LIXV-RbGE&!!+8)q~dkx`l{aKCe1`{J<5&< zlhRo;JX-UC>5)X;mwR+W96`@&ucHp$jIb~B_w_=mH>In?BLume!Wta=`ca+&7~pek zBVD?f5{nelCaje~EtZn+g3%5GJF}R_b`q}IH$Iom2IRD$^h*R)Cid8Q5~4Dzm!P&Q z<`iI)4wA#l@TwjPL)*9k5Vc!!;`9;bf?HRMm86wi9LI8A%*NGep3g11H{aP)>%l2Q zRMMQU!*0J$hJI5Qs3b=6?}qR7O;BU%Yzufc*ZKBV`}ro7zm=C?OY6Vlabc^r6r7P> z?1c^jD{e4n*Ou441V=Pd1eE8utX@)G5gq72HQAXLZ4l2wKd@yIYC+s) z-mu`E`kj=B!)a^B;pecv4W5oh>_tpj>^NU8L*eH4EhcOxQ|);$x(z(Yb5^tudSptV z%8z{(h@_t`chWkvFX=r!p~Vjhf1AdM>uGK05$1fyLb5D7m0!MUKW=JTZv)bXz9~*F z$yP@U3UE0=$;yjWr8b7C(1^oNDMZVxYYeMtL}ZnvQDkm>S0)=r_ugabEZ}AJ<<_Fu z{I^KKIz+V8K|pK811W5r##z8^S*2fr9Ln zlRG?Zzz8;xu9VSE8s+=(!^TGi1P2hC7%7MUqF=cZqFBtJNW9BROV ziv0cjsUmVvsU^X!`1UivK|dy+fSG$3YH8W0`q${`)taBT9jV{Hfh|&RIaJVvqRIFh zC*Rmvl&3*;XcMiJZ-+Mvfe0xN4N?AvJeABnNdgs(BYb!fK5<1)5UvM!Tz4_aojmUX z#Ymoh)m%fN(>6|#*RP~Lxt1?5);w}yT_lftje3sidO&MxNgcMg9@S+>M%s~y)0i`8 zT_+7LrZ~d<7V^K^C^~ast~@nM04^c5dw*&660^p%^R>n4xzd&jo)Y@ z1r=F09>jFOr%wsj^a3;>N!{rvf(qpkAdWM*5IYCsuwNwoJh7;9I$#`T6-NUIEKsiS;OylQ(XY zQtCiR1dyEGJV=~|zaFOEveB&szAVx*wsyuY?hiBGWR{h0!D zv;G`;F9cnib*YxugasrI^%uy@i)>BvC4V8@! zwy5#iHC#Qar(i0EPA3CuMQbaKy4m$CLjLSNwJs!13b%h{&x7479bv{SjC&3?SO&)3 z6q4nRRP(zOfw-mQrmx@Z64~o}GNXa9YCE$vD-(CLseaF%6HH+WZz4 zbRiJ~zAtA6*i9;z!+zZ?9~V0Lr66|Ae;}U1e#6D^hMhB6XJNHZi{t>DgU&jb=#rPK z@s04Hr_SOr%UCRY_SdDuSw^D*Rzre~4PCqgc)DBYam}@G^TxsTqX%w-yWtYU-Q2IX-a2Z4Kz_-yIe`m;x2bY1F?XZoIH=`uW{$R)ICXxqU$- zG#M6s!fDZwUOA_cs|PXe1T@XN3^UdYyR*t}943A1dTvXp!=%8c%)(s)5y@OJ@@%1a ztlq}Uvhfo3^ZO>ZO|NKfu37JMRRmXfJ_*VOBVnxFFmbq!zc%A+R+w|={11?sJpmca zCeCi;;-*yO)ywzKxa#q?E%@U-+LGH4{=2|reRd-Kz*Ps1$u6sPFO>{K9^k2Y!@=h7rZt472^BCU& z|0MZmbh1HlC3#bcjoX#m73R?H>6oW=45{gu0$S>j`v?``ch#0kGur}QbO_gO3XrB- zS4pz-Yrnqqt-k_LE-&~ox9gd#^n&HE%Z~grM;N@Das8-#U304PA$v*rj36j~qQzYN zsX>8?%q9DhpxrWR@M>30YI^WUDh4bcn+*bYn;~zt_g`$3{#G+=lBmWE;j}5e&vlDa zjsdE(Xg^o(Z|3$Tx>~-q5NrZ}^$y0eMd|h`7Y4OWkgF0(Cu&CfJV03AKfzSGBhMU4bqd4kc`qE!CH4Q^FdOCtUHaZW3R&>S}$! zhk=OYL~3fch$-?wa0)OEkynDzJR=vc^vuUQ$hF(>E(q3{7{4uhC^f@bzHUZT>k%%R zsekA}E`OlGE(x+lP1smp0;Ba7{C$F=@Pp~i$AsJkc)x+3Vf9xQB=aSN>D!T;Y5iU~39#6yoQuj6Bj%kdYC z`72YjnSoF_A)d#@S`|;~F|6TOn%b{4?MWJC4uG&NK=D zqd0rU$A@62MtWD$=Gg>TgO6)b6Vf41#Au&Zq<@p1RG!t}NG8kv#>%{bHuCdAeIao2 zkWX{dyO`XCdv`FlK?jS{48~Uaz;oD6PtoFF0u6HBTHCHh<)5wP<r?9UIw%{psu)`l~*PK0?1^oH}d{D_wF{En-ejdBHTK|(*2$K?xVkG zwYXl8^HAjVOqKQj0f6s~O`)Slp+alXd8@#4Iw?pHys|MW1|l%ipCPeN)|fLB$Dc(9s}LNw@?8G{ zU>U(Vid5}ltIy~zNv>o09)rC()g8O`<5~!qF*Z_?L;+2Sy!WSv=}|67mnOPb!A*2; z^f>okkk+f3+9?Tg&6NBMX%;BtB3Ds#(PZ6E4`X0e`~amc=9QGw3J-$!nw6)l1A8;m zFdl>D?g@J3P-41+3N`R32d*Hq0GWj!{3n&rVA)dpcB+|5`XZFFZI1bKA7d;-x=0wt zy;$6nvCJ$_&JDjWa%`LQYq&(6LqBP7G_+`+4$|qk7IlS4wK{qnP-3!yFO%_fw(8(Q(#|htD?ECEYPeT&anf%0GjGQC<0)vR3x=4pq`@gX z{0?*O(e3p_zu@N9G2O%!F8j&|FRhF(c@BWMxZTpdW0xv^K!`2L39%+Hs0#R>a@n-J#u*kF6~?DIhPrUi@$pR0tS?5wF%PE z(-eYCc#{7tVRzd>j~xO&LBPK62xxwmxrdd{N6!G1hfD0H?fV)_B^PBIm|@~CZXnpdaM=<+?&D8Md^RL00JfP zK|cm@`4bB6muuN!Zck2>k+wh^8kM73#1(%6#^TG;42H{?eTC(h^zB32g{Skc%t3Dn zcHX3$TQhR}n9xXCd$?igvlBH@ZU~p4OO*Gf=$@=w?9vYs)!RYa9V@}xVt8Sr4y_!< zGjn5?gnlSKhqS-YW^o#@NScez6I3x{ zv>meTLLYSK!pa+|kqQI8rWST7_)jL~mqQ}Ou*!V2U-g|ZR+pB%Z@w|HnZrV~uY*w?_gMhSp+4fY?hMmdNXYD(iruAlj0&qga8nQ1=c#y* zgYc@oWp>=|LQ+s})zQ5kv*UF?QMJ2|FN1CzjX$x&TwGJ!4VjOiZxVDVz#r28{^WRn z{o1SYRs*^Nt9(ZX`wad=44v--X~h#aROW$yKE=n-VWRfhI&wn|_X6(` z_WPK(bt4Q8gxJ=b%BW_nNj&h;H;2z`{vi`~)tCBk(zGYBp?f;(Ua+^@+rKm53ld9S zPP#A^Wv7>F7c36IAp7(%S716|mr9fnL?n&Q*?OcmX7>@shP*98yVXmJ{1{z!s;@_D zt0}M~j-0t@?)wY>a9PxzCVtBiTKiS1<;-&hv5CHiv=8d$IOnl?aI_>zR3eW}l*}`T zd7%jWK1w(iqAjU37u~dz-4@O^=PWhD7_yL+z1;-hnPx|je;QFR?I_x6McEg|;`Zuf z_}_7>V@hb=%%^H&>8W{N&Ud5bKD%p(B6#&l@nN^wOdQizb`@g}g1c|qGqGr^c>a1w z|5;G!BbS8(8#mlqM+re6&;L0Ba$evPxRGW!koG@-z@*c+8&^U^7Q+0jgUtgB$)Bh)OGD5oa(ju zL&w{}@q-4qVXtvRtXul%gWH0DxXe$&?MN>z2jh1!ElU%a2;fz@xaTyfs`lnr<` zLv5teGAw`KJIh))Wg8JzoRNMyP>X1rhr)=#Y8O6Nf7>}xLS8!@+&6k0h#H>Nn{`&~ z<h^0MI*wtWWT)UGMw#$-to|sCF?yXL$;_=8T>RsAI7ks*W{$R-UI&M5a3{Gda?9J z3PeWSws3vp1$(`F*+<1X7B6hG<6u)lqr|?N&1Up;Si*MeoRFeRNGZa1=`C?4ZaPvJ zuHL9EQ^d$jd1pu9n6iBgWPMtJyxmfJGQf{a*eag-%E@KZ$^*2_&F#h|LL)2_l*QS9(#5T>)&wtE8a=@FF+vG8N zk>*kU^97;}tRP6EGf5HKhlr6@^Nb7N1`_>QnnYF9-8tncspx59kcfE)TtFun#cCjn zEU2;}6Xu~xx+Bv+O;tKLcuo?~kQbcPghcWdz4-^H!wQOhQukRZRMRk>kfMa~V;A;p zSqpR3D87(4X}j4Awfr<~7h4dgK)pzpZf{bn z^yt`yH4+85n%*$3rL0fWi>l^4|J{Qess(a2+0W-O>gl%xIaVi`l9N3Nq}{$Q?o$#6 zP(6};On20~O*x}!V+=9YO)zz4yeTv@_04tEzA@Muc((5aTR+rHpa6@RymHX{a%Ss{ z+ZVey@TSCpCZq6G3WNWPfd3Z(|HlaUnQ37#)!hnd5VH}%lQbK+^qVrFox87bV{eTd zMjY@0wT+?ndYzV$vST&K{gWpow&Zbq;%=a$(B%@MLh@v!P|L4U zgM9JBN_Gb)g+}3@K$8-*b+GGuC&@6v)Fomd?4){kVQ)620*%U<8saNfLM+ndN~1z> zV$;~rU}Fc&M@|;i!@q(ZqbHdoB(EYYOs>u5jd5A-M`}}pr;g+_B5o2kj-|Pa zF8qc!e5d+kUV>;ih=57(*r24g=6@)>+c%LfGLw_-Bbm7r_`az+tag}5rqG&jrg(-W~CJFkaxZTf@_Ofx@ zzxqF#<4|HKKBpc&B9R1r8t{!k_=WNfzbR?aogs939=bT|!c4N>91ai-wsc4|JdG9y zGpB1A4i1ueuSS{R3h}0^YLpx`pB;Ok2-R5 zZzHya))4+|xc0QJ*&1>3;@0$RcgE3M_rt55cZ9<51j!pV&i`8js3v%e$CG{I{X+yj zruhC$iN%UA-Y%u_?FQq!rBg;{`8h`ZCg^bG&OC=733*%4cUW`DPGqp|OgNy?)-Lky zuY7>yw$@M~Jl&X?9MI2RqOdsWZwzFd6{P)UF5-=GVh z;$}}BvAUMs#V{T@TweGxI7dhuIzFqotm&oQreos6)^Nt1G4l8ce%&u1F<%WFM9t;W zBAEtq#1FS}e7Gq{9nzJ-0@1fhx^+w)&5)h+@I@?kv+h4xs>`xqTMB()kR)QH0W6ODL=b|ea)CmcTzPItT=KH66{L4@p}bW9=F z=+(cM#QUgiq$M^X08=_kUPU7sf!8j#4rN7NO0#TX0-;8=ySO&T7v$C}*`++cHZu0; zRv+{Je*j9;z>+TGv1i76Qc^1lu^>XXp&w}t;MzI_nTpY_m?O?J|UF!?x>j)zIZZ*}uTg|S?56^~@P4iEAwq#7&c^D#OmVAeT^&ib{UcAER@k$$X; zQdR$NNz=G^;6|aY!VuP>0e2>_I^ymyjmC*~Oj(aU>lb7XxoNc&mR~HbdffiYw#m3DLJ)nb-vczmSGI=PaP=yOJ4mrW01pSsP02=(ym z!R+#8VFsL>Puje-hBZZ0gY`?oFt44R6Z--pJ~w8q7te$W<+z`WB)mKtrOR>%f~{*2 z8>hh;3|%NPQq8-xDbWw`*n5*Ni7GB0zr7D?q`b1s^a4*X%Jk>EYA*r$va{t*S$Wk8 zL^lqaL9$a?PVadKA#e`-ocbsFKC1awpXsVmMxs^Fnz9Tb*6tD1sa`;k~@OqRo@ub(|hVwu)j^O#EQmIetE!ma(-|!O<`ZRqJb<$^dia$W5ARK;F@n)=G zXY|L|OhQ88G?ay6&;=(qqYF;O$NJ7x1?PPHYJC`UButfql;CF9^Z@N$9e`rgvKY7- zzkY{r^gSjplQ4S;+v7}YOOB)q;im)xJ8Tb}^>Fe{+E{o<&QW1zc~g`vO5=ii`UUW? zZp)~%d!YRLs1P5Gsp1zs3gc8)u&mU&?P*XcG+Tr-__K7L+$}7WQfV_Ngi(tq_9feK zK+m&sYg9Dt?NYYIX6$uOy3OW4i<~fWv+Cf(7LSO2Cy{IK;1#Y8C_5@I{l+TY*=I|v zB849$N`$Qn3)Wezrk#N{(Sj^ujO*o{#sa4oD_O8zmLim4B{5HQWLd}YpB(b z4G-q~15C`KQcuBSO|^7AHPTM2RneHT?`cv7UxhiJ{_{;Q;kGe05x5xg&K3|_>$pD_a&U>aXaI13$(JL50d8Z5nu7>Swu zA*$V;mYnn2)kI5c`a29y*`L60#8U8YzlVb^NVbZO*AIlUcC6{g-vYStoB)oYa(>HrRpU$_+Fu$?E^-+?mgq9i+l>lZ?b zT6(Rs*ytr2RlqzPAC<(}aFaO~EuqFiP9Nk%5YV?9#t-?A=4jtCuRhpfZRc5{uXo+q z=LI8vUYPpMT}NAmAiT1T|Lra-gEjft1a;1k`{Oe~KvJy%Wz~FR@vzsl)Hj`G)zsap zD0(^YuCzHguv&0Ryn%gl!eek+ywQej&`(Qef(ql7EcAYQoG}tAUY=Ns0uhUO05V)*ND z@*NLrHqhR{%JlU-nMJbBbn#Q$0gDOt;1glG|M6dhX@zoq#PRvcMk<`}n-dBYPlDbf zY2&o+<&J4^>4Q557tWSxa)1M;mS}X$!JFe6+N_0AI?erp9CdjDGuyvnelpc04y2u#n8-PU5wo6P&9?ZpnONA+t}Ucy z&nD(V>H%M8avRC7jdV$uW8n|L5W6kw7|(e8$j>_ZLqe`6y!1fWM}{tJ3t7HmzB894QuSOpNj=&WDT3e5Or0)3wFwasb4%9_M@6)K z&l3J-@<{!8U7lZ%P!XZsO|ejU04NSjBEBESP4Ff6+T}!&pxTCxBG{W z{I$5gyC-P##k--2l=5r77AsRg@o4?Q7zqe%7Y9-kbSnK|KDcKK;nZqb@o$i(QzUtW z4FlkIku@T67|OO;)}XWaHSwT$i->~}#O|Bld^q?M%%`d*s2x9BKP zZo$OD?q27J1NAg#Nd(Fn?4I|PbI>nwdR&!F6YOHC^L#n$QG{zQGnjL8QL{~TyS%sy zMT%4c%BbJPXL6?WNg|O1-c<>qUm^=RW`+5)eH2jAI{T^M6-_natW57V(D?*MKT4n;I#vjkQ1Y~X{0hj4% zF}qYRzy8zJX(%d$`X$XgPvDafqM65Qw_;|~(JO*m8-*q1ir0~W4cd`@#KX3_GEp5t z5?rPAGz%$L?%(5dRFgw~R^|tdxXDGF>^=J2drvtC0;nBNt)$2d+>6A}c}i_~ef`fu zywIKq{Tp+H@09h2i{+Dn7?p7~8D%gZ+<(bq<1f|tL;Qy~w3}O7WX))3Ej+(psj!1- zrlt&tNKU|u?sySN{!ByuYY@P5bL5@7&Uld^k~iLzJaP7WDAI|JZrsHHT>hmAC?xw& zC!c!IBNTzL7K;wAXR3vVTe1i(oYdqoy3H0Zw{@>?*4UcFaMCNHwib2efs0(Ync=2q zwM72#(Cn=nv2ablw^j({)fdng^E-(uP|5UD8@CzqpKlZ^=HH}?5{kmM7vLAoAatc; zwH5KZJkkdhh8C1p5+HZgC}LE+Xu}KIn7|*#?;j-8^-VaZ5jOW{JA#*;g5p`(xTiDd zKkPnW*IU@QEsE%-JWbaZU2+aF3<-bfklBU}TCC{E-~c1suP&!}=v`e&X_xF{wro+L zcgxt?1af+ArOGprbI<(>!E99@GkN&7?#q=uz{(bMN@|0qqxcTr07b2;i>k6W8Za(r zOGe?77{mF3SVV_<+hIDRNdbE)(lSDJU|Bf|swOh*8)pQ6AizER8M>1xnN1+Qcqhg$ z&ak{6PD5v75^-mAcvoOH6*!9Hkzpt)*#Ip_vNoGk)^|nj*9+w7+7R(=j4q>aw<4Wc z=nBx)kd4$ER29&>bnknJ`n4)pOczJMPJ! z0)p$AgO&S=`T1(PYN?P}4cSJ%&R?iNexQp^N$*`-AbTP7WfZIW#P4d}}S2|=#O7ke0mzh*aEWQE)y!|#~iGCKXe zpzrFFL$pk!^d8pUI(IfGO<%TTQHsrDXLDNnMC6*d0wT9m7x6Ft7V=_OlTqkuj{x>p z;1kpB_NxE04RdYk)Y!laqUU=rfZJ$T5)`7`QV?5(Ltg_xlECcjtEa{J!@6Brx);>b zl?P)xrifEIfWi;~!Hgrq*7bz~i3BH#^2_mOIb$vnOz3yqef|S?NrX2~aMzcrlIGhJ zJ57YYnbrjk0gMXNJsZ;3!GV3+U0eN7l{dNPN>2^D{M%{F_n#@Jh)M2G9pb6tlT&F# zzc){OFWO&LCDH1cNMGR@X9VA+vt>EiQ|#sD{Y6sIh0eE(T5g#Bhn{L{CgdEL#dtrL zC>~e(BtwcN6QdM$0h>v5cu{@BvleO1d{z*-w8N(k$wHP$AXwvfT1)EL-?E&6nLdTq zFA@*HmwLR__b301zkRRgd(MeG6hCvppG6OwFv=2NKQVx_rQX$Z3q-DFDcOMHtbuC2 zb}=nSGqv$BlXjj(ahhid7ECVPglKaK;z#;LgZZ+OisWYuKBPX7xpErFk*@EYkKqg2 ze61oYkPXBN#&}jK`c6OUoF{pGlCOmyvi0VbqIH)+GaMDJ>Eg{$20?GwP~=nbph7n3wT-iS@IWTjG!q<-}5nJdNKFs75SDJ`2N60FM#00h+c!NU0ufy*_DlHj73t z5%X`Hqe$xxtHUL9%+{FK#XTYqf1a`&Lh=``4pOX3cy239FO^N zfStakz4XYa-?AppcGY?%Pj@WYmLvxBlKhq06UyFTy`Dj|YO2D`3uG#B$$f7PEjp~U zN;XAx*Xx;j?A}%@n)?=Uw67Bf^MPlLUonDdnT0whr^OXyCbtVRp^N&tL4I{~Dg4l+ zvxK9}?_3)Y$>n?i!054VsQ<#MMZ=Q@luen-sz=N_VC}l?`zNJtA`krH?K@>?REBq0S+(}^2UlFWDqHi30Pa~uu05d$T+-JrcJV1?aXOg(}Rs zl`@li5%>|PHxJjZT#h6)u5#ukqU%dvk;$HYi|x;L7naNA&)c1zj7(iIm+BYA&tK7r zwW0zwzaX`x0|CVQVi4}J(N#ScVIBUXBSyY%CN{!aH)SJ(GEwpFU}-yF{d#w05hL=m zqA}!Sf^U&%EPmu~34)ZMEMWZ|Z{ zf+Da%zhehlo-wY?=x^Nensm)O!dR`~B96^wloNE6>dRY#u#pQB(ftm&2{0{aPw);3 zLS~XJegtuFdsZ#-4}Yw<2z1ya*ZublDU*Ut>&i)(l$<$AW-E7gWuf>Kh>nR@=~Jgg zYVeI|2kH%1E@)ScwTRMO*HTWJ!AcdT*o-xoiH_PF%JHNE29RfRx{{W~Mn)HwZeR53 z{~74suQ)4?@;WN79bIYU3yi%hNhnxTu7in4w>kOLA9 z^_cPfyxl`BO^Jaqzdl`|Ez%y3HTE#{dbqX?j$5k&zQxN?z*CZw+vAZV-WEk=-9oI^ zi>;EFv9pBIbUMsM{{@)yaWwa#nUxs`jEZa5y%dJ~ZYpxpbwF;r5KM9NBrtI6bS49Z z{7GcMaXGAxDfXDD;60Li!JF~fHPwUU&ynr@B*@3ChF52>+Zzj(2PL6C2Mor0xpcaX zJz8ihH2PY@>!))WZIW^vV%K*vW$Xw?vcF2|dP9n=qCP9;7B^IZhW=jxJ&T%Ztkc=ADNzA zsx*6uOG(O5$(&<*ti|J7dW)DtZjKZ4%;`A)POZf?A4Jh3X-N5M*8W<2T>+@m+RM zso4=f_o0cfhnM$+auk~mI=kVgHZ;l-+V`UB8DLApLi~fqxxCu82ZpTHwuvkJ zMaL0c$(fK#3^%@^>W3#TVHR`5ZG3y0Clb5K47#1K#yLmQyhW_55~ZZn&H*`)Kcz#xCRQCFdlucHx%dY1wZPf=tL$KK^-_TTkBlg%SX#-AMe8 zDRJaA`0SE_!0FPPn@x{0rimZQd9k+}88MLx`S?6fu6=l1Y@h3fs<=&*q;z=urTS=C zK%}u|(8k5e&Y-zSmoYb|zD$^cY}p6(t?!f9J6m?2>Tc-Xy34Rp*Ug6P;_=3oS~ z%u;Q7%I5MiGqZ{d!-pEl{0|+1NTm+haNN1M^6$Gh!|V@!B;}D{h3pn(C{xBk%}#IR zO1TK6*^j5|!U4^zB>Fw$Ab?>qDPT1M^Jx#~^C&2cPdIB_0;KSVNk9r$##HLTSD_Z& zz)jE%*Gj)7d9uVMl=+HdJ8%e}9%lwaY;_kEvV>UsLHx;mMC@f3lzq5Iv&y8{w)@Z#?E z$bXT?tyF)?<3bugVVY6(e@Vg`2i>|)$^m~$WioLwW}oXXZ}=w;=N0{LOx0{9*as^Bb{)>T@3m+vEip|GPIJDHTEO0j?I58}) z3~@%Q(7?0uCeHM#BsO=kytmWFVcmtD#HF#V$&{e5iF)nW6D|+WjJvd;&5ukcPLykI zL)z_SO#T-IEgtk{E$oT_$8EEJI%wS_Y2C(F)`01pzGC)%N-d}qrB@+6yelt`_?uuN zPMGYZCo678{Kdb+IPo{#IN(js1Ummj@!l19H8oPMb}r|M+d{D&z2T^r|!8rbRwlE=7j zz{QM`99y%o-F!wvWl#jR$l|ML^ohwPPlBQ~Vi{{yBOjvrhl~uf zK5Vk45;70o*YhtM&7#Sc2dfA3wZq@0ZZ6N~v6zg&MzJl<$ZNrwqf-$TiT@#W`2x6Mt;TiS4huyA5^}YIPTFF^l19VciDe9QgSuo770l zz$Fvs?0FY@_UtE2YE##{%dGmgZHHfzsU_`V*H`P4*F`ul(sYs9Jq*h6rbk1>eD34Z{2K;_cLbZ46halLc ze2%NUKU&GA!WwUqG&=coFm>87tCT*F4xGxo74O@5Y3xJVE!8F_1FP%~BdC2FS9Isf zXuW-CnGh!{^D*Drcrxc3Y`W9=5ZVYqn-rEs?8_&q}IoEx+VFS zRga(VCYV$<=Zq#wk?;b+las#o#HsNw*`FGFDeA^*xQuB(cE3~CcEUYt6MjgdL|p=P z2+pPgOZ0Zk#7FPiJV}Wb={;89-U46uTu_QI1&b)P=+se1|88_^!5Um>o)Nj!lfI}_ zA{$}3*734@W4yItj?m zLJCa$`Rn$L_lRPSglt!uro*Wg-e^WHi@NW8q5zxYdq%ULx=%RZ(Ry~zKFHmgD!x8n_+?xj`!7VyZLb@!Ht zcyvx*=Ox|L<#!iwxI;b}HqA-#(_&c7eI; zh0-~Nl>BWL;lGfbd$~ThM~0`;bnAxA&t^Bg46A9F67?ijVTmmSHXl37dKJH@X%pJ( zv;J34-$9e2BLwPjbgdS-#g6)O&a!wuZ-4?=C;(W1fb*oq3F7!&Q;TDT{dSIuAJ0r( zTYW}1z5Y^?(IYRkcvPK{&UNZ!DTD2NG^^l4v6pZ*x!@0~FW+zs*VWLZvD5?b&529v zzAIr#Blpmqud6Eze&qzM(zwET6WE`YFdmz$)SiInkY`uE9 z2W8d!Z|P-BLFnbp3rcnGlI9P_{}G(V#2CJpq^&-OF7u(-e@`ex!`4!J7AZxIWjne$ z*}p)Oo)D;<^YCfczySXZ)mxzJ%Trh$e@@Xs6YI$UjQXTpMM3=OD}yJh-k2t_G}69%^Fr!Z2HQA5*4M*x@spn| zrheG^IKj0ez3X@*QK}PLKen)$lLlOFZ8tSxuEOsfZ4ZBRv~f7a=7}eY0qYvDhVUkw zZOeCWJKZrO(yrm9v!+wYKhPp+8sVTN>nKBQt1)2z7ZTr41?oJxD3UIFa*^`;bD2FhRFQI1$)e-S7>YM&OE5M83i$Yg1gC4XbSB(3HY$XeKc0w~r|t-}85eyvq znGOcAFmP`I@uNFB6D-U3R7zi&HI?4$T$XBCYp7jyF2hIU++&75Z}~Yj0lG(o!Q{%x zle@H4z=iwQ^%fFV}$@P%l|Q*S||Fc=aU(OuYN7&dFa}V3Nc7J*3pGRNHysT zpl1qYqD}+z4udN>1yr0@uF3~3%~hGND|wBbU_IaPN$MmzOSBa(DV?!lmqJAFWhao7 z6XK-N{+v`HO%=al&V4z}>Sa|@+Qf8!nk9bZMS#vdzl+RDih{^-@~-07nqb7URdH*R+DD=7!&A9Oi{-a*?F%R^?_>z|&W zHQ+4C_b)3pp#^K(qJHO8s1UDOMw^aDYOOebgZD{HMbGVDVk$+=PF2;lVmdaX96DD( z2>^x9360&?xbJ=C?ww+GUzY7mi#yf$i@Zi^^Y}?DA8FLB1O|#d@$jX3gICv(QdzlV&8dxsHV(c+LsK>QTvzU6_ zYb0#5dCxZ%c~~}R7+|_=M1NiJ;GL(M6jlh!W$wT&BZz#^;TRxOvOoC5av{aK*jUdB zEJTT7g$OLq7j%VOxq7lBmjswrMs{Cq4i_QLuY?I-R*l_PX%)WEauEF6LE{{cM%g#Z zY=g9-pHTq4-?B_^ws)ot(CdUT(Q;?3ZgB%&0-LSJk}S~oODd0f;gmE$LNlWC)*SZw zTF2tWUDe>}3GAgFzfUW{@fr-5%+TXNF!#@u3xLK#M@{^pJ@RwHxR(mQv$rbM^u)yF zp7gc4+^-scO=w4GnLoUHm&|*G%B4)zdnT-@sLAXD{t?qVWoK?M#QmO7ZDZYumcROM zT0RXq?@|A$uOb2&0IX>Ab9ty?U)lM3)bo7LPM+d~0IDZ9U)9X4Pt|IhEccrc4$Yqg zxN&t9niz^0H@V{LX*57HW5=4LcVn`mZrtz!m-E4LWa#a&|ZE=ZeR z_be>uWC0uQotqmp(+ySAn|+s`Jh^?c#?)U-^^qVEROY9akEY4F$EfL{d=!)6%BG-- zzxb^*e?e$Rf1Wl1QT?k8F>OCoXwv?=Ung`f@oR`*z|{D)G%5h9(2EXaoVg^$f5Zm< zKZTunJXG!9$1R~Oja|ej${K1yXo$j8_FcA;rjQxV!J)?|Gj8yk6(bnRAXg-|KsQuFvOvU}1Q)$#BKFf7rFv3#c^C6nuM& zOO0Gft$Kq{^uZk+fBQMx4ywF#eZ10jN%@}^6Trc3hCtkr5v?qLPeTBZoa}i>5KfE4m^W45!H&tNIy2!R)_bi2pfs)oyorVbu+nl5 ziVqIJzcjU0;LWSXA>n4vmdvWwz`nJ(vB0=#2PO^BiHo&%ecgXrM@U_;#^7aMCflK* zu?J85J`Tl@CXG@Gz9}c1FQwCP4okOwbBpS37P8a>qfV`z9k+`X5YFPzTfu%UP!6y`Fvr_P9?4V5;X6Bf8{U9#rCkAZ zM&uVB!n66B@`9(+a&}!KKRfCf^oQNN+6$^tHoMIK!>*$7-0ZFr=x>*b-P5X-LgxBY zo2Ug*pNH%q>8qqJmtk=~7g&DYcueN3PcuE3&z~%j0gUYgSS9wn57tV0QdV~{+bxEnx{U^j4&k6Tg_t{mX$_Yq$xe=@q|jc4#`MB^ zJT!tidMB9LT+XqKk3JFN=!_dS0?dknKn##1>;EeT2o)}9LyEIBz=e4SFuw9d_vq)Y znKx|vFBXdWkaNz_)-AYMGNnQ9zLj_f%C}~7N!N>u)Lf+CfEIdIU7czh$QbcAide4T zZQJy*?<2fUv(SP%PV21I_X1kz7G8vO5oI)0xCIvcYt6{A`!}bwQlGSad^&0sE+dig ztCN-J!D2iYgG*FJ2{BPzy1^u&y=FXDd67a8y7BGP|L)Sh_Z*1ci7meUFD~utdnA|k z%FkshXa7&|yHfQ-cZaL9*88w++@nx&uAPsEVL*=wVw{~gi>(snR7!xUfN3m@nIRqe z$bxi@pG5F$L=in`nIEOo82`J5h_9j*7~_4)pr(1ea&G+SOCoJiMKDK#1^!`Tmo zu(KAj$s(@Ez}~eSFWD$y#q zslU<&-b60sArh0MhfMd8Ut(rM_CQZ8FfKQivy3;fi)0|#R9eO4o~zDAw8`&mCJBRl zL+V<9>B#dX+=Ch6E=t$PUla#aJlOiq<<`$o@7t~|m@_8YX~f5JPr8|q*x0k}KKaw) zlj4s{p!Bb0(O2I@&cJP`BT4v(=^IBCC}>G;6Pl`dvTGO(u1uHZFzBch#Oi5#?{oUA zMDhff&?FU9`${$qfOt^aXNUDLXp}!L8o++(*YdqI@rZ`e_9q$WGiZtk%BdwBGNUQLOvKhbHU?bZL0ypyF6t66gl zm;}?$LvW7=cpykxJulrHg1_Tybvk9?!FUgQFW7)ZjiG5RKh5P)A-N+a_IR~*prd%Jub(3dwV#iE zEZRnitmR!zrZDwcFZbI$fi zpQ#2NyF^|ZZxhg}_2{p|uY5RbnD8K6ZJ*(Qw2)?}wekp&yaRA|Qo#DxsS?SeI+jqSMG)is9$_pX3e;QRCk`w z6Eyf}-+>ptnm-5fB$ja02cI*FiDNlWz6!au(Hs}CGqc@Mmic~|=QFFJrG1@1hjtXy z4~e%c+1cVu*QrSvt}^-J7&3CYOFA(;0v#pDtP1!!v4p;BvW*`n{US>q(dX{NUrV`ti>sUd7L3MP0-oP`aRTgYw5brGKhov{JH8&ZnR)OJ2X6Hj z*N%E-g5%w9Tu(o3p@Ox209&F)dqM|)8ypzq@>_T7)U{4lXM#FbS?FxaC!G^bZMM9+ z4tmuQbQP|}fWbv^^L6{ks3C9Ej)`TTPs7Rx%f;*+b8A$!FHS$N0rHb7YlE-;Os=Pr zQ{twGcgc=sfxFbo@AZ<0v(i)mIIN>SayZmhz4f%!>5C|cW!)L%h17s1v)z*m@qbN( zLIG`HP@`-xc!<{bo61SZlQWVZ1OuYl!Sb-gF-ru;V-o?-65R4%f%6Z;4dlCb<*tm4 zT`7ejX`!VvI;>13$7YHQz%+8p7l(Tpo$_JB4f^W={o?Bv;zK3iLCjqj{gvE5lo;fd zHH{q|VzJ(ecLFb~dW44K((lhkhDQ$2inQ@ZcRq7Y>-^*1b>gOVEt)4}ovdHpbt^K@ z|3sf`Dm|bJwcZkK{pP34+PPS-&Y(HzYpQh%%*U0(ohJ^qYv&SPhZse79v3M#nTUb? zTTjUjU*9&)0S1{kUx6pKuPYG_c~z}evFZy5xUz{>?k8wd2OGRLnS6!W@2E;KWyJGkUt&UFTh*2NVjj=kW%jj~V001z!4 z=ACav4hf=_2vC25z)FK{a-HCIF%1b@(>NH^N7$**yWUBYO61yA32R`g-kGrQqT2&s zZ1aW~`>zx~03Uhl@0bL?Vul+mpc)cp64nzfU1rpi*eG&?8WU7Xl4Pf1!!_iKpK_${ zC;xLY0h})InNl8x8hkL6Jpz7odsa%}^mCw|17HWPhf{dC+kQ}x((i~n?<}jL=p9a@ z<9^KPtHyuVYuBL`*B7H;P2iVO8ICwx_P&$c40y;=GC7R)u@F`J-|`;#me&bZ9#xFU zJg^Th!=rFfc{Bw+ujIxWBM>U0T(6i0?6X&W^QWn?a#<*foA?<)RQJ+am_wkw5~pN- z7sfTpB>PChT4dEn1d;2VMl0o-hg^bZeAQZSZ%fT*?fK_jkzO;p1^Kn_+yjstFP#ra zNvx;BrMYSMj?`B;0sS zFuJaW4L~Ou?IWxSIxyrDP0$laaSx}5DtUOzHO?=y^m2JYfcOG)&~ws}entE=bCT7$ z=#rYt?lU1eR^i}WaqU8Z0rKPflqR^`l!q|k(Zo+khOK+ubx;hXEPh&3dhXVaKhK_5 zEWuW;iN*%L+&b5&xM}Dl-pY8w8~S%KsSYAxoEeE0RatjS6)vupzw^Mi4zR4J9^a9vEO zGsL1|=&T;B!-Hc|XANCOT4+&_Am}oQeN;)!5I#Ng%dGfD89Z`xzBJfQ5Uq?0g3AeUS9@IhE|>w~}OV)8>HvkoV#COPN{LT#vk8 zt2Z)j@{a(~lW*kv*4-rOL6sffa^(OAYdJ-0AsgF9gwSQe2wH&X@4yh*TSHt#%TNt1(?*1p$1*$&WoXj%(3D- zcQ5QJ#PkYUg9UjMs?vZCI$TX&{X=JmqECeM2>uCx|CpLx$`!gYuDe(vVX}YRkFG^k zURe>tw{_d=^mg9nvS?KtpkI=2?(iG$tPXR5QosdvzxGoCt z$$I=Gfzpq+2F3?10L^~%hk|tHo!byiu28i+0-PzrVDKCekd-_eW}(>Fp}Ancc191J z%LV{ozGVXd7!U|yD)X?cRj`u12B#u~Q22#>5x;tCwV54R+A8Kzk+(poe&f<5a*v*K zT2oU&Cy_LPGej(sedjw!v3{YylrY}sxYF)>cfp<-T!xEu)CFu&YJe?D)I%N!%*L!8 zEi#ZVi4r-oMksMF`zOoUUiq(+KVL}Vgk4zs|M2{i%LBzJSShuf5=6EJK+gfbJ})q= zG0GhyJ>s|)s`}>jgj5{06DiB8;CT5#UeEFuCDRNU65yFEh+SOUYPR?{idoz^hcctc z&442k_wYk5d(L7ZTKmy)4^n0o##7c6!_jl_B86&KbNSP0;&tq_AS1DeI66n%PR*pX zi2%0k-ZNP@3`AaRb)vJ?W}XEv*Z1a+PPd6tY;c0IY-s0=Iw-*C*soU) zC=bBofdMQRHt;f`m;%bDO+Q@6&hS8dvdDDe(V_H-k2t&!J`FL&9w2#0bHLqd5+>n8)4e;ua%TPUO&4#d!TjvD`IHe+m+wqABkj zoNs5r+GI!s>cQZx77EF%7%V;lk~d43R$%h9**@|sc6SSR>J07Anld(@sT0nyR>Qu_ zPhkc@Fj;M*AKsf3%f|p*H1HyY%3g7T%cCKt?y8k0=-`j0laL`{!mVH11jZ{=3)Zbo z21^05#asw*jiv?Hew&@KV*;teNz-jz?UZ2y0k!l8DBW^9Rj~0!uD>Ft|27Lg;_|N} z*?vvL_xnuig>$EG@^@kLoJ?zdbt0stXU1YVLJO_W zCv!h-*}a>}{Q3SZv`DX6-2%p&B;T>R%A72KsxXP5VK54m2trhI`mBmx(#zV{ zInu6zS{==2l?XBO^i7UsOK?Fk{?ekyEXECjxn| ze`kRpJim|8Q}?3d(XG1>vcoX%zs<(_g-QWYTElLe@&5AL%%^F!{2#PFiop zRz~d(ix56>b@e=g)qGNk>2`{de6Q_WxRCIF*6yQFR#bxy#Qy{EQ~~2n-V>tkL{`UY z&0Rmmuj2DpeT)jObl<7A@des_b`d1V25nwoq~e9M<^f>hHSU>co8g(*{m}-YwofiI z-mkS=3Wl~O+8MFVW{YqX8E6K**_pPc`QNK@m~X8Hg&Kle5qX4L!dd6!IWdLU*Nlkc zGiH(n$H6or(h^BfuCPB&?kP`30z;2(u1 zR+FQfD9dIbldYlRvSLo87bRrF5U656yei7F$Z+uFv&!-!9(3wD{QY)By0oUJmuQ{- zU}FV=;Y7LSZ1uxnRdzVY10dxWlIkcKoJet_HxrwC@n~W6^hFyQekJ5|pV<4XQj zka1?kZLfD%g`ld(`_Jln6>AAWt9jnwML-$NI@O($<9KJ{W`C%l?Zl4-L0J7Mr!-?21u}Dy5k;D zu}!eeZ*3?R;L}9xDghYu?{zNJxF-U5o>7it>+~T~$v2ua{;7P)^J*yJ6~TT02(a@l_L<@JIZo3wOYJ9t9BNNUnvpIZ184_1fah;Vh@r1saB z^4y@`7jq3dxmVlsiow+%)C~5)FovY6v>3pvw$J%t@r@7cp&Ec@j$@T1u-i81-!`X5 z*u0~!^hDZq+7k7};*;b~0?h1x(q(|(>8OIVD1hr(THoGWk=iwDyIPzQf69sA=(J+o zn#EcLV}QPlry2xM(Oe*&QuTxz|DO({_ui&T9ig&XSsUK?V&dy)5>MGnr6uw&*J)SR z4O5d0C2t!+(VG{Y3fFU3G4!F~;z`0^Zy$VT zlJGjGSF&$3BUtfc03n5Fp1KQfb~InA&8`q*1q&GG=||Hzpy6L2H1f*;LpyQht{w?} zDZ2kUk>FaSr)>&iD|Z|7sH6U!z%}z@JhB~OedrN<`}Lfq^UV}Y43>cn?*zZ0AOM2< zpX5w(`QSQaEYTvqHz~=NXHUjQf0o%dBkQfeAN31lR&xxOEgYHTdZp%bVXN280=Ana z^M=FH$n=5rl?&BI)^08Qe_`>YwGkkoEIR+Kv^%~Pb0k^b?3|sA#qp8cs#eTueeM2Q zRw=0&M&6mX$~YF!Y0ZBc@63#c7`f!9BKSXd@Voc{RoLU+XN*d^;RK${8T?=LBS%Bk z&gkb&o-U3d6^w6h1+IPUz|;DW zIZ;96kdsD>Qv^q=09&hp0GpEni<1IR%gvP3v%OR9*{MuRTKWHZyIbuBt)Ci`cU_&% z1T+i^Y)o{%281-<3TpPAUTzw5v;RY=>1rvxmPl96#kYc9hX!6V^nB|ad#(S+)}?8C zr_H+lT3B#So$T=?$(w3-{rbQ4R<@nsf$}$hwSO)A$8&`(j+wQf=Jwhb0`CvhR5DCf z^OgI)KQemrUFPH+UynC$Y~QHG%DbTVh-Skz{enNU)cV_hPu~{TD7TPZl>0&K>iuE| z7AYn$7)Jrb9GE&SfQW4q&G*@N|4cHI`VakFa5-C!ov&XD)J(qp$rJJ*9e z-sHv}#g*T7Cv048d1v~BEAzM5FztAse#q78WWC^BUCzQ U&wLp6h6BX&boFyt=akR{0G%$)mH+?% literal 0 HcmV?d00001 diff --git a/docs/assets/images/widgets@2x.png b/docs/assets/images/widgets@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bbbd57272f3b28f47527d4951ad10f950b8ad43 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xe12~w0Jcmn z@(X6T|9^jgLcx21{)7exgY)a>N6m2F0<`Rqr;B4q1>>88jUdw-7W`c)zLE*mq8W2H z-<&Jl_Hco5BuC5n@AbF5GD82~-e8-v=#zCyUX0F-o}8pPfAv`!GN$ff+TL<~@kgt} z62eO?_|&+>xBmM$@p|z`tIKEdpPf8%qI>4r7@jn<=eta*{3~?g(zz{Ke9zc-G^gr? z-7foa?LcS!hmbwzru}ICvbWLlW8;+l-}!^=c32!^nV`+`C*;0-*Y%l94pC;Cb3GXz zzSf%a!{gVr{Y_lVuUj+a)*Ca+!-Hu%xmP&&X-2CuANY8^i{D7Kg6qzP zXz_ps9+lN8ESH{K4`yu&b~I>N9xGlE&;2u*b?+Go!AhN?m-bxlLvtC#MzDF2kFzfHJ1W7ybqdefSqVhbOykd*Yi%EDuhs z4wF{ft^bv2+DDnKb8gj1FuvcV`M}luS>lO<^)8x>y1#R;a=-ZKwWTQQb)ioBbi;zh zD!f5V)8581to1LL7c9!l^PSC$NBPYif!_vAZhmL4)v4U)4UsrLYiH_9rmQDd?)(e5 z^pcH>qvBg*i0dus2r*mp4;zKvu=P#s-ti;2obl`NjjwoYd>e(oo#j_uyRb<7Pv^If zzZ|mGHmV)8^tbO%^>eqMw(@7(&3g{jEp-Najo7V75xI_ZHK*FA`elF{r5}E*d7+j_R literal 0 HcmV?d00001 diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js new file mode 100644 index 00000000..dc257a86 --- /dev/null +++ b/docs/assets/js/main.js @@ -0,0 +1,248 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is not neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "../node_modules/lunr/lunr.js": +/*!************************************!*\ + !*** ../node_modules/lunr/lunr.js ***! + \************************************/ +/***/ ((module, exports, __webpack_require__) => { + +eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9\n * Copyright (C) 2020 Oliver Nightingale\n * @license MIT\n */\n\n;(function(){\n\n/**\n * A convenience function for configuring and constructing\n * a new lunr Index.\n *\n * A lunr.Builder instance is created and the pipeline setup\n * with a trimmer, stop word filter and stemmer.\n *\n * This builder object is yielded to the configuration function\n * that is passed as a parameter, allowing the list of fields\n * and other builder parameters to be customised.\n *\n * All documents _must_ be added within the passed config function.\n *\n * @example\n * var idx = lunr(function () {\n * this.field('title')\n * this.field('body')\n * this.ref('id')\n *\n * documents.forEach(function (doc) {\n * this.add(doc)\n * }, this)\n * })\n *\n * @see {@link lunr.Builder}\n * @see {@link lunr.Pipeline}\n * @see {@link lunr.trimmer}\n * @see {@link lunr.stopWordFilter}\n * @see {@link lunr.stemmer}\n * @namespace {function} lunr\n */\nvar lunr = function (config) {\n var builder = new lunr.Builder\n\n builder.pipeline.add(\n lunr.trimmer,\n lunr.stopWordFilter,\n lunr.stemmer\n )\n\n builder.searchPipeline.add(\n lunr.stemmer\n )\n\n config.call(builder, builder)\n return builder.build()\n}\n\nlunr.version = \"2.3.9\"\n/*!\n * lunr.utils\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A namespace containing utils for the rest of the lunr library\n * @namespace lunr.utils\n */\nlunr.utils = {}\n\n/**\n * Print a warning message to the console.\n *\n * @param {String} message The message to be printed.\n * @memberOf lunr.utils\n * @function\n */\nlunr.utils.warn = (function (global) {\n /* eslint-disable no-console */\n return function (message) {\n if (global.console && console.warn) {\n console.warn(message)\n }\n }\n /* eslint-enable no-console */\n})(this)\n\n/**\n * Convert an object to a string.\n *\n * In the case of `null` and `undefined` the function returns\n * the empty string, in all other cases the result of calling\n * `toString` on the passed object is returned.\n *\n * @param {Any} obj The object to convert to a string.\n * @return {String} string representation of the passed object.\n * @memberOf lunr.utils\n */\nlunr.utils.asString = function (obj) {\n if (obj === void 0 || obj === null) {\n return \"\"\n } else {\n return obj.toString()\n }\n}\n\n/**\n * Clones an object.\n *\n * Will create a copy of an existing object such that any mutations\n * on the copy cannot affect the original.\n *\n * Only shallow objects are supported, passing a nested object to this\n * function will cause a TypeError.\n *\n * Objects with primitives, and arrays of primitives are supported.\n *\n * @param {Object} obj The object to clone.\n * @return {Object} a clone of the passed object.\n * @throws {TypeError} when a nested object is passed.\n * @memberOf Utils\n */\nlunr.utils.clone = function (obj) {\n if (obj === null || obj === undefined) {\n return obj\n }\n\n var clone = Object.create(null),\n keys = Object.keys(obj)\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i],\n val = obj[key]\n\n if (Array.isArray(val)) {\n clone[key] = val.slice()\n continue\n }\n\n if (typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean') {\n clone[key] = val\n continue\n }\n\n throw new TypeError(\"clone is not deep and does not support nested objects\")\n }\n\n return clone\n}\nlunr.FieldRef = function (docRef, fieldName, stringValue) {\n this.docRef = docRef\n this.fieldName = fieldName\n this._stringValue = stringValue\n}\n\nlunr.FieldRef.joiner = \"/\"\n\nlunr.FieldRef.fromString = function (s) {\n var n = s.indexOf(lunr.FieldRef.joiner)\n\n if (n === -1) {\n throw \"malformed field ref string\"\n }\n\n var fieldRef = s.slice(0, n),\n docRef = s.slice(n + 1)\n\n return new lunr.FieldRef (docRef, fieldRef, s)\n}\n\nlunr.FieldRef.prototype.toString = function () {\n if (this._stringValue == undefined) {\n this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef\n }\n\n return this._stringValue\n}\n/*!\n * lunr.Set\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A lunr set.\n *\n * @constructor\n */\nlunr.Set = function (elements) {\n this.elements = Object.create(null)\n\n if (elements) {\n this.length = elements.length\n\n for (var i = 0; i < this.length; i++) {\n this.elements[elements[i]] = true\n }\n } else {\n this.length = 0\n }\n}\n\n/**\n * A complete set that contains all elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.complete = {\n intersect: function (other) {\n return other\n },\n\n union: function () {\n return this\n },\n\n contains: function () {\n return true\n }\n}\n\n/**\n * An empty set that contains no elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.empty = {\n intersect: function () {\n return this\n },\n\n union: function (other) {\n return other\n },\n\n contains: function () {\n return false\n }\n}\n\n/**\n * Returns true if this set contains the specified object.\n *\n * @param {object} object - Object whose presence in this set is to be tested.\n * @returns {boolean} - True if this set contains the specified object.\n */\nlunr.Set.prototype.contains = function (object) {\n return !!this.elements[object]\n}\n\n/**\n * Returns a new set containing only the elements that are present in both\n * this set and the specified set.\n *\n * @param {lunr.Set} other - set to intersect with this set.\n * @returns {lunr.Set} a new set that is the intersection of this and the specified set.\n */\n\nlunr.Set.prototype.intersect = function (other) {\n var a, b, elements, intersection = []\n\n if (other === lunr.Set.complete) {\n return this\n }\n\n if (other === lunr.Set.empty) {\n return other\n }\n\n if (this.length < other.length) {\n a = this\n b = other\n } else {\n a = other\n b = this\n }\n\n elements = Object.keys(a.elements)\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i]\n if (element in b.elements) {\n intersection.push(element)\n }\n }\n\n return new lunr.Set (intersection)\n}\n\n/**\n * Returns a new set combining the elements of this and the specified set.\n *\n * @param {lunr.Set} other - set to union with this set.\n * @return {lunr.Set} a new set that is the union of this and the specified set.\n */\n\nlunr.Set.prototype.union = function (other) {\n if (other === lunr.Set.complete) {\n return lunr.Set.complete\n }\n\n if (other === lunr.Set.empty) {\n return this\n }\n\n return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))\n}\n/**\n * A function to calculate the inverse document frequency for\n * a posting. This is shared between the builder and the index\n *\n * @private\n * @param {object} posting - The posting for a given term\n * @param {number} documentCount - The total number of documents.\n */\nlunr.idf = function (posting, documentCount) {\n var documentsWithTerm = 0\n\n for (var fieldName in posting) {\n if (fieldName == '_index') continue // Ignore the term index, its not a field\n documentsWithTerm += Object.keys(posting[fieldName]).length\n }\n\n var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)\n\n return Math.log(1 + Math.abs(x))\n}\n\n/**\n * A token wraps a string representation of a token\n * as it is passed through the text processing pipeline.\n *\n * @constructor\n * @param {string} [str=''] - The string token being wrapped.\n * @param {object} [metadata={}] - Metadata associated with this token.\n */\nlunr.Token = function (str, metadata) {\n this.str = str || \"\"\n this.metadata = metadata || {}\n}\n\n/**\n * Returns the token string that is being wrapped by this object.\n *\n * @returns {string}\n */\nlunr.Token.prototype.toString = function () {\n return this.str\n}\n\n/**\n * A token update function is used when updating or optionally\n * when cloning a token.\n *\n * @callback lunr.Token~updateFunction\n * @param {string} str - The string representation of the token.\n * @param {Object} metadata - All metadata associated with this token.\n */\n\n/**\n * Applies the given function to the wrapped string token.\n *\n * @example\n * token.update(function (str, metadata) {\n * return str.toUpperCase()\n * })\n *\n * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.update = function (fn) {\n this.str = fn(this.str, this.metadata)\n return this\n}\n\n/**\n * Creates a clone of this token. Optionally a function can be\n * applied to the cloned token.\n *\n * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.clone = function (fn) {\n fn = fn || function (s) { return s }\n return new lunr.Token (fn(this.str, this.metadata), this.metadata)\n}\n/*!\n * lunr.tokenizer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A function for splitting a string into tokens ready to be inserted into\n * the search index. Uses `lunr.tokenizer.separator` to split strings, change\n * the value of this property to change how strings are split into tokens.\n *\n * This tokenizer will convert its parameter to a string by calling `toString` and\n * then will split this string on the character in `lunr.tokenizer.separator`.\n * Arrays will have their elements converted to strings and wrapped in a lunr.Token.\n *\n * Optional metadata can be passed to the tokenizer, this metadata will be cloned and\n * added as metadata to every token that is created from the object to be tokenized.\n *\n * @static\n * @param {?(string|object|object[])} obj - The object to convert into tokens\n * @param {?object} metadata - Optional metadata to associate with every token\n * @returns {lunr.Token[]}\n * @see {@link lunr.Pipeline}\n */\nlunr.tokenizer = function (obj, metadata) {\n if (obj == null || obj == undefined) {\n return []\n }\n\n if (Array.isArray(obj)) {\n return obj.map(function (t) {\n return new lunr.Token(\n lunr.utils.asString(t).toLowerCase(),\n lunr.utils.clone(metadata)\n )\n })\n }\n\n var str = obj.toString().toLowerCase(),\n len = str.length,\n tokens = []\n\n for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {\n var char = str.charAt(sliceEnd),\n sliceLength = sliceEnd - sliceStart\n\n if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {\n\n if (sliceLength > 0) {\n var tokenMetadata = lunr.utils.clone(metadata) || {}\n tokenMetadata[\"position\"] = [sliceStart, sliceLength]\n tokenMetadata[\"index\"] = tokens.length\n\n tokens.push(\n new lunr.Token (\n str.slice(sliceStart, sliceEnd),\n tokenMetadata\n )\n )\n }\n\n sliceStart = sliceEnd + 1\n }\n\n }\n\n return tokens\n}\n\n/**\n * The separator used to split a string into tokens. Override this property to change the behaviour of\n * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.\n *\n * @static\n * @see lunr.tokenizer\n */\nlunr.tokenizer.separator = /[\\s\\-]+/\n/*!\n * lunr.Pipeline\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Pipelines maintain an ordered list of functions to be applied to all\n * tokens in documents entering the search index and queries being ran against\n * the index.\n *\n * An instance of lunr.Index created with the lunr shortcut will contain a\n * pipeline with a stop word filter and an English language stemmer. Extra\n * functions can be added before or after either of these functions or these\n * default functions can be removed.\n *\n * When run the pipeline will call each function in turn, passing a token, the\n * index of that token in the original list of all tokens and finally a list of\n * all the original tokens.\n *\n * The output of functions in the pipeline will be passed to the next function\n * in the pipeline. To exclude a token from entering the index the function\n * should return undefined, the rest of the pipeline will not be called with\n * this token.\n *\n * For serialisation of pipelines to work, all functions used in an instance of\n * a pipeline should be registered with lunr.Pipeline. Registered functions can\n * then be loaded. If trying to load a serialised pipeline that uses functions\n * that are not registered an error will be thrown.\n *\n * If not planning on serialising the pipeline then registering pipeline functions\n * is not necessary.\n *\n * @constructor\n */\nlunr.Pipeline = function () {\n this._stack = []\n}\n\nlunr.Pipeline.registeredFunctions = Object.create(null)\n\n/**\n * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token\n * string as well as all known metadata. A pipeline function can mutate the token string\n * or mutate (or add) metadata for a given token.\n *\n * A pipeline function can indicate that the passed token should be discarded by returning\n * null, undefined or an empty string. This token will not be passed to any downstream pipeline\n * functions and will not be added to the index.\n *\n * Multiple tokens can be returned by returning an array of tokens. Each token will be passed\n * to any downstream pipeline functions and all will returned tokens will be added to the index.\n *\n * Any number of pipeline functions may be chained together using a lunr.Pipeline.\n *\n * @interface lunr.PipelineFunction\n * @param {lunr.Token} token - A token from the document being processed.\n * @param {number} i - The index of this token in the complete list of tokens for this document/field.\n * @param {lunr.Token[]} tokens - All tokens for this document/field.\n * @returns {(?lunr.Token|lunr.Token[])}\n */\n\n/**\n * Register a function with the pipeline.\n *\n * Functions that are used in the pipeline should be registered if the pipeline\n * needs to be serialised, or a serialised pipeline needs to be loaded.\n *\n * Registering a function does not add it to a pipeline, functions must still be\n * added to instances of the pipeline for them to be used when running a pipeline.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @param {String} label - The label to register this function with\n */\nlunr.Pipeline.registerFunction = function (fn, label) {\n if (label in this.registeredFunctions) {\n lunr.utils.warn('Overwriting existing registered function: ' + label)\n }\n\n fn.label = label\n lunr.Pipeline.registeredFunctions[fn.label] = fn\n}\n\n/**\n * Warns if the function is not registered as a Pipeline function.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @private\n */\nlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {\n var isRegistered = fn.label && (fn.label in this.registeredFunctions)\n\n if (!isRegistered) {\n lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\\n', fn)\n }\n}\n\n/**\n * Loads a previously serialised pipeline.\n *\n * All functions to be loaded must already be registered with lunr.Pipeline.\n * If any function from the serialised data has not been registered then an\n * error will be thrown.\n *\n * @param {Object} serialised - The serialised pipeline to load.\n * @returns {lunr.Pipeline}\n */\nlunr.Pipeline.load = function (serialised) {\n var pipeline = new lunr.Pipeline\n\n serialised.forEach(function (fnName) {\n var fn = lunr.Pipeline.registeredFunctions[fnName]\n\n if (fn) {\n pipeline.add(fn)\n } else {\n throw new Error('Cannot load unregistered function: ' + fnName)\n }\n })\n\n return pipeline\n}\n\n/**\n * Adds new functions to the end of the pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.\n */\nlunr.Pipeline.prototype.add = function () {\n var fns = Array.prototype.slice.call(arguments)\n\n fns.forEach(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n this._stack.push(fn)\n }, this)\n}\n\n/**\n * Adds a single function after a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.after = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n pos = pos + 1\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Adds a single function before a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.before = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Removes a function from the pipeline.\n *\n * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.\n */\nlunr.Pipeline.prototype.remove = function (fn) {\n var pos = this._stack.indexOf(fn)\n if (pos == -1) {\n return\n }\n\n this._stack.splice(pos, 1)\n}\n\n/**\n * Runs the current list of functions that make up the pipeline against the\n * passed tokens.\n *\n * @param {Array} tokens The tokens to run through the pipeline.\n * @returns {Array}\n */\nlunr.Pipeline.prototype.run = function (tokens) {\n var stackLength = this._stack.length\n\n for (var i = 0; i < stackLength; i++) {\n var fn = this._stack[i]\n var memo = []\n\n for (var j = 0; j < tokens.length; j++) {\n var result = fn(tokens[j], j, tokens)\n\n if (result === null || result === void 0 || result === '') continue\n\n if (Array.isArray(result)) {\n for (var k = 0; k < result.length; k++) {\n memo.push(result[k])\n }\n } else {\n memo.push(result)\n }\n }\n\n tokens = memo\n }\n\n return tokens\n}\n\n/**\n * Convenience method for passing a string through a pipeline and getting\n * strings out. This method takes care of wrapping the passed string in a\n * token and mapping the resulting tokens back to strings.\n *\n * @param {string} str - The string to pass through the pipeline.\n * @param {?object} metadata - Optional metadata to associate with the token\n * passed to the pipeline.\n * @returns {string[]}\n */\nlunr.Pipeline.prototype.runString = function (str, metadata) {\n var token = new lunr.Token (str, metadata)\n\n return this.run([token]).map(function (t) {\n return t.toString()\n })\n}\n\n/**\n * Resets the pipeline by removing any existing processors.\n *\n */\nlunr.Pipeline.prototype.reset = function () {\n this._stack = []\n}\n\n/**\n * Returns a representation of the pipeline ready for serialisation.\n *\n * Logs a warning if the function has not been registered.\n *\n * @returns {Array}\n */\nlunr.Pipeline.prototype.toJSON = function () {\n return this._stack.map(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n\n return fn.label\n })\n}\n/*!\n * lunr.Vector\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A vector is used to construct the vector space of documents and queries. These\n * vectors support operations to determine the similarity between two documents or\n * a document and a query.\n *\n * Normally no parameters are required for initializing a vector, but in the case of\n * loading a previously dumped vector the raw elements can be provided to the constructor.\n *\n * For performance reasons vectors are implemented with a flat array, where an elements\n * index is immediately followed by its value. E.g. [index, value, index, value]. This\n * allows the underlying array to be as sparse as possible and still offer decent\n * performance when being used for vector calculations.\n *\n * @constructor\n * @param {Number[]} [elements] - The flat list of element index and element value pairs.\n */\nlunr.Vector = function (elements) {\n this._magnitude = 0\n this.elements = elements || []\n}\n\n\n/**\n * Calculates the position within the vector to insert a given index.\n *\n * This is used internally by insert and upsert. If there are duplicate indexes then\n * the position is returned as if the value for that index were to be updated, but it\n * is the callers responsibility to check whether there is a duplicate at that index\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @returns {Number}\n */\nlunr.Vector.prototype.positionForIndex = function (index) {\n // For an empty vector the tuple can be inserted at the beginning\n if (this.elements.length == 0) {\n return 0\n }\n\n var start = 0,\n end = this.elements.length / 2,\n sliceLength = end - start,\n pivotPoint = Math.floor(sliceLength / 2),\n pivotIndex = this.elements[pivotPoint * 2]\n\n while (sliceLength > 1) {\n if (pivotIndex < index) {\n start = pivotPoint\n }\n\n if (pivotIndex > index) {\n end = pivotPoint\n }\n\n if (pivotIndex == index) {\n break\n }\n\n sliceLength = end - start\n pivotPoint = start + Math.floor(sliceLength / 2)\n pivotIndex = this.elements[pivotPoint * 2]\n }\n\n if (pivotIndex == index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex > index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex < index) {\n return (pivotPoint + 1) * 2\n }\n}\n\n/**\n * Inserts an element at an index within the vector.\n *\n * Does not allow duplicates, will throw an error if there is already an entry\n * for this index.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n */\nlunr.Vector.prototype.insert = function (insertIdx, val) {\n this.upsert(insertIdx, val, function () {\n throw \"duplicate index\"\n })\n}\n\n/**\n * Inserts or updates an existing index within the vector.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n * @param {function} fn - A function that is called for updates, the existing value and the\n * requested value are passed as arguments\n */\nlunr.Vector.prototype.upsert = function (insertIdx, val, fn) {\n this._magnitude = 0\n var position = this.positionForIndex(insertIdx)\n\n if (this.elements[position] == insertIdx) {\n this.elements[position + 1] = fn(this.elements[position + 1], val)\n } else {\n this.elements.splice(position, 0, insertIdx, val)\n }\n}\n\n/**\n * Calculates the magnitude of this vector.\n *\n * @returns {Number}\n */\nlunr.Vector.prototype.magnitude = function () {\n if (this._magnitude) return this._magnitude\n\n var sumOfSquares = 0,\n elementsLength = this.elements.length\n\n for (var i = 1; i < elementsLength; i += 2) {\n var val = this.elements[i]\n sumOfSquares += val * val\n }\n\n return this._magnitude = Math.sqrt(sumOfSquares)\n}\n\n/**\n * Calculates the dot product of this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The vector to compute the dot product with.\n * @returns {Number}\n */\nlunr.Vector.prototype.dot = function (otherVector) {\n var dotProduct = 0,\n a = this.elements, b = otherVector.elements,\n aLen = a.length, bLen = b.length,\n aVal = 0, bVal = 0,\n i = 0, j = 0\n\n while (i < aLen && j < bLen) {\n aVal = a[i], bVal = b[j]\n if (aVal < bVal) {\n i += 2\n } else if (aVal > bVal) {\n j += 2\n } else if (aVal == bVal) {\n dotProduct += a[i + 1] * b[j + 1]\n i += 2\n j += 2\n }\n }\n\n return dotProduct\n}\n\n/**\n * Calculates the similarity between this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The other vector to calculate the\n * similarity with.\n * @returns {Number}\n */\nlunr.Vector.prototype.similarity = function (otherVector) {\n return this.dot(otherVector) / this.magnitude() || 0\n}\n\n/**\n * Converts the vector to an array of the elements within the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toArray = function () {\n var output = new Array (this.elements.length / 2)\n\n for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {\n output[j] = this.elements[i]\n }\n\n return output\n}\n\n/**\n * A JSON serializable representation of the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toJSON = function () {\n return this.elements\n}\n/* eslint-disable */\n/*!\n * lunr.stemmer\n * Copyright (C) 2020 Oliver Nightingale\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n/**\n * lunr.stemmer is an english language stemmer, this is a JavaScript\n * implementation of the PorterStemmer taken from http://tartarus.org/~martin\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token - The string to stem\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n * @function\n */\nlunr.stemmer = (function(){\n var step2list = {\n \"ational\" : \"ate\",\n \"tional\" : \"tion\",\n \"enci\" : \"ence\",\n \"anci\" : \"ance\",\n \"izer\" : \"ize\",\n \"bli\" : \"ble\",\n \"alli\" : \"al\",\n \"entli\" : \"ent\",\n \"eli\" : \"e\",\n \"ousli\" : \"ous\",\n \"ization\" : \"ize\",\n \"ation\" : \"ate\",\n \"ator\" : \"ate\",\n \"alism\" : \"al\",\n \"iveness\" : \"ive\",\n \"fulness\" : \"ful\",\n \"ousness\" : \"ous\",\n \"aliti\" : \"al\",\n \"iviti\" : \"ive\",\n \"biliti\" : \"ble\",\n \"logi\" : \"log\"\n },\n\n step3list = {\n \"icate\" : \"ic\",\n \"ative\" : \"\",\n \"alize\" : \"al\",\n \"iciti\" : \"ic\",\n \"ical\" : \"ic\",\n \"ful\" : \"\",\n \"ness\" : \"\"\n },\n\n c = \"[^aeiou]\", // consonant\n v = \"[aeiouy]\", // vowel\n C = c + \"[^aeiouy]*\", // consonant sequence\n V = v + \"[aeiou]*\", // vowel sequence\n\n mgr0 = \"^(\" + C + \")?\" + V + C, // [C]VC... is m>0\n meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\", // [C]VC[V] is m=1\n mgr1 = \"^(\" + C + \")?\" + V + C + V + C, // [C]VCVC... is m>1\n s_v = \"^(\" + C + \")?\" + v; // vowel in stem\n\n var re_mgr0 = new RegExp(mgr0);\n var re_mgr1 = new RegExp(mgr1);\n var re_meq1 = new RegExp(meq1);\n var re_s_v = new RegExp(s_v);\n\n var re_1a = /^(.+?)(ss|i)es$/;\n var re2_1a = /^(.+?)([^s])s$/;\n var re_1b = /^(.+?)eed$/;\n var re2_1b = /^(.+?)(ed|ing)$/;\n var re_1b_2 = /.$/;\n var re2_1b_2 = /(at|bl|iz)$/;\n var re3_1b_2 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n var re4_1b_2 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var re_1c = /^(.+?[^aeiou])y$/;\n var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n\n var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n\n var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n var re2_4 = /^(.+?)(s|t)(ion)$/;\n\n var re_5 = /^(.+?)e$/;\n var re_5_1 = /ll$/;\n var re3_5 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var porterStemmer = function porterStemmer(w) {\n var stem,\n suffix,\n firstch,\n re,\n re2,\n re3,\n re4;\n\n if (w.length < 3) { return w; }\n\n firstch = w.substr(0,1);\n if (firstch == \"y\") {\n w = firstch.toUpperCase() + w.substr(1);\n }\n\n // Step 1a\n re = re_1a\n re2 = re2_1a;\n\n if (re.test(w)) { w = w.replace(re,\"$1$2\"); }\n else if (re2.test(w)) { w = w.replace(re2,\"$1$2\"); }\n\n // Step 1b\n re = re_1b;\n re2 = re2_1b;\n if (re.test(w)) {\n var fp = re.exec(w);\n re = re_mgr0;\n if (re.test(fp[1])) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1];\n re2 = re_s_v;\n if (re2.test(stem)) {\n w = stem;\n re2 = re2_1b_2;\n re3 = re3_1b_2;\n re4 = re4_1b_2;\n if (re2.test(w)) { w = w + \"e\"; }\n else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,\"\"); }\n else if (re4.test(w)) { w = w + \"e\"; }\n }\n }\n\n // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)\n re = re_1c;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n w = stem + \"i\";\n }\n\n // Step 2\n re = re_2;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step2list[suffix];\n }\n }\n\n // Step 3\n re = re_3;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step3list[suffix];\n }\n }\n\n // Step 4\n re = re_4;\n re2 = re2_4;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n if (re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1] + fp[2];\n re2 = re_mgr1;\n if (re2.test(stem)) {\n w = stem;\n }\n }\n\n // Step 5\n re = re_5;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n re2 = re_meq1;\n re3 = re3_5;\n if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {\n w = stem;\n }\n }\n\n re = re_5_1;\n re2 = re_mgr1;\n if (re.test(w) && re2.test(w)) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n\n // and turn initial Y back to y\n\n if (firstch == \"y\") {\n w = firstch.toLowerCase() + w.substr(1);\n }\n\n return w;\n };\n\n return function (token) {\n return token.update(porterStemmer);\n }\n})();\n\nlunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')\n/*!\n * lunr.stopWordFilter\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.generateStopWordFilter builds a stopWordFilter function from the provided\n * list of stop words.\n *\n * The built in lunr.stopWordFilter is built using this generator and can be used\n * to generate custom stopWordFilters for applications or non English languages.\n *\n * @function\n * @param {Array} token The token to pass through the filter\n * @returns {lunr.PipelineFunction}\n * @see lunr.Pipeline\n * @see lunr.stopWordFilter\n */\nlunr.generateStopWordFilter = function (stopWords) {\n var words = stopWords.reduce(function (memo, stopWord) {\n memo[stopWord] = stopWord\n return memo\n }, {})\n\n return function (token) {\n if (token && words[token.toString()] !== token.toString()) return token\n }\n}\n\n/**\n * lunr.stopWordFilter is an English language stop word list filter, any words\n * contained in the list will not be passed through the filter.\n *\n * This is intended to be used in the Pipeline. If the token does not pass the\n * filter then undefined will be returned.\n *\n * @function\n * @implements {lunr.PipelineFunction}\n * @params {lunr.Token} token - A token to check for being a stop word.\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n */\nlunr.stopWordFilter = lunr.generateStopWordFilter([\n 'a',\n 'able',\n 'about',\n 'across',\n 'after',\n 'all',\n 'almost',\n 'also',\n 'am',\n 'among',\n 'an',\n 'and',\n 'any',\n 'are',\n 'as',\n 'at',\n 'be',\n 'because',\n 'been',\n 'but',\n 'by',\n 'can',\n 'cannot',\n 'could',\n 'dear',\n 'did',\n 'do',\n 'does',\n 'either',\n 'else',\n 'ever',\n 'every',\n 'for',\n 'from',\n 'get',\n 'got',\n 'had',\n 'has',\n 'have',\n 'he',\n 'her',\n 'hers',\n 'him',\n 'his',\n 'how',\n 'however',\n 'i',\n 'if',\n 'in',\n 'into',\n 'is',\n 'it',\n 'its',\n 'just',\n 'least',\n 'let',\n 'like',\n 'likely',\n 'may',\n 'me',\n 'might',\n 'most',\n 'must',\n 'my',\n 'neither',\n 'no',\n 'nor',\n 'not',\n 'of',\n 'off',\n 'often',\n 'on',\n 'only',\n 'or',\n 'other',\n 'our',\n 'own',\n 'rather',\n 'said',\n 'say',\n 'says',\n 'she',\n 'should',\n 'since',\n 'so',\n 'some',\n 'than',\n 'that',\n 'the',\n 'their',\n 'them',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'tis',\n 'to',\n 'too',\n 'twas',\n 'us',\n 'wants',\n 'was',\n 'we',\n 'were',\n 'what',\n 'when',\n 'where',\n 'which',\n 'while',\n 'who',\n 'whom',\n 'why',\n 'will',\n 'with',\n 'would',\n 'yet',\n 'you',\n 'your'\n])\n\nlunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')\n/*!\n * lunr.trimmer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.trimmer is a pipeline function for trimming non word\n * characters from the beginning and end of tokens before they\n * enter the index.\n *\n * This implementation may not work correctly for non latin\n * characters and should either be removed or adapted for use\n * with languages with non-latin characters.\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token The token to pass through the filter\n * @returns {lunr.Token}\n * @see lunr.Pipeline\n */\nlunr.trimmer = function (token) {\n return token.update(function (s) {\n return s.replace(/^\\W+/, '').replace(/\\W+$/, '')\n })\n}\n\nlunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')\n/*!\n * lunr.TokenSet\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A token set is used to store the unique list of all tokens\n * within an index. Token sets are also used to represent an\n * incoming query to the index, this query token set and index\n * token set are then intersected to find which tokens to look\n * up in the inverted index.\n *\n * A token set can hold multiple tokens, as in the case of the\n * index token set, or it can hold a single token as in the\n * case of a simple query token set.\n *\n * Additionally token sets are used to perform wildcard matching.\n * Leading, contained and trailing wildcards are supported, and\n * from this edit distance matching can also be provided.\n *\n * Token sets are implemented as a minimal finite state automata,\n * where both common prefixes and suffixes are shared between tokens.\n * This helps to reduce the space used for storing the token set.\n *\n * @constructor\n */\nlunr.TokenSet = function () {\n this.final = false\n this.edges = {}\n this.id = lunr.TokenSet._nextId\n lunr.TokenSet._nextId += 1\n}\n\n/**\n * Keeps track of the next, auto increment, identifier to assign\n * to a new tokenSet.\n *\n * TokenSets require a unique identifier to be correctly minimised.\n *\n * @private\n */\nlunr.TokenSet._nextId = 1\n\n/**\n * Creates a TokenSet instance from the given sorted array of words.\n *\n * @param {String[]} arr - A sorted array of strings to create the set from.\n * @returns {lunr.TokenSet}\n * @throws Will throw an error if the input array is not sorted.\n */\nlunr.TokenSet.fromArray = function (arr) {\n var builder = new lunr.TokenSet.Builder\n\n for (var i = 0, len = arr.length; i < len; i++) {\n builder.insert(arr[i])\n }\n\n builder.finish()\n return builder.root\n}\n\n/**\n * Creates a token set from a query clause.\n *\n * @private\n * @param {Object} clause - A single clause from lunr.Query.\n * @param {string} clause.term - The query clause term.\n * @param {number} [clause.editDistance] - The optional edit distance for the term.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromClause = function (clause) {\n if ('editDistance' in clause) {\n return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)\n } else {\n return lunr.TokenSet.fromString(clause.term)\n }\n}\n\n/**\n * Creates a token set representing a single string with a specified\n * edit distance.\n *\n * Insertions, deletions, substitutions and transpositions are each\n * treated as an edit distance of 1.\n *\n * Increasing the allowed edit distance will have a dramatic impact\n * on the performance of both creating and intersecting these TokenSets.\n * It is advised to keep the edit distance less than 3.\n *\n * @param {string} str - The string to create the token set from.\n * @param {number} editDistance - The allowed edit distance to match.\n * @returns {lunr.Vector}\n */\nlunr.TokenSet.fromFuzzyString = function (str, editDistance) {\n var root = new lunr.TokenSet\n\n var stack = [{\n node: root,\n editsRemaining: editDistance,\n str: str\n }]\n\n while (stack.length) {\n var frame = stack.pop()\n\n // no edit\n if (frame.str.length > 0) {\n var char = frame.str.charAt(0),\n noEditNode\n\n if (char in frame.node.edges) {\n noEditNode = frame.node.edges[char]\n } else {\n noEditNode = new lunr.TokenSet\n frame.node.edges[char] = noEditNode\n }\n\n if (frame.str.length == 1) {\n noEditNode.final = true\n }\n\n stack.push({\n node: noEditNode,\n editsRemaining: frame.editsRemaining,\n str: frame.str.slice(1)\n })\n }\n\n if (frame.editsRemaining == 0) {\n continue\n }\n\n // insertion\n if (\"*\" in frame.node.edges) {\n var insertionNode = frame.node.edges[\"*\"]\n } else {\n var insertionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = insertionNode\n }\n\n if (frame.str.length == 0) {\n insertionNode.final = true\n }\n\n stack.push({\n node: insertionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str\n })\n\n // deletion\n // can only do a deletion if we have enough edits remaining\n // and if there are characters left to delete in the string\n if (frame.str.length > 1) {\n stack.push({\n node: frame.node,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // deletion\n // just removing the last character from the str\n if (frame.str.length == 1) {\n frame.node.final = true\n }\n\n // substitution\n // can only do a substitution if we have enough edits remaining\n // and if there are characters left to substitute\n if (frame.str.length >= 1) {\n if (\"*\" in frame.node.edges) {\n var substitutionNode = frame.node.edges[\"*\"]\n } else {\n var substitutionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = substitutionNode\n }\n\n if (frame.str.length == 1) {\n substitutionNode.final = true\n }\n\n stack.push({\n node: substitutionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // transposition\n // can only do a transposition if there are edits remaining\n // and there are enough characters to transpose\n if (frame.str.length > 1) {\n var charA = frame.str.charAt(0),\n charB = frame.str.charAt(1),\n transposeNode\n\n if (charB in frame.node.edges) {\n transposeNode = frame.node.edges[charB]\n } else {\n transposeNode = new lunr.TokenSet\n frame.node.edges[charB] = transposeNode\n }\n\n if (frame.str.length == 1) {\n transposeNode.final = true\n }\n\n stack.push({\n node: transposeNode,\n editsRemaining: frame.editsRemaining - 1,\n str: charA + frame.str.slice(2)\n })\n }\n }\n\n return root\n}\n\n/**\n * Creates a TokenSet from a string.\n *\n * The string may contain one or more wildcard characters (*)\n * that will allow wildcard matching when intersecting with\n * another TokenSet.\n *\n * @param {string} str - The string to create a TokenSet from.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromString = function (str) {\n var node = new lunr.TokenSet,\n root = node\n\n /*\n * Iterates through all characters within the passed string\n * appending a node for each character.\n *\n * When a wildcard character is found then a self\n * referencing edge is introduced to continually match\n * any number of any characters.\n */\n for (var i = 0, len = str.length; i < len; i++) {\n var char = str[i],\n final = (i == len - 1)\n\n if (char == \"*\") {\n node.edges[char] = node\n node.final = final\n\n } else {\n var next = new lunr.TokenSet\n next.final = final\n\n node.edges[char] = next\n node = next\n }\n }\n\n return root\n}\n\n/**\n * Converts this TokenSet into an array of strings\n * contained within the TokenSet.\n *\n * This is not intended to be used on a TokenSet that\n * contains wildcards, in these cases the results are\n * undefined and are likely to cause an infinite loop.\n *\n * @returns {string[]}\n */\nlunr.TokenSet.prototype.toArray = function () {\n var words = []\n\n var stack = [{\n prefix: \"\",\n node: this\n }]\n\n while (stack.length) {\n var frame = stack.pop(),\n edges = Object.keys(frame.node.edges),\n len = edges.length\n\n if (frame.node.final) {\n /* In Safari, at this point the prefix is sometimes corrupted, see:\n * https://github.com/olivernn/lunr.js/issues/279 Calling any\n * String.prototype method forces Safari to \"cast\" this string to what\n * it's supposed to be, fixing the bug. */\n frame.prefix.charAt(0)\n words.push(frame.prefix)\n }\n\n for (var i = 0; i < len; i++) {\n var edge = edges[i]\n\n stack.push({\n prefix: frame.prefix.concat(edge),\n node: frame.node.edges[edge]\n })\n }\n }\n\n return words\n}\n\n/**\n * Generates a string representation of a TokenSet.\n *\n * This is intended to allow TokenSets to be used as keys\n * in objects, largely to aid the construction and minimisation\n * of a TokenSet. As such it is not designed to be a human\n * friendly representation of the TokenSet.\n *\n * @returns {string}\n */\nlunr.TokenSet.prototype.toString = function () {\n // NOTE: Using Object.keys here as this.edges is very likely\n // to enter 'hash-mode' with many keys being added\n //\n // avoiding a for-in loop here as it leads to the function\n // being de-optimised (at least in V8). From some simple\n // benchmarks the performance is comparable, but allowing\n // V8 to optimize may mean easy performance wins in the future.\n\n if (this._str) {\n return this._str\n }\n\n var str = this.final ? '1' : '0',\n labels = Object.keys(this.edges).sort(),\n len = labels.length\n\n for (var i = 0; i < len; i++) {\n var label = labels[i],\n node = this.edges[label]\n\n str = str + label + node.id\n }\n\n return str\n}\n\n/**\n * Returns a new TokenSet that is the intersection of\n * this TokenSet and the passed TokenSet.\n *\n * This intersection will take into account any wildcards\n * contained within the TokenSet.\n *\n * @param {lunr.TokenSet} b - An other TokenSet to intersect with.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.prototype.intersect = function (b) {\n var output = new lunr.TokenSet,\n frame = undefined\n\n var stack = [{\n qNode: b,\n output: output,\n node: this\n }]\n\n while (stack.length) {\n frame = stack.pop()\n\n // NOTE: As with the #toString method, we are using\n // Object.keys and a for loop instead of a for-in loop\n // as both of these objects enter 'hash' mode, causing\n // the function to be de-optimised in V8\n var qEdges = Object.keys(frame.qNode.edges),\n qLen = qEdges.length,\n nEdges = Object.keys(frame.node.edges),\n nLen = nEdges.length\n\n for (var q = 0; q < qLen; q++) {\n var qEdge = qEdges[q]\n\n for (var n = 0; n < nLen; n++) {\n var nEdge = nEdges[n]\n\n if (nEdge == qEdge || qEdge == '*') {\n var node = frame.node.edges[nEdge],\n qNode = frame.qNode.edges[qEdge],\n final = node.final && qNode.final,\n next = undefined\n\n if (nEdge in frame.output.edges) {\n // an edge already exists for this character\n // no need to create a new node, just set the finality\n // bit unless this node is already final\n next = frame.output.edges[nEdge]\n next.final = next.final || final\n\n } else {\n // no edge exists yet, must create one\n // set the finality bit and insert it\n // into the output\n next = new lunr.TokenSet\n next.final = final\n frame.output.edges[nEdge] = next\n }\n\n stack.push({\n qNode: qNode,\n output: next,\n node: node\n })\n }\n }\n }\n }\n\n return output\n}\nlunr.TokenSet.Builder = function () {\n this.previousWord = \"\"\n this.root = new lunr.TokenSet\n this.uncheckedNodes = []\n this.minimizedNodes = {}\n}\n\nlunr.TokenSet.Builder.prototype.insert = function (word) {\n var node,\n commonPrefix = 0\n\n if (word < this.previousWord) {\n throw new Error (\"Out of order word insertion\")\n }\n\n for (var i = 0; i < word.length && i < this.previousWord.length; i++) {\n if (word[i] != this.previousWord[i]) break\n commonPrefix++\n }\n\n this.minimize(commonPrefix)\n\n if (this.uncheckedNodes.length == 0) {\n node = this.root\n } else {\n node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child\n }\n\n for (var i = commonPrefix; i < word.length; i++) {\n var nextNode = new lunr.TokenSet,\n char = word[i]\n\n node.edges[char] = nextNode\n\n this.uncheckedNodes.push({\n parent: node,\n char: char,\n child: nextNode\n })\n\n node = nextNode\n }\n\n node.final = true\n this.previousWord = word\n}\n\nlunr.TokenSet.Builder.prototype.finish = function () {\n this.minimize(0)\n}\n\nlunr.TokenSet.Builder.prototype.minimize = function (downTo) {\n for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {\n var node = this.uncheckedNodes[i],\n childKey = node.child.toString()\n\n if (childKey in this.minimizedNodes) {\n node.parent.edges[node.char] = this.minimizedNodes[childKey]\n } else {\n // Cache the key for this node since\n // we know it can't change anymore\n node.child._str = childKey\n\n this.minimizedNodes[childKey] = node.child\n }\n\n this.uncheckedNodes.pop()\n }\n}\n/*!\n * lunr.Index\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * An index contains the built index of all documents and provides a query interface\n * to the index.\n *\n * Usually instances of lunr.Index will not be created using this constructor, instead\n * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be\n * used to load previously built and serialized indexes.\n *\n * @constructor\n * @param {Object} attrs - The attributes of the built search index.\n * @param {Object} attrs.invertedIndex - An index of term/field to document reference.\n * @param {Object} attrs.fieldVectors - Field vectors\n * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.\n * @param {string[]} attrs.fields - The names of indexed document fields.\n * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.\n */\nlunr.Index = function (attrs) {\n this.invertedIndex = attrs.invertedIndex\n this.fieldVectors = attrs.fieldVectors\n this.tokenSet = attrs.tokenSet\n this.fields = attrs.fields\n this.pipeline = attrs.pipeline\n}\n\n/**\n * A result contains details of a document matching a search query.\n * @typedef {Object} lunr.Index~Result\n * @property {string} ref - The reference of the document this result represents.\n * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.\n * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.\n */\n\n/**\n * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple\n * query language which itself is parsed into an instance of lunr.Query.\n *\n * For programmatically building queries it is advised to directly use lunr.Query, the query language\n * is best used for human entered text rather than program generated text.\n *\n * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported\n * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'\n * or 'world', though those that contain both will rank higher in the results.\n *\n * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can\n * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding\n * wildcards will increase the number of documents that will be found but can also have a negative\n * impact on query performance, especially with wildcards at the beginning of a term.\n *\n * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term\n * hello in the title field will match this query. Using a field not present in the index will lead\n * to an error being thrown.\n *\n * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term\n * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported\n * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.\n * Avoid large values for edit distance to improve query performance.\n *\n * Each term also supports a presence modifier. By default a term's presence in document is optional, however\n * this can be changed to either required or prohibited. For a term's presence to be required in a document the\n * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and\n * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not\n * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.\n *\n * To escape special characters the backslash character '\\' can be used, this allows searches to include\n * characters that would normally be considered modifiers, e.g. `foo\\~2` will search for a term \"foo~2\" instead\n * of attempting to apply a boost of 2 to the search term \"foo\".\n *\n * @typedef {string} lunr.Index~QueryString\n * @example Simple single term query\n * hello\n * @example Multiple term query\n * hello world\n * @example term scoped to a field\n * title:hello\n * @example term with a boost of 10\n * hello^10\n * @example term with an edit distance of 2\n * hello~2\n * @example terms with presence modifiers\n * -foo +bar baz\n */\n\n/**\n * Performs a search against the index using lunr query syntax.\n *\n * Results will be returned sorted by their score, the most relevant results\n * will be returned first. For details on how the score is calculated, please see\n * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.\n *\n * For more programmatic querying use lunr.Index#query.\n *\n * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.\n * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.search = function (queryString) {\n return this.query(function (query) {\n var parser = new lunr.QueryParser(queryString, query)\n parser.parse()\n })\n}\n\n/**\n * A query builder callback provides a query object to be used to express\n * the query to perform on the index.\n *\n * @callback lunr.Index~queryBuilder\n * @param {lunr.Query} query - The query object to build up.\n * @this lunr.Query\n */\n\n/**\n * Performs a query against the index using the yielded lunr.Query object.\n *\n * If performing programmatic queries against the index, this method is preferred\n * over lunr.Index#search so as to avoid the additional query parsing overhead.\n *\n * A query object is yielded to the supplied function which should be used to\n * express the query to be run against the index.\n *\n * Note that although this function takes a callback parameter it is _not_ an\n * asynchronous operation, the callback is just yielded a query object to be\n * customized.\n *\n * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.query = function (fn) {\n // for each query clause\n // * process terms\n // * expand terms from token set\n // * find matching documents and metadata\n // * get document vectors\n // * score documents\n\n var query = new lunr.Query(this.fields),\n matchingFields = Object.create(null),\n queryVectors = Object.create(null),\n termFieldCache = Object.create(null),\n requiredMatches = Object.create(null),\n prohibitedMatches = Object.create(null)\n\n /*\n * To support field level boosts a query vector is created per\n * field. An empty vector is eagerly created to support negated\n * queries.\n */\n for (var i = 0; i < this.fields.length; i++) {\n queryVectors[this.fields[i]] = new lunr.Vector\n }\n\n fn.call(query, query)\n\n for (var i = 0; i < query.clauses.length; i++) {\n /*\n * Unless the pipeline has been disabled for this term, which is\n * the case for terms with wildcards, we need to pass the clause\n * term through the search pipeline. A pipeline returns an array\n * of processed terms. Pipeline functions may expand the passed\n * term, which means we may end up performing multiple index lookups\n * for a single query term.\n */\n var clause = query.clauses[i],\n terms = null,\n clauseMatches = lunr.Set.empty\n\n if (clause.usePipeline) {\n terms = this.pipeline.runString(clause.term, {\n fields: clause.fields\n })\n } else {\n terms = [clause.term]\n }\n\n for (var m = 0; m < terms.length; m++) {\n var term = terms[m]\n\n /*\n * Each term returned from the pipeline needs to use the same query\n * clause object, e.g. the same boost and or edit distance. The\n * simplest way to do this is to re-use the clause object but mutate\n * its term property.\n */\n clause.term = term\n\n /*\n * From the term in the clause we create a token set which will then\n * be used to intersect the indexes token set to get a list of terms\n * to lookup in the inverted index\n */\n var termTokenSet = lunr.TokenSet.fromClause(clause),\n expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()\n\n /*\n * If a term marked as required does not exist in the tokenSet it is\n * impossible for the search to return any matches. We set all the field\n * scoped required matches set to empty and stop examining any further\n * clauses.\n */\n if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = lunr.Set.empty\n }\n\n break\n }\n\n for (var j = 0; j < expandedTerms.length; j++) {\n /*\n * For each term get the posting and termIndex, this is required for\n * building the query vector.\n */\n var expandedTerm = expandedTerms[j],\n posting = this.invertedIndex[expandedTerm],\n termIndex = posting._index\n\n for (var k = 0; k < clause.fields.length; k++) {\n /*\n * For each field that this query term is scoped by (by default\n * all fields are in scope) we need to get all the document refs\n * that have this term in that field.\n *\n * The posting is the entry in the invertedIndex for the matching\n * term from above.\n */\n var field = clause.fields[k],\n fieldPosting = posting[field],\n matchingDocumentRefs = Object.keys(fieldPosting),\n termField = expandedTerm + \"/\" + field,\n matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)\n\n /*\n * if the presence of this term is required ensure that the matching\n * documents are added to the set of required matches for this clause.\n *\n */\n if (clause.presence == lunr.Query.presence.REQUIRED) {\n clauseMatches = clauseMatches.union(matchingDocumentsSet)\n\n if (requiredMatches[field] === undefined) {\n requiredMatches[field] = lunr.Set.complete\n }\n }\n\n /*\n * if the presence of this term is prohibited ensure that the matching\n * documents are added to the set of prohibited matches for this field,\n * creating that set if it does not yet exist.\n */\n if (clause.presence == lunr.Query.presence.PROHIBITED) {\n if (prohibitedMatches[field] === undefined) {\n prohibitedMatches[field] = lunr.Set.empty\n }\n\n prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)\n\n /*\n * Prohibited matches should not be part of the query vector used for\n * similarity scoring and no metadata should be extracted so we continue\n * to the next field\n */\n continue\n }\n\n /*\n * The query field vector is populated using the termIndex found for\n * the term and a unit value with the appropriate boost applied.\n * Using upsert because there could already be an entry in the vector\n * for the term we are working with. In that case we just add the scores\n * together.\n */\n queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })\n\n /**\n * If we've already seen this term, field combo then we've already collected\n * the matching documents and metadata, no need to go through all that again\n */\n if (termFieldCache[termField]) {\n continue\n }\n\n for (var l = 0; l < matchingDocumentRefs.length; l++) {\n /*\n * All metadata for this term/field/document triple\n * are then extracted and collected into an instance\n * of lunr.MatchData ready to be returned in the query\n * results\n */\n var matchingDocumentRef = matchingDocumentRefs[l],\n matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),\n metadata = fieldPosting[matchingDocumentRef],\n fieldMatch\n\n if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {\n matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)\n } else {\n fieldMatch.add(expandedTerm, field, metadata)\n }\n\n }\n\n termFieldCache[termField] = true\n }\n }\n }\n\n /**\n * If the presence was required we need to update the requiredMatches field sets.\n * We do this after all fields for the term have collected their matches because\n * the clause terms presence is required in _any_ of the fields not _all_ of the\n * fields.\n */\n if (clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)\n }\n }\n }\n\n /**\n * Need to combine the field scoped required and prohibited\n * matching documents into a global set of required and prohibited\n * matches\n */\n var allRequiredMatches = lunr.Set.complete,\n allProhibitedMatches = lunr.Set.empty\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i]\n\n if (requiredMatches[field]) {\n allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])\n }\n\n if (prohibitedMatches[field]) {\n allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])\n }\n }\n\n var matchingFieldRefs = Object.keys(matchingFields),\n results = [],\n matches = Object.create(null)\n\n /*\n * If the query is negated (contains only prohibited terms)\n * we need to get _all_ fieldRefs currently existing in the\n * index. This is only done when we know that the query is\n * entirely prohibited terms to avoid any cost of getting all\n * fieldRefs unnecessarily.\n *\n * Additionally, blank MatchData must be created to correctly\n * populate the results.\n */\n if (query.isNegated()) {\n matchingFieldRefs = Object.keys(this.fieldVectors)\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n var matchingFieldRef = matchingFieldRefs[i]\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)\n matchingFields[matchingFieldRef] = new lunr.MatchData\n }\n }\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n /*\n * Currently we have document fields that match the query, but we\n * need to return documents. The matchData and scores are combined\n * from multiple fields belonging to the same document.\n *\n * Scores are calculated by field, using the query vectors created\n * above, and combined into a final document score using addition.\n */\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),\n docRef = fieldRef.docRef\n\n if (!allRequiredMatches.contains(docRef)) {\n continue\n }\n\n if (allProhibitedMatches.contains(docRef)) {\n continue\n }\n\n var fieldVector = this.fieldVectors[fieldRef],\n score = queryVectors[fieldRef.fieldName].similarity(fieldVector),\n docMatch\n\n if ((docMatch = matches[docRef]) !== undefined) {\n docMatch.score += score\n docMatch.matchData.combine(matchingFields[fieldRef])\n } else {\n var match = {\n ref: docRef,\n score: score,\n matchData: matchingFields[fieldRef]\n }\n matches[docRef] = match\n results.push(match)\n }\n }\n\n /*\n * Sort the results objects by score, highest first.\n */\n return results.sort(function (a, b) {\n return b.score - a.score\n })\n}\n\n/**\n * Prepares the index for JSON serialization.\n *\n * The schema for this JSON blob will be described in a\n * separate JSON schema file.\n *\n * @returns {Object}\n */\nlunr.Index.prototype.toJSON = function () {\n var invertedIndex = Object.keys(this.invertedIndex)\n .sort()\n .map(function (term) {\n return [term, this.invertedIndex[term]]\n }, this)\n\n var fieldVectors = Object.keys(this.fieldVectors)\n .map(function (ref) {\n return [ref, this.fieldVectors[ref].toJSON()]\n }, this)\n\n return {\n version: lunr.version,\n fields: this.fields,\n fieldVectors: fieldVectors,\n invertedIndex: invertedIndex,\n pipeline: this.pipeline.toJSON()\n }\n}\n\n/**\n * Loads a previously serialized lunr.Index\n *\n * @param {Object} serializedIndex - A previously serialized lunr.Index\n * @returns {lunr.Index}\n */\nlunr.Index.load = function (serializedIndex) {\n var attrs = {},\n fieldVectors = {},\n serializedVectors = serializedIndex.fieldVectors,\n invertedIndex = Object.create(null),\n serializedInvertedIndex = serializedIndex.invertedIndex,\n tokenSetBuilder = new lunr.TokenSet.Builder,\n pipeline = lunr.Pipeline.load(serializedIndex.pipeline)\n\n if (serializedIndex.version != lunr.version) {\n lunr.utils.warn(\"Version mismatch when loading serialised index. Current version of lunr '\" + lunr.version + \"' does not match serialized index '\" + serializedIndex.version + \"'\")\n }\n\n for (var i = 0; i < serializedVectors.length; i++) {\n var tuple = serializedVectors[i],\n ref = tuple[0],\n elements = tuple[1]\n\n fieldVectors[ref] = new lunr.Vector(elements)\n }\n\n for (var i = 0; i < serializedInvertedIndex.length; i++) {\n var tuple = serializedInvertedIndex[i],\n term = tuple[0],\n posting = tuple[1]\n\n tokenSetBuilder.insert(term)\n invertedIndex[term] = posting\n }\n\n tokenSetBuilder.finish()\n\n attrs.fields = serializedIndex.fields\n\n attrs.fieldVectors = fieldVectors\n attrs.invertedIndex = invertedIndex\n attrs.tokenSet = tokenSetBuilder.root\n attrs.pipeline = pipeline\n\n return new lunr.Index(attrs)\n}\n/*!\n * lunr.Builder\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Builder performs indexing on a set of documents and\n * returns instances of lunr.Index ready for querying.\n *\n * All configuration of the index is done via the builder, the\n * fields to index, the document reference, the text processing\n * pipeline and document scoring parameters are all set on the\n * builder before indexing.\n *\n * @constructor\n * @property {string} _ref - Internal reference to the document reference field.\n * @property {string[]} _fields - Internal reference to the document fields to index.\n * @property {object} invertedIndex - The inverted index maps terms to document fields.\n * @property {object} documentTermFrequencies - Keeps track of document term frequencies.\n * @property {object} documentLengths - Keeps track of the length of documents added to the index.\n * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.\n * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.\n * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.\n * @property {number} documentCount - Keeps track of the total number of documents indexed.\n * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.\n * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.\n * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.\n * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.\n */\nlunr.Builder = function () {\n this._ref = \"id\"\n this._fields = Object.create(null)\n this._documents = Object.create(null)\n this.invertedIndex = Object.create(null)\n this.fieldTermFrequencies = {}\n this.fieldLengths = {}\n this.tokenizer = lunr.tokenizer\n this.pipeline = new lunr.Pipeline\n this.searchPipeline = new lunr.Pipeline\n this.documentCount = 0\n this._b = 0.75\n this._k1 = 1.2\n this.termIndex = 0\n this.metadataWhitelist = []\n}\n\n/**\n * Sets the document field used as the document reference. Every document must have this field.\n * The type of this field in the document should be a string, if it is not a string it will be\n * coerced into a string by calling toString.\n *\n * The default ref is 'id'.\n *\n * The ref should _not_ be changed during indexing, it should be set before any documents are\n * added to the index. Changing it during indexing can lead to inconsistent results.\n *\n * @param {string} ref - The name of the reference field in the document.\n */\nlunr.Builder.prototype.ref = function (ref) {\n this._ref = ref\n}\n\n/**\n * A function that is used to extract a field from a document.\n *\n * Lunr expects a field to be at the top level of a document, if however the field\n * is deeply nested within a document an extractor function can be used to extract\n * the right field for indexing.\n *\n * @callback fieldExtractor\n * @param {object} doc - The document being added to the index.\n * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.\n * @example Extracting a nested field\n * function (doc) { return doc.nested.field }\n */\n\n/**\n * Adds a field to the list of document fields that will be indexed. Every document being\n * indexed should have this field. Null values for this field in indexed documents will\n * not cause errors but will limit the chance of that document being retrieved by searches.\n *\n * All fields should be added before adding documents to the index. Adding fields after\n * a document has been indexed will have no effect on already indexed documents.\n *\n * Fields can be boosted at build time. This allows terms within that field to have more\n * importance when ranking search results. Use a field boost to specify that matches within\n * one field are more important than other fields.\n *\n * @param {string} fieldName - The name of a field to index in all documents.\n * @param {object} attributes - Optional attributes associated with this field.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.\n * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.\n * @throws {RangeError} fieldName cannot contain unsupported characters '/'\n */\nlunr.Builder.prototype.field = function (fieldName, attributes) {\n if (/\\//.test(fieldName)) {\n throw new RangeError (\"Field '\" + fieldName + \"' contains illegal character '/'\")\n }\n\n this._fields[fieldName] = attributes || {}\n}\n\n/**\n * A parameter to tune the amount of field length normalisation that is applied when\n * calculating relevance scores. A value of 0 will completely disable any normalisation\n * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b\n * will be clamped to the range 0 - 1.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.b = function (number) {\n if (number < 0) {\n this._b = 0\n } else if (number > 1) {\n this._b = 1\n } else {\n this._b = number\n }\n}\n\n/**\n * A parameter that controls the speed at which a rise in term frequency results in term\n * frequency saturation. The default value is 1.2. Setting this to a higher value will give\n * slower saturation levels, a lower value will result in quicker saturation.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.k1 = function (number) {\n this._k1 = number\n}\n\n/**\n * Adds a document to the index.\n *\n * Before adding fields to the index the index should have been fully setup, with the document\n * ref and all fields to index already having been specified.\n *\n * The document must have a field name as specified by the ref (by default this is 'id') and\n * it should have all fields defined for indexing, though null or undefined values will not\n * cause errors.\n *\n * Entire documents can be boosted at build time. Applying a boost to a document indicates that\n * this document should rank higher in search results than other documents.\n *\n * @param {object} doc - The document to add to the index.\n * @param {object} attributes - Optional attributes associated with this document.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.\n */\nlunr.Builder.prototype.add = function (doc, attributes) {\n var docRef = doc[this._ref],\n fields = Object.keys(this._fields)\n\n this._documents[docRef] = attributes || {}\n this.documentCount += 1\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i],\n extractor = this._fields[fieldName].extractor,\n field = extractor ? extractor(doc) : doc[fieldName],\n tokens = this.tokenizer(field, {\n fields: [fieldName]\n }),\n terms = this.pipeline.run(tokens),\n fieldRef = new lunr.FieldRef (docRef, fieldName),\n fieldTerms = Object.create(null)\n\n this.fieldTermFrequencies[fieldRef] = fieldTerms\n this.fieldLengths[fieldRef] = 0\n\n // store the length of this field for this document\n this.fieldLengths[fieldRef] += terms.length\n\n // calculate term frequencies for this field\n for (var j = 0; j < terms.length; j++) {\n var term = terms[j]\n\n if (fieldTerms[term] == undefined) {\n fieldTerms[term] = 0\n }\n\n fieldTerms[term] += 1\n\n // add to inverted index\n // create an initial posting if one doesn't exist\n if (this.invertedIndex[term] == undefined) {\n var posting = Object.create(null)\n posting[\"_index\"] = this.termIndex\n this.termIndex += 1\n\n for (var k = 0; k < fields.length; k++) {\n posting[fields[k]] = Object.create(null)\n }\n\n this.invertedIndex[term] = posting\n }\n\n // add an entry for this term/fieldName/docRef to the invertedIndex\n if (this.invertedIndex[term][fieldName][docRef] == undefined) {\n this.invertedIndex[term][fieldName][docRef] = Object.create(null)\n }\n\n // store all whitelisted metadata about this token in the\n // inverted index\n for (var l = 0; l < this.metadataWhitelist.length; l++) {\n var metadataKey = this.metadataWhitelist[l],\n metadata = term.metadata[metadataKey]\n\n if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {\n this.invertedIndex[term][fieldName][docRef][metadataKey] = []\n }\n\n this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)\n }\n }\n\n }\n}\n\n/**\n * Calculates the average document length for this index\n *\n * @private\n */\nlunr.Builder.prototype.calculateAverageFieldLengths = function () {\n\n var fieldRefs = Object.keys(this.fieldLengths),\n numberOfFields = fieldRefs.length,\n accumulator = {},\n documentsWithField = {}\n\n for (var i = 0; i < numberOfFields; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n field = fieldRef.fieldName\n\n documentsWithField[field] || (documentsWithField[field] = 0)\n documentsWithField[field] += 1\n\n accumulator[field] || (accumulator[field] = 0)\n accumulator[field] += this.fieldLengths[fieldRef]\n }\n\n var fields = Object.keys(this._fields)\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i]\n accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]\n }\n\n this.averageFieldLength = accumulator\n}\n\n/**\n * Builds a vector space model of every document using lunr.Vector\n *\n * @private\n */\nlunr.Builder.prototype.createFieldVectors = function () {\n var fieldVectors = {},\n fieldRefs = Object.keys(this.fieldTermFrequencies),\n fieldRefsLength = fieldRefs.length,\n termIdfCache = Object.create(null)\n\n for (var i = 0; i < fieldRefsLength; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n fieldName = fieldRef.fieldName,\n fieldLength = this.fieldLengths[fieldRef],\n fieldVector = new lunr.Vector,\n termFrequencies = this.fieldTermFrequencies[fieldRef],\n terms = Object.keys(termFrequencies),\n termsLength = terms.length\n\n\n var fieldBoost = this._fields[fieldName].boost || 1,\n docBoost = this._documents[fieldRef.docRef].boost || 1\n\n for (var j = 0; j < termsLength; j++) {\n var term = terms[j],\n tf = termFrequencies[term],\n termIndex = this.invertedIndex[term]._index,\n idf, score, scoreWithPrecision\n\n if (termIdfCache[term] === undefined) {\n idf = lunr.idf(this.invertedIndex[term], this.documentCount)\n termIdfCache[term] = idf\n } else {\n idf = termIdfCache[term]\n }\n\n score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)\n score *= fieldBoost\n score *= docBoost\n scoreWithPrecision = Math.round(score * 1000) / 1000\n // Converts 1.23456789 to 1.234.\n // Reducing the precision so that the vectors take up less\n // space when serialised. Doing it now so that they behave\n // the same before and after serialisation. Also, this is\n // the fastest approach to reducing a number's precision in\n // JavaScript.\n\n fieldVector.insert(termIndex, scoreWithPrecision)\n }\n\n fieldVectors[fieldRef] = fieldVector\n }\n\n this.fieldVectors = fieldVectors\n}\n\n/**\n * Creates a token set of all tokens in the index using lunr.TokenSet\n *\n * @private\n */\nlunr.Builder.prototype.createTokenSet = function () {\n this.tokenSet = lunr.TokenSet.fromArray(\n Object.keys(this.invertedIndex).sort()\n )\n}\n\n/**\n * Builds the index, creating an instance of lunr.Index.\n *\n * This completes the indexing process and should only be called\n * once all documents have been added to the index.\n *\n * @returns {lunr.Index}\n */\nlunr.Builder.prototype.build = function () {\n this.calculateAverageFieldLengths()\n this.createFieldVectors()\n this.createTokenSet()\n\n return new lunr.Index({\n invertedIndex: this.invertedIndex,\n fieldVectors: this.fieldVectors,\n tokenSet: this.tokenSet,\n fields: Object.keys(this._fields),\n pipeline: this.searchPipeline\n })\n}\n\n/**\n * Applies a plugin to the index builder.\n *\n * A plugin is a function that is called with the index builder as its context.\n * Plugins can be used to customise or extend the behaviour of the index\n * in some way. A plugin is just a function, that encapsulated the custom\n * behaviour that should be applied when building the index.\n *\n * The plugin function will be called with the index builder as its argument, additional\n * arguments can also be passed when calling use. The function will be called\n * with the index builder as its context.\n *\n * @param {Function} plugin The plugin to apply.\n */\nlunr.Builder.prototype.use = function (fn) {\n var args = Array.prototype.slice.call(arguments, 1)\n args.unshift(this)\n fn.apply(this, args)\n}\n/**\n * Contains and collects metadata about a matching document.\n * A single instance of lunr.MatchData is returned as part of every\n * lunr.Index~Result.\n *\n * @constructor\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n * @property {object} metadata - A cloned collection of metadata associated with this document.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData = function (term, field, metadata) {\n var clonedMetadata = Object.create(null),\n metadataKeys = Object.keys(metadata || {})\n\n // Cloning the metadata to prevent the original\n // being mutated during match data combination.\n // Metadata is kept in an array within the inverted\n // index so cloning the data can be done with\n // Array#slice\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n clonedMetadata[key] = metadata[key].slice()\n }\n\n this.metadata = Object.create(null)\n\n if (term !== undefined) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = clonedMetadata\n }\n}\n\n/**\n * An instance of lunr.MatchData will be created for every term that matches a\n * document. However only one instance is required in a lunr.Index~Result. This\n * method combines metadata from another instance of lunr.MatchData with this\n * objects metadata.\n *\n * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData.prototype.combine = function (otherMatchData) {\n var terms = Object.keys(otherMatchData.metadata)\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i],\n fields = Object.keys(otherMatchData.metadata[term])\n\n if (this.metadata[term] == undefined) {\n this.metadata[term] = Object.create(null)\n }\n\n for (var j = 0; j < fields.length; j++) {\n var field = fields[j],\n keys = Object.keys(otherMatchData.metadata[term][field])\n\n if (this.metadata[term][field] == undefined) {\n this.metadata[term][field] = Object.create(null)\n }\n\n for (var k = 0; k < keys.length; k++) {\n var key = keys[k]\n\n if (this.metadata[term][field][key] == undefined) {\n this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]\n } else {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])\n }\n\n }\n }\n }\n}\n\n/**\n * Add metadata for a term/field pair to this instance of match data.\n *\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n */\nlunr.MatchData.prototype.add = function (term, field, metadata) {\n if (!(term in this.metadata)) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = metadata\n return\n }\n\n if (!(field in this.metadata[term])) {\n this.metadata[term][field] = metadata\n return\n }\n\n var metadataKeys = Object.keys(metadata)\n\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n\n if (key in this.metadata[term][field]) {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])\n } else {\n this.metadata[term][field][key] = metadata[key]\n }\n }\n}\n/**\n * A lunr.Query provides a programmatic way of defining queries to be performed\n * against a {@link lunr.Index}.\n *\n * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method\n * so the query object is pre-initialized with the right index fields.\n *\n * @constructor\n * @property {lunr.Query~Clause[]} clauses - An array of query clauses.\n * @property {string[]} allFields - An array of all available fields in a lunr.Index.\n */\nlunr.Query = function (allFields) {\n this.clauses = []\n this.allFields = allFields\n}\n\n/**\n * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.\n *\n * This allows wildcards to be added to the beginning and end of a term without having to manually do any string\n * concatenation.\n *\n * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.\n *\n * @constant\n * @default\n * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour\n * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists\n * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with trailing wildcard\n * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING })\n * @example query term with leading and trailing wildcard\n * query.term('foo', {\n * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING\n * })\n */\n\nlunr.Query.wildcard = new String (\"*\")\nlunr.Query.wildcard.NONE = 0\nlunr.Query.wildcard.LEADING = 1\nlunr.Query.wildcard.TRAILING = 2\n\n/**\n * Constants for indicating what kind of presence a term must have in matching documents.\n *\n * @constant\n * @enum {number}\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with required presence\n * query.term('foo', { presence: lunr.Query.presence.REQUIRED })\n */\nlunr.Query.presence = {\n /**\n * Term's presence in a document is optional, this is the default value.\n */\n OPTIONAL: 1,\n\n /**\n * Term's presence in a document is required, documents that do not contain\n * this term will not be returned.\n */\n REQUIRED: 2,\n\n /**\n * Term's presence in a document is prohibited, documents that do contain\n * this term will not be returned.\n */\n PROHIBITED: 3\n}\n\n/**\n * A single clause in a {@link lunr.Query} contains a term and details on how to\n * match that term against a {@link lunr.Index}.\n *\n * @typedef {Object} lunr.Query~Clause\n * @property {string[]} fields - The fields in an index this clause should be matched against.\n * @property {number} [boost=1] - Any boost that should be applied when matching this clause.\n * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.\n * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.\n * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.\n * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.\n */\n\n/**\n * Adds a {@link lunr.Query~Clause} to this query.\n *\n * Unless the clause contains the fields to be matched all fields will be matched. In addition\n * a default boost of 1 is applied to the clause.\n *\n * @param {lunr.Query~Clause} clause - The clause to add to this query.\n * @see lunr.Query~Clause\n * @returns {lunr.Query}\n */\nlunr.Query.prototype.clause = function (clause) {\n if (!('fields' in clause)) {\n clause.fields = this.allFields\n }\n\n if (!('boost' in clause)) {\n clause.boost = 1\n }\n\n if (!('usePipeline' in clause)) {\n clause.usePipeline = true\n }\n\n if (!('wildcard' in clause)) {\n clause.wildcard = lunr.Query.wildcard.NONE\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {\n clause.term = \"*\" + clause.term\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {\n clause.term = \"\" + clause.term + \"*\"\n }\n\n if (!('presence' in clause)) {\n clause.presence = lunr.Query.presence.OPTIONAL\n }\n\n this.clauses.push(clause)\n\n return this\n}\n\n/**\n * A negated query is one in which every clause has a presence of\n * prohibited. These queries require some special processing to return\n * the expected results.\n *\n * @returns boolean\n */\nlunr.Query.prototype.isNegated = function () {\n for (var i = 0; i < this.clauses.length; i++) {\n if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}\n * to the list of clauses that make up this query.\n *\n * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion\n * to a token or token-like string should be done before calling this method.\n *\n * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an\n * array, each term in the array will share the same options.\n *\n * @param {object|object[]} term - The term(s) to add to the query.\n * @param {object} [options] - Any additional properties to add to the query clause.\n * @returns {lunr.Query}\n * @see lunr.Query#clause\n * @see lunr.Query~Clause\n * @example adding a single term to a query\n * query.term(\"foo\")\n * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard\n * query.term(\"foo\", {\n * fields: [\"title\"],\n * boost: 10,\n * wildcard: lunr.Query.wildcard.TRAILING\n * })\n * @example using lunr.tokenizer to convert a string to tokens before using them as terms\n * query.term(lunr.tokenizer(\"foo bar\"))\n */\nlunr.Query.prototype.term = function (term, options) {\n if (Array.isArray(term)) {\n term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this)\n return this\n }\n\n var clause = options || {}\n clause.term = term.toString()\n\n this.clause(clause)\n\n return this\n}\nlunr.QueryParseError = function (message, start, end) {\n this.name = \"QueryParseError\"\n this.message = message\n this.start = start\n this.end = end\n}\n\nlunr.QueryParseError.prototype = new Error\nlunr.QueryLexer = function (str) {\n this.lexemes = []\n this.str = str\n this.length = str.length\n this.pos = 0\n this.start = 0\n this.escapeCharPositions = []\n}\n\nlunr.QueryLexer.prototype.run = function () {\n var state = lunr.QueryLexer.lexText\n\n while (state) {\n state = state(this)\n }\n}\n\nlunr.QueryLexer.prototype.sliceString = function () {\n var subSlices = [],\n sliceStart = this.start,\n sliceEnd = this.pos\n\n for (var i = 0; i < this.escapeCharPositions.length; i++) {\n sliceEnd = this.escapeCharPositions[i]\n subSlices.push(this.str.slice(sliceStart, sliceEnd))\n sliceStart = sliceEnd + 1\n }\n\n subSlices.push(this.str.slice(sliceStart, this.pos))\n this.escapeCharPositions.length = 0\n\n return subSlices.join('')\n}\n\nlunr.QueryLexer.prototype.emit = function (type) {\n this.lexemes.push({\n type: type,\n str: this.sliceString(),\n start: this.start,\n end: this.pos\n })\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.escapeCharacter = function () {\n this.escapeCharPositions.push(this.pos - 1)\n this.pos += 1\n}\n\nlunr.QueryLexer.prototype.next = function () {\n if (this.pos >= this.length) {\n return lunr.QueryLexer.EOS\n }\n\n var char = this.str.charAt(this.pos)\n this.pos += 1\n return char\n}\n\nlunr.QueryLexer.prototype.width = function () {\n return this.pos - this.start\n}\n\nlunr.QueryLexer.prototype.ignore = function () {\n if (this.start == this.pos) {\n this.pos += 1\n }\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.backup = function () {\n this.pos -= 1\n}\n\nlunr.QueryLexer.prototype.acceptDigitRun = function () {\n var char, charCode\n\n do {\n char = this.next()\n charCode = char.charCodeAt(0)\n } while (charCode > 47 && charCode < 58)\n\n if (char != lunr.QueryLexer.EOS) {\n this.backup()\n }\n}\n\nlunr.QueryLexer.prototype.more = function () {\n return this.pos < this.length\n}\n\nlunr.QueryLexer.EOS = 'EOS'\nlunr.QueryLexer.FIELD = 'FIELD'\nlunr.QueryLexer.TERM = 'TERM'\nlunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE'\nlunr.QueryLexer.BOOST = 'BOOST'\nlunr.QueryLexer.PRESENCE = 'PRESENCE'\n\nlunr.QueryLexer.lexField = function (lexer) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.FIELD)\n lexer.ignore()\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexTerm = function (lexer) {\n if (lexer.width() > 1) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.TERM)\n }\n\n lexer.ignore()\n\n if (lexer.more()) {\n return lunr.QueryLexer.lexText\n }\n}\n\nlunr.QueryLexer.lexEditDistance = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.EDIT_DISTANCE)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexBoost = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.BOOST)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexEOS = function (lexer) {\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n}\n\n// This matches the separator used when tokenising fields\n// within a document. These should match otherwise it is\n// not possible to search for some tokens within a document.\n//\n// It is possible for the user to change the separator on the\n// tokenizer so it _might_ clash with any other of the special\n// characters already used within the search string, e.g. :.\n//\n// This means that it is possible to change the separator in\n// such a way that makes some words unsearchable using a search\n// string.\nlunr.QueryLexer.termSeparator = lunr.tokenizer.separator\n\nlunr.QueryLexer.lexText = function (lexer) {\n while (true) {\n var char = lexer.next()\n\n if (char == lunr.QueryLexer.EOS) {\n return lunr.QueryLexer.lexEOS\n }\n\n // Escape character is '\\'\n if (char.charCodeAt(0) == 92) {\n lexer.escapeCharacter()\n continue\n }\n\n if (char == \":\") {\n return lunr.QueryLexer.lexField\n }\n\n if (char == \"~\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexEditDistance\n }\n\n if (char == \"^\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexBoost\n }\n\n // \"+\" indicates term presence is required\n // checking for length to ensure that only\n // leading \"+\" are considered\n if (char == \"+\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n // \"-\" indicates term presence is prohibited\n // checking for length to ensure that only\n // leading \"-\" are considered\n if (char == \"-\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n if (char.match(lunr.QueryLexer.termSeparator)) {\n return lunr.QueryLexer.lexTerm\n }\n }\n}\n\nlunr.QueryParser = function (str, query) {\n this.lexer = new lunr.QueryLexer (str)\n this.query = query\n this.currentClause = {}\n this.lexemeIdx = 0\n}\n\nlunr.QueryParser.prototype.parse = function () {\n this.lexer.run()\n this.lexemes = this.lexer.lexemes\n\n var state = lunr.QueryParser.parseClause\n\n while (state) {\n state = state(this)\n }\n\n return this.query\n}\n\nlunr.QueryParser.prototype.peekLexeme = function () {\n return this.lexemes[this.lexemeIdx]\n}\n\nlunr.QueryParser.prototype.consumeLexeme = function () {\n var lexeme = this.peekLexeme()\n this.lexemeIdx += 1\n return lexeme\n}\n\nlunr.QueryParser.prototype.nextClause = function () {\n var completedClause = this.currentClause\n this.query.clause(completedClause)\n this.currentClause = {}\n}\n\nlunr.QueryParser.parseClause = function (parser) {\n var lexeme = parser.peekLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.type) {\n case lunr.QueryLexer.PRESENCE:\n return lunr.QueryParser.parsePresence\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expected either a field or a term, found \" + lexeme.type\n\n if (lexeme.str.length >= 1) {\n errorMessage += \" with value '\" + lexeme.str + \"'\"\n }\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n}\n\nlunr.QueryParser.parsePresence = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.str) {\n case \"-\":\n parser.currentClause.presence = lunr.Query.presence.PROHIBITED\n break\n case \"+\":\n parser.currentClause.presence = lunr.Query.presence.REQUIRED\n break\n default:\n var errorMessage = \"unrecognised presence operator'\" + lexeme.str + \"'\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term or field, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term or field, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseField = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n if (parser.query.allFields.indexOf(lexeme.str) == -1) {\n var possibleFields = parser.query.allFields.map(function (f) { return \"'\" + f + \"'\" }).join(', '),\n errorMessage = \"unrecognised field '\" + lexeme.str + \"', possible fields: \" + possibleFields\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.fields = [lexeme.str]\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseTerm = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n parser.currentClause.term = lexeme.str.toLowerCase()\n\n if (lexeme.str.indexOf(\"*\") != -1) {\n parser.currentClause.usePipeline = false\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseEditDistance = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var editDistance = parseInt(lexeme.str, 10)\n\n if (isNaN(editDistance)) {\n var errorMessage = \"edit distance must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.editDistance = editDistance\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseBoost = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var boost = parseInt(lexeme.str, 10)\n\n if (isNaN(boost)) {\n var errorMessage = \"boost must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.boost = boost\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\n /**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n ;(function (root, factory) {\n if (true) {\n // AMD. Register as an anonymous module.\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n } else {}\n }(this, function () {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return lunr\n }))\n})();\n\n\n//# sourceURL=webpack:///../node_modules/lunr/lunr.js?"); + +/***/ }), + +/***/ "./default/assets/css/main.sass": +/*!**************************************!*\ + !*** ./default/assets/css/main.sass ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack:///./default/assets/css/main.sass?"); + +/***/ }), + +/***/ "./default/assets/js/src/bootstrap.ts": +/*!********************************************!*\ + !*** ./default/assets/js/src/bootstrap.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _typedoc_Application__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typedoc/Application */ \"./default/assets/js/src/typedoc/Application.ts\");\n/* harmony import */ var _typedoc_components_MenuHighlight__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typedoc/components/MenuHighlight */ \"./default/assets/js/src/typedoc/components/MenuHighlight.ts\");\n/* harmony import */ var _typedoc_components_Search__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typedoc/components/Search */ \"./default/assets/js/src/typedoc/components/Search.ts\");\n/* harmony import */ var _typedoc_components_Signature__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typedoc/components/Signature */ \"./default/assets/js/src/typedoc/components/Signature.ts\");\n/* harmony import */ var _typedoc_components_Toggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typedoc/components/Toggle */ \"./default/assets/js/src/typedoc/components/Toggle.ts\");\n/* harmony import */ var _typedoc_components_Filter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typedoc/components/Filter */ \"./default/assets/js/src/typedoc/components/Filter.ts\");\n/* harmony import */ var _css_main_sass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/main.sass */ \"./default/assets/css/main.sass\");\n\n\n\n\n\n\n\n(0,_typedoc_components_Search__WEBPACK_IMPORTED_MODULE_2__.initSearch)();\n(0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_MenuHighlight__WEBPACK_IMPORTED_MODULE_1__.MenuHighlight, \".menu-highlight\");\n(0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_Signature__WEBPACK_IMPORTED_MODULE_3__.Signature, \".tsd-signatures\");\n(0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_Toggle__WEBPACK_IMPORTED_MODULE_4__.Toggle, \"a[data-toggle]\");\nif (_typedoc_components_Filter__WEBPACK_IMPORTED_MODULE_5__.Filter.isSupported()) {\n (0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_Filter__WEBPACK_IMPORTED_MODULE_5__.Filter, \"#tsd-filter\");\n}\nelse {\n document.documentElement.classList.add(\"no-filter\");\n}\nvar app = new _typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.Application();\nObject.defineProperty(window, \"app\", { value: app });\n\n\n//# sourceURL=webpack:///./default/assets/js/src/bootstrap.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/Application.ts": +/*!******************************************************!*\ + !*** ./default/assets/js/src/typedoc/Application.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerComponent\": () => /* binding */ registerComponent,\n/* harmony export */ \"Application\": () => /* binding */ Application\n/* harmony export */ });\n/**\n * List of all known components.\n */\nvar components = [];\n/**\n * Register a new component.\n */\nfunction registerComponent(constructor, selector) {\n components.push({\n selector: selector,\n constructor: constructor,\n });\n}\n/**\n * TypeDoc application class.\n */\nvar Application = /** @class */ (function () {\n /**\n * Create a new Application instance.\n */\n function Application() {\n this.createComponents(document.body);\n }\n /**\n * Create all components beneath the given jQuery element.\n */\n Application.prototype.createComponents = function (context) {\n components.forEach(function (c) {\n context.querySelectorAll(c.selector).forEach(function (el) {\n if (!el.dataset.hasInstance) {\n new c.constructor({ el: el });\n el.dataset.hasInstance = String(true);\n }\n });\n });\n };\n return Application;\n}());\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/Application.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/Component.ts": +/*!****************************************************!*\ + !*** ./default/assets/js/src/typedoc/Component.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Component\": () => /* binding */ Component\n/* harmony export */ });\n/**\n * TypeDoc component class.\n */\nvar Component = /** @class */ (function () {\n function Component(options) {\n this.el = options.el;\n }\n return Component;\n}());\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/Component.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/EventTarget.ts": +/*!******************************************************!*\ + !*** ./default/assets/js/src/typedoc/EventTarget.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"EventTarget\": () => /* binding */ EventTarget\n/* harmony export */ });\n/**\n * TypeDoc event target class.\n */\nvar EventTarget = /** @class */ (function () {\n function EventTarget() {\n this.listeners = {};\n }\n EventTarget.prototype.addEventListener = function (type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(callback);\n };\n EventTarget.prototype.removeEventListener = function (type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n var stack = this.listeners[type];\n for (var i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n return;\n }\n }\n };\n EventTarget.prototype.dispatchEvent = function (event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n var stack = this.listeners[event.type].slice();\n for (var i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n return !event.defaultPrevented;\n };\n return EventTarget;\n}());\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/EventTarget.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/components/Filter.ts": +/*!************************************************************!*\ + !*** ./default/assets/js/src/typedoc/components/Filter.ts ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Filter\": () => /* binding */ Filter\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _utils_pointer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/pointer */ \"./default/assets/js/src/typedoc/utils/pointer.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar FilterItem = /** @class */ (function () {\n function FilterItem(key, value) {\n this.key = key;\n this.value = value;\n this.defaultValue = value;\n this.initialize();\n if (window.localStorage[this.key]) {\n this.setValue(this.fromLocalStorage(window.localStorage[this.key]));\n }\n }\n FilterItem.prototype.initialize = function () { };\n FilterItem.prototype.setValue = function (value) {\n if (this.value == value)\n return;\n var oldValue = this.value;\n this.value = value;\n window.localStorage[this.key] = this.toLocalStorage(value);\n this.handleValueChange(oldValue, value);\n };\n return FilterItem;\n}());\nvar FilterItemCheckbox = /** @class */ (function (_super) {\n __extends(FilterItemCheckbox, _super);\n function FilterItemCheckbox() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FilterItemCheckbox.prototype.initialize = function () {\n var _this = this;\n var checkbox = document.querySelector(\"#tsd-filter-\" + this.key);\n if (!checkbox)\n return;\n this.checkbox = checkbox;\n this.checkbox.addEventListener(\"change\", function () {\n _this.setValue(_this.checkbox.checked);\n });\n };\n FilterItemCheckbox.prototype.handleValueChange = function (oldValue, newValue) {\n if (!this.checkbox)\n return;\n this.checkbox.checked = this.value;\n document.documentElement.classList.toggle(\"toggle-\" + this.key, this.value != this.defaultValue);\n };\n FilterItemCheckbox.prototype.fromLocalStorage = function (value) {\n return value == \"true\";\n };\n FilterItemCheckbox.prototype.toLocalStorage = function (value) {\n return value ? \"true\" : \"false\";\n };\n return FilterItemCheckbox;\n}(FilterItem));\nvar FilterItemSelect = /** @class */ (function (_super) {\n __extends(FilterItemSelect, _super);\n function FilterItemSelect() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FilterItemSelect.prototype.initialize = function () {\n var _this = this;\n document.documentElement.classList.add(\"toggle-\" + this.key + this.value);\n var select = document.querySelector(\"#tsd-filter-\" + this.key);\n if (!select)\n return;\n this.select = select;\n var onActivate = function () {\n _this.select.classList.add(\"active\");\n };\n var onDeactivate = function () {\n _this.select.classList.remove(\"active\");\n };\n this.select.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerDown, onActivate);\n this.select.addEventListener(\"mouseover\", onActivate);\n this.select.addEventListener(\"mouseleave\", onDeactivate);\n this.select.querySelectorAll(\"li\").forEach(function (el) {\n el.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerUp, function (e) {\n select.classList.remove(\"active\");\n _this.setValue(e.target.dataset.value || \"\");\n });\n });\n document.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerDown, function (e) {\n if (_this.select.contains(e.target))\n return;\n _this.select.classList.remove(\"active\");\n });\n };\n FilterItemSelect.prototype.handleValueChange = function (oldValue, newValue) {\n this.select.querySelectorAll(\"li.selected\").forEach(function (el) {\n el.classList.remove(\"selected\");\n });\n var selected = this.select.querySelector('li[data-value=\"' + newValue + '\"]');\n var label = this.select.querySelector(\".tsd-select-label\");\n if (selected && label) {\n selected.classList.add(\"selected\");\n label.textContent = selected.textContent;\n }\n document.documentElement.classList.remove(\"toggle-\" + oldValue);\n document.documentElement.classList.add(\"toggle-\" + newValue);\n };\n FilterItemSelect.prototype.fromLocalStorage = function (value) {\n return value;\n };\n FilterItemSelect.prototype.toLocalStorage = function (value) {\n return value;\n };\n return FilterItemSelect;\n}(FilterItem));\nvar Filter = /** @class */ (function (_super) {\n __extends(Filter, _super);\n function Filter(options) {\n var _this = _super.call(this, options) || this;\n _this.optionVisibility = new FilterItemSelect(\"visibility\", \"private\");\n _this.optionInherited = new FilterItemCheckbox(\"inherited\", true);\n _this.optionExternals = new FilterItemCheckbox(\"externals\", true);\n return _this;\n }\n Filter.isSupported = function () {\n try {\n return typeof window.localStorage != \"undefined\";\n }\n catch (e) {\n return false;\n }\n };\n return Filter;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Filter.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/components/MenuHighlight.ts": +/*!*******************************************************************!*\ + !*** ./default/assets/js/src/typedoc/components/MenuHighlight.ts ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MenuHighlight\": () => /* binding */ MenuHighlight\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _services_Viewport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/Viewport */ \"./default/assets/js/src/typedoc/services/Viewport.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * Manages the sticky state of the navigation and moves the highlight\n * to the current navigation item.\n */\nvar MenuHighlight = /** @class */ (function (_super) {\n __extends(MenuHighlight, _super);\n /**\n * Create a new MenuHighlight instance.\n *\n * @param options Backbone view constructor options.\n */\n function MenuHighlight(options) {\n var _this = _super.call(this, options) || this;\n /**\n * List of all discovered anchors.\n */\n _this.anchors = [];\n /**\n * Index of the currently highlighted anchor.\n */\n _this.index = -1;\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.addEventListener(\"resize\", function () { return _this.onResize(); });\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.addEventListener(\"scroll\", function (e) { return _this.onScroll(e); });\n _this.createAnchors();\n return _this;\n }\n /**\n * Find all anchors on the current page.\n */\n MenuHighlight.prototype.createAnchors = function () {\n var _this = this;\n var base = window.location.href;\n if (base.indexOf(\"#\") != -1) {\n base = base.substr(0, base.indexOf(\"#\"));\n }\n this.el.querySelectorAll(\"a\").forEach(function (el) {\n var href = el.href;\n if (href.indexOf(\"#\") == -1)\n return;\n if (href.substr(0, base.length) != base)\n return;\n var hash = href.substr(href.indexOf(\"#\") + 1);\n var anchor = document.querySelector(\"a.tsd-anchor[name=\" + hash + \"]\");\n var link = el.parentNode;\n if (!anchor || !link)\n return;\n _this.anchors.push({\n link: link,\n anchor: anchor,\n position: 0,\n });\n });\n this.onResize();\n };\n /**\n * Triggered after the viewport was resized.\n */\n MenuHighlight.prototype.onResize = function () {\n var anchor;\n for (var index = 0, count = this.anchors.length; index < count; index++) {\n anchor = this.anchors[index];\n var rect = anchor.anchor.getBoundingClientRect();\n anchor.position = rect.top + document.body.scrollTop;\n }\n this.anchors.sort(function (a, b) {\n return a.position - b.position;\n });\n var event = new CustomEvent(\"scroll\", {\n detail: {\n scrollTop: _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.scrollTop,\n },\n });\n this.onScroll(event);\n };\n /**\n * Triggered after the viewport was scrolled.\n *\n * @param event The custom event with the current vertical scroll position.\n */\n MenuHighlight.prototype.onScroll = function (event) {\n var scrollTop = event.detail.scrollTop + 5;\n var anchors = this.anchors;\n var count = anchors.length - 1;\n var index = this.index;\n while (index > -1 && anchors[index].position > scrollTop) {\n index -= 1;\n }\n while (index < count && anchors[index + 1].position < scrollTop) {\n index += 1;\n }\n if (this.index != index) {\n if (this.index > -1)\n this.anchors[this.index].link.classList.remove(\"focus\");\n this.index = index;\n if (this.index > -1)\n this.anchors[this.index].link.classList.add(\"focus\");\n }\n };\n return MenuHighlight;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/MenuHighlight.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/components/Search.ts": +/*!************************************************************!*\ + !*** ./default/assets/js/src/typedoc/components/Search.ts ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initSearch\": () => /* binding */ initSearch\n/* harmony export */ });\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/debounce */ \"./default/assets/js/src/typedoc/utils/debounce.ts\");\n/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lunr */ \"../node_modules/lunr/lunr.js\");\n/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lunr__WEBPACK_IMPORTED_MODULE_1__);\n\n\nfunction initSearch() {\n var searchEl = document.getElementById(\"tsd-search\");\n if (!searchEl)\n return;\n var searchScript = document.getElementById(\"search-script\");\n searchEl.classList.add(\"loading\");\n if (searchScript) {\n searchScript.addEventListener(\"error\", function () {\n searchEl.classList.remove(\"loading\");\n searchEl.classList.add(\"failure\");\n });\n searchScript.addEventListener(\"load\", function () {\n searchEl.classList.remove(\"loading\");\n searchEl.classList.add(\"ready\");\n });\n if (window.searchData) {\n searchEl.classList.remove(\"loading\");\n }\n }\n var field = document.querySelector(\"#tsd-search-field\");\n var results = document.querySelector(\".results\");\n if (!field || !results) {\n throw new Error(\"The input field or the result list wrapper was not found\");\n }\n var resultClicked = false;\n results.addEventListener(\"mousedown\", function () { return (resultClicked = true); });\n results.addEventListener(\"mouseup\", function () {\n resultClicked = false;\n searchEl.classList.remove(\"has-focus\");\n });\n field.addEventListener(\"focus\", function () { return searchEl.classList.add(\"has-focus\"); });\n field.addEventListener(\"blur\", function () {\n if (!resultClicked) {\n resultClicked = false;\n searchEl.classList.remove(\"has-focus\");\n }\n });\n var state = {\n base: searchEl.dataset.base + \"/\",\n };\n bindEvents(searchEl, results, field, state);\n}\nfunction bindEvents(searchEl, results, field, state) {\n field.addEventListener(\"input\", (0,_utils_debounce__WEBPACK_IMPORTED_MODULE_0__.debounce)(function () {\n updateResults(searchEl, results, field, state);\n }, 200));\n var preventPress = false;\n field.addEventListener(\"keydown\", function (e) {\n preventPress = true;\n if (e.key == \"Enter\") {\n gotoCurrentResult(results, field);\n }\n else if (e.key == \"Escape\") {\n field.blur();\n }\n else if (e.key == \"ArrowUp\") {\n setCurrentResult(results, -1);\n }\n else if (e.key === \"ArrowDown\") {\n setCurrentResult(results, 1);\n }\n else {\n preventPress = false;\n }\n });\n field.addEventListener(\"keypress\", function (e) {\n if (preventPress)\n e.preventDefault();\n });\n /**\n * Start searching by pressing slash.\n */\n document.body.addEventListener(\"keydown\", function (e) {\n if (e.altKey || e.ctrlKey || e.metaKey)\n return;\n if (!field.matches(\":focus\") && e.key === \"/\") {\n field.focus();\n e.preventDefault();\n }\n });\n}\nfunction checkIndex(state, searchEl) {\n if (state.index)\n return;\n if (window.searchData) {\n searchEl.classList.remove(\"loading\");\n searchEl.classList.add(\"ready\");\n state.data = window.searchData;\n state.index = lunr__WEBPACK_IMPORTED_MODULE_1__.Index.load(window.searchData.index);\n }\n}\nfunction updateResults(searchEl, results, query, state) {\n checkIndex(state, searchEl);\n // Don't clear results if loading state is not ready,\n // because loading or error message can be removed.\n if (!state.index || !state.data)\n return;\n results.textContent = \"\";\n var searchText = query.value.trim();\n // Perform a wildcard search\n var res = state.index.search(\"*\" + searchText + \"*\");\n for (var i = 0, c = Math.min(10, res.length); i < c; i++) {\n var row = state.data.rows[Number(res[i].ref)];\n // Bold the matched part of the query in the search results\n var name_1 = boldMatches(row.name, searchText);\n if (row.parent) {\n name_1 = \"\" + boldMatches(row.parent, searchText) + \".\" + name_1;\n }\n var item = document.createElement(\"li\");\n item.classList.value = row.classes;\n var anchor = document.createElement(\"a\");\n anchor.href = state.base + row.url;\n anchor.classList.add(\"tsd-kind-icon\");\n anchor.innerHTML = name_1;\n item.append(anchor);\n results.appendChild(item);\n }\n}\n/**\n * Move the highlight within the result set.\n */\nfunction setCurrentResult(results, dir) {\n var current = results.querySelector(\".current\");\n if (!current) {\n current = results.querySelector(dir == 1 ? \"li:first-child\" : \"li:last-child\");\n if (current) {\n current.classList.add(\"current\");\n }\n }\n else {\n var rel = dir == 1\n ? current.nextElementSibling\n : current.previousElementSibling;\n if (rel) {\n current.classList.remove(\"current\");\n rel.classList.add(\"current\");\n }\n }\n}\n/**\n * Navigate to the highlighted result.\n */\nfunction gotoCurrentResult(results, field) {\n var current = results.querySelector(\".current\");\n if (!current) {\n current = results.querySelector(\"li:first-child\");\n }\n if (current) {\n var link = current.querySelector(\"a\");\n if (link) {\n window.location.href = link.href;\n }\n field.blur();\n }\n}\nfunction boldMatches(text, search) {\n if (search === \"\") {\n return text;\n }\n var lowerText = text.toLocaleLowerCase();\n var lowerSearch = search.toLocaleLowerCase();\n var parts = [];\n var lastIndex = 0;\n var index = lowerText.indexOf(lowerSearch);\n while (index != -1) {\n parts.push(escapeHtml(text.substring(lastIndex, index)), \"\" + escapeHtml(text.substring(index, index + lowerSearch.length)) + \"\");\n lastIndex = index + lowerSearch.length;\n index = lowerText.indexOf(lowerSearch, lastIndex);\n }\n parts.push(escapeHtml(text.substring(lastIndex)));\n return parts.join(\"\");\n}\nvar SPECIAL_HTML = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \"'\": \"'\",\n '\"': \""\",\n};\nfunction escapeHtml(text) {\n return text.replace(/[&<>\"'\"]/g, function (match) { return SPECIAL_HTML[match]; });\n}\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Search.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/components/Signature.ts": +/*!***************************************************************!*\ + !*** ./default/assets/js/src/typedoc/components/Signature.ts ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Signature\": () => /* binding */ Signature\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _services_Viewport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/Viewport */ \"./default/assets/js/src/typedoc/services/Viewport.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * Holds a signature and its description.\n */\nvar SignatureGroup = /** @class */ (function () {\n /**\n * Create a new SignatureGroup instance.\n *\n * @param signature The target signature.\n * @param description The description for the signature.\n */\n function SignatureGroup(signature, description) {\n this.signature = signature;\n this.description = description;\n }\n /**\n * Add the given class to all elements of the group.\n *\n * @param className The class name to add.\n */\n SignatureGroup.prototype.addClass = function (className) {\n this.signature.classList.add(className);\n this.description.classList.add(className);\n return this;\n };\n /**\n * Remove the given class from all elements of the group.\n *\n * @param className The class name to remove.\n */\n SignatureGroup.prototype.removeClass = function (className) {\n this.signature.classList.remove(className);\n this.description.classList.remove(className);\n return this;\n };\n return SignatureGroup;\n}());\n/**\n * Controls the tab like behaviour of methods and functions with multiple signatures.\n */\nvar Signature = /** @class */ (function (_super) {\n __extends(Signature, _super);\n /**\n * Create a new Signature instance.\n *\n * @param options Backbone view constructor options.\n */\n function Signature(options) {\n var _this = _super.call(this, options) || this;\n /**\n * List of found signature groups.\n */\n _this.groups = [];\n /**\n * The index of the currently displayed signature.\n */\n _this.index = -1;\n _this.createGroups();\n if (_this.container) {\n _this.el.classList.add(\"active\");\n Array.from(_this.el.children).forEach(function (signature) {\n signature.addEventListener(\"touchstart\", function (event) {\n return _this.onClick(event);\n });\n signature.addEventListener(\"click\", function (event) {\n return _this.onClick(event);\n });\n });\n _this.container.classList.add(\"active\");\n _this.setIndex(0);\n }\n return _this;\n }\n /**\n * Set the index of the active signature.\n *\n * @param index The index of the signature to activate.\n */\n Signature.prototype.setIndex = function (index) {\n if (index < 0)\n index = 0;\n if (index > this.groups.length - 1)\n index = this.groups.length - 1;\n if (this.index == index)\n return;\n var to = this.groups[index];\n if (this.index > -1) {\n var from_1 = this.groups[this.index];\n from_1.removeClass(\"current\").addClass(\"fade-out\");\n to.addClass(\"current\");\n to.addClass(\"fade-in\");\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.triggerResize();\n setTimeout(function () {\n from_1.removeClass(\"fade-out\");\n to.removeClass(\"fade-in\");\n }, 300);\n }\n else {\n to.addClass(\"current\");\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.triggerResize();\n }\n this.index = index;\n };\n /**\n * Find all signature/description groups.\n */\n Signature.prototype.createGroups = function () {\n var signatures = this.el.children;\n if (signatures.length < 2)\n return;\n this.container = this.el.nextElementSibling;\n var descriptions = this.container.children;\n this.groups = [];\n for (var index = 0; index < signatures.length; index++) {\n this.groups.push(new SignatureGroup(signatures[index], descriptions[index]));\n }\n };\n /**\n * Triggered when the user clicks onto a signature header.\n *\n * @param e The related event object.\n */\n Signature.prototype.onClick = function (e) {\n var _this = this;\n this.groups.forEach(function (group, index) {\n if (group.signature === e.currentTarget) {\n _this.setIndex(index);\n }\n });\n };\n return Signature;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Signature.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/components/Toggle.ts": +/*!************************************************************!*\ + !*** ./default/assets/js/src/typedoc/components/Toggle.ts ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Toggle\": () => /* binding */ Toggle\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _utils_pointer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/pointer */ \"./default/assets/js/src/typedoc/utils/pointer.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar Toggle = /** @class */ (function (_super) {\n __extends(Toggle, _super);\n function Toggle(options) {\n var _this = _super.call(this, options) || this;\n _this.className = _this.el.dataset.toggle || \"\";\n _this.el.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerUp, function (e) { return _this.onPointerUp(e); });\n _this.el.addEventListener(\"click\", function (e) { return e.preventDefault(); });\n document.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerDown, function (e) {\n return _this.onDocumentPointerDown(e);\n });\n document.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerUp, function (e) {\n return _this.onDocumentPointerUp(e);\n });\n return _this;\n }\n Toggle.prototype.setActive = function (value) {\n if (this.active == value)\n return;\n this.active = value;\n document.documentElement.classList.toggle(\"has-\" + this.className, value);\n this.el.classList.toggle(\"active\", value);\n var transition = (this.active ? \"to-has-\" : \"from-has-\") + this.className;\n document.documentElement.classList.add(transition);\n setTimeout(function () { return document.documentElement.classList.remove(transition); }, 500);\n };\n Toggle.prototype.onPointerUp = function (event) {\n if (_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.hasPointerMoved)\n return;\n this.setActive(true);\n event.preventDefault();\n };\n Toggle.prototype.onDocumentPointerDown = function (e) {\n if (this.active) {\n if (e.target.closest(\".col-menu, .tsd-filter-group\")) {\n return;\n }\n this.setActive(false);\n }\n };\n Toggle.prototype.onDocumentPointerUp = function (e) {\n var _this = this;\n if (_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.hasPointerMoved)\n return;\n if (this.active) {\n if (e.target.closest(\".col-menu\")) {\n var link = e.target.closest(\"a\");\n if (link) {\n var href = window.location.href;\n if (href.indexOf(\"#\") != -1) {\n href = href.substr(0, href.indexOf(\"#\"));\n }\n if (link.href.substr(0, href.length) == href) {\n setTimeout(function () { return _this.setActive(false); }, 250);\n }\n }\n }\n }\n };\n return Toggle;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Toggle.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/services/Viewport.ts": +/*!************************************************************!*\ + !*** ./default/assets/js/src/typedoc/services/Viewport.ts ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Viewport\": () => /* binding */ Viewport\n/* harmony export */ });\n/* harmony import */ var _EventTarget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventTarget */ \"./default/assets/js/src/typedoc/EventTarget.ts\");\n/* harmony import */ var _utils_trottle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/trottle */ \"./default/assets/js/src/typedoc/utils/trottle.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * A global service that monitors the window size and scroll position.\n */\nvar Viewport = /** @class */ (function (_super) {\n __extends(Viewport, _super);\n /**\n * Create new Viewport instance.\n */\n function Viewport() {\n var _this = _super.call(this) || this;\n /**\n * The current scroll position.\n */\n _this.scrollTop = 0;\n /**\n * The previous scrollTop.\n */\n _this.lastY = 0;\n /**\n * The width of the window.\n */\n _this.width = 0;\n /**\n * The height of the window.\n */\n _this.height = 0;\n /**\n * Boolean indicating whether the toolbar is shown.\n */\n _this.showToolbar = true;\n _this.toolbar = (document.querySelector(\".tsd-page-toolbar\"));\n _this.secondaryNav = (document.querySelector(\".tsd-navigation.secondary\"));\n window.addEventListener(\"scroll\", (0,_utils_trottle__WEBPACK_IMPORTED_MODULE_1__.throttle)(function () { return _this.onScroll(); }, 10));\n window.addEventListener(\"resize\", (0,_utils_trottle__WEBPACK_IMPORTED_MODULE_1__.throttle)(function () { return _this.onResize(); }, 10));\n _this.onResize();\n _this.onScroll();\n return _this;\n }\n /**\n * Trigger a resize event.\n */\n Viewport.prototype.triggerResize = function () {\n var event = new CustomEvent(\"resize\", {\n detail: {\n width: this.width,\n height: this.height,\n },\n });\n this.dispatchEvent(event);\n };\n /**\n * Triggered when the size of the window has changed.\n */\n Viewport.prototype.onResize = function () {\n this.width = window.innerWidth || 0;\n this.height = window.innerHeight || 0;\n var event = new CustomEvent(\"resize\", {\n detail: {\n width: this.width,\n height: this.height,\n },\n });\n this.dispatchEvent(event);\n };\n /**\n * Triggered when the user scrolled the viewport.\n */\n Viewport.prototype.onScroll = function () {\n this.scrollTop = window.scrollY || 0;\n var event = new CustomEvent(\"scroll\", {\n detail: {\n scrollTop: this.scrollTop,\n },\n });\n this.dispatchEvent(event);\n this.hideShowToolbar();\n };\n /**\n * Handle hiding/showing of the toolbar.\n */\n Viewport.prototype.hideShowToolbar = function () {\n var isShown = this.showToolbar;\n this.showToolbar = this.lastY >= this.scrollTop || this.scrollTop <= 0;\n if (isShown !== this.showToolbar) {\n this.toolbar.classList.toggle(\"tsd-page-toolbar--hide\");\n this.secondaryNav.classList.toggle(\"tsd-navigation--toolbar-hide\");\n }\n this.lastY = this.scrollTop;\n };\n Viewport.instance = new Viewport();\n return Viewport;\n}(_EventTarget__WEBPACK_IMPORTED_MODULE_0__.EventTarget));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/services/Viewport.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/utils/debounce.ts": +/*!*********************************************************!*\ + !*** ./default/assets/js/src/typedoc/utils/debounce.ts ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"debounce\": () => /* binding */ debounce\n/* harmony export */ });\nvar debounce = function (fn, wait) {\n if (wait === void 0) { wait = 100; }\n var timeout;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n clearTimeout(timeout);\n timeout = setTimeout(function () { return fn(args); }, wait);\n };\n};\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/utils/debounce.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/utils/pointer.ts": +/*!********************************************************!*\ + !*** ./default/assets/js/src/typedoc/utils/pointer.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"pointerDown\": () => /* binding */ pointerDown,\n/* harmony export */ \"pointerMove\": () => /* binding */ pointerMove,\n/* harmony export */ \"pointerUp\": () => /* binding */ pointerUp,\n/* harmony export */ \"pointerDownPosition\": () => /* binding */ pointerDownPosition,\n/* harmony export */ \"preventNextClick\": () => /* binding */ preventNextClick,\n/* harmony export */ \"isPointerDown\": () => /* binding */ isPointerDown,\n/* harmony export */ \"isPointerTouch\": () => /* binding */ isPointerTouch,\n/* harmony export */ \"hasPointerMoved\": () => /* binding */ hasPointerMoved,\n/* harmony export */ \"isMobile\": () => /* binding */ isMobile\n/* harmony export */ });\n/**\n * Event name of the pointer down event.\n */\nvar pointerDown = \"mousedown\";\n/**\n * Event name of the pointer move event.\n */\nvar pointerMove = \"mousemove\";\n/**\n * Event name of the pointer up event.\n */\nvar pointerUp = \"mouseup\";\n/**\n * Position the pointer was pressed at.\n */\nvar pointerDownPosition = { x: 0, y: 0 };\n/**\n * Should the next click on the document be supressed?\n */\nvar preventNextClick = false;\n/**\n * Is the pointer down?\n */\nvar isPointerDown = false;\n/**\n * Is the pointer a touch point?\n */\nvar isPointerTouch = false;\n/**\n * Did the pointer move since the last down event?\n */\nvar hasPointerMoved = false;\n/**\n * Is the user agent a mobile agent?\n */\nvar isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\ndocument.documentElement.classList.add(isMobile ? \"is-mobile\" : \"not-mobile\");\nif (isMobile && \"ontouchstart\" in document.documentElement) {\n isPointerTouch = true;\n pointerDown = \"touchstart\";\n pointerMove = \"touchmove\";\n pointerUp = \"touchend\";\n}\ndocument.addEventListener(pointerDown, function (e) {\n isPointerDown = true;\n hasPointerMoved = false;\n var t = pointerDown == \"touchstart\"\n ? e.targetTouches[0]\n : e;\n pointerDownPosition.y = t.pageY || 0;\n pointerDownPosition.x = t.pageX || 0;\n});\ndocument.addEventListener(pointerMove, function (e) {\n if (!isPointerDown)\n return;\n if (!hasPointerMoved) {\n var t = pointerDown == \"touchstart\"\n ? e.targetTouches[0]\n : e;\n var x = pointerDownPosition.x - (t.pageX || 0);\n var y = pointerDownPosition.y - (t.pageY || 0);\n hasPointerMoved = Math.sqrt(x * x + y * y) > 10;\n }\n});\ndocument.addEventListener(pointerUp, function () {\n isPointerDown = false;\n});\ndocument.addEventListener(\"click\", function (e) {\n if (preventNextClick) {\n e.preventDefault();\n e.stopImmediatePropagation();\n preventNextClick = false;\n }\n});\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/utils/pointer.ts?"); + +/***/ }), + +/***/ "./default/assets/js/src/typedoc/utils/trottle.ts": +/*!********************************************************!*\ + !*** ./default/assets/js/src/typedoc/utils/trottle.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"throttle\": () => /* binding */ throttle\n/* harmony export */ });\nvar throttle = function (fn, wait) {\n if (wait === void 0) { wait = 100; }\n var time = Date.now();\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (time + wait - Date.now() < 0) {\n fn.apply(void 0, args);\n time = Date.now();\n }\n };\n};\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/utils/trottle.ts?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => module['default'] : +/******/ () => module; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ // startup +/******/ // Load entry module +/******/ __webpack_require__("./default/assets/js/src/bootstrap.ts"); +/******/ // This entry module used 'exports' so it can't be inlined +/******/ })() +; \ No newline at end of file diff --git a/docs/assets/js/search.js b/docs/assets/js/search.js new file mode 100644 index 00000000..ba778132 --- /dev/null +++ b/docs/assets/js/search.js @@ -0,0 +1 @@ +window.searchData = {"kinds":{"1":"Module","64":"Function","128":"Class","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor"},"rows":[{"id":0,"kind":1,"name":"app","url":"modules/app.html","classes":"tsd-kind-module"},{"id":1,"kind":1,"name":"controllers/Builder","url":"modules/controllers_builder.html","classes":"tsd-kind-module"},{"id":2,"kind":128,"name":"Builder","url":"classes/controllers_builder.builder.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"controllers/Builder"},{"id":3,"kind":512,"name":"constructor","url":"classes/controllers_builder.builder.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"controllers/Builder.Builder"},{"id":4,"kind":1024,"name":"_jsonFromFile","url":"classes/controllers_builder.builder.html#_jsonfromfile","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"controllers/Builder.Builder"},{"id":5,"kind":1024,"name":"_companyConfig","url":"classes/controllers_builder.builder.html#_companyconfig","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"controllers/Builder.Builder"},{"id":6,"kind":1024,"name":"_media","url":"classes/controllers_builder.builder.html#_media","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"controllers/Builder.Builder"},{"id":7,"kind":2048,"name":"build","url":"classes/controllers_builder.builder.html#build","classes":"tsd-kind-method tsd-parent-kind-class","parent":"controllers/Builder.Builder"},{"id":8,"kind":1,"name":"models/Adobe","url":"modules/models_adobe.html","classes":"tsd-kind-module"},{"id":9,"kind":128,"name":"Adobe","url":"classes/models_adobe.adobe.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/Adobe"},{"id":10,"kind":512,"name":"constructor","url":"classes/models_adobe.adobe.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"models/Adobe.Adobe"},{"id":11,"kind":1024,"name":"_cid","url":"classes/models_adobe.adobe.html#_cid","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":12,"kind":1024,"name":"_hasValidationError","url":"classes/models_adobe.adobe.html#_hasvalidationerror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":13,"kind":1024,"name":"_hasUndefinedParameterError","url":"classes/models_adobe.adobe.html#_hasundefinedparametererror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":14,"kind":1024,"name":"_validationErrorMessage","url":"classes/models_adobe.adobe.html#_validationerrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":15,"kind":1024,"name":"_undefinedParameterErroMessage","url":"classes/models_adobe.adobe.html#_undefinedparametererromessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":16,"kind":2048,"name":"_hasErrorAtCid","url":"classes/models_adobe.adobe.html#_haserroratcid","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":17,"kind":2048,"name":"_errorMessage","url":"classes/models_adobe.adobe.html#_errormessage","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":18,"kind":2048,"name":"buildedLine","url":"classes/models_adobe.adobe.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/Adobe.Adobe"},{"id":19,"kind":2048,"name":"_buildCid","url":"classes/models_adobe.adobe.html#_buildcid","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Adobe.Adobe"},{"id":20,"kind":2048,"name":"_buildUrl","url":"classes/models_adobe.adobe.html#_buildurl","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite tsd-is-protected","parent":"models/Adobe.Adobe"},{"id":21,"kind":1024,"name":"_url","url":"classes/models_adobe.adobe.html#_url","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited tsd-is-protected","parent":"models/Adobe.Adobe"},{"id":22,"kind":262144,"name":"url","url":"classes/models_adobe.adobe.html#url","classes":"tsd-kind-accessor tsd-parent-kind-class tsd-is-inherited","parent":"models/Adobe.Adobe"},{"id":23,"kind":262144,"name":"csvLine","url":"classes/models_adobe.adobe.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/Adobe.Adobe"},{"id":24,"kind":262144,"name":"config","url":"classes/models_adobe.adobe.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/Adobe.Adobe"},{"id":25,"kind":1,"name":"models/AnalyticsTool","url":"modules/models_analyticstool.html","classes":"tsd-kind-module"},{"id":26,"kind":128,"name":"AnalyticsTool","url":"classes/models_analyticstool.analyticstool.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/AnalyticsTool"},{"id":27,"kind":512,"name":"constructor","url":"classes/models_analyticstool.analyticstool.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":28,"kind":1024,"name":"_url","url":"classes/models_analyticstool.analyticstool.html#_url","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-protected","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":29,"kind":262144,"name":"url","url":"classes/models_analyticstool.analyticstool.html#url","classes":"tsd-kind-accessor tsd-parent-kind-class","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":30,"kind":2048,"name":"_buildUrl","url":"classes/models_analyticstool.analyticstool.html#_buildurl","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-protected","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":31,"kind":262144,"name":"csvLine","url":"classes/models_analyticstool.analyticstool.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":32,"kind":262144,"name":"config","url":"classes/models_analyticstool.analyticstool.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":33,"kind":2048,"name":"buildedLine","url":"classes/models_analyticstool.analyticstool.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"models/AnalyticsTool.AnalyticsTool"},{"id":34,"kind":1,"name":"models/Auth","url":"modules/models_auth.html","classes":"tsd-kind-module"},{"id":35,"kind":128,"name":"Auth","url":"classes/models_auth.auth.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/Auth"},{"id":36,"kind":512,"name":"constructor","url":"classes/models_auth.auth.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/Auth.Auth"},{"id":37,"kind":1024,"name":"_permission","url":"classes/models_auth.auth.html#_permission","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Auth.Auth"},{"id":38,"kind":1024,"name":"_agency","url":"classes/models_auth.auth.html#_agency","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Auth.Auth"},{"id":39,"kind":1024,"name":"_company","url":"classes/models_auth.auth.html#_company","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Auth.Auth"},{"id":40,"kind":2048,"name":"hasPermissionFor","url":"classes/models_auth.auth.html#haspermissionfor","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Auth.Auth"},{"id":41,"kind":2048,"name":"toJson","url":"classes/models_auth.auth.html#tojson","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Auth.Auth"},{"id":42,"kind":262144,"name":"permission","url":"classes/models_auth.auth.html#permission","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Auth.Auth"},{"id":43,"kind":262144,"name":"agency","url":"classes/models_auth.auth.html#agency","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Auth.Auth"},{"id":44,"kind":262144,"name":"company","url":"classes/models_auth.auth.html#company","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Auth.Auth"},{"id":45,"kind":1,"name":"models/cloud/FirestoreConnectionSingleton","url":"modules/models_cloud_firestoreconnectionsingleton.html","classes":"tsd-kind-module"},{"id":46,"kind":128,"name":"FirestoreConnectionSingleton","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/cloud/FirestoreConnectionSingleton"},{"id":47,"kind":1024,"name":"_instance","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#_instance","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":48,"kind":2048,"name":"getInstance","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#getinstance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":49,"kind":512,"name":"constructor","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite tsd-is-private","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":50,"kind":1024,"name":"_db","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#_db","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":51,"kind":2048,"name":"getCollection","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#getcollection","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":52,"kind":2048,"name":"getDocument","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#getdocument","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":53,"kind":2048,"name":"getAllDocumentsFrom","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#getalldocumentsfrom","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":54,"kind":2048,"name":"addDocumentIn","url":"classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html#adddocumentin","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/FirestoreConnectionSingleton.FirestoreConnectionSingleton"},{"id":55,"kind":1,"name":"models/cloud/LoggingSingleton","url":"modules/models_cloud_loggingsingleton.html","classes":"tsd-kind-module"},{"id":56,"kind":128,"name":"LoggingSingleton","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/cloud/LoggingSingleton"},{"id":57,"kind":1024,"name":"_loggingBunyan","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#_loggingbunyan","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":58,"kind":1024,"name":"_loggerName","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#_loggername","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":59,"kind":1024,"name":"_infoInstance","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#_infoinstance","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":60,"kind":1024,"name":"_errorInstance","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#_errorinstance","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":61,"kind":1024,"name":"_warningInstance","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#_warninginstance","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":62,"kind":2048,"name":"logInfo","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#loginfo","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":63,"kind":2048,"name":"logError","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#logerror","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":64,"kind":2048,"name":"logWarning","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#logwarning","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":65,"kind":512,"name":"constructor","url":"classes/models_cloud_loggingsingleton.loggingsingleton.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite tsd-is-private","parent":"models/cloud/LoggingSingleton.LoggingSingleton"},{"id":66,"kind":1,"name":"models/cloud/StorageConnectionSingleton","url":"modules/models_cloud_storageconnectionsingleton.html","classes":"tsd-kind-module"},{"id":67,"kind":128,"name":"StorageConnectionSingleton","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/cloud/StorageConnectionSingleton"},{"id":68,"kind":1024,"name":"_instance","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#_instance","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":69,"kind":2048,"name":"getInstance","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#getinstance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":70,"kind":512,"name":"constructor","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite tsd-is-private","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":71,"kind":1024,"name":"_db","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#_db","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":72,"kind":1024,"name":"_bucket","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#_bucket","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":73,"kind":2048,"name":"saveFile","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#savefile","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":74,"kind":2048,"name":"getFile","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#getfile","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":75,"kind":2048,"name":"getAllFiles","url":"classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html#getallfiles","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/cloud/StorageConnectionSingleton.StorageConnectionSingleton"},{"id":76,"kind":1,"name":"models/Config","url":"modules/models_config.html","classes":"tsd-kind-module"},{"id":77,"kind":128,"name":"Config","url":"classes/models_config.config.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/Config"},{"id":78,"kind":512,"name":"constructor","url":"classes/models_config.config.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/Config.Config"},{"id":79,"kind":1024,"name":"_separator","url":"classes/models_config.config.html#_separator","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":80,"kind":1024,"name":"_spaceSeparator","url":"classes/models_config.config.html#_spaceseparator","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":81,"kind":1024,"name":"_csvSeparator","url":"classes/models_config.config.html#_csvseparator","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":82,"kind":1024,"name":"_insertTime","url":"classes/models_config.config.html#_inserttime","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":83,"kind":1024,"name":"_version","url":"classes/models_config.config.html#_version","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":84,"kind":1024,"name":"_analyticsTool","url":"classes/models_config.config.html#_analyticstool","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":85,"kind":65536,"name":"__type","url":"classes/models_config.config.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/Config.Config"},{"id":86,"kind":1024,"name":"_analyticsToolName","url":"classes/models_config.config.html#_analyticstoolname","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":87,"kind":1024,"name":"_medias","url":"classes/models_config.config.html#_medias","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":88,"kind":65536,"name":"__type","url":"classes/models_config.config.html#__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/Config.Config"},{"id":89,"kind":1024,"name":"_validationRules","url":"classes/models_config.config.html#_validationrules","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":90,"kind":65536,"name":"__type","url":"classes/models_config.config.html#__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/Config.Config"},{"id":91,"kind":1024,"name":"_dependenciesConfig","url":"classes/models_config.config.html#_dependenciesconfig","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":92,"kind":2048,"name":"validateConfig","url":"classes/models_config.config.html#validateconfig","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Config.Config"},{"id":93,"kind":2048,"name":"_buildDependenciesConfig","url":"classes/models_config.config.html#_builddependenciesconfig","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":94,"kind":2048,"name":"toString","url":"classes/models_config.config.html#tostring","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Config.Config"},{"id":95,"kind":2048,"name":"toJson","url":"classes/models_config.config.html#tojson","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Config.Config"},{"id":96,"kind":2048,"name":"toCsvTemplate","url":"classes/models_config.config.html#tocsvtemplate","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Config.Config"},{"id":97,"kind":2048,"name":"_existsValidationRuleFor","url":"classes/models_config.config.html#_existsvalidationrulefor","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":98,"kind":2048,"name":"_validateRulesFor","url":"classes/models_config.config.html#_validaterulesfor","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":99,"kind":2048,"name":"_getAllDependencyConfigFor","url":"classes/models_config.config.html#_getalldependencyconfigfor","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":100,"kind":2048,"name":"_validateDependencyRulesFor","url":"classes/models_config.config.html#_validatedependencyrulesfor","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/Config.Config"},{"id":101,"kind":2048,"name":"validateField","url":"classes/models_config.config.html#validatefield","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Config.Config"},{"id":102,"kind":2048,"name":"existsColumn","url":"classes/models_config.config.html#existscolumn","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Config.Config"},{"id":103,"kind":262144,"name":"validationRules","url":"classes/models_config.config.html#validationrules","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":104,"kind":262144,"name":"separator","url":"classes/models_config.config.html#separator","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":105,"kind":262144,"name":"spaceSeparator","url":"classes/models_config.config.html#spaceseparator","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":106,"kind":262144,"name":"insertTime","url":"classes/models_config.config.html#inserttime","classes":"tsd-kind-accessor tsd-parent-kind-class","parent":"models/Config.Config"},{"id":107,"kind":262144,"name":"version","url":"classes/models_config.config.html#version","classes":"tsd-kind-accessor tsd-parent-kind-class","parent":"models/Config.Config"},{"id":108,"kind":262144,"name":"analyticsTool","url":"classes/models_config.config.html#analyticstool","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":109,"kind":262144,"name":"medias","url":"classes/models_config.config.html#medias","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":110,"kind":262144,"name":"analyticsToolName","url":"classes/models_config.config.html#analyticstoolname","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":111,"kind":262144,"name":"csvSeparator","url":"classes/models_config.config.html#csvseparator","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Config.Config"},{"id":112,"kind":1,"name":"models/DAO/AuthDAO","url":"modules/models_dao_authdao.html","classes":"tsd-kind-module"},{"id":113,"kind":128,"name":"AuthDAO","url":"classes/models_dao_authdao.authdao.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/DAO/AuthDAO"},{"id":114,"kind":512,"name":"constructor","url":"classes/models_dao_authdao.authdao.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":115,"kind":1024,"name":"_token","url":"classes/models_dao_authdao.authdao.html#_token","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":116,"kind":1024,"name":"_objectStore","url":"classes/models_dao_authdao.authdao.html#_objectstore","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":117,"kind":1024,"name":"_authCollection","url":"classes/models_dao_authdao.authdao.html#_authcollection","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":118,"kind":1024,"name":"_pathToCollection","url":"classes/models_dao_authdao.authdao.html#_pathtocollection","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":119,"kind":2048,"name":"getAuth","url":"classes/models_dao_authdao.authdao.html#getauth","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":120,"kind":2048,"name":"addAuth","url":"classes/models_dao_authdao.authdao.html#addauth","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/AuthDAO.AuthDAO"},{"id":121,"kind":1,"name":"models/DAO/ConfigDAO","url":"modules/models_dao_configdao.html","classes":"tsd-kind-module"},{"id":122,"kind":128,"name":"ConfigDAO","url":"classes/models_dao_configdao.configdao.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/DAO/ConfigDAO"},{"id":123,"kind":512,"name":"constructor","url":"classes/models_dao_configdao.configdao.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/DAO/ConfigDAO.ConfigDAO"},{"id":124,"kind":1024,"name":"_objectStore","url":"classes/models_dao_configdao.configdao.html#_objectstore","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/ConfigDAO.ConfigDAO"},{"id":125,"kind":1024,"name":"_configCollection","url":"classes/models_dao_configdao.configdao.html#_configcollection","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/ConfigDAO.ConfigDAO"},{"id":126,"kind":2048,"name":"getLastConfig","url":"classes/models_dao_configdao.configdao.html#getlastconfig","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/ConfigDAO.ConfigDAO"},{"id":127,"kind":2048,"name":"addConfig","url":"classes/models_dao_configdao.configdao.html#addconfig","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/ConfigDAO.ConfigDAO"},{"id":128,"kind":1,"name":"models/DAO/FileDAO","url":"modules/models_dao_filedao.html","classes":"tsd-kind-module"},{"id":129,"kind":128,"name":"FileDAO","url":"classes/models_dao_filedao.filedao.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/DAO/FileDAO"},{"id":130,"kind":512,"name":"constructor","url":"classes/models_dao_filedao.filedao.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/DAO/FileDAO.FileDAO"},{"id":131,"kind":1024,"name":"_file","url":"classes/models_dao_filedao.filedao.html#_file","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/FileDAO.FileDAO"},{"id":132,"kind":1024,"name":"_fileStore","url":"classes/models_dao_filedao.filedao.html#_filestore","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DAO/FileDAO.FileDAO"},{"id":133,"kind":262144,"name":"file","url":"classes/models_dao_filedao.filedao.html#file","classes":"tsd-kind-accessor tsd-parent-kind-class","parent":"models/DAO/FileDAO.FileDAO"},{"id":134,"kind":2048,"name":"save","url":"classes/models_dao_filedao.filedao.html#save","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/FileDAO.FileDAO"},{"id":135,"kind":2048,"name":"getFromStore","url":"classes/models_dao_filedao.filedao.html#getfromstore","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/FileDAO.FileDAO"},{"id":136,"kind":2048,"name":"getAllFilesFromStore","url":"classes/models_dao_filedao.filedao.html#getallfilesfromstore","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/FileDAO.FileDAO"},{"id":137,"kind":1,"name":"models/DAO/FileStore","url":"modules/models_dao_filestore.html","classes":"tsd-kind-module"},{"id":138,"kind":128,"name":"FileStore","url":"classes/models_dao_filestore.filestore.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/DAO/FileStore"},{"id":139,"kind":512,"name":"constructor","url":"classes/models_dao_filestore.filestore.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/DAO/FileStore.FileStore"},{"id":140,"kind":2048,"name":"saveFile","url":"classes/models_dao_filestore.filestore.html#savefile","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/FileStore.FileStore"},{"id":141,"kind":2048,"name":"getFile","url":"classes/models_dao_filestore.filestore.html#getfile","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/FileStore.FileStore"},{"id":142,"kind":2048,"name":"getAllFiles","url":"classes/models_dao_filestore.filestore.html#getallfiles","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/FileStore.FileStore"},{"id":143,"kind":1,"name":"models/DAO/ObjectStore","url":"modules/models_dao_objectstore.html","classes":"tsd-kind-module"},{"id":144,"kind":128,"name":"ObjectStore","url":"classes/models_dao_objectstore.objectstore.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/DAO/ObjectStore"},{"id":145,"kind":512,"name":"constructor","url":"classes/models_dao_objectstore.objectstore.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/DAO/ObjectStore.ObjectStore"},{"id":146,"kind":2048,"name":"getCollection","url":"classes/models_dao_objectstore.objectstore.html#getcollection","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/ObjectStore.ObjectStore"},{"id":147,"kind":2048,"name":"getDocument","url":"classes/models_dao_objectstore.objectstore.html#getdocument","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/ObjectStore.ObjectStore"},{"id":148,"kind":2048,"name":"getAllDocumentsFrom","url":"classes/models_dao_objectstore.objectstore.html#getalldocumentsfrom","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/ObjectStore.ObjectStore"},{"id":149,"kind":2048,"name":"addDocumentIn","url":"classes/models_dao_objectstore.objectstore.html#adddocumentin","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DAO/ObjectStore.ObjectStore"},{"id":150,"kind":1,"name":"models/DependencyConfig","url":"modules/models_dependencyconfig.html","classes":"tsd-kind-module"},{"id":151,"kind":128,"name":"DependencyConfig","url":"classes/models_dependencyconfig.dependencyconfig.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/DependencyConfig"},{"id":152,"kind":512,"name":"constructor","url":"classes/models_dependencyconfig.dependencyconfig.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":153,"kind":1024,"name":"_columnReference","url":"classes/models_dependencyconfig.dependencyconfig.html#_columnreference","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DependencyConfig.DependencyConfig"},{"id":154,"kind":1024,"name":"_valuesReference","url":"classes/models_dependencyconfig.dependencyconfig.html#_valuesreference","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DependencyConfig.DependencyConfig"},{"id":155,"kind":1024,"name":"_hasMatch","url":"classes/models_dependencyconfig.dependencyconfig.html#_hasmatch","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DependencyConfig.DependencyConfig"},{"id":156,"kind":1024,"name":"_columnDestiny","url":"classes/models_dependencyconfig.dependencyconfig.html#_columndestiny","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DependencyConfig.DependencyConfig"},{"id":157,"kind":1024,"name":"_matches","url":"classes/models_dependencyconfig.dependencyconfig.html#_matches","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/DependencyConfig.DependencyConfig"},{"id":158,"kind":2048,"name":"toJson","url":"classes/models_dependencyconfig.dependencyconfig.html#tojson","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":159,"kind":262144,"name":"columnDestiny","url":"classes/models_dependencyconfig.dependencyconfig.html#columndestiny","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":160,"kind":262144,"name":"matches","url":"classes/models_dependencyconfig.dependencyconfig.html#matches","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":161,"kind":262144,"name":"hasMatch","url":"classes/models_dependencyconfig.dependencyconfig.html#hasmatch","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":162,"kind":262144,"name":"columnReference","url":"classes/models_dependencyconfig.dependencyconfig.html#columnreference","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":163,"kind":262144,"name":"valuesReference","url":"classes/models_dependencyconfig.dependencyconfig.html#valuesreference","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/DependencyConfig.DependencyConfig"},{"id":164,"kind":1,"name":"models/FacebookAds","url":"modules/models_facebookads.html","classes":"tsd-kind-module"},{"id":165,"kind":128,"name":"FacebookAds","url":"classes/models_facebookads.facebookads.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/FacebookAds"},{"id":166,"kind":512,"name":"constructor","url":"classes/models_facebookads.facebookads.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"models/FacebookAds.FacebookAds"},{"id":167,"kind":1024,"name":"_facebookParams","url":"classes/models_facebookads.facebookads.html#_facebookparams","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":168,"kind":65536,"name":"__type","url":"classes/models_facebookads.facebookads.html#__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/FacebookAds.FacebookAds"},{"id":169,"kind":1024,"name":"_hasValidationError","url":"classes/models_facebookads.facebookads.html#_hasvalidationerror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":170,"kind":1024,"name":"_hasUndefinedParameterError","url":"classes/models_facebookads.facebookads.html#_hasundefinedparametererror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":171,"kind":1024,"name":"_validationErrorMessage","url":"classes/models_facebookads.facebookads.html#_validationerrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":172,"kind":1024,"name":"_errorFacebookParams","url":"classes/models_facebookads.facebookads.html#_errorfacebookparams","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":173,"kind":65536,"name":"__type","url":"classes/models_facebookads.facebookads.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/FacebookAds.FacebookAds"},{"id":174,"kind":1024,"name":"_undefinedParameterErrorMessage","url":"classes/models_facebookads.facebookads.html#_undefinedparametererrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":175,"kind":1024,"name":"_undefinedParameterErrorFields","url":"classes/models_facebookads.facebookads.html#_undefinedparametererrorfields","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":176,"kind":65536,"name":"__type","url":"classes/models_facebookads.facebookads.html#__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/FacebookAds.FacebookAds"},{"id":177,"kind":2048,"name":"buildedLine","url":"classes/models_facebookads.facebookads.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/FacebookAds.FacebookAds"},{"id":178,"kind":2048,"name":"_buildUrlParams","url":"classes/models_facebookads.facebookads.html#_buildurlparams","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":179,"kind":2048,"name":"_clearFacebookParamsNames","url":"classes/models_facebookads.facebookads.html#_clearfacebookparamsnames","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":180,"kind":2048,"name":"_isCompoundParameter","url":"classes/models_facebookads.facebookads.html#_iscompoundparameter","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":181,"kind":2048,"name":"_clearFacebookParamName","url":"classes/models_facebookads.facebookads.html#_clearfacebookparamname","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/FacebookAds.FacebookAds"},{"id":182,"kind":262144,"name":"csvLine","url":"classes/models_facebookads.facebookads.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/FacebookAds.FacebookAds"},{"id":183,"kind":262144,"name":"config","url":"classes/models_facebookads.facebookads.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/FacebookAds.FacebookAds"},{"id":184,"kind":1,"name":"models/GA","url":"modules/models_ga.html","classes":"tsd-kind-module"},{"id":185,"kind":128,"name":"GA","url":"classes/models_ga.ga.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/GA"},{"id":186,"kind":512,"name":"constructor","url":"classes/models_ga.ga.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"models/GA.GA"},{"id":187,"kind":1024,"name":"_utms","url":"classes/models_ga.ga.html#_utms","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":188,"kind":65536,"name":"__type","url":"classes/models_ga.ga.html#__type-3","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GA.GA"},{"id":189,"kind":1024,"name":"_hasValidationError","url":"classes/models_ga.ga.html#_hasvalidationerror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":190,"kind":65536,"name":"__type","url":"classes/models_ga.ga.html#__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GA.GA"},{"id":191,"kind":1024,"name":"_hasUndefinedParameterError","url":"classes/models_ga.ga.html#_hasundefinedparametererror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":192,"kind":65536,"name":"__type","url":"classes/models_ga.ga.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GA.GA"},{"id":193,"kind":1024,"name":"_validationErrorMessage","url":"classes/models_ga.ga.html#_validationerrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":194,"kind":65536,"name":"__type","url":"classes/models_ga.ga.html#__type-4","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GA.GA"},{"id":195,"kind":1024,"name":"_undefinedParameterErroMessage","url":"classes/models_ga.ga.html#_undefinedparametererromessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":196,"kind":65536,"name":"__type","url":"classes/models_ga.ga.html#__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GA.GA"},{"id":197,"kind":2048,"name":"_hasErrorAtUtm","url":"classes/models_ga.ga.html#_haserroratutm","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":198,"kind":2048,"name":"_errorMessageAtUtm","url":"classes/models_ga.ga.html#_errormessageatutm","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":199,"kind":2048,"name":"_hasAnyErrorAtUtms","url":"classes/models_ga.ga.html#_hasanyerroratutms","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":200,"kind":2048,"name":"buildedLine","url":"classes/models_ga.ga.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/GA.GA"},{"id":201,"kind":2048,"name":"_buildUtms","url":"classes/models_ga.ga.html#_buildutms","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GA.GA"},{"id":202,"kind":2048,"name":"_buildUrl","url":"classes/models_ga.ga.html#_buildurl","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite tsd-is-protected","parent":"models/GA.GA"},{"id":203,"kind":1024,"name":"_url","url":"classes/models_ga.ga.html#_url","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited tsd-is-protected","parent":"models/GA.GA"},{"id":204,"kind":262144,"name":"url","url":"classes/models_ga.ga.html#url","classes":"tsd-kind-accessor tsd-parent-kind-class tsd-is-inherited","parent":"models/GA.GA"},{"id":205,"kind":262144,"name":"csvLine","url":"classes/models_ga.ga.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/GA.GA"},{"id":206,"kind":262144,"name":"config","url":"classes/models_ga.ga.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/GA.GA"},{"id":207,"kind":1,"name":"models/GeneralVehicle","url":"modules/models_generalvehicle.html","classes":"tsd-kind-module"},{"id":208,"kind":128,"name":"GeneralVehicle","url":"classes/models_generalvehicle.generalvehicle.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/GeneralVehicle"},{"id":209,"kind":512,"name":"constructor","url":"classes/models_generalvehicle.generalvehicle.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":210,"kind":1024,"name":"_vehicleName","url":"classes/models_generalvehicle.generalvehicle.html#_vehiclename","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":211,"kind":1024,"name":"_params","url":"classes/models_generalvehicle.generalvehicle.html#_params","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":212,"kind":65536,"name":"__type","url":"classes/models_generalvehicle.generalvehicle.html#__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":213,"kind":1024,"name":"_hasValidationError","url":"classes/models_generalvehicle.generalvehicle.html#_hasvalidationerror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":214,"kind":1024,"name":"_hasUndefinedParameterError","url":"classes/models_generalvehicle.generalvehicle.html#_hasundefinedparametererror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":215,"kind":1024,"name":"_errorParams","url":"classes/models_generalvehicle.generalvehicle.html#_errorparams","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":216,"kind":65536,"name":"__type","url":"classes/models_generalvehicle.generalvehicle.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":217,"kind":1024,"name":"_validationErrorMessage","url":"classes/models_generalvehicle.generalvehicle.html#_validationerrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":218,"kind":1024,"name":"_undefinedParameterErrorMessage","url":"classes/models_generalvehicle.generalvehicle.html#_undefinedparametererrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":219,"kind":1024,"name":"_undefinedParameterErrorFields","url":"classes/models_generalvehicle.generalvehicle.html#_undefinedparametererrorfields","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":220,"kind":65536,"name":"__type","url":"classes/models_generalvehicle.generalvehicle.html#__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":221,"kind":2048,"name":"buildedLine","url":"classes/models_generalvehicle.generalvehicle.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":222,"kind":2048,"name":"_buildGeneralParams","url":"classes/models_generalvehicle.generalvehicle.html#_buildgeneralparams","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":223,"kind":2048,"name":"_undefinedParameterFounded","url":"classes/models_generalvehicle.generalvehicle.html#_undefinedparameterfounded","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":224,"kind":2048,"name":"_validationErrorFounded","url":"classes/models_generalvehicle.generalvehicle.html#_validationerrorfounded","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":225,"kind":262144,"name":"csvLine","url":"classes/models_generalvehicle.generalvehicle.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":226,"kind":262144,"name":"config","url":"classes/models_generalvehicle.generalvehicle.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/GeneralVehicle.GeneralVehicle"},{"id":227,"kind":1,"name":"models/GoogleAds","url":"modules/models_googleads.html","classes":"tsd-kind-module"},{"id":228,"kind":128,"name":"GoogleAds","url":"classes/models_googleads.googleads.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/GoogleAds"},{"id":229,"kind":512,"name":"constructor","url":"classes/models_googleads.googleads.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"models/GoogleAds.GoogleAds"},{"id":230,"kind":1024,"name":"_adsParams","url":"classes/models_googleads.googleads.html#_adsparams","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":231,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":232,"kind":1024,"name":"_hasValidationError","url":"classes/models_googleads.googleads.html#_hasvalidationerror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":233,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type-3","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":234,"kind":1024,"name":"_hasUndefinedParameterError","url":"classes/models_googleads.googleads.html#_hasundefinedparametererror","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":235,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":236,"kind":1024,"name":"_validationErrorMessage","url":"classes/models_googleads.googleads.html#_validationerrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":237,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type-6","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":238,"kind":1024,"name":"_undefinedParameterErrorMessage","url":"classes/models_googleads.googleads.html#_undefinedparametererrormessage","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":239,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type-5","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":240,"kind":1024,"name":"_errorAdsParams","url":"classes/models_googleads.googleads.html#_erroradsparams","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":241,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":242,"kind":1024,"name":"_undefinedParameterErrorFields","url":"classes/models_googleads.googleads.html#_undefinedparametererrorfields","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":243,"kind":65536,"name":"__type","url":"classes/models_googleads.googleads.html#__type-4","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/GoogleAds.GoogleAds"},{"id":244,"kind":2048,"name":"buildedLine","url":"classes/models_googleads.googleads.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"models/GoogleAds.GoogleAds"},{"id":245,"kind":2048,"name":"_buildAdsParams","url":"classes/models_googleads.googleads.html#_buildadsparams","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"models/GoogleAds.GoogleAds"},{"id":246,"kind":262144,"name":"csvLine","url":"classes/models_googleads.googleads.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/GoogleAds.GoogleAds"},{"id":247,"kind":262144,"name":"config","url":"classes/models_googleads.googleads.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/GoogleAds.GoogleAds"},{"id":248,"kind":1,"name":"models/Log","url":"modules/models_log.html","classes":"tsd-kind-module"},{"id":249,"kind":128,"name":"Log","url":"classes/models_log.log.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/Log"},{"id":250,"kind":512,"name":"constructor","url":"classes/models_log.log.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/Log.Log"},{"id":251,"kind":1,"name":"models/Parametrizer","url":"modules/models_parametrizer.html","classes":"tsd-kind-module"},{"id":252,"kind":128,"name":"Parametrizer","url":"classes/models_parametrizer.parametrizer.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/Parametrizer"},{"id":253,"kind":512,"name":"constructor","url":"classes/models_parametrizer.parametrizer.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/Parametrizer.Parametrizer"},{"id":254,"kind":1024,"name":"_csvLine","url":"classes/models_parametrizer.parametrizer.html#_csvline","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Parametrizer.Parametrizer"},{"id":255,"kind":65536,"name":"__type","url":"classes/models_parametrizer.parametrizer.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/Parametrizer.Parametrizer"},{"id":256,"kind":1024,"name":"_config","url":"classes/models_parametrizer.parametrizer.html#_config","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/Parametrizer.Parametrizer"},{"id":257,"kind":262144,"name":"csvLine","url":"classes/models_parametrizer.parametrizer.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Parametrizer.Parametrizer"},{"id":258,"kind":262144,"name":"config","url":"classes/models_parametrizer.parametrizer.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"models/Parametrizer.Parametrizer"},{"id":259,"kind":2048,"name":"buildedLine","url":"classes/models_parametrizer.parametrizer.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/Parametrizer.Parametrizer"},{"id":260,"kind":1,"name":"models/ParametrizerFactory","url":"modules/models_parametrizerfactory.html","classes":"tsd-kind-module"},{"id":261,"kind":128,"name":"ParametrizerFactory","url":"classes/models_parametrizerfactory.parametrizerfactory.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/ParametrizerFactory"},{"id":262,"kind":512,"name":"constructor","url":"classes/models_parametrizerfactory.parametrizerfactory.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/ParametrizerFactory.ParametrizerFactory"},{"id":263,"kind":1024,"name":"_csvLines","url":"classes/models_parametrizerfactory.parametrizerfactory.html#_csvlines","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/ParametrizerFactory.ParametrizerFactory"},{"id":264,"kind":65536,"name":"__type","url":"classes/models_parametrizerfactory.parametrizerfactory.html#__type","classes":"tsd-kind-type-literal tsd-parent-kind-class","parent":"models/ParametrizerFactory.ParametrizerFactory"},{"id":265,"kind":1024,"name":"_config","url":"classes/models_parametrizerfactory.parametrizerfactory.html#_config","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/ParametrizerFactory.ParametrizerFactory"},{"id":266,"kind":2048,"name":"build","url":"classes/models_parametrizerfactory.parametrizerfactory.html#build","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/ParametrizerFactory.ParametrizerFactory"},{"id":267,"kind":1,"name":"models/RoutesPermission","url":"modules/models_routespermission.html","classes":"tsd-kind-module"},{"id":268,"kind":128,"name":"RoutesPermission","url":"classes/models_routespermission.routespermission.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/RoutesPermission"},{"id":269,"kind":512,"name":"constructor","url":"classes/models_routespermission.routespermission.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"models/RoutesPermission.RoutesPermission"},{"id":270,"kind":1024,"name":"_method","url":"classes/models_routespermission.routespermission.html#_method","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/RoutesPermission.RoutesPermission"},{"id":271,"kind":1024,"name":"_route","url":"classes/models_routespermission.routespermission.html#_route","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"models/RoutesPermission.RoutesPermission"},{"id":272,"kind":2048,"name":"validatePermission","url":"classes/models_routespermission.routespermission.html#validatepermission","classes":"tsd-kind-method tsd-parent-kind-class","parent":"models/RoutesPermission.RoutesPermission"},{"id":273,"kind":1,"name":"models/Vehicle","url":"modules/models_vehicle.html","classes":"tsd-kind-module"},{"id":274,"kind":128,"name":"Vehicle","url":"classes/models_vehicle.vehicle.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"models/Vehicle"},{"id":275,"kind":512,"name":"constructor","url":"classes/models_vehicle.vehicle.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited","parent":"models/Vehicle.Vehicle"},{"id":276,"kind":262144,"name":"csvLine","url":"classes/models_vehicle.vehicle.html#csvline","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/Vehicle.Vehicle"},{"id":277,"kind":262144,"name":"config","url":"classes/models_vehicle.vehicle.html#config","classes":"tsd-kind-get-signature tsd-parent-kind-class tsd-is-inherited","parent":"models/Vehicle.Vehicle"},{"id":278,"kind":2048,"name":"buildedLine","url":"classes/models_vehicle.vehicle.html#buildedline","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"models/Vehicle.Vehicle"},{"id":279,"kind":1,"name":"routes/build","url":"modules/routes_build.html","classes":"tsd-kind-module"},{"id":280,"kind":64,"name":"default","url":"modules/routes_build.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/build"},{"id":281,"kind":1,"name":"routes/config","url":"modules/routes_config.html","classes":"tsd-kind-module"},{"id":282,"kind":64,"name":"default","url":"modules/routes_config.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/config"},{"id":283,"kind":1,"name":"routes/csv","url":"modules/routes_csv.html","classes":"tsd-kind-module"},{"id":284,"kind":64,"name":"default","url":"modules/routes_csv.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/csv"},{"id":285,"kind":1,"name":"routes/register","url":"modules/routes_register.html","classes":"tsd-kind-module"},{"id":286,"kind":64,"name":"default","url":"modules/routes_register.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/register"},{"id":287,"kind":1,"name":"routes/routes","url":"modules/routes_routes.html","classes":"tsd-kind-module"},{"id":288,"kind":64,"name":"default","url":"modules/routes_routes.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/routes"},{"id":289,"kind":1,"name":"routes/template","url":"modules/routes_template.html","classes":"tsd-kind-module"},{"id":290,"kind":64,"name":"default","url":"modules/routes_template.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/template"},{"id":291,"kind":1,"name":"routes/user","url":"modules/routes_user.html","classes":"tsd-kind-module"},{"id":292,"kind":64,"name":"default","url":"modules/routes_user.html#default","classes":"tsd-kind-function tsd-parent-kind-module","parent":"routes/user"},{"id":293,"kind":1,"name":"utils/CsvUtils","url":"modules/utils_csvutils.html","classes":"tsd-kind-module"},{"id":294,"kind":128,"name":"CsvUtils","url":"classes/utils_csvutils.csvutils.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"utils/CsvUtils"},{"id":295,"kind":2048,"name":"isCsvEmpty","url":"classes/utils_csvutils.csvutils.html#iscsvempty","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"utils/CsvUtils.CsvUtils"},{"id":296,"kind":2048,"name":"isLineEmpty","url":"classes/utils_csvutils.csvutils.html#islineempty","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/CsvUtils.CsvUtils"},{"id":297,"kind":2048,"name":"csv2json","url":"classes/utils_csvutils.csvutils.html#csv2json","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/CsvUtils.CsvUtils"},{"id":298,"kind":512,"name":"constructor","url":"classes/utils_csvutils.csvutils.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"utils/CsvUtils.CsvUtils"},{"id":299,"kind":1,"name":"utils/DateUtils","url":"modules/utils_dateutils.html","classes":"tsd-kind-module"},{"id":300,"kind":128,"name":"DateUtils","url":"classes/utils_dateutils.dateutils.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"utils/DateUtils"},{"id":301,"kind":2048,"name":"newDateStringFormat","url":"classes/utils_dateutils.dateutils.html#newdatestringformat","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/DateUtils.DateUtils"},{"id":302,"kind":2048,"name":"generateDateString","url":"classes/utils_dateutils.dateutils.html#generatedatestring","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/DateUtils.DateUtils"},{"id":303,"kind":512,"name":"constructor","url":"classes/utils_dateutils.dateutils.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"utils/DateUtils.DateUtils"},{"id":304,"kind":1,"name":"utils/JsonUtils","url":"modules/utils_jsonutils.html","classes":"tsd-kind-module"},{"id":305,"kind":128,"name":"JsonUtils","url":"classes/utils_jsonutils.jsonutils.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"utils/JsonUtils"},{"id":306,"kind":2048,"name":"_keyValueIsAnObject","url":"classes/utils_jsonutils.jsonutils.html#_keyvalueisanobject","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"utils/JsonUtils.JsonUtils"},{"id":307,"kind":2048,"name":"normalizeKeys","url":"classes/utils_jsonutils.jsonutils.html#normalizekeys","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/JsonUtils.JsonUtils"},{"id":308,"kind":2048,"name":"addParametersAt","url":"classes/utils_jsonutils.jsonutils.html#addparametersat","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/JsonUtils.JsonUtils"},{"id":309,"kind":512,"name":"constructor","url":"classes/utils_jsonutils.jsonutils.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"utils/JsonUtils.JsonUtils"},{"id":310,"kind":1,"name":"utils/StringUtils","url":"modules/utils_stringutils.html","classes":"tsd-kind-module"},{"id":311,"kind":128,"name":"StringUtils","url":"classes/utils_stringutils.stringutils.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"utils/StringUtils"},{"id":312,"kind":2048,"name":"normalize","url":"classes/utils_stringutils.stringutils.html#normalize","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/StringUtils.StringUtils"},{"id":313,"kind":2048,"name":"replaceWhiteSpace","url":"classes/utils_stringutils.stringutils.html#replacewhitespace","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/StringUtils.StringUtils"},{"id":314,"kind":2048,"name":"_isStringForRegex","url":"classes/utils_stringutils.stringutils.html#_isstringforregex","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private tsd-is-static","parent":"utils/StringUtils.StringUtils"},{"id":315,"kind":2048,"name":"validateString","url":"classes/utils_stringutils.stringutils.html#validatestring","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/StringUtils.StringUtils"},{"id":316,"kind":2048,"name":"isEmpty","url":"classes/utils_stringutils.stringutils.html#isempty","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"utils/StringUtils.StringUtils"},{"id":317,"kind":512,"name":"constructor","url":"classes/utils_stringutils.stringutils.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"utils/StringUtils.StringUtils"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,53.597]],["parent/0",[]],["name/1",[1,48.489]],["parent/1",[]],["name/2",[2,53.597]],["parent/2",[1,4.615]],["name/3",[3,24.51]],["parent/3",[4,3.865]],["name/4",[5,53.597]],["parent/4",[4,3.865]],["name/5",[6,53.597]],["parent/5",[4,3.865]],["name/6",[7,53.597]],["parent/6",[4,3.865]],["name/7",[8,48.489]],["parent/7",[4,3.865]],["name/8",[9,48.489]],["parent/8",[]],["name/9",[10,53.597]],["parent/9",[9,4.615]],["name/10",[3,24.51]],["parent/10",[11,2.879]],["name/11",[12,53.597]],["parent/11",[11,2.879]],["name/12",[13,40.604]],["parent/12",[11,2.879]],["name/13",[14,40.604]],["parent/13",[11,2.879]],["name/14",[15,40.604]],["parent/14",[11,2.879]],["name/15",[16,48.489]],["parent/15",[11,2.879]],["name/16",[17,53.597]],["parent/16",[11,2.879]],["name/17",[18,53.597]],["parent/17",[11,2.879]],["name/18",[19,36.251]],["parent/18",[11,2.879]],["name/19",[20,53.597]],["parent/19",[11,2.879]],["name/20",[21,45.124]],["parent/20",[11,2.879]],["name/21",[22,45.124]],["parent/21",[11,2.879]],["name/22",[23,45.124]],["parent/22",[11,2.879]],["name/23",[24,36.251]],["parent/23",[11,2.879]],["name/24",[25,35.139]],["parent/24",[11,2.879]],["name/25",[26,48.489]],["parent/25",[]],["name/26",[27,48.489]],["parent/26",[26,4.615]],["name/27",[3,24.51]],["parent/27",[28,3.57]],["name/28",[22,45.124]],["parent/28",[28,3.57]],["name/29",[23,45.124]],["parent/29",[28,3.57]],["name/30",[21,45.124]],["parent/30",[28,3.57]],["name/31",[24,36.251]],["parent/31",[28,3.57]],["name/32",[25,35.139]],["parent/32",[28,3.57]],["name/33",[19,36.251]],["parent/33",[28,3.57]],["name/34",[29,48.489]],["parent/34",[]],["name/35",[30,53.597]],["parent/35",[29,4.615]],["name/36",[3,24.51]],["parent/36",[31,3.345]],["name/37",[32,53.597]],["parent/37",[31,3.345]],["name/38",[33,53.597]],["parent/38",[31,3.345]],["name/39",[34,53.597]],["parent/39",[31,3.345]],["name/40",[35,53.597]],["parent/40",[31,3.345]],["name/41",[36,45.124]],["parent/41",[31,3.345]],["name/42",[37,53.597]],["parent/42",[31,3.345]],["name/43",[38,53.597]],["parent/43",[31,3.345]],["name/44",[39,53.597]],["parent/44",[31,3.345]],["name/45",[40,48.489]],["parent/45",[]],["name/46",[41,53.597]],["parent/46",[40,4.615]],["name/47",[42,48.489]],["parent/47",[43,3.451]],["name/48",[44,48.489]],["parent/48",[43,3.451]],["name/49",[3,24.51]],["parent/49",[43,3.451]],["name/50",[45,48.489]],["parent/50",[43,3.451]],["name/51",[46,48.489]],["parent/51",[43,3.451]],["name/52",[47,48.489]],["parent/52",[43,3.451]],["name/53",[48,48.489]],["parent/53",[43,3.451]],["name/54",[49,48.489]],["parent/54",[43,3.451]],["name/55",[50,48.489]],["parent/55",[]],["name/56",[51,53.597]],["parent/56",[50,4.615]],["name/57",[52,53.597]],["parent/57",[53,3.345]],["name/58",[54,53.597]],["parent/58",[53,3.345]],["name/59",[55,53.597]],["parent/59",[53,3.345]],["name/60",[56,53.597]],["parent/60",[53,3.345]],["name/61",[57,53.597]],["parent/61",[53,3.345]],["name/62",[58,53.597]],["parent/62",[53,3.345]],["name/63",[59,53.597]],["parent/63",[53,3.345]],["name/64",[60,53.597]],["parent/64",[53,3.345]],["name/65",[3,24.51]],["parent/65",[53,3.345]],["name/66",[61,48.489]],["parent/66",[]],["name/67",[62,53.597]],["parent/67",[61,4.615]],["name/68",[42,48.489]],["parent/68",[63,3.451]],["name/69",[44,48.489]],["parent/69",[63,3.451]],["name/70",[3,24.51]],["parent/70",[63,3.451]],["name/71",[45,48.489]],["parent/71",[63,3.451]],["name/72",[64,53.597]],["parent/72",[63,3.451]],["name/73",[65,48.489]],["parent/73",[63,3.451]],["name/74",[66,48.489]],["parent/74",[63,3.451]],["name/75",[67,48.489]],["parent/75",[63,3.451]],["name/76",[68,48.489]],["parent/76",[]],["name/77",[25,35.139]],["parent/77",[68,4.615]],["name/78",[3,24.51]],["parent/78",[69,2.117]],["name/79",[70,53.597]],["parent/79",[69,2.117]],["name/80",[71,53.597]],["parent/80",[69,2.117]],["name/81",[72,53.597]],["parent/81",[69,2.117]],["name/82",[73,53.597]],["parent/82",[69,2.117]],["name/83",[74,53.597]],["parent/83",[69,2.117]],["name/84",[75,53.597]],["parent/84",[69,2.117]],["name/85",[76,26.082]],["parent/85",[69,2.117]],["name/86",[77,53.597]],["parent/86",[69,2.117]],["name/87",[78,53.597]],["parent/87",[69,2.117]],["name/88",[76,26.082]],["parent/88",[69,2.117]],["name/89",[79,53.597]],["parent/89",[69,2.117]],["name/90",[76,26.082]],["parent/90",[69,2.117]],["name/91",[80,53.597]],["parent/91",[69,2.117]],["name/92",[81,53.597]],["parent/92",[69,2.117]],["name/93",[82,53.597]],["parent/93",[69,2.117]],["name/94",[83,53.597]],["parent/94",[69,2.117]],["name/95",[36,45.124]],["parent/95",[69,2.117]],["name/96",[84,53.597]],["parent/96",[69,2.117]],["name/97",[85,53.597]],["parent/97",[69,2.117]],["name/98",[86,53.597]],["parent/98",[69,2.117]],["name/99",[87,53.597]],["parent/99",[69,2.117]],["name/100",[88,53.597]],["parent/100",[69,2.117]],["name/101",[89,53.597]],["parent/101",[69,2.117]],["name/102",[90,53.597]],["parent/102",[69,2.117]],["name/103",[91,53.597]],["parent/103",[69,2.117]],["name/104",[92,53.597]],["parent/104",[69,2.117]],["name/105",[93,53.597]],["parent/105",[69,2.117]],["name/106",[94,53.597]],["parent/106",[69,2.117]],["name/107",[95,53.597]],["parent/107",[69,2.117]],["name/108",[27,48.489]],["parent/108",[69,2.117]],["name/109",[96,53.597]],["parent/109",[69,2.117]],["name/110",[97,53.597]],["parent/110",[69,2.117]],["name/111",[98,53.597]],["parent/111",[69,2.117]],["name/112",[99,48.489]],["parent/112",[]],["name/113",[100,53.597]],["parent/113",[99,4.615]],["name/114",[3,24.51]],["parent/114",[101,3.57]],["name/115",[102,53.597]],["parent/115",[101,3.57]],["name/116",[103,48.489]],["parent/116",[101,3.57]],["name/117",[104,53.597]],["parent/117",[101,3.57]],["name/118",[105,53.597]],["parent/118",[101,3.57]],["name/119",[106,53.597]],["parent/119",[101,3.57]],["name/120",[107,53.597]],["parent/120",[101,3.57]],["name/121",[108,48.489]],["parent/121",[]],["name/122",[109,53.597]],["parent/122",[108,4.615]],["name/123",[3,24.51]],["parent/123",[110,3.865]],["name/124",[103,48.489]],["parent/124",[110,3.865]],["name/125",[111,53.597]],["parent/125",[110,3.865]],["name/126",[112,53.597]],["parent/126",[110,3.865]],["name/127",[113,53.597]],["parent/127",[110,3.865]],["name/128",[114,48.489]],["parent/128",[]],["name/129",[115,53.597]],["parent/129",[114,4.615]],["name/130",[3,24.51]],["parent/130",[116,3.57]],["name/131",[117,53.597]],["parent/131",[116,3.57]],["name/132",[118,53.597]],["parent/132",[116,3.57]],["name/133",[119,53.597]],["parent/133",[116,3.57]],["name/134",[120,53.597]],["parent/134",[116,3.57]],["name/135",[121,53.597]],["parent/135",[116,3.57]],["name/136",[122,53.597]],["parent/136",[116,3.57]],["name/137",[123,48.489]],["parent/137",[]],["name/138",[124,53.597]],["parent/138",[123,4.615]],["name/139",[3,24.51]],["parent/139",[125,4.056]],["name/140",[65,48.489]],["parent/140",[125,4.056]],["name/141",[66,48.489]],["parent/141",[125,4.056]],["name/142",[67,48.489]],["parent/142",[125,4.056]],["name/143",[126,48.489]],["parent/143",[]],["name/144",[127,53.597]],["parent/144",[126,4.615]],["name/145",[3,24.51]],["parent/145",[128,3.865]],["name/146",[46,48.489]],["parent/146",[128,3.865]],["name/147",[47,48.489]],["parent/147",[128,3.865]],["name/148",[48,48.489]],["parent/148",[128,3.865]],["name/149",[49,48.489]],["parent/149",[128,3.865]],["name/150",[129,48.489]],["parent/150",[]],["name/151",[130,53.597]],["parent/151",[129,4.615]],["name/152",[3,24.51]],["parent/152",[131,3.083]],["name/153",[132,53.597]],["parent/153",[131,3.083]],["name/154",[133,53.597]],["parent/154",[131,3.083]],["name/155",[134,53.597]],["parent/155",[131,3.083]],["name/156",[135,53.597]],["parent/156",[131,3.083]],["name/157",[136,53.597]],["parent/157",[131,3.083]],["name/158",[36,45.124]],["parent/158",[131,3.083]],["name/159",[137,53.597]],["parent/159",[131,3.083]],["name/160",[138,53.597]],["parent/160",[131,3.083]],["name/161",[139,53.597]],["parent/161",[131,3.083]],["name/162",[140,53.597]],["parent/162",[131,3.083]],["name/163",[141,53.597]],["parent/163",[131,3.083]],["name/164",[142,48.489]],["parent/164",[]],["name/165",[143,53.597]],["parent/165",[142,4.615]],["name/166",[3,24.51]],["parent/166",[144,2.71]],["name/167",[145,53.597]],["parent/167",[144,2.71]],["name/168",[76,26.082]],["parent/168",[144,2.71]],["name/169",[13,40.604]],["parent/169",[144,2.71]],["name/170",[14,40.604]],["parent/170",[144,2.71]],["name/171",[15,40.604]],["parent/171",[144,2.71]],["name/172",[146,53.597]],["parent/172",[144,2.71]],["name/173",[76,26.082]],["parent/173",[144,2.71]],["name/174",[147,45.124]],["parent/174",[144,2.71]],["name/175",[148,45.124]],["parent/175",[144,2.71]],["name/176",[76,26.082]],["parent/176",[144,2.71]],["name/177",[19,36.251]],["parent/177",[144,2.71]],["name/178",[149,53.597]],["parent/178",[144,2.71]],["name/179",[150,53.597]],["parent/179",[144,2.71]],["name/180",[151,53.597]],["parent/180",[144,2.71]],["name/181",[152,53.597]],["parent/181",[144,2.71]],["name/182",[24,36.251]],["parent/182",[144,2.71]],["name/183",[25,35.139]],["parent/183",[144,2.71]],["name/184",[153,48.489]],["parent/184",[]],["name/185",[154,53.597]],["parent/185",[153,4.615]],["name/186",[3,24.51]],["parent/186",[155,2.567]],["name/187",[156,53.597]],["parent/187",[155,2.567]],["name/188",[76,26.082]],["parent/188",[155,2.567]],["name/189",[13,40.604]],["parent/189",[155,2.567]],["name/190",[76,26.082]],["parent/190",[155,2.567]],["name/191",[14,40.604]],["parent/191",[155,2.567]],["name/192",[76,26.082]],["parent/192",[155,2.567]],["name/193",[15,40.604]],["parent/193",[155,2.567]],["name/194",[76,26.082]],["parent/194",[155,2.567]],["name/195",[16,48.489]],["parent/195",[155,2.567]],["name/196",[76,26.082]],["parent/196",[155,2.567]],["name/197",[157,53.597]],["parent/197",[155,2.567]],["name/198",[158,53.597]],["parent/198",[155,2.567]],["name/199",[159,53.597]],["parent/199",[155,2.567]],["name/200",[19,36.251]],["parent/200",[155,2.567]],["name/201",[160,53.597]],["parent/201",[155,2.567]],["name/202",[21,45.124]],["parent/202",[155,2.567]],["name/203",[22,45.124]],["parent/203",[155,2.567]],["name/204",[23,45.124]],["parent/204",[155,2.567]],["name/205",[24,36.251]],["parent/205",[155,2.567]],["name/206",[25,35.139]],["parent/206",[155,2.567]],["name/207",[161,48.489]],["parent/207",[]],["name/208",[162,53.597]],["parent/208",[161,4.615]],["name/209",[3,24.51]],["parent/209",[163,2.71]],["name/210",[164,53.597]],["parent/210",[163,2.71]],["name/211",[165,53.597]],["parent/211",[163,2.71]],["name/212",[76,26.082]],["parent/212",[163,2.71]],["name/213",[13,40.604]],["parent/213",[163,2.71]],["name/214",[14,40.604]],["parent/214",[163,2.71]],["name/215",[166,53.597]],["parent/215",[163,2.71]],["name/216",[76,26.082]],["parent/216",[163,2.71]],["name/217",[15,40.604]],["parent/217",[163,2.71]],["name/218",[147,45.124]],["parent/218",[163,2.71]],["name/219",[148,45.124]],["parent/219",[163,2.71]],["name/220",[76,26.082]],["parent/220",[163,2.71]],["name/221",[19,36.251]],["parent/221",[163,2.71]],["name/222",[167,53.597]],["parent/222",[163,2.71]],["name/223",[168,53.597]],["parent/223",[163,2.71]],["name/224",[169,53.597]],["parent/224",[163,2.71]],["name/225",[24,36.251]],["parent/225",[163,2.71]],["name/226",[25,35.139]],["parent/226",[163,2.71]],["name/227",[170,48.489]],["parent/227",[]],["name/228",[171,53.597]],["parent/228",[170,4.615]],["name/229",[3,24.51]],["parent/229",[172,2.66]],["name/230",[173,53.597]],["parent/230",[172,2.66]],["name/231",[76,26.082]],["parent/231",[172,2.66]],["name/232",[13,40.604]],["parent/232",[172,2.66]],["name/233",[76,26.082]],["parent/233",[172,2.66]],["name/234",[14,40.604]],["parent/234",[172,2.66]],["name/235",[76,26.082]],["parent/235",[172,2.66]],["name/236",[15,40.604]],["parent/236",[172,2.66]],["name/237",[76,26.082]],["parent/237",[172,2.66]],["name/238",[147,45.124]],["parent/238",[172,2.66]],["name/239",[76,26.082]],["parent/239",[172,2.66]],["name/240",[174,53.597]],["parent/240",[172,2.66]],["name/241",[76,26.082]],["parent/241",[172,2.66]],["name/242",[148,45.124]],["parent/242",[172,2.66]],["name/243",[76,26.082]],["parent/243",[172,2.66]],["name/244",[19,36.251]],["parent/244",[172,2.66]],["name/245",[175,53.597]],["parent/245",[172,2.66]],["name/246",[24,36.251]],["parent/246",[172,2.66]],["name/247",[25,35.139]],["parent/247",[172,2.66]],["name/248",[176,48.489]],["parent/248",[]],["name/249",[177,53.597]],["parent/249",[176,4.615]],["name/250",[3,24.51]],["parent/250",[178,5.102]],["name/251",[179,48.489]],["parent/251",[]],["name/252",[180,53.597]],["parent/252",[179,4.615]],["name/253",[3,24.51]],["parent/253",[181,3.57]],["name/254",[182,53.597]],["parent/254",[181,3.57]],["name/255",[76,26.082]],["parent/255",[181,3.57]],["name/256",[183,48.489]],["parent/256",[181,3.57]],["name/257",[24,36.251]],["parent/257",[181,3.57]],["name/258",[25,35.139]],["parent/258",[181,3.57]],["name/259",[19,36.251]],["parent/259",[181,3.57]],["name/260",[184,48.489]],["parent/260",[]],["name/261",[185,53.597]],["parent/261",[184,4.615]],["name/262",[3,24.51]],["parent/262",[186,3.865]],["name/263",[187,53.597]],["parent/263",[186,3.865]],["name/264",[76,26.082]],["parent/264",[186,3.865]],["name/265",[183,48.489]],["parent/265",[186,3.865]],["name/266",[8,48.489]],["parent/266",[186,3.865]],["name/267",[188,48.489]],["parent/267",[]],["name/268",[189,53.597]],["parent/268",[188,4.615]],["name/269",[3,24.51]],["parent/269",[190,4.056]],["name/270",[191,53.597]],["parent/270",[190,4.056]],["name/271",[192,53.597]],["parent/271",[190,4.056]],["name/272",[193,53.597]],["parent/272",[190,4.056]],["name/273",[194,48.489]],["parent/273",[]],["name/274",[195,53.597]],["parent/274",[194,4.615]],["name/275",[3,24.51]],["parent/275",[196,4.056]],["name/276",[24,36.251]],["parent/276",[196,4.056]],["name/277",[25,35.139]],["parent/277",[196,4.056]],["name/278",[19,36.251]],["parent/278",[196,4.056]],["name/279",[197,48.489]],["parent/279",[]],["name/280",[198,37.503]],["parent/280",[197,4.615]],["name/281",[199,48.489]],["parent/281",[]],["name/282",[198,37.503]],["parent/282",[199,4.615]],["name/283",[200,48.489]],["parent/283",[]],["name/284",[198,37.503]],["parent/284",[200,4.615]],["name/285",[201,48.489]],["parent/285",[]],["name/286",[198,37.503]],["parent/286",[201,4.615]],["name/287",[202,48.489]],["parent/287",[]],["name/288",[198,37.503]],["parent/288",[202,4.615]],["name/289",[203,48.489]],["parent/289",[]],["name/290",[198,37.503]],["parent/290",[203,4.615]],["name/291",[204,48.489]],["parent/291",[]],["name/292",[198,37.503]],["parent/292",[204,4.615]],["name/293",[205,48.489]],["parent/293",[]],["name/294",[206,53.597]],["parent/294",[205,4.615]],["name/295",[207,53.597]],["parent/295",[208,4.056]],["name/296",[209,53.597]],["parent/296",[208,4.056]],["name/297",[210,53.597]],["parent/297",[208,4.056]],["name/298",[3,24.51]],["parent/298",[208,4.056]],["name/299",[211,48.489]],["parent/299",[]],["name/300",[212,53.597]],["parent/300",[211,4.615]],["name/301",[213,53.597]],["parent/301",[214,4.295]],["name/302",[215,53.597]],["parent/302",[214,4.295]],["name/303",[3,24.51]],["parent/303",[214,4.295]],["name/304",[216,48.489]],["parent/304",[]],["name/305",[217,53.597]],["parent/305",[216,4.615]],["name/306",[218,53.597]],["parent/306",[219,4.056]],["name/307",[220,53.597]],["parent/307",[219,4.056]],["name/308",[221,53.597]],["parent/308",[219,4.056]],["name/309",[3,24.51]],["parent/309",[219,4.056]],["name/310",[222,48.489]],["parent/310",[]],["name/311",[223,53.597]],["parent/311",[222,4.615]],["name/312",[224,53.597]],["parent/312",[225,3.706]],["name/313",[226,53.597]],["parent/313",[225,3.706]],["name/314",[227,53.597]],["parent/314",[225,3.706]],["name/315",[228,53.597]],["parent/315",[225,3.706]],["name/316",[229,53.597]],["parent/316",[225,3.706]],["name/317",[3,24.51]],["parent/317",[225,3.706]]],"invertedIndex":[["__type",{"_index":76,"name":{"85":{},"88":{},"90":{},"168":{},"173":{},"176":{},"188":{},"190":{},"192":{},"194":{},"196":{},"212":{},"216":{},"220":{},"231":{},"233":{},"235":{},"237":{},"239":{},"241":{},"243":{},"255":{},"264":{}},"parent":{}}],["_adsparams",{"_index":173,"name":{"230":{}},"parent":{}}],["_agency",{"_index":33,"name":{"38":{}},"parent":{}}],["_analyticstool",{"_index":75,"name":{"84":{}},"parent":{}}],["_analyticstoolname",{"_index":77,"name":{"86":{}},"parent":{}}],["_authcollection",{"_index":104,"name":{"117":{}},"parent":{}}],["_bucket",{"_index":64,"name":{"72":{}},"parent":{}}],["_buildadsparams",{"_index":175,"name":{"245":{}},"parent":{}}],["_buildcid",{"_index":20,"name":{"19":{}},"parent":{}}],["_builddependenciesconfig",{"_index":82,"name":{"93":{}},"parent":{}}],["_buildgeneralparams",{"_index":167,"name":{"222":{}},"parent":{}}],["_buildurl",{"_index":21,"name":{"20":{},"30":{},"202":{}},"parent":{}}],["_buildurlparams",{"_index":149,"name":{"178":{}},"parent":{}}],["_buildutms",{"_index":160,"name":{"201":{}},"parent":{}}],["_cid",{"_index":12,"name":{"11":{}},"parent":{}}],["_clearfacebookparamname",{"_index":152,"name":{"181":{}},"parent":{}}],["_clearfacebookparamsnames",{"_index":150,"name":{"179":{}},"parent":{}}],["_columndestiny",{"_index":135,"name":{"156":{}},"parent":{}}],["_columnreference",{"_index":132,"name":{"153":{}},"parent":{}}],["_company",{"_index":34,"name":{"39":{}},"parent":{}}],["_companyconfig",{"_index":6,"name":{"5":{}},"parent":{}}],["_config",{"_index":183,"name":{"256":{},"265":{}},"parent":{}}],["_configcollection",{"_index":111,"name":{"125":{}},"parent":{}}],["_csvline",{"_index":182,"name":{"254":{}},"parent":{}}],["_csvlines",{"_index":187,"name":{"263":{}},"parent":{}}],["_csvseparator",{"_index":72,"name":{"81":{}},"parent":{}}],["_db",{"_index":45,"name":{"50":{},"71":{}},"parent":{}}],["_dependenciesconfig",{"_index":80,"name":{"91":{}},"parent":{}}],["_erroradsparams",{"_index":174,"name":{"240":{}},"parent":{}}],["_errorfacebookparams",{"_index":146,"name":{"172":{}},"parent":{}}],["_errorinstance",{"_index":56,"name":{"60":{}},"parent":{}}],["_errormessage",{"_index":18,"name":{"17":{}},"parent":{}}],["_errormessageatutm",{"_index":158,"name":{"198":{}},"parent":{}}],["_errorparams",{"_index":166,"name":{"215":{}},"parent":{}}],["_existsvalidationrulefor",{"_index":85,"name":{"97":{}},"parent":{}}],["_facebookparams",{"_index":145,"name":{"167":{}},"parent":{}}],["_file",{"_index":117,"name":{"131":{}},"parent":{}}],["_filestore",{"_index":118,"name":{"132":{}},"parent":{}}],["_getalldependencyconfigfor",{"_index":87,"name":{"99":{}},"parent":{}}],["_hasanyerroratutms",{"_index":159,"name":{"199":{}},"parent":{}}],["_haserroratcid",{"_index":17,"name":{"16":{}},"parent":{}}],["_haserroratutm",{"_index":157,"name":{"197":{}},"parent":{}}],["_hasmatch",{"_index":134,"name":{"155":{}},"parent":{}}],["_hasundefinedparametererror",{"_index":14,"name":{"13":{},"170":{},"191":{},"214":{},"234":{}},"parent":{}}],["_hasvalidationerror",{"_index":13,"name":{"12":{},"169":{},"189":{},"213":{},"232":{}},"parent":{}}],["_infoinstance",{"_index":55,"name":{"59":{}},"parent":{}}],["_inserttime",{"_index":73,"name":{"82":{}},"parent":{}}],["_instance",{"_index":42,"name":{"47":{},"68":{}},"parent":{}}],["_iscompoundparameter",{"_index":151,"name":{"180":{}},"parent":{}}],["_isstringforregex",{"_index":227,"name":{"314":{}},"parent":{}}],["_jsonfromfile",{"_index":5,"name":{"4":{}},"parent":{}}],["_keyvalueisanobject",{"_index":218,"name":{"306":{}},"parent":{}}],["_loggername",{"_index":54,"name":{"58":{}},"parent":{}}],["_loggingbunyan",{"_index":52,"name":{"57":{}},"parent":{}}],["_matches",{"_index":136,"name":{"157":{}},"parent":{}}],["_media",{"_index":7,"name":{"6":{}},"parent":{}}],["_medias",{"_index":78,"name":{"87":{}},"parent":{}}],["_method",{"_index":191,"name":{"270":{}},"parent":{}}],["_objectstore",{"_index":103,"name":{"116":{},"124":{}},"parent":{}}],["_params",{"_index":165,"name":{"211":{}},"parent":{}}],["_pathtocollection",{"_index":105,"name":{"118":{}},"parent":{}}],["_permission",{"_index":32,"name":{"37":{}},"parent":{}}],["_route",{"_index":192,"name":{"271":{}},"parent":{}}],["_separator",{"_index":70,"name":{"79":{}},"parent":{}}],["_spaceseparator",{"_index":71,"name":{"80":{}},"parent":{}}],["_token",{"_index":102,"name":{"115":{}},"parent":{}}],["_undefinedparametererromessage",{"_index":16,"name":{"15":{},"195":{}},"parent":{}}],["_undefinedparametererrorfields",{"_index":148,"name":{"175":{},"219":{},"242":{}},"parent":{}}],["_undefinedparametererrormessage",{"_index":147,"name":{"174":{},"218":{},"238":{}},"parent":{}}],["_undefinedparameterfounded",{"_index":168,"name":{"223":{}},"parent":{}}],["_url",{"_index":22,"name":{"21":{},"28":{},"203":{}},"parent":{}}],["_utms",{"_index":156,"name":{"187":{}},"parent":{}}],["_validatedependencyrulesfor",{"_index":88,"name":{"100":{}},"parent":{}}],["_validaterulesfor",{"_index":86,"name":{"98":{}},"parent":{}}],["_validationerrorfounded",{"_index":169,"name":{"224":{}},"parent":{}}],["_validationerrormessage",{"_index":15,"name":{"14":{},"171":{},"193":{},"217":{},"236":{}},"parent":{}}],["_validationrules",{"_index":79,"name":{"89":{}},"parent":{}}],["_valuesreference",{"_index":133,"name":{"154":{}},"parent":{}}],["_vehiclename",{"_index":164,"name":{"210":{}},"parent":{}}],["_version",{"_index":74,"name":{"83":{}},"parent":{}}],["_warninginstance",{"_index":57,"name":{"61":{}},"parent":{}}],["addauth",{"_index":107,"name":{"120":{}},"parent":{}}],["addconfig",{"_index":113,"name":{"127":{}},"parent":{}}],["adddocumentin",{"_index":49,"name":{"54":{},"149":{}},"parent":{}}],["addparametersat",{"_index":221,"name":{"308":{}},"parent":{}}],["adobe",{"_index":10,"name":{"9":{}},"parent":{}}],["agency",{"_index":38,"name":{"43":{}},"parent":{}}],["analyticstool",{"_index":27,"name":{"26":{},"108":{}},"parent":{}}],["analyticstoolname",{"_index":97,"name":{"110":{}},"parent":{}}],["app",{"_index":0,"name":{"0":{}},"parent":{}}],["auth",{"_index":30,"name":{"35":{}},"parent":{}}],["authdao",{"_index":100,"name":{"113":{}},"parent":{}}],["build",{"_index":8,"name":{"7":{},"266":{}},"parent":{}}],["buildedline",{"_index":19,"name":{"18":{},"33":{},"177":{},"200":{},"221":{},"244":{},"259":{},"278":{}},"parent":{}}],["builder",{"_index":2,"name":{"2":{}},"parent":{}}],["columndestiny",{"_index":137,"name":{"159":{}},"parent":{}}],["columnreference",{"_index":140,"name":{"162":{}},"parent":{}}],["company",{"_index":39,"name":{"44":{}},"parent":{}}],["config",{"_index":25,"name":{"24":{},"32":{},"77":{},"183":{},"206":{},"226":{},"247":{},"258":{},"277":{}},"parent":{}}],["configdao",{"_index":109,"name":{"122":{}},"parent":{}}],["constructor",{"_index":3,"name":{"3":{},"10":{},"27":{},"36":{},"49":{},"65":{},"70":{},"78":{},"114":{},"123":{},"130":{},"139":{},"145":{},"152":{},"166":{},"186":{},"209":{},"229":{},"250":{},"253":{},"262":{},"269":{},"275":{},"298":{},"303":{},"309":{},"317":{}},"parent":{}}],["controllers/builder",{"_index":1,"name":{"1":{}},"parent":{"2":{}}}],["controllers/builder.builder",{"_index":4,"name":{},"parent":{"3":{},"4":{},"5":{},"6":{},"7":{}}}],["csv2json",{"_index":210,"name":{"297":{}},"parent":{}}],["csvline",{"_index":24,"name":{"23":{},"31":{},"182":{},"205":{},"225":{},"246":{},"257":{},"276":{}},"parent":{}}],["csvseparator",{"_index":98,"name":{"111":{}},"parent":{}}],["csvutils",{"_index":206,"name":{"294":{}},"parent":{}}],["dateutils",{"_index":212,"name":{"300":{}},"parent":{}}],["default",{"_index":198,"name":{"280":{},"282":{},"284":{},"286":{},"288":{},"290":{},"292":{}},"parent":{}}],["dependencyconfig",{"_index":130,"name":{"151":{}},"parent":{}}],["existscolumn",{"_index":90,"name":{"102":{}},"parent":{}}],["facebookads",{"_index":143,"name":{"165":{}},"parent":{}}],["file",{"_index":119,"name":{"133":{}},"parent":{}}],["filedao",{"_index":115,"name":{"129":{}},"parent":{}}],["filestore",{"_index":124,"name":{"138":{}},"parent":{}}],["firestoreconnectionsingleton",{"_index":41,"name":{"46":{}},"parent":{}}],["ga",{"_index":154,"name":{"185":{}},"parent":{}}],["generalvehicle",{"_index":162,"name":{"208":{}},"parent":{}}],["generatedatestring",{"_index":215,"name":{"302":{}},"parent":{}}],["getalldocumentsfrom",{"_index":48,"name":{"53":{},"148":{}},"parent":{}}],["getallfiles",{"_index":67,"name":{"75":{},"142":{}},"parent":{}}],["getallfilesfromstore",{"_index":122,"name":{"136":{}},"parent":{}}],["getauth",{"_index":106,"name":{"119":{}},"parent":{}}],["getcollection",{"_index":46,"name":{"51":{},"146":{}},"parent":{}}],["getdocument",{"_index":47,"name":{"52":{},"147":{}},"parent":{}}],["getfile",{"_index":66,"name":{"74":{},"141":{}},"parent":{}}],["getfromstore",{"_index":121,"name":{"135":{}},"parent":{}}],["getinstance",{"_index":44,"name":{"48":{},"69":{}},"parent":{}}],["getlastconfig",{"_index":112,"name":{"126":{}},"parent":{}}],["googleads",{"_index":171,"name":{"228":{}},"parent":{}}],["hasmatch",{"_index":139,"name":{"161":{}},"parent":{}}],["haspermissionfor",{"_index":35,"name":{"40":{}},"parent":{}}],["inserttime",{"_index":94,"name":{"106":{}},"parent":{}}],["iscsvempty",{"_index":207,"name":{"295":{}},"parent":{}}],["isempty",{"_index":229,"name":{"316":{}},"parent":{}}],["islineempty",{"_index":209,"name":{"296":{}},"parent":{}}],["jsonutils",{"_index":217,"name":{"305":{}},"parent":{}}],["log",{"_index":177,"name":{"249":{}},"parent":{}}],["logerror",{"_index":59,"name":{"63":{}},"parent":{}}],["loggingsingleton",{"_index":51,"name":{"56":{}},"parent":{}}],["loginfo",{"_index":58,"name":{"62":{}},"parent":{}}],["logwarning",{"_index":60,"name":{"64":{}},"parent":{}}],["matches",{"_index":138,"name":{"160":{}},"parent":{}}],["medias",{"_index":96,"name":{"109":{}},"parent":{}}],["models/adobe",{"_index":9,"name":{"8":{}},"parent":{"9":{}}}],["models/adobe.adobe",{"_index":11,"name":{},"parent":{"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"21":{},"22":{},"23":{},"24":{}}}],["models/analyticstool",{"_index":26,"name":{"25":{}},"parent":{"26":{}}}],["models/analyticstool.analyticstool",{"_index":28,"name":{},"parent":{"27":{},"28":{},"29":{},"30":{},"31":{},"32":{},"33":{}}}],["models/auth",{"_index":29,"name":{"34":{}},"parent":{"35":{}}}],["models/auth.auth",{"_index":31,"name":{},"parent":{"36":{},"37":{},"38":{},"39":{},"40":{},"41":{},"42":{},"43":{},"44":{}}}],["models/cloud/firestoreconnectionsingleton",{"_index":40,"name":{"45":{}},"parent":{"46":{}}}],["models/cloud/firestoreconnectionsingleton.firestoreconnectionsingleton",{"_index":43,"name":{},"parent":{"47":{},"48":{},"49":{},"50":{},"51":{},"52":{},"53":{},"54":{}}}],["models/cloud/loggingsingleton",{"_index":50,"name":{"55":{}},"parent":{"56":{}}}],["models/cloud/loggingsingleton.loggingsingleton",{"_index":53,"name":{},"parent":{"57":{},"58":{},"59":{},"60":{},"61":{},"62":{},"63":{},"64":{},"65":{}}}],["models/cloud/storageconnectionsingleton",{"_index":61,"name":{"66":{}},"parent":{"67":{}}}],["models/cloud/storageconnectionsingleton.storageconnectionsingleton",{"_index":63,"name":{},"parent":{"68":{},"69":{},"70":{},"71":{},"72":{},"73":{},"74":{},"75":{}}}],["models/config",{"_index":68,"name":{"76":{}},"parent":{"77":{}}}],["models/config.config",{"_index":69,"name":{},"parent":{"78":{},"79":{},"80":{},"81":{},"82":{},"83":{},"84":{},"85":{},"86":{},"87":{},"88":{},"89":{},"90":{},"91":{},"92":{},"93":{},"94":{},"95":{},"96":{},"97":{},"98":{},"99":{},"100":{},"101":{},"102":{},"103":{},"104":{},"105":{},"106":{},"107":{},"108":{},"109":{},"110":{},"111":{}}}],["models/dao/authdao",{"_index":99,"name":{"112":{}},"parent":{"113":{}}}],["models/dao/authdao.authdao",{"_index":101,"name":{},"parent":{"114":{},"115":{},"116":{},"117":{},"118":{},"119":{},"120":{}}}],["models/dao/configdao",{"_index":108,"name":{"121":{}},"parent":{"122":{}}}],["models/dao/configdao.configdao",{"_index":110,"name":{},"parent":{"123":{},"124":{},"125":{},"126":{},"127":{}}}],["models/dao/filedao",{"_index":114,"name":{"128":{}},"parent":{"129":{}}}],["models/dao/filedao.filedao",{"_index":116,"name":{},"parent":{"130":{},"131":{},"132":{},"133":{},"134":{},"135":{},"136":{}}}],["models/dao/filestore",{"_index":123,"name":{"137":{}},"parent":{"138":{}}}],["models/dao/filestore.filestore",{"_index":125,"name":{},"parent":{"139":{},"140":{},"141":{},"142":{}}}],["models/dao/objectstore",{"_index":126,"name":{"143":{}},"parent":{"144":{}}}],["models/dao/objectstore.objectstore",{"_index":128,"name":{},"parent":{"145":{},"146":{},"147":{},"148":{},"149":{}}}],["models/dependencyconfig",{"_index":129,"name":{"150":{}},"parent":{"151":{}}}],["models/dependencyconfig.dependencyconfig",{"_index":131,"name":{},"parent":{"152":{},"153":{},"154":{},"155":{},"156":{},"157":{},"158":{},"159":{},"160":{},"161":{},"162":{},"163":{}}}],["models/facebookads",{"_index":142,"name":{"164":{}},"parent":{"165":{}}}],["models/facebookads.facebookads",{"_index":144,"name":{},"parent":{"166":{},"167":{},"168":{},"169":{},"170":{},"171":{},"172":{},"173":{},"174":{},"175":{},"176":{},"177":{},"178":{},"179":{},"180":{},"181":{},"182":{},"183":{}}}],["models/ga",{"_index":153,"name":{"184":{}},"parent":{"185":{}}}],["models/ga.ga",{"_index":155,"name":{},"parent":{"186":{},"187":{},"188":{},"189":{},"190":{},"191":{},"192":{},"193":{},"194":{},"195":{},"196":{},"197":{},"198":{},"199":{},"200":{},"201":{},"202":{},"203":{},"204":{},"205":{},"206":{}}}],["models/generalvehicle",{"_index":161,"name":{"207":{}},"parent":{"208":{}}}],["models/generalvehicle.generalvehicle",{"_index":163,"name":{},"parent":{"209":{},"210":{},"211":{},"212":{},"213":{},"214":{},"215":{},"216":{},"217":{},"218":{},"219":{},"220":{},"221":{},"222":{},"223":{},"224":{},"225":{},"226":{}}}],["models/googleads",{"_index":170,"name":{"227":{}},"parent":{"228":{}}}],["models/googleads.googleads",{"_index":172,"name":{},"parent":{"229":{},"230":{},"231":{},"232":{},"233":{},"234":{},"235":{},"236":{},"237":{},"238":{},"239":{},"240":{},"241":{},"242":{},"243":{},"244":{},"245":{},"246":{},"247":{}}}],["models/log",{"_index":176,"name":{"248":{}},"parent":{"249":{}}}],["models/log.log",{"_index":178,"name":{},"parent":{"250":{}}}],["models/parametrizer",{"_index":179,"name":{"251":{}},"parent":{"252":{}}}],["models/parametrizer.parametrizer",{"_index":181,"name":{},"parent":{"253":{},"254":{},"255":{},"256":{},"257":{},"258":{},"259":{}}}],["models/parametrizerfactory",{"_index":184,"name":{"260":{}},"parent":{"261":{}}}],["models/parametrizerfactory.parametrizerfactory",{"_index":186,"name":{},"parent":{"262":{},"263":{},"264":{},"265":{},"266":{}}}],["models/routespermission",{"_index":188,"name":{"267":{}},"parent":{"268":{}}}],["models/routespermission.routespermission",{"_index":190,"name":{},"parent":{"269":{},"270":{},"271":{},"272":{}}}],["models/vehicle",{"_index":194,"name":{"273":{}},"parent":{"274":{}}}],["models/vehicle.vehicle",{"_index":196,"name":{},"parent":{"275":{},"276":{},"277":{},"278":{}}}],["newdatestringformat",{"_index":213,"name":{"301":{}},"parent":{}}],["normalize",{"_index":224,"name":{"312":{}},"parent":{}}],["normalizekeys",{"_index":220,"name":{"307":{}},"parent":{}}],["objectstore",{"_index":127,"name":{"144":{}},"parent":{}}],["parametrizer",{"_index":180,"name":{"252":{}},"parent":{}}],["parametrizerfactory",{"_index":185,"name":{"261":{}},"parent":{}}],["permission",{"_index":37,"name":{"42":{}},"parent":{}}],["replacewhitespace",{"_index":226,"name":{"313":{}},"parent":{}}],["routes/build",{"_index":197,"name":{"279":{}},"parent":{"280":{}}}],["routes/config",{"_index":199,"name":{"281":{}},"parent":{"282":{}}}],["routes/csv",{"_index":200,"name":{"283":{}},"parent":{"284":{}}}],["routes/register",{"_index":201,"name":{"285":{}},"parent":{"286":{}}}],["routes/routes",{"_index":202,"name":{"287":{}},"parent":{"288":{}}}],["routes/template",{"_index":203,"name":{"289":{}},"parent":{"290":{}}}],["routes/user",{"_index":204,"name":{"291":{}},"parent":{"292":{}}}],["routespermission",{"_index":189,"name":{"268":{}},"parent":{}}],["save",{"_index":120,"name":{"134":{}},"parent":{}}],["savefile",{"_index":65,"name":{"73":{},"140":{}},"parent":{}}],["separator",{"_index":92,"name":{"104":{}},"parent":{}}],["spaceseparator",{"_index":93,"name":{"105":{}},"parent":{}}],["storageconnectionsingleton",{"_index":62,"name":{"67":{}},"parent":{}}],["stringutils",{"_index":223,"name":{"311":{}},"parent":{}}],["tocsvtemplate",{"_index":84,"name":{"96":{}},"parent":{}}],["tojson",{"_index":36,"name":{"41":{},"95":{},"158":{}},"parent":{}}],["tostring",{"_index":83,"name":{"94":{}},"parent":{}}],["url",{"_index":23,"name":{"22":{},"29":{},"204":{}},"parent":{}}],["utils/csvutils",{"_index":205,"name":{"293":{}},"parent":{"294":{}}}],["utils/csvutils.csvutils",{"_index":208,"name":{},"parent":{"295":{},"296":{},"297":{},"298":{}}}],["utils/dateutils",{"_index":211,"name":{"299":{}},"parent":{"300":{}}}],["utils/dateutils.dateutils",{"_index":214,"name":{},"parent":{"301":{},"302":{},"303":{}}}],["utils/jsonutils",{"_index":216,"name":{"304":{}},"parent":{"305":{}}}],["utils/jsonutils.jsonutils",{"_index":219,"name":{},"parent":{"306":{},"307":{},"308":{},"309":{}}}],["utils/stringutils",{"_index":222,"name":{"310":{}},"parent":{"311":{}}}],["utils/stringutils.stringutils",{"_index":225,"name":{},"parent":{"312":{},"313":{},"314":{},"315":{},"316":{},"317":{}}}],["validateconfig",{"_index":81,"name":{"92":{}},"parent":{}}],["validatefield",{"_index":89,"name":{"101":{}},"parent":{}}],["validatepermission",{"_index":193,"name":{"272":{}},"parent":{}}],["validatestring",{"_index":228,"name":{"315":{}},"parent":{}}],["validationrules",{"_index":91,"name":{"103":{}},"parent":{}}],["valuesreference",{"_index":141,"name":{"163":{}},"parent":{}}],["vehicle",{"_index":195,"name":{"274":{}},"parent":{}}],["version",{"_index":95,"name":{"107":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/classes/controllers_builder.builder.html b/docs/classes/controllers_builder.builder.html new file mode 100644 index 00000000..d1995b19 --- /dev/null +++ b/docs/classes/controllers_builder.builder.html @@ -0,0 +1,263 @@ + + + + + + Builder | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Builder

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Builder +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new Builder(jsonFromFile: {}[], companyConfig: Config, media: string): Builder
  • +
+ +
+
+
+

Properties

+
+ +

Private _companyConfig

+
_companyConfig: Config
+ +
+
+ +

Private _jsonFromFile

+
_jsonFromFile: {}[]
+ +
+
+ +

Private _media

+
_media: string
+ +
+
+
+

Methods

+
+ +

build

+
    +
  • build(): {}[]
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_adobe.adobe.html b/docs/classes/models_adobe.adobe.html new file mode 100644 index 00000000..90bb5fd9 --- /dev/null +++ b/docs/classes/models_adobe.adobe.html @@ -0,0 +1,529 @@ + + + + + + Adobe | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Adobe

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ +
    +
  • + +
    +
    +

    Recebe os parametros e configurações do csv preenchido e preenche o cid e url

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Json contendo as colunas preenchidas no csv e seus valores

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +
      +
    • +
    +

    Returns Adobe

    +
  • +
+
+
+
+

Properties

+
+ +

Private _cid

+
_cid: string = ''
+ +
+
+ +

Private _hasUndefinedParameterError

+
_hasUndefinedParameterError: boolean = false
+ +
+
+ +

Private _hasValidationError

+
_hasValidationError: boolean = false
+ +
+
+ +

Private _undefinedParameterErroMessage

+
_undefinedParameterErroMessage: string = 'Parâmetros não encontrados:'
+ +
+
+ +

Protected _url

+
_url: string
+ +
+
+ +

Private _validationErrorMessage

+
_validationErrorMessage: string = 'Parâmetros incorretos:'
+ +
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+ +

url

+
    +
  • get url(): string
  • +
  • set url(url: string): void
  • +
+ +
+
+
+

Methods

+
+ +

Private _buildCid

+
    +
  • _buildCid(): string
  • +
+
    +
  • + +
    +
    +

    Constroi o Cid da linha e preenche o atributo hasErrorAtCid

    +
    +
    +

    Returns string

    +
  • +
+
+
+ +

Protected _buildUrl

+
    +
  • _buildUrl(): string
  • +
+ +
+
+ +

Private _errorMessage

+
    +
  • _errorMessage(): string
  • +
+
    +
  • + +
    +
    +

    Retorna a mensagem de erro completa da geração do cid

    +
    +
    +

    Returns string

    +
  • +
+
+
+ +

Private _hasErrorAtCid

+
    +
  • _hasErrorAtCid(): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se houve algum erro na geração do cid

    +
    +
    +

    Returns boolean

    +
  • +
+
+
+ +

buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Private property
  • +
  • Private method
  • +
+
    +
  • Function
  • +
+
    +
  • Inherited accessor
  • +
+
    +
  • Protected method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_analyticstool.analyticstool.html b/docs/classes/models_analyticstool.analyticstool.html new file mode 100644 index 00000000..baddd73f --- /dev/null +++ b/docs/classes/models_analyticstool.analyticstool.html @@ -0,0 +1,388 @@ + + + + + + AnalyticsTool | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class AnalyticsTool

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ +
    +
  • + +
    +
    +

    Recebe os parametros e configurações do csv preenchido e preenche os atributos

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Json contendo as colunas preenchidas no csv e seus valores

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +
      +
    • +
    +

    Returns AnalyticsTool

    +
  • +
+
+
+
+

Properties

+
+ +

Protected _url

+
_url: string
+ +
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+ +

url

+
    +
  • get url(): string
  • +
  • set url(url: string): void
  • +
+ +
+
+
+

Methods

+
+ +

Protected Abstract _buildUrl

+
    +
  • _buildUrl(): string
  • +
+ +
+
+ +

Abstract buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Accessor
  • +
+
    +
  • Inherited constructor
  • +
  • Inherited method
  • +
+
    +
  • Protected property
  • +
  • Protected method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_auth.auth.html b/docs/classes/models_auth.auth.html new file mode 100644 index 00000000..961da595 --- /dev/null +++ b/docs/classes/models_auth.auth.html @@ -0,0 +1,380 @@ + + + + + + Auth | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Auth

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Auth +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new Auth(permission: string, company: string, agency?: string): Auth
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      permission: string
      +
    • +
    • +
      company: string
      +
    • +
    • +
      agency: string = ''
      +
    • +
    +

    Returns Auth

    +
  • +
+
+
+
+

Properties

+
+ +

Private _agency

+
_agency: string
+ +
+
+ +

Private _company

+
_company: string
+ +
+
+ +

Private _permission

+
_permission: string
+ +
+
+
+

Accessors

+
+ +

agency

+
    +
  • get agency(): string
  • +
+ +
+
+ +

company

+
    +
  • get company(): string
  • +
+ +
+
+ +

permission

+
    +
  • get permission(): string
  • +
+ +
+
+
+

Methods

+
+ +

hasPermissionFor

+
    +
  • hasPermissionFor(route: string, method: string): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se o usuário tem permissão para acessar determinada rota

    +
    +
    +

    Parameters

    +
      +
    • +
      route: string
      +
      +

      Rota que se deseja acessar

      +
      +
    • +
    • +
      method: string
      +
      +

      Método de acesso à rota

      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

toJson

+
    +
  • toJson(): {}
  • +
+
    +
  • + +
    +
    +

    Retorna um JSON correspondente ao objeto Auth

    +
    +
    +

    Returns {}

    +
      +
    • +
      [key: string]: string
      +
    • +
    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html b/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html new file mode 100644 index 00000000..3e50e669 --- /dev/null +++ b/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html @@ -0,0 +1,406 @@ + + + + + + FirestoreConnectionSingleton | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class FirestoreConnectionSingleton

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + ObjectStore +
      +
    • + FirestoreConnectionSingleton +
    • +
    +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

Private constructor

+ + +
+
+
+

Properties

+
+ +

Private _db

+
_db: Firestore
+ +
+
+ +

Static Private _instance

+ + +
+
+
+

Methods

+
+ +

addDocumentIn

+
    +
  • addDocumentIn(collection: CollectionReference<DocumentData>, document: {}, documentName: string): DocumentReference<DocumentData>
  • +
+
    +
  • + +
    +
    +

    Adiciona um documento à uma coleção

    +
    +
    +

    Parameters

    +
      +
    • +
      collection: CollectionReference<DocumentData>
      +
      +

      Coleção de referência

      +
      +
    • +
    • +
      document: {}
      +
      +

      Documento a ser inserido à coleção

      +
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    • +
      documentName: string
      +
      +

      Nome do documento no Firestore, caso não seja necessário o uso do ID automático

      +
      +
    • +
    +

    Returns DocumentReference<DocumentData>

    +
  • +
+
+
+ +

getAllDocumentsFrom

+
    +
  • getAllDocumentsFrom(collection: CollectionReference<DocumentData>): Promise<DocumentData[]>
  • +
+ +
+
+ +

getCollection

+
    +
  • getCollection(path: string[]): CollectionReference<DocumentData>
  • +
+ +
+
+ +

getDocument

+
    +
  • getDocument(path: string[]): DocumentReference<DocumentData>
  • +
+ +
+
+ +

Static getInstance

+ + +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html b/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html new file mode 100644 index 00000000..575fa11f --- /dev/null +++ b/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html @@ -0,0 +1,338 @@ + + + + + + LoggingSingleton | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class LoggingSingleton

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Log +
      +
    • + LoggingSingleton +
    • +
    +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

Private constructor

+ + +
+
+
+

Properties

+
+ +

Static Private _errorInstance

+
_errorInstance: Logger
+ +
+
+ +

Static Private _infoInstance

+
_infoInstance: Logger
+ +
+
+ +

Static Private _loggerName

+
_loggerName: string = 'adinfo'
+ +
+
+ +

Static Private _loggingBunyan

+
_loggingBunyan: LoggingBunyan = ...
+ +
+
+ +

Static Private _warningInstance

+
_warningInstance: Logger
+ +
+
+
+

Methods

+
+ +

Static logError

+
    +
  • logError(message: string): void
  • +
+ +
+
+ +

Static logInfo

+
    +
  • logInfo(message: string): void
  • +
+ +
+
+ +

Static logWarning

+
    +
  • logWarning(message: string): void
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html b/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html new file mode 100644 index 00000000..1a3ed927 --- /dev/null +++ b/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html @@ -0,0 +1,373 @@ + + + + + + StorageConnectionSingleton | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class StorageConnectionSingleton

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + FileStore +
      +
    • + StorageConnectionSingleton +
    • +
    +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

Private constructor

+ + +
+
+
+

Properties

+
+ +

Private _bucket

+
_bucket: string = ...
+ +
+
+ +

Private _db

+
_db: Storage
+ +
+
+ +

Static Private _instance

+ + +
+
+
+

Methods

+
+ +

getAllFiles

+
    +
  • getAllFiles(folder: string): Promise<File[][]>
  • +
+ +
+
+ +

getFile

+
    +
  • getFile(filePath: string): Promise<DownloadResponse>
  • +
+ +
+
+ +

saveFile

+
    +
  • saveFile(file: FileDAO, path: string): Promise<void>
  • +
+ +
+
+ +

Static getInstance

+ + +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_config.config.html b/docs/classes/models_config.config.html new file mode 100644 index 00000000..892f3911 --- /dev/null +++ b/docs/classes/models_config.config.html @@ -0,0 +1,998 @@ + + + + + + Config | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Config

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Config +
  • +
+
+
+

Index

+
+ +
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new Config(jsonConfig: {}): Config
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      jsonConfig: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns Config

    +
  • +
+
+
+
+

Properties

+
+ +

Private _analyticsTool

+
_analyticsTool: {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: {}
    +
      +
    • +
      [key: string]: string[]
      +
    • +
    +
  • +
+
+
+
+ +

Private _analyticsToolName

+
_analyticsToolName: string
+ +
+
+ +

Private _csvSeparator

+
_csvSeparator: string = ','
+ +
+
+ +

Private _dependenciesConfig

+
_dependenciesConfig: DependencyConfig[]
+ +
+
+ +

Private _insertTime

+
_insertTime: string
+ +
+
+ +

Private _medias

+
_medias: {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: any
    +
  • +
+
+
+
+ +

Private _separator

+
_separator: string
+ +
+
+ +

Private _spaceSeparator

+
_spaceSeparator: string
+ +
+
+ +

Private _validationRules

+
_validationRules: {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _version

+
_version: number
+ +
+
+
+

Accessors

+
+ +

analyticsTool

+
    +
  • get analyticsTool(): {}
  • +
+
    +
  • + +

    Returns {}

    +
      +
    • +
      [key: string]: {}
      +
        +
      • +
        [key: string]: string[]
        +
      • +
      +
    • +
    +
  • +
+
+
+ +

analyticsToolName

+
    +
  • get analyticsToolName(): string
  • +
+ +
+
+ +

csvSeparator

+
    +
  • get csvSeparator(): string
  • +
+ +
+
+ +

insertTime

+
    +
  • get insertTime(): string
  • +
  • set insertTime(insertTime: string): void
  • +
+ +
+
+ +

medias

+
    +
  • get medias(): {}
  • +
+ +
+
+ +

separator

+
    +
  • get separator(): string
  • +
+ +
+
+ +

spaceSeparator

+
    +
  • get spaceSeparator(): string
  • +
+ +
+
+ +

validationRules

+
    +
  • get validationRules(): {}
  • +
+ +
+
+ +

version

+
    +
  • get version(): number
  • +
  • set version(version: number): void
  • +
+ +
+
+
+

Methods

+
+ +

Private _buildDependenciesConfig

+
    +
  • _buildDependenciesConfig(dependenciesConfig: { columnDestiny: string; columnReference: string; hasMatch: boolean; matches: string[]; valuesReference: string[] }[]): DependencyConfig[]
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      dependenciesConfig: { columnDestiny: string; columnReference: string; hasMatch: boolean; matches: string[]; valuesReference: string[] }[]
      +
    • +
    +

    Returns DependencyConfig[]

    +
  • +
+
+
+ +

Private _existsValidationRuleFor

+
    +
  • _existsValidationRuleFor(csvColumn: string): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se existe alguma regra de validação cadastrada para a coluna especificada do csv

    +
    +
    +

    Parameters

    +
      +
    • +
      csvColumn: string
      +
      +

      coluna do CSV a ser conferida

      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

Private _getAllDependencyConfigFor

+ +
    +
  • + +
    +
    +

    Pega a regra de dependência para a coluna do CSV

    +
    +
    +

    Parameters

    +
      +
    • +
      csvColumn: string
      +
      +

      Coluan do csv de referência

      +
      +
    • +
    +

    Returns DependencyConfig[]

    +
  • +
+
+
+ +

Private _validateDependencyRulesFor

+
    +
  • _validateDependencyRulesFor(csvLine: {}, csvColumn: string, value: string): boolean
  • +
+
    +
  • + +
    +
    +

    Valida as regras de dependência para a coluna especificada

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Linha do CSV

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      csvColumn: string
      +
      +

      Coluna do CSV a ser validada

      +
      +
    • +
    • +
      value: string
      +
      +

      Valor da coluna

      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

Private _validateRulesFor

+
    +
  • _validateRulesFor(csvColumn: string, value: string): boolean
  • +
+
    +
  • + +
    +
    +

    Valida se a coluna do CSV foi preenchida corretamente

    +
    +
    +

    Parameters

    +
      +
    • +
      csvColumn: string
      +
      +

      Coluna do CSV a ser validada

      +
      +
    • +
    • +
      value: string
      +
      +

      Valor da coluna

      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

existsColumn

+
    +
  • existsColumn(csvColumn: string): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se a coluna informada existe no atributo columns da configuração

    +
    +
    +

    Parameters

    +
      +
    • +
      csvColumn: string
      +
      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

toCsvTemplate

+
    +
  • toCsvTemplate(): string
  • +
+
    +
  • + +
    +
    +

    Transforma a configuração em um cabeçalho csv

    +
    +
    +

    Returns string

    +

    String correspondente ao CSV gerado

    +
  • +
+
+
+ +

toJson

+
    +
  • toJson(): {}
  • +
+
    +
  • + +
    +
    +

    Converte o objeto Config no JSON inserido no banco de dados

    +
    +
    +

    Returns {}

    +
      +
    • +
      [key: string]: any
      +
    • +
    +
  • +
+
+
+ +

toString

+
    +
  • toString(): string
  • +
+
    +
  • + +
    +
    +

    Transforma o objeto Config numa string

    +
    +
    +

    Returns string

    +
  • +
+
+
+ +

validateConfig

+
    +
  • validateConfig(): boolean
  • +
+
    +
  • + +
    +
    +

    Checa se a configuração é válida

    +
    +
    +

    Returns boolean

    +
  • +
+
+
+ +

validateField

+
    +
  • validateField(csvLine: {}, csvColumn: string, value: string): boolean
  • +
+
    +
  • + +
    +
    +

    Valida se o campo está de acordo com as regras de validação e de dependência

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Linha do CSV

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      csvColumn: string
      +
      +

      Coluna do CSV de referência

      +
      +
    • +
    • +
      value: string
      +
      +

      Valor da coluna

      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
  • Accessor
  • +
+
    +
  • Private property
  • +
  • Private method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_dao_authdao.authdao.html b/docs/classes/models_dao_authdao.authdao.html new file mode 100644 index 00000000..f2b6e8fc --- /dev/null +++ b/docs/classes/models_dao_authdao.authdao.html @@ -0,0 +1,298 @@ + + + + + + AuthDAO | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class AuthDAO

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + AuthDAO +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new AuthDAO(token: string): AuthDAO
  • +
+ +
+
+
+

Properties

+
+ +

Private _authCollection

+
_authCollection: CollectionReference<DocumentData>
+ +
+
+ +

Private _objectStore

+
_objectStore: ObjectStore
+ +
+
+ +

Private _pathToCollection

+
_pathToCollection: string[]
+ +
+
+ +

Private _token

+
_token: string
+ +
+
+
+

Methods

+
+ +

addAuth

+
    +
  • addAuth(jsonAuth: {}): Promise<string | void>
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      jsonAuth: {}
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    +

    Returns Promise<string | void>

    +
  • +
+
+
+ +

getAuth

+
    +
  • getAuth(): Promise<void | Auth>
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_dao_configdao.configdao.html b/docs/classes/models_dao_configdao.configdao.html new file mode 100644 index 00000000..c4ef09dd --- /dev/null +++ b/docs/classes/models_dao_configdao.configdao.html @@ -0,0 +1,278 @@ + + + + + + ConfigDAO | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class ConfigDAO

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + ConfigDAO +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new ConfigDAO(companyName: string): ConfigDAO
  • +
+ +
+
+
+

Properties

+
+ +

Private _configCollection

+
_configCollection: CollectionReference<DocumentData>
+ +
+
+ +

Private _objectStore

+
_objectStore: ObjectStore
+ +
+
+
+

Methods

+
+ +

addConfig

+
    +
  • addConfig(config: Config): Promise<DocumentReference<DocumentData>>
  • +
+
    +
  • + +
    +
    +

    Adiciona uma configuração ao Banco de Dados

    +
    +
    +

    Parameters

    +
      +
    • +
      config: Config
      +
      +

      Configuração a ser adicionada

      +
      +
    • +
    +

    Returns Promise<DocumentReference<DocumentData>>

    +
  • +
+
+
+ +

getLastConfig

+
    +
  • getLastConfig(): Promise<void | Config>
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_dao_filedao.filedao.html b/docs/classes/models_dao_filedao.filedao.html new file mode 100644 index 00000000..21b0f7af --- /dev/null +++ b/docs/classes/models_dao_filedao.filedao.html @@ -0,0 +1,361 @@ + + + + + + FileDAO | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class FileDAO

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + FileDAO +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Properties

+
+ +

Private _file

+
_file: Buffer
+ +
+
+ +

Private _fileStore

+
_fileStore: FileStore
+ +
+
+
+

Accessors

+
+ +

file

+
    +
  • get file(): Buffer
  • +
  • set file(file: Buffer): void
  • +
+ +
+
+
+

Methods

+
+ +

getAllFilesFromStore

+
    +
  • getAllFilesFromStore(agency: string): Promise<File[][]>
  • +
+
    +
  • + +
    +
    +

    Pegar todos os arquivos de uma agencia

    +
    +
    +

    Parameters

    +
      +
    • +
      agency: string
      +
      +

      nome da agencia

      +
      +
    • +
    +

    Returns Promise<File[][]>

    +
  • +
+
+
+ +

getFromStore

+
    +
  • getFromStore(filePath: string): Promise<Buffer>
  • +
+
    +
  • + +
    +
    +

    Pega um arquivo do banco de arquivos

    +
    +
    +

    Parameters

    +
      +
    • +
      filePath: string
      +
      +

      Caminho do arquivo no banco

      +
      +
    • +
    +

    Returns Promise<Buffer>

    +
  • +
+
+
+ +

save

+
    +
  • save(path: string): Promise<void>
  • +
+
    +
  • + +
    +
    +

    Salva um arquivo no banco de arquivos

    +
    +
    +

    Parameters

    +
      +
    • +
      path: string
      +
      +

      Caminho para salvar o arquivo

      +
      +
    • +
    +

    Returns Promise<void>

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
  • Accessor
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_dao_filestore.filestore.html b/docs/classes/models_dao_filestore.filestore.html new file mode 100644 index 00000000..9e535fec --- /dev/null +++ b/docs/classes/models_dao_filestore.filestore.html @@ -0,0 +1,258 @@ + + + + + + FileStore | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class FileStore

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Methods

+
+ +

Abstract getAllFiles

+
    +
  • getAllFiles(folder: string): Promise<any>
  • +
+ +
+
+ +

Abstract getFile

+
    +
  • getFile(filePath: string): Promise<any>
  • +
+ +
+
+ +

Abstract saveFile

+
    +
  • saveFile(file: FileDAO, path: string): Promise<void>
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_dao_objectstore.objectstore.html b/docs/classes/models_dao_objectstore.objectstore.html new file mode 100644 index 00000000..cbbd930d --- /dev/null +++ b/docs/classes/models_dao_objectstore.objectstore.html @@ -0,0 +1,293 @@ + + + + + + ObjectStore | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class ObjectStore

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Methods

+
+ +

Abstract addDocumentIn

+
    +
  • addDocumentIn(collection: CollectionReference<DocumentData>, document: {}, documentName: string): DocumentReference<DocumentData>
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      collection: CollectionReference<DocumentData>
      +
    • +
    • +
      document: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    • +
      documentName: string
      +
    • +
    +

    Returns DocumentReference<DocumentData>

    +
  • +
+
+
+ +

Abstract getAllDocumentsFrom

+
    +
  • getAllDocumentsFrom(collection: CollectionReference<DocumentData>): Promise<DocumentData[]>
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      collection: CollectionReference<DocumentData>
      +
    • +
    +

    Returns Promise<DocumentData[]>

    +
  • +
+
+
+ +

Abstract getCollection

+
    +
  • getCollection(path: string[]): CollectionReference<DocumentData>
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      path: string[]
      +
    • +
    +

    Returns CollectionReference<DocumentData>

    +
  • +
+
+
+ +

Abstract getDocument

+
    +
  • getDocument(path: string[]): DocumentReference<DocumentData>
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      path: string[]
      +
    • +
    +

    Returns DocumentReference<DocumentData>

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_dependencyconfig.dependencyconfig.html b/docs/classes/models_dependencyconfig.dependencyconfig.html new file mode 100644 index 00000000..8f22d575 --- /dev/null +++ b/docs/classes/models_dependencyconfig.dependencyconfig.html @@ -0,0 +1,432 @@ + + + + + + DependencyConfig | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class DependencyConfig

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + DependencyConfig +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new DependencyConfig(dependencyConfig: { columnDestiny: string; columnReference: string; hasMatch: boolean; matches: string[]; valuesReference: string[] }): DependencyConfig
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      dependencyConfig: { columnDestiny: string; columnReference: string; hasMatch: boolean; matches: string[]; valuesReference: string[] }
      +
        +
      • +
        columnDestiny: string
        +
      • +
      • +
        columnReference: string
        +
      • +
      • +
        hasMatch: boolean
        +
      • +
      • +
        matches: string[]
        +
      • +
      • +
        valuesReference: string[]
        +
      • +
      +
    • +
    +

    Returns DependencyConfig

    +
  • +
+
+
+
+

Properties

+
+ +

Private _columnDestiny

+
_columnDestiny: string
+ +
+
+ +

Private _columnReference

+
_columnReference: string
+ +
+
+ +

Private _hasMatch

+
_hasMatch: boolean
+ +
+
+ +

Private _matches

+
_matches: string[]
+ +
+
+ +

Private _valuesReference

+
_valuesReference: string[]
+ +
+
+
+

Accessors

+
+ +

columnDestiny

+
    +
  • get columnDestiny(): string
  • +
+ +
+
+ +

columnReference

+
    +
  • get columnReference(): string
  • +
+ +
+
+ +

hasMatch

+
    +
  • get hasMatch(): boolean
  • +
+ +
+
+ +

matches

+
    +
  • get matches(): string[]
  • +
+ +
+
+ +

valuesReference

+
    +
  • get valuesReference(): string[]
  • +
+ +
+
+
+

Methods

+
+ +

toJson

+
    +
  • toJson(): { columnDestiny: string; columnReference: string; hasMatch: boolean; matches: string[]; valuesReference: string[] }
  • +
+
    +
  • + +
    +
    +

    Transforma a configuração em um objeto JSON

    +
    +
    +

    Returns { columnDestiny: string; columnReference: string; hasMatch: boolean; matches: string[]; valuesReference: string[] }

    +
      +
    • +
      columnDestiny: string
      +
    • +
    • +
      columnReference: string
      +
    • +
    • +
      hasMatch: boolean
      +
    • +
    • +
      matches: string[]
      +
    • +
    • +
      valuesReference: string[]
      +
    • +
    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_facebookads.facebookads.html b/docs/classes/models_facebookads.facebookads.html new file mode 100644 index 00000000..8cfddf6e --- /dev/null +++ b/docs/classes/models_facebookads.facebookads.html @@ -0,0 +1,545 @@ + + + + + + FacebookAds | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class FacebookAds

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Vehicle +
      +
    • + FacebookAds +
    • +
    +
  • +
+
+
+

Index

+
+ +
+
+
+

Constructors

+
+ +

constructor

+ +
    +
  • + +
    +
    +

    Geração dos campos para Facebook

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +

      Recebe os parametros e configurações do csv preenchido e preenche os atributos url

      +
      +
    • +
    +

    Returns FacebookAds

    +
  • +
+
+
+
+

Properties

+
+ +

Private _errorFacebookParams

+
_errorFacebookParams: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _facebookParams

+
_facebookParams: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+ +

Private _hasUndefinedParameterError

+
_hasUndefinedParameterError: boolean = false
+ +
+
+ +

Private _hasValidationError

+
_hasValidationError: boolean = false
+ +
+
+ +

Private _undefinedParameterErrorFields

+
_undefinedParameterErrorFields: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _undefinedParameterErrorMessage

+
_undefinedParameterErrorMessage: string = 'Parâmetro(s) não encontrado(s) na configuração: '
+ +
+
+ +

Private _validationErrorMessage

+
_validationErrorMessage: string = 'Parâmetros incorretos: '
+ +
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+
+

Methods

+
+ +

Private _buildUrlParams

+
    +
  • _buildUrlParams(): void
  • +
+ +
+
+ +

Private _clearFacebookParamName

+
    +
  • _clearFacebookParamName(parameter: string): string
  • +
+
    +
  • + +
    +
    +

    Elimina os caracteres especiais para o parametro do facebook, deixando-o no padrão do cabeçalho

    +
    +
    +

    Parameters

    +
      +
    • +
      parameter: string
      +
      +

      parametro do facebook

      +
      +
    • +
    +

    Returns string

    +

    string do parametro limpa

    +
  • +
+
+
+ +

Private _clearFacebookParamsNames

+
    +
  • _clearFacebookParamsNames(): void
  • +
+ +
+
+ +

Private _isCompoundParameter

+
    +
  • _isCompoundParameter(parameter: string): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se o parâmetro é um parâmetro composto

    +
    +
    +

    Parameters

    +
      +
    • +
      parameter: string
      +
      +

      Parametro a ser analisado

      +
      +
    • +
    +

    Returns boolean

    +

    indica se o parametro é composto

    +
  • +
+
+
+ +

buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Private property
  • +
  • Private method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_ga.ga.html b/docs/classes/models_ga.ga.html new file mode 100644 index 00000000..15283a7d --- /dev/null +++ b/docs/classes/models_ga.ga.html @@ -0,0 +1,616 @@ + + + + + + GA | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class GA

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+ +
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new GA(csvLine: {}, config: Config): GA
  • +
+
    +
  • + +
    +
    +

    Recebe os parametros e configurações do csv preenchido e preenche os atributos utms e url

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Json contendo as colunas preenchidas no csv e seus valores

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +
      +
    • +
    +

    Returns GA

    +
  • +
+
+
+
+

Properties

+
+ +

Private _hasUndefinedParameterError

+
_hasUndefinedParameterError: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: boolean
    +
  • +
+
+
+
+ +

Private _hasValidationError

+
_hasValidationError: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: boolean
    +
  • +
+
+
+
+ +

Private _undefinedParameterErroMessage

+
_undefinedParameterErroMessage: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+ +

Protected _url

+
_url: string
+ +
+
+ +

Private _utms

+
_utms: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+ +

Private _validationErrorMessage

+
_validationErrorMessage: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+ +

url

+
    +
  • get url(): string
  • +
  • set url(url: string): void
  • +
+ +
+
+
+

Methods

+
+ +

Protected _buildUrl

+
    +
  • _buildUrl(): string
  • +
+ +
+
+ +

Private _buildUtms

+
    +
  • _buildUtms(): {}
  • +
+
    +
  • + +
    +
    +

    Constrói os utms

    +
    +
    +

    Returns {}

    +
      +
    • +
      [key: string]: string
      +
    • +
    +
  • +
+
+
+ +

Private _errorMessageAtUtm

+
    +
  • _errorMessageAtUtm(utm: string): string
  • +
+
    +
  • + +
    +
    +

    Retorna a mensagem de erro completa de cada utm

    +
    +
    +

    Parameters

    +
      +
    • +
      utm: string
      +
    • +
    +

    Returns string

    +
  • +
+
+
+ +

Private _hasAnyErrorAtUtms

+
    +
  • _hasAnyErrorAtUtms(): boolean
  • +
+
    +
  • + +
    +
    +

    Retorna se há algum erro nos utms

    +
    +
    +

    Returns boolean

    +
  • +
+
+
+ +

Private _hasErrorAtUtm

+
    +
  • _hasErrorAtUtm(utm: string): boolean
  • +
+
    +
  • + +
    +
    +

    Retorna se houve erro na geração dos utms

    +
    +
    +

    Parameters

    +
      +
    • +
      utm: string
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Private property
  • +
  • Private method
  • +
+
    +
  • Function
  • +
+
    +
  • Inherited accessor
  • +
+
    +
  • Protected method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_generalvehicle.generalvehicle.html b/docs/classes/models_generalvehicle.generalvehicle.html new file mode 100644 index 00000000..48240138 --- /dev/null +++ b/docs/classes/models_generalvehicle.generalvehicle.html @@ -0,0 +1,527 @@ + + + + + + GeneralVehicle | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class GeneralVehicle

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Vehicle +
      +
    • + GeneralVehicle +
    • +
    +
  • +
+
+
+

Index

+
+ +
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Properties

+
+ +

Private _errorParams

+
_errorParams: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _hasUndefinedParameterError

+
_hasUndefinedParameterError: boolean = false
+ +
+
+ +

Private _hasValidationError

+
_hasValidationError: boolean = false
+ +
+
+ +

Private _params

+
_params: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+ +

Private _undefinedParameterErrorFields

+
_undefinedParameterErrorFields: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _undefinedParameterErrorMessage

+
_undefinedParameterErrorMessage: string = 'Parâmetro(s) não encontrado(s) na configuração: '
+ +
+
+ +

Private _validationErrorMessage

+
_validationErrorMessage: string = 'Parâmetro(s) incorreto(s): '
+ +
+
+ +

Private _vehicleName

+
_vehicleName: string
+ +
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+
+

Methods

+
+ +

Private _buildGeneralParams

+
    +
  • _buildGeneralParams(): void
  • +
+ +
+
+ +

Private _undefinedParameterFounded

+
    +
  • _undefinedParameterFounded(param: string, csvColumn: string): void
  • +
+
    +
  • + +
    +
    +

    Preenche os erros caso algum atributo não seja encontrado no objeto config

    +
    +
    +

    Parameters

    +
      +
    • +
      param: string
      +
    • +
    • +
      csvColumn: string
      +
    • +
    +

    Returns void

    +
  • +
+
+
+ +

Private _validationErrorFounded

+
    +
  • _validationErrorFounded(param: string, csvColumn: string): void
  • +
+
    +
  • + +
    +
    +

    Preenche os erros caso alguma coluna do csv não tenha siddo preenchida corretamente

    +
    +
    +

    Parameters

    +
      +
    • +
      param: string
      +
      +

      parametro onde o erro foi encontrado

      +
      +
    • +
    • +
      csvColumn: string
      +
      +

      coluna do csv

      +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+ +

buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Private property
  • +
  • Private method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_googleads.googleads.html b/docs/classes/models_googleads.googleads.html new file mode 100644 index 00000000..9f4a6829 --- /dev/null +++ b/docs/classes/models_googleads.googleads.html @@ -0,0 +1,479 @@ + + + + + + GoogleAds | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class GoogleAds

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + Vehicle +
      +
    • + GoogleAds +
    • +
    +
  • +
+
+
+

Index

+
+ +
+
+
+

Constructors

+
+ +

constructor

+ +
    +
  • + +
    +
    +

    Geração dos campos para GoogleAds

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +

      Recebe os parametros e configurações do csv preenchido e preenche os atributos url

      +
      +
    • +
    +

    Returns GoogleAds

    +
  • +
+
+
+
+

Properties

+
+ +

Private _adsParams

+
_adsParams: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+ +

Private _errorAdsParams

+
_errorAdsParams: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _hasUndefinedParameterError

+
_hasUndefinedParameterError: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: boolean
    +
  • +
+
+
+
+ +

Private _hasValidationError

+
_hasValidationError: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: boolean
    +
  • +
+
+
+
+ +

Private _undefinedParameterErrorFields

+
_undefinedParameterErrorFields: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string[]
    +
  • +
+
+
+
+ +

Private _undefinedParameterErrorMessage

+
_undefinedParameterErrorMessage: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+ +

Private _validationErrorMessage

+
_validationErrorMessage: {} = {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+
+

Methods

+
+ +

Private _buildAdsParams

+
    +
  • _buildAdsParams(): void
  • +
+ +
+
+ +

buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Private property
  • +
  • Private method
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_log.log.html b/docs/classes/models_log.log.html new file mode 100644 index 00000000..05003a0e --- /dev/null +++ b/docs/classes/models_log.log.html @@ -0,0 +1,165 @@ + + + + + + Log | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Log

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+
    +
  • new Log(): Log
  • +
+
    +
  • + +

    Returns Log

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_parametrizer.parametrizer.html b/docs/classes/models_parametrizer.parametrizer.html new file mode 100644 index 00000000..2196f7b4 --- /dev/null +++ b/docs/classes/models_parametrizer.parametrizer.html @@ -0,0 +1,337 @@ + + + + + + Parametrizer | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Parametrizer

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ +
    +
  • + +
    +
    +

    Recebe os parametros e configurações do csv preenchido e preenche os atributos

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Json contendo as colunas preenchidas no csv e seus valores

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +
      +
    • +
    +

    Returns Parametrizer

    +
  • +
+
+
+
+

Properties

+
+ +

Private _config

+
_config: Config
+ +
+
+ +

Private _csvLine

+
_csvLine: {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+
+

Methods

+
+ +

Abstract buildedLine

+
    +
  • buildedLine(): {}
  • +
+
    +
  • + +
    +
    +

    Método que constrói e retorna os parametros de parametrização

    +
    +
    +

    Returns {}

    +
      +
    • +
      [key: string]: string
      +
    • +
    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_parametrizerfactory.parametrizerfactory.html b/docs/classes/models_parametrizerfactory.parametrizerfactory.html new file mode 100644 index 00000000..75656148 --- /dev/null +++ b/docs/classes/models_parametrizerfactory.parametrizerfactory.html @@ -0,0 +1,268 @@ + + + + + + ParametrizerFactory | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class ParametrizerFactory

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + ParametrizerFactory +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Properties

+
+ +

Private _config

+
_config: Config
+ +
+
+ +

Private _csvLines

+
_csvLines: {}
+ +
+

Type declaration

+
    +
  • +
    [key: string]: string
    +
  • +
+
+
+
+
+

Methods

+
+ +

build

+ + +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_routespermission.routespermission.html b/docs/classes/models_routespermission.routespermission.html new file mode 100644 index 00000000..86a49038 --- /dev/null +++ b/docs/classes/models_routespermission.routespermission.html @@ -0,0 +1,247 @@ + + + + + + RoutesPermission | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class RoutesPermission

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + RoutesPermission +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Properties

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Properties

+
+ +

Private _method

+
_method: string
+ +
+
+ +

Private _route

+
_route: string
+ +
+
+
+

Methods

+
+ +

validatePermission

+
    +
  • validatePermission(auth: Auth): boolean
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
  • Method
  • +
+
    +
  • Function
  • +
+
    +
  • Private property
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/models_vehicle.vehicle.html b/docs/classes/models_vehicle.vehicle.html new file mode 100644 index 00000000..b2b5966f --- /dev/null +++ b/docs/classes/models_vehicle.vehicle.html @@ -0,0 +1,302 @@ + + + + + + Vehicle | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class Vehicle

+
+
+
+
+
+
+
+

Hierarchy

+ +
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Accessors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ +
    +
  • + +
    +
    +

    Recebe os parametros e configurações do csv preenchido e preenche os atributos

    +
    +
    +

    Parameters

    +
      +
    • +
      csvLine: {}
      +
      +

      Json contendo as colunas preenchidas no csv e seus valores

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    • +
      config: Config
      +
      +
      +
    • +
    +

    Returns Vehicle

    +
  • +
+
+
+
+

Accessors

+
+ +

config

+ + +
+
+ +

csvLine

+
    +
  • get csvLine(): {}
  • +
+ +
+
+
+

Methods

+
+ +

Abstract buildedLine

+
    +
  • buildedLine(): {}
  • +
+ +
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Inherited constructor
  • +
  • Inherited method
  • +
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/utils_csvutils.csvutils.html b/docs/classes/utils_csvutils.csvutils.html new file mode 100644 index 00000000..d2348d53 --- /dev/null +++ b/docs/classes/utils_csvutils.csvutils.html @@ -0,0 +1,291 @@ + + + + + + CsvUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class CsvUtils

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + CsvUtils +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Methods

+
+ +

Static csv2json

+
    +
  • csv2json(csvContent: string, separator: string): {}[]
  • +
+
    +
  • + +
    +
    +

    Transformação CSV > JSON

    +
    +
    +

    Parameters

    +
      +
    • +
      csvContent: string
      +
      +

      Conteúdo do CSV

      +
      +
    • +
    • +
      separator: string
      +
      +

      Caracter utilizado na separação de colunas do CSV

      +
      +
    • +
    +

    Returns {}[]

    +

    Objeto JSON correspondente ao CSV

    +

    Função que converte uma string de um conteúdo CSV em um objeto JSON

    +
  • +
+
+
+ +

Static Private isCsvEmpty

+
    +
  • isCsvEmpty(linesOfCsv: string[]): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se o CSV é vazio

    +
    +
    +

    Parameters

    +
      +
    • +
      linesOfCsv: string[]
      +
      +

      Array com as linhas do csv

      +
      +
    • +
    +

    Returns boolean

    +

    Booleano indicando se o conteúdo do csv é vazio ou não

    +

    Retorna true caso todas as linhas sejam vazias ou contenham somente espaços em branco

    +
  • +
+
+
+ +

Static isLineEmpty

+
    +
  • isLineEmpty(lineOfCsv: {}): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se a linha do CSV é vazia

    +
    +
    +

    Parameters

    +
      +
    • +
      lineOfCsv: {}
      +
      +

      linha do csv no padrão {coluna: valor}

      +
      +
        +
      • +
        [key: string]: string
        +
      • +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
+
    +
  • Function
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/utils_dateutils.dateutils.html b/docs/classes/utils_dateutils.dateutils.html new file mode 100644 index 00000000..a735a444 --- /dev/null +++ b/docs/classes/utils_dateutils.dateutils.html @@ -0,0 +1,265 @@ + + + + + + DateUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class DateUtils

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + DateUtils +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Methods

+
+ +

Static generateDateString

+
    +
  • generateDateString(seconds?: boolean): string
  • +
+
    +
  • + +
    +
    +

    Gera uma string correspondente ao timestamp atual

    +
    +
    +

    Parameters

    +
      +
    • +
      seconds: boolean = false
      +
      +

      Boolean informando se o retorno contará com a informação de segundos. Esse parametro é false por padrão

      +
      +
    • +
    +

    Returns string

    +

    String correspondente ao timestamp atual

    +

    Gera uma stirng correspondente ao timestamp atual no padrão: yyyymmddhhMMss (segundos estão por padrão desabilitados)

    +
  • +
+
+
+ +

Static newDateStringFormat

+
    +
  • newDateStringFormat(stringDate: string, oldFormat: string, newFormat: string): string
  • +
+
    +
  • + +
    +
    +

    Altera o formato da string correspondente a data

    +
    +
    +

    Parameters

    +
      +
    • +
      stringDate: string
      +
      +

      String correspondente a data

      +
      +
    • +
    • +
      oldFormat: string
      +
      +

      Padrão da data atual

      +
      +
    • +
    • +
      newFormat: string
      +
      +

      Novo padrão da data

      +
      +
    • +
    +

    Returns string

    +

    String correspondente a data com o novo padrão informado

    +

    Padrões de data: + s: segundo + M: minuto + h: hora + d: dia + m: mês + y: ano + O caracter deve ser repetido de acordo com quantos caracteres representam aquela informação + Exemplo: 30/12/2020 Padrão da string: dd/mm/yyyy

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
+
    +
  • Function
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/utils_jsonutils.jsonutils.html b/docs/classes/utils_jsonutils.jsonutils.html new file mode 100644 index 00000000..3b564f19 --- /dev/null +++ b/docs/classes/utils_jsonutils.jsonutils.html @@ -0,0 +1,292 @@ + + + + + + JsonUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class JsonUtils

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + JsonUtils +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Methods

+
+ +

Static Private _keyValueIsAnObject

+
    +
  • _keyValueIsAnObject(keyValue: any): boolean
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      keyValue: any
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

Static addParametersAt

+
    +
  • addParametersAt(json: {}, ...objectsToMerge: {}[]): {}
  • +
+
    +
  • + +
    +
    +

    Adiciona novos parâmetros a um Json

    +
    +
    +

    Parameters

    +
      +
    • +
      json: {}
      +
      +

      Json a ser adicionado os novos parametros

      +
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    • +
      Rest ...objectsToMerge: {}[]
      +
    • +
    +

    Returns {}

    +

    Merge dos jsons recebidos

    +

    Recebe um objeto JSON e vários objetos para fazer uma união de todos objetos json

    +
      +
    • +
      [key: string]: any
      +
    • +
    +
  • +
+
+
+ +

Static normalizeKeys

+
    +
  • normalizeKeys(json: {}): {}
  • +
+
    +
  • + +
    +
    +

    Normaliza as chaves de um JSON

    +
    +
    +

    Parameters

    +
      +
    • +
      json: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns {}

    +

    Objeto JSON com as chaves normalizadas

    +

    Retira os caracteres maiúsculos e especiais das chaves de um objeto JSON

    +
      +
    • +
      [key: string]: any
      +
    • +
    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
+
    +
  • Function
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/classes/utils_stringutils.stringutils.html b/docs/classes/utils_stringutils.stringutils.html new file mode 100644 index 00000000..25fe9688 --- /dev/null +++ b/docs/classes/utils_stringutils.stringutils.html @@ -0,0 +1,375 @@ + + + + + + StringUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Class StringUtils

+
+
+
+
+
+
+
+

Hierarchy

+
    +
  • + StringUtils +
  • +
+
+
+

Index

+
+
+
+

Constructors

+ +
+
+

Methods

+ +
+
+
+
+
+

Constructors

+
+ +

constructor

+ + +
+
+
+

Methods

+
+ +

Static Private _isStringForRegex

+
    +
  • _isStringForRegex(string: string): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se há string corresponde a um padrão de regex

    +
    +
    +

    Parameters

    +
      +
    • +
      string: string
      +
      +

      String a ser validade

      +
      +
    • +
    +

    Returns boolean

    +

    Boolean indicando se a string corresponde a um padrão de regex ou não

    +

    Verifica o começo e o final da string, se começar e terminar com barra, + significa que a string refere-se a um padrão de regex

    +
  • +
+
+
+ +

Static isEmpty

+
    +
  • isEmpty(string: string): boolean
  • +
+
    +
  • + +
    +
    +

    Verifica se a string está vazia

    +
    +
    +

    Parameters

    +
      +
    • +
      string: string
      +
      +

      a ser checada

      +
      +
    • +
    +

    Returns boolean

    +
  • +
+
+
+ +

Static normalize

+
    +
  • normalize(string: string): string
  • +
+
    +
  • + +
    +
    +

    Normalização da String

    +
    +
    +

    Parameters

    +
      +
    • +
      string: string
      +
      +

      String a ser normalizada

      +
      +
    • +
    +

    Returns string

    +

    String sanitizada e em letras minusculas

    +

    Passa a string recebia para letras minusculas e retira as acentuações

    +
  • +
+
+
+ +

Static replaceWhiteSpace

+
    +
  • replaceWhiteSpace(string: string, replacer: string): string
  • +
+
    +
  • + +
    +
    +

    Substitui espaços em branco por um caracter

    +
    +
    +

    Parameters

    +
      +
    • +
      string: string
      +
      +

      String para substituir os espaços em branco

      +
      +
    • +
    • +
      replacer: string
      +
      +

      Caracter que substituirá os espaços em branco da string

      +
      +
    • +
    +

    Returns string

    +

    String com os espaços em branco substituidos pelo caracter informado

    +

    Substitui os espaços em branco da string pelo caracter informado

    +
  • +
+
+
+ +

Static validateString

+
    +
  • validateString(stringToValidate: string, rules: string[], separator?: string): boolean
  • +
+
    +
  • + +
    +
    +

    Valida se a String está dentro de um padrão

    +
    +
    +

    Parameters

    +
      +
    • +
      stringToValidate: string
      +
      +

      String a ser validada

      +
      +
    • +
    • +
      rules: string[]
      +
      +

      Array contendo as string que de comparação ou as regex

      +
      +
    • +
    • +
      separator: string = ' '
      +
      +

      Caracter a ser substituido pelos espaços em brancos. + Por padrão é o próprio espaço em branco para que a string não seja alterada

      +
      +
    • +
    +

    Returns boolean

    +

    Informa se a string coincide ou não com as regras informadas

    +

    Dado um array com strings ou padrões de regex, verifica se a string passada é exatamente igual a alguma string contida no array, + ou se corresponde a alguma regex presente no array

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Class
  • +
  • Constructor
  • +
+
    +
  • Function
  • +
+
    +
  • Static method
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..dab6f3a7 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,336 @@ + + + + + + penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+

penguin-adinfo

+
+
+
+
+
+
+
+ +

Penguin Adinfo

+
+
+ +
+

O Penguin Adinfo é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital.

+

A solução proposta é uma API open source que através de rotas de requisição trabalha inputs de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma validação dos campos preenchidos e de status de requisição dos links.

+

Os principais componentes no uso da aplicação são a configuração, um JSON contendo quais campos são aceitos na taxonomia de mídia, o permissionamento para controle de ações permitidas por nível de acesso, e o arquivo de parametrização, um CSV contendo a lista de URLs e os campos preenchidos conforme o que foi configurado.

+ +

Principais propostas de valor

+
+
    +
  • Independência de qualquer programa para a abertura das planilhas durante o processo de parametrização, o que comumente compromete a performance pelo uso extensivo de fórmulas.
  • +
  • Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de acessos, edição de configurações, realização da parametrização.
  • +
  • Os acessos podem ser divididos em grupos ou projetos, para que por exemplo diferentes agências possam todas ter seu nível de configuração, mas apenas para suas próprias campanhas.
  • +
  • Escalabilidade de uso por suportar grandes tamanhos de arquivo e histórico.
  • +
+ +

NPM Run

+
+
    +
  • start: executa a aplicação;
  • +
  • unit-test: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/;
  • +
  • test: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/;
  • +
  • lint: Submete o código a uma avaliação do ESLint;
  • +
  • lint-fix: Submete o código a uma avaliação do ESLint e aplica correções automaticamente ao código;
  • +
  • compile: Exclui os arquivos da pasta /src/js e compila o código do typescript para javascript, guardando-o na pasta src/js;
  • +
  • auto-compile: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta src/js, sem excluir o conteúdo anterior;
  • +
  • prettier: Formata todo o código das pastas src/ e test/, utilizando o Prettier, de acordo com a configuração descrita no arquivo .prettierrc;
  • +
  • build: Executa o compile do código typescript para javascript.
  • +
+ +

Requisitos para utilização

+
+
    +
  • Ambiente de hospedagem de aplicações, em nuvem ou on-premise;
  • +
  • Banco de dados para armazenamento de arquivos no formato csv;
  • +
  • Banco de dados NoSQL para armazenamento de objetos JSON.
  • +
+ +

Produtos do GCP (sugestão)

+
+

O adinfo pode ser implementado em diferentes provedores de nuvem ou em ambientes on-premise. Listaremos aqui sugestões de serviços do GCP que podem ser utilizados para complementar a infraestrutura da API.

+
    +
  • App Engine
  • +
  • Cloud Storage
  • +
  • Firestore
  • +
+ +

Instalação

+
+

Clone o projeto do github para sua máquina local ou Cloud Shell

+
git clone https://github.com/DP6/penguin-adinfo.git
+
+ +

Instalação GCP (sugerida)

+
+

Durante toda a etapa de desenvolvimento do adinfo ele é hospedado no serviço de App Engine do GCP, além de armazenar informações no Firestore e Storage.

+ +

Configuração do Firestore e Storage

+
+

Por padrão, ao utilizar o adinfo dentro do App Engine, basta conceder acesso à conta de serviço para o Storage e Firestore para que todos os recursos funcionem corretamente. Caso o adinfo esteja hospedado fora do GCP ou em outro projeto, é necessário informar a chave de autenticação na inicialização das classes, dentro nos arquivos FirestoreConnectionSingleton e StorageConnectionSingleton.

+ +
Configuração inicial do Storage
+
+

Crie um bucket para armazenar os arquivos do adinfo. O bucket em questão deve ser informado no atributo _bucket da classe StorageConnectionSingleton, por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência.

+ +
Configuração inicial do Firestore
+
+

Para a configuração inicial do Firestore, são necessárias duas coleções.

+
    +
  • companies: essa coleção deve ser criada na raiz do firestore e deve conter um documento com o nome da empresa. Dentro desse documento, uma segunda coleção deve ser criada com o nome config. Seguindo a estrutura: companies > [nome_empresa] > config;

    +
  • +
  • tokens: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura:

    +
    {
    +    company: "arthurltda" (string)
    +    permission: "owner"(string)
    +}
    +
    +

    Para esse documento, é importante manter o Código do Documento gerado automaticamente pelo google. O código gerado para cada documento será o token de acesso utilizado na API.

    +
  • +
+ +

Banco de dados alternativos

+
+

Atualmente o adinfo não disponibiliza por padrão um código de acesso à banco de dados diferentes do Storage e Firestore. Para conexões com outros ambientes a criação dos scripts se faz necessária.

+ +

Criação dos novos scripts

+
+

Caso o usuário opte por utilizar um banco de arquivos diferentes do Storage, é necessário que o script da nova classe herde de FileStore.

+

No caso de substituir o uso do Firestore para armazenamento de chaves. A nova classe deve herdar de ObjectStore.

+ +

Configuração do ambiente de desenvolvimento

+
+
    +
  1. Arquivo .env: O arquivo .env deve estar localizado na raiz do projeto. É necessário editar as seguintes variáveis
  2. +
+
    +
  • DEVELOPMENT: Deve apresentar o valor true, caso o ambiente atual seja o ambiente de desenvolvimento local. Caso nenhum valor seja informado, a API irá assumir como padrão o valor false, indicando o ambiente de produção;

    +
  • +
  • PORT: Deve conter o número da porta onde a API será acessada. Em caso de omissão desse parâmetro, a porta considerada será 443.

    +
  • +
+
    +
  1. Chave de acesso - GCP: A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json.

    +
  2. +
  3. Arquivo .gitignore: Checar se o arquivo .gitignore está ignorando o versionamento da chave e do arquivo .env.

    +
  4. +
+ +

Como contribuir

+
+

Pull requests são bem-vindos! Nós vamos adorar ajuda para evoluir esse modulo. Sinta-se livre para navegar por issues abertas buscando por algo que possa fazer. Caso tenha uma nova feature ou bug, por favor abra uma nova issue para ser acompanhada pelo nosso time.

+ +

Requisitos obrigatórios

+
+

Só serão aceitas contribuições que estiverem seguindo os seguintes requisitos:

+ + +

Api Docs

+
+ + +

Suporte:

+
+

DP6 Koopa-troopa Team

+

e-mail: koopas@dp6.com.br

+ +
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html new file mode 100644 index 00000000..22604947 --- /dev/null +++ b/docs/modules.html @@ -0,0 +1,247 @@ + + + + + + penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+

penguin-adinfo

+
+
+
+
+
+ + +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/app.html b/docs/modules/app.html new file mode 100644 index 00000000..1b43622d --- /dev/null +++ b/docs/modules/app.html @@ -0,0 +1,106 @@ + + + + + + app | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module app

+
+
+
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/controllers_builder.html b/docs/modules/controllers_builder.html new file mode 100644 index 00000000..3a6c0dca --- /dev/null +++ b/docs/modules/controllers_builder.html @@ -0,0 +1,122 @@ + + + + + + controllers/Builder | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module controllers/Builder

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_adobe.html b/docs/modules/models_adobe.html new file mode 100644 index 00000000..eb926aa5 --- /dev/null +++ b/docs/modules/models_adobe.html @@ -0,0 +1,122 @@ + + + + + + models/Adobe | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/Adobe

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_analyticstool.html b/docs/modules/models_analyticstool.html new file mode 100644 index 00000000..65bb599d --- /dev/null +++ b/docs/modules/models_analyticstool.html @@ -0,0 +1,122 @@ + + + + + + models/AnalyticsTool | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/AnalyticsTool

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_auth.html b/docs/modules/models_auth.html new file mode 100644 index 00000000..7eeb62e1 --- /dev/null +++ b/docs/modules/models_auth.html @@ -0,0 +1,122 @@ + + + + + + models/Auth | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/Auth

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_cloud_firestoreconnectionsingleton.html b/docs/modules/models_cloud_firestoreconnectionsingleton.html new file mode 100644 index 00000000..dd5d58d2 --- /dev/null +++ b/docs/modules/models_cloud_firestoreconnectionsingleton.html @@ -0,0 +1,122 @@ + + + + + + models/cloud/FirestoreConnectionSingleton | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/cloud/FirestoreConnectionSingleton

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_cloud_loggingsingleton.html b/docs/modules/models_cloud_loggingsingleton.html new file mode 100644 index 00000000..a2725b74 --- /dev/null +++ b/docs/modules/models_cloud_loggingsingleton.html @@ -0,0 +1,122 @@ + + + + + + models/cloud/LoggingSingleton | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/cloud/LoggingSingleton

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_cloud_storageconnectionsingleton.html b/docs/modules/models_cloud_storageconnectionsingleton.html new file mode 100644 index 00000000..2405ac76 --- /dev/null +++ b/docs/modules/models_cloud_storageconnectionsingleton.html @@ -0,0 +1,122 @@ + + + + + + models/cloud/StorageConnectionSingleton | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/cloud/StorageConnectionSingleton

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_config.html b/docs/modules/models_config.html new file mode 100644 index 00000000..19ec2015 --- /dev/null +++ b/docs/modules/models_config.html @@ -0,0 +1,122 @@ + + + + + + models/Config | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/Config

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_dao_authdao.html b/docs/modules/models_dao_authdao.html new file mode 100644 index 00000000..6f3107d3 --- /dev/null +++ b/docs/modules/models_dao_authdao.html @@ -0,0 +1,122 @@ + + + + + + models/DAO/AuthDAO | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/DAO/AuthDAO

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_dao_configdao.html b/docs/modules/models_dao_configdao.html new file mode 100644 index 00000000..21a44b82 --- /dev/null +++ b/docs/modules/models_dao_configdao.html @@ -0,0 +1,122 @@ + + + + + + models/DAO/ConfigDAO | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/DAO/ConfigDAO

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_dao_filedao.html b/docs/modules/models_dao_filedao.html new file mode 100644 index 00000000..d5df39e4 --- /dev/null +++ b/docs/modules/models_dao_filedao.html @@ -0,0 +1,122 @@ + + + + + + models/DAO/FileDAO | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/DAO/FileDAO

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_dao_filestore.html b/docs/modules/models_dao_filestore.html new file mode 100644 index 00000000..4f5c0d18 --- /dev/null +++ b/docs/modules/models_dao_filestore.html @@ -0,0 +1,122 @@ + + + + + + models/DAO/FileStore | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/DAO/FileStore

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_dao_objectstore.html b/docs/modules/models_dao_objectstore.html new file mode 100644 index 00000000..2e7f0812 --- /dev/null +++ b/docs/modules/models_dao_objectstore.html @@ -0,0 +1,122 @@ + + + + + + models/DAO/ObjectStore | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/DAO/ObjectStore

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_dependencyconfig.html b/docs/modules/models_dependencyconfig.html new file mode 100644 index 00000000..75bd0c38 --- /dev/null +++ b/docs/modules/models_dependencyconfig.html @@ -0,0 +1,122 @@ + + + + + + models/DependencyConfig | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/DependencyConfig

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_facebookads.html b/docs/modules/models_facebookads.html new file mode 100644 index 00000000..4e2f86da --- /dev/null +++ b/docs/modules/models_facebookads.html @@ -0,0 +1,122 @@ + + + + + + models/FacebookAds | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/FacebookAds

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_ga.html b/docs/modules/models_ga.html new file mode 100644 index 00000000..16eb00f0 --- /dev/null +++ b/docs/modules/models_ga.html @@ -0,0 +1,122 @@ + + + + + + models/GA | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/GA

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_generalvehicle.html b/docs/modules/models_generalvehicle.html new file mode 100644 index 00000000..9a47d73f --- /dev/null +++ b/docs/modules/models_generalvehicle.html @@ -0,0 +1,122 @@ + + + + + + models/GeneralVehicle | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/GeneralVehicle

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_googleads.html b/docs/modules/models_googleads.html new file mode 100644 index 00000000..5bc8b504 --- /dev/null +++ b/docs/modules/models_googleads.html @@ -0,0 +1,122 @@ + + + + + + models/GoogleAds | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/GoogleAds

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_log.html b/docs/modules/models_log.html new file mode 100644 index 00000000..3e09cbc4 --- /dev/null +++ b/docs/modules/models_log.html @@ -0,0 +1,122 @@ + + + + + + models/Log | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/Log

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_parametrizer.html b/docs/modules/models_parametrizer.html new file mode 100644 index 00000000..6861c7dd --- /dev/null +++ b/docs/modules/models_parametrizer.html @@ -0,0 +1,122 @@ + + + + + + models/Parametrizer | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/Parametrizer

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_parametrizerfactory.html b/docs/modules/models_parametrizerfactory.html new file mode 100644 index 00000000..f87d1a76 --- /dev/null +++ b/docs/modules/models_parametrizerfactory.html @@ -0,0 +1,122 @@ + + + + + + models/ParametrizerFactory | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/ParametrizerFactory

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_routespermission.html b/docs/modules/models_routespermission.html new file mode 100644 index 00000000..4ebb67fd --- /dev/null +++ b/docs/modules/models_routespermission.html @@ -0,0 +1,122 @@ + + + + + + models/RoutesPermission | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/RoutesPermission

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/models_vehicle.html b/docs/modules/models_vehicle.html new file mode 100644 index 00000000..25301bfc --- /dev/null +++ b/docs/modules/models_vehicle.html @@ -0,0 +1,122 @@ + + + + + + models/Vehicle | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module models/Vehicle

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_build.html b/docs/modules/routes_build.html new file mode 100644 index 00000000..4be18f8d --- /dev/null +++ b/docs/modules/routes_build.html @@ -0,0 +1,153 @@ + + + + + + routes/build | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/build

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_config.html b/docs/modules/routes_config.html new file mode 100644 index 00000000..3004239b --- /dev/null +++ b/docs/modules/routes_config.html @@ -0,0 +1,153 @@ + + + + + + routes/config | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/config

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_csv.html b/docs/modules/routes_csv.html new file mode 100644 index 00000000..d7bd09ca --- /dev/null +++ b/docs/modules/routes_csv.html @@ -0,0 +1,153 @@ + + + + + + routes/csv | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/csv

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_register.html b/docs/modules/routes_register.html new file mode 100644 index 00000000..88c1d499 --- /dev/null +++ b/docs/modules/routes_register.html @@ -0,0 +1,153 @@ + + + + + + routes/register | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/register

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_routes.html b/docs/modules/routes_routes.html new file mode 100644 index 00000000..04a77684 --- /dev/null +++ b/docs/modules/routes_routes.html @@ -0,0 +1,153 @@ + + + + + + routes/routes | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/routes

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_template.html b/docs/modules/routes_template.html new file mode 100644 index 00000000..5aa8d33a --- /dev/null +++ b/docs/modules/routes_template.html @@ -0,0 +1,153 @@ + + + + + + routes/template | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/template

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/routes_user.html b/docs/modules/routes_user.html new file mode 100644 index 00000000..885fa80f --- /dev/null +++ b/docs/modules/routes_user.html @@ -0,0 +1,153 @@ + + + + + + routes/user | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module routes/user

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Const default

+
    +
  • default(app: {}): void
  • +
+
    +
  • + +

    Parameters

    +
      +
    • +
      app: {}
      +
        +
      • +
        [key: string]: any
        +
      • +
      +
    • +
    +

    Returns void

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/utils_csvutils.html b/docs/modules/utils_csvutils.html new file mode 100644 index 00000000..f57bfa53 --- /dev/null +++ b/docs/modules/utils_csvutils.html @@ -0,0 +1,122 @@ + + + + + + utils/CsvUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module utils/CsvUtils

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/utils_dateutils.html b/docs/modules/utils_dateutils.html new file mode 100644 index 00000000..847ea3bc --- /dev/null +++ b/docs/modules/utils_dateutils.html @@ -0,0 +1,122 @@ + + + + + + utils/DateUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module utils/DateUtils

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/utils_jsonutils.html b/docs/modules/utils_jsonutils.html new file mode 100644 index 00000000..9d162501 --- /dev/null +++ b/docs/modules/utils_jsonutils.html @@ -0,0 +1,122 @@ + + + + + + utils/JsonUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module utils/JsonUtils

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file diff --git a/docs/modules/utils_stringutils.html b/docs/modules/utils_stringutils.html new file mode 100644 index 00000000..fe88d31d --- /dev/null +++ b/docs/modules/utils_stringutils.html @@ -0,0 +1,122 @@ + + + + + + utils/StringUtils | penguin-adinfo + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module utils/StringUtils

+
+
+
+
+
+
+
+

Index

+
+
+
+

Classes

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
    +
  • Class
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + \ No newline at end of file From 2b06c63f31c2329e35eeab0fd3392380447b70f3 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Wed, 28 Apr 2021 12:32:44 -0300 Subject: [PATCH 17/68] refactor: :art: Criacao da pasta dist Passagem da compilacao do typescript da pasta src/js para dist/ --- .prettierignore | 4 +- .prettierrc | 4 +- CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 2 +- README.md | 14 +- _config.yml | 2 +- app.js | 71 ++-- cloudbuild.yaml | 22 +- {src/js => dist}/app.js | 33 +- {src/js => dist}/controllers/Builder.js | 38 +- {src/js => dist}/models/Adobe.js | 26 +- {src/js => dist}/models/AnalyticsTool.js | 0 {src/js => dist}/models/Auth.js | 5 +- {src/js => dist}/models/Config.js | 70 +--- {src/js => dist}/models/DAO/AuthDAO.js | 10 +- {src/js => dist}/models/DAO/ConfigDAO.js | 16 +- {src/js => dist}/models/DAO/FileDAO.js | 0 {src/js => dist}/models/DAO/FileStore.js | 0 {src/js => dist}/models/DAO/ObjectStore.js | 0 {src/js => dist}/models/DependencyConfig.js | 8 +- {src/js => dist}/models/FacebookAds.js | 51 +-- {src/js => dist}/models/GA.js | 38 +- {src/js => dist}/models/GeneralVehicle.js | 26 +- {src/js => dist}/models/GoogleAds.js | 37 +- {src/js => dist}/models/Log.js | 0 {src/js => dist}/models/Parametrizer.js | 0 .../js => dist}/models/ParametrizerFactory.js | 11 +- {src/js => dist}/models/RoutesPermission.js | 20 +- {src/js => dist}/models/Vehicle.js | 0 .../cloud/FirestoreConnectionSingleton.js | 5 +- .../models/cloud/LoggingSingleton.js | 15 +- .../cloud/StorageConnectionSingleton.js | 5 +- {src/js => dist}/routes/build.js | 16 +- {src/js => dist}/routes/config.js | 0 {src/js => dist}/routes/csv.js | 8 +- {src/js => dist}/routes/register.js | 4 +- {src/js => dist}/routes/routes.js | 0 {src/js => dist}/routes/template.js | 5 +- {src/js => dist}/routes/user.js | 0 {src/js => dist}/utils/CsvUtils.js | 10 +- {src/js => dist}/utils/DateUtils.js | 4 +- {src/js => dist}/utils/JsonUtils.js | 13 +- {src/js => dist}/utils/StringUtils.js | 6 +- index.js | 10 +- openapi-appengine.yaml | 328 +++++++++--------- package.json | 6 +- src/ts/app.ts | 76 ++-- src/ts/controllers/Builder.ts | 51 +-- src/ts/models/Adobe.ts | 23 +- src/ts/models/Config.ts | 85 ++--- src/ts/models/DAO/AuthDAO.ts | 14 +- src/ts/models/DAO/ConfigDAO.ts | 18 +- src/ts/models/DAO/ObjectStore.ts | 10 +- src/ts/models/DependencyConfig.ts | 8 +- src/ts/models/FacebookAds.ts | 84 ++--- src/ts/models/GA.ts | 30 +- src/ts/models/GeneralVehicle.ts | 28 +- src/ts/models/GoogleAds.ts | 39 +-- src/ts/models/RoutesPermission.ts | 20 +- .../cloud/FirestoreConnectionSingleton.ts | 11 +- src/ts/models/cloud/LoggingSingleton.ts | 15 +- src/ts/routes/build.ts | 134 ++++--- src/ts/routes/config.ts | 72 ++-- src/ts/routes/csv.ts | 109 +++--- src/ts/routes/register.ts | 55 ++- src/ts/routes/template.ts | 42 +-- src/ts/routes/user.ts | 31 +- src/ts/utils/CsvUtils.ts | 15 +- src/ts/utils/DateUtils.ts | 10 +- src/ts/utils/JsonUtils.ts | 10 +- src/ts/utils/StringUtils.ts | 12 +- tsconfig.json | 2 +- 72 files changed, 672 insertions(+), 1277 deletions(-) rename {src/js => dist}/app.js (78%) rename {src/js => dist}/controllers/Builder.js (55%) rename {src/js => dist}/models/Adobe.js (80%) rename {src/js => dist}/models/AnalyticsTool.js (100%) rename {src/js => dist}/models/Auth.js (86%) rename {src/js => dist}/models/Config.js (74%) rename {src/js => dist}/models/DAO/AuthDAO.js (82%) rename {src/js => dist}/models/DAO/ConfigDAO.js (82%) rename {src/js => dist}/models/DAO/FileDAO.js (100%) rename {src/js => dist}/models/DAO/FileStore.js (100%) rename {src/js => dist}/models/DAO/ObjectStore.js (100%) rename {src/js => dist}/models/DependencyConfig.js (88%) rename {src/js => dist}/models/FacebookAds.js (66%) rename {src/js => dist}/models/GA.js (76%) rename {src/js => dist}/models/GeneralVehicle.js (77%) rename {src/js => dist}/models/GoogleAds.js (70%) rename {src/js => dist}/models/Log.js (100%) rename {src/js => dist}/models/Parametrizer.js (100%) rename {src/js => dist}/models/ParametrizerFactory.js (80%) rename {src/js => dist}/models/RoutesPermission.js (64%) rename {src/js => dist}/models/Vehicle.js (100%) rename {src/js => dist}/models/cloud/FirestoreConnectionSingleton.js (95%) rename {src/js => dist}/models/cloud/LoggingSingleton.js (77%) rename {src/js => dist}/models/cloud/StorageConnectionSingleton.js (93%) rename {src/js => dist}/routes/build.js (85%) rename {src/js => dist}/routes/config.js (100%) rename {src/js => dist}/routes/csv.js (88%) rename {src/js => dist}/routes/register.js (89%) rename {src/js => dist}/routes/routes.js (100%) rename {src/js => dist}/routes/template.js (87%) rename {src/js => dist}/routes/user.js (100%) rename {src/js => dist}/utils/CsvUtils.js (80%) rename {src/js => dist}/utils/DateUtils.js (91%) rename {src/js => dist}/utils/JsonUtils.js (73%) rename {src/js => dist}/utils/StringUtils.js (88%) diff --git a/.prettierignore b/.prettierignore index 79e6ea4b..65ac9d8b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,4 @@ node_modules -test \ No newline at end of file +test +.github +docs \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 109e991a..77a0d3a0 100644 --- a/.prettierrc +++ b/.prettierrc @@ -7,8 +7,8 @@ "printWidth": 120, "overrides": [ { - "files": ".prettierr", - "options": { "parser": "json" } + "files": ".prettierr", + "options": { "parser": "json" } } ] } diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f9827c79..51db4fdd 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -73,4 +73,4 @@ available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.ht [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq \ No newline at end of file +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03d64db5..27a76283 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -123,4 +123,4 @@ When contributing the code you confirm that: This Code of Conduct is adapted from the [Ajv][homepage], available at https://ajv.js.org/code_of_conduct/ -[homepage]: https://ajv.js.org/ \ No newline at end of file +[homepage]: https://ajv.js.org/ diff --git a/README.md b/README.md index a83e7478..1edff2d4 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,16 @@ -O Penguin Adinfo é um recurso que tem como objetivo o **controle** e **padronização** do uso de parametrização e nomenclatura de mídia digital. +O Penguin Adinfo é um recurso que tem como objetivo o **controle** e **padronização** do uso de parametrização e nomenclatura de mídia digital. -A solução proposta é uma **API** open source que através de rotas de requisição trabalha *inputs* de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma **validação** dos campos preenchidos e de status de requisição dos links. +A solução proposta é uma **API** open source que através de rotas de requisição trabalha _inputs_ de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma **validação** dos campos preenchidos e de status de requisição dos links. Os principais componentes no uso da aplicação são a **configuração**, um JSON contendo quais campos são aceitos na taxonomia de mídia, o **permissionamento** para controle de ações permitidas por nível de acesso, e o **arquivo de parametrização**, um CSV contendo a lista de URLs e os campos preenchidos conforme o que foi configurado. ## Principais propostas de valor - Independência de qualquer programa para a abertura das planilhas durante o processo de parametrização, o que comumente compromete a performance pelo uso extensivo de fórmulas. -- Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de **acessos**, edição de **configurações**, realização da **parametrização**. +- Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de **acessos**, edição de **configurações**, realização da **parametrização**. - Os acessos podem ser divididos em grupos ou projetos, para que por exemplo diferentes agências possam todas ter seu nível de configuração, mas apenas para suas próprias campanhas. - Escalabilidade de uso por suportar grandes tamanhos de arquivo e histórico. @@ -61,15 +61,15 @@ Por padrão, ao utilizar o adinfo dentro do App Engine, basta conceder acesso à ##### Configuração inicial do Storage -Crie um bucket para armazenar os arquivos do adinfo. O bucket em questão deve ser informado no atributo _bucket da classe **StorageConnectionSingleton**, por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência. +Crie um bucket para armazenar os arquivos do adinfo. O bucket em questão deve ser informado no atributo \_bucket da classe **StorageConnectionSingleton**, por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência. ##### Configuração inicial do Firestore Para a configuração inicial do Firestore, são necessárias duas coleções. -- **companies**: essa coleção deve ser criada na raiz do firestore e deve conter um documento com o nome da empresa. Dentro desse documento, uma segunda coleção deve ser criada com o nome *config*. Seguindo a estrutura: companies > [nome_empresa] > config; +- **companies**: essa coleção deve ser criada na raiz do firestore e deve conter um documento com o nome da empresa. Dentro desse documento, uma segunda coleção deve ser criada com o nome _config_. Seguindo a estrutura: companies > [nome_empresa] > config; -- **tokens**: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura: +- **tokens**: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura: ``` { @@ -123,4 +123,4 @@ Só serão aceitas contribuições que estiverem seguindo os seguintes requisito _e-mail: _ - \ No newline at end of file + diff --git a/_config.yml b/_config.yml index 8fa30cb7..54687734 100644 --- a/_config.yml +++ b/_config.yml @@ -6,4 +6,4 @@ remote_theme: dp6/dp6.github.io plugins: - jekyll-sitemap - - jekyll-gzip \ No newline at end of file + - jekyll-gzip diff --git a/app.js b/app.js index e2a72f51..cfa0b492 100644 --- a/app.js +++ b/app.js @@ -1,52 +1,57 @@ require('dotenv').config({ path: __dirname + '/.env' }); -const express = require('express'); -const bodyParser = require('body-parser'); -const cors = require('cors'); -const fileUpload = require('express-fileupload'); +const express = require('express'); +const bodyParser = require('body-parser'); +const cors = require('cors'); +const fileUpload = require('express-fileupload'); const { AuthDAO } = require('./src/js/src/ts/models/DAO/AuthDAO.js'); -const app = express(); +const app = express(); -app.use(fileUpload({ - createParentPath: true -})); +app.use( + fileUpload({ + createParentPath: true, + }) +); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); -app.use(cors({ - 'allowedHeaders': ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config'], - 'exposedHeaders': ['token', 'agency', 'company', 'file', 'data', 'config'], - 'origin': '*', - 'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE', - 'preflightContinue': false -})); +app.use( + cors({ + allowedHeaders: ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config'], + exposedHeaders: ['token', 'agency', 'company', 'file', 'data', 'config'], + origin: '*', + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + preflightContinue: false, + }) +); const routes = require('./src/js/src/ts/routes/routes'); app.all('*', async (req, res, next) => { - let authDAO; - if(req.headers.company && req.headers.token) { - authDAO = new AuthDAO(req.headers.company, req.headers.token); - } else { - authDAO = new AuthDAO(req.body.company, req.body.token); - } - authDAO.getAuth() - .then(auth => { - if(auth.hasPermissionFor(req.url, req.method)) { - next(); - } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); - } - }) - .catch(err => { - res.status(403).send('Usuário Inválido'); - }); + let authDAO; + if (req.headers.company && req.headers.token) { + authDAO = new AuthDAO(req.headers.company, req.headers.token); + } else { + authDAO = new AuthDAO(req.body.company, req.body.token); + } + authDAO + .getAuth() + .then((auth) => { + if (auth.hasPermissionFor(req.url, req.method)) { + next(); + } else { + res.status(403).send('Usuário sem permissão para realizar a ação!'); + } + }) + .catch((err) => { + res.status(403).send('Usuário Inválido'); + }); }); routes.default(app); app.get('/', (req, res) => res.status(200).send('OK')); -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 612b2058..8c0aafbb 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,12 +1,12 @@ steps: - # Install dependencies - - name: node - entrypoint: npm - args: ['install'] - # Run tests - - name: node - entrypoint: npm - args: ['run', 'test'] - - name: 'gcr.io/cloud-builders/gcloud' - args: ['app', 'deploy'] - timeout: '1600s' + # Install dependencies + - name: node + entrypoint: npm + args: ['install'] + # Run tests + - name: node + entrypoint: npm + args: ['run', 'test'] + - name: 'gcr.io/cloud-builders/gcloud' + args: ['app', 'deploy'] + timeout: '1600s' diff --git a/src/js/app.js b/dist/app.js similarity index 78% rename from src/js/app.js rename to dist/app.js index 7cc51eb5..6f7425d2 100644 --- a/src/js/app.js +++ b/dist/app.js @@ -25,13 +25,9 @@ var __awaiter = } } function step(result) { - result.done - ? resolve(result.value) - : adopt(result.value).then(fulfilled, rejected); + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step( - (generator = generator.apply(thisArg, _arguments || [])).next() - ); + step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, '__esModule', { value: true }); @@ -53,25 +49,8 @@ app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use( cors({ - allowedHeaders: [ - 'token', - 'agency', - 'Content-Type', - 'company', - 'file', - 'data', - 'config', - 'permission', - ], - exposedHeaders: [ - 'token', - 'agency', - 'company', - 'file', - 'data', - 'config', - 'permission', - ], + allowedHeaders: ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config', 'permission'], + exposedHeaders: ['token', 'agency', 'company', 'file', 'data', 'config', 'permission'], origin: '*', methods: 'GET,POST', preflightContinue: false, @@ -90,9 +69,7 @@ app.all('*', (req, res, next) => if (auth.hasPermissionFor(req.url, req.method)) { next(); } else { - res.status(403).send( - 'Usuário sem permissão para realizar a ação!' - ); + res.status(403).send('Usuário sem permissão para realizar a ação!'); } }) .catch((err) => { diff --git a/src/js/controllers/Builder.js b/dist/controllers/Builder.js similarity index 55% rename from src/js/controllers/Builder.js rename to dist/controllers/Builder.js index f5442dcb..da85100d 100644 --- a/src/js/controllers/Builder.js +++ b/dist/controllers/Builder.js @@ -12,39 +12,19 @@ class Builder { this._media = media; } build() { - const linesWithContent = this._jsonFromFile.filter( - (line) => !CsvUtils_1.CsvUtils.isLineEmpty(line) - ); + const linesWithContent = this._jsonFromFile.filter((line) => !CsvUtils_1.CsvUtils.isLineEmpty(line)); const linesBuilded = linesWithContent.map((lineFromFile) => { - const parametrizerObject = new ParametrizerFactory_1.ParametrizerFactory( - lineFromFile, - this._companyConfig - ).build(this._media); + const parametrizerObject = new ParametrizerFactory_1.ParametrizerFactory(lineFromFile, this._companyConfig).build( + this._media + ); const parameters = parametrizerObject.buildedLine(); - if ( - Object.getPrototypeOf(parametrizerObject.constructor).name === - 'Vehicle' - ) { - const analyticsToolParameters = new ParametrizerFactory_1.ParametrizerFactory( - lineFromFile, - this._companyConfig - ) - .build( - StringUtils_1.StringUtils.normalize( - this._companyConfig.analyticsToolName - ) - ) + if (Object.getPrototypeOf(parametrizerObject.constructor).name === 'Vehicle') { + const analyticsToolParameters = new ParametrizerFactory_1.ParametrizerFactory(lineFromFile, this._companyConfig) + .build(StringUtils_1.StringUtils.normalize(this._companyConfig.analyticsToolName)) .buildedLine(); - return JsonUtils_1.JsonUtils.addParametersAt( - lineFromFile, - parameters, - analyticsToolParameters - ); + return JsonUtils_1.JsonUtils.addParametersAt(lineFromFile, parameters, analyticsToolParameters); } else { - return JsonUtils_1.JsonUtils.addParametersAt( - lineFromFile, - parameters - ); + return JsonUtils_1.JsonUtils.addParametersAt(lineFromFile, parameters); } }); return linesBuilded; diff --git a/src/js/models/Adobe.js b/dist/models/Adobe.js similarity index 80% rename from src/js/models/Adobe.js rename to dist/models/Adobe.js index 1e1b6d25..0686efaf 100644 --- a/src/js/models/Adobe.js +++ b/dist/models/Adobe.js @@ -20,9 +20,7 @@ class Adobe extends AnalyticsTool_1.AnalyticsTool { _errorMessage() { const errorMessages = []; if (this._hasUndefinedParameterError) { - errorMessages.push( - this._undefinedParameterErroMessage.slice(0, -2) - ); + errorMessages.push(this._undefinedParameterErroMessage.slice(0, -2)); } if (this._hasValidationError) { errorMessages.push(this._validationErrorMessage.slice(0, -2)); @@ -32,33 +30,19 @@ class Adobe extends AnalyticsTool_1.AnalyticsTool { buildedLine() { return { cid: this._hasErrorAtCid() ? this._errorMessage() : this._cid, - 'url adobe': this._hasErrorAtCid() - ? 'Corrija os parâmetros para gerar a URL' - : this.url, + 'url adobe': this._hasErrorAtCid() ? 'Corrija os parâmetros para gerar a URL' : this.url, }; } _buildCid() { let cid = ''; this.config.analyticsTool.adobe.cid.forEach((column) => { - const columnNormalized = StringUtils_1.StringUtils.normalize( - column - ); - if ( - StringUtils_1.StringUtils.isEmpty( - this.csvLine[columnNormalized] - ) - ) { + const columnNormalized = StringUtils_1.StringUtils.normalize(column); + if (StringUtils_1.StringUtils.isEmpty(this.csvLine[columnNormalized])) { this._hasUndefinedParameterError = true; this._undefinedParameterErroMessage += ` ${column} -`; return; } - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[columnNormalized] - ) - ) { + if (!this.config.validateField(this.csvLine, column, this.csvLine[columnNormalized])) { this._hasValidationError = true; this._validationErrorMessage += ` ${column} -`; } diff --git a/src/js/models/AnalyticsTool.js b/dist/models/AnalyticsTool.js similarity index 100% rename from src/js/models/AnalyticsTool.js rename to dist/models/AnalyticsTool.js diff --git a/src/js/models/Auth.js b/dist/models/Auth.js similarity index 86% rename from src/js/models/Auth.js rename to dist/models/Auth.js index ce240975..78e46aed 100644 --- a/src/js/models/Auth.js +++ b/dist/models/Auth.js @@ -9,10 +9,7 @@ class Auth { this._company = company; } hasPermissionFor(route, method) { - return new RoutesPermission_1.RoutesPermission( - route, - method - ).validatePermission(this); + return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); } toJson() { return { diff --git a/src/js/models/Config.js b/dist/models/Config.js similarity index 74% rename from src/js/models/Config.js rename to dist/models/Config.js index c08656a8..6375262f 100644 --- a/src/js/models/Config.js +++ b/dist/models/Config.js @@ -14,9 +14,7 @@ class Config { this._csvSeparator = jsonConfigTemp.csvSeparator; delete jsonConfigTemp.csvSeparator; } - this._dependenciesConfig = this._buildDependenciesConfig( - jsonConfigTemp.dependenciesConfig - ); + this._dependenciesConfig = this._buildDependenciesConfig(jsonConfigTemp.dependenciesConfig); delete jsonConfigTemp.dependenciesConfig; this._spaceSeparator = jsonConfigTemp.spaceSeparator; delete jsonConfigTemp.spaceSeparator; @@ -38,22 +36,13 @@ class Config { this._medias = jsonConfigTemp; } validateConfig() { - return !( - !this._separator || - !this._spaceSeparator || - !this._insertTime || - !this._version || - !this._analyticsTool - ); + return !(!this._separator || !this._spaceSeparator || !this._insertTime || !this._version || !this._analyticsTool); } _buildDependenciesConfig(dependenciesConfig) { if (!dependenciesConfig) { return []; } - return dependenciesConfig.map( - (dependencyConfig) => - new DependencyConfig_1.DependencyConfig(dependencyConfig) - ); + return dependenciesConfig.map((dependencyConfig) => new DependencyConfig_1.DependencyConfig(dependencyConfig)); } toString() { return JSON.stringify(this.toJson()); @@ -62,26 +51,18 @@ class Config { let jsonConfig = {}; Object.keys(this).forEach((key, index) => { if (key === '_analyticsTool' || key === '_medias') { - jsonConfig = JsonUtils_1.JsonUtils.addParametersAt( - jsonConfig, - Object.values(this)[index] - ); + jsonConfig = JsonUtils_1.JsonUtils.addParametersAt(jsonConfig, Object.values(this)[index]); } else if (key === '_validationRules') { jsonConfig = JsonUtils_1.JsonUtils.addParametersAt(jsonConfig, { columns: this._validationRules, }); } else if (key === '_dependenciesConfig') { if (this._dependenciesConfig.length > 0) { - jsonConfig[ - 'dependenciesConfig' - ] = this._dependenciesConfig.map((dependencyConfig) => { + jsonConfig['dependenciesConfig'] = this._dependenciesConfig.map((dependencyConfig) => { return dependencyConfig.toJson(); }); } - } else if ( - key !== '_analyticsToolName' && - Object.values(this)[index] - ) { + } else if (key !== '_analyticsToolName' && Object.values(this)[index]) { jsonConfig[key.replace('_', '')] = Object.values(this)[index]; } }); @@ -102,10 +83,7 @@ class Config { if (!this._existsValidationRuleFor(csvColumn)) { return true; } - return StringUtils_1.StringUtils.validateString( - value, - this._validationRules[csvColumn] - ); + return StringUtils_1.StringUtils.validateString(value, this._validationRules[csvColumn]); } _getAllDependencyConfigFor(csvColumn) { const dependenciesColumnConfig = []; @@ -117,44 +95,28 @@ class Config { return dependenciesColumnConfig; } _validateDependencyRulesFor(csvLine, csvColumn, value) { - const dependenciesConfigForCsvColumn = this._getAllDependencyConfigFor( - csvColumn - ); + const dependenciesConfigForCsvColumn = this._getAllDependencyConfigFor(csvColumn); if (dependenciesConfigForCsvColumn.length === 0) { return true; } - const dependenciesToValidate = dependenciesConfigForCsvColumn.filter( - (dependencyConfig) => - StringUtils_1.StringUtils.validateString( - csvLine[ - StringUtils_1.StringUtils.normalize( - dependencyConfig.columnReference - ) - ], - dependencyConfig.valuesReference - ) + const dependenciesToValidate = dependenciesConfigForCsvColumn.filter((dependencyConfig) => + StringUtils_1.StringUtils.validateString( + csvLine[StringUtils_1.StringUtils.normalize(dependencyConfig.columnReference)], + dependencyConfig.valuesReference + ) ); return ( dependenciesToValidate.filter((dependencyConfig) => { if (dependencyConfig.hasMatch) { - return StringUtils_1.StringUtils.validateString( - value, - dependencyConfig.matches - ); + return StringUtils_1.StringUtils.validateString(value, dependencyConfig.matches); } else { - return !StringUtils_1.StringUtils.validateString( - value, - dependencyConfig.matches - ); + return !StringUtils_1.StringUtils.validateString(value, dependencyConfig.matches); } }).length === dependenciesToValidate.length ); } validateField(csvLine, csvColumn, value) { - return ( - this._validateRulesFor(csvColumn, value) && - this._validateDependencyRulesFor(csvLine, csvColumn, value) - ); + return this._validateRulesFor(csvColumn, value) && this._validateDependencyRulesFor(csvLine, csvColumn, value); } existsColumn(csvColumn) { return !!this.validationRules[csvColumn]; diff --git a/src/js/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js similarity index 82% rename from src/js/models/DAO/AuthDAO.js rename to dist/models/DAO/AuthDAO.js index a32e0bc2..0337a3b8 100644 --- a/src/js/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -8,9 +8,7 @@ class AuthDAO { this._token = token; this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); this._pathToCollection = ['tokens']; - this._authCollection = this._objectStore.getCollection( - this._pathToCollection - ); + this._authCollection = this._objectStore.getCollection(this._pathToCollection); } getAuth() { const pathToAuth = this._pathToCollection.concat(this._token); @@ -19,11 +17,7 @@ class AuthDAO { .get() .then((data) => { const jsonAuth = data.data(); - return new Auth_1.Auth( - jsonAuth.permission, - jsonAuth.company, - jsonAuth.agency - ); + return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency); }) .catch((err) => console.log(err)); } diff --git a/src/js/models/DAO/ConfigDAO.js b/dist/models/DAO/ConfigDAO.js similarity index 82% rename from src/js/models/DAO/ConfigDAO.js rename to dist/models/DAO/ConfigDAO.js index 9777c82a..3149b3b9 100644 --- a/src/js/models/DAO/ConfigDAO.js +++ b/dist/models/DAO/ConfigDAO.js @@ -7,11 +7,7 @@ const DateUtils_1 = require('../../utils/DateUtils'); class ConfigDAO { constructor(companyName) { this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); - this._configCollection = this._objectStore.getCollection([ - 'companies', - companyName, - 'config', - ]); + this._configCollection = this._objectStore.getCollection(['companies', companyName, 'config']); } getLastConfig() { return this._objectStore @@ -35,16 +31,10 @@ class ConfigDAO { } else { config.version = lastConfig.version + 1; } - config.insertTime = DateUtils_1.DateUtils.generateDateString( - true - ); + config.insertTime = DateUtils_1.DateUtils.generateDateString(true); if (config.validateConfig()) { resolve( - this._objectStore.addDocumentIn( - this._configCollection, - config.toJson(), - `config_${config.version}` - ) + this._objectStore.addDocumentIn(this._configCollection, config.toJson(), `config_${config.version}`) ); } else { reject('Configuração inválida'); diff --git a/src/js/models/DAO/FileDAO.js b/dist/models/DAO/FileDAO.js similarity index 100% rename from src/js/models/DAO/FileDAO.js rename to dist/models/DAO/FileDAO.js diff --git a/src/js/models/DAO/FileStore.js b/dist/models/DAO/FileStore.js similarity index 100% rename from src/js/models/DAO/FileStore.js rename to dist/models/DAO/FileStore.js diff --git a/src/js/models/DAO/ObjectStore.js b/dist/models/DAO/ObjectStore.js similarity index 100% rename from src/js/models/DAO/ObjectStore.js rename to dist/models/DAO/ObjectStore.js diff --git a/src/js/models/DependencyConfig.js b/dist/models/DependencyConfig.js similarity index 88% rename from src/js/models/DependencyConfig.js rename to dist/models/DependencyConfig.js index 5801322f..64c988d1 100644 --- a/src/js/models/DependencyConfig.js +++ b/dist/models/DependencyConfig.js @@ -3,13 +3,7 @@ Object.defineProperty(exports, '__esModule', { value: true }); exports.DependencyConfig = void 0; class DependencyConfig { constructor(dependencyConfig) { - const { - columnReference, - hasMatch, - matches, - valuesReference, - columnDestiny, - } = dependencyConfig; + const { columnReference, hasMatch, matches, valuesReference, columnDestiny } = dependencyConfig; this._columnReference = columnReference; this._hasMatch = hasMatch; this._matches = matches; diff --git a/src/js/models/FacebookAds.js b/dist/models/FacebookAds.js similarity index 66% rename from src/js/models/FacebookAds.js rename to dist/models/FacebookAds.js index 3ffe3e81..70f00818 100644 --- a/src/js/models/FacebookAds.js +++ b/dist/models/FacebookAds.js @@ -11,8 +11,7 @@ class FacebookAds extends Vehicle_1.Vehicle { this._hasUndefinedParameterError = false; this._validationErrorMessage = 'Parâmetros incorretos: '; this._errorFacebookParams = {}; - this._undefinedParameterErrorMessage = - 'Parâmetro(s) não encontrado(s) na configuração: '; + this._undefinedParameterErrorMessage = 'Parâmetro(s) não encontrado(s) na configuração: '; this._undefinedParameterErrorFields = {}; this._buildUrlParams(); this._clearFacebookParamsNames(); @@ -22,10 +21,7 @@ class FacebookAds extends Vehicle_1.Vehicle { } _buildUrlParams() { if (!this.config.medias.facebookads.dynamicValues) { - const facebookadsConfig = Object.assign( - {}, - this.config.medias.facebookads - ); + const facebookadsConfig = Object.assign({}, this.config.medias.facebookads); Object.keys(facebookadsConfig).forEach((facebookParam) => { if (!this._isCompoundParameter(facebookParam)) { const columnFields = []; @@ -34,25 +30,13 @@ class FacebookAds extends Vehicle_1.Vehicle { facebookadsConfig[facebookParam].forEach((column) => { if (!this.config.validationRules[column]) { this._hasUndefinedParameterError = true; - this._undefinedParameterErrorFields[ - facebookParam - ].push(column); + this._undefinedParameterErrorFields[facebookParam].push(column); this._facebookParams[facebookParam] = ''; } else { - const normalizedColumn = StringUtils_1.StringUtils.normalize( - column - ); - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[normalizedColumn] - ) - ) { + const normalizedColumn = StringUtils_1.StringUtils.normalize(column); + if (!this.config.validateField(this.csvLine, column, this.csvLine[normalizedColumn])) { this._hasValidationError = true; - this._errorFacebookParams[facebookParam].push( - column - ); + this._errorFacebookParams[facebookParam].push(column); } else { columnFields.push( StringUtils_1.StringUtils.replaceWhiteSpace( @@ -62,27 +46,14 @@ class FacebookAds extends Vehicle_1.Vehicle { ); } } - if ( - this._errorFacebookParams[facebookParam].length > 0 - ) { + if (this._errorFacebookParams[facebookParam].length > 0) { this._facebookParams[facebookParam] = - this._validationErrorMessage + - this._errorFacebookParams[facebookParam].join( - ' - ' - ); - } else if ( - this._undefinedParameterErrorFields[facebookParam] - .length > 0 - ) { + this._validationErrorMessage + this._errorFacebookParams[facebookParam].join(' - '); + } else if (this._undefinedParameterErrorFields[facebookParam].length > 0) { this._facebookParams[facebookParam] = - this._undefinedParameterErrorMessage + - this._undefinedParameterErrorFields[ - facebookParam - ].join(' = '); + this._undefinedParameterErrorMessage + this._undefinedParameterErrorFields[facebookParam].join(' = '); } else { - this._facebookParams[ - facebookParam - ] = columnFields.join(this.config.separator); + this._facebookParams[facebookParam] = columnFields.join(this.config.separator); } }); } diff --git a/src/js/models/GA.js b/dist/models/GA.js similarity index 76% rename from src/js/models/GA.js rename to dist/models/GA.js index 56038cc2..e395bbec 100644 --- a/src/js/models/GA.js +++ b/dist/models/GA.js @@ -15,24 +15,18 @@ class GA extends AnalyticsTool_1.AnalyticsTool { this._hasValidationError[utm] = false; this._hasUndefinedParameterError[utm] = false; this._validationErrorMessage[utm] = 'Parâmetros incorretos:'; - this._undefinedParameterErroMessage[utm] = - 'Parâmetros não encontrados:'; + this._undefinedParameterErroMessage[utm] = 'Parâmetros não encontrados:'; }); this._utms = this._buildUtms(); this.url = this._buildUrl(); } _hasErrorAtUtm(utm) { - return ( - this._hasUndefinedParameterError[utm] || - this._hasValidationError[utm] - ); + return this._hasUndefinedParameterError[utm] || this._hasValidationError[utm]; } _errorMessageAtUtm(utm) { const errorMessages = []; if (this._hasUndefinedParameterError[utm]) { - errorMessages.push( - this._undefinedParameterErroMessage[utm].slice(0, -2) - ); + errorMessages.push(this._undefinedParameterErroMessage[utm].slice(0, -2)); } if (this._hasValidationError[utm]) { errorMessages.push(this._validationErrorMessage[utm].slice(0, -2)); @@ -51,15 +45,11 @@ class GA extends AnalyticsTool_1.AnalyticsTool { buildedLine() { const utms = {}; Object.keys(this._utms).map((utm) => { - utms[utm] = this._hasErrorAtUtm(utm) - ? this._errorMessageAtUtm(utm) - : this._utms[utm]; + utms[utm] = this._hasErrorAtUtm(utm) ? this._errorMessageAtUtm(utm) : this._utms[utm]; }); return { utms: utms, - 'url ga': this._hasAnyErrorAtUtms() - ? 'Corrija os parâmetros para gerar a URL' - : this.url, + 'url ga': this._hasAnyErrorAtUtms() ? 'Corrija os parâmetros para gerar a URL' : this.url, }; } _buildUtms() { @@ -67,25 +57,13 @@ class GA extends AnalyticsTool_1.AnalyticsTool { Object.keys(this.config.analyticsTool.ga).forEach((utm) => { let utmString = ''; this.config.analyticsTool.ga[utm].forEach((column) => { - const columnNormalized = StringUtils_1.StringUtils.normalize( - column - ); - if ( - StringUtils_1.StringUtils.isEmpty( - this.csvLine[columnNormalized] - ) - ) { + const columnNormalized = StringUtils_1.StringUtils.normalize(column); + if (StringUtils_1.StringUtils.isEmpty(this.csvLine[columnNormalized])) { this._hasUndefinedParameterError[utm] = true; this._undefinedParameterErroMessage[utm] += ` ${column} -`; return; } - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[columnNormalized] - ) - ) { + if (!this.config.validateField(this.csvLine, column, this.csvLine[columnNormalized])) { this._hasValidationError[utm] = true; this._validationErrorMessage[utm] += ` ${column} -`; } diff --git a/src/js/models/GeneralVehicle.js b/dist/models/GeneralVehicle.js similarity index 77% rename from src/js/models/GeneralVehicle.js rename to dist/models/GeneralVehicle.js index 8c29d402..a8826a39 100644 --- a/src/js/models/GeneralVehicle.js +++ b/dist/models/GeneralVehicle.js @@ -11,8 +11,7 @@ class GeneralVehicle extends Vehicle_1.Vehicle { this._hasUndefinedParameterError = false; this._errorParams = {}; this._validationErrorMessage = 'Parâmetro(s) incorreto(s): '; - this._undefinedParameterErrorMessage = - 'Parâmetro(s) não encontrado(s) na configuração: '; + this._undefinedParameterErrorMessage = 'Parâmetro(s) não encontrado(s) na configuração: '; this._undefinedParameterErrorFields = {}; this._vehicleName = vehicleName; this._buildGeneralParams(); @@ -30,21 +29,11 @@ class GeneralVehicle extends Vehicle_1.Vehicle { if (!this.config.existsColumn(csvColumn)) { this._undefinedParameterFounded(param, csvColumn); } else { - const normalizedColumn = StringUtils_1.StringUtils.normalize( - csvColumn - ); - if ( - !this.config.validateField( - this.csvLine, - csvColumn, - this.csvLine[normalizedColumn] - ) - ) { + const normalizedColumn = StringUtils_1.StringUtils.normalize(csvColumn); + if (!this.config.validateField(this.csvLine, csvColumn, this.csvLine[normalizedColumn])) { this._validationErrorFounded(param, csvColumn); } else { - this._params[ - param - ] += `${StringUtils_1.StringUtils.replaceWhiteSpace( + this._params[param] += `${StringUtils_1.StringUtils.replaceWhiteSpace( this.csvLine[normalizedColumn], this.config.spaceSeparator ).toLowerCase()}${this.config.separator}`; @@ -52,13 +41,10 @@ class GeneralVehicle extends Vehicle_1.Vehicle { } }); if (this._hasValidationError) { - this._params[param] = - this._validationErrorMessage + - this._errorParams[param].join(' - '); + this._params[param] = this._validationErrorMessage + this._errorParams[param].join(' - '); } else if (this._hasUndefinedParameterError) { this._params[param] = - this._undefinedParameterErrorMessage + - this._undefinedParameterErrorFields[param].join(' - '); + this._undefinedParameterErrorMessage + this._undefinedParameterErrorFields[param].join(' - '); } else { this._params[param] = this._params[param].slice(0, -1); } diff --git a/src/js/models/GoogleAds.js b/dist/models/GoogleAds.js similarity index 70% rename from src/js/models/GoogleAds.js rename to dist/models/GoogleAds.js index e82ff5f7..42948942 100644 --- a/src/js/models/GoogleAds.js +++ b/dist/models/GoogleAds.js @@ -16,10 +16,8 @@ class GoogleAds extends Vehicle_1.Vehicle { Object.keys(this.config.medias.googleads).map((adsParam) => { this._hasValidationError[adsParam] = false; this._hasUndefinedParameterError[adsParam] = false; - this._validationErrorMessage[adsParam] = - 'Parâmetro(s) incorreto(s): '; - this._undefinedParameterErrorMessage[adsParam] = - 'Parâmetro(s) não encontrado(s): '; + this._validationErrorMessage[adsParam] = 'Parâmetro(s) incorreto(s): '; + this._undefinedParameterErrorMessage[adsParam] = 'Parâmetro(s) não encontrado(s): '; }); this._buildAdsParams(); } @@ -35,26 +33,14 @@ class GoogleAds extends Vehicle_1.Vehicle { fields.forEach((column) => { if (!this.config.validationRules[column]) { this._hasUndefinedParameterError[googleAdsParam] = true; - this._undefinedParameterErrorFields[googleAdsParam].push( - column - ); + this._undefinedParameterErrorFields[googleAdsParam].push(column); } else { - const normalizedColumn = StringUtils_1.StringUtils.normalize( - column - ); - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[normalizedColumn] - ) - ) { + const normalizedColumn = StringUtils_1.StringUtils.normalize(column); + if (!this.config.validateField(this.csvLine, column, this.csvLine[normalizedColumn])) { this._hasValidationError[googleAdsParam] = true; this._errorAdsParams[googleAdsParam].push(column); } else { - this._adsParams[ - googleAdsParam - ] += `${StringUtils_1.StringUtils.replaceWhiteSpace( + this._adsParams[googleAdsParam] += `${StringUtils_1.StringUtils.replaceWhiteSpace( this.csvLine[normalizedColumn], this.config.spaceSeparator ).toLowerCase()}${this.config.separator}`; @@ -63,18 +49,13 @@ class GoogleAds extends Vehicle_1.Vehicle { }); if (this._hasValidationError[googleAdsParam]) { this._adsParams[googleAdsParam] = - this._validationErrorMessage[googleAdsParam] + - this._errorAdsParams[googleAdsParam].join(' - '); + this._validationErrorMessage[googleAdsParam] + this._errorAdsParams[googleAdsParam].join(' - '); } else if (this._hasUndefinedParameterError[googleAdsParam]) { this._adsParams[googleAdsParam] = this._undefinedParameterErrorMessage[googleAdsParam] + - this._undefinedParameterErrorFields[googleAdsParam].join( - ' - ' - ); + this._undefinedParameterErrorFields[googleAdsParam].join(' - '); } else { - this._adsParams[googleAdsParam] = this._adsParams[ - googleAdsParam - ].slice(0, -1); + this._adsParams[googleAdsParam] = this._adsParams[googleAdsParam].slice(0, -1); } }); } diff --git a/src/js/models/Log.js b/dist/models/Log.js similarity index 100% rename from src/js/models/Log.js rename to dist/models/Log.js diff --git a/src/js/models/Parametrizer.js b/dist/models/Parametrizer.js similarity index 100% rename from src/js/models/Parametrizer.js rename to dist/models/Parametrizer.js diff --git a/src/js/models/ParametrizerFactory.js b/dist/models/ParametrizerFactory.js similarity index 80% rename from src/js/models/ParametrizerFactory.js rename to dist/models/ParametrizerFactory.js index 1d5834cc..13a8b680 100644 --- a/src/js/models/ParametrizerFactory.js +++ b/dist/models/ParametrizerFactory.js @@ -20,16 +20,9 @@ class ParametrizerFactory { case 'googleads': return new GoogleAds_1.GoogleAds(this._csvLines, this._config); case 'facebookads': - return new FacebookAds_1.FacebookAds( - this._csvLines, - this._config - ); + return new FacebookAds_1.FacebookAds(this._csvLines, this._config); default: - return new GeneralVehicle_1.GeneralVehicle( - this._csvLines, - this._config, - type - ); + return new GeneralVehicle_1.GeneralVehicle(this._csvLines, this._config, type); } } } diff --git a/src/js/models/RoutesPermission.js b/dist/models/RoutesPermission.js similarity index 64% rename from src/js/models/RoutesPermission.js rename to dist/models/RoutesPermission.js index ae98ee6f..3870e0e0 100644 --- a/src/js/models/RoutesPermission.js +++ b/dist/models/RoutesPermission.js @@ -8,26 +8,12 @@ class RoutesPermission { } validatePermission(auth) { const agencyPostRoutes = ['/build/.*', '/csv']; - const agencyGetRoutes = [ - '/config', - '/template', - '/csv/list', - '/csv', - '/user', - ]; + const agencyGetRoutes = ['/config', '/template', '/csv/list', '/csv', '/user']; if (auth.permission === 'user') { if (this._method === 'POST') { - return ( - agencyPostRoutes.filter((route) => - new RegExp(route).test(this._route) - ).length > 0 - ); + return agencyPostRoutes.filter((route) => new RegExp(route).test(this._route)).length > 0; } else if (this._method === 'GET') { - return ( - agencyGetRoutes.filter((route) => - new RegExp(route).test(this._route) - ).length > 0 - ); + return agencyGetRoutes.filter((route) => new RegExp(route).test(this._route)).length > 0; } else { return false; } diff --git a/src/js/models/Vehicle.js b/dist/models/Vehicle.js similarity index 100% rename from src/js/models/Vehicle.js rename to dist/models/Vehicle.js diff --git a/src/js/models/cloud/FirestoreConnectionSingleton.js b/dist/models/cloud/FirestoreConnectionSingleton.js similarity index 95% rename from src/js/models/cloud/FirestoreConnectionSingleton.js rename to dist/models/cloud/FirestoreConnectionSingleton.js index 3163824f..5494ac87 100644 --- a/src/js/models/cloud/FirestoreConnectionSingleton.js +++ b/dist/models/cloud/FirestoreConnectionSingleton.js @@ -8,10 +8,7 @@ class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { super(); if (process.env.DEVELOPMENT) { const credentials = require('../../../../gcp_key.json'); - this._db = new firestore_1.Firestore({ - projectId: 'adinfo', - credentials, - }); + this._db = new firestore_1.Firestore({ projectId: 'adinfo', credentials }); } else { this._db = new firestore_1.Firestore(); } diff --git a/src/js/models/cloud/LoggingSingleton.js b/dist/models/cloud/LoggingSingleton.js similarity index 77% rename from src/js/models/cloud/LoggingSingleton.js rename to dist/models/cloud/LoggingSingleton.js index 80b5a3bb..b7f0a192 100644 --- a/src/js/models/cloud/LoggingSingleton.js +++ b/dist/models/cloud/LoggingSingleton.js @@ -12,10 +12,7 @@ class LoggingSingleton extends Log_1.Log { if (!LoggingSingleton._infoInstance) { LoggingSingleton._infoInstance = bunyan.createLogger({ name: LoggingSingleton._loggerName, - streams: [ - { stream: process.stdout, level: 'info' }, - this._loggingBunyan.stream('info'), - ], + streams: [{ stream: process.stdout, level: 'info' }, this._loggingBunyan.stream('info')], }); } LoggingSingleton._infoInstance.info(message); @@ -24,10 +21,7 @@ class LoggingSingleton extends Log_1.Log { if (!LoggingSingleton._errorInstance) { LoggingSingleton._errorInstance = bunyan.createLogger({ name: LoggingSingleton._loggerName, - streams: [ - { stream: process.stdout, level: 'error' }, - this._loggingBunyan.stream('error'), - ], + streams: [{ stream: process.stdout, level: 'error' }, this._loggingBunyan.stream('error')], }); } LoggingSingleton._errorInstance.info(message); @@ -36,10 +30,7 @@ class LoggingSingleton extends Log_1.Log { if (!LoggingSingleton._warningInstance) { LoggingSingleton._warningInstance = bunyan.createLogger({ name: LoggingSingleton._loggerName, - streams: [ - { stream: process.stdout, level: 'warn' }, - this._loggingBunyan.stream('warn'), - ], + streams: [{ stream: process.stdout, level: 'warn' }, this._loggingBunyan.stream('warn')], }); } LoggingSingleton._warningInstance.info(message); diff --git a/src/js/models/cloud/StorageConnectionSingleton.js b/dist/models/cloud/StorageConnectionSingleton.js similarity index 93% rename from src/js/models/cloud/StorageConnectionSingleton.js rename to dist/models/cloud/StorageConnectionSingleton.js index ca178f1a..55164422 100644 --- a/src/js/models/cloud/StorageConnectionSingleton.js +++ b/dist/models/cloud/StorageConnectionSingleton.js @@ -9,10 +9,7 @@ class StorageConnectionSingleton extends FileStore_1.FileStore { this._bucket = `adinfo-dp6-files`; if (process.env.DEVELOPMENT) { const credentials = require('../../../../gcp_key.json'); - this._db = new storage_1.Storage({ - projectId: 'adinfo', - credentials, - }); + this._db = new storage_1.Storage({ projectId: 'adinfo', credentials }); } else { this._db = new storage_1.Storage(); } diff --git a/src/js/routes/build.js b/dist/routes/build.js similarity index 85% rename from src/js/routes/build.js rename to dist/routes/build.js index ef3254a6..47c8fe2e 100644 --- a/src/js/routes/build.js +++ b/dist/routes/build.js @@ -41,15 +41,8 @@ const build = (app) => { } }) .then(() => { - const jsonFromFile = CsvUtils_1.CsvUtils.csv2json( - fileContent.toString(), - companyConfig.csvSeparator - ); - const jsonParameterized = new Builder_1.Builder( - jsonFromFile, - companyConfig, - media - ).build(); + const jsonFromFile = CsvUtils_1.CsvUtils.csv2json(fileContent.toString(), companyConfig.csvSeparator); + const jsonParameterized = new Builder_1.Builder(jsonFromFile, companyConfig, media).build(); const configVersion = companyConfig.version; const configTimestamp = DateUtils_1.DateUtils.newDateStringFormat( companyConfig.insertTime, @@ -61,10 +54,7 @@ const build = (app) => { (err, csv) => { csv += '\n\nConfiguracao versao;' + configVersion; csv += '\nConfiguracao inserida em;' + configTimestamp; - res.setHeader( - 'Content-disposition', - 'attachment; filename=data.csv' - ); + res.setHeader('Content-disposition', 'attachment; filename=data.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); res.status(200).send(csv); }, diff --git a/src/js/routes/config.js b/dist/routes/config.js similarity index 100% rename from src/js/routes/config.js rename to dist/routes/config.js diff --git a/src/js/routes/csv.js b/dist/routes/csv.js similarity index 88% rename from src/js/routes/csv.js rename to dist/routes/csv.js index b8d4ca00..0d47a9fc 100644 --- a/src/js/routes/csv.js +++ b/dist/routes/csv.js @@ -35,9 +35,7 @@ const csv = (app) => { res.status(200).send(data.toString()); }) .catch((err) => { - res.status(500).send( - `Falha ao restaurar o arquivo ${fileName}!` - ); + res.status(500).send(`Falha ao restaurar o arquivo ${fileName}!`); }); }); app.get('/csv/list', (req, res) => { @@ -46,9 +44,7 @@ const csv = (app) => { fileDAO .getAllFilesFromStore(agency) .then((data) => { - const files = data[0] - .filter((file) => /\.csv$/.test(file.name)) - .map((file) => file.name); + const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); res.status(200).send(files); }) .catch((err) => { diff --git a/src/js/routes/register.js b/dist/routes/register.js similarity index 89% rename from src/js/routes/register.js rename to dist/routes/register.js index f2e4df17..74f29d57 100644 --- a/src/js/routes/register.js +++ b/dist/routes/register.js @@ -22,9 +22,7 @@ const register = (app) => { authDAO .addAuth(jsonPermission) .then((token) => { - res.status(200).send( - `Permissão adicionada para a empresa ${company}, token: ${token}` - ); + res.status(200).send(`Permissão adicionada para a empresa ${company}, token: ${token}`); }) .catch((err) => { res.status(500).send('Falha ao criar permissão!'); diff --git a/src/js/routes/routes.js b/dist/routes/routes.js similarity index 100% rename from src/js/routes/routes.js rename to dist/routes/routes.js diff --git a/src/js/routes/template.js b/dist/routes/template.js similarity index 87% rename from src/js/routes/template.js rename to dist/routes/template.js index dcd09cb4..1d3b9f0e 100644 --- a/src/js/routes/template.js +++ b/dist/routes/template.js @@ -8,10 +8,7 @@ const template = (app) => { configDAO .getLastConfig() .then((config) => { - res.setHeader( - 'Content-disposition', - 'attachment; filename=template.csv' - ); + res.setHeader('Content-disposition', 'attachment; filename=template.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); if (config) { res.status(200).send(config.toCsvTemplate()); diff --git a/src/js/routes/user.js b/dist/routes/user.js similarity index 100% rename from src/js/routes/user.js rename to dist/routes/user.js diff --git a/src/js/utils/CsvUtils.js b/dist/utils/CsvUtils.js similarity index 80% rename from src/js/utils/CsvUtils.js rename to dist/utils/CsvUtils.js index d5509b1f..52932aaf 100644 --- a/src/js/utils/CsvUtils.js +++ b/dist/utils/CsvUtils.js @@ -6,16 +6,10 @@ class CsvUtils { return linesOfCsv.filter((line) => line.trim() !== '').length === 0; } static isLineEmpty(lineOfCsv) { - return ( - Object.keys(lineOfCsv).filter( - (column) => lineOfCsv[column].trim() !== '' - ).length === 0 - ); + return Object.keys(lineOfCsv).filter((column) => lineOfCsv[column].trim() !== '').length === 0; } static csv2json(csvContent, separator) { - const linesOfCsv = csvContent - .split('\n') - .filter((line) => line.trim() !== ''); + const linesOfCsv = csvContent.split('\n').filter((line) => line.trim() !== ''); if (this.isCsvEmpty(linesOfCsv)) return []; const headers = []; linesOfCsv[0].split(separator).map((header) => { diff --git a/src/js/utils/DateUtils.js b/dist/utils/DateUtils.js similarity index 91% rename from src/js/utils/DateUtils.js rename to dist/utils/DateUtils.js index 0ab72c1a..091c1e05 100644 --- a/src/js/utils/DateUtils.js +++ b/dist/utils/DateUtils.js @@ -46,9 +46,7 @@ class DateUtils { hh = date.getHours().toString().padStart(2, '0'), min = date.getMinutes().toString().padStart(2, '0'), ss = date.getSeconds().toString().padStart(2, '0'); - return seconds - ? `${date.getFullYear()}${mm}${dd}${hh}${min}${ss}` - : `${date.getFullYear()}${mm}${dd}${hh}${min}`; + return seconds ? `${date.getFullYear()}${mm}${dd}${hh}${min}${ss}` : `${date.getFullYear()}${mm}${dd}${hh}${min}`; } } exports.DateUtils = DateUtils; diff --git a/src/js/utils/JsonUtils.js b/dist/utils/JsonUtils.js similarity index 73% rename from src/js/utils/JsonUtils.js rename to dist/utils/JsonUtils.js index b9ab9700..f0e0e8aa 100644 --- a/src/js/utils/JsonUtils.js +++ b/dist/utils/JsonUtils.js @@ -9,16 +9,9 @@ class JsonUtils { static normalizeKeys(json) { const jsonNormalized = {}; Object.keys(json).map((key) => { - jsonNormalized[StringUtils_1.StringUtils.normalize(key)] = - json[key]; - if ( - this._keyValueIsAnObject( - jsonNormalized[StringUtils_1.StringUtils.normalize(key)] - ) - ) { - jsonNormalized[ - StringUtils_1.StringUtils.normalize(key) - ] = this.normalizeKeys( + jsonNormalized[StringUtils_1.StringUtils.normalize(key)] = json[key]; + if (this._keyValueIsAnObject(jsonNormalized[StringUtils_1.StringUtils.normalize(key)])) { + jsonNormalized[StringUtils_1.StringUtils.normalize(key)] = this.normalizeKeys( jsonNormalized[StringUtils_1.StringUtils.normalize(key)] ); } diff --git a/src/js/utils/StringUtils.js b/dist/utils/StringUtils.js similarity index 88% rename from src/js/utils/StringUtils.js rename to dist/utils/StringUtils.js index 89713652..a11c7728 100644 --- a/src/js/utils/StringUtils.js +++ b/dist/utils/StringUtils.js @@ -26,11 +26,7 @@ class StringUtils { validate.push(!!stringToValidate.match(regexRule)); } else { validate.push( - stringToValidate.toLocaleLowerCase() === - this.replaceWhiteSpace( - rule.toLocaleLowerCase(), - separator - ) + stringToValidate.toLocaleLowerCase() === this.replaceWhiteSpace(rule.toLocaleLowerCase(), separator) ); } }); diff --git a/index.js b/index.js index 7b289654..ce1f5e86 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,8 @@ -const app = require('./src/js/app.js'); +const app = require('./dist/app.js'); const port = process.env.PORT || 443; app.listen(port, () => { - if (process.env.NODE_ENV === 'development') { - console.log(`Example app listening at http://localhost:${port}`); - } -}); \ No newline at end of file + if (process.env.NODE_ENV === 'development') { + console.log(`Example app listening at http://localhost:${port}`); + } +}); diff --git a/openapi-appengine.yaml b/openapi-appengine.yaml index e76f76c5..c5656078 100644 --- a/openapi-appengine.yaml +++ b/openapi-appengine.yaml @@ -1,171 +1,171 @@ swagger: '2.0' info: - title: DP6 Adinfo - description: Implementação do Novo AdInfo DP6 usando App Engine. - version: '0.0.1' + title: DP6 Adinfo + description: Implementação do Novo AdInfo DP6 usando App Engine. + version: '0.0.1' host: localhost:443 basePath: / # schemes: - - https + - https paths: - '/csv': - get: - description: Get the csv file from storage - operationId: csv - parameters: - - name: token - in: headers - description: API token - - name: fileName - in: headers - description: name of file - responses: - 200: - description: 'Success' - schema: - type: string - 400: - description: 'Bad Request' - 500: - description: 'Internal server error' - post: - description: Uploads de CSV file to the storage - operationId: csv - parameters: - - name: token - in: headers - description: API token - - name: content - in: files - description: file to upload - responses: - 200: - description: 'Success' - schema: - type: string - 400: - description: 'Bad Request' - 500: - description: 'Internal server error' - '/csv/list': - get: - description: Lists all csv files within a company - operationId: csv_list - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: 'Success' - schema: - type: string - 400: - description: 'Bad Request2' - 500: - description: 'Internal server error' - '/config': - post: - description: Creates a new config in the company - operationId: config - parameters: - - name: token - in: headers - description: API token - - name: configString - in: body - description: String in JSON format - responses: - 200: - description: 'Success' - schema: - type: string - 400: - description: 'Bad Request' - 500: - description: 'Internal server error' - get: - description: Get last config - operationId: config - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: 'Success' - schema: - type: string - 400: - description: 'Bad Request' - 500: - description: 'Internal server error' - '/build/:media': - post: - description: Creates the output csv containing the builded parameters and urls - operationId: build - parameters: - - name: token - in: headers - description: API token - - name: media - in: params - description: media for parametrizer - responses: - 200: - description: 'Success' - schema: - type: string - 400: - description: 'Bad Request' - 500: - description: 'Internal server error' - '/template': - get: - description: Creates the input csv file template - operationId: template - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: 'Success' - schema: - type: string - 500: - description: 'Internal server error' - '/register': - get: - description: Creates new API Token - operationId: 'register' - parameters: - - name: token - in: headers - description: API token - - name: permission - in: headers - description: permission to new user - responses: - 200: - description: 'Success' - schema: - type: string - 500: - description: 'Internal server error' - '/user': - get: - description: Get User credentials - operationId: 'user' - parameters: - - name: token - in: headers - description: API token - responses: - 200: - description: 'Success' - schema: - type: string - 500: - description: 'Internal server error' + '/csv': + get: + description: Get the csv file from storage + operationId: csv + parameters: + - name: token + in: headers + description: API token + - name: fileName + in: headers + description: name of file + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + post: + description: Uploads de CSV file to the storage + operationId: csv + parameters: + - name: token + in: headers + description: API token + - name: content + in: files + description: file to upload + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + '/csv/list': + get: + description: Lists all csv files within a company + operationId: csv_list + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request2' + 500: + description: 'Internal server error' + '/config': + post: + description: Creates a new config in the company + operationId: config + parameters: + - name: token + in: headers + description: API token + - name: configString + in: body + description: String in JSON format + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + get: + description: Get last config + operationId: config + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + '/build/:media': + post: + description: Creates the output csv containing the builded parameters and urls + operationId: build + parameters: + - name: token + in: headers + description: API token + - name: media + in: params + description: media for parametrizer + responses: + 200: + description: 'Success' + schema: + type: string + 400: + description: 'Bad Request' + 500: + description: 'Internal server error' + '/template': + get: + description: Creates the input csv file template + operationId: template + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 500: + description: 'Internal server error' + '/register': + get: + description: Creates new API Token + operationId: 'register' + parameters: + - name: token + in: headers + description: API token + - name: permission + in: headers + description: permission to new user + responses: + 200: + description: 'Success' + schema: + type: string + 500: + description: 'Internal server error' + '/user': + get: + description: Get User credentials + operationId: 'user' + parameters: + - name: token + in: headers + description: API token + responses: + 200: + description: 'Success' + schema: + type: string + 500: + description: 'Internal server error' diff --git a/package.json b/package.json index 0ffaf10e..08c0e1d0 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "lint": "eslint ./src --ext .ts", "lint-prettier": "npx prettier --check .", "lint-fix": "eslint ./src --ext .ts --fix", - "compile": "del /s /q src\\js && tsc", + "compile": "del /s /q dist && tsc", "auto-compile": "tsc -w", "format": "npx prettier --write .", "build": "npm run compile", @@ -23,8 +23,8 @@ "author": "DP6", "contributors": [ { - "name": "Lucas Tonetto Firmo", - "email": "lucasfirmo@hotmail.com" + "name": "Lucas Tonetto Firmo", + "email": "lucasfirmo@hotmail.com" } ], "keywords": [ diff --git a/src/ts/app.ts b/src/ts/app.ts index 1a6c945c..4e646ddf 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -22,67 +22,39 @@ app.use(bodyParser.json()); app.use( cors({ - allowedHeaders: [ - 'token', - 'agency', - 'Content-Type', - 'company', - 'file', - 'data', - 'config', - 'permission', - ], - exposedHeaders: [ - 'token', - 'agency', - 'company', - 'file', - 'data', - 'config', - 'permission', - ], + allowedHeaders: ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config', 'permission'], + exposedHeaders: ['token', 'agency', 'company', 'file', 'data', 'config', 'permission'], origin: '*', methods: 'GET,POST', preflightContinue: false, }) ); -app.all( - '*', - async ( - req: { [key: string]: any }, - res: { [key: string]: any }, - next: any - ) => { - const token = req.headers.token; - if (token) { - const authDAO = new AuthDAO(token); - authDAO - .getAuth() - .then((auth: Auth) => { - req.company = auth.company; - req.agency = auth.agency; - if (auth.hasPermissionFor(req.url, req.method)) { - next(); - } else { - res.status(403).send( - 'Usuário sem permissão para realizar a ação!' - ); - } - }) - .catch((err) => { - res.status(403).send('Usuário Inválido'); - }); - } else { - res.status(403).send('Token não informado!'); - } +app.all('*', async (req: { [key: string]: any }, res: { [key: string]: any }, next: any) => { + const token = req.headers.token; + if (token) { + const authDAO = new AuthDAO(token); + authDAO + .getAuth() + .then((auth: Auth) => { + req.company = auth.company; + req.agency = auth.agency; + if (auth.hasPermissionFor(req.url, req.method)) { + next(); + } else { + res.status(403).send('Usuário sem permissão para realizar a ação!'); + } + }) + .catch((err) => { + res.status(403).send('Usuário Inválido'); + }); + } else { + res.status(403).send('Token não informado!'); } -); +}); routes(app); -app.get('/', (req: { [key: string]: any }, res: { [key: string]: any }) => - res.status(200).send('OK') -); +app.get('/', (req: { [key: string]: any }, res: { [key: string]: any }) => res.status(200).send('OK')); module.exports = app; diff --git a/src/ts/controllers/Builder.ts b/src/ts/controllers/Builder.ts index f812712a..35d67b66 100644 --- a/src/ts/controllers/Builder.ts +++ b/src/ts/controllers/Builder.ts @@ -9,11 +9,7 @@ export class Builder { private _companyConfig: Config; private _media: string; - constructor( - jsonFromFile: { [key: string]: string }[], - companyConfig: Config, - media: string - ) { + constructor(jsonFromFile: { [key: string]: string }[], companyConfig: Config, media: string) { this._jsonFromFile = jsonFromFile; this._companyConfig = companyConfig; this._media = media; @@ -23,40 +19,19 @@ export class Builder { * Parametriza o csv de acordo com a midia */ public build(): { [key: string]: string }[] { - const linesWithContent = this._jsonFromFile.filter( - (line) => !CsvUtils.isLineEmpty(line) - ); - const linesBuilded: { [key: string]: string }[] = linesWithContent.map( - (lineFromFile) => { - const parametrizerObject = new ParametrizerFactory( - lineFromFile, - this._companyConfig - ).build(this._media); - const parameters = parametrizerObject.buildedLine(); - if ( - Object.getPrototypeOf(parametrizerObject.constructor) - .name === 'Vehicle' - ) { - const analyticsToolParameters = new ParametrizerFactory( - lineFromFile, - this._companyConfig - ) - .build( - StringUtils.normalize( - this._companyConfig.analyticsToolName - ) - ) - .buildedLine(); - return JsonUtils.addParametersAt( - lineFromFile, - parameters, - analyticsToolParameters - ); - } else { - return JsonUtils.addParametersAt(lineFromFile, parameters); - } + const linesWithContent = this._jsonFromFile.filter((line) => !CsvUtils.isLineEmpty(line)); + const linesBuilded: { [key: string]: string }[] = linesWithContent.map((lineFromFile) => { + const parametrizerObject = new ParametrizerFactory(lineFromFile, this._companyConfig).build(this._media); + const parameters = parametrizerObject.buildedLine(); + if (Object.getPrototypeOf(parametrizerObject.constructor).name === 'Vehicle') { + const analyticsToolParameters = new ParametrizerFactory(lineFromFile, this._companyConfig) + .build(StringUtils.normalize(this._companyConfig.analyticsToolName)) + .buildedLine(); + return JsonUtils.addParametersAt(lineFromFile, parameters, analyticsToolParameters); + } else { + return JsonUtils.addParametersAt(lineFromFile, parameters); } - ); + }); return linesBuilded; } } diff --git a/src/ts/models/Adobe.ts b/src/ts/models/Adobe.ts index f348757c..212a68f8 100644 --- a/src/ts/models/Adobe.ts +++ b/src/ts/models/Adobe.ts @@ -2,7 +2,7 @@ import { StringUtils } from '../utils/StringUtils'; import { Config } from './Config'; import { AnalyticsTool } from './AnalyticsTool'; -/** +/* csvLine: { 'Url': 'www.teste.com.br', 'Tipo de Compra': 'cpc', @@ -56,9 +56,7 @@ export class Adobe extends AnalyticsTool { private _errorMessage(): string { const errorMessages = []; if (this._hasUndefinedParameterError) { - errorMessages.push( - this._undefinedParameterErroMessage.slice(0, -2) - ); + errorMessages.push(this._undefinedParameterErroMessage.slice(0, -2)); } if (this._hasValidationError) { errorMessages.push(this._validationErrorMessage.slice(0, -2)); @@ -72,9 +70,7 @@ export class Adobe extends AnalyticsTool { public buildedLine(): { [key: string]: string } { return { cid: this._hasErrorAtCid() ? this._errorMessage() : this._cid, - 'url adobe': this._hasErrorAtCid() - ? 'Corrija os parâmetros para gerar a URL' - : this.url, + 'url adobe': this._hasErrorAtCid() ? 'Corrija os parâmetros para gerar a URL' : this.url, }; } @@ -90,22 +86,13 @@ export class Adobe extends AnalyticsTool { this._undefinedParameterErroMessage += ` ${column} -`; return; } - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[columnNormalized] - ) - ) { + if (!this.config.validateField(this.csvLine, column, this.csvLine[columnNormalized])) { this._hasValidationError = true; this._validationErrorMessage += ` ${column} -`; } cid += `${this.csvLine[columnNormalized]}${this.config.separator}`; }); - cid = StringUtils.replaceWhiteSpace( - StringUtils.normalize(cid), - this.config.spaceSeparator - ).slice(0, -1); + cid = StringUtils.replaceWhiteSpace(StringUtils.normalize(cid), this.config.spaceSeparator).slice(0, -1); return cid; } diff --git a/src/ts/models/Config.ts b/src/ts/models/Config.ts index dfa21db1..3064f7c8 100644 --- a/src/ts/models/Config.ts +++ b/src/ts/models/Config.ts @@ -22,9 +22,7 @@ export class Config { this._csvSeparator = jsonConfigTemp.csvSeparator; delete jsonConfigTemp.csvSeparator; } - this._dependenciesConfig = this._buildDependenciesConfig( - jsonConfigTemp.dependenciesConfig - ); + this._dependenciesConfig = this._buildDependenciesConfig(jsonConfigTemp.dependenciesConfig); delete jsonConfigTemp.dependenciesConfig; this._spaceSeparator = jsonConfigTemp.spaceSeparator; delete jsonConfigTemp.spaceSeparator; @@ -50,13 +48,7 @@ export class Config { * Checa se a configuração é válida */ public validateConfig(): boolean { - return !( - !this._separator || - !this._spaceSeparator || - !this._insertTime || - !this._version || - !this._analyticsTool - ); + return !(!this._separator || !this._spaceSeparator || !this._insertTime || !this._version || !this._analyticsTool); } private _buildDependenciesConfig( @@ -71,9 +63,7 @@ export class Config { if (!dependenciesConfig) { return []; } - return dependenciesConfig.map( - (dependencyConfig) => new DependencyConfig(dependencyConfig) - ); + return dependenciesConfig.map((dependencyConfig) => new DependencyConfig(dependencyConfig)); } /** @@ -90,28 +80,18 @@ export class Config { let jsonConfig: { [key: string]: any } = {}; Object.keys(this).forEach((key: string, index: number) => { if (key === '_analyticsTool' || key === '_medias') { - jsonConfig = JsonUtils.addParametersAt( - jsonConfig, - Object.values(this)[index] - ); + jsonConfig = JsonUtils.addParametersAt(jsonConfig, Object.values(this)[index]); } else if (key === '_validationRules') { jsonConfig = JsonUtils.addParametersAt(jsonConfig, { columns: this._validationRules, }); } else if (key === '_dependenciesConfig') { if (this._dependenciesConfig.length > 0) { - jsonConfig[ - 'dependenciesConfig' - ] = this._dependenciesConfig.map( - (dependencyConfig: DependencyConfig) => { - return dependencyConfig.toJson(); - } - ); + jsonConfig['dependenciesConfig'] = this._dependenciesConfig.map((dependencyConfig: DependencyConfig) => { + return dependencyConfig.toJson(); + }); } - } else if ( - key !== '_analyticsToolName' && - Object.values(this)[index] - ) { + } else if (key !== '_analyticsToolName' && Object.values(this)[index]) { jsonConfig[key.replace('_', '')] = Object.values(this)[index]; } }); @@ -149,10 +129,7 @@ export class Config { if (!this._existsValidationRuleFor(csvColumn)) { return true; } - return StringUtils.validateString( - value, - this._validationRules[csvColumn] - ); + return StringUtils.validateString(value, this._validationRules[csvColumn]); } /** @@ -175,41 +152,26 @@ export class Config { * @param csvColumn Coluna do CSV a ser validada * @param value Valor da coluna */ - private _validateDependencyRulesFor( - csvLine: { [key: string]: string }, - csvColumn: string, - value: string - ): boolean { - const dependenciesConfigForCsvColumn = this._getAllDependencyConfigFor( - csvColumn - ); + private _validateDependencyRulesFor(csvLine: { [key: string]: string }, csvColumn: string, value: string): boolean { + const dependenciesConfigForCsvColumn = this._getAllDependencyConfigFor(csvColumn); if (dependenciesConfigForCsvColumn.length === 0) { return true; } - const dependenciesToValidate = dependenciesConfigForCsvColumn.filter( - (dependencyConfig) => - StringUtils.validateString( - csvLine[ - StringUtils.normalize(dependencyConfig.columnReference) - ], - dependencyConfig.valuesReference - ) + const dependenciesToValidate = dependenciesConfigForCsvColumn.filter((dependencyConfig) => + StringUtils.validateString( + csvLine[StringUtils.normalize(dependencyConfig.columnReference)], + dependencyConfig.valuesReference + ) ); return ( dependenciesToValidate.filter((dependencyConfig) => { if (dependencyConfig.hasMatch) { - return StringUtils.validateString( - value, - dependencyConfig.matches - ); + return StringUtils.validateString(value, dependencyConfig.matches); } else { - return !StringUtils.validateString( - value, - dependencyConfig.matches - ); + return !StringUtils.validateString(value, dependencyConfig.matches); } }).length === dependenciesToValidate.length ); @@ -221,15 +183,8 @@ export class Config { * @param csvColumn Coluna do CSV de referência * @param value Valor da coluna */ - public validateField( - csvLine: { [key: string]: string }, - csvColumn: string, - value: string - ): boolean { - return ( - this._validateRulesFor(csvColumn, value) && - this._validateDependencyRulesFor(csvLine, csvColumn, value) - ); + public validateField(csvLine: { [key: string]: string }, csvColumn: string, value: string): boolean { + return this._validateRulesFor(csvColumn, value) && this._validateDependencyRulesFor(csvLine, csvColumn, value); } /** diff --git a/src/ts/models/DAO/AuthDAO.ts b/src/ts/models/DAO/AuthDAO.ts index cac2d3ac..2d90a8a6 100644 --- a/src/ts/models/DAO/AuthDAO.ts +++ b/src/ts/models/DAO/AuthDAO.ts @@ -13,9 +13,7 @@ export class AuthDAO { this._token = token; this._objectStore = FirestoreConnectionSingleton.getInstance(); this._pathToCollection = ['tokens']; - this._authCollection = this._objectStore.getCollection( - this._pathToCollection - ); + this._authCollection = this._objectStore.getCollection(this._pathToCollection); } public getAuth(): Promise { @@ -25,18 +23,12 @@ export class AuthDAO { .get() .then((data) => { const jsonAuth = data.data(); - return new Auth( - jsonAuth.permission, - jsonAuth.company, - jsonAuth.agency - ); + return new Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency); }) .catch((err) => console.log(err)); } - public addAuth(jsonAuth: { - [key: string]: string; - }): Promise { + public addAuth(jsonAuth: { [key: string]: string }): Promise { return this._objectStore .addDocumentIn(this._authCollection, jsonAuth, '') .get() diff --git a/src/ts/models/DAO/ConfigDAO.ts b/src/ts/models/DAO/ConfigDAO.ts index b835df1a..898c92ee 100644 --- a/src/ts/models/DAO/ConfigDAO.ts +++ b/src/ts/models/DAO/ConfigDAO.ts @@ -2,11 +2,7 @@ import { ObjectStore } from '../DAO/ObjectStore'; import { FirestoreConnectionSingleton } from '../cloud/FirestoreConnectionSingleton'; import { Config } from '../Config'; import { DateUtils } from '../../utils/DateUtils'; -import { - CollectionReference, - DocumentData, - DocumentReference, -} from '@google-cloud/firestore'; +import { CollectionReference, DocumentData, DocumentReference } from '@google-cloud/firestore'; export class ConfigDAO { private _objectStore: ObjectStore; @@ -14,11 +10,7 @@ export class ConfigDAO { constructor(companyName: string) { this._objectStore = FirestoreConnectionSingleton.getInstance(); - this._configCollection = this._objectStore.getCollection([ - 'companies', - companyName, - 'config', - ]); + this._configCollection = this._objectStore.getCollection(['companies', companyName, 'config']); } /** @@ -54,11 +46,7 @@ export class ConfigDAO { config.insertTime = DateUtils.generateDateString(true); if (config.validateConfig()) { resolve( - this._objectStore.addDocumentIn( - this._configCollection, - config.toJson(), - `config_${config.version}` - ) + this._objectStore.addDocumentIn(this._configCollection, config.toJson(), `config_${config.version}`) ); } else { reject('Configuração inválida'); diff --git a/src/ts/models/DAO/ObjectStore.ts b/src/ts/models/DAO/ObjectStore.ts index 0b505575..82a4afcc 100644 --- a/src/ts/models/DAO/ObjectStore.ts +++ b/src/ts/models/DAO/ObjectStore.ts @@ -1,15 +1,9 @@ -import { - CollectionReference, - DocumentReference, - DocumentData, -} from '@google-cloud/firestore'; +import { CollectionReference, DocumentReference, DocumentData } from '@google-cloud/firestore'; export abstract class ObjectStore { abstract getCollection(path: string[]): CollectionReference; abstract getDocument(path: string[]): DocumentReference; - abstract getAllDocumentsFrom( - collection: CollectionReference - ): Promise; + abstract getAllDocumentsFrom(collection: CollectionReference): Promise; abstract addDocumentIn( collection: CollectionReference, document: { [key: string]: any }, diff --git a/src/ts/models/DependencyConfig.ts b/src/ts/models/DependencyConfig.ts index 07ff717b..638858b9 100644 --- a/src/ts/models/DependencyConfig.ts +++ b/src/ts/models/DependencyConfig.ts @@ -12,13 +12,7 @@ export class DependencyConfig { columnDestiny: string; matches: string[]; }) { - const { - columnReference, - hasMatch, - matches, - valuesReference, - columnDestiny, - } = dependencyConfig; + const { columnReference, hasMatch, matches, valuesReference, columnDestiny } = dependencyConfig; this._columnReference = columnReference; this._hasMatch = hasMatch; this._matches = matches; diff --git a/src/ts/models/FacebookAds.ts b/src/ts/models/FacebookAds.ts index bdc56410..fd81d432 100644 --- a/src/ts/models/FacebookAds.ts +++ b/src/ts/models/FacebookAds.ts @@ -2,7 +2,7 @@ import { StringUtils } from '../utils/StringUtils'; import { Config } from './Config'; import { Vehicle } from './Vehicle'; -/** +/* params: { 'Url': 'www.teste.com.br', 'Tipo de Compra': 'cpc', @@ -46,8 +46,7 @@ export class FacebookAds extends Vehicle { private _hasUndefinedParameterError = false; private _validationErrorMessage = 'Parâmetros incorretos: '; private _errorFacebookParams: { [key: string]: string[] } = {}; - private _undefinedParameterErrorMessage = - 'Parâmetro(s) não encontrado(s) na configuração: '; + private _undefinedParameterErrorMessage = 'Parâmetro(s) não encontrado(s) na configuração: '; private _undefinedParameterErrorFields: { [key: string]: string[] } = {}; /** @@ -84,64 +83,35 @@ export class FacebookAds extends Vehicle { const columnFields: string[] = []; this._errorFacebookParams[facebookParam] = []; this._undefinedParameterErrorFields[facebookParam] = []; - facebookadsConfig[facebookParam].forEach( - (column: string) => { - if (!this.config.validationRules[column]) { - this._hasUndefinedParameterError = true; - this._undefinedParameterErrorFields[ - facebookParam - ].push(column); - this._facebookParams[facebookParam] = ''; + facebookadsConfig[facebookParam].forEach((column: string) => { + if (!this.config.validationRules[column]) { + this._hasUndefinedParameterError = true; + this._undefinedParameterErrorFields[facebookParam].push(column); + this._facebookParams[facebookParam] = ''; + } else { + const normalizedColumn = StringUtils.normalize(column); + if (!this.config.validateField(this.csvLine, column, this.csvLine[normalizedColumn])) { + this._hasValidationError = true; + this._errorFacebookParams[facebookParam].push(column); } else { - const normalizedColumn = StringUtils.normalize( - column + columnFields.push( + StringUtils.replaceWhiteSpace( + this.csvLine[normalizedColumn], + this.config.spaceSeparator + ).toLocaleLowerCase() ); - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[normalizedColumn] - ) - ) { - this._hasValidationError = true; - this._errorFacebookParams[ - facebookParam - ].push(column); - } else { - columnFields.push( - StringUtils.replaceWhiteSpace( - this.csvLine[normalizedColumn], - this.config.spaceSeparator - ).toLocaleLowerCase() - ); - } - } - if ( - this._errorFacebookParams[facebookParam] - .length > 0 - ) { - this._facebookParams[facebookParam] = - this._validationErrorMessage + - this._errorFacebookParams[ - facebookParam - ].join(' - '); - } else if ( - this._undefinedParameterErrorFields[ - facebookParam - ].length > 0 - ) { - this._facebookParams[facebookParam] = - this._undefinedParameterErrorMessage + - this._undefinedParameterErrorFields[ - facebookParam - ].join(' = '); - } else { - this._facebookParams[ - facebookParam - ] = columnFields.join(this.config.separator); } } - ); + if (this._errorFacebookParams[facebookParam].length > 0) { + this._facebookParams[facebookParam] = + this._validationErrorMessage + this._errorFacebookParams[facebookParam].join(' - '); + } else if (this._undefinedParameterErrorFields[facebookParam].length > 0) { + this._facebookParams[facebookParam] = + this._undefinedParameterErrorMessage + this._undefinedParameterErrorFields[facebookParam].join(' = '); + } else { + this._facebookParams[facebookParam] = columnFields.join(this.config.separator); + } + }); } }); } diff --git a/src/ts/models/GA.ts b/src/ts/models/GA.ts index c32ab9a5..e877eaa8 100644 --- a/src/ts/models/GA.ts +++ b/src/ts/models/GA.ts @@ -2,7 +2,7 @@ import { StringUtils } from '../utils/StringUtils'; import { Config } from './Config'; import { AnalyticsTool } from './AnalyticsTool'; -/** +/* csvLine: { 'Url': 'www.teste.com.br', 'Tipo de Compra': 'cpc', @@ -44,8 +44,7 @@ export class GA extends AnalyticsTool { this._hasValidationError[utm] = false; this._hasUndefinedParameterError[utm] = false; this._validationErrorMessage[utm] = 'Parâmetros incorretos:'; - this._undefinedParameterErroMessage[utm] = - 'Parâmetros não encontrados:'; + this._undefinedParameterErroMessage[utm] = 'Parâmetros não encontrados:'; }); this._utms = this._buildUtms(); this.url = this._buildUrl(); @@ -55,10 +54,7 @@ export class GA extends AnalyticsTool { * Retorna se houve erro na geração dos utms */ private _hasErrorAtUtm(utm: string): boolean { - return ( - this._hasUndefinedParameterError[utm] || - this._hasValidationError[utm] - ); + return this._hasUndefinedParameterError[utm] || this._hasValidationError[utm]; } /** @@ -67,9 +63,7 @@ export class GA extends AnalyticsTool { private _errorMessageAtUtm(utm: string): string { const errorMessages = []; if (this._hasUndefinedParameterError[utm]) { - errorMessages.push( - this._undefinedParameterErroMessage[utm].slice(0, -2) - ); + errorMessages.push(this._undefinedParameterErroMessage[utm].slice(0, -2)); } if (this._hasValidationError[utm]) { errorMessages.push(this._validationErrorMessage[utm].slice(0, -2)); @@ -96,15 +90,11 @@ export class GA extends AnalyticsTool { public buildedLine(): { [key: string]: any } { const utms: { [key: string]: string } = {}; Object.keys(this._utms).map((utm) => { - utms[utm] = this._hasErrorAtUtm(utm) - ? this._errorMessageAtUtm(utm) - : this._utms[utm]; + utms[utm] = this._hasErrorAtUtm(utm) ? this._errorMessageAtUtm(utm) : this._utms[utm]; }); return { utms: utms, - 'url ga': this._hasAnyErrorAtUtms() - ? 'Corrija os parâmetros para gerar a URL' - : this.url, + 'url ga': this._hasAnyErrorAtUtms() ? 'Corrija os parâmetros para gerar a URL' : this.url, }; } @@ -122,13 +112,7 @@ export class GA extends AnalyticsTool { this._undefinedParameterErroMessage[utm] += ` ${column} -`; return; } - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[columnNormalized] - ) - ) { + if (!this.config.validateField(this.csvLine, column, this.csvLine[columnNormalized])) { this._hasValidationError[utm] = true; this._validationErrorMessage[utm] += ` ${column} -`; } diff --git a/src/ts/models/GeneralVehicle.ts b/src/ts/models/GeneralVehicle.ts index 323f3595..04d5388f 100644 --- a/src/ts/models/GeneralVehicle.ts +++ b/src/ts/models/GeneralVehicle.ts @@ -17,15 +17,10 @@ export class GeneralVehicle extends Vehicle { private _hasUndefinedParameterError = false; private _errorParams: { [key: string]: string[] } = {}; private _validationErrorMessage = 'Parâmetro(s) incorreto(s): '; - private _undefinedParameterErrorMessage = - 'Parâmetro(s) não encontrado(s) na configuração: '; + private _undefinedParameterErrorMessage = 'Parâmetro(s) não encontrado(s) na configuração: '; private _undefinedParameterErrorFields: { [key: string]: string[] } = {}; - constructor( - csvLine: { [key: string]: string }, - config: Config, - vehicleName: string - ) { + constructor(csvLine: { [key: string]: string }, config: Config, vehicleName: string) { super(csvLine, config); this._vehicleName = vehicleName; this._buildGeneralParams(); @@ -43,21 +38,13 @@ export class GeneralVehicle extends Vehicle { this._params[param] = ''; this._errorParams[param] = []; this._undefinedParameterErrorFields[param] = []; - const csvColumns: string[] = this.config.medias[this._vehicleName][ - param - ]; + const csvColumns: string[] = this.config.medias[this._vehicleName][param]; csvColumns.forEach((csvColumn) => { if (!this.config.existsColumn(csvColumn)) { this._undefinedParameterFounded(param, csvColumn); } else { const normalizedColumn = StringUtils.normalize(csvColumn); - if ( - !this.config.validateField( - this.csvLine, - csvColumn, - this.csvLine[normalizedColumn] - ) - ) { + if (!this.config.validateField(this.csvLine, csvColumn, this.csvLine[normalizedColumn])) { this._validationErrorFounded(param, csvColumn); } else { this._params[param] += `${StringUtils.replaceWhiteSpace( @@ -68,13 +55,10 @@ export class GeneralVehicle extends Vehicle { } }); if (this._hasValidationError) { - this._params[param] = - this._validationErrorMessage + - this._errorParams[param].join(' - '); + this._params[param] = this._validationErrorMessage + this._errorParams[param].join(' - '); } else if (this._hasUndefinedParameterError) { this._params[param] = - this._undefinedParameterErrorMessage + - this._undefinedParameterErrorFields[param].join(' - '); + this._undefinedParameterErrorMessage + this._undefinedParameterErrorFields[param].join(' - '); } else { this._params[param] = this._params[param].slice(0, -1); } diff --git a/src/ts/models/GoogleAds.ts b/src/ts/models/GoogleAds.ts index cedbb960..5239a120 100644 --- a/src/ts/models/GoogleAds.ts +++ b/src/ts/models/GoogleAds.ts @@ -2,7 +2,7 @@ import { StringUtils } from '../utils/StringUtils'; import { Config } from './Config'; import { Vehicle } from './Vehicle'; -/** +/* params: { 'Url': 'www.teste.com.br', 'Tipo de Compra': 'cpc', @@ -50,10 +50,8 @@ export class GoogleAds extends Vehicle { Object.keys(this.config.medias.googleads).map((adsParam) => { this._hasValidationError[adsParam] = false; this._hasUndefinedParameterError[adsParam] = false; - this._validationErrorMessage[adsParam] = - 'Parâmetro(s) incorreto(s): '; - this._undefinedParameterErrorMessage[adsParam] = - 'Parâmetro(s) não encontrado(s): '; + this._validationErrorMessage[adsParam] = 'Parâmetro(s) incorreto(s): '; + this._undefinedParameterErrorMessage[adsParam] = 'Parâmetro(s) não encontrado(s): '; }); this._buildAdsParams(); } @@ -80,31 +78,19 @@ export class GoogleAds extends Vehicle { this._adsParams[googleAdsParam] = ''; this._errorAdsParams[googleAdsParam] = []; this._undefinedParameterErrorFields[googleAdsParam] = []; - const fields: string[] = this.config.medias.googleads[ - googleAdsParam - ]; + const fields: string[] = this.config.medias.googleads[googleAdsParam]; fields.forEach((column: string) => { if (!this.config.validationRules[column]) { this._hasUndefinedParameterError[googleAdsParam] = true; - this._undefinedParameterErrorFields[googleAdsParam].push( - column - ); + this._undefinedParameterErrorFields[googleAdsParam].push(column); } else { const normalizedColumn = StringUtils.normalize(column); //TODO testar caso a coluna não existir no csv - if ( - !this.config.validateField( - this.csvLine, - column, - this.csvLine[normalizedColumn] - ) - ) { + if (!this.config.validateField(this.csvLine, column, this.csvLine[normalizedColumn])) { this._hasValidationError[googleAdsParam] = true; this._errorAdsParams[googleAdsParam].push(column); } else { - this._adsParams[ - googleAdsParam - ] += `${StringUtils.replaceWhiteSpace( + this._adsParams[googleAdsParam] += `${StringUtils.replaceWhiteSpace( this.csvLine[normalizedColumn], this.config.spaceSeparator ).toLowerCase()}${this.config.separator}`; @@ -113,18 +99,13 @@ export class GoogleAds extends Vehicle { }); if (this._hasValidationError[googleAdsParam]) { this._adsParams[googleAdsParam] = - this._validationErrorMessage[googleAdsParam] + - this._errorAdsParams[googleAdsParam].join(' - '); + this._validationErrorMessage[googleAdsParam] + this._errorAdsParams[googleAdsParam].join(' - '); } else if (this._hasUndefinedParameterError[googleAdsParam]) { this._adsParams[googleAdsParam] = this._undefinedParameterErrorMessage[googleAdsParam] + - this._undefinedParameterErrorFields[googleAdsParam].join( - ' - ' - ); + this._undefinedParameterErrorFields[googleAdsParam].join(' - '); } else { - this._adsParams[googleAdsParam] = this._adsParams[ - googleAdsParam - ].slice(0, -1); + this._adsParams[googleAdsParam] = this._adsParams[googleAdsParam].slice(0, -1); } }); } diff --git a/src/ts/models/RoutesPermission.ts b/src/ts/models/RoutesPermission.ts index cfba821e..d4d3ce9c 100644 --- a/src/ts/models/RoutesPermission.ts +++ b/src/ts/models/RoutesPermission.ts @@ -11,26 +11,12 @@ export class RoutesPermission { public validatePermission(auth: Auth): boolean { const agencyPostRoutes = ['/build/.*', '/csv']; - const agencyGetRoutes = [ - '/config', - '/template', - '/csv/list', - '/csv', - '/user', - ]; + const agencyGetRoutes = ['/config', '/template', '/csv/list', '/csv', '/user']; if (auth.permission === 'user') { if (this._method === 'POST') { - return ( - agencyPostRoutes.filter((route) => - new RegExp(route).test(this._route) - ).length > 0 - ); + return agencyPostRoutes.filter((route) => new RegExp(route).test(this._route)).length > 0; } else if (this._method === 'GET') { - return ( - agencyGetRoutes.filter((route) => - new RegExp(route).test(this._route) - ).length > 0 - ); + return agencyGetRoutes.filter((route) => new RegExp(route).test(this._route)).length > 0; } else { return false; } diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index 70a45984..292b2220 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -1,9 +1,4 @@ -import { - CollectionReference, - DocumentReference, - Firestore, - DocumentData, -} from '@google-cloud/firestore'; +import { CollectionReference, DocumentReference, Firestore, DocumentData } from '@google-cloud/firestore'; import { ObjectStore } from '../DAO/ObjectStore'; export class FirestoreConnectionSingleton extends ObjectStore { @@ -72,9 +67,7 @@ export class FirestoreConnectionSingleton extends ObjectStore { * Pega todos os documentos de uma coleção * @param collection Coleção contendo os documentos desejados */ - public getAllDocumentsFrom( - collection: CollectionReference - ): Promise { + public getAllDocumentsFrom(collection: CollectionReference): Promise { return new Promise((resolve, reject) => { collection .get() diff --git a/src/ts/models/cloud/LoggingSingleton.ts b/src/ts/models/cloud/LoggingSingleton.ts index c38ae7c2..11a7345d 100644 --- a/src/ts/models/cloud/LoggingSingleton.ts +++ b/src/ts/models/cloud/LoggingSingleton.ts @@ -18,10 +18,7 @@ export class LoggingSingleton extends Log { if (!LoggingSingleton._infoInstance) { LoggingSingleton._infoInstance = bunyan.createLogger({ name: LoggingSingleton._loggerName, - streams: [ - { stream: process.stdout, level: 'info' }, - this._loggingBunyan.stream('info'), - ], + streams: [{ stream: process.stdout, level: 'info' }, this._loggingBunyan.stream('info')], }); } LoggingSingleton._infoInstance.info(message); @@ -31,10 +28,7 @@ export class LoggingSingleton extends Log { if (!LoggingSingleton._errorInstance) { LoggingSingleton._errorInstance = bunyan.createLogger({ name: LoggingSingleton._loggerName, - streams: [ - { stream: process.stdout, level: 'error' }, - this._loggingBunyan.stream('error'), - ], + streams: [{ stream: process.stdout, level: 'error' }, this._loggingBunyan.stream('error')], }); } LoggingSingleton._errorInstance.info(message); @@ -44,10 +38,7 @@ export class LoggingSingleton extends Log { if (!LoggingSingleton._warningInstance) { LoggingSingleton._warningInstance = bunyan.createLogger({ name: LoggingSingleton._loggerName, - streams: [ - { stream: process.stdout, level: 'warn' }, - this._loggingBunyan.stream('warn'), - ], + streams: [{ stream: process.stdout, level: 'warn' }, this._loggingBunyan.stream('warn')], }); } LoggingSingleton._warningInstance.info(message); diff --git a/src/ts/routes/build.ts b/src/ts/routes/build.ts index cd011a7e..7cabca34 100644 --- a/src/ts/routes/build.ts +++ b/src/ts/routes/build.ts @@ -7,87 +7,71 @@ import { Builder } from '../controllers/Builder'; import * as converter from 'json-2-csv'; const build = (app: { [key: string]: any }): void => { - app.post( - '/build/:media', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const media = req.params.media; - const company = req.company; - const agency = req.agency; - if (!req.files.data) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); - return; - } + app.post('/build/:media', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const media = req.params.media; + const company = req.company; + const agency = req.agency; + if (!req.files.data) { + res.status(400).send({ + message: 'Nenhum arquivo foi enviado!', + }); + return; + } - const fileContent = req.files.data.data; - const filePath = `${agency}/${DateUtils.generateDateString()}.csv`; + const fileContent = req.files.data.data; + const filePath = `${agency}/${DateUtils.generateDateString()}.csv`; - let companyConfig: Config; + let companyConfig: Config; - const configDAO = new ConfigDAO(company); - configDAO - .getLastConfig() - .then((config) => { - if (config) { - companyConfig = config; - if (!companyConfig.toJson()[media]) { - res.status(400).send({ - message: `Mídia ${media} não configurada!`, - }); - return; - } - const fileDAO = new FileDAO(); - fileDAO.file = fileContent; - return fileDAO.save(filePath); - } else { - res.status(400).send( - 'Nenhuma configuração encontrada!' - ); + const configDAO = new ConfigDAO(company); + configDAO + .getLastConfig() + .then((config) => { + if (config) { + companyConfig = config; + if (!companyConfig.toJson()[media]) { + res.status(400).send({ + message: `Mídia ${media} não configurada!`, + }); return; } - }) - .then(() => { - const jsonFromFile = CsvUtils.csv2json( - fileContent.toString(), - companyConfig.csvSeparator - ); - const jsonParameterized = new Builder( - jsonFromFile, - companyConfig, - media - ).build(); - const configVersion = companyConfig.version; - const configTimestamp = DateUtils.newDateStringFormat( - companyConfig.insertTime, - 'yyyymmddhhMMss', - 'hh:MM:ss dd/mm/yyyy' - ); - converter.json2csv( - jsonParameterized, - (err, csv) => { - csv += '\n\nConfiguracao versao;' + configVersion; - csv += - '\nConfiguracao inserida em;' + configTimestamp; - res.setHeader( - 'Content-disposition', - 'attachment; filename=data.csv' - ); - res.set('Content-Type', 'text/csv; charset=utf-8'); - res.status(200).send(csv); + const fileDAO = new FileDAO(); + fileDAO.file = fileContent; + return fileDAO.save(filePath); + } else { + res.status(400).send('Nenhuma configuração encontrada!'); + return; + } + }) + .then(() => { + const jsonFromFile = CsvUtils.csv2json(fileContent.toString(), companyConfig.csvSeparator); + const jsonParameterized = new Builder(jsonFromFile, companyConfig, media).build(); + const configVersion = companyConfig.version; + const configTimestamp = DateUtils.newDateStringFormat( + companyConfig.insertTime, + 'yyyymmddhhMMss', + 'hh:MM:ss dd/mm/yyyy' + ); + converter.json2csv( + jsonParameterized, + (err, csv) => { + csv += '\n\nConfiguracao versao;' + configVersion; + csv += '\nConfiguracao inserida em;' + configTimestamp; + res.setHeader('Content-disposition', 'attachment; filename=data.csv'); + res.set('Content-Type', 'text/csv; charset=utf-8'); + res.status(200).send(csv); + }, + { + delimiter: { + field: companyConfig.csvSeparator, }, - { - delimiter: { - field: companyConfig.csvSeparator, - }, - } - ); - }) - .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); - }); - } - ); + } + ); + }) + .catch((err) => { + res.status(500).send('Falha ao salvar arquivo!'); + }); + }); }; export default build; diff --git a/src/ts/routes/config.ts b/src/ts/routes/config.ts index 88e57da9..4c831e02 100644 --- a/src/ts/routes/config.ts +++ b/src/ts/routes/config.ts @@ -2,47 +2,41 @@ import { ConfigDAO } from '../models/DAO/ConfigDAO'; import { Config } from '../models/Config'; const config = (app: { [key: string]: any }): void => { - app.post( - '/config', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const company = req.company; - const configString = req.body.config; - if (!configString) { - res.status(400).send('Configuração não foi informada!'); - return; - } - const config = new Config(JSON.parse(configString)); - const configDAO = new ConfigDAO(company); - configDAO - .addConfig(config) - .then((data) => { - res.status(200).send('Configuração criada com sucesso!'); - }) - .catch((err) => { - res.status(500).send('Erro ao criar a configuração!'); - }); + app.post('/config', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const company = req.company; + const configString = req.body.config; + if (!configString) { + res.status(400).send('Configuração não foi informada!'); + return; } - ); + const config = new Config(JSON.parse(configString)); + const configDAO = new ConfigDAO(company); + configDAO + .addConfig(config) + .then((data) => { + res.status(200).send('Configuração criada com sucesso!'); + }) + .catch((err) => { + res.status(500).send('Erro ao criar a configuração!'); + }); + }); - app.get( - '/config', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const company = req.company; - const configDAO = new ConfigDAO(company); - configDAO - .getLastConfig() - .then((config) => { - if (config) { - res.status(200).send(config.toString()); - } else { - res.status(200).send('{}'); - } - }) - .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); - }); - } - ); + app.get('/config', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const company = req.company; + const configDAO = new ConfigDAO(company); + configDAO + .getLastConfig() + .then((config) => { + if (config) { + res.status(200).send(config.toString()); + } else { + res.status(200).send('{}'); + } + }) + .catch((err) => { + res.status(500).send('Erro ao recuperar configuração!'); + }); + }); }; export default config; diff --git a/src/ts/routes/csv.ts b/src/ts/routes/csv.ts index 1d49e4ee..8166af26 100644 --- a/src/ts/routes/csv.ts +++ b/src/ts/routes/csv.ts @@ -2,70 +2,57 @@ import { FileDAO } from '../models/DAO/FileDAO'; import { DateUtils } from '../utils/DateUtils'; const csv = (app: { [key: string]: any }): void => { - app.post( - '/csv', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const content = req.files.data.data; - const agency = req.agency; - const filePath = `${agency}/${DateUtils.generateDateString()}.csv`; - const fileDAO = new FileDAO(); - fileDAO.file = content; - fileDAO - .save(filePath) - .then(() => { - res.status(200).send('Arquivo salvo com sucesso!'); - }) - .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); - }); - } - ); + app.post('/csv', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const content = req.files.data.data; + const agency = req.agency; + const filePath = `${agency}/${DateUtils.generateDateString()}.csv`; + const fileDAO = new FileDAO(); + fileDAO.file = content; + fileDAO + .save(filePath) + .then(() => { + res.status(200).send('Arquivo salvo com sucesso!'); + }) + .catch((err) => { + res.status(500).send('Falha ao salvar arquivo!'); + }); + }); - app.get( - '/csv', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const fileName = req.headers.file; - const agency = req.agency; - if (!fileName) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); - return; - } - const filePath = `${agency}/${fileName}.csv`; - const fileDAO = new FileDAO(); - fileDAO - .getFromStore(filePath) - .then((data) => { - // const dataFormated = data[0].toString("utf8"); - res.status(200).send(data.toString()); - }) - .catch((err) => { - res.status(500).send( - `Falha ao restaurar o arquivo ${fileName}!` - ); - }); + app.get('/csv', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const fileName = req.headers.file; + const agency = req.agency; + if (!fileName) { + res.status(400).send({ + message: 'Nenhum arquivo foi enviado!', + }); + return; } - ); + const filePath = `${agency}/${fileName}.csv`; + const fileDAO = new FileDAO(); + fileDAO + .getFromStore(filePath) + .then((data) => { + // const dataFormated = data[0].toString("utf8"); + res.status(200).send(data.toString()); + }) + .catch((err) => { + res.status(500).send(`Falha ao restaurar o arquivo ${fileName}!`); + }); + }); - app.get( - '/csv/list', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const agency = req.agency; - const fileDAO = new FileDAO(); - fileDAO - .getAllFilesFromStore(agency) - .then((data) => { - const files = data[0] - .filter((file) => /\.csv$/.test(file.name)) - .map((file) => file.name); - res.status(200).send(files); - }) - .catch((err) => { - res.status(500).send(`Falha ao restaurar os arquivos!`); - }); - } - ); + app.get('/csv/list', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const agency = req.agency; + const fileDAO = new FileDAO(); + fileDAO + .getAllFilesFromStore(agency) + .then((data) => { + const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); + res.status(200).send(files); + }) + .catch((err) => { + res.status(500).send(`Falha ao restaurar os arquivos!`); + }); + }); }; export default csv; diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 8c0818aa..1e337cfd 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -1,37 +1,32 @@ import { AuthDAO } from '../models/DAO/AuthDAO'; const register = (app: { [key: string]: any }): void => { - app.post( - '/register', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const agency = req.headers.agency; - const company = req.company; - const token = req.headers.token; - const permission = req.headers.permission; - if ((!agency && permission === 'user') || !company || !permission) { - res.status(400).send({ message: 'Parâmetros incorretos!' }); - return; - } - const jsonPermission: { [key: string]: string } = { - permission, - }; - jsonPermission.company = company; - if (permission === 'user') { - jsonPermission.agency = agency; - } - const authDAO = new AuthDAO(token); - authDAO - .addAuth(jsonPermission) - .then((token) => { - res.status(200).send( - `Permissão adicionada para a empresa ${company}, token: ${token}` - ); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); + app.post('/register', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const agency = req.headers.agency; + const company = req.company; + const token = req.headers.token; + const permission = req.headers.permission; + if ((!agency && permission === 'user') || !company || !permission) { + res.status(400).send({ message: 'Parâmetros incorretos!' }); + return; } - ); + const jsonPermission: { [key: string]: string } = { + permission, + }; + jsonPermission.company = company; + if (permission === 'user') { + jsonPermission.agency = agency; + } + const authDAO = new AuthDAO(token); + authDAO + .addAuth(jsonPermission) + .then((token) => { + res.status(200).send(`Permissão adicionada para a empresa ${company}, token: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + }); }; export default register; diff --git a/src/ts/routes/template.ts b/src/ts/routes/template.ts index 66da0d11..c593f4ed 100644 --- a/src/ts/routes/template.ts +++ b/src/ts/routes/template.ts @@ -1,30 +1,24 @@ import { ConfigDAO } from '../models/DAO/ConfigDAO'; const template = (app: { [key: string]: any }): void => { - app.get( - '/template', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const company = req.company; - const configDAO = new ConfigDAO(company); - configDAO - .getLastConfig() - .then((config) => { - res.setHeader( - 'Content-disposition', - 'attachment; filename=template.csv' - ); - res.set('Content-Type', 'text/csv; charset=utf-8'); - if (config) { - res.status(200).send(config.toCsvTemplate()); - } else { - res.status(200).send('{}'); - } - }) - .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); - }); - } - ); + app.get('/template', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const company = req.company; + const configDAO = new ConfigDAO(company); + configDAO + .getLastConfig() + .then((config) => { + res.setHeader('Content-disposition', 'attachment; filename=template.csv'); + res.set('Content-Type', 'text/csv; charset=utf-8'); + if (config) { + res.status(200).send(config.toCsvTemplate()); + } else { + res.status(200).send('{}'); + } + }) + .catch((err) => { + res.status(500).send('Erro ao recuperar configuração!'); + }); + }); }; export default template; diff --git a/src/ts/routes/user.ts b/src/ts/routes/user.ts index cd8a0608..5c07520d 100644 --- a/src/ts/routes/user.ts +++ b/src/ts/routes/user.ts @@ -1,23 +1,20 @@ import { AuthDAO } from '../models/DAO/AuthDAO'; const user = (app: { [key: string]: any }): void => { - app.get( - '/user', - (req: { [key: string]: any }, res: { [key: string]: any }) => { - new AuthDAO(req.headers.token) - .getAuth() - .then((data) => { - if (data) { - res.status(200).send(JSON.stringify(data.toJson())); - } else { - res.status(200).send(JSON.stringify('{}')); - } - }) - .catch((err) => { - res.status(500).send('Falha ao recuperar o usuário!'); - }); - } - ); + app.get('/user', (req: { [key: string]: any }, res: { [key: string]: any }) => { + new AuthDAO(req.headers.token) + .getAuth() + .then((data) => { + if (data) { + res.status(200).send(JSON.stringify(data.toJson())); + } else { + res.status(200).send(JSON.stringify('{}')); + } + }) + .catch((err) => { + res.status(500).send('Falha ao recuperar o usuário!'); + }); + }); }; export default user; diff --git a/src/ts/utils/CsvUtils.ts b/src/ts/utils/CsvUtils.ts index fc18af05..e860476b 100644 --- a/src/ts/utils/CsvUtils.ts +++ b/src/ts/utils/CsvUtils.ts @@ -15,11 +15,7 @@ export class CsvUtils { * @param lineOfCsv linha do csv no padrão {coluna: valor} */ static isLineEmpty(lineOfCsv: { [key: string]: string }): boolean { - return ( - Object.keys(lineOfCsv).filter( - (column) => lineOfCsv[column].trim() !== '' - ).length === 0 - ); + return Object.keys(lineOfCsv).filter((column) => lineOfCsv[column].trim() !== '').length === 0; } /** @@ -30,13 +26,8 @@ export class CsvUtils { * * Função que converte uma string de um conteúdo CSV em um objeto JSON */ - static csv2json( - csvContent: string, - separator: string - ): { [key: string]: string }[] { - const linesOfCsv = csvContent - .split('\n') - .filter((line) => line.trim() !== ''); + static csv2json(csvContent: string, separator: string): { [key: string]: string }[] { + const linesOfCsv = csvContent.split('\n').filter((line) => line.trim() !== ''); if (this.isCsvEmpty(linesOfCsv)) return []; diff --git a/src/ts/utils/DateUtils.ts b/src/ts/utils/DateUtils.ts index f3106c6d..4a2cbdfb 100644 --- a/src/ts/utils/DateUtils.ts +++ b/src/ts/utils/DateUtils.ts @@ -16,11 +16,7 @@ export class DateUtils { * O caracter deve ser repetido de acordo com quantos caracteres representam aquela informação * Exemplo: 30/12/2020 Padrão da string: dd/mm/yyyy */ - static newDateStringFormat( - stringDate: string, - oldFormat: string, - newFormat: string - ): string { + static newDateStringFormat(stringDate: string, oldFormat: string, newFormat: string): string { let second = ''; let minute = ''; let hour = ''; @@ -72,8 +68,6 @@ export class DateUtils { hh = date.getHours().toString().padStart(2, '0'), min = date.getMinutes().toString().padStart(2, '0'), ss = date.getSeconds().toString().padStart(2, '0'); - return seconds - ? `${date.getFullYear()}${mm}${dd}${hh}${min}${ss}` - : `${date.getFullYear()}${mm}${dd}${hh}${min}`; + return seconds ? `${date.getFullYear()}${mm}${dd}${hh}${min}${ss}` : `${date.getFullYear()}${mm}${dd}${hh}${min}`; } } diff --git a/src/ts/utils/JsonUtils.ts b/src/ts/utils/JsonUtils.ts index 5ef30003..2d888001 100644 --- a/src/ts/utils/JsonUtils.ts +++ b/src/ts/utils/JsonUtils.ts @@ -16,14 +16,8 @@ export class JsonUtils { const jsonNormalized: { [key: string]: any } = {}; Object.keys(json).map((key) => { jsonNormalized[StringUtils.normalize(key)] = json[key]; - if ( - this._keyValueIsAnObject( - jsonNormalized[StringUtils.normalize(key)] - ) - ) { - jsonNormalized[StringUtils.normalize(key)] = this.normalizeKeys( - jsonNormalized[StringUtils.normalize(key)] - ); + if (this._keyValueIsAnObject(jsonNormalized[StringUtils.normalize(key)])) { + jsonNormalized[StringUtils.normalize(key)] = this.normalizeKeys(jsonNormalized[StringUtils.normalize(key)]); } }); return jsonNormalized; diff --git a/src/ts/utils/StringUtils.ts b/src/ts/utils/StringUtils.ts index 92b8a0b5..53928727 100644 --- a/src/ts/utils/StringUtils.ts +++ b/src/ts/utils/StringUtils.ts @@ -52,11 +52,7 @@ export class StringUtils { * Dado um array com strings ou padrões de regex, verifica se a string passada é exatamente igual a alguma string contida no array, * ou se corresponde a alguma regex presente no array */ - static validateString( - stringToValidate: string, - rules: string[], - separator = ' ' - ): boolean { + static validateString(stringToValidate: string, rules: string[], separator = ' '): boolean { const validate: [boolean] = [false]; rules.forEach((rule) => { if (this._isStringForRegex(rule)) { @@ -66,11 +62,7 @@ export class StringUtils { } else { //String validate.push( - stringToValidate.toLocaleLowerCase() === - this.replaceWhiteSpace( - rule.toLocaleLowerCase(), - separator - ) + stringToValidate.toLocaleLowerCase() === this.replaceWhiteSpace(rule.toLocaleLowerCase(), separator) ); } }); diff --git a/tsconfig.json b/tsconfig.json index 6608f779..dce564b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES6", - "outDir": "src/js", + "outDir": "dist/", "noEmitOnError": true, "noImplicitAny": true, "module": "CommonJS", From 37e66fc8ca749e666c51aaf2593ec853ec90ca6f Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Thu, 29 Apr 2021 00:00:20 -0300 Subject: [PATCH 18/68] docs: :memo: Add Routes.md Adicao do arquivo Routes.md que explica o funcionamento das rotas da API --- Routes.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Routes.md diff --git a/Routes.md b/Routes.md new file mode 100644 index 00000000..36e62994 --- /dev/null +++ b/Routes.md @@ -0,0 +1,75 @@ +# API - Rotas + + + +## Dicionário de Parâmetros + +| Parâmetro | Header/Body | Tipo | Descrição | +| ---------- | ----------- | ------ | ------------------------------------------------------------ | +| token | Header | String | Token de permissão do usuário | +| agency | Header | String | Agência do usuário | +| company | Header | String | Empresa proprietária do adinfo | +| permission | Header | String | Nível de permissão do usuário, podendo ser: **user**, **admin** ou **owner** | +| data | Body | File | Arquivo CSV | +| file | Header | String | Nome do arquivo salvo no banco de arquivos (não informar a extensão) | +| config | Body | String | String correspondente ao JSON de configuração | + + + +## Rotas + +### (GET) /user + +**Parâmetros**: token + +**Descrição**: Recupera os dados do usuários(agência, nível de permissão e empresa) por meio do token informado. + +### (GET) /template + +**Parâmetros**: token + +**Descrição**: Retorna um CSV com as colunas a serem preenchidas, baseando-se no campo **columns** (colunas) da configuração. + +### (POST) /register + +**Parâmetros**: token, agency, permission, company. + +**Restrição**: Apenas tokens de usuários com nível de permissão **adm** ou **owner** podem acessar esta rota. + +**Descrição**: Cria um novo usuário da API de acordo com os parâmetros de: **agency**, **company** e **permission** informados, e retorna um o tkoen de acesso do novo usuário. Caso o nível de permissão informado para o novo usuário seja **admin**, não é necessário informar o parâmetro **agency**. + +### (POST) /csv + +**Parâmetros**: token, data. + +**Descrição**: Armazena o arquivo CSV passado no data no banco arquivos. + +### (GET) /csv + +**Parâmetros**: token, file. + +**Descrição**: Recupera o arquivo CSV especificado no parâmetro **file**. + +### (GET) /csv/list + +**Parâmetros**: token. + +**Descrição**: Retorna uma lista de todos os CSVs disponíveis no banco de arquivos, exibindo apenas os CSVs enviados pela agência do usuário solicitante. + +### (POST) /config + +**Parâmetros**: token, config. + +**Descrição**: Cria uma nova versão da configuração, de acordo com o parâmetro **config** informado. + +### (GET) /config + +**Parâmetros**: token. + +**Descrição**: Retorna o JSON referente a configuração atual. + +### (POST) /build/:media + +**Parâmetros**: token, data. + +**Descrição**: Armazena o arquivo passado no parâmetro **data** no banco de arquivos e retorna um CSV com os campos de parametrização preenchidos, de acordo com a mídia informada na variável **:media**. \ No newline at end of file From 6a3f5113f1d014d3f5bda5b0ac58d325ce5f1326 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Thu, 29 Apr 2021 17:35:20 -0300 Subject: [PATCH 19/68] feat: :sparkles: Insercao da campanha Salvamento dos arquivos e listagem dos CSVs com base na campanha informada --- dist/app.js | 2 +- dist/models/DAO/FileDAO.js | 4 +- .../cloud/FirestoreConnectionSingleton.js | 2 +- .../cloud/StorageConnectionSingleton.js | 4 +- dist/routes/build.js | 9 ++++- dist/routes/csv.js | 28 ++++++++++++-- src/ts/app.ts | 2 +- src/ts/models/DAO/FileDAO.ts | 4 +- .../cloud/FirestoreConnectionSingleton.ts | 2 +- .../cloud/StorageConnectionSingleton.ts | 4 +- src/ts/routes/build.ts | 9 ++++- src/ts/routes/csv.ts | 37 +++++++++++++++++-- 12 files changed, 87 insertions(+), 20 deletions(-) diff --git a/dist/app.js b/dist/app.js index 6f7425d2..25c7ea32 100644 --- a/dist/app.js +++ b/dist/app.js @@ -38,7 +38,7 @@ const fileUpload = require('express-fileupload'); const routes_1 = require('./routes/routes'); const dotenv_1 = require('dotenv'); const AuthDAO_1 = require('./models/DAO/AuthDAO'); -dotenv_1.config({ path: __dirname + '/../../.env' }); +dotenv_1.config({ path: __dirname + '/../.env' }); const app = express(); app.use( fileUpload({ diff --git a/dist/models/DAO/FileDAO.js b/dist/models/DAO/FileDAO.js index a9815d6b..7fb19855 100644 --- a/dist/models/DAO/FileDAO.js +++ b/dist/models/DAO/FileDAO.js @@ -18,8 +18,8 @@ class FileDAO { getFromStore(filePath) { return this._fileStore.getFile(filePath); } - getAllFilesFromStore(agency) { - return this._fileStore.getAllFiles(agency); + getAllFilesFromStore(path) { + return this._fileStore.getAllFiles(path); } } exports.FileDAO = FileDAO; diff --git a/dist/models/cloud/FirestoreConnectionSingleton.js b/dist/models/cloud/FirestoreConnectionSingleton.js index 5494ac87..4f510e2b 100644 --- a/dist/models/cloud/FirestoreConnectionSingleton.js +++ b/dist/models/cloud/FirestoreConnectionSingleton.js @@ -7,7 +7,7 @@ class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { constructor() { super(); if (process.env.DEVELOPMENT) { - const credentials = require('../../../../gcp_key.json'); + const credentials = require('../../../gcp_key.json'); this._db = new firestore_1.Firestore({ projectId: 'adinfo', credentials }); } else { this._db = new firestore_1.Firestore(); diff --git a/dist/models/cloud/StorageConnectionSingleton.js b/dist/models/cloud/StorageConnectionSingleton.js index 55164422..415304b2 100644 --- a/dist/models/cloud/StorageConnectionSingleton.js +++ b/dist/models/cloud/StorageConnectionSingleton.js @@ -8,7 +8,7 @@ class StorageConnectionSingleton extends FileStore_1.FileStore { super(); this._bucket = `adinfo-dp6-files`; if (process.env.DEVELOPMENT) { - const credentials = require('../../../../gcp_key.json'); + const credentials = require('../../../gcp_key.json'); this._db = new storage_1.Storage({ projectId: 'adinfo', credentials }); } else { this._db = new storage_1.Storage(); @@ -30,7 +30,7 @@ class StorageConnectionSingleton extends FileStore_1.FileStore { return destinationPath.download(); } getAllFiles(folder) { - return this._db.bucket(this._bucket).getFiles({ prefix: `${folder}/` }); + return this._db.bucket(this._bucket).getFiles({ prefix: folder }); } } exports.StorageConnectionSingleton = StorageConnectionSingleton; diff --git a/dist/routes/build.js b/dist/routes/build.js index 47c8fe2e..6bb33e3e 100644 --- a/dist/routes/build.js +++ b/dist/routes/build.js @@ -11,14 +11,21 @@ const build = (app) => { const media = req.params.media; const company = req.company; const agency = req.agency; + const campaign = req.headers.campaign; if (!req.files.data) { res.status(400).send({ message: 'Nenhum arquivo foi enviado!', }); return; + } else if (!campaign) { + res.status(400).send({ + message: 'Nenhuma campanha foi informada!', + }); } const fileContent = req.files.data.data; - const filePath = `${agency}/${DateUtils_1.DateUtils.generateDateString()}.csv`; + const filePath = agency + ? `${company}/${agency}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv` + : `${company}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv`; let companyConfig; const configDAO = new ConfigDAO_1.ConfigDAO(company); configDAO diff --git a/dist/routes/csv.js b/dist/routes/csv.js index 0d47a9fc..d5994fac 100644 --- a/dist/routes/csv.js +++ b/dist/routes/csv.js @@ -4,9 +4,18 @@ const FileDAO_1 = require('../models/DAO/FileDAO'); const DateUtils_1 = require('../utils/DateUtils'); const csv = (app) => { app.post('/csv', (req, res) => { + const campaign = req.headers.campaign; const content = req.files.data.data; const agency = req.agency; - const filePath = `${agency}/${DateUtils_1.DateUtils.generateDateString()}.csv`; + const company = req.company; + if (!campaign) { + res.status(400).send({ + message: 'Nenhuma campanha foi informada!', + }); + } + const filePath = agency + ? `${company}/${agency}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv` + : `${company}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv`; const fileDAO = new FileDAO_1.FileDAO(); fileDAO.file = content; fileDAO @@ -21,13 +30,21 @@ const csv = (app) => { app.get('/csv', (req, res) => { const fileName = req.headers.file; const agency = req.agency; + const campaign = req.headers.campaign; + const company = req.company; if (!fileName) { res.status(400).send({ message: 'Nenhum arquivo foi enviado!', }); return; + } else if (!campaign) { + res.status(400).send({ + message: 'Nenhuma campanha foi informada!', + }); } - const filePath = `${agency}/${fileName}.csv`; + const filePath = agency + ? `${company}/${agency}/${campaign}/${fileName}.csv` + : `${company}/${campaign}/${fileName}.csv`; const fileDAO = new FileDAO_1.FileDAO(); fileDAO .getFromStore(filePath) @@ -40,9 +57,14 @@ const csv = (app) => { }); app.get('/csv/list', (req, res) => { const agency = req.agency; + const company = req.company; + const campaign = req.headers.campaign; const fileDAO = new FileDAO_1.FileDAO(); + let filePath = `${company}/`; + if (agency) filePath += `${agency}/`; + if (campaign) filePath += `${campaign}/`; fileDAO - .getAllFilesFromStore(agency) + .getAllFilesFromStore(filePath) .then((data) => { const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); res.status(200).send(files); diff --git a/src/ts/app.ts b/src/ts/app.ts index 4e646ddf..17c1343d 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -7,7 +7,7 @@ import { config } from 'dotenv'; import { Auth } from './models/Auth'; import { AuthDAO } from './models/DAO/AuthDAO'; -config({ path: __dirname + '/../../.env' }); +config({ path: __dirname + '/../.env' }); const app = express(); diff --git a/src/ts/models/DAO/FileDAO.ts b/src/ts/models/DAO/FileDAO.ts index 72827f3d..8a2f2a7b 100644 --- a/src/ts/models/DAO/FileDAO.ts +++ b/src/ts/models/DAO/FileDAO.ts @@ -37,7 +37,7 @@ export class FileDAO { * Pegar todos os arquivos de uma agencia * @param agency nome da agencia */ - public getAllFilesFromStore(agency: string): Promise { - return this._fileStore.getAllFiles(agency); + public getAllFilesFromStore(path: string): Promise { + return this._fileStore.getAllFiles(path); } } diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index 292b2220..10b4eb4b 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -9,7 +9,7 @@ export class FirestoreConnectionSingleton extends ObjectStore { super(); if (process.env.DEVELOPMENT) { /* eslint-disable @typescript-eslint/no-var-requires */ - const credentials = require('../../../../gcp_key.json'); + const credentials = require('../../../gcp_key.json'); /* eslint-enable @typescript-eslint/no-var-requires */ this._db = new Firestore({ projectId: 'adinfo', credentials }); } else { diff --git a/src/ts/models/cloud/StorageConnectionSingleton.ts b/src/ts/models/cloud/StorageConnectionSingleton.ts index 3fad91a5..1530d11f 100644 --- a/src/ts/models/cloud/StorageConnectionSingleton.ts +++ b/src/ts/models/cloud/StorageConnectionSingleton.ts @@ -11,7 +11,7 @@ export class StorageConnectionSingleton extends FileStore { super(); if (process.env.DEVELOPMENT) { /* eslint-disable @typescript-eslint/no-var-requires */ - const credentials = require('../../../../gcp_key.json'); + const credentials = require('../../../gcp_key.json'); /* eslint-enable @typescript-eslint/no-var-requires */ this._db = new Storage({ projectId: 'adinfo', credentials }); } else { @@ -54,6 +54,6 @@ export class StorageConnectionSingleton extends FileStore { * @param folder pasta dos arquivos */ public getAllFiles(folder: string): Promise { - return this._db.bucket(this._bucket).getFiles({ prefix: `${folder}/` }); + return this._db.bucket(this._bucket).getFiles({ prefix: folder }); } } diff --git a/src/ts/routes/build.ts b/src/ts/routes/build.ts index 7cabca34..d06e2faf 100644 --- a/src/ts/routes/build.ts +++ b/src/ts/routes/build.ts @@ -11,15 +11,22 @@ const build = (app: { [key: string]: any }): void => { const media = req.params.media; const company = req.company; const agency = req.agency; + const campaign = req.headers.campaign; if (!req.files.data) { res.status(400).send({ message: 'Nenhum arquivo foi enviado!', }); return; + } else if (!campaign) { + res.status(400).send({ + message: 'Nenhuma campanha foi informada!', + }); } const fileContent = req.files.data.data; - const filePath = `${agency}/${DateUtils.generateDateString()}.csv`; + const filePath = agency + ? `${company}/${agency}/${campaign}/${DateUtils.generateDateString()}.csv` + : `${company}/${campaign}/${DateUtils.generateDateString()}.csv`; let companyConfig: Config; diff --git a/src/ts/routes/csv.ts b/src/ts/routes/csv.ts index 8166af26..307ef35a 100644 --- a/src/ts/routes/csv.ts +++ b/src/ts/routes/csv.ts @@ -3,9 +3,21 @@ import { DateUtils } from '../utils/DateUtils'; const csv = (app: { [key: string]: any }): void => { app.post('/csv', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const campaign = req.headers.campaign; const content = req.files.data.data; const agency = req.agency; - const filePath = `${agency}/${DateUtils.generateDateString()}.csv`; + const company = req.company; + + if (!campaign) { + res.status(400).send({ + message: 'Nenhuma campanha foi informada!', + }); + } + + const filePath = agency + ? `${company}/${agency}/${campaign}/${DateUtils.generateDateString()}.csv` + : `${company}/${campaign}/${DateUtils.generateDateString()}.csv`; + const fileDAO = new FileDAO(); fileDAO.file = content; fileDAO @@ -21,13 +33,24 @@ const csv = (app: { [key: string]: any }): void => { app.get('/csv', (req: { [key: string]: any }, res: { [key: string]: any }) => { const fileName = req.headers.file; const agency = req.agency; + const campaign = req.headers.campaign; + const company = req.company; + if (!fileName) { res.status(400).send({ message: 'Nenhum arquivo foi enviado!', }); return; + } else if (!campaign) { + res.status(400).send({ + message: 'Nenhuma campanha foi informada!', + }); } - const filePath = `${agency}/${fileName}.csv`; + + const filePath = agency + ? `${company}/${agency}/${campaign}/${fileName}.csv` + : `${company}/${campaign}/${fileName}.csv`; + const fileDAO = new FileDAO(); fileDAO .getFromStore(filePath) @@ -42,9 +65,17 @@ const csv = (app: { [key: string]: any }): void => { app.get('/csv/list', (req: { [key: string]: any }, res: { [key: string]: any }) => { const agency = req.agency; + const company = req.company; + const campaign = req.headers.campaign; const fileDAO = new FileDAO(); + + let filePath = `${company}/`; + + if (agency) filePath += `${agency}/`; + if (campaign) filePath += `${campaign}/`; + fileDAO - .getAllFilesFromStore(agency) + .getAllFilesFromStore(filePath) .then((data) => { const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); res.status(200).send(files); From 1caab967b25a32b1c21d994de57007d85fbd7113 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Thu, 29 Apr 2021 17:38:31 -0300 Subject: [PATCH 20/68] docs: :memo: Update Routes.md Inclusao do parametro campaign nas rotas documentadas do routes.md --- Routes.md | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/Routes.md b/Routes.md index 36e62994..031190fd 100644 --- a/Routes.md +++ b/Routes.md @@ -1,20 +1,17 @@ # API - Rotas - - ## Dicionário de Parâmetros -| Parâmetro | Header/Body | Tipo | Descrição | -| ---------- | ----------- | ------ | ------------------------------------------------------------ | -| token | Header | String | Token de permissão do usuário | -| agency | Header | String | Agência do usuário | -| company | Header | String | Empresa proprietária do adinfo | +| Parâmetro | Header/Body | Tipo | Descrição | +| ---------- | ----------- | ------ | ---------------------------------------------------------------------------- | +| token | Header | String | Token de permissão do usuário | +| agency | Header | String | Agência do usuário | +| company | Header | String | Empresa proprietária do adinfo | | permission | Header | String | Nível de permissão do usuário, podendo ser: **user**, **admin** ou **owner** | -| data | Body | File | Arquivo CSV | -| file | Header | String | Nome do arquivo salvo no banco de arquivos (não informar a extensão) | -| config | Body | String | String correspondente ao JSON de configuração | - - +| data | Body | File | Arquivo CSV | +| file | Header | String | Nome do arquivo salvo no banco de arquivos (não informar a extensão) | +| config | Body | String | String correspondente ao JSON de configuração | +| campaign | Header | String | Nome da campanha | ## Rotas @@ -22,7 +19,7 @@ **Parâmetros**: token -**Descrição**: Recupera os dados do usuários(agência, nível de permissão e empresa) por meio do token informado. +**Descrição**: Recupera os dados do usuários(agência, nível de permissão e empresa) por meio do token informado. ### (GET) /template @@ -40,19 +37,19 @@ ### (POST) /csv -**Parâmetros**: token, data. +**Parâmetros**: token, data, campaign. **Descrição**: Armazena o arquivo CSV passado no data no banco arquivos. ### (GET) /csv -**Parâmetros**: token, file. +**Parâmetros**: token, file, campaign. **Descrição**: Recupera o arquivo CSV especificado no parâmetro **file**. ### (GET) /csv/list -**Parâmetros**: token. +**Parâmetros**: token, campaign. **Descrição**: Retorna uma lista de todos os CSVs disponíveis no banco de arquivos, exibindo apenas os CSVs enviados pela agência do usuário solicitante. @@ -72,4 +69,4 @@ **Parâmetros**: token, data. -**Descrição**: Armazena o arquivo passado no parâmetro **data** no banco de arquivos e retorna um CSV com os campos de parametrização preenchidos, de acordo com a mídia informada na variável **:media**. \ No newline at end of file +**Descrição**: Armazena o arquivo passado no parâmetro **data** no banco de arquivos e retorna um CSV com os campos de parametrização preenchidos, de acordo com a mídia informada na variável **:media**. From 18cebe7e172122c51b24b5de9e8bb38dac6032cb Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Thu, 29 Apr 2021 20:06:00 -0300 Subject: [PATCH 21/68] fix: :lock: Exposicao do parametro campaign Exposicao do parametro campaign no header das requisicoes com o cors --- dist/app.js | 4 ++-- src/ts/app.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/app.js b/dist/app.js index 25c7ea32..c1b1d3e0 100644 --- a/dist/app.js +++ b/dist/app.js @@ -49,8 +49,8 @@ app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use( cors({ - allowedHeaders: ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config', 'permission'], - exposedHeaders: ['token', 'agency', 'company', 'file', 'data', 'config', 'permission'], + allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission'], + exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission'], origin: '*', methods: 'GET,POST', preflightContinue: false, diff --git a/src/ts/app.ts b/src/ts/app.ts index 17c1343d..86760fa8 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -22,8 +22,8 @@ app.use(bodyParser.json()); app.use( cors({ - allowedHeaders: ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config', 'permission'], - exposedHeaders: ['token', 'agency', 'company', 'file', 'data', 'config', 'permission'], + allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission'], + exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission'], origin: '*', methods: 'GET,POST', preflightContinue: false, From 43db85c47244e422e9b9d33f4733bd5c3b832756 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Thu, 29 Apr 2021 22:05:57 -0300 Subject: [PATCH 22/68] test: :white_check_mark: Add npm run coverage Adicao do modulo nyc para auxilio dos testes --- .gitignore | 4 +- package-lock.json | 938 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- 3 files changed, 944 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a4091012..ff28f9e9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ node_modules/ .env .vscode/ config/ -gcp_key.json \ No newline at end of file +gcp_key.json +.nyc_output +coverage \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c09dd631..d5dc94c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,259 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/compat-data": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", + "dev": true + }, + "@babel/core": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz", + "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.0.tgz", + "integrity": "sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz", + "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -67,6 +314,189 @@ } } }, + "@babel/parser": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.0.tgz", + "integrity": "sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", + "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.0.tgz", + "integrity": "sha512-O2LVLdcnWplaGxiPBz12d0HcdN8QdxdsWYhz5LSeuukV/5mn2xUUc3gBeU4QBYPJ18g/UToe8F532XJ608prmg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + } + } + }, "@eslint/eslintrc": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", @@ -259,6 +689,33 @@ "protobufjs": "^6.8.6" } }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, "@microsoft/tsdoc": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", @@ -732,6 +1189,24 @@ "debug": "4" } }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -852,6 +1327,21 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -1111,6 +1601,19 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "browserslist": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", + "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001214", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.719", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, "bson": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", @@ -1201,6 +1704,18 @@ } } }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1230,6 +1745,12 @@ } } }, + "caniuse-lite": { + "version": "1.0.30001219", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001219.tgz", + "integrity": "sha512-c0yixVG4v9KBc/tQ2rlbB3A/bgBFRvl8h8M4IeUbqCca4gsiCfvtaheUssbnux/Mb66Vjz7x8yYjDgYcNQOhyQ==", + "dev": true + }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -1314,6 +1835,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -1352,6 +1879,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -1367,6 +1900,12 @@ "delayed-stream": "~1.0.0" } }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1504,6 +2043,23 @@ "resolved": "https://registry.npmjs.org/convert-csv-to-json/-/convert-csv-to-json-0.0.15.tgz", "integrity": "sha512-mXpZWoSc3RXWuA50GAx/BAj+7GIWLmYCr2/IoW9L+cwwvRt6TkTY+15emUyeNInyfl5uZf+H6sQQkpKhjwJB0w==" }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -1640,6 +2196,23 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -1784,6 +2357,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron-to-chromium": { + "version": "1.3.723", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.723.tgz", + "integrity": "sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg==", + "dev": true + }, "emitter-listener": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", @@ -1833,6 +2412,18 @@ "is-arrayish": "^0.2.1" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -2253,6 +2844,17 @@ } } }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2285,6 +2887,16 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -2312,6 +2924,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -2397,6 +3015,12 @@ } } }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2408,6 +3032,12 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", @@ -2614,6 +3244,16 @@ "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==" }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2631,6 +3271,12 @@ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -2908,6 +3554,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -2925,6 +3577,114 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -2947,6 +3707,12 @@ "esprima": "^4.0.0" } }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "json-2-csv": { "version": "3.7.8", "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-3.7.8.tgz", @@ -2982,6 +3748,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -3076,6 +3851,12 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -3745,6 +4526,21 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, "nodemon": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", @@ -3821,6 +4617,58 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3928,11 +4776,32 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -4047,6 +4916,15 @@ "pinkie": "^2.0.0" } }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4079,6 +4957,15 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -4333,6 +5220,15 @@ "rc": "^1.2.8" } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remark": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", @@ -4725,6 +5621,31 @@ "memory-pager": "^1.0.2" } }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -5009,6 +5930,17 @@ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5023,6 +5955,12 @@ "readable-stream": "3" } }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-no-case": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", diff --git a/package.json b/package.json index 08c0e1d0..99fa7d6a 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,12 @@ "auto-compile": "tsc -w", "format": "npx prettier --write .", "build": "npm run compile", + "coverage": "nyc --reporter=lcov --reporter=cobertura npm run unit-test", "docs": "npx typedoc --out docs" }, "repository": { "type": "git", - "url": "https://github.com/DP6/adinfo.git" + "url": "https://github.com/DP6/penguin-adinfo" }, "author": "DP6", "contributors": [ @@ -63,6 +64,7 @@ "eslint-plugin-tsdoc": "^0.2.14", "mocha": "^8.2.1", "nodemon": "^2.0.4", + "nyc": "^15.1.0", "prettier": "^2.1.2", "supertest": "^4.0.2", "ts-node": "^9.0.0", From 3ec8cea5c86841864c224a7269b8eb7b15be6432 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Sun, 2 May 2021 17:07:54 -0300 Subject: [PATCH 23/68] feat: :sparkles: Obrigatoriedade dos campos de csvSeparator e columns do config Alteracao no metodo validateConfig da classe Config para que os campos csvSeparator e columns sejam obrigatorios --- dist/models/Config.js | 10 +++++++++- src/ts/models/Config.ts | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/dist/models/Config.js b/dist/models/Config.js index 6375262f..f3eaa7a1 100644 --- a/dist/models/Config.js +++ b/dist/models/Config.js @@ -36,7 +36,15 @@ class Config { this._medias = jsonConfigTemp; } validateConfig() { - return !(!this._separator || !this._spaceSeparator || !this._insertTime || !this._version || !this._analyticsTool); + return !( + !this._separator || + !this._spaceSeparator || + !this._insertTime || + !this._version || + !this._analyticsTool || + !this._csvSeparator || + !this._validationRules + ); } _buildDependenciesConfig(dependenciesConfig) { if (!dependenciesConfig) { diff --git a/src/ts/models/Config.ts b/src/ts/models/Config.ts index 3064f7c8..f73694f6 100644 --- a/src/ts/models/Config.ts +++ b/src/ts/models/Config.ts @@ -48,7 +48,15 @@ export class Config { * Checa se a configuração é válida */ public validateConfig(): boolean { - return !(!this._separator || !this._spaceSeparator || !this._insertTime || !this._version || !this._analyticsTool); + return !( + !this._separator || + !this._spaceSeparator || + !this._insertTime || + !this._version || + !this._analyticsTool || + !this._csvSeparator || + !this._validationRules + ); } private _buildDependenciesConfig( From a04a32bb5d944b44f9906dc66dd34be8591e0dbd Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Sun, 2 May 2021 17:20:06 -0300 Subject: [PATCH 24/68] docs: :memo: docs: :memo: Update dev Docs, readme e routes.md Atualizacao das docs de desenvolvimento, inclusao do parametro campaign na documentacao de rotas e atualizacao da doc de README.md, adicionando um exemplo do objeto de configuracao do Firestore --- .prettierignore | 4 +- README.md | 82 ++++++++++++++++++- Routes.md | 2 +- docs/classes/controllers_builder.builder.html | 10 +-- docs/classes/models_adobe.adobe.html | 32 ++++---- .../models_analyticstool.analyticstool.html | 16 ++-- docs/classes/models_auth.auth.html | 18 ++-- ...ingleton.firestoreconnectionsingleton.html | 16 ++-- ...oud_loggingsingleton.loggingsingleton.html | 18 ++-- ...nsingleton.storageconnectionsingleton.html | 16 ++-- docs/classes/models_config.config.html | 66 +++++++-------- docs/classes/models_dao_authdao.authdao.html | 14 ++-- .../models_dao_configdao.configdao.html | 10 +-- docs/classes/models_dao_filedao.filedao.html | 23 +++--- .../models_dao_filestore.filestore.html | 6 +- .../models_dao_objectstore.objectstore.html | 8 +- ...els_dependencyconfig.dependencyconfig.html | 24 +++--- .../models_facebookads.facebookads.html | 30 +++---- docs/classes/models_ga.ga.html | 34 ++++---- .../models_generalvehicle.generalvehicle.html | 30 +++---- docs/classes/models_googleads.googleads.html | 24 +++--- .../models_parametrizer.parametrizer.html | 12 +-- ...rametrizerfactory.parametrizerfactory.html | 8 +- ...els_routespermission.routespermission.html | 8 +- docs/classes/models_vehicle.vehicle.html | 8 +- docs/classes/utils_csvutils.csvutils.html | 6 +- docs/classes/utils_dateutils.dateutils.html | 4 +- docs/classes/utils_jsonutils.jsonutils.html | 6 +- .../utils_stringutils.stringutils.html | 10 +-- docs/index.html | 7 +- docs/modules/routes_build.html | 2 +- docs/modules/routes_config.html | 2 +- docs/modules/routes_csv.html | 2 +- docs/modules/routes_register.html | 2 +- docs/modules/routes_routes.html | 2 +- docs/modules/routes_template.html | 2 +- docs/modules/routes_user.html | 2 +- 37 files changed, 320 insertions(+), 246 deletions(-) diff --git a/.prettierignore b/.prettierignore index 65ac9d8b..db970f5e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,6 @@ node_modules test .github -docs \ No newline at end of file +docs +coverage +.nyc_output \ No newline at end of file diff --git a/README.md b/README.md index 1edff2d4..22d3c4d0 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,10 @@ Os principais componentes no uso da aplicação são a **configuração**, um JS - **test**: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/; - **lint**: Submete o código a uma avaliação do [ESLint](https://eslint.org/); - **lint-fix**: Submete o código a uma avaliação do [ESLint](https://eslint.org/) e aplica correções automaticamente ao código; -- **compile**: Exclui os arquivos da pasta /src/js e compila o código do typescript para javascript, guardando-o na pasta src/js; -- **auto-compile**: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta src/js, sem excluir o conteúdo anterior; +- **compile**: Exclui os arquivos da pasta dist/ e compila o código do typescript para javascript, guardando-o na pasta dist/; +- **auto-compile**: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta dist/, sem excluir o conteúdo anterior; - **prettier**: Formata todo o código das pastas src/ e test/, utilizando o [Prettier](https://prettier.io/), de acordo com a configuração descrita no arquivo .prettierrc; +- **coverage**: Análise da cobertura dos testes; - **build**: Executa o compile do código typescript para javascript. ## Requisitos para utilização @@ -80,6 +81,77 @@ Para a configuração inicial do Firestore, são necessárias duas coleções. Para esse documento, é importante manter o Código do Documento gerado automaticamente pelo google. O código gerado para cada documento será o token de acesso utilizado na API. +###### Padrão do Objeto de Configuração + +Para utilizar a API, é necessário criar um documento de configuração no Firestore dentro da coleção: companies > [nome_empresa] > config. O nome do documento deve ser **config_1** e ele deve conter os campos: **csvSeparator**, **separator**, **spaceSeparator**, **columns** e um campo para a ferramenta de analytics, sendo esse o valor de **ga** ou **adobe**. + +Abaixo segue uma explicação e um exemplo de todos os campos das configurações. + +| Chave | Tipo | Descrição | Obrigatório | +| --------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | +| csvSeparator | String | Separador de colunas do arquivo CSV. | Sim | +| separator | String | String que será utilizada na concatenação dos campos. | Sim | +| spaceSeparator | String | String que substituirá o espaço na URL, caso alguma campo tenha preenchido com mais de uma palavra. | Sim | +| columns | Objeto | Objeto contendo as colunas do CSV e seus valores de aceitação. | Sim | +| dependenciesConfig | Objeto | Objeto contendo as regras de dependências de validação. | Não | +| {{veículo}} | Objeto | Chave do veículo de mídia com suas configurações e quais colunas pertencem a cada configuração. | Não | +| {{ferramenta de analytics}} | Objeto | Chave da ferramenta de analytics com suas configurações e quais colunas pertencem a cada configuração. Essa chave precisa obrigatoriamente receber o valor **ga** ou **adobe**. | Sim | + +**Exemplo de configuração**: + +```json +{ + "separator": ":", + "spaceSeparator": "_", + "columns": { + //Colunas que aparecerão no CSV + //A chave representa a coluna do CSV e o vetor de valores + //representam os possíveis valores de preenchimento dos campos. + //É possível informar valores ou expressões regulares para a validação. + //As expressão regulares devem estar entre /, + //assim como na chave "Produto" + "Tipo de Compra": ["cpa", "cpc"], + "Dispositivo": ["desktop e mobile"], + "Produto": ["/.*/"] + }, + "ga": { + //Ferramenta de analytics, um outro valor possível seria "adobe" + //As chaves são os parâmetros que a ferramenta aceita + //Os valores passados no vetor são referentes às + //colunas do CSV que o formam + "utm_source": ["Tipo de Compra", "Dispositivo"], + "utm_campaign": ["Produto"] + }, + "googleads": { + //Configuração do veículo de mídia + //As chaves são os parâmetros do veículos. + //Os valores passados no vetor são referentes às + //colunas do CSV que o formam, + //semelhante à ferramenta de analytics. + "campanha": ["Tipo de Compra", "Dispositivo"], + "ad": ["Produto"] + }, + "dependenciesConfig": [ + //Campo de configurações de depêndencias + { + //De acordo com o exemplo, se a coluna "Dispositivo" + //for preenchida com algum valor que contenha + //a palavra "mobile", então a coluna "Tipo de Compra" + //só poderá ser preenchida com os valores: cpc ou cpa. + //Se a chave hasMatch estivesse com o valor "false" + //significaria que a regra para a coluna "Tipo de Compra" + //só seria aplicada, caso o valor preenchido na coluna "Dispositivo" + //não contivesse a palavra "mobile". + "columnReference": "Dispositivo", + "valuesReference": ["/.*mobile.*/"], + "hasMatch": true, + "columnDestiny": "Tipo de Compra", + "matches": ["cpc", "cpa"] + } + ] +} +``` + ### Banco de dados alternativos Atualmente o adinfo não disponibiliza por padrão um código de acesso à banco de dados diferentes do Storage e Firestore. Para conexões com outros ambientes a criação dos scripts se faz necessária. @@ -113,9 +185,11 @@ Só serão aceitas contribuições que estiverem seguindo os seguintes requisito - [Padrão de commit](https://www.conventionalcommits.org/en/v1.0.0/) - [Padrão de criação de branches](https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow) -### Api Docs +### Documentação de desenvolvimento + +A [documentação do código](./docs/index.html) pode ser encontrada em docs/index.html. -- [Index.js](https://github.com/dp6/template-js-cloudfunction-with-terraform/blob/master/docs/index.md) +A [documentação de rotas da API](./Routes.md) se encontra no arquivo Routes.md. ## Suporte: diff --git a/Routes.md b/Routes.md index 031190fd..3df869d0 100644 --- a/Routes.md +++ b/Routes.md @@ -57,7 +57,7 @@ **Parâmetros**: token, config. -**Descrição**: Cria uma nova versão da configuração, de acordo com o parâmetro **config** informado. +**Descrição**: Cria uma nova versão da configuração, de acordo com o parâmetro **config** informado. A nova configuração deve conter **obrigatoriamente** os campos: columns, csvSeparator, separator, spaceSeparator e pelo menos uma ferramenta de análise (ga ou adobe). ### (GET) /config diff --git a/docs/classes/controllers_builder.builder.html b/docs/classes/controllers_builder.builder.html index d1995b19..9bcfa0af 100644 --- a/docs/classes/controllers_builder.builder.html +++ b/docs/classes/controllers_builder.builder.html @@ -115,7 +115,7 @@

constructor

  • Parameters

    @@ -143,7 +143,7 @@

    Private _companyConfig

    _companyConfig: Config @@ -153,7 +153,7 @@

    Private _jsonFromFile
    _jsonFromFile: {}[]
    @@ -163,7 +163,7 @@

    Private _media

    _media: string
    @@ -180,7 +180,7 @@

    build

  • diff --git a/docs/classes/models_adobe.adobe.html b/docs/classes/models_adobe.adobe.html index 90bb5fd9..016b3dc1 100644 --- a/docs/classes/models_adobe.adobe.html +++ b/docs/classes/models_adobe.adobe.html @@ -136,7 +136,7 @@

    constructor

    @@ -176,7 +176,7 @@

    Private _cid

    _cid: string = ''
    @@ -186,7 +186,7 @@

    Private _hasUndefined
    _hasUndefinedParameterError: boolean = false
    @@ -196,7 +196,7 @@

    Private _hasValidation_hasValidationError: boolean = false

    @@ -206,7 +206,7 @@

    Private _undefinedParamete
    _undefinedParameterErroMessage: string = 'Parâmetros não encontrados:'
    @@ -217,7 +217,7 @@

    Protected _url

    @@ -227,7 +227,7 @@

    Private _validationError_validationErrorMessage: string = 'Parâmetros incorretos:'

    @@ -244,7 +244,7 @@

    config

  • Returns Config

    @@ -261,7 +261,7 @@

    csvLine

  • Returns {}

    @@ -284,7 +284,7 @@

    url

  • Returns string

    @@ -292,7 +292,7 @@

    Returns string

    Parameters

    @@ -318,7 +318,7 @@

    Private _buildCid

  • @@ -341,7 +341,7 @@

    Protected _buildUrl

    @@ -363,7 +363,7 @@

    Private _errorMessage

  • @@ -385,7 +385,7 @@

    Private _hasErrorAtCi
  • @@ -408,7 +408,7 @@

    buildedLine

    Returns {}

    diff --git a/docs/classes/models_analyticstool.analyticstool.html b/docs/classes/models_analyticstool.analyticstool.html index baddd73f..3105d7ee 100644 --- a/docs/classes/models_analyticstool.analyticstool.html +++ b/docs/classes/models_analyticstool.analyticstool.html @@ -136,7 +136,7 @@

    constructor

    @@ -176,7 +176,7 @@

    Protected _url

    _url: string
    @@ -193,7 +193,7 @@

    config

  • Returns Config

    @@ -210,7 +210,7 @@

    csvLine

  • Returns {}

    @@ -233,7 +233,7 @@

    url

  • Returns string

    @@ -241,7 +241,7 @@

    Returns string

    Parameters

    @@ -267,7 +267,7 @@

    Protected
    @@ -290,7 +290,7 @@

    Abstract buildedLine

    diff --git a/docs/classes/models_auth.auth.html b/docs/classes/models_auth.auth.html index 961da595..a298a4ec 100644 --- a/docs/classes/models_auth.auth.html +++ b/docs/classes/models_auth.auth.html @@ -124,7 +124,7 @@

    constructor

  • Parameters

    @@ -152,7 +152,7 @@

    Private _agency

    _agency: string
    @@ -162,7 +162,7 @@

    Private _company

    _company: string
    @@ -172,7 +172,7 @@

    Private _permission

    _permission: string
    @@ -189,7 +189,7 @@

    agency

  • Returns string

    @@ -206,7 +206,7 @@

    company

  • Returns string

    @@ -223,7 +223,7 @@

    permission

  • Returns string

    @@ -243,7 +243,7 @@

    hasPermissionFor

  • @@ -280,7 +280,7 @@

    toJson

  • diff --git a/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html b/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html index 3e50e669..6c5e2894 100644 --- a/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html +++ b/docs/classes/models_cloud_firestoreconnectionsingleton.firestoreconnectionsingleton.html @@ -124,7 +124,7 @@

    Private constructor

    Returns FirestoreConnectionSingleton

    @@ -140,7 +140,7 @@

    Private _db

    _db: Firestore
    @@ -150,7 +150,7 @@

    Static _instance: FirestoreConnectionSingleton

    @@ -168,7 +168,7 @@

    addDocumentIn

    @@ -217,7 +217,7 @@

    getAllDocumentsFrom

    @@ -249,7 +249,7 @@

    getCollection

    @@ -281,7 +281,7 @@

    getDocument

    @@ -312,7 +312,7 @@

    Static getInstance

  • diff --git a/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html b/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html index 575fa11f..4547ef34 100644 --- a/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html +++ b/docs/classes/models_cloud_loggingsingleton.loggingsingleton.html @@ -125,7 +125,7 @@

    Private constructor

    Returns LoggingSingleton

    @@ -141,7 +141,7 @@

    Static _errorInstance: Logger

    @@ -151,7 +151,7 @@

    Static _infoInstance: Logger

  • @@ -161,7 +161,7 @@

    Static _loggerName: string = 'adinfo'

    @@ -171,7 +171,7 @@

    Static _loggingBunyan: LoggingBunyan = ...

  • @@ -181,7 +181,7 @@

    Static _warningInstance: Logger @@ -198,7 +198,7 @@

    Static logError

  • Parameters

    @@ -221,7 +221,7 @@

    Static logInfo

  • Parameters

    @@ -244,7 +244,7 @@

    Static logWarning

  • Parameters

    diff --git a/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html b/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html index 1a3ed927..0bb89f6c 100644 --- a/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html +++ b/docs/classes/models_cloud_storageconnectionsingleton.storageconnectionsingleton.html @@ -124,7 +124,7 @@

    Private constructor

    Returns StorageConnectionSingleton

    @@ -140,7 +140,7 @@

    Private _bucket

    _bucket: string = ...
    @@ -150,7 +150,7 @@

    Private _db

    _db: Storage
    @@ -160,7 +160,7 @@

    Static _instance: StorageConnectionSingleton @@ -178,7 +178,7 @@

    getAllFiles

    @@ -210,7 +210,7 @@

    getFile

    @@ -242,7 +242,7 @@

    saveFile

    @@ -279,7 +279,7 @@

    Static getInstance

  • diff --git a/docs/classes/models_config.config.html b/docs/classes/models_config.config.html index 892f3911..9fd8ba9a 100644 --- a/docs/classes/models_config.config.html +++ b/docs/classes/models_config.config.html @@ -146,7 +146,7 @@

    constructor

  • Parameters

    @@ -173,7 +173,7 @@

    Private _analyticsTool

    _analyticsTool: {}
  • @@ -196,7 +196,7 @@

    Private _analyticsTool_analyticsToolName: string

    @@ -206,7 +206,7 @@

    Private _csvSeparator

    _csvSeparator: string = ','
    @@ -216,7 +216,7 @@

    Private _dependenciesConfi
    _dependenciesConfig: DependencyConfig[]
    @@ -226,7 +226,7 @@

    Private _insertTime

    _insertTime: string
    @@ -236,7 +236,7 @@

    Private _medias

    _medias: {}
    @@ -254,7 +254,7 @@

    Private _separator

    _separator: string
    @@ -264,7 +264,7 @@

    Private _spaceSeparator_spaceSeparator: string

    @@ -274,7 +274,7 @@

    Private _validationRules_validationRules: {}

    @@ -292,7 +292,7 @@

    Private _version

    _version: number
    @@ -309,7 +309,7 @@

    analyticsTool

  • Returns {}

    @@ -336,7 +336,7 @@

    analyticsToolName

  • Returns string

    @@ -353,7 +353,7 @@

    csvSeparator

  • Returns string

    @@ -371,7 +371,7 @@

    insertTime

  • Returns string

    @@ -379,7 +379,7 @@

    Returns string

    Parameters

    @@ -402,7 +402,7 @@

    medias

  • Returns {}

    @@ -424,7 +424,7 @@

    separator

  • Returns string

    @@ -441,7 +441,7 @@

    spaceSeparator

  • Returns string

    @@ -458,7 +458,7 @@

    validationRules

  • Returns {}

    @@ -481,7 +481,7 @@

    version

  • Returns number

    @@ -489,7 +489,7 @@

    Returns number

    Parameters

    @@ -515,7 +515,7 @@

    Private _buildDependencies
  • Parameters

    @@ -538,7 +538,7 @@

    Private _existsValidation<
  • @@ -569,7 +569,7 @@

    Private _getAllDepend
  • @@ -600,7 +600,7 @@

    Private _validateDependenc
  • @@ -648,7 +648,7 @@

    Private _validateRules
    @@ -685,7 +685,7 @@

    existsColumn

  • @@ -715,7 +715,7 @@

    toCsvTemplate

  • @@ -738,7 +738,7 @@

    toJson

  • @@ -765,7 +765,7 @@

    toString

  • @@ -787,7 +787,7 @@

    validateConfig

  • @@ -809,7 +809,7 @@

    validateField

  • diff --git a/docs/classes/models_dao_authdao.authdao.html b/docs/classes/models_dao_authdao.authdao.html index f2b6e8fc..ace076d8 100644 --- a/docs/classes/models_dao_authdao.authdao.html +++ b/docs/classes/models_dao_authdao.authdao.html @@ -117,7 +117,7 @@

    constructor

  • Parameters

    @@ -139,7 +139,7 @@

    Private _authCollection_authCollection: CollectionReference<DocumentData>

  • @@ -149,7 +149,7 @@

    Private _objectStore

    _objectStore: ObjectStore
    @@ -159,7 +159,7 @@

    Private _pathToCollection<
    _pathToCollection: string[]
    @@ -169,7 +169,7 @@

    Private _token

    _token: string
    @@ -186,7 +186,7 @@

    addAuth

  • Parameters

    @@ -214,7 +214,7 @@

    getAuth

  • Returns Promise<void | Auth>

    diff --git a/docs/classes/models_dao_configdao.configdao.html b/docs/classes/models_dao_configdao.configdao.html index c4ef09dd..5501f192 100644 --- a/docs/classes/models_dao_configdao.configdao.html +++ b/docs/classes/models_dao_configdao.configdao.html @@ -115,7 +115,7 @@

    constructor

  • Parameters

    @@ -137,7 +137,7 @@

    Private _configCollection<
    _configCollection: CollectionReference<DocumentData>
    @@ -147,7 +147,7 @@

    Private _objectStore

    _objectStore: ObjectStore
    @@ -164,7 +164,7 @@

    addConfig

  • @@ -195,7 +195,7 @@

    getLastConfig

  • diff --git a/docs/classes/models_dao_filedao.filedao.html b/docs/classes/models_dao_filedao.filedao.html index 21b0f7af..360de13f 100644 --- a/docs/classes/models_dao_filedao.filedao.html +++ b/docs/classes/models_dao_filedao.filedao.html @@ -122,7 +122,7 @@

    constructor

  • Returns FileDAO

    @@ -138,7 +138,7 @@

    Private _file

    _file: Buffer
    @@ -148,7 +148,7 @@

    Private _fileStore

    _fileStore: FileStore
    @@ -166,7 +166,7 @@

    file

  • Returns Buffer

    @@ -174,7 +174,7 @@

    Returns Buffer

    Parameters

    @@ -194,13 +194,13 @@

    Methods

    getAllFilesFromStore

      -
    • getAllFilesFromStore(agency: string): Promise<File[][]>
    • +
    • getAllFilesFromStore(path: string): Promise<File[][]>

  • @@ -186,7 +186,7 @@

    Private _hasMatch

    _hasMatch: boolean
    @@ -196,7 +196,7 @@

    Private _matches

    _matches: string[]
    @@ -206,7 +206,7 @@

    Private _valuesReference_valuesReference: string[]

  • @@ -223,7 +223,7 @@

    columnDestiny

  • Returns string

    @@ -240,7 +240,7 @@

    columnReference

  • Returns string

    @@ -257,7 +257,7 @@

    hasMatch

  • Returns boolean

    @@ -274,7 +274,7 @@

    matches

  • Returns string[]

    @@ -291,7 +291,7 @@

    valuesReference

  • Returns string[]

    @@ -311,7 +311,7 @@

    toJson

  • diff --git a/docs/classes/models_facebookads.facebookads.html b/docs/classes/models_facebookads.facebookads.html index 8cfddf6e..92de8ab6 100644 --- a/docs/classes/models_facebookads.facebookads.html +++ b/docs/classes/models_facebookads.facebookads.html @@ -136,7 +136,7 @@

    constructor

    @@ -174,7 +174,7 @@

    Private _errorFacebook_errorFacebookParams: {} = {}

    @@ -192,7 +192,7 @@

    Private _facebookParams_facebookParams: {} = {}

    @@ -210,7 +210,7 @@

    Private _hasUndefined
    _hasUndefinedParameterError: boolean = false
    @@ -220,7 +220,7 @@

    Private _hasValidation_hasValidationError: boolean = false

    @@ -230,7 +230,7 @@

    Private _undefinedParamete
    _undefinedParameterErrorFields: {} = {}
    @@ -248,7 +248,7 @@

    Private _undefinedParamete
    _undefinedParameterErrorMessage: string = 'Parâmetro(s) não encontrado(s) na configuração: '
    @@ -258,7 +258,7 @@

    Private _validationError_validationErrorMessage: string = 'Parâmetros incorretos: '

    @@ -275,7 +275,7 @@

    config

  • Returns Config

    @@ -292,7 +292,7 @@

    csvLine

  • Returns {}

    @@ -317,7 +317,7 @@

    Private _buildUrlPara
  • @@ -339,7 +339,7 @@

    Private _clearFacebook
    @@ -371,7 +371,7 @@

    Private _clearFacebook
    @@ -393,7 +393,7 @@

    Private _isCompoundPa
  • @@ -426,7 +426,7 @@

    buildedLine

    diff --git a/docs/classes/models_ga.ga.html b/docs/classes/models_ga.ga.html index 15283a7d..b7c22814 100644 --- a/docs/classes/models_ga.ga.html +++ b/docs/classes/models_ga.ga.html @@ -137,7 +137,7 @@

    constructor

    @@ -177,7 +177,7 @@

    Private _hasUndefined
    _hasUndefinedParameterError: {} = {}
    @@ -195,7 +195,7 @@

    Private _hasValidation_hasValidationError: {} = {}

    @@ -213,7 +213,7 @@

    Private _undefinedParamete
    _undefinedParameterErroMessage: {} = {}
    @@ -232,7 +232,7 @@

    Protected _url

    @@ -242,7 +242,7 @@

    Private _utms

    _utms: {} = {}
    @@ -260,7 +260,7 @@

    Private _validationError_validationErrorMessage: {} = {}

    @@ -285,7 +285,7 @@

    config

  • Returns Config

    @@ -302,7 +302,7 @@

    csvLine

  • Returns {}

    @@ -325,7 +325,7 @@

    url

  • Returns string

    @@ -333,7 +333,7 @@

    Returns string

    Parameters

    @@ -360,7 +360,7 @@

    Protected _buildUrl

    @@ -382,7 +382,7 @@

    Private _buildUtms

  • @@ -409,7 +409,7 @@

    Private _errorMessage
  • @@ -437,7 +437,7 @@

    Private _hasAnyError<
  • @@ -459,7 +459,7 @@

    Private _hasErrorAtUt
  • @@ -488,7 +488,7 @@

    buildedLine

    diff --git a/docs/classes/models_generalvehicle.generalvehicle.html b/docs/classes/models_generalvehicle.generalvehicle.html index 48240138..374e182c 100644 --- a/docs/classes/models_generalvehicle.generalvehicle.html +++ b/docs/classes/models_generalvehicle.generalvehicle.html @@ -136,7 +136,7 @@

    constructor

    Parameters

    @@ -169,7 +169,7 @@

    Private _errorParams

    _errorParams: {} = {}
    @@ -187,7 +187,7 @@

    Private _hasUndefined
    _hasUndefinedParameterError: boolean = false
    @@ -197,7 +197,7 @@

    Private _hasValidation_hasValidationError: boolean = false

    @@ -207,7 +207,7 @@

    Private _params

    _params: {} = {}
    @@ -225,7 +225,7 @@

    Private _undefinedParamete
    _undefinedParameterErrorFields: {} = {}
    @@ -243,7 +243,7 @@

    Private _undefinedParamete
    _undefinedParameterErrorMessage: string = 'Parâmetro(s) não encontrado(s) na configuração: '
    @@ -253,7 +253,7 @@

    Private _validationError_validationErrorMessage: string = 'Parâmetro(s) incorreto(s): '

    @@ -263,7 +263,7 @@

    Private _vehicleName

    _vehicleName: string
    @@ -280,7 +280,7 @@

    config

  • Returns Config

    @@ -297,7 +297,7 @@

    csvLine

  • Returns {}

    @@ -322,7 +322,7 @@

    Private _buildGeneral
  • Returns void

    @@ -339,7 +339,7 @@

    Private _undefinedParamete
  • @@ -370,7 +370,7 @@

    Private _validationError
    @@ -408,7 +408,7 @@

    buildedLine

    diff --git a/docs/classes/models_googleads.googleads.html b/docs/classes/models_googleads.googleads.html index 9f4a6829..02f3cd2f 100644 --- a/docs/classes/models_googleads.googleads.html +++ b/docs/classes/models_googleads.googleads.html @@ -133,7 +133,7 @@

    constructor

    @@ -171,7 +171,7 @@

    Private _adsParams

    _adsParams: {} = {}
    @@ -189,7 +189,7 @@

    Private _errorAdsPara
    _errorAdsParams: {} = {}
    @@ -207,7 +207,7 @@

    Private _hasUndefined
    _hasUndefinedParameterError: {} = {}
    @@ -225,7 +225,7 @@

    Private _hasValidation_hasValidationError: {} = {}

    @@ -243,7 +243,7 @@

    Private _undefinedParamete
    _undefinedParameterErrorFields: {} = {}
    @@ -261,7 +261,7 @@

    Private _undefinedParamete
    _undefinedParameterErrorMessage: {} = {}
    @@ -279,7 +279,7 @@

    Private _validationError_validationErrorMessage: {} = {}

    @@ -304,7 +304,7 @@

    config

  • Returns Config

    @@ -321,7 +321,7 @@

    csvLine

  • Returns {}

    @@ -346,7 +346,7 @@

    Private _buildAdsPara
  • @@ -369,7 +369,7 @@

    buildedLine

    diff --git a/docs/classes/models_parametrizer.parametrizer.html b/docs/classes/models_parametrizer.parametrizer.html index 2196f7b4..6c5309e5 100644 --- a/docs/classes/models_parametrizer.parametrizer.html +++ b/docs/classes/models_parametrizer.parametrizer.html @@ -129,7 +129,7 @@

    constructor

  • @@ -169,7 +169,7 @@

    Private _config

    _config: Config
    @@ -179,7 +179,7 @@

    Private _csvLine

    _csvLine: {}
    @@ -204,7 +204,7 @@

    config

  • Returns Config

    @@ -221,7 +221,7 @@

    csvLine

  • Returns {}

    @@ -246,7 +246,7 @@

    Abstract buildedLine

  • diff --git a/docs/classes/models_parametrizerfactory.parametrizerfactory.html b/docs/classes/models_parametrizerfactory.parametrizerfactory.html index 75656148..c0170257 100644 --- a/docs/classes/models_parametrizerfactory.parametrizerfactory.html +++ b/docs/classes/models_parametrizerfactory.parametrizerfactory.html @@ -114,7 +114,7 @@

    constructor

  • Parameters

    @@ -144,7 +144,7 @@

    Private _config

    _config: Config
    @@ -154,7 +154,7 @@

    Private _csvLines

    _csvLines: {}
    @@ -179,7 +179,7 @@

    build

  • diff --git a/docs/classes/models_routespermission.routespermission.html b/docs/classes/models_routespermission.routespermission.html index 86a49038..d935f9e8 100644 --- a/docs/classes/models_routespermission.routespermission.html +++ b/docs/classes/models_routespermission.routespermission.html @@ -114,7 +114,7 @@

    constructor

  • Parameters

    @@ -139,7 +139,7 @@

    Private _method

    _method: string
    @@ -149,7 +149,7 @@

    Private _route

    _route: string
    @@ -166,7 +166,7 @@

    validatePermission

  • Parameters

    diff --git a/docs/classes/models_vehicle.vehicle.html b/docs/classes/models_vehicle.vehicle.html index b2b5966f..ddaa5970 100644 --- a/docs/classes/models_vehicle.vehicle.html +++ b/docs/classes/models_vehicle.vehicle.html @@ -131,7 +131,7 @@

    constructor

    @@ -175,7 +175,7 @@

    config

  • Returns Config

    @@ -192,7 +192,7 @@

    csvLine

  • Returns {}

    @@ -218,7 +218,7 @@

    Abstract buildedLine

    diff --git a/docs/classes/utils_csvutils.csvutils.html b/docs/classes/utils_csvutils.csvutils.html index d2348d53..fa8ac9bd 100644 --- a/docs/classes/utils_csvutils.csvutils.html +++ b/docs/classes/utils_csvutils.csvutils.html @@ -126,7 +126,7 @@

    Static csv2json

  • @@ -165,7 +165,7 @@

    Static
    @@ -198,7 +198,7 @@

    Static isLineEmpty

    diff --git a/docs/classes/utils_dateutils.dateutils.html b/docs/classes/utils_dateutils.dateutils.html index a735a444..6c3a00d0 100644 --- a/docs/classes/utils_dateutils.dateutils.html +++ b/docs/classes/utils_dateutils.dateutils.html @@ -125,7 +125,7 @@

    Static generateDateStr
  • @@ -158,7 +158,7 @@

    Static newDateString
    diff --git a/docs/classes/utils_jsonutils.jsonutils.html b/docs/classes/utils_jsonutils.jsonutils.html index 3b564f19..4295ccfa 100644 --- a/docs/classes/utils_jsonutils.jsonutils.html +++ b/docs/classes/utils_jsonutils.jsonutils.html @@ -126,7 +126,7 @@

    Static

    Parameters

    @@ -149,7 +149,7 @@

    Static addParametersAt
  • @@ -195,7 +195,7 @@

    Static normalizeKeys

  • diff --git a/docs/classes/utils_stringutils.stringutils.html b/docs/classes/utils_stringutils.stringutils.html index 25fe9688..68cd84bf 100644 --- a/docs/classes/utils_stringutils.stringutils.html +++ b/docs/classes/utils_stringutils.stringutils.html @@ -128,7 +128,7 @@

    Static
    @@ -162,7 +162,7 @@

    Static isEmpty

  • @@ -193,7 +193,7 @@

    Static normalize

  • @@ -226,7 +226,7 @@

    Static replaceWhiteSpa
  • @@ -265,7 +265,7 @@

    Static validateString

  • diff --git a/docs/index.html b/docs/index.html index dab6f3a7..b657a19b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -64,7 +64,7 @@

    Penguin Adinfo

    -

    O Penguin Adinfo é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital.

    +

    O Penguin Adinfo é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital.

    A solução proposta é uma API open source que através de rotas de requisição trabalha inputs de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma validação dos campos preenchidos e de status de requisição dos links.

    Os principais componentes no uso da aplicação são a configuração, um JSON contendo quais campos são aceitos na taxonomia de mídia, o permissionamento para controle de ações permitidas por nível de acesso, e o arquivo de parametrização, um CSV contendo a lista de URLs e os campos preenchidos conforme o que foi configurado.

    @@ -72,7 +72,7 @@

    Principais propostas de valor

    • Independência de qualquer programa para a abertura das planilhas durante o processo de parametrização, o que comumente compromete a performance pelo uso extensivo de fórmulas.
    • -
    • Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de acessos, edição de configurações, realização da parametrização.
    • +
    • Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de acessos, edição de configurações, realização da parametrização.
    • Os acessos podem ser divididos em grupos ou projetos, para que por exemplo diferentes agências possam todas ter seu nível de configuração, mas apenas para suas próprias campanhas.
    • Escalabilidade de uso por suportar grandes tamanhos de arquivo e histórico.
    @@ -88,6 +88,7 @@

    NPM Run

  • compile: Exclui os arquivos da pasta /src/js e compila o código do typescript para javascript, guardando-o na pasta src/js;
  • auto-compile: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta src/js, sem excluir o conteúdo anterior;
  • prettier: Formata todo o código das pastas src/ e test/, utilizando o Prettier, de acordo com a configuração descrita no arquivo .prettierrc;
  • +
  • coverage: Análise da cobertura dos testes.
  • build: Executa o compile do código typescript para javascript.
  • @@ -132,7 +133,7 @@
    Configuração inicial do Firestore
    • companies: essa coleção deve ser criada na raiz do firestore e deve conter um documento com o nome da empresa. Dentro desse documento, uma segunda coleção deve ser criada com o nome config. Seguindo a estrutura: companies > [nome_empresa] > config;

    • -
    • tokens: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura:

      +
    • tokens: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura:

      {
           company: "arthurltda" (string)
           permission: "owner"(string)
      diff --git a/docs/modules/routes_build.html b/docs/modules/routes_build.html
      index 4be18f8d..612f8333 100644
      --- a/docs/modules/routes_build.html
      +++ b/docs/modules/routes_build.html
      @@ -90,7 +90,7 @@ 

      Const default

    • Parameters

      diff --git a/docs/modules/routes_config.html b/docs/modules/routes_config.html index 3004239b..84f89114 100644 --- a/docs/modules/routes_config.html +++ b/docs/modules/routes_config.html @@ -90,7 +90,7 @@

      Const default

    • Parameters

      diff --git a/docs/modules/routes_csv.html b/docs/modules/routes_csv.html index d7bd09ca..0bd51b26 100644 --- a/docs/modules/routes_csv.html +++ b/docs/modules/routes_csv.html @@ -90,7 +90,7 @@

      Const default

    • Parameters

      diff --git a/docs/modules/routes_register.html b/docs/modules/routes_register.html index 88c1d499..1e0ea670 100644 --- a/docs/modules/routes_register.html +++ b/docs/modules/routes_register.html @@ -90,7 +90,7 @@

      Const default

    • Parameters

      diff --git a/docs/modules/routes_routes.html b/docs/modules/routes_routes.html index 04a77684..59b879dd 100644 --- a/docs/modules/routes_routes.html +++ b/docs/modules/routes_routes.html @@ -90,7 +90,7 @@

      Const default

    • Parameters

      diff --git a/docs/modules/routes_template.html b/docs/modules/routes_template.html index 5aa8d33a..a3c60a40 100644 --- a/docs/modules/routes_template.html +++ b/docs/modules/routes_template.html @@ -90,7 +90,7 @@

      Const default

    • Parameters

      diff --git a/docs/modules/routes_user.html b/docs/modules/routes_user.html index 885fa80f..ff709027 100644 --- a/docs/modules/routes_user.html +++ b/docs/modules/routes_user.html @@ -90,7 +90,7 @@

      Const default

    • Parameters

      From b541e2fa896a86432abf908a6ba0bde9c5ca5f9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:47:50 +0000 Subject: [PATCH 25/68] Bump codacy/codacy-analysis-cli-action from 3.0.0 to 3.0.1 Bumps [codacy/codacy-analysis-cli-action](https://github.com/codacy/codacy-analysis-cli-action) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases) - [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/3.0.0...84fbefef91e53a3e8a5e031719a762ca706731d5) Signed-off-by: dependabot[bot] --- .github/workflows/codacy-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codacy-analysis.yml b/.github/workflows/codacy-analysis.yml index 7e62010d..60a326b6 100644 --- a/.github/workflows/codacy-analysis.yml +++ b/.github/workflows/codacy-analysis.yml @@ -21,7 +21,7 @@ jobs: # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis - name: Run Codacy Analysis CLI - uses: codacy/codacy-analysis-cli-action@3.0.0 + uses: codacy/codacy-analysis-cli-action@3.0.1 with: # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository # You can also omit the token and run the tools that support default configurations From 656e9d9ba602417efb797fd2fb672fb1cebdeab1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:47:55 +0000 Subject: [PATCH 26/68] Bump stefanzweifel/git-auto-commit-action from v4.10.0 to v4.11.0 Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from v4.10.0 to v4.11.0. - [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases) - [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.10.0...5dd17c3b53a58c1cb5eaab903826abe94765ccd6) Signed-off-by: dependabot[bot] --- .github/workflows/format-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index e36df517..1a5b979b 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -20,7 +20,7 @@ jobs: npm ci npm run format - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v4.10.0 + uses: stefanzweifel/git-auto-commit-action@v4.11.0 with: commit_message: 'style: :lipstick: Apply formatting changes' branch: ${{ github.head_ref }} From c5add2d1a20046ae1a2e8da1cd9d8f7b2c9a1741 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:49:50 +0000 Subject: [PATCH 27/68] Bump ts-node-dev from 1.0.0 to 1.1.6 Bumps [ts-node-dev](https://github.com/whitecolor/ts-node-dev) from 1.0.0 to 1.1.6. - [Release notes](https://github.com/whitecolor/ts-node-dev/releases) - [Changelog](https://github.com/wclr/ts-node-dev/blob/master/CHANGELOG.md) - [Commits](https://github.com/whitecolor/ts-node-dev/compare/v1.0.0...v1.1.6) Signed-off-by: dependabot[bot] --- package-lock.json | 43 +++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5dc94c7..242b4a60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3266,9 +3266,9 @@ "integrity": "sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA==" }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-escaper": { @@ -5673,9 +5673,9 @@ } }, "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "sprintf-js": { @@ -6042,12 +6042,12 @@ } }, "ts-node-dev": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0.tgz", - "integrity": "sha512-leA/3TgGtnVU77fGngBwVZztqyDRXirytR7dMtMWZS5b2hGpLl+VDnB0F/gf3A+HEPSzS/KwxgXFP7/LtgX4MQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.6.tgz", + "integrity": "sha512-RTUi7mHMNQospArGz07KiraQcdgUVNXKsgO2HAi7FoiyPMdTDqdniB6K1dqyaIxT7c9v/VpSbfBZPS6uVpaFLQ==", "dev": true, "requires": { - "chokidar": "^3.4.0", + "chokidar": "^3.5.1", "dateformat": "~1.0.4-1.2.3", "dynamic-dedupe": "^0.3.0", "minimist": "^1.2.5", @@ -6060,6 +6060,29 @@ "tsconfig": "^7.0.0" }, "dependencies": { + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", diff --git a/package.json b/package.json index 99fa7d6a..ff197834 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "prettier": "^2.1.2", "supertest": "^4.0.2", "ts-node": "^9.0.0", - "ts-node-dev": "^1.0.0", + "ts-node-dev": "^1.1.6", "typedoc": "^0.20.36", "typescript": "^4.0.5" } From 75a870174994c1f1eee64eb6f10902c56fd4ceb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:50:42 +0000 Subject: [PATCH 28/68] Bump @types/express from 4.17.8 to 4.17.11 Bumps [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express) from 4.17.8 to 4.17.11. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express) Signed-off-by: dependabot[bot] --- package-lock.json | 40 ++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5dc94c7..9f531a1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -911,9 +911,9 @@ "dev": true }, "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", "dev": true, "requires": { "@types/node": "*" @@ -926,13 +926,13 @@ "dev": true }, "@types/express": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", - "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "*", + "@types/express-serve-static-core": "^4.17.18", "@types/qs": "*", "@types/serve-static": "*" } @@ -947,9 +947,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", - "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", "dev": true, "requires": { "@types/node": "*", @@ -977,9 +977,9 @@ } }, "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, "@types/mocha": { @@ -1003,9 +1003,9 @@ "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==" }, "@types/qs": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", - "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", "dev": true }, "@types/range-parser": { @@ -1015,12 +1015,12 @@ "dev": true }, "@types/serve-static": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.6.tgz", - "integrity": "sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA==", + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", "dev": true, "requires": { - "@types/mime": "*", + "@types/mime": "^1", "@types/node": "*" } }, diff --git a/package.json b/package.json index 99fa7d6a..e4c2999f 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "@types/chai": "^4.2.14", "@types/cors": "^2.8.9", - "@types/express": "^4.17.8", + "@types/express": "^4.17.11", "@types/express-fileupload": "^1.1.6", "@types/mocha": "^8.0.3", "@typescript-eslint/eslint-plugin": "^4.6.1", From 191c6d2fe6832aac2a78547b5011128b972451f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:51:36 +0000 Subject: [PATCH 29/68] Bump supertest from 4.0.2 to 6.1.3 Bumps [supertest](https://github.com/visionmedia/supertest) from 4.0.2 to 6.1.3. - [Release notes](https://github.com/visionmedia/supertest/releases) - [Commits](https://github.com/visionmedia/supertest/compare/v4.0.2...v6.1.3) Signed-off-by: dependabot[bot] --- package-lock.json | 146 ++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 83 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5dc94c7..a24be9c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1716,6 +1716,16 @@ "write-file-atomic": "^3.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2783,6 +2793,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, "fast-text-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", @@ -2898,13 +2914,13 @@ } }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, @@ -3032,6 +3048,17 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3233,6 +3260,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -4674,6 +4707,12 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5511,6 +5550,17 @@ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sift": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", @@ -5771,84 +5821,52 @@ "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", "dev": true, "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "side-channel": "^1.0.4" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "lru-cache": "^6.0.0" } } } }, "supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", + "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^3.8.3" + "superagent": "^6.1.0" } }, "supports-color": { diff --git a/package.json b/package.json index 99fa7d6a..12f80784 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "nodemon": "^2.0.4", "nyc": "^15.1.0", "prettier": "^2.1.2", - "supertest": "^4.0.2", + "supertest": "^6.1.3", "ts-node": "^9.0.0", "ts-node-dev": "^1.0.0", "typedoc": "^0.20.36", From a8adb378778a10c993ef52be9d74d70fc2f176ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:52:35 +0000 Subject: [PATCH 30/68] Bump @typescript-eslint/parser from 4.6.1 to 4.22.1 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.6.1 to 4.22.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.22.1/packages/parser) Signed-off-by: dependabot[bot] --- package-lock.json | 64 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5dc94c7..fd9000f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1079,15 +1079,67 @@ } }, "@typescript-eslint/parser": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.1.tgz", - "integrity": "sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.1.tgz", + "integrity": "sha512-l+sUJFInWhuMxA6rtirzjooh8cM/AATAe3amvIkqKFeMzkn85V+eLzb1RyuXkHak4dLfYzOmF6DXPyflJvjQnw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.6.1", - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/typescript-estree": "4.6.1", + "@typescript-eslint/scope-manager": "4.22.1", + "@typescript-eslint/types": "4.22.1", + "@typescript-eslint/typescript-estree": "4.22.1", "debug": "^4.1.1" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.1.tgz", + "integrity": "sha512-d5bAiPBiessSmNi8Amq/RuLslvcumxLmyhf1/Xa9IuaoFJ0YtshlJKxhlbY7l2JdEk3wS0EnmnfeJWSvADOe0g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.1", + "@typescript-eslint/visitor-keys": "4.22.1" + } + }, + "@typescript-eslint/types": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.1.tgz", + "integrity": "sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz", + "integrity": "sha512-p3We0pAPacT+onSGM+sPR+M9CblVqdA9F1JEdIqRVlxK5Qth4ochXQgIyb9daBomyQKAXbygxp1aXQRV0GC79A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.1", + "@typescript-eslint/visitor-keys": "4.22.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz", + "integrity": "sha512-WPkOrIRm+WCLZxXQHCi+WG8T2MMTUFR70rWjdWYddLT7cEfb2P4a3O/J2U1FBVsSFTocXLCoXWY6MZGejeStvQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.1", + "eslint-visitor-keys": "^2.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/scope-manager": { diff --git a/package.json b/package.json index 99fa7d6a..5e2edd39 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@types/express-fileupload": "^1.1.6", "@types/mocha": "^8.0.3", "@typescript-eslint/eslint-plugin": "^4.6.1", - "@typescript-eslint/parser": "^4.6.1", + "@typescript-eslint/parser": "^4.22.1", "chai": "^4.2.0", "eslint": "^7.12.1", "eslint-config-prettier": "^6.15.0", From 6e9e2ca23d73ec599b2c06c4a2643d0a0ec2073d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 20:59:52 +0000 Subject: [PATCH 31/68] Bump chai from 4.2.0 to 4.3.4 Bumps [chai](https://github.com/chaijs/chai) from 4.2.0 to 4.3.4. - [Release notes](https://github.com/chaijs/chai/releases) - [Changelog](https://github.com/chaijs/chai/blob/main/History.md) - [Commits](https://github.com/chaijs/chai/compare/4.2.0...v4.3.4) Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 228a309d..495a17a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1814,16 +1814,16 @@ "dev": true }, "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", - "pathval": "^1.1.0", + "pathval": "^1.1.1", "type-detect": "^4.0.5" } }, @@ -4975,9 +4975,9 @@ "dev": true }, "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, "picomatch": { From c801db48a3ea715b47ecd14fba31ce1df5a9e4c4 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Wed, 5 May 2021 18:46:29 -0300 Subject: [PATCH 32/68] build: :hammer: Update package.json Adicao do private, hompage e release no package.json --- package.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 76f76df6..eac91a51 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "penguin-adinfo", + "private": "true", "version": "1.0.0", "description": "O Ad Info Penguin é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital. ", "main": "index.js", @@ -29,8 +30,26 @@ } ], "keywords": [ - "dp6" + "dp6", + "adinfo" ], + "homepage": "https://github.com/DP6/penguin-adinfo#readme", + "release": { + "branch": "master", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + [ + "@semantic-release/npm", + { + "npmPublish": false + } + ], + [ + "@semantic-release/github" + ] + ] + }, "license": "ISC", "dependencies": { "@google-cloud/firestore": "^4.8.1", From 0dd8b47d61338cd6dd45e4e41f29372d3da2205d Mon Sep 17 00:00:00 2001 From: LucasTonetto Date: Wed, 5 May 2021 21:49:29 +0000 Subject: [PATCH 33/68] style: :lipstick: Apply formatting changes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eac91a51..c132f124 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "adinfo" ], "homepage": "https://github.com/DP6/penguin-adinfo#readme", - "release": { + "release": { "branch": "master", "plugins": [ "@semantic-release/commit-analyzer", From dc3cea6cd67d83ff58d30dd16b82a875713224e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 08:22:24 +0000 Subject: [PATCH 34/68] build(deps-dev): bump eslint-plugin-prettier from 3.1.4 to 3.4.0 Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 3.1.4 to 3.4.0. - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-plugin-prettier/commits) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 495a17a6..122d36c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2572,9 +2572,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" diff --git a/package.json b/package.json index c132f124..103dd1cf 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "chai": "^4.2.0", "eslint": "^7.12.1", "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-tsdoc": "^0.2.14", "mocha": "^8.2.1", "nodemon": "^2.0.4", From a14cdb61a17ec588e303ec974aafae1f20c133ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 08:23:48 +0000 Subject: [PATCH 35/68] build(deps-dev): bump @types/mocha from 8.0.3 to 8.2.2 Bumps [@types/mocha](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mocha) from 8.0.3 to 8.2.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/mocha) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 495a17a6..b6eb2da9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -983,9 +983,9 @@ "dev": true }, "@types/mocha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", - "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", + "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", "dev": true }, "@types/mongodb": { diff --git a/package.json b/package.json index c132f124..fbc23735 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@types/cors": "^2.8.9", "@types/express": "^4.17.11", "@types/express-fileupload": "^1.1.6", - "@types/mocha": "^8.0.3", + "@types/mocha": "^8.2.2", "@typescript-eslint/eslint-plugin": "^4.6.1", "@typescript-eslint/parser": "^4.22.1", "chai": "^4.2.0", From 1a351b0d54a8761822709c03a6386470bf0da1fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 08:24:41 +0000 Subject: [PATCH 36/68] build(deps-dev): bump typescript from 4.0.5 to 4.2.4 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.0.5 to 4.2.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.0.5...v4.2.4) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 495a17a6..28e6fe0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6279,9 +6279,9 @@ "dev": true }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index c132f124..18cff675 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,6 @@ "ts-node": "^9.0.0", "ts-node-dev": "^1.1.6", "typedoc": "^0.20.36", - "typescript": "^4.0.5" + "typescript": "^4.2.4" } } From f1e4a23118b3fd125e9b865d3e39ce830a95e71c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 08:25:32 +0000 Subject: [PATCH 37/68] build(deps): bump @google-cloud/firestore from 4.8.1 to 4.11.0 Bumps [@google-cloud/firestore](https://github.com/googleapis/nodejs-firestore) from 4.8.1 to 4.11.0. - [Release notes](https://github.com/googleapis/nodejs-firestore/releases) - [Changelog](https://github.com/googleapis/nodejs-firestore/blob/master/CHANGELOG.md) - [Commits](https://github.com/googleapis/nodejs-firestore/compare/v4.8.1...v4.11.0) Signed-off-by: dependabot[bot] --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 495a17a6..d9812c37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -540,13 +540,14 @@ } }, "@google-cloud/firestore": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.8.1.tgz", - "integrity": "sha512-x/8ixlYqQuH9DoluhBj/uj3MqwoQN1lSCT2v+ieOXuh2L+8eoA7H+FF7f+UJ/D6hzo0MMWJd6q7QaBkpzp203Q==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.11.0.tgz", + "integrity": "sha512-Do9WJzEkFBBB+zVFvFfrrrIFEz086lrdgKQic7XsdoTgtYtq0yMu2u3kGLyxMbdasl2c2yf49FE4YvO3AYjQMQ==", "requires": { "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^2.9.2" + "google-gax": "^2.9.2", + "protobufjs": "^6.8.6" } }, "@google-cloud/logging": { diff --git a/package.json b/package.json index c132f124..435e6b7d 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "license": "ISC", "dependencies": { - "@google-cloud/firestore": "^4.8.1", + "@google-cloud/firestore": "^4.11.0", "@google-cloud/logging-bunyan": "^3.0.1", "@google-cloud/storage": "^5.1.1", "@types/bunyan": "^1.8.6", From 47bcf56f5d71d843da05155d8563ae7845588c59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 18:31:01 +0000 Subject: [PATCH 38/68] build(deps): bump lodash from 4.17.20 to 4.17.21 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index d9812c37..9cb8829f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3927,9 +3927,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.camelcase": { @@ -6263,14 +6263,6 @@ "shelljs": "^0.8.4", "shiki": "^0.9.3", "typedoc-default-themes": "^0.12.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - } } }, "typedoc-default-themes": { From 6b124f215d237d8e3af3eef36014c8b2533947c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 18:34:54 +0000 Subject: [PATCH 39/68] build(deps): bump json-2-csv from 3.7.8 to 3.11.1 Bumps [json-2-csv](https://github.com/mrodrig/json-2-csv) from 3.7.8 to 3.11.1. - [Release notes](https://github.com/mrodrig/json-2-csv/releases) - [Commits](https://github.com/mrodrig/json-2-csv/commits) Signed-off-by: dependabot[bot] --- package-lock.json | 31 ++++++++++++++++--------------- package.json | 4 ++-- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 495a17a6..c522c220 100644 --- a/package-lock.json +++ b/package-lock.json @@ -540,13 +540,14 @@ } }, "@google-cloud/firestore": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.8.1.tgz", - "integrity": "sha512-x/8ixlYqQuH9DoluhBj/uj3MqwoQN1lSCT2v+ieOXuh2L+8eoA7H+FF7f+UJ/D6hzo0MMWJd6q7QaBkpzp203Q==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.11.0.tgz", + "integrity": "sha512-Do9WJzEkFBBB+zVFvFfrrrIFEz086lrdgKQic7XsdoTgtYtq0yMu2u3kGLyxMbdasl2c2yf49FE4YvO3AYjQMQ==", "requires": { "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^2.9.2" + "google-gax": "^2.9.2", + "protobufjs": "^6.8.6" } }, "@google-cloud/logging": { @@ -2233,9 +2234,9 @@ } }, "deeks": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/deeks/-/deeks-2.2.7.tgz", - "integrity": "sha512-pCKFxSqyY2LAQ3qKQ+y+wOG63Bb9uDmDiHUVnrTR10AP75BVo2QMlgm36G+oPpRDPrgAiw5p9d+lAxdsqOwOyA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/deeks/-/deeks-2.3.0.tgz", + "integrity": "sha512-mrNI+TSdnK5s2Gal4Fv3/RGcrYGtB4NC3tTXU1hu74tYsG9JS6SzNKLD8doq6UWsglouGwC86kXqB1pdO+9hyA==" }, "deep-eql": { "version": "3.0.1", @@ -2345,9 +2346,9 @@ } }, "doc-path": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/doc-path/-/doc-path-2.1.2.tgz", - "integrity": "sha512-saM17czrIb4jYLsS5728OKbCa/WQ3xVctkGiMixOHz3X1VYsRn/Q5xPMxE1A5WN+XHHLWak34mMMjmAKRgMLeA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/doc-path/-/doc-path-2.3.0.tgz", + "integrity": "sha512-RMZA8AXl0I78jI9odw0kFzOfQvBcCFLI6/ZtOs9PwogcL4DHc+sCUZQ34fkealJyqErJryYODVBOtO2IzU/CSw==" }, "doctrine": { "version": "3.0.0", @@ -3799,12 +3800,12 @@ "dev": true }, "json-2-csv": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-3.7.8.tgz", - "integrity": "sha512-2CDoU32s/RA9a9xPRVsLDgk7UMW5u2SzrdklsNDl8tmdHUWT7JN2+eUV1hn1TuxJyrJxQjEXM5K4kTTnpY5+Pw==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-3.11.1.tgz", + "integrity": "sha512-TKGRDudkwV2MXB1YJw5KHM9aqHnE/VCpCvEdmezp6w3qJWB953m0U9ILDE3BKumHMRiYHSP44c8l0B+Ydz4CJw==", "requires": { - "deeks": "2.2.7", - "doc-path": "2.1.2" + "deeks": "2.3.0", + "doc-path": "2.3.0" } }, "json-bigint": { diff --git a/package.json b/package.json index c132f124..0610d652 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "license": "ISC", "dependencies": { - "@google-cloud/firestore": "^4.8.1", + "@google-cloud/firestore": "^4.11.0", "@google-cloud/logging-bunyan": "^3.0.1", "@google-cloud/storage": "^5.1.1", "@types/bunyan": "^1.8.6", @@ -64,7 +64,7 @@ "dotenv": "^8.2.0", "express": "^4.17.1", "express-fileupload": "^1.2.0", - "json-2-csv": "^3.7.4", + "json-2-csv": "^3.11.1", "multer": "^1.4.2", "remark": "^13.0.0" }, From 233186132304e5cdc83de38e68a57f83d5acc335 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 07:00:13 +0000 Subject: [PATCH 40/68] build(deps-dev): bump ts-node from 9.0.0 to 10.0.0 Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 9.0.0 to 10.0.0. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v9.0.0...v10.0.0) Signed-off-by: dependabot[bot] --- package-lock.json | 55 ++++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..18f46db6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -879,6 +879,30 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, + "@tsconfig/node10": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz", + "integrity": "sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.7.tgz", + "integrity": "sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", + "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, "@types/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", @@ -2158,6 +2182,12 @@ "vary": "^1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -6100,12 +6130,17 @@ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" }, "ts-node": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", - "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", + "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", "dev": true, "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.17", @@ -6159,6 +6194,20 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } } } }, diff --git a/package.json b/package.json index 5a20e46b..8d537d82 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "nyc": "^15.1.0", "prettier": "^2.1.2", "supertest": "^6.1.3", - "ts-node": "^9.0.0", + "ts-node": "^10.0.0", "ts-node-dev": "^1.1.6", "typedoc": "^0.20.36", "typescript": "^4.2.4" From a14746aceba5fb7756addc914757ab05b903db3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 07:02:22 +0000 Subject: [PATCH 41/68] build(deps): bump codacy/codacy-analysis-cli-action from 3.0.1 to 3.0.3 Bumps [codacy/codacy-analysis-cli-action](https://github.com/codacy/codacy-analysis-cli-action) from 3.0.1 to 3.0.3. - [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases) - [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/3.0.1...3.0.3) Signed-off-by: dependabot[bot] --- .github/workflows/codacy-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codacy-analysis.yml b/.github/workflows/codacy-analysis.yml index 60a326b6..6a921f5e 100644 --- a/.github/workflows/codacy-analysis.yml +++ b/.github/workflows/codacy-analysis.yml @@ -21,7 +21,7 @@ jobs: # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis - name: Run Codacy Analysis CLI - uses: codacy/codacy-analysis-cli-action@3.0.1 + uses: codacy/codacy-analysis-cli-action@3.0.3 with: # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository # You can also omit the token and run the tools that support default configurations From 0baf9eda1fd2d1b89b7e1e98f7acd75a69615b78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Jun 2021 06:30:10 +0000 Subject: [PATCH 42/68] build(deps): bump normalize-url from 4.5.0 to 4.5.1 Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1. - [Release notes](https://github.com/sindresorhus/normalize-url/releases) - [Commits](https://github.com/sindresorhus/normalize-url/commits) --- updated-dependencies: - dependency-name: normalize-url dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..620f63d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4698,9 +4698,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "nyc": { From 8e8cfb67ff4fbda5ca16365613362a1f1b7360c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Jun 2021 19:01:00 +0000 Subject: [PATCH 43/68] build(deps): bump glob-parent from 5.1.1 to 5.1.2 Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. - [Release notes](https://github.com/gulpjs/glob-parent/releases) - [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) - [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) --- updated-dependencies: - dependency-name: glob-parent dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..a6413427 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3144,9 +3144,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" From ab5be8008efac72c6f627b8302962d8ad8a56352 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 06:46:31 +0000 Subject: [PATCH 44/68] build(deps-dev): bump @typescript-eslint/eslint-plugin Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.6.1 to 4.26.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.26.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 169 ++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 119 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..373bdc4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -959,9 +959,9 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/long": { @@ -1043,40 +1043,73 @@ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, "@typescript-eslint/eslint-plugin": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", - "integrity": "sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz", + "integrity": "sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.6.1", - "@typescript-eslint/scope-manager": "4.6.1", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.26.1", + "@typescript-eslint/scope-manager": "4.26.1", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "lodash": "^4.17.21", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } } } }, "@typescript-eslint/experimental-utils": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", - "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz", + "integrity": "sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.6.1", - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/typescript-estree": "4.6.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.26.1", + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/typescript-estree": "4.26.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } } }, "@typescript-eslint/parser": { @@ -1144,52 +1177,86 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", - "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz", + "integrity": "sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/visitor-keys": "4.6.1" + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/visitor-keys": "4.26.1" } }, "@typescript-eslint/types": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", - "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.26.1.tgz", + "integrity": "sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", - "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz", + "integrity": "sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/visitor-keys": "4.6.1", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/visitor-keys": "4.26.1", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } } } }, "@typescript-eslint/visitor-keys": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", - "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz", + "integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/types": "4.26.1", "eslint-visitor-keys": "^2.0.0" } }, diff --git a/package.json b/package.json index 5a20e46b..6a109351 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@types/express": "^4.17.11", "@types/express-fileupload": "^1.1.6", "@types/mocha": "^8.2.2", - "@typescript-eslint/eslint-plugin": "^4.6.1", + "@typescript-eslint/eslint-plugin": "^4.26.1", "@typescript-eslint/parser": "^4.22.1", "chai": "^4.2.0", "eslint": "^7.12.1", From 3b5a6edc04ba654acb010901d7f47cfba50ea8fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 06:52:59 +0000 Subject: [PATCH 45/68] build(deps-dev): bump mocha from 8.2.1 to 9.0.0 Bumps [mocha](https://github.com/mochajs/mocha) from 8.2.1 to 9.0.0. - [Release notes](https://github.com/mochajs/mocha/releases) - [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md) - [Commits](https://github.com/mochajs/mocha/compare/v8.2.1...v9.0.0) --- updated-dependencies: - dependency-name: mocha dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 302 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 145 insertions(+), 159 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..ac2ac3e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3634,6 +3634,12 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -3949,12 +3955,13 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, "long": { @@ -4175,83 +4182,92 @@ } }, "mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-GRGG/q9bIaUkHJB9NL+KZNjDhMBHB30zW3bZW9qOiYr+QChyLjPzswaxFWkI1q6lGlSL28EQYzAi2vKWNkPx+g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.1.7", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", + "ms": "2.1.3", + "nanoid": "3.1.23", "serialize-javascript": "5.0.1", "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", + "supports-color": "8.1.1", "which": "2.0.2", "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", + "workerpool": "6.1.4", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "escape-string-regexp": { @@ -4270,17 +4286,41 @@ "path-exists": "^4.0.0" } }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } }, "locate-path": { "version": "6.0.0", @@ -4291,13 +4331,19 @@ "p-locate": "^5.0.0" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -4309,118 +4355,52 @@ "p-limit": "^3.0.2" } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -4574,9 +4554,9 @@ "optional": true }, "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", "dev": true }, "natural-compare": { @@ -6553,9 +6533,9 @@ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.4.tgz", + "integrity": "sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g==", "dev": true }, "wrap-ansi": { @@ -6672,6 +6652,12 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/package.json b/package.json index 5a20e46b..6f21176b 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "eslint-config-prettier": "^6.15.0", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-tsdoc": "^0.2.14", - "mocha": "^8.2.1", + "mocha": "^9.0.0", "nodemon": "^2.0.4", "nyc": "^15.1.0", "prettier": "^2.1.2", From e300e461ab80c884e982029ab59f974a985c93ac Mon Sep 17 00:00:00 2001 From: Susana Nakasato Date: Fri, 7 May 2021 16:15:05 -0300 Subject: [PATCH 46/68] =?UTF-8?q?feat:=20:sparkles:=20Adi=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20email=20no=20registro=20de=20usu=C3=A1rio=20Modifica=C3=A7?= =?UTF-8?q?=C3=A3o=20dos=20headers=20permitidos=20para=20receber=20email?= =?UTF-8?q?=20e=20modifica=C3=A7=C3=A3o=20da=20rota=20/register=20armazena?= =?UTF-8?q?r=20o=20email=20junto=20aos=20dados=20do=20usu=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/app.js | 130 +++++++++++++++----------------------- dist/routes/register.js | 60 +++++++++--------- src/ts/app.ts | 4 +- src/ts/routes/register.ts | 6 +- 4 files changed, 89 insertions(+), 111 deletions(-) diff --git a/dist/app.js b/dist/app.js index c1b1d3e0..5e5637dc 100644 --- a/dist/app.js +++ b/dist/app.js @@ -1,85 +1,59 @@ -'use strict'; -var __awaiter = - (this && this.__awaiter) || - function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P - ? value - : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator['throw'](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; -Object.defineProperty(exports, '__esModule', { value: true }); -const express = require('express'); -const bodyParser = require('body-parser'); -const cors = require('cors'); -const fileUpload = require('express-fileupload'); -const routes_1 = require('./routes/routes'); -const dotenv_1 = require('dotenv'); -const AuthDAO_1 = require('./models/DAO/AuthDAO'); +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express = require("express"); +const bodyParser = require("body-parser"); +const cors = require("cors"); +const fileUpload = require("express-fileupload"); +const routes_1 = require("./routes/routes"); +const dotenv_1 = require("dotenv"); +const AuthDAO_1 = require("./models/DAO/AuthDAO"); dotenv_1.config({ path: __dirname + '/../.env' }); const app = express(); -app.use( - fileUpload({ - createParentPath: true, - }) -); +app.use(fileUpload({ + createParentPath: true, +})); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); -app.use( - cors({ - allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission'], - exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission'], - origin: '*', - methods: 'GET,POST', - preflightContinue: false, - }) -); -app.all('*', (req, res, next) => - __awaiter(void 0, void 0, void 0, function* () { - const token = req.headers.token; - if (token) { - const authDAO = new AuthDAO_1.AuthDAO(token); - authDAO - .getAuth() - .then((auth) => { - req.company = auth.company; - req.agency = auth.agency; - if (auth.hasPermissionFor(req.url, req.method)) { - next(); - } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); - } - }) - .catch((err) => { - res.status(403).send('Usuário Inválido'); - }); - } else { - res.status(403).send('Token não informado!'); - } - }) -); +app.use(cors({ + allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission', 'email'], + exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], + origin: '*', + methods: 'GET,POST', + preflightContinue: false, +})); +app.all('*', (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { + const token = req.headers.token; + if (token) { + const authDAO = new AuthDAO_1.AuthDAO(token); + authDAO + .getAuth() + .then((auth) => { + req.company = auth.company; + req.agency = auth.agency; + if (auth.hasPermissionFor(req.url, req.method)) { + next(); + } + else { + res.status(403).send('Usuário sem permissão para realizar a ação!'); + } + }) + .catch((err) => { + res.status(403).send('Usuário Inválido'); + }); + } + else { + res.status(403).send('Token não informado!'); + } +})); routes_1.default(app); app.get('/', (req, res) => res.status(200).send('OK')); module.exports = app; diff --git a/dist/routes/register.js b/dist/routes/register.js index 74f29d57..d6a93983 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -1,32 +1,34 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -const AuthDAO_1 = require('../models/DAO/AuthDAO'); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const AuthDAO_1 = require("../models/DAO/AuthDAO"); const register = (app) => { - app.post('/register', (req, res) => { - const agency = req.headers.agency; - const company = req.company; - const token = req.headers.token; - const permission = req.headers.permission; - if ((!agency && permission === 'user') || !company || !permission) { - res.status(400).send({ message: 'Parâmetros incorretos!' }); - return; - } - const jsonPermission = { - permission, - }; - jsonPermission.company = company; - if (permission === 'user') { - jsonPermission.agency = agency; - } - const authDAO = new AuthDAO_1.AuthDAO(token); - authDAO - .addAuth(jsonPermission) - .then((token) => { - res.status(200).send(`Permissão adicionada para a empresa ${company}, token: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); - }); + app.post('/register', (req, res) => { + const agency = req.headers.agency; + const company = req.company; + const token = req.headers.token; + const email = req.headers.email; + const permission = req.headers.permission; + if ((!agency && permission === 'user') || !company || !permission || !email) { + res.status(400).send({ message: 'Parâmetros incorretos!' }); + return; + } + const jsonPermission = { + permission, + }; + jsonPermission.company = company; + if (permission === 'user') { + jsonPermission.agency = agency; + jsonPermission.email = email; + } + const authDAO = new AuthDAO_1.AuthDAO(token); + authDAO + .addAuth(jsonPermission) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + }); }; exports.default = register; diff --git a/src/ts/app.ts b/src/ts/app.ts index 86760fa8..5eada690 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -22,8 +22,8 @@ app.use(bodyParser.json()); app.use( cors({ - allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission'], - exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission'], + allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission', 'email'], + exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], origin: '*', methods: 'GET,POST', preflightContinue: false, diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 1e337cfd..a4de8f0a 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -5,8 +5,9 @@ const register = (app: { [key: string]: any }): void => { const agency = req.headers.agency; const company = req.company; const token = req.headers.token; + const email = req.headers.email; const permission = req.headers.permission; - if ((!agency && permission === 'user') || !company || !permission) { + if ((!agency && permission === 'user') || !company || !permission || !email) { res.status(400).send({ message: 'Parâmetros incorretos!' }); return; } @@ -16,12 +17,13 @@ const register = (app: { [key: string]: any }): void => { jsonPermission.company = company; if (permission === 'user') { jsonPermission.agency = agency; + jsonPermission.email = email; } const authDAO = new AuthDAO(token); authDAO .addAuth(jsonPermission) .then((token) => { - res.status(200).send(`Permissão adicionada para a empresa ${company}, token: ${token}`); + res.status(200).send(`Permissão adicionada para o email ${email}, senha: ${token}`); }) .catch((err) => { res.status(500).send('Falha ao criar permissão!'); From 5a15ee033b9b17fe73917a5471d542ac4f85acd7 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Date: Tue, 15 Jun 2021 11:11:51 -0300 Subject: [PATCH 47/68] feat: :sparkles: Add req validator, update Auth class, update doc Add express-validator, add register route req validator, update register route documentation, update the Auth class adding email property. --- Routes.md | 4 +-- dist/models/Auth.js | 59 +++++++++++++++++++---------------- dist/models/DAO/AuthDAO.js | 60 ++++++++++++++++++------------------ dist/routes/register.js | 37 +++++++++++----------- openapi-appengine.yaml | 11 +++++++ package-lock.json | 21 +++++++++++++ package.json | 1 + src/ts/models/Auth.ts | 10 +++++- src/ts/models/DAO/AuthDAO.ts | 6 ++-- src/ts/routes/register.ts | 60 ++++++++++++++++++++++-------------- 10 files changed, 165 insertions(+), 104 deletions(-) diff --git a/Routes.md b/Routes.md index 3df869d0..e16a9603 100644 --- a/Routes.md +++ b/Routes.md @@ -29,11 +29,11 @@ ### (POST) /register -**Parâmetros**: token, agency, permission, company. +**Parâmetros**: token, agency, permission, company, email. **Restrição**: Apenas tokens de usuários com nível de permissão **adm** ou **owner** podem acessar esta rota. -**Descrição**: Cria um novo usuário da API de acordo com os parâmetros de: **agency**, **company** e **permission** informados, e retorna um o tkoen de acesso do novo usuário. Caso o nível de permissão informado para o novo usuário seja **admin**, não é necessário informar o parâmetro **agency**. +**Descrição**: Cria um novo usuário da API de acordo com os parâmetros de: **agency**, **company**, **permission** e **email** informados, e retorna um token de acesso do novo usuário. Caso o nível de permissão informado para o novo usuário seja **admin**, não é necessário informar o parâmetro **agency**. ### (POST) /csv diff --git a/dist/models/Auth.js b/dist/models/Auth.js index 78e46aed..235c8a17 100644 --- a/dist/models/Auth.js +++ b/dist/models/Auth.js @@ -1,31 +1,36 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.Auth = void 0; -const RoutesPermission_1 = require('./RoutesPermission'); +const RoutesPermission_1 = require("./RoutesPermission"); class Auth { - constructor(permission, company, agency = '') { - this._permission = permission; - this._agency = agency; - this._company = company; - } - hasPermissionFor(route, method) { - return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); - } - toJson() { - return { - agency: this._agency, - company: this._company, - permission: this._permission, - }; - } - get permission() { - return this._permission; - } - get agency() { - return this._agency; - } - get company() { - return this._company; - } + constructor(permission, company, agency = '', email) { + this._permission = permission; + this._agency = agency; + this._company = company; + this._email = email; + } + hasPermissionFor(route, method) { + return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); + } + toJson() { + return { + agency: this._agency, + company: this._company, + permission: this._permission, + email: this._email + }; + } + get permission() { + return this._permission; + } + get agency() { + return this._agency; + } + get company() { + return this._company; + } + get email() { + return this._email; + } } exports.Auth = Auth; diff --git a/dist/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js index 0337a3b8..cd0b476c 100644 --- a/dist/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -1,34 +1,34 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.AuthDAO = void 0; -const FirestoreConnectionSingleton_1 = require('../cloud/FirestoreConnectionSingleton'); -const Auth_1 = require('../Auth'); +const FirestoreConnectionSingleton_1 = require("../cloud/FirestoreConnectionSingleton"); +const Auth_1 = require("../Auth"); class AuthDAO { - constructor(token) { - this._token = token; - this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); - this._pathToCollection = ['tokens']; - this._authCollection = this._objectStore.getCollection(this._pathToCollection); - } - getAuth() { - const pathToAuth = this._pathToCollection.concat(this._token); - return this._objectStore - .getDocument(pathToAuth) - .get() - .then((data) => { - const jsonAuth = data.data(); - return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency); - }) - .catch((err) => console.log(err)); - } - addAuth(jsonAuth) { - return this._objectStore - .addDocumentIn(this._authCollection, jsonAuth, '') - .get() - .then((data) => { - return data.id; - }) - .catch((err) => console.log(err)); - } + constructor(token) { + this._token = token; + this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); + this._pathToCollection = ['tokens']; + this._authCollection = this._objectStore.getCollection(this._pathToCollection); + } + getAuth() { + const pathToAuth = this._pathToCollection.concat(this._token); + return this._objectStore + .getDocument(pathToAuth) + .get() + .then((data) => { + const jsonAuth = data.data(); + return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); + }) + .catch((err) => console.log(err)); + } + addAuth(auth) { + return this._objectStore + .addDocumentIn(this._authCollection, auth.toJson(), '') + .get() + .then((data) => { + return data.id; + }) + .catch((err) => console.log(err)); + } } exports.AuthDAO = AuthDAO; diff --git a/dist/routes/register.js b/dist/routes/register.js index d6a93983..c72d4b2e 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -1,30 +1,31 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const express_validator_1 = require("express-validator"); +const Auth_1 = require("../models/Auth"); const AuthDAO_1 = require("../models/DAO/AuthDAO"); const register = (app) => { - app.post('/register', (req, res) => { - const agency = req.headers.agency; - const company = req.company; - const token = req.headers.token; - const email = req.headers.email; - const permission = req.headers.permission; - if ((!agency && permission === 'user') || !company || !permission || !email) { - res.status(400).send({ message: 'Parâmetros incorretos!' }); - return; + app.post('/register', express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), express_validator_1.header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), (req, res) => { + const validationErrors = express_validator_1.validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: "email", + value: req.header.agency, + location: "headers", + msg: "Parâmetro agency é obrigatório." + }); } - const jsonPermission = { - permission, - }; - jsonPermission.company = company; - if (permission === 'user') { - jsonPermission.agency = agency; - jsonPermission.email = email; + if (validationErrors.length > 0) { + const msg = validationErrors.map(err => err.msg).join(" "); + res.status(400).json({ message: msg }); + return; } + const newUserAuth = new Auth_1.Auth(req.headers.permission, req.headers.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email); + const token = req.headers.token; const authDAO = new AuthDAO_1.AuthDAO(token); authDAO - .addAuth(jsonPermission) + .addAuth(newUserAuth) .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${email}, senha: ${token}`); + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); }) .catch((err) => { res.status(500).send('Falha ao criar permissão!'); diff --git a/openapi-appengine.yaml b/openapi-appengine.yaml index c5656078..a797cd84 100644 --- a/openapi-appengine.yaml +++ b/openapi-appengine.yaml @@ -147,11 +147,22 @@ paths: - name: permission in: headers description: permission to new user + - name: company + in: headers + description: current company + - name: agency + in: headers + description: agency of the new user + - name: email + in: headers + description: email of the new user for login responses: 200: description: 'Success' schema: type: string + 400: + description: 'Bad request' 500: description: 'Internal server error' '/user': diff --git a/package-lock.json b/package-lock.json index 539bc26d..5bfdcd40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2804,6 +2804,22 @@ } } }, + "express-validator": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.11.1.tgz", + "integrity": "sha512-XAMdu1P6RESd8bvKtNdgNPsW+abkY6UQ2EVUqPpK6QVqieZKaLrN7W/zeFzDWZmgAy/RPEW8M4KYXMqQk6GmTA==", + "requires": { + "lodash": "^4.17.21", + "validator": "^13.5.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6445,6 +6461,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", + "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 5a20e46b..eda39d2d 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "express": "^4.17.1", "express-fileupload": "^1.2.0", "json-2-csv": "^3.11.1", + "express-validator": "^6.11.1", "multer": "^1.4.2", "remark": "^13.0.0" }, diff --git a/src/ts/models/Auth.ts b/src/ts/models/Auth.ts index 03f9cb76..225ac1aa 100644 --- a/src/ts/models/Auth.ts +++ b/src/ts/models/Auth.ts @@ -4,11 +4,13 @@ export class Auth { private _permission: string; private _agency: string; private _company: string; + private _email: string; - constructor(permission: string, company: string, agency = '') { + constructor(permission: string, company: string, agency = '', email: string) { this._permission = permission; this._agency = agency; this._company = company; + this._email = email; } /** @@ -28,6 +30,7 @@ export class Auth { agency: this._agency, company: this._company, permission: this._permission, + email: this._email }; } @@ -42,4 +45,9 @@ export class Auth { get company(): string { return this._company; } + + get email(): string { + return this._email; + } + } diff --git a/src/ts/models/DAO/AuthDAO.ts b/src/ts/models/DAO/AuthDAO.ts index 2d90a8a6..c252278f 100644 --- a/src/ts/models/DAO/AuthDAO.ts +++ b/src/ts/models/DAO/AuthDAO.ts @@ -23,14 +23,14 @@ export class AuthDAO { .get() .then((data) => { const jsonAuth = data.data(); - return new Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency); + return new Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); }) .catch((err) => console.log(err)); } - public addAuth(jsonAuth: { [key: string]: string }): Promise { + public addAuth(auth: Auth): Promise { return this._objectStore - .addDocumentIn(this._authCollection, jsonAuth, '') + .addDocumentIn(this._authCollection, auth.toJson(), '') .get() .then((data) => { return data.id; diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index a4de8f0a..08a3a9d4 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -1,33 +1,47 @@ +import { header, validationResult } from 'express-validator'; +import { Auth } from '../models/Auth'; import { AuthDAO } from '../models/DAO/AuthDAO'; const register = (app: { [key: string]: any }): void => { - app.post('/register', (req: { [key: string]: any }, res: { [key: string]: any }) => { - const agency = req.headers.agency; - const company = req.company; - const token = req.headers.token; - const email = req.headers.email; - const permission = req.headers.permission; - if ((!agency && permission === 'user') || !company || !permission || !email) { - res.status(400).send({ message: 'Parâmetros incorretos!' }); - return; + app.post('/register', + header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), + header('company').exists().withMessage('Parâmetro company é obrigatório.'), + header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), + (req: { [key: string]: any }, res: { [key: string]: any }) => { + + const validationErrors = validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: "email", + value: req.header.agency, + location: "headers", + msg: "Parâmetro agency é obrigatório." + }); } - const jsonPermission: { [key: string]: string } = { - permission, - }; - jsonPermission.company = company; - if (permission === 'user') { - jsonPermission.agency = agency; - jsonPermission.email = email; + if (validationErrors.length > 0) { + const msg = validationErrors.map(err => err.msg).join(" "); + res.status(400).json({message: msg}); + return; } + + const newUserAuth = new Auth( + req.headers.permission, + req.headers.company, + req.headers.permission === 'user' ? req.headers.agency : '', + req.headers.email + ) + + const token = req.headers.token; const authDAO = new AuthDAO(token); authDAO - .addAuth(jsonPermission) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + }); }; From 4b3933b361c6d7b38cf891492ca5d6242e9f710e Mon Sep 17 00:00:00 2001 From: susanakasato Date: Mon, 10 May 2021 17:23:55 +0000 Subject: [PATCH 48/68] style: :lipstick: Apply formatting changes --- dist/app.js | 141 +++++++++++++++++++++++-------------- dist/models/Auth.js | 64 ++++++++--------- dist/models/DAO/AuthDAO.js | 60 ++++++++-------- dist/routes/register.js | 80 ++++++++++++--------- openapi-appengine.yaml | 2 +- src/ts/app.ts | 13 +++- src/ts/models/Auth.ts | 3 +- src/ts/routes/register.ts | 72 +++++++++---------- 8 files changed, 249 insertions(+), 186 deletions(-) diff --git a/dist/app.js b/dist/app.js index 5e5637dc..2eed300f 100644 --- a/dist/app.js +++ b/dist/app.js @@ -1,59 +1,96 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const express = require("express"); -const bodyParser = require("body-parser"); -const cors = require("cors"); -const fileUpload = require("express-fileupload"); -const routes_1 = require("./routes/routes"); -const dotenv_1 = require("dotenv"); -const AuthDAO_1 = require("./models/DAO/AuthDAO"); +'use strict'; +var __awaiter = + (this && this.__awaiter) || + function (thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator['throw'](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; +Object.defineProperty(exports, '__esModule', { value: true }); +const express = require('express'); +const bodyParser = require('body-parser'); +const cors = require('cors'); +const fileUpload = require('express-fileupload'); +const routes_1 = require('./routes/routes'); +const dotenv_1 = require('dotenv'); +const AuthDAO_1 = require('./models/DAO/AuthDAO'); dotenv_1.config({ path: __dirname + '/../.env' }); const app = express(); -app.use(fileUpload({ - createParentPath: true, -})); +app.use( + fileUpload({ + createParentPath: true, + }) +); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); -app.use(cors({ - allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission', 'email'], - exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], - origin: '*', - methods: 'GET,POST', - preflightContinue: false, -})); -app.all('*', (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { - const token = req.headers.token; - if (token) { - const authDAO = new AuthDAO_1.AuthDAO(token); - authDAO - .getAuth() - .then((auth) => { - req.company = auth.company; - req.agency = auth.agency; - if (auth.hasPermissionFor(req.url, req.method)) { - next(); - } - else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); - } - }) - .catch((err) => { - res.status(403).send('Usuário Inválido'); - }); - } - else { - res.status(403).send('Token não informado!'); - } -})); +app.use( + cors({ + allowedHeaders: [ + 'token', + 'agency', + 'company', + 'campaign', + 'Content-Type', + 'file', + 'data', + 'config', + 'permission', + 'email', + ], + exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], + origin: '*', + methods: 'GET,POST', + preflightContinue: false, + }) +); +app.all('*', (req, res, next) => + __awaiter(void 0, void 0, void 0, function* () { + const token = req.headers.token; + if (token) { + const authDAO = new AuthDAO_1.AuthDAO(token); + authDAO + .getAuth() + .then((auth) => { + req.company = auth.company; + req.agency = auth.agency; + if (auth.hasPermissionFor(req.url, req.method)) { + next(); + } else { + res.status(403).send('Usuário sem permissão para realizar a ação!'); + } + }) + .catch((err) => { + res.status(403).send('Usuário Inválido'); + }); + } else { + res.status(403).send('Token não informado!'); + } + }) +); routes_1.default(app); app.get('/', (req, res) => res.status(200).send('OK')); module.exports = app; diff --git a/dist/models/Auth.js b/dist/models/Auth.js index 235c8a17..e97a1456 100644 --- a/dist/models/Auth.js +++ b/dist/models/Auth.js @@ -1,36 +1,36 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); exports.Auth = void 0; -const RoutesPermission_1 = require("./RoutesPermission"); +const RoutesPermission_1 = require('./RoutesPermission'); class Auth { - constructor(permission, company, agency = '', email) { - this._permission = permission; - this._agency = agency; - this._company = company; - this._email = email; - } - hasPermissionFor(route, method) { - return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); - } - toJson() { - return { - agency: this._agency, - company: this._company, - permission: this._permission, - email: this._email - }; - } - get permission() { - return this._permission; - } - get agency() { - return this._agency; - } - get company() { - return this._company; - } - get email() { - return this._email; - } + constructor(permission, company, agency = '', email) { + this._permission = permission; + this._agency = agency; + this._company = company; + this._email = email; + } + hasPermissionFor(route, method) { + return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); + } + toJson() { + return { + agency: this._agency, + company: this._company, + permission: this._permission, + email: this._email, + }; + } + get permission() { + return this._permission; + } + get agency() { + return this._agency; + } + get company() { + return this._company; + } + get email() { + return this._email; + } } exports.Auth = Auth; diff --git a/dist/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js index cd0b476c..425a8198 100644 --- a/dist/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -1,34 +1,34 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); exports.AuthDAO = void 0; -const FirestoreConnectionSingleton_1 = require("../cloud/FirestoreConnectionSingleton"); -const Auth_1 = require("../Auth"); +const FirestoreConnectionSingleton_1 = require('../cloud/FirestoreConnectionSingleton'); +const Auth_1 = require('../Auth'); class AuthDAO { - constructor(token) { - this._token = token; - this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); - this._pathToCollection = ['tokens']; - this._authCollection = this._objectStore.getCollection(this._pathToCollection); - } - getAuth() { - const pathToAuth = this._pathToCollection.concat(this._token); - return this._objectStore - .getDocument(pathToAuth) - .get() - .then((data) => { - const jsonAuth = data.data(); - return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); - }) - .catch((err) => console.log(err)); - } - addAuth(auth) { - return this._objectStore - .addDocumentIn(this._authCollection, auth.toJson(), '') - .get() - .then((data) => { - return data.id; - }) - .catch((err) => console.log(err)); - } + constructor(token) { + this._token = token; + this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); + this._pathToCollection = ['tokens']; + this._authCollection = this._objectStore.getCollection(this._pathToCollection); + } + getAuth() { + const pathToAuth = this._pathToCollection.concat(this._token); + return this._objectStore + .getDocument(pathToAuth) + .get() + .then((data) => { + const jsonAuth = data.data(); + return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); + }) + .catch((err) => console.log(err)); + } + addAuth(auth) { + return this._objectStore + .addDocumentIn(this._authCollection, auth.toJson(), '') + .get() + .then((data) => { + return data.id; + }) + .catch((err) => console.log(err)); + } } exports.AuthDAO = AuthDAO; diff --git a/dist/routes/register.js b/dist/routes/register.js index c72d4b2e..7de3acad 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -1,35 +1,51 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const express_validator_1 = require("express-validator"); -const Auth_1 = require("../models/Auth"); -const AuthDAO_1 = require("../models/DAO/AuthDAO"); +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +const express_validator_1 = require('express-validator'); +const Auth_1 = require('../models/Auth'); +const AuthDAO_1 = require('../models/DAO/AuthDAO'); const register = (app) => { - app.post('/register', express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), express_validator_1.header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), (req, res) => { - const validationErrors = express_validator_1.validationResult(req).array(); - if (!req.headers.agency) { - validationErrors.push({ - param: "email", - value: req.header.agency, - location: "headers", - msg: "Parâmetro agency é obrigatório." - }); - } - if (validationErrors.length > 0) { - const msg = validationErrors.map(err => err.msg).join(" "); - res.status(400).json({ message: msg }); - return; - } - const newUserAuth = new Auth_1.Auth(req.headers.permission, req.headers.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email); - const token = req.headers.token; - const authDAO = new AuthDAO_1.AuthDAO(token); - authDAO - .addAuth(newUserAuth) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); - }); + app.post( + '/register', + express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), + express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), + express_validator_1 + .header('email') + .exists() + .withMessage('Parâmetro email é obrigatório.') + .isEmail() + .withMessage('Email inválido.'), + (req, res) => { + const validationErrors = express_validator_1.validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: 'email', + value: req.header.agency, + location: 'headers', + msg: 'Parâmetro agency é obrigatório.', + }); + } + if (validationErrors.length > 0) { + const msg = validationErrors.map((err) => err.msg).join(' '); + res.status(400).json({ message: msg }); + return; + } + const newUserAuth = new Auth_1.Auth( + req.headers.permission, + req.headers.company, + req.headers.permission === 'user' ? req.headers.agency : '', + req.headers.email + ); + const token = req.headers.token; + const authDAO = new AuthDAO_1.AuthDAO(token); + authDAO + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + } + ); }; exports.default = register; diff --git a/openapi-appengine.yaml b/openapi-appengine.yaml index a797cd84..2f9c8b40 100644 --- a/openapi-appengine.yaml +++ b/openapi-appengine.yaml @@ -161,7 +161,7 @@ paths: description: 'Success' schema: type: string - 400: + 400: description: 'Bad request' 500: description: 'Internal server error' diff --git a/src/ts/app.ts b/src/ts/app.ts index 5eada690..b137041d 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -22,7 +22,18 @@ app.use(bodyParser.json()); app.use( cors({ - allowedHeaders: ['token', 'agency', 'company', 'campaign', 'Content-Type', 'file', 'data', 'config', 'permission', 'email'], + allowedHeaders: [ + 'token', + 'agency', + 'company', + 'campaign', + 'Content-Type', + 'file', + 'data', + 'config', + 'permission', + 'email', + ], exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], origin: '*', methods: 'GET,POST', diff --git a/src/ts/models/Auth.ts b/src/ts/models/Auth.ts index 225ac1aa..f827f2e1 100644 --- a/src/ts/models/Auth.ts +++ b/src/ts/models/Auth.ts @@ -30,7 +30,7 @@ export class Auth { agency: this._agency, company: this._company, permission: this._permission, - email: this._email + email: this._email, }; } @@ -49,5 +49,4 @@ export class Auth { get email(): string { return this._email; } - } diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 08a3a9d4..7163a49d 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -3,46 +3,46 @@ import { Auth } from '../models/Auth'; import { AuthDAO } from '../models/DAO/AuthDAO'; const register = (app: { [key: string]: any }): void => { - app.post('/register', - header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), + app.post( + '/register', + header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), header('company').exists().withMessage('Parâmetro company é obrigatório.'), header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), - (req: { [key: string]: any }, res: { [key: string]: any }) => { + (req: { [key: string]: any }, res: { [key: string]: any }) => { + const validationErrors = validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: 'email', + value: req.header.agency, + location: 'headers', + msg: 'Parâmetro agency é obrigatório.', + }); + } + if (validationErrors.length > 0) { + const msg = validationErrors.map((err) => err.msg).join(' '); + res.status(400).json({ message: msg }); + return; + } - const validationErrors = validationResult(req).array(); - if (!req.headers.agency) { - validationErrors.push({ - param: "email", - value: req.header.agency, - location: "headers", - msg: "Parâmetro agency é obrigatório." - }); - } - if (validationErrors.length > 0) { - const msg = validationErrors.map(err => err.msg).join(" "); - res.status(400).json({message: msg}); - return; - } - - const newUserAuth = new Auth( - req.headers.permission, - req.headers.company, - req.headers.permission === 'user' ? req.headers.agency : '', - req.headers.email - ) + const newUserAuth = new Auth( + req.headers.permission, + req.headers.company, + req.headers.permission === 'user' ? req.headers.agency : '', + req.headers.email + ); - const token = req.headers.token; - const authDAO = new AuthDAO(token); - authDAO - .addAuth(newUserAuth) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); - - }); + const token = req.headers.token; + const authDAO = new AuthDAO(token); + authDAO + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + } + ); }; export default register; From d65964084527932f07903a39bfd50c4d22d8abe9 Mon Sep 17 00:00:00 2001 From: Susana Nakasato Date: Mon, 10 May 2021 14:01:04 -0300 Subject: [PATCH 49/68] feat: :sparkles: Add req validator, update Auth class, update doc Add express-validator, add register route req validator, update register route documentation, update the Auth class adding email property. --- dist/models/Auth.js | 64 +++++++++++++++--------------- dist/models/DAO/AuthDAO.js | 60 ++++++++++++++-------------- dist/routes/register.js | 80 +++++++++++++++----------------------- src/ts/routes/register.ts | 72 +++++++++++++++++----------------- 4 files changed, 130 insertions(+), 146 deletions(-) diff --git a/dist/models/Auth.js b/dist/models/Auth.js index e97a1456..235c8a17 100644 --- a/dist/models/Auth.js +++ b/dist/models/Auth.js @@ -1,36 +1,36 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.Auth = void 0; -const RoutesPermission_1 = require('./RoutesPermission'); +const RoutesPermission_1 = require("./RoutesPermission"); class Auth { - constructor(permission, company, agency = '', email) { - this._permission = permission; - this._agency = agency; - this._company = company; - this._email = email; - } - hasPermissionFor(route, method) { - return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); - } - toJson() { - return { - agency: this._agency, - company: this._company, - permission: this._permission, - email: this._email, - }; - } - get permission() { - return this._permission; - } - get agency() { - return this._agency; - } - get company() { - return this._company; - } - get email() { - return this._email; - } + constructor(permission, company, agency = '', email) { + this._permission = permission; + this._agency = agency; + this._company = company; + this._email = email; + } + hasPermissionFor(route, method) { + return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); + } + toJson() { + return { + agency: this._agency, + company: this._company, + permission: this._permission, + email: this._email + }; + } + get permission() { + return this._permission; + } + get agency() { + return this._agency; + } + get company() { + return this._company; + } + get email() { + return this._email; + } } exports.Auth = Auth; diff --git a/dist/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js index 425a8198..cd0b476c 100644 --- a/dist/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -1,34 +1,34 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.AuthDAO = void 0; -const FirestoreConnectionSingleton_1 = require('../cloud/FirestoreConnectionSingleton'); -const Auth_1 = require('../Auth'); +const FirestoreConnectionSingleton_1 = require("../cloud/FirestoreConnectionSingleton"); +const Auth_1 = require("../Auth"); class AuthDAO { - constructor(token) { - this._token = token; - this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); - this._pathToCollection = ['tokens']; - this._authCollection = this._objectStore.getCollection(this._pathToCollection); - } - getAuth() { - const pathToAuth = this._pathToCollection.concat(this._token); - return this._objectStore - .getDocument(pathToAuth) - .get() - .then((data) => { - const jsonAuth = data.data(); - return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); - }) - .catch((err) => console.log(err)); - } - addAuth(auth) { - return this._objectStore - .addDocumentIn(this._authCollection, auth.toJson(), '') - .get() - .then((data) => { - return data.id; - }) - .catch((err) => console.log(err)); - } + constructor(token) { + this._token = token; + this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); + this._pathToCollection = ['tokens']; + this._authCollection = this._objectStore.getCollection(this._pathToCollection); + } + getAuth() { + const pathToAuth = this._pathToCollection.concat(this._token); + return this._objectStore + .getDocument(pathToAuth) + .get() + .then((data) => { + const jsonAuth = data.data(); + return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); + }) + .catch((err) => console.log(err)); + } + addAuth(auth) { + return this._objectStore + .addDocumentIn(this._authCollection, auth.toJson(), '') + .get() + .then((data) => { + return data.id; + }) + .catch((err) => console.log(err)); + } } exports.AuthDAO = AuthDAO; diff --git a/dist/routes/register.js b/dist/routes/register.js index 7de3acad..c72d4b2e 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -1,51 +1,35 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -const express_validator_1 = require('express-validator'); -const Auth_1 = require('../models/Auth'); -const AuthDAO_1 = require('../models/DAO/AuthDAO'); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_validator_1 = require("express-validator"); +const Auth_1 = require("../models/Auth"); +const AuthDAO_1 = require("../models/DAO/AuthDAO"); const register = (app) => { - app.post( - '/register', - express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), - express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), - express_validator_1 - .header('email') - .exists() - .withMessage('Parâmetro email é obrigatório.') - .isEmail() - .withMessage('Email inválido.'), - (req, res) => { - const validationErrors = express_validator_1.validationResult(req).array(); - if (!req.headers.agency) { - validationErrors.push({ - param: 'email', - value: req.header.agency, - location: 'headers', - msg: 'Parâmetro agency é obrigatório.', - }); - } - if (validationErrors.length > 0) { - const msg = validationErrors.map((err) => err.msg).join(' '); - res.status(400).json({ message: msg }); - return; - } - const newUserAuth = new Auth_1.Auth( - req.headers.permission, - req.headers.company, - req.headers.permission === 'user' ? req.headers.agency : '', - req.headers.email - ); - const token = req.headers.token; - const authDAO = new AuthDAO_1.AuthDAO(token); - authDAO - .addAuth(newUserAuth) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); - } - ); + app.post('/register', express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), express_validator_1.header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), (req, res) => { + const validationErrors = express_validator_1.validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: "email", + value: req.header.agency, + location: "headers", + msg: "Parâmetro agency é obrigatório." + }); + } + if (validationErrors.length > 0) { + const msg = validationErrors.map(err => err.msg).join(" "); + res.status(400).json({ message: msg }); + return; + } + const newUserAuth = new Auth_1.Auth(req.headers.permission, req.headers.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email); + const token = req.headers.token; + const authDAO = new AuthDAO_1.AuthDAO(token); + authDAO + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + }); }; exports.default = register; diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 7163a49d..08a3a9d4 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -3,46 +3,46 @@ import { Auth } from '../models/Auth'; import { AuthDAO } from '../models/DAO/AuthDAO'; const register = (app: { [key: string]: any }): void => { - app.post( - '/register', - header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), + app.post('/register', + header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), header('company').exists().withMessage('Parâmetro company é obrigatório.'), header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), - (req: { [key: string]: any }, res: { [key: string]: any }) => { - const validationErrors = validationResult(req).array(); - if (!req.headers.agency) { - validationErrors.push({ - param: 'email', - value: req.header.agency, - location: 'headers', - msg: 'Parâmetro agency é obrigatório.', - }); - } - if (validationErrors.length > 0) { - const msg = validationErrors.map((err) => err.msg).join(' '); - res.status(400).json({ message: msg }); - return; - } + (req: { [key: string]: any }, res: { [key: string]: any }) => { - const newUserAuth = new Auth( - req.headers.permission, - req.headers.company, - req.headers.permission === 'user' ? req.headers.agency : '', - req.headers.email - ); - - const token = req.headers.token; - const authDAO = new AuthDAO(token); - authDAO - .addAuth(newUserAuth) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); + const validationErrors = validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: "email", + value: req.header.agency, + location: "headers", + msg: "Parâmetro agency é obrigatório." + }); + } + if (validationErrors.length > 0) { + const msg = validationErrors.map(err => err.msg).join(" "); + res.status(400).json({message: msg}); + return; } - ); + + const newUserAuth = new Auth( + req.headers.permission, + req.headers.company, + req.headers.permission === 'user' ? req.headers.agency : '', + req.headers.email + ) + + const token = req.headers.token; + const authDAO = new AuthDAO(token); + authDAO + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + + }); }; export default register; From 728b70d03de60e8c6bf6730f6b28cb6869d7ecf5 Mon Sep 17 00:00:00 2001 From: LucasTonetto Date: Thu, 13 May 2021 17:17:10 +0000 Subject: [PATCH 50/68] style: :lipstick: Apply formatting changes --- dist/models/Auth.js | 64 +++++++++++++++--------------- dist/models/DAO/AuthDAO.js | 60 ++++++++++++++-------------- dist/routes/register.js | 80 +++++++++++++++++++++++--------------- package.json | 1 - src/ts/routes/register.ts | 72 +++++++++++++++++----------------- 5 files changed, 146 insertions(+), 131 deletions(-) diff --git a/dist/models/Auth.js b/dist/models/Auth.js index 235c8a17..e97a1456 100644 --- a/dist/models/Auth.js +++ b/dist/models/Auth.js @@ -1,36 +1,36 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); exports.Auth = void 0; -const RoutesPermission_1 = require("./RoutesPermission"); +const RoutesPermission_1 = require('./RoutesPermission'); class Auth { - constructor(permission, company, agency = '', email) { - this._permission = permission; - this._agency = agency; - this._company = company; - this._email = email; - } - hasPermissionFor(route, method) { - return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); - } - toJson() { - return { - agency: this._agency, - company: this._company, - permission: this._permission, - email: this._email - }; - } - get permission() { - return this._permission; - } - get agency() { - return this._agency; - } - get company() { - return this._company; - } - get email() { - return this._email; - } + constructor(permission, company, agency = '', email) { + this._permission = permission; + this._agency = agency; + this._company = company; + this._email = email; + } + hasPermissionFor(route, method) { + return new RoutesPermission_1.RoutesPermission(route, method).validatePermission(this); + } + toJson() { + return { + agency: this._agency, + company: this._company, + permission: this._permission, + email: this._email, + }; + } + get permission() { + return this._permission; + } + get agency() { + return this._agency; + } + get company() { + return this._company; + } + get email() { + return this._email; + } } exports.Auth = Auth; diff --git a/dist/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js index cd0b476c..425a8198 100644 --- a/dist/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -1,34 +1,34 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); exports.AuthDAO = void 0; -const FirestoreConnectionSingleton_1 = require("../cloud/FirestoreConnectionSingleton"); -const Auth_1 = require("../Auth"); +const FirestoreConnectionSingleton_1 = require('../cloud/FirestoreConnectionSingleton'); +const Auth_1 = require('../Auth'); class AuthDAO { - constructor(token) { - this._token = token; - this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); - this._pathToCollection = ['tokens']; - this._authCollection = this._objectStore.getCollection(this._pathToCollection); - } - getAuth() { - const pathToAuth = this._pathToCollection.concat(this._token); - return this._objectStore - .getDocument(pathToAuth) - .get() - .then((data) => { - const jsonAuth = data.data(); - return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); - }) - .catch((err) => console.log(err)); - } - addAuth(auth) { - return this._objectStore - .addDocumentIn(this._authCollection, auth.toJson(), '') - .get() - .then((data) => { - return data.id; - }) - .catch((err) => console.log(err)); - } + constructor(token) { + this._token = token; + this._objectStore = FirestoreConnectionSingleton_1.FirestoreConnectionSingleton.getInstance(); + this._pathToCollection = ['tokens']; + this._authCollection = this._objectStore.getCollection(this._pathToCollection); + } + getAuth() { + const pathToAuth = this._pathToCollection.concat(this._token); + return this._objectStore + .getDocument(pathToAuth) + .get() + .then((data) => { + const jsonAuth = data.data(); + return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); + }) + .catch((err) => console.log(err)); + } + addAuth(auth) { + return this._objectStore + .addDocumentIn(this._authCollection, auth.toJson(), '') + .get() + .then((data) => { + return data.id; + }) + .catch((err) => console.log(err)); + } } exports.AuthDAO = AuthDAO; diff --git a/dist/routes/register.js b/dist/routes/register.js index c72d4b2e..7de3acad 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -1,35 +1,51 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const express_validator_1 = require("express-validator"); -const Auth_1 = require("../models/Auth"); -const AuthDAO_1 = require("../models/DAO/AuthDAO"); +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +const express_validator_1 = require('express-validator'); +const Auth_1 = require('../models/Auth'); +const AuthDAO_1 = require('../models/DAO/AuthDAO'); const register = (app) => { - app.post('/register', express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), express_validator_1.header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), (req, res) => { - const validationErrors = express_validator_1.validationResult(req).array(); - if (!req.headers.agency) { - validationErrors.push({ - param: "email", - value: req.header.agency, - location: "headers", - msg: "Parâmetro agency é obrigatório." - }); - } - if (validationErrors.length > 0) { - const msg = validationErrors.map(err => err.msg).join(" "); - res.status(400).json({ message: msg }); - return; - } - const newUserAuth = new Auth_1.Auth(req.headers.permission, req.headers.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email); - const token = req.headers.token; - const authDAO = new AuthDAO_1.AuthDAO(token); - authDAO - .addAuth(newUserAuth) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); - }); + app.post( + '/register', + express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), + express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), + express_validator_1 + .header('email') + .exists() + .withMessage('Parâmetro email é obrigatório.') + .isEmail() + .withMessage('Email inválido.'), + (req, res) => { + const validationErrors = express_validator_1.validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: 'email', + value: req.header.agency, + location: 'headers', + msg: 'Parâmetro agency é obrigatório.', + }); + } + if (validationErrors.length > 0) { + const msg = validationErrors.map((err) => err.msg).join(' '); + res.status(400).json({ message: msg }); + return; + } + const newUserAuth = new Auth_1.Auth( + req.headers.permission, + req.headers.company, + req.headers.permission === 'user' ? req.headers.agency : '', + req.headers.email + ); + const token = req.headers.token; + const authDAO = new AuthDAO_1.AuthDAO(token); + authDAO + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + } + ); }; exports.default = register; diff --git a/package.json b/package.json index eda39d2d..5a20e46b 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "express": "^4.17.1", "express-fileupload": "^1.2.0", "json-2-csv": "^3.11.1", - "express-validator": "^6.11.1", "multer": "^1.4.2", "remark": "^13.0.0" }, diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 08a3a9d4..7163a49d 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -3,46 +3,46 @@ import { Auth } from '../models/Auth'; import { AuthDAO } from '../models/DAO/AuthDAO'; const register = (app: { [key: string]: any }): void => { - app.post('/register', - header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), + app.post( + '/register', + header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), header('company').exists().withMessage('Parâmetro company é obrigatório.'), header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), - (req: { [key: string]: any }, res: { [key: string]: any }) => { + (req: { [key: string]: any }, res: { [key: string]: any }) => { + const validationErrors = validationResult(req).array(); + if (!req.headers.agency) { + validationErrors.push({ + param: 'email', + value: req.header.agency, + location: 'headers', + msg: 'Parâmetro agency é obrigatório.', + }); + } + if (validationErrors.length > 0) { + const msg = validationErrors.map((err) => err.msg).join(' '); + res.status(400).json({ message: msg }); + return; + } - const validationErrors = validationResult(req).array(); - if (!req.headers.agency) { - validationErrors.push({ - param: "email", - value: req.header.agency, - location: "headers", - msg: "Parâmetro agency é obrigatório." - }); - } - if (validationErrors.length > 0) { - const msg = validationErrors.map(err => err.msg).join(" "); - res.status(400).json({message: msg}); - return; - } - - const newUserAuth = new Auth( - req.headers.permission, - req.headers.company, - req.headers.permission === 'user' ? req.headers.agency : '', - req.headers.email - ) + const newUserAuth = new Auth( + req.headers.permission, + req.headers.company, + req.headers.permission === 'user' ? req.headers.agency : '', + req.headers.email + ); - const token = req.headers.token; - const authDAO = new AuthDAO(token); - authDAO - .addAuth(newUserAuth) - .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); - }) - .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); - }); - - }); + const token = req.headers.token; + const authDAO = new AuthDAO(token); + authDAO + .addAuth(newUserAuth) + .then((token) => { + res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + }) + .catch((err) => { + res.status(500).send('Falha ao criar permissão!'); + }); + } + ); }; export default register; From 9e2dcb3b94efbce849732dbafaa38f0ee99de8dd Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Sat, 22 May 2021 19:49:15 -0300 Subject: [PATCH 51/68] feat: :rocket: Deploy com Terraform Inclusao dos scrips de deploy com terraform Criacao dos scripts de deploy com terraform, utilizacao das variaveis de ambiente e atualizacao das documentacoes --- .gitignore | 5 +- README.md | 48 ++++++--- .../cloud/FirestoreConnectionSingleton.js | 8 +- .../cloud/StorageConnectionSingleton.js | 10 +- index.js | 2 +- package.json | 2 +- .../cloud/FirestoreConnectionSingleton.ts | 10 +- .../cloud/StorageConnectionSingleton.ts | 12 +-- terraform/config_schemas/adobe.json | 37 +++++++ terraform/config_schemas/ga.json | 37 +++++++ terraform/main.tf | 100 ++++++++++++++++++ terraform/provider.tf | 5 + terraform/scripts/create-dotenv.sh | 18 ++++ .../scripts/using-local-adinfo-project.sh | 17 +++ terraform/variables.tf | 61 +++++++++++ terraform_deploy.sh | 10 ++ terraform_validate.sh | 2 + 17 files changed, 351 insertions(+), 33 deletions(-) create mode 100644 terraform/config_schemas/adobe.json create mode 100644 terraform/config_schemas/ga.json create mode 100644 terraform/main.tf create mode 100644 terraform/provider.tf create mode 100644 terraform/scripts/create-dotenv.sh create mode 100644 terraform/scripts/using-local-adinfo-project.sh create mode 100644 terraform/variables.tf create mode 100644 terraform_deploy.sh create mode 100644 terraform_validate.sh diff --git a/.gitignore b/.gitignore index ff28f9e9..d06f985d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,7 @@ node_modules/ config/ gcp_key.json .nyc_output -coverage \ No newline at end of file +coverage +terraform/terraform.tfstate* +terraform/.terraform/ +terraform/.terraform.lock.hcl \ No newline at end of file diff --git a/README.md b/README.md index 22d3c4d0..09271a6a 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Os principais componentes no uso da aplicação são a **configuração**, um JS - **test**: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/; - **lint**: Submete o código a uma avaliação do [ESLint](https://eslint.org/); - **lint-fix**: Submete o código a uma avaliação do [ESLint](https://eslint.org/) e aplica correções automaticamente ao código; -- **compile**: Exclui os arquivos da pasta dist/ e compila o código do typescript para javascript, guardando-o na pasta dist/; +- **compile**: Compila o código do typescript para javascript, guardando-o na pasta dist/; - **auto-compile**: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta dist/, sem excluir o conteúdo anterior; - **prettier**: Formata todo o código das pastas src/ e test/, utilizando o [Prettier](https://prettier.io/), de acordo com a configuração descrita no arquivo .prettierrc; - **coverage**: Análise da cobertura dos testes; @@ -52,7 +52,31 @@ Clone o projeto do github para sua máquina local ou Cloud Shell git clone https://github.com/DP6/penguin-adinfo.git ``` -### Instalação GCP (sugerida) +### Instalação GCP via Terraform + +#### Pré-requisitos + +1. [Google Cloud SDK](https://cloud.google.com/sdk/docs/install?hl=pt-br); +2. Pacote zip; +3. [Terraform](https://www.terraform.io/); +4. Habilitar o App Engine em ambiente de execução Node.js, Firestore e Cloud Storage (necessário ter um billing ativo), no GCP. + +#### Passos + +1. Execute o script **terraform_deploy.sh**; + +2. Informe o nome da empresa, ferramenta analítica utilizada para a criação de um exemplo de configuração (Adobe Analytics ou Google Analytics) e o id do projeto. Também é possível informar o número da porta onde o adinfo irá rodar, entretanto esse último valor é opcional, caso nenhuma porta seja específica, por padrão ele executará na porta 443; + +3. Crie uma coleção no Firestore com o nome de **tokens** e insira um primeiro token com os seguintes campos (deixe o id do documento vazio para que seja gerado automaticamente): + + ```json + { + company: "NOME_EMPRESA" (string) + permission: "owner"(string) + } + ``` + +### Instalação manual - GCP Durante toda a etapa de desenvolvimento do adinfo ele é hospedado no serviço de App Engine do GCP, além de armazenar informações no Firestore e Storage. @@ -62,7 +86,7 @@ Por padrão, ao utilizar o adinfo dentro do App Engine, basta conceder acesso à ##### Configuração inicial do Storage -Crie um bucket para armazenar os arquivos do adinfo. O bucket em questão deve ser informado no atributo \_bucket da classe **StorageConnectionSingleton**, por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência. +Crie um bucket para armazenar os arquivos do adinfo, o bucket em questão deve ser informado no .env. Por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência. ##### Configuração inicial do Firestore @@ -72,9 +96,9 @@ Para a configuração inicial do Firestore, são necessárias duas coleções. - **tokens**: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura: - ``` + ```json { - company: "arthurltda" (string) + company: "NOME_EMPRESA" (string) permission: "owner"(string) } ``` @@ -99,7 +123,7 @@ Abaixo segue uma explicação e um exemplo de todos os campos das configuraçõe **Exemplo de configuração**: -```json +```javascript { "separator": ":", "spaceSeparator": "_", @@ -166,13 +190,13 @@ No caso de substituir o uso do Firestore para armazenamento de chaves. A nova cl 1. **Arquivo .env**: O arquivo .env deve estar localizado na raiz do projeto. É necessário editar as seguintes variáveis -- DEVELOPMENT: Deve apresentar o valor true, caso o ambiente atual seja o ambiente de desenvolvimento local. Caso nenhum valor seja informado, a API irá assumir como padrão o valor false, indicando o ambiente de produção; - -- PORT: Deve conter o número da porta onde a API será acessada. Em caso de omissão desse parâmetro, a porta considerada será 443. - -2. **Chave de acesso - GCP**: A chave de acesso aos serviços do gcp também deve estar localizada na pasta raiz do projeto, assim como o .env. O arquivo json da chave de acesso deve ser nomeado como gcp_key.json. +- ENV: Deve apresentar o valor 'development', caso o ambiente atual seja o ambiente de desenvolvimento local, ou 'prod', caso o ambiente seja de produção; +- PORT: Deve conter o número da porta onde a API será acessada. Em caso de omissão desse parâmetro, a porta considerada será 443; +- BUCKET: Deve conter o nome do bucket do storage onde os arquivos CSVs serão salvos; +- GCP_PROJECT_ID: Deve conter o id do projeto no GCP, caso o adinfo esteja hospedado no GCP; +- GCP_KEY: Deve conter o JSON da chave de acesso aos serviços do GCP; -3. **Arquivo .gitignore**: Checar se o arquivo .gitignore está ignorando o versionamento da chave e do arquivo .env. +2. **Arquivo .gitignore**: Checar se o arquivo .gitignore está ignorando do arquivo .env. ## Como contribuir diff --git a/dist/models/cloud/FirestoreConnectionSingleton.js b/dist/models/cloud/FirestoreConnectionSingleton.js index 4f510e2b..a92839cc 100644 --- a/dist/models/cloud/FirestoreConnectionSingleton.js +++ b/dist/models/cloud/FirestoreConnectionSingleton.js @@ -6,9 +6,11 @@ const ObjectStore_1 = require('../DAO/ObjectStore'); class FirestoreConnectionSingleton extends ObjectStore_1.ObjectStore { constructor() { super(); - if (process.env.DEVELOPMENT) { - const credentials = require('../../../gcp_key.json'); - this._db = new firestore_1.Firestore({ projectId: 'adinfo', credentials }); + if (process.env.ENV === 'development') { + this._db = new firestore_1.Firestore({ + projectId: process.env.GCP_PROJECT_ID, + credentials: JSON.parse(process.env.GCP_KEY), + }); } else { this._db = new firestore_1.Firestore(); } diff --git a/dist/models/cloud/StorageConnectionSingleton.js b/dist/models/cloud/StorageConnectionSingleton.js index 415304b2..835e308e 100644 --- a/dist/models/cloud/StorageConnectionSingleton.js +++ b/dist/models/cloud/StorageConnectionSingleton.js @@ -6,10 +6,12 @@ const FileStore_1 = require('../DAO/FileStore'); class StorageConnectionSingleton extends FileStore_1.FileStore { constructor() { super(); - this._bucket = `adinfo-dp6-files`; - if (process.env.DEVELOPMENT) { - const credentials = require('../../../gcp_key.json'); - this._db = new storage_1.Storage({ projectId: 'adinfo', credentials }); + this._bucket = process.env.BUCKET; + if (process.env.ENV === 'development') { + this._db = new storage_1.Storage({ + projectId: process.env.GCP_PROJECT_ID, + credentials: JSON.parse(process.env.GCP_KEY), + }); } else { this._db = new storage_1.Storage(); } diff --git a/index.js b/index.js index ce1f5e86..697b18ca 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ const app = require('./dist/app.js'); const port = process.env.PORT || 443; app.listen(port, () => { - if (process.env.NODE_ENV === 'development') { + if (process.env.ENV === 'development') { console.log(`Example app listening at http://localhost:${port}`); } }); diff --git a/package.json b/package.json index 5a20e46b..a2f4bd7c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "eslint ./src --ext .ts", "lint-prettier": "npx prettier --check .", "lint-fix": "eslint ./src --ext .ts --fix", - "compile": "del /s /q dist && tsc", + "compile": "tsc", "auto-compile": "tsc -w", "format": "npx prettier --write .", "build": "npm run compile", diff --git a/src/ts/models/cloud/FirestoreConnectionSingleton.ts b/src/ts/models/cloud/FirestoreConnectionSingleton.ts index 10b4eb4b..7acea84b 100644 --- a/src/ts/models/cloud/FirestoreConnectionSingleton.ts +++ b/src/ts/models/cloud/FirestoreConnectionSingleton.ts @@ -7,11 +7,11 @@ export class FirestoreConnectionSingleton extends ObjectStore { private constructor() { super(); - if (process.env.DEVELOPMENT) { - /* eslint-disable @typescript-eslint/no-var-requires */ - const credentials = require('../../../gcp_key.json'); - /* eslint-enable @typescript-eslint/no-var-requires */ - this._db = new Firestore({ projectId: 'adinfo', credentials }); + if (process.env.ENV === 'development') { + this._db = new Firestore({ + projectId: process.env.GCP_PROJECT_ID, + credentials: JSON.parse(process.env.GCP_KEY), + }); } else { this._db = new Firestore(); } diff --git a/src/ts/models/cloud/StorageConnectionSingleton.ts b/src/ts/models/cloud/StorageConnectionSingleton.ts index 1530d11f..fcbe0839 100644 --- a/src/ts/models/cloud/StorageConnectionSingleton.ts +++ b/src/ts/models/cloud/StorageConnectionSingleton.ts @@ -4,16 +4,16 @@ import { FileDAO } from '../DAO/FileDAO'; export class StorageConnectionSingleton extends FileStore { private _db: Storage; - private _bucket = `adinfo-dp6-files`; + private _bucket = process.env.BUCKET; private static _instance: StorageConnectionSingleton; private constructor() { super(); - if (process.env.DEVELOPMENT) { - /* eslint-disable @typescript-eslint/no-var-requires */ - const credentials = require('../../../gcp_key.json'); - /* eslint-enable @typescript-eslint/no-var-requires */ - this._db = new Storage({ projectId: 'adinfo', credentials }); + if (process.env.ENV === 'development') { + this._db = new Storage({ + projectId: process.env.GCP_PROJECT_ID, + credentials: JSON.parse(process.env.GCP_KEY), + }); } else { this._db = new Storage(); } diff --git a/terraform/config_schemas/adobe.json b/terraform/config_schemas/adobe.json new file mode 100644 index 00000000..f731ee8b --- /dev/null +++ b/terraform/config_schemas/adobe.json @@ -0,0 +1,37 @@ +{ + "csvSeparator": { + "stringValue": "," + }, + "separator": { + "stringValue": ":" + }, + "spaceSeparator": { + "stringValue": "_" + }, + "columns": { + "mapValue": { + "fields": { + "Exemplo": { + "arrayValue": { + "values": { + "stringValue": "/.*/" + } + } + } + } + } + }, + "adobe": { + "mapValue": { + "fields": { + "cid": { + "arrayValue": { + "values": { + "stringValue": "Exemplo" + } + } + } + } + } + } +} diff --git a/terraform/config_schemas/ga.json b/terraform/config_schemas/ga.json new file mode 100644 index 00000000..98a2e202 --- /dev/null +++ b/terraform/config_schemas/ga.json @@ -0,0 +1,37 @@ +{ + "csvSeparator": { + "stringValue": "," + }, + "separator": { + "stringValue": ":" + }, + "spaceSeparator": { + "stringValue": "_" + }, + "columns": { + "mapValue": { + "fields": { + "Exemplo": { + "arrayValue": { + "values": { + "stringValue": "/.*/" + } + } + } + } + } + }, + "ga": { + "mapValue": { + "fields": { + "utm_source": { + "arrayValue": { + "values": { + "stringValue": "Exemplo" + } + } + } + } + } + } +} diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 00000000..bfa971c1 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,100 @@ +###################################################### +#Configurações Cloud Storage +###################################################### +resource "google_storage_bucket" "adinfo_bucket" { + name = local.final_bucket_name + location = var.location + + labels = { + produto = local.project_name + } +} + +resource "google_storage_bucket" "adinfo_code" { + name = local.code_bucket + location = var.location + + labels = { + produto = local.project_name + } +} + +# ###################################################### +# #Shell Script +# ###################################################### +resource "null_resource" "create_dotenv" { + provisioner "local-exec" { + command = "bash scripts/create-dotenv.sh ${local.code_bucket} ${var.port}" + } + +} + +resource "null_resource" "code_zip" { + provisioner "local-exec" { + command = "bash scripts/using-local-adinfo-project.sh ${var.project_version} ${local.code_bucket}" + } + + depends_on = [google_storage_bucket.adinfo_code, null_resource.create_dotenv] + # depends_on = [null_resource.create_dotenv] +} + + +###################################################### +#Configurações App Engine +###################################################### +resource "google_app_engine_standard_app_version" "adinfo" { + version_id = "v1" + service = "default" + runtime = "nodejs12" + + entrypoint { + shell = "npm start" + } + + deployment { + zip { + source_url = "https://storage.googleapis.com/${local.code_bucket}/adinfo-code-${var.project_version}.zip" + } + } + + env_variables = { + port = var.port + } + + # automatic_scaling { + # max_concurrent_requests = 10 + # min_idle_instances = 1 + # max_idle_instances = 3 + # min_pending_latency = "1s" + # max_pending_latency = "5s" + # standard_scheduler_settings { + # target_cpu_utilization = 0.5 + # target_throughput_utilization = 0.75 + # min_instances = 2 + # max_instances = 10 + # } + # } + + delete_service_on_destroy = true + depends_on = [null_resource.code_zip] +} + + +###################################################### +#Configurações Firestore +###################################################### +resource "google_firestore_document" "mydoc" { + project = var.project_id + collection = "companies" + document_id = var.company + fields = "{}" +} + +resource "google_firestore_document" "sub_document" { + project = var.project_id + collection = "${google_firestore_document.mydoc.path}/config" + document_id = "config_1" + fields = var.pre_config == "2" ? file("config_schemas/adobe.json") : file("config_schemas/ga.json") + depends_on = [google_firestore_document.mydoc] +} + diff --git a/terraform/provider.tf b/terraform/provider.tf new file mode 100644 index 00000000..e9c0c5aa --- /dev/null +++ b/terraform/provider.tf @@ -0,0 +1,5 @@ +# Definiçaõ do projeto GCP +provider "google" { + project = var.project_id + region = var.region +} \ No newline at end of file diff --git a/terraform/scripts/create-dotenv.sh b/terraform/scripts/create-dotenv.sh new file mode 100644 index 00000000..c260b9f2 --- /dev/null +++ b/terraform/scripts/create-dotenv.sh @@ -0,0 +1,18 @@ +echo "Criando dotenv de produção" +cd .. +if test -f ".env"; then + echo "Salvando o .env atual como backup" + mv .env .env_bkp +fi +touch .env + +echo "Setando .env para o ambiente de produção" +echo "ENV=prod" >> .env + +echo "Adicionando o bucket $1 no o .env" +echo "BUCKET=$1" >> .env + +echo "Adicionando a porta $2 no o .env" +echo "PORT=$2" >> .env + +cd terraform \ No newline at end of file diff --git a/terraform/scripts/using-local-adinfo-project.sh b/terraform/scripts/using-local-adinfo-project.sh new file mode 100644 index 00000000..adcf8b96 --- /dev/null +++ b/terraform/scripts/using-local-adinfo-project.sh @@ -0,0 +1,17 @@ +echo "Executando $1 para o bucket $2" +cd .. +echo "Criando Zip" +zip -r ./terraform/files-copy-to-gcs/adinfo-code-$1.zip dist/ .env index.js package.json package-lock.json app.yaml .cloudbuild.yaml + +cd terraform +echo "Iniciando copia para GCP" +gsutil cp -r ./files-copy-to-gcs/adinfo-code-$1.zip "gs://$2" + +echo "excluindo zip" +rm -rf ./files-copy-to-gcs/adinfo-code-$1.zip + +cd .. +echo "Voltando o .env de desenvolvimento" +rm .env +mv .env_bkp .env +echo "FIM script $0" diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 00000000..830b41c4 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,61 @@ +####################################### +#Arquivos de configurações local +####################################### +locals { + project_prefix = "adinfo-files" + project_name = "project-name" + code_bucket = "${var.project_id}-adinfo-code-${var.company}" + final_bucket_name = "${var.project_id}-${local.project_prefix}-${var.company}" +} + +####################################### +#Variaveis de configuração +####################################### +variable "company" { + type = string + description = "O valor informado será usado em conjunto com o project_prefix para formar o nome do bucket" +} + +variable "project_id" { + type = string + description = "Id do projeto do GCP onde o modulo project-name será instalado" +} + +variable "pre_config" { + type = string + description = "Digite [1] para inserir uma configuracao previa para o Google Analytics ou [2] para uma configuracao previa para o Adobe Analytics" +} + +# variable "service_account" { +# type = string +# description = "Conta de servico do App Engine" +# } + +variable "port" { + type = number + description = "Porta onde a API irá rodar dentro do APP Engine" + default = 443 +} + +variable "project_version" { + type = string + description = "Para escolher uma versão diferente da atual acesse https://github.com/DP6/penguin-adinfo/tags" + default = "local" +} + +variable "region" { + type = string + description = "Região do GCP onde os modulos do projeto serão criados https://cloud.google.com/compute/docs/regions-zones?hl=pt-br default us-central1" + default = "southamerica-east1" +} + +variable "location" { + type = string + description = "Localização do projeto GCP https://cloud.google.com/compute/docs/regions-zones?hl=pt-br default us" + default = "us" +} + +# variable "service_account_email" { +# type = string +# description = "Service account que será utilizadas pelo modulo project-name, as permissões necessárias são: Storage Object Admin, Cloud Functions Admin, BigQuery Admin e Service Account User" +# } \ No newline at end of file diff --git a/terraform_deploy.sh b/terraform_deploy.sh new file mode 100644 index 00000000..d23ebf1a --- /dev/null +++ b/terraform_deploy.sh @@ -0,0 +1,10 @@ +#!/bin/bash +cd terraform && \ +terraform init && \ +# terraform state rm 'null_resource.code_zip' && \ +# terraform state rm 'null_resource.create_dotenv' && \ +# terraform state rm 'google_storage_bucket.adinfo_code' && \ +# terraform state rm 'google_storage_bucket.adinfo_bucket' && \ +# terraform state rm 'google_firestore_document.mydoc' && \ +# terraform state rm 'google_firestore_document.sub_document' && \ +terraform apply -auto-approve \ No newline at end of file diff --git a/terraform_validate.sh b/terraform_validate.sh new file mode 100644 index 00000000..9b39a461 --- /dev/null +++ b/terraform_validate.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cd terraform && terraform init && terraform validate \ No newline at end of file From 1e5e4599884a3d1b5c595c56d9482769fc4ed1ff Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Sat, 22 May 2021 19:51:20 -0300 Subject: [PATCH 52/68] docs: :art: Exclusao do tipo de linguagem nos blocos de codigo do readme Exclusao da linguagem no bloco de codigo de exemplo de config do readme para melhorar a estetica visual --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 09271a6a..29f571b1 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ git clone https://github.com/DP6/penguin-adinfo.git 3. Crie uma coleção no Firestore com o nome de **tokens** e insira um primeiro token com os seguintes campos (deixe o id do documento vazio para que seja gerado automaticamente): - ```json + ``` { company: "NOME_EMPRESA" (string) permission: "owner"(string) @@ -96,7 +96,7 @@ Para a configuração inicial do Firestore, são necessárias duas coleções. - **tokens**: essa coleção também deve ser criada na raiz do firestore com um documento seguindo a estrutura: - ```json + ``` { company: "NOME_EMPRESA" (string) permission: "owner"(string) From ae173544c7c7e441645ba0d123dc7c4ec00385b2 Mon Sep 17 00:00:00 2001 From: Gustavo Ueti Date: Tue, 25 May 2021 17:26:44 -0300 Subject: [PATCH 53/68] =?UTF-8?q?fix:=20:bug:=20Corrigindo=20o=20deploy=20?= =?UTF-8?q?da=20aplica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- terraform/files-copy-to-gcs/.gitkeep | 0 terraform/scripts/using-local-adinfo-project.sh | 2 +- terraform_deploy.sh | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 terraform/files-copy-to-gcs/.gitkeep diff --git a/terraform/files-copy-to-gcs/.gitkeep b/terraform/files-copy-to-gcs/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/terraform/scripts/using-local-adinfo-project.sh b/terraform/scripts/using-local-adinfo-project.sh index adcf8b96..d49e3de9 100644 --- a/terraform/scripts/using-local-adinfo-project.sh +++ b/terraform/scripts/using-local-adinfo-project.sh @@ -1,7 +1,7 @@ echo "Executando $1 para o bucket $2" cd .. echo "Criando Zip" -zip -r ./terraform/files-copy-to-gcs/adinfo-code-$1.zip dist/ .env index.js package.json package-lock.json app.yaml .cloudbuild.yaml +zip -r ./terraform/files-copy-to-gcs/adinfo-code-$1.zip dist/ .env index.js package.json package-lock.json app.yaml cloudbuild.yaml cd terraform echo "Iniciando copia para GCP" diff --git a/terraform_deploy.sh b/terraform_deploy.sh index d23ebf1a..7994353e 100644 --- a/terraform_deploy.sh +++ b/terraform_deploy.sh @@ -7,4 +7,5 @@ terraform init && \ # terraform state rm 'google_storage_bucket.adinfo_bucket' && \ # terraform state rm 'google_firestore_document.mydoc' && \ # terraform state rm 'google_firestore_document.sub_document' && \ +# terraform state rm 'google_app_engine_standard_app_version.adinfo' && \ terraform apply -auto-approve \ No newline at end of file From 7d2ada37091e3a76850630a14c496ef495ba21be Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Date: Fri, 28 May 2021 13:24:43 -0300 Subject: [PATCH 54/68] feat: :sparkles: Inclusao da classe ApiResponse para retorno de respostas Padronizacao das mensagens e status de erro e criacao do model ApiResponse --- dist/app.js | 20 ++++++++-- dist/models/ApiResponse.js | 32 +++++++++++++++ dist/models/DAO/AuthDAO.js | 4 +- dist/models/DAO/ConfigDAO.js | 9 ++++- dist/routes/build.js | 46 +++++++++++++-------- dist/routes/config.js | 31 ++++++++++----- dist/routes/csv.js | 69 ++++++++++++++++++++++++-------- dist/routes/register.js | 23 ++++++++--- dist/routes/template.js | 22 ++++++---- dist/routes/user.js | 18 +++++---- src/ts/app.ts | 22 ++++++++-- src/ts/models/ApiResponse.ts | 38 ++++++++++++++++++ src/ts/models/DAO/AuthDAO.ts | 4 +- src/ts/models/DAO/ConfigDAO.ts | 9 ++++- src/ts/routes/build.ts | 50 ++++++++++++++--------- src/ts/routes/config.ts | 39 +++++++++++++----- src/ts/routes/csv.ts | 73 ++++++++++++++++++++++++++-------- src/ts/routes/register.ts | 25 +++++++++--- src/ts/routes/template.ts | 27 +++++++++---- src/ts/routes/user.ts | 20 ++++++---- 20 files changed, 438 insertions(+), 143 deletions(-) create mode 100644 dist/models/ApiResponse.js create mode 100644 src/ts/models/ApiResponse.ts diff --git a/dist/app.js b/dist/app.js index 2eed300f..ddcad0c9 100644 --- a/dist/app.js +++ b/dist/app.js @@ -38,6 +38,7 @@ const fileUpload = require('express-fileupload'); const routes_1 = require('./routes/routes'); const dotenv_1 = require('dotenv'); const AuthDAO_1 = require('./models/DAO/AuthDAO'); +const ApiResponse_1 = require('./models/ApiResponse'); dotenv_1.config({ path: __dirname + '/../.env' }); const app = express(); app.use( @@ -63,13 +64,14 @@ app.use( ], exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], origin: '*', - methods: 'GET,POST', + methods: 'GET, POST', preflightContinue: false, }) ); app.all('*', (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { const token = req.headers.token; + const apiResponse = new ApiResponse_1.ApiResponse(); if (token) { const authDAO = new AuthDAO_1.AuthDAO(token); authDAO @@ -80,14 +82,24 @@ app.all('*', (req, res, next) => if (auth.hasPermissionFor(req.url, req.method)) { next(); } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); + apiResponse.responseText = 'Usuário sem permissão para realizar a ação!'; + apiResponse.statusCode = 403; } }) .catch((err) => { - res.status(403).send('Usuário Inválido'); + apiResponse.responseText = 'Usuário Inválido!'; + apiResponse.statusCode = 401; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); } else { - res.status(403).send('Token não informado!'); + apiResponse.responseText = 'Token não informado!'; + apiResponse.statusCode = 401; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); } }) ); diff --git a/dist/models/ApiResponse.js b/dist/models/ApiResponse.js new file mode 100644 index 00000000..f45ef558 --- /dev/null +++ b/dist/models/ApiResponse.js @@ -0,0 +1,32 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +exports.ApiResponse = void 0; +class ApiResponse { + constructor(statusCode = 200, responseText = '', errorMessage = '') { + this._statusCode = statusCode; + this._responseText = responseText; + this._errorMessage = errorMessage; + } + set statusCode(statusCode) { + this._statusCode = statusCode; + } + set responseText(responseText) { + this._responseText = responseText; + } + set errorMessage(errorMessage) { + this._errorMessage = errorMessage; + } + get statusCode() { + return this._statusCode; + } + get responseText() { + return this._responseText; + } + get jsonResponse() { + return { + responseText: this._responseText, + errorMessage: this._errorMessage, + }; + } +} +exports.ApiResponse = ApiResponse; diff --git a/dist/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js index 425a8198..693efdf5 100644 --- a/dist/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -19,7 +19,9 @@ class AuthDAO { const jsonAuth = data.data(); return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw err; + }); } addAuth(auth) { return this._objectStore diff --git a/dist/models/DAO/ConfigDAO.js b/dist/models/DAO/ConfigDAO.js index 3149b3b9..7f8d7866 100644 --- a/dist/models/DAO/ConfigDAO.js +++ b/dist/models/DAO/ConfigDAO.js @@ -13,6 +13,9 @@ class ConfigDAO { return this._objectStore .getAllDocumentsFrom(this._configCollection) .then((documents) => { + if (documents.length === 0) { + throw new Error('A empresa não possui nenhuma configuração!'); + } let lastDocument; documents.forEach((doc, index) => { if (index === 0) lastDocument = doc; @@ -20,7 +23,9 @@ class ConfigDAO { }); return new Config_1.Config(lastDocument); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw new Error(err.message); + }); } addConfig(config) { return new Promise((resolve, reject) => { @@ -37,7 +42,7 @@ class ConfigDAO { this._objectStore.addDocumentIn(this._configCollection, config.toJson(), `config_${config.version}`) ); } else { - reject('Configuração inválida'); + throw new Error('Configuração inválida!'); } }) .catch((err) => reject(err)); diff --git a/dist/routes/build.js b/dist/routes/build.js index 6bb33e3e..eb137953 100644 --- a/dist/routes/build.js +++ b/dist/routes/build.js @@ -5,6 +5,7 @@ const FileDAO_1 = require('../models/DAO/FileDAO'); const DateUtils_1 = require('../utils/DateUtils'); const CsvUtils_1 = require('../utils/CsvUtils'); const Builder_1 = require('../controllers/Builder'); +const ApiResponse_1 = require('../models/ApiResponse'); const converter = require('json-2-csv'); const build = (app) => { app.post('/build/:media', (req, res) => { @@ -12,15 +13,17 @@ const build = (app) => { const company = req.company; const agency = req.agency; const campaign = req.headers.campaign; - if (!req.files.data) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + const apiResponse = new ApiResponse_1.ApiResponse(); + if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const fileContent = req.files.data.data; const filePath = agency @@ -31,20 +34,18 @@ const build = (app) => { configDAO .getLastConfig() .then((config) => { - if (config) { - companyConfig = config; + companyConfig = config; + if (companyConfig) { if (!companyConfig.toJson()[media]) { - res.status(400).send({ - message: `Mídia ${media} não configurada!`, - }); - return; + apiResponse.statusCode = 400; + throw new Error(`Mídia ${media} não foi configurada!`); } const fileDAO = new FileDAO_1.FileDAO(); fileDAO.file = fileContent; return fileDAO.save(filePath); } else { - res.status(400).send('Nenhuma configuração encontrada!'); - return; + apiResponse.statusCode = 500; + throw new Error('Nenhuma configuração encontrada!'); } }) .then(() => { @@ -63,7 +64,9 @@ const build = (app) => { csv += '\nConfiguracao inserida em;' + configTimestamp; res.setHeader('Content-disposition', 'attachment; filename=data.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - res.status(200).send(csv); + apiResponse.responseText = csv; + apiResponse.statusCode = 200; + res.status(apiResponse.statusCode).send(apiResponse.responseText); }, { delimiter: { @@ -73,7 +76,16 @@ const build = (app) => { ); }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + if (apiResponse.statusCode === 200) { + apiResponse.statusCode = 500; + } + apiResponse.responseText = 'Falha ao salvar o arquivo!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/dist/routes/config.js b/dist/routes/config.js index 8c66f5b1..ef9f564a 100644 --- a/dist/routes/config.js +++ b/dist/routes/config.js @@ -2,12 +2,16 @@ Object.defineProperty(exports, '__esModule', { value: true }); const ConfigDAO_1 = require('../models/DAO/ConfigDAO'); const Config_1 = require('../models/Config'); +const ApiResponse_1 = require('../models/ApiResponse'); const config = (app) => { app.post('/config', (req, res) => { const company = req.company; const configString = req.body.config; + const apiResponse = new ApiResponse_1.ApiResponse(); if (!configString) { - res.status(400).send('Configuração não foi informada!'); + apiResponse.responseText = 'Configuração não foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } const config = new Config_1.Config(JSON.parse(configString)); @@ -15,26 +19,35 @@ const config = (app) => { configDAO .addConfig(config) .then((data) => { - res.status(200).send('Configuração criada com sucesso!'); + apiResponse.responseText = 'Configuração criada com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao criar a configuração!'); + apiResponse.responseText = 'Erro ao criar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); app.get('/config', (req, res) => { const company = req.company; const configDAO = new ConfigDAO_1.ConfigDAO(company); + const apiResponse = new ApiResponse_1.ApiResponse(); configDAO .getLastConfig() .then((config) => { - if (config) { - res.status(200).send(config.toString()); - } else { - res.status(200).send('{}'); - } + apiResponse.responseText = config.toString(); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Erro ao recuperar configuração!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/dist/routes/csv.js b/dist/routes/csv.js index d5994fac..df467356 100644 --- a/dist/routes/csv.js +++ b/dist/routes/csv.js @@ -2,17 +2,25 @@ Object.defineProperty(exports, '__esModule', { value: true }); const FileDAO_1 = require('../models/DAO/FileDAO'); const DateUtils_1 = require('../utils/DateUtils'); +const ApiResponse_1 = require('../models/ApiResponse'); const csv = (app) => { app.post('/csv', (req, res) => { const campaign = req.headers.campaign; - const content = req.files.data.data; const agency = req.agency; const company = req.company; + const apiResponse = new ApiResponse_1.ApiResponse(); if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; + } else if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } + const content = req.files.data.data; const filePath = agency ? `${company}/${agency}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv` : `${company}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv`; @@ -21,10 +29,16 @@ const csv = (app) => { fileDAO .save(filePath) .then(() => { - res.status(200).send('Arquivo salvo com sucesso!'); + apiResponse.responseText = 'Arquivo salvo com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + apiResponse.responseText = 'Falha ao salvar arquivo!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); app.get('/csv', (req, res) => { @@ -32,15 +46,17 @@ const csv = (app) => { const agency = req.agency; const campaign = req.headers.campaign; const company = req.company; + const apiResponse = new ApiResponse_1.ApiResponse(); if (!fileName) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + apiResponse.responseText = 'Nenhum arquivo foi informado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const filePath = agency ? `${company}/${agency}/${campaign}/${fileName}.csv` @@ -48,11 +64,23 @@ const csv = (app) => { const fileDAO = new FileDAO_1.FileDAO(); fileDAO .getFromStore(filePath) - .then((data) => { - res.status(200).send(data.toString()); + .then((file) => { + res.setHeader('Content-disposition', 'attachment; filename=template.csv'); + res.set('Content-Type', 'text/csv; charset=utf-8'); + apiResponse.statusCode = 200; + apiResponse.responseText = file.toString(); }) .catch((err) => { - res.status(500).send(`Falha ao restaurar o arquivo ${fileName}!`); + apiResponse.statusCode = 500; + apiResponse.responseText = `Falha ao restaurar o arquivo ${fileName}!`; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); app.get('/csv/list', (req, res) => { @@ -61,16 +89,23 @@ const csv = (app) => { const campaign = req.headers.campaign; const fileDAO = new FileDAO_1.FileDAO(); let filePath = `${company}/`; + const apiResponse = new ApiResponse_1.ApiResponse(); if (agency) filePath += `${agency}/`; if (campaign) filePath += `${campaign}/`; fileDAO .getAllFilesFromStore(filePath) .then((data) => { const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); - res.status(200).send(files); + apiResponse.responseText = files.join(','); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send(`Falha ao restaurar os arquivos!`); + apiResponse.errorMessage = err.message; + apiResponse.responseText = `Falha ao restaurar os arquivos!`; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/dist/routes/register.js b/dist/routes/register.js index 7de3acad..9b48adde 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -3,11 +3,11 @@ Object.defineProperty(exports, '__esModule', { value: true }); const express_validator_1 = require('express-validator'); const Auth_1 = require('../models/Auth'); const AuthDAO_1 = require('../models/DAO/AuthDAO'); +const ApiResponse_1 = require('../models/ApiResponse'); const register = (app) => { app.post( '/register', express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), - express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), express_validator_1 .header('email') .exists() @@ -16,6 +16,7 @@ const register = (app) => { .withMessage('Email inválido.'), (req, res) => { const validationErrors = express_validator_1.validationResult(req).array(); + const apiResponse = new ApiResponse_1.ApiResponse(); if (!req.headers.agency) { validationErrors.push({ param: 'email', @@ -25,13 +26,15 @@ const register = (app) => { }); } if (validationErrors.length > 0) { - const msg = validationErrors.map((err) => err.msg).join(' '); - res.status(400).json({ message: msg }); + const message = validationErrors.map((err) => err.msg).join(' '); + apiResponse.responseText = message; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } const newUserAuth = new Auth_1.Auth( req.headers.permission, - req.headers.company, + req.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email ); @@ -40,10 +43,18 @@ const register = (app) => { authDAO .addAuth(newUserAuth) .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + const message = `Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`; + apiResponse.responseText = message; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); + const message = 'Falha ao criar permissão!'; + apiResponse.responseText = message; + apiResponse.errorMessage = err.message; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); } ); diff --git a/dist/routes/template.js b/dist/routes/template.js index 1d3b9f0e..380bf104 100644 --- a/dist/routes/template.js +++ b/dist/routes/template.js @@ -1,23 +1,31 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const ConfigDAO_1 = require('../models/DAO/ConfigDAO'); +const ApiResponse_1 = require('../models/ApiResponse'); const template = (app) => { app.get('/template', (req, res) => { const company = req.company; - const configDAO = new ConfigDAO_1.ConfigDAO(company); + const configDAO = new ConfigDAO_1.ConfigDAO('company'); + const apiResponse = new ApiResponse_1.ApiResponse(); configDAO .getLastConfig() .then((config) => { res.setHeader('Content-disposition', 'attachment; filename=template.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - if (config) { - res.status(200).send(config.toCsvTemplate()); - } else { - res.status(200).send('{}'); - } + apiResponse.statusCode = 200; + apiResponse.responseText = config.toCsvTemplate(); }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.responseText = 'Erro ao recuperar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/dist/routes/user.js b/dist/routes/user.js index 717512c9..a9f25da3 100644 --- a/dist/routes/user.js +++ b/dist/routes/user.js @@ -1,19 +1,23 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const AuthDAO_1 = require('../models/DAO/AuthDAO'); +const ApiResponse_1 = require('../models/ApiResponse'); const user = (app) => { app.get('/user', (req, res) => { + const apiResponse = new ApiResponse_1.ApiResponse(); new AuthDAO_1.AuthDAO(req.headers.token) .getAuth() - .then((data) => { - if (data) { - res.status(200).send(JSON.stringify(data.toJson())); - } else { - res.status(200).send(JSON.stringify('{}')); - } + .then((auth) => { + apiResponse.responseText = JSON.stringify(auth.toJson()); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao recuperar o usuário!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Falha ao recuperar o usuário!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/src/ts/app.ts b/src/ts/app.ts index b137041d..b629a3c6 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -6,6 +6,7 @@ import routes from './routes/routes'; import { config } from 'dotenv'; import { Auth } from './models/Auth'; import { AuthDAO } from './models/DAO/AuthDAO'; +import { ApiResponse } from './models/ApiResponse'; config({ path: __dirname + '/../.env' }); @@ -36,13 +37,16 @@ app.use( ], exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], origin: '*', - methods: 'GET,POST', + methods: 'GET, POST', preflightContinue: false, }) ); app.all('*', async (req: { [key: string]: any }, res: { [key: string]: any }, next: any) => { const token = req.headers.token; + + const apiResponse = new ApiResponse(); + if (token) { const authDAO = new AuthDAO(token); authDAO @@ -53,14 +57,24 @@ app.all('*', async (req: { [key: string]: any }, res: { [key: string]: any }, ne if (auth.hasPermissionFor(req.url, req.method)) { next(); } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); + apiResponse.responseText = 'Usuário sem permissão para realizar a ação!'; + apiResponse.statusCode = 403; } }) .catch((err) => { - res.status(403).send('Usuário Inválido'); + apiResponse.responseText = 'Usuário Inválido!'; + apiResponse.statusCode = 401; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); } else { - res.status(403).send('Token não informado!'); + apiResponse.responseText = 'Token não informado!'; + apiResponse.statusCode = 401; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); } }); diff --git a/src/ts/models/ApiResponse.ts b/src/ts/models/ApiResponse.ts new file mode 100644 index 00000000..5568a195 --- /dev/null +++ b/src/ts/models/ApiResponse.ts @@ -0,0 +1,38 @@ +export class ApiResponse { + private _statusCode: number; + private _responseText: string; + private _errorMessage: string; + + constructor(statusCode = 200, responseText = '', errorMessage = '') { + this._statusCode = statusCode; + this._responseText = responseText; + this._errorMessage = errorMessage; + } + + set errorMessage(errorMessage: string) { + this._errorMessage = errorMessage; + } + + get statusCode(): number { + return this._statusCode; + } + + set statusCode(statusCode: number) { + this._statusCode = statusCode; + } + + get responseText(): string { + return this._responseText; + } + + set responseText(responseText: string) { + this._responseText = responseText; + } + + get jsonResponse(): { [key: string]: string } { + return { + responseText: this._responseText, + errorMessage: this._errorMessage, + }; + } +} diff --git a/src/ts/models/DAO/AuthDAO.ts b/src/ts/models/DAO/AuthDAO.ts index c252278f..9185b215 100644 --- a/src/ts/models/DAO/AuthDAO.ts +++ b/src/ts/models/DAO/AuthDAO.ts @@ -25,7 +25,9 @@ export class AuthDAO { const jsonAuth = data.data(); return new Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw err; + }); } public addAuth(auth: Auth): Promise { diff --git a/src/ts/models/DAO/ConfigDAO.ts b/src/ts/models/DAO/ConfigDAO.ts index 898c92ee..bfb7a128 100644 --- a/src/ts/models/DAO/ConfigDAO.ts +++ b/src/ts/models/DAO/ConfigDAO.ts @@ -20,6 +20,9 @@ export class ConfigDAO { return this._objectStore .getAllDocumentsFrom(this._configCollection) .then((documents) => { + if (documents.length === 0) { + throw new Error('A empresa não possui nenhuma configuração!'); + } let lastDocument: DocumentData; documents.forEach((doc, index) => { if (index === 0) lastDocument = doc; @@ -27,7 +30,9 @@ export class ConfigDAO { }); return new Config(lastDocument); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw new Error(err.message); + }); } /** @@ -49,7 +54,7 @@ export class ConfigDAO { this._objectStore.addDocumentIn(this._configCollection, config.toJson(), `config_${config.version}`) ); } else { - reject('Configuração inválida'); + throw new Error('Configuração inválida!'); } }) .catch((err: { [key: string]: any }) => reject(err)); diff --git a/src/ts/routes/build.ts b/src/ts/routes/build.ts index d06e2faf..849e2436 100644 --- a/src/ts/routes/build.ts +++ b/src/ts/routes/build.ts @@ -4,6 +4,7 @@ import { Config } from '../models/Config'; import { DateUtils } from '../utils/DateUtils'; import { CsvUtils } from '../utils/CsvUtils'; import { Builder } from '../controllers/Builder'; +import { ApiResponse } from '../models/ApiResponse'; import * as converter from 'json-2-csv'; const build = (app: { [key: string]: any }): void => { @@ -12,15 +13,19 @@ const build = (app: { [key: string]: any }): void => { const company = req.company; const agency = req.agency; const campaign = req.headers.campaign; - if (!req.files.data) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + + const apiResponse = new ApiResponse(); + + if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const fileContent = req.files.data.data; @@ -33,21 +38,19 @@ const build = (app: { [key: string]: any }): void => { const configDAO = new ConfigDAO(company); configDAO .getLastConfig() - .then((config) => { - if (config) { - companyConfig = config; + .then((config: Config) => { + companyConfig = config; + if (companyConfig) { if (!companyConfig.toJson()[media]) { - res.status(400).send({ - message: `Mídia ${media} não configurada!`, - }); - return; + apiResponse.statusCode = 400; + throw new Error(`Mídia ${media} não foi configurada!`); } const fileDAO = new FileDAO(); fileDAO.file = fileContent; return fileDAO.save(filePath); } else { - res.status(400).send('Nenhuma configuração encontrada!'); - return; + apiResponse.statusCode = 500; + throw new Error('Nenhuma configuração encontrada!'); } }) .then(() => { @@ -66,7 +69,9 @@ const build = (app: { [key: string]: any }): void => { csv += '\nConfiguracao inserida em;' + configTimestamp; res.setHeader('Content-disposition', 'attachment; filename=data.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - res.status(200).send(csv); + apiResponse.responseText = csv; + apiResponse.statusCode = 200; + res.status(apiResponse.statusCode).send(apiResponse.responseText); }, { delimiter: { @@ -76,7 +81,16 @@ const build = (app: { [key: string]: any }): void => { ); }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + if (apiResponse.statusCode === 200) { + apiResponse.statusCode = 500; + } + apiResponse.responseText = 'Falha ao salvar o arquivo!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/src/ts/routes/config.ts b/src/ts/routes/config.ts index 4c831e02..ca0ac5d6 100644 --- a/src/ts/routes/config.ts +++ b/src/ts/routes/config.ts @@ -1,40 +1,59 @@ import { ConfigDAO } from '../models/DAO/ConfigDAO'; import { Config } from '../models/Config'; +import { ApiResponse } from '../models/ApiResponse'; const config = (app: { [key: string]: any }): void => { app.post('/config', (req: { [key: string]: any }, res: { [key: string]: any }) => { const company = req.company; const configString = req.body.config; + + const apiResponse = new ApiResponse(); + if (!configString) { - res.status(400).send('Configuração não foi informada!'); + apiResponse.responseText = 'Configuração não foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } + const config = new Config(JSON.parse(configString)); const configDAO = new ConfigDAO(company); + configDAO .addConfig(config) .then((data) => { - res.status(200).send('Configuração criada com sucesso!'); + apiResponse.responseText = 'Configuração criada com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao criar a configuração!'); + apiResponse.responseText = 'Erro ao criar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); app.get('/config', (req: { [key: string]: any }, res: { [key: string]: any }) => { const company = req.company; const configDAO = new ConfigDAO(company); + + const apiResponse = new ApiResponse(); + configDAO .getLastConfig() - .then((config) => { - if (config) { - res.status(200).send(config.toString()); - } else { - res.status(200).send('{}'); - } + .then((config: Config) => { + apiResponse.responseText = config.toString(); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Erro ao recuperar configuração!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/src/ts/routes/csv.ts b/src/ts/routes/csv.ts index 307ef35a..5d10da87 100644 --- a/src/ts/routes/csv.ts +++ b/src/ts/routes/csv.ts @@ -1,19 +1,29 @@ import { FileDAO } from '../models/DAO/FileDAO'; import { DateUtils } from '../utils/DateUtils'; +import { ApiResponse } from '../models/ApiResponse'; const csv = (app: { [key: string]: any }): void => { app.post('/csv', (req: { [key: string]: any }, res: { [key: string]: any }) => { const campaign = req.headers.campaign; - const content = req.files.data.data; const agency = req.agency; const company = req.company; + const apiResponse = new ApiResponse(); + if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; + } else if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } + const content = req.files.data.data; + const filePath = agency ? `${company}/${agency}/${campaign}/${DateUtils.generateDateString()}.csv` : `${company}/${campaign}/${DateUtils.generateDateString()}.csv`; @@ -23,10 +33,16 @@ const csv = (app: { [key: string]: any }): void => { fileDAO .save(filePath) .then(() => { - res.status(200).send('Arquivo salvo com sucesso!'); + apiResponse.responseText = 'Arquivo salvo com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + apiResponse.responseText = 'Falha ao salvar arquivo!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); @@ -36,15 +52,18 @@ const csv = (app: { [key: string]: any }): void => { const campaign = req.headers.campaign; const company = req.company; + const apiResponse = new ApiResponse(); + if (!fileName) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + apiResponse.responseText = 'Nenhum arquivo foi informado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const filePath = agency @@ -54,12 +73,24 @@ const csv = (app: { [key: string]: any }): void => { const fileDAO = new FileDAO(); fileDAO .getFromStore(filePath) - .then((data) => { + .then((file) => { // const dataFormated = data[0].toString("utf8"); - res.status(200).send(data.toString()); + res.setHeader('Content-disposition', 'attachment; filename=template.csv'); + res.set('Content-Type', 'text/csv; charset=utf-8'); + apiResponse.statusCode = 200; + apiResponse.responseText = file.toString(); }) .catch((err) => { - res.status(500).send(`Falha ao restaurar o arquivo ${fileName}!`); + apiResponse.statusCode = 500; + apiResponse.responseText = `Falha ao restaurar o arquivo ${fileName}!`; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); @@ -71,6 +102,8 @@ const csv = (app: { [key: string]: any }): void => { let filePath = `${company}/`; + const apiResponse = new ApiResponse(); + if (agency) filePath += `${agency}/`; if (campaign) filePath += `${campaign}/`; @@ -78,10 +111,16 @@ const csv = (app: { [key: string]: any }): void => { .getAllFilesFromStore(filePath) .then((data) => { const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); - res.status(200).send(files); + apiResponse.responseText = files.join(','); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send(`Falha ao restaurar os arquivos!`); + apiResponse.errorMessage = err.message; + apiResponse.responseText = `Falha ao restaurar os arquivos!`; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 7163a49d..64c1849b 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -1,15 +1,18 @@ import { header, validationResult } from 'express-validator'; import { Auth } from '../models/Auth'; import { AuthDAO } from '../models/DAO/AuthDAO'; +import { ApiResponse } from '../models/ApiResponse'; const register = (app: { [key: string]: any }): void => { app.post( '/register', header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), - header('company').exists().withMessage('Parâmetro company é obrigatório.'), header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), (req: { [key: string]: any }, res: { [key: string]: any }) => { const validationErrors = validationResult(req).array(); + + const apiResponse = new ApiResponse(); + if (!req.headers.agency) { validationErrors.push({ param: 'email', @@ -19,14 +22,16 @@ const register = (app: { [key: string]: any }): void => { }); } if (validationErrors.length > 0) { - const msg = validationErrors.map((err) => err.msg).join(' '); - res.status(400).json({ message: msg }); + const message = validationErrors.map((err) => err.msg).join(' '); + apiResponse.responseText = message; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } const newUserAuth = new Auth( req.headers.permission, - req.headers.company, + req.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email ); @@ -36,10 +41,18 @@ const register = (app: { [key: string]: any }): void => { authDAO .addAuth(newUserAuth) .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + const message = `Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`; + apiResponse.responseText = message; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); + const message = 'Falha ao criar permissão!'; + apiResponse.responseText = message; + apiResponse.errorMessage = err.message; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); } ); diff --git a/src/ts/routes/template.ts b/src/ts/routes/template.ts index c593f4ed..417fb6b1 100644 --- a/src/ts/routes/template.ts +++ b/src/ts/routes/template.ts @@ -1,22 +1,33 @@ import { ConfigDAO } from '../models/DAO/ConfigDAO'; +import { ApiResponse } from '../models/ApiResponse'; +import { Config } from '../models/Config'; const template = (app: { [key: string]: any }): void => { app.get('/template', (req: { [key: string]: any }, res: { [key: string]: any }) => { const company = req.company; - const configDAO = new ConfigDAO(company); + const configDAO = new ConfigDAO('company'); + + const apiResponse = new ApiResponse(); + configDAO .getLastConfig() - .then((config) => { + .then((config: Config) => { res.setHeader('Content-disposition', 'attachment; filename=template.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - if (config) { - res.status(200).send(config.toCsvTemplate()); - } else { - res.status(200).send('{}'); - } + apiResponse.statusCode = 200; + apiResponse.responseText = config.toCsvTemplate(); }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.responseText = 'Erro ao recuperar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/src/ts/routes/user.ts b/src/ts/routes/user.ts index 5c07520d..9c96a4a4 100644 --- a/src/ts/routes/user.ts +++ b/src/ts/routes/user.ts @@ -1,18 +1,24 @@ import { AuthDAO } from '../models/DAO/AuthDAO'; +import { ApiResponse } from '../models/ApiResponse'; +import { Auth } from '../models/Auth'; const user = (app: { [key: string]: any }): void => { app.get('/user', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const apiResponse = new ApiResponse(); + new AuthDAO(req.headers.token) .getAuth() - .then((data) => { - if (data) { - res.status(200).send(JSON.stringify(data.toJson())); - } else { - res.status(200).send(JSON.stringify('{}')); - } + .then((auth: Auth) => { + apiResponse.responseText = JSON.stringify(auth.toJson()); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao recuperar o usuário!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Falha ao recuperar o usuário!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; From 390e6247e6b5a19c7b8000c0ae0151a5fe29f369 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Date: Fri, 28 May 2021 13:30:04 -0300 Subject: [PATCH 55/68] test: :white_check_mark: Add ApiResponse Testes --- test/models/ApiResponse.spec.ts | 20 ++++++++++++++++++++ test/models/GA.spec.ts | 1 - test/utils/StringUtils.spec.ts | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 test/models/ApiResponse.spec.ts diff --git a/test/models/ApiResponse.spec.ts b/test/models/ApiResponse.spec.ts new file mode 100644 index 00000000..504ed530 --- /dev/null +++ b/test/models/ApiResponse.spec.ts @@ -0,0 +1,20 @@ +import { expect } from 'chai'; +import { ApiResponse } from '../../src/ts/models/ApiResponse'; + +describe('ApiResponse', () => { + describe('Valida a geração da resposta da API', () => { + it('Validar a geração do JSON de resposta da API', () => { + const apiResponse = new ApiResponse(200, 'Mensagem Teste', 'Mensagem Erro'); + expect(JSON.stringify(apiResponse.jsonResponse)).to.equal( + JSON.stringify({ + responseText: 'Mensagem Teste', + errorMessage: 'Mensagem Erro' + }) + ); + }); + it('Validar o status code da resposta da API', () => { + const apiResponse = new ApiResponse(400, 'Mensagem Teste', 'Mensagem Erro'); + expect(apiResponse.statusCode).to.equal(400); + }); + }); +}); diff --git a/test/models/GA.spec.ts b/test/models/GA.spec.ts index ff45b2b0..7a7ba8f1 100644 --- a/test/models/GA.spec.ts +++ b/test/models/GA.spec.ts @@ -1,7 +1,6 @@ import { expect } from 'chai'; import { GA } from '../../src/ts/models/GA'; import { Config } from '../../src/ts/models/Config'; -import { DependencyConfig } from '../../src/ts/models/DependencyConfig'; describe('GA', () => { describe('Valida a geração da linha do GA', () => { diff --git a/test/utils/StringUtils.spec.ts b/test/utils/StringUtils.spec.ts index 5eedcdbf..a150f11d 100644 --- a/test/utils/StringUtils.spec.ts +++ b/test/utils/StringUtils.spec.ts @@ -17,7 +17,7 @@ describe('String Utils', () => { ); }); }); - describe('Replace Withe Space', () => { + describe('Replace White Space', () => { it('Substituir o espaço em branco pelo caracter passado', () => { expect(StringUtils.replaceWhiteSpace('Hello World', '')).to.equal( 'HelloWorld' From cd6e981fb7fb4998fae1a1b3301c9774a5faa653 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Firmo Date: Fri, 11 Jun 2021 18:59:12 -0300 Subject: [PATCH 56/68] feat: :sparkles: Implementacao dos logs no GCP --- .gitignore | 1 + app.js | 57 --------------------- dist/app.js | 9 ++++ dist/models/ApiResponse.js | 19 ++++--- dist/models/cloud/LoggingSingleton.js | 58 +++++++++++++--------- dist/utils/CsvUtils.js | 1 - src/ts/app.ts | 12 +++++ src/ts/models/ApiResponse.ts | 8 ++- src/ts/models/Log.ts | 6 ++- src/ts/models/cloud/LoggingSingleton.ts | 66 +++++++++++++++---------- src/ts/utils/CsvUtils.ts | 1 - 11 files changed, 121 insertions(+), 117 deletions(-) delete mode 100644 app.js diff --git a/.gitignore b/.gitignore index d06f985d..0da18708 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/ .env +.gcloudignore .vscode/ config/ gcp_key.json diff --git a/app.js b/app.js deleted file mode 100644 index cfa0b492..00000000 --- a/app.js +++ /dev/null @@ -1,57 +0,0 @@ -require('dotenv').config({ path: __dirname + '/.env' }); - -const express = require('express'); -const bodyParser = require('body-parser'); -const cors = require('cors'); -const fileUpload = require('express-fileupload'); -const { AuthDAO } = require('./src/js/src/ts/models/DAO/AuthDAO.js'); - -const app = express(); - -app.use( - fileUpload({ - createParentPath: true, - }) -); - -app.use(bodyParser.urlencoded({ extended: true })); -app.use(bodyParser.json()); - -app.use( - cors({ - allowedHeaders: ['token', 'agency', 'Content-Type', 'company', 'file', 'data', 'config'], - exposedHeaders: ['token', 'agency', 'company', 'file', 'data', 'config'], - origin: '*', - methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', - preflightContinue: false, - }) -); - -const routes = require('./src/js/src/ts/routes/routes'); - -app.all('*', async (req, res, next) => { - let authDAO; - if (req.headers.company && req.headers.token) { - authDAO = new AuthDAO(req.headers.company, req.headers.token); - } else { - authDAO = new AuthDAO(req.body.company, req.body.token); - } - authDAO - .getAuth() - .then((auth) => { - if (auth.hasPermissionFor(req.url, req.method)) { - next(); - } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); - } - }) - .catch((err) => { - res.status(403).send('Usuário Inválido'); - }); -}); - -routes.default(app); - -app.get('/', (req, res) => res.status(200).send('OK')); - -module.exports = app; diff --git a/dist/app.js b/dist/app.js index ddcad0c9..da2be0c8 100644 --- a/dist/app.js +++ b/dist/app.js @@ -39,8 +39,10 @@ const routes_1 = require('./routes/routes'); const dotenv_1 = require('dotenv'); const AuthDAO_1 = require('./models/DAO/AuthDAO'); const ApiResponse_1 = require('./models/ApiResponse'); +const LoggingSingleton_1 = require('./models/cloud/LoggingSingleton'); dotenv_1.config({ path: __dirname + '/../.env' }); const app = express(); +LoggingSingleton_1.LoggingSingleton.getInstance().logInfo('Iniciando Adinfo!'); app.use( fileUpload({ createParentPath: true, @@ -71,6 +73,13 @@ app.use( app.all('*', (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { const token = req.headers.token; + const log = { + route: req.originalUrl, + token, + heades: req.headers, + body: req.body, + }; + LoggingSingleton_1.LoggingSingleton.getInstance().logInfo(JSON.stringify(log)); const apiResponse = new ApiResponse_1.ApiResponse(); if (token) { const authDAO = new AuthDAO_1.AuthDAO(token); diff --git a/dist/models/ApiResponse.js b/dist/models/ApiResponse.js index f45ef558..1fa24987 100644 --- a/dist/models/ApiResponse.js +++ b/dist/models/ApiResponse.js @@ -1,32 +1,37 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); exports.ApiResponse = void 0; +const LoggingSingleton_1 = require('./cloud/LoggingSingleton'); class ApiResponse { constructor(statusCode = 200, responseText = '', errorMessage = '') { this._statusCode = statusCode; this._responseText = responseText; this._errorMessage = errorMessage; } - set statusCode(statusCode) { - this._statusCode = statusCode; - } - set responseText(responseText) { - this._responseText = responseText; - } set errorMessage(errorMessage) { this._errorMessage = errorMessage; } get statusCode() { return this._statusCode; } + set statusCode(statusCode) { + this._statusCode = statusCode; + } get responseText() { return this._responseText; } + set responseText(responseText) { + this._responseText = responseText; + } get jsonResponse() { - return { + const response = { responseText: this._responseText, errorMessage: this._errorMessage, }; + if (this._statusCode !== 200) { + LoggingSingleton_1.LoggingSingleton.getInstance().logError(JSON.stringify(response)); + } + return response; } } exports.ApiResponse = ApiResponse; diff --git a/dist/models/cloud/LoggingSingleton.js b/dist/models/cloud/LoggingSingleton.js index b7f0a192..e1054dfe 100644 --- a/dist/models/cloud/LoggingSingleton.js +++ b/dist/models/cloud/LoggingSingleton.js @@ -7,35 +7,47 @@ const logging_bunyan_1 = require('@google-cloud/logging-bunyan'); class LoggingSingleton extends Log_1.Log { constructor() { super(); + this._loggingBunyan = new logging_bunyan_1.LoggingBunyan(); + this._loggerName = 'adinfo'; + this._infoInstance = bunyan.createLogger({ + name: this._loggerName, + streams: [{ stream: process.stdout, level: 'info' }, this._loggingBunyan.stream('info')], + }); + this._errorInstance = bunyan.createLogger({ + name: this._loggerName, + streams: [{ stream: process.stdout, level: 'error' }, this._loggingBunyan.stream('error')], + }); + this._warningInstance = bunyan.createLogger({ + name: this._loggerName, + streams: [{ stream: process.stdout, level: 'warn' }, this._loggingBunyan.stream('warn')], + }); } - static logInfo(message) { - if (!LoggingSingleton._infoInstance) { - LoggingSingleton._infoInstance = bunyan.createLogger({ - name: LoggingSingleton._loggerName, - streams: [{ stream: process.stdout, level: 'info' }, this._loggingBunyan.stream('info')], - }); + static getInstance() { + if (!LoggingSingleton._instance) { + LoggingSingleton._instance = new LoggingSingleton(); } - LoggingSingleton._infoInstance.info(message); + return LoggingSingleton._instance; } - static logError(message) { - if (!LoggingSingleton._errorInstance) { - LoggingSingleton._errorInstance = bunyan.createLogger({ - name: LoggingSingleton._loggerName, - streams: [{ stream: process.stdout, level: 'error' }, this._loggingBunyan.stream('error')], - }); + logInfo(message) { + if (process.env.ENV === 'development') { + console.info(message); + } else { + this._infoInstance.info(message); } - LoggingSingleton._errorInstance.info(message); } - static logWarning(message) { - if (!LoggingSingleton._warningInstance) { - LoggingSingleton._warningInstance = bunyan.createLogger({ - name: LoggingSingleton._loggerName, - streams: [{ stream: process.stdout, level: 'warn' }, this._loggingBunyan.stream('warn')], - }); + logError(message) { + if (process.env.ENV === 'development') { + console.error(message); + } else { + this._errorInstance.error(message); + } + } + logWarning(message) { + if (process.env.ENV === 'development') { + console.warn(message); + } else { + this._warningInstance.warn(message); } - LoggingSingleton._warningInstance.info(message); } } exports.LoggingSingleton = LoggingSingleton; -LoggingSingleton._loggingBunyan = new logging_bunyan_1.LoggingBunyan(); -LoggingSingleton._loggerName = 'adinfo'; diff --git a/dist/utils/CsvUtils.js b/dist/utils/CsvUtils.js index 52932aaf..002bbd39 100644 --- a/dist/utils/CsvUtils.js +++ b/dist/utils/CsvUtils.js @@ -15,7 +15,6 @@ class CsvUtils { linesOfCsv[0].split(separator).map((header) => { headers.push(header.replace('\\r', '').trim()); }); - headers[headers.length - 1] = headers[headers.length - 1]; const jsonFromCsv = []; const body = linesOfCsv.slice(1); body.map((line) => { diff --git a/src/ts/app.ts b/src/ts/app.ts index b629a3c6..848ec02f 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -7,11 +7,14 @@ import { config } from 'dotenv'; import { Auth } from './models/Auth'; import { AuthDAO } from './models/DAO/AuthDAO'; import { ApiResponse } from './models/ApiResponse'; +import { LoggingSingleton } from './models/cloud/LoggingSingleton'; config({ path: __dirname + '/../.env' }); const app = express(); +LoggingSingleton.getInstance().logInfo('Iniciando Adinfo!'); + app.use( fileUpload({ createParentPath: true, @@ -45,6 +48,15 @@ app.use( app.all('*', async (req: { [key: string]: any }, res: { [key: string]: any }, next: any) => { const token = req.headers.token; + const log = { + route: req.originalUrl, + token, + heades: req.headers, + body: req.body, + }; + + LoggingSingleton.getInstance().logInfo(JSON.stringify(log)); + const apiResponse = new ApiResponse(); if (token) { diff --git a/src/ts/models/ApiResponse.ts b/src/ts/models/ApiResponse.ts index 5568a195..f9cc51cb 100644 --- a/src/ts/models/ApiResponse.ts +++ b/src/ts/models/ApiResponse.ts @@ -1,3 +1,5 @@ +import { LoggingSingleton } from './cloud/LoggingSingleton'; + export class ApiResponse { private _statusCode: number; private _responseText: string; @@ -30,9 +32,13 @@ export class ApiResponse { } get jsonResponse(): { [key: string]: string } { - return { + const response = { responseText: this._responseText, errorMessage: this._errorMessage, }; + if (this._statusCode !== 200) { + LoggingSingleton.getInstance().logError(JSON.stringify(response)); + } + return response; } } diff --git a/src/ts/models/Log.ts b/src/ts/models/Log.ts index 2fc5ed4c..a8cf0d2a 100644 --- a/src/ts/models/Log.ts +++ b/src/ts/models/Log.ts @@ -1 +1,5 @@ -export abstract class Log {} +export abstract class Log { + abstract logInfo(message: string): void; + abstract logError(message: string): void; + abstract logWarning(message: string): void; +} diff --git a/src/ts/models/cloud/LoggingSingleton.ts b/src/ts/models/cloud/LoggingSingleton.ts index 11a7345d..60b36e7b 100644 --- a/src/ts/models/cloud/LoggingSingleton.ts +++ b/src/ts/models/cloud/LoggingSingleton.ts @@ -4,43 +4,57 @@ import * as bunyan from 'bunyan'; import { LoggingBunyan } from '@google-cloud/logging-bunyan'; export class LoggingSingleton extends Log { - private static _loggingBunyan = new LoggingBunyan(); - private static _loggerName = 'adinfo'; - private static _infoInstance: bunyan; - private static _errorInstance: bunyan; - private static _warningInstance: bunyan; + private _loggingBunyan = new LoggingBunyan(); + private _loggerName = 'adinfo'; + private _infoInstance: bunyan; + private _errorInstance: bunyan; + private _warningInstance: bunyan; + private static _instance: LoggingSingleton; private constructor() { super(); + this._infoInstance = bunyan.createLogger({ + name: this._loggerName, + streams: [{ stream: process.stdout, level: 'info' }, this._loggingBunyan.stream('info')], + }); + this._errorInstance = bunyan.createLogger({ + name: this._loggerName, + streams: [{ stream: process.stdout, level: 'error' }, this._loggingBunyan.stream('error')], + }); + this._warningInstance = bunyan.createLogger({ + name: this._loggerName, + streams: [{ stream: process.stdout, level: 'warn' }, this._loggingBunyan.stream('warn')], + }); } - public static logInfo(message: string): void { - if (!LoggingSingleton._infoInstance) { - LoggingSingleton._infoInstance = bunyan.createLogger({ - name: LoggingSingleton._loggerName, - streams: [{ stream: process.stdout, level: 'info' }, this._loggingBunyan.stream('info')], - }); + public static getInstance(): LoggingSingleton { + if (!LoggingSingleton._instance) { + LoggingSingleton._instance = new LoggingSingleton(); } - LoggingSingleton._infoInstance.info(message); + return LoggingSingleton._instance; } - public static logError(message: string): void { - if (!LoggingSingleton._errorInstance) { - LoggingSingleton._errorInstance = bunyan.createLogger({ - name: LoggingSingleton._loggerName, - streams: [{ stream: process.stdout, level: 'error' }, this._loggingBunyan.stream('error')], - }); + public logInfo(message: string): void { + if (process.env.ENV === 'development') { + console.info(message); + } else { + this._infoInstance.info(message); } - LoggingSingleton._errorInstance.info(message); } - public static logWarning(message: string): void { - if (!LoggingSingleton._warningInstance) { - LoggingSingleton._warningInstance = bunyan.createLogger({ - name: LoggingSingleton._loggerName, - streams: [{ stream: process.stdout, level: 'warn' }, this._loggingBunyan.stream('warn')], - }); + public logError(message: string): void { + if (process.env.ENV === 'development') { + console.error(message); + } else { + this._errorInstance.error(message); + } + } + + public logWarning(message: string): void { + if (process.env.ENV === 'development') { + console.warn(message); + } else { + this._warningInstance.warn(message); } - LoggingSingleton._warningInstance.info(message); } } diff --git a/src/ts/utils/CsvUtils.ts b/src/ts/utils/CsvUtils.ts index e860476b..5f06a54a 100644 --- a/src/ts/utils/CsvUtils.ts +++ b/src/ts/utils/CsvUtils.ts @@ -35,7 +35,6 @@ export class CsvUtils { linesOfCsv[0].split(separator).map((header) => { headers.push(header.replace('\\r', '').trim()); }); - headers[headers.length - 1] = headers[headers.length - 1]; const jsonFromCsv: { [key: string]: string }[] = []; const body = linesOfCsv.slice(1); From 15e761fc70d82784d102371964f73dc672aaebaa Mon Sep 17 00:00:00 2001 From: Gustavo Ueti Date: Mon, 14 Jun 2021 18:45:24 -0300 Subject: [PATCH 57/68] =?UTF-8?q?feat:=20:zap:=20Adi=C3=A7=C3=A3o=20do=20i?= =?UTF-8?q?dentificador=20do=20separador=20autom=C3=A1tico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adicionamos com que o código identifique qual separador o arquivo está utilizando para gerar um CSV novo, caso nenhum separador seja configurado no front --- dist/models/Config.js | 2 - dist/routes/build.js | 11 +- dist/utils/CsvUtils.js | 7 + package-lock.json | 8207 ++++++++++++++++++++++++++++++++++- src/ts/models/Config.ts | 3 +- src/ts/routes/build.ts | 12 +- src/ts/utils/CsvUtils.ts | 14 + test/utils/CsvUtils.spec.ts | 22 + 8 files changed, 8250 insertions(+), 28 deletions(-) diff --git a/dist/models/Config.js b/dist/models/Config.js index f3eaa7a1..266e313c 100644 --- a/dist/models/Config.js +++ b/dist/models/Config.js @@ -6,7 +6,6 @@ const DependencyConfig_1 = require('./DependencyConfig'); const StringUtils_1 = require('../utils/StringUtils'); class Config { constructor(jsonConfig) { - this._csvSeparator = ','; const jsonConfigTemp = Object.assign({}, jsonConfig); this._separator = jsonConfigTemp.separator; delete jsonConfigTemp.separator; @@ -42,7 +41,6 @@ class Config { !this._insertTime || !this._version || !this._analyticsTool || - !this._csvSeparator || !this._validationRules ); } diff --git a/dist/routes/build.js b/dist/routes/build.js index eb137953..26bfe0c3 100644 --- a/dist/routes/build.js +++ b/dist/routes/build.js @@ -49,7 +49,16 @@ const build = (app) => { } }) .then(() => { - const jsonFromFile = CsvUtils_1.CsvUtils.csv2json(fileContent.toString(), companyConfig.csvSeparator); + const csvContent = fileContent.toString(); + const jsonFromFile = CsvUtils_1.CsvUtils.csv2json( + csvContent, + CsvUtils_1.CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) + ); + console.log('separador do config: ' + companyConfig.csvSeparator); + console.log( + 'separador da funcao se passado undefined: ' + + CsvUtils_1.CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) + ); const jsonParameterized = new Builder_1.Builder(jsonFromFile, companyConfig, media).build(); const configVersion = companyConfig.version; const configTimestamp = DateUtils_1.DateUtils.newDateStringFormat( diff --git a/dist/utils/CsvUtils.js b/dist/utils/CsvUtils.js index 002bbd39..28a9e0bb 100644 --- a/dist/utils/CsvUtils.js +++ b/dist/utils/CsvUtils.js @@ -26,5 +26,12 @@ class CsvUtils { }); return jsonFromCsv; } + static identifyCsvSepartor(csvHeader, csvSeparatorDefault) { + if (csvSeparatorDefault) { + return csvSeparatorDefault; + } else { + return csvHeader.includes(',') ? ',' : ';'; + } + } } exports.CsvUtils = CsvUtils; diff --git a/package-lock.json b/package-lock.json index 5bfdcd40..91568d3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,8165 @@ { "name": "penguin-adinfo", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@google-cloud/firestore": "^4.11.0", + "@google-cloud/logging-bunyan": "^3.0.1", + "@google-cloud/storage": "^5.1.1", + "@types/bunyan": "^1.8.6", + "app": "^0.1.0", + "body-parser": "^1.19.0", + "bunyan": "^1.8.15", + "convert-csv-to-json": "0.0.15", + "cors": "^2.8.5", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "express-fileupload": "^1.2.0", + "express-validator": "^6.11.1", + "json-2-csv": "^3.11.1", + "multer": "^1.4.2", + "remark": "^13.0.0" + }, + "devDependencies": { + "@types/chai": "^4.2.14", + "@types/cors": "^2.8.9", + "@types/express": "^4.17.11", + "@types/express-fileupload": "^1.1.6", + "@types/mocha": "^8.2.2", + "@typescript-eslint/eslint-plugin": "^4.6.1", + "@typescript-eslint/parser": "^4.22.1", + "chai": "^4.2.0", + "eslint": "^7.12.1", + "eslint-config-prettier": "^6.15.0", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-tsdoc": "^0.2.14", + "mocha": "^8.2.1", + "nodemon": "^2.0.4", + "nyc": "^15.1.0", + "prettier": "^2.1.2", + "supertest": "^6.1.3", + "ts-node": "^9.0.0", + "ts-node-dev": "^1.1.6", + "typedoc": "^0.20.36", + "typescript": "^4.2.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz", + "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/core/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/core/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/core/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.0.tgz", + "integrity": "sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz", + "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/parser": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.0.tgz", + "integrity": "sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/template/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/template/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/template/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/template/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/template/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/traverse": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", + "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/traverse/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/traverse/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.0.tgz", + "integrity": "sha512-O2LVLdcnWplaGxiPBz12d0HcdN8QdxdsWYhz5LSeuukV/5mn2xUUc3gBeU4QBYPJ18g/UToe8F532XJ608prmg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@eslint/eslintrc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@google-cloud/common": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.4.1.tgz", + "integrity": "sha512-e5z0CwsM0RXky+PnyPtQ3QK46ksqm+kE7kX8pm8X+ddBwZJipHchKeazMM5fLlGCS+AALalzXb+uYmH72TRnpQ==", + "dependencies": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^6.1.1", + "retry-request": "^4.1.1", + "teeny-request": "^7.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.11.0.tgz", + "integrity": "sha512-Do9WJzEkFBBB+zVFvFfrrrIFEz086lrdgKQic7XsdoTgtYtq0yMu2u3kGLyxMbdasl2c2yf49FE4YvO3AYjQMQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^2.9.2", + "protobufjs": "^6.8.6" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@google-cloud/logging": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-8.2.0.tgz", + "integrity": "sha512-DJNOexKr324dnXsl1z1u/T5MzF6qqmV4f9JQsvCgmMBvdLVqpd+Y+9G3s2I677q2EnHnv97Lja0sOn0oCUV7vQ==", + "dependencies": { + "@google-cloud/common": "^3.4.1", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "@opencensus/propagation-stackdriver": "0.0.22", + "arrify": "^2.0.1", + "dot-prop": "^6.0.0", + "eventid": "^1.0.0", + "extend": "^3.0.2", + "gcp-metadata": "^4.0.0", + "google-auth-library": "^6.0.0", + "google-gax": "^2.9.2", + "is": "^3.3.0", + "on-finished": "^2.3.0", + "pumpify": "^2.0.1", + "snakecase-keys": "^3.1.2", + "stream-events": "^1.0.5", + "through2": "^4.0.0", + "type-fest": "^0.20.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/logging-bunyan": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-bunyan/-/logging-bunyan-3.0.1.tgz", + "integrity": "sha512-tp9ltnfl5bmgIjWhK2YLxNcMit6Q9vmtB17/11PWsMCDVZXsCdwTZ58HEysy+xeCjYcsHBmnTohr6Nl+A6puGA==", + "dependencies": { + "@google-cloud/logging": "^8.0.0", + "google-auth-library": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/logging/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/logging/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", + "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", + "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", + "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/storage": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.4.0.tgz", + "integrity": "sha512-3sp1y6og1vEUgiN7s9SkP1zKwjsFKqBSz9y8KJKblyy2gfZnMLm4Sdw4oeZrQsDG6UKAbKq1KHe36b72SHeMIg==", + "dependencies": { + "@google-cloud/common": "^3.3.0", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "date-and-time": "^0.14.0", + "duplexify": "^4.0.0", + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "gcs-resumable-upload": "^3.1.0", + "get-stream": "^6.0.0", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/storage/node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz", + "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==", + "dependencies": { + "@grpc/proto-loader": "^0.6.0-pre14", + "@types/node": "^12.12.47", + "google-auth-library": "^6.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.6.0-pre9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz", + "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.9.0", + "yargs": "^15.3.1" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", + "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", + "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", + "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.13.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opencensus/core": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.22.tgz", + "integrity": "sha512-ErazJtivjceNoOZI1bG9giQ6cWS45J4i6iPUtlp7dLNu58OLs/v+CD0FsaPCh47XgPxAI12vbBE8Ec09ViwHNA==", + "dependencies": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^7.0.0", + "shimmer": "^1.2.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@opencensus/core/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opencensus/propagation-stackdriver": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.0.22.tgz", + "integrity": "sha512-eBvf/ihb1mN8Yz/ASkz8nHzuMKqygu77+VNnUeR0yEh3Nj+ykB8VVR6lK+NAFXo1Rd1cOsTmgvuXAZgDAGleQQ==", + "dependencies": { + "@opencensus/core": "^0.0.22", + "hex2dec": "^1.0.1", + "uuid": "^8.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bson": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", + "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.6.tgz", + "integrity": "sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.14.tgz", + "integrity": "sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", + "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-fileupload": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/express-fileupload/-/express-fileupload-1.1.6.tgz", + "integrity": "sha512-8z92PCVgvWvG1TpxucRU9oRz3hZc5cUz+CkeDe4XwVmg2DJDdd/7QASMsJzIo+9Pbfp7LfTEWSeEFUJZBohv9g==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", + "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "dev": true + }, + "node_modules/@types/mongodb": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==", + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "12.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz", + "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==" + }, + "node_modules/@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", + "integrity": "sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.6.1", + "@typescript-eslint/scope-manager": "4.6.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", + "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/typescript-estree": "4.6.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.1.tgz", + "integrity": "sha512-l+sUJFInWhuMxA6rtirzjooh8cM/AATAe3amvIkqKFeMzkn85V+eLzb1RyuXkHak4dLfYzOmF6DXPyflJvjQnw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.22.1", + "@typescript-eslint/types": "4.22.1", + "@typescript-eslint/typescript-estree": "4.22.1", + "debug": "^4.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.1.tgz", + "integrity": "sha512-d5bAiPBiessSmNi8Amq/RuLslvcumxLmyhf1/Xa9IuaoFJ0YtshlJKxhlbY7l2JdEk3wS0EnmnfeJWSvADOe0g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.1", + "@typescript-eslint/visitor-keys": "4.22.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.1.tgz", + "integrity": "sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz", + "integrity": "sha512-p3We0pAPacT+onSGM+sPR+M9CblVqdA9F1JEdIqRVlxK5Qth4ochXQgIyb9daBomyQKAXbygxp1aXQRV0GC79A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.1", + "@typescript-eslint/visitor-keys": "4.22.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz", + "integrity": "sha512-WPkOrIRm+WCLZxXQHCi+WG8T2MMTUFR70rWjdWYddLT7cEfb2P4a3O/J2U1FBVsSFTocXLCoXWY6MZGejeStvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", + "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", + "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", + "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", + "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.6.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/app/-/app-0.1.0.tgz", + "integrity": "sha1-eT4S9R98zgkiwjFlJhVDeGp0f+o=", + "dependencies": { + "app-client": "x", + "connect": "x", + "cornerstone": "x", + "mime": "x", + "mongoose": "x", + "optimist": "x", + "uglify-js": "x" + } + }, + "node_modules/app-client": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/app-client/-/app-client-0.1.0.tgz", + "integrity": "sha1-K1pOexcCqmX92MnOZoN4o1hgcJ0=", + "dependencies": { + "connect": "x", + "cornerstone": "x", + "modulator": "x", + "optimist": "x" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "dependencies": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "engines": { + "node": "<=0.11.8 || >0.11.10" + } + }, + "node_modules/async-listener/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "devOptional": true + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bl/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", + "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001214", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.719", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "dependencies": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/busboy/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/busboy/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001219", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001219.tgz", + "integrity": "sha512-c0yixVG4v9KBc/tQ2rlbB3A/bgBFRvl8h8M4IeUbqCca4gsiCfvtaheUssbnux/Mb66Vjz7x8yYjDgYcNQOhyQ==", + "dev": true + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "devOptional": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "dependencies": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "node_modules/convert-csv-to-json": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/convert-csv-to-json/-/convert-csv-to-json-0.0.15.tgz", + "integrity": "sha512-mXpZWoSc3RXWuA50GAx/BAj+7GIWLmYCr2/IoW9L+cwwvRt6TkTY+15emUyeNInyfl5uZf+H6sQQkpKhjwJB0w==" + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cornerstone": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/cornerstone/-/cornerstone-0.1.1.tgz", + "integrity": "sha1-D4mxPUZVrgAEgUZpOWwZUqnXjt0=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d64/-/d64-1.0.0.tgz", + "integrity": "sha1-QAKofoUMv8n52XBrYPymE6MzbpA=" + }, + "node_modules/date-and-time": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", + "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==" + }, + "node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dateformat/node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deeks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/deeks/-/deeks-2.3.0.tgz", + "integrity": "sha512-mrNI+TSdnK5s2Gal4Fv3/RGcrYGtB4NC3tTXU1hu74tYsG9JS6SzNKLD8doq6UWsglouGwC86kXqB1pdO+9hyA==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "dependencies": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/dicer/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/dicer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doc-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/doc-path/-/doc-path-2.3.0.tgz", + "integrity": "sha512-RMZA8AXl0I78jI9odw0kFzOfQvBcCFLI6/ZtOs9PwogcL4DHc+sCUZQ34fkealJyqErJryYODVBOtO2IzU/CSw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.723", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.723.tgz", + "integrity": "sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg==", + "dev": true + }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dependencies": { + "shimmer": "^1.2.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz", + "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "dependencies": { + "get-stdin": "^6.0.0" + }, + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-tsdoc": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.14.tgz", + "integrity": "sha512-fJ3fnZRsdIoBZgzkQjv8vAj6NeeOoFkTfgosj6mKsFjX70QV256sA/wq+y/R2+OL4L8E79VVaVWrPeZnKNe8Ng==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "0.15.2" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventid/-/eventid-1.0.0.tgz", + "integrity": "sha512-4upSDsvpxhWPsmw4fsJCp0zj8S7I0qh1lCDTmZXP8V3TtryQKDI8CgQPN+e5JakbWwzaAX3lrdp2b3KSoMSUpw==", + "dependencies": { + "d64": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eventid/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-fileupload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.0.tgz", + "integrity": "sha512-oe4WpKcSppXnl5peornawWUa6tKmIc1/kJxMNRGJR1A0v4zyLL6VsFR6wZ8P2a4Iq3aGx8xae3Vlr+MOMQhFPw==", + "dependencies": { + "busboy": "^0.3.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/express-fileupload/node_modules/busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "dependencies": { + "dicer": "0.3.0" + }, + "engines": { + "node": ">=4.5.0" + } + }, + "node_modules/express-fileupload/node_modules/dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dependencies": { + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=4.5.0" + } + }, + "node_modules/express-validator": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.11.1.tgz", + "integrity": "sha512-XAMdu1P6RESd8bvKtNdgNPsW+abkY6UQ2EVUqPpK6QVqieZKaLrN7W/zeFzDWZmgAy/RPEW8M4KYXMqQk6GmTA==", + "dependencies": { + "lodash": "^4.17.21", + "validator": "^13.5.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/express-validator/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "node_modules/fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, + "node_modules/fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "node_modules/gaxios": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", + "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcp-metadata": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", + "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcs-resumable-upload": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", + "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", + "dependencies": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "google-auth-library": "^6.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "bin": { + "gcs-upload": "build/src/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcs-resumable-upload/node_modules/gaxios": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", + "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "dependencies": { + "ini": "^1.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-auth-library": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", + "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-gax": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.2.tgz", + "integrity": "sha512-Pve4osEzNKpBZqFXMfGKBbKCtgnHpUe5IQMh5Ou+Xtg8nLcba94L3gF0xgM5phMdGRRqJn0SMjcuEVmOYu7EBg==", + "dependencies": { + "@grpc/grpc-js": "~1.1.1", + "@grpc/proto-loader": "^0.5.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^6.1.3", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "protobufjs": "^6.9.0", + "retry-request": "^4.0.0" + }, + "bin": { + "compileProtos": "build/tools/compileProtos.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-p12-pem": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", + "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", + "dependencies": { + "node-forge": "^0.10.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/gtoken": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.5.tgz", + "integrity": "sha512-wvjkecutFh8kVfbcdBdUWqDRrXb+WrgD79DBDEYf1Om8S1FluhylhtFjrL7Tx69vNhh259qA3Q1P4sPtb+kUYw==", + "dependencies": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0", + "mime": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + } + }, + "node_modules/handlebars/node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-stream-validation": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==" + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex2dec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz", + "integrity": "sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA==" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "devOptional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "engines": { + "node": "*" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-2-csv": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-3.11.1.tgz", + "integrity": "sha512-TKGRDudkwV2MXB1YJw5KHM9aqHnE/VCpCvEdmezp6w3qJWB953m0U9ILDE3BKumHMRiYHSP44c8l0B+Ydz4CJw==", + "dependencies": { + "deeks": "2.3.0", + "doc-path": "2.3.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/marked": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.3.tgz", + "integrity": "sha512-5otztIIcJfPc2qGTN8cVtOJEjNJZ0jwa46INMagrYfk0EvqtRuEHLsEe0LrFS0/q+ZRKT0+kXK7P2T1AN5lWRA==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.3", + "debug": "4.2.0", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "nanoid": "3.1.12", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "7.2.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.2", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/mocha/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/mocha/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/mocha/node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/modulator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/modulator/-/modulator-0.1.0.tgz", + "integrity": "sha1-z9UVhD+R1nPxVWHZeZ33gErQMmY=", + "dependencies": { + "uglify-js": "x" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + } + }, + "node_modules/mongoose": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.11.9.tgz", + "integrity": "sha512-lmG6R64jtGGxqtn88BkkY+v470LUfGgyTKUyjswQ5c01GNgQvxA0kQd8h+tm0hZb639hKNRxL9ZBQlLleUpuIQ==", + "dependencies": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.3", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.1", + "mquery": "3.2.3", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "node_modules/mpath": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.1.tgz", + "integrity": "sha512-norEinle9aFc05McBawVPwqgFZ7npkts9yu17ztIVLwPwO9rq0OTp89kGVTqvv5rNLMz96E5iWHpVORjI411vA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.3.tgz", + "integrity": "sha512-cIfbP4TyMYX+SkaQ2MntD+F2XbqaBHUYWk3j+kqdDztPWok3tgyssOZxMHMtzbV1w9DaSlvEea0Iocuro41A4g==", + "dependencies": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/mquery/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || >=13.7" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", + "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "dependencies": { + "lru-cache": "^5.1.1" + } + }, + "node_modules/onigasm/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/onigasm/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "13.13.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.38.tgz", + "integrity": "sha512-oxo8j9doh7ab9NwDA9bCeFfjHRF/uzk+fTljCy8lMjZ3YzZGAXNDKhTE3Byso/oy32UTUQIXB3HCVHu3d2T3xg==" + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dependencies": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "dependencies": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "node_modules/require_optional/node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require_optional/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/retry-request": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", + "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", + "dependencies": { + "debug": "^4.1.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shiki": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz", + "integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==", + "dev": true, + "dependencies": { + "onigasm": "^2.2.5", + "vscode-textmate": "^5.2.0" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/snakecase-keys": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-3.2.1.tgz", + "integrity": "sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==", + "dependencies": { + "map-obj": "^4.1.0", + "to-snake-case": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/snakecase-keys/node_modules/map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent/node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" + }, + "node_modules/superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supertest": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", + "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/teeny-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", + "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", + "dependencies": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-no-case": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", + "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-snake-case": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-snake-case/-/to-snake-case-1.0.0.tgz", + "integrity": "sha1-znRpE4l5RgGah+Yu366upMYIq4w=", + "dependencies": { + "to-space-case": "^1.0.0" + } + }, + "node_modules/to-space-case": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", + "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", + "dependencies": { + "to-no-case": "^1.0.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "node_modules/ts-node": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ts-node-dev": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.6.tgz", + "integrity": "sha512-RTUi7mHMNQospArGz07KiraQcdgUVNXKsgO2HAi7FoiyPMdTDqdniB6K1dqyaIxT7c9v/VpSbfBZPS6uVpaFLQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dateformat": "~1.0.4-1.2.3", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^9.0.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-node-dev/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/ts-node-dev/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ts-node-dev/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.20.36", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.36.tgz", + "integrity": "sha512-qFU+DWMV/hifQ9ZAlTjdFO9wbUIHuUBpNXzv68ZyURAP9pInjZiO4+jCPeAzHVcaBCHER9WL/+YzzTt6ZlN/Nw==", + "dev": true, + "dependencies": { + "colors": "^1.4.0", + "fs-extra": "^9.1.0", + "handlebars": "^4.7.7", + "lodash": "^4.17.21", + "lunr": "^2.3.9", + "marked": "^2.0.3", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "shiki": "^0.9.3", + "typedoc-default-themes": "^0.12.10" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 10.8.0" + } + }, + "node_modules/typedoc-default-themes": { + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", + "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.3.tgz", + "integrity": "sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/undefsafe/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/undefsafe/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/unified": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", + "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", + "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "node_modules/vscode-textmate": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.4.0.tgz", + "integrity": "sha512-c0Q4zYZkcLizeYJ3hNyaVUM2AA8KDhNCA3JvXY8CeZSJuBdAy3bAvSbv46RClC4P3dSO9BdwhnKEx2zOo6vP/w==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/workerpool": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", + "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + }, "dependencies": { "@babel/code-frame": { "version": "7.10.4", @@ -1480,7 +9637,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "devOptional": true }, "base64-js": { "version": "1.3.1", @@ -1634,6 +9792,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1986,7 +10145,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "devOptional": true }, "concat-stream": { "version": "1.6.2", @@ -3477,6 +11637,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "devOptional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4173,6 +12334,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "devOptional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4966,7 +13128,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "devOptional": true }, "path-key": { "version": "3.1.1", @@ -5377,16 +13540,6 @@ "is-finite": "^1.0.0" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -5408,6 +13561,16 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "resolve": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", @@ -5826,6 +13989,14 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -5836,14 +14007,6 @@ "strip-ansi": "^6.0.0" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", diff --git a/src/ts/models/Config.ts b/src/ts/models/Config.ts index f73694f6..9f2b1ef7 100644 --- a/src/ts/models/Config.ts +++ b/src/ts/models/Config.ts @@ -5,7 +5,7 @@ import { StringUtils } from '../utils/StringUtils'; export class Config { private _separator: string; private _spaceSeparator: string; - private _csvSeparator = ','; + private _csvSeparator: string; private _insertTime: string; private _version: number; private _analyticsTool: { [key: string]: { [key: string]: string[] } }; @@ -54,7 +54,6 @@ export class Config { !this._insertTime || !this._version || !this._analyticsTool || - !this._csvSeparator || !this._validationRules ); } diff --git a/src/ts/routes/build.ts b/src/ts/routes/build.ts index 849e2436..b2c02ce8 100644 --- a/src/ts/routes/build.ts +++ b/src/ts/routes/build.ts @@ -54,7 +54,17 @@ const build = (app: { [key: string]: any }): void => { } }) .then(() => { - const jsonFromFile = CsvUtils.csv2json(fileContent.toString(), companyConfig.csvSeparator); + const csvContent = fileContent.toString(); + const jsonFromFile = CsvUtils.csv2json( + csvContent, + CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) + ); + console.log('separador do config: ' + companyConfig.csvSeparator); + console.log( + 'separador da funcao se passado undefined: ' + + CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) + ); + // const jsonFromFile = CsvUtils.csv2json(fileContent.split('\n')[0], companyConfig.csvSeparator); const jsonParameterized = new Builder(jsonFromFile, companyConfig, media).build(); const configVersion = companyConfig.version; const configTimestamp = DateUtils.newDateStringFormat( diff --git a/src/ts/utils/CsvUtils.ts b/src/ts/utils/CsvUtils.ts index 5f06a54a..49da94d3 100644 --- a/src/ts/utils/CsvUtils.ts +++ b/src/ts/utils/CsvUtils.ts @@ -47,4 +47,18 @@ export class CsvUtils { }); return jsonFromCsv; } + /** + * Identificador do separador a ser usado no CSV + * @param csvHeader Conteúdo do header do CSV + * @param csvSeparatorDefault Separador configurado para ser o padrão + * @returns Separador a ser utilizado + */ + + static identifyCsvSepartor(csvHeader: string, csvSeparatorDefault: string): string { + if (csvSeparatorDefault) { + return csvSeparatorDefault; + } else { + return csvHeader.includes(',') ? ',' : ';'; + } + } } diff --git a/test/utils/CsvUtils.spec.ts b/test/utils/CsvUtils.spec.ts index 6e14fa9a..15a0e64e 100644 --- a/test/utils/CsvUtils.spec.ts +++ b/test/utils/CsvUtils.spec.ts @@ -111,4 +111,26 @@ describe('CSV Utils', () => { expect(CsvUtils.isLineEmpty(csvLine)).to.equal(true); }); }); + describe('CSV Separator Identify', () => { + it('Verifica se há um valor predefinido de separador e o retorna (Separador = ,)', ()=>{ + const separadorDefault = ','; + const arquivo = 'Url,Responsavel,Dispositivo,Formato ou Canal,Nome da Campanha,Bandeira,Tipo de Compra,Periodo,Campo Livre,Veiculo' + expect(CsvUtils.identifyCsvSepartor(arquivo, separadorDefault)).to.equal(separadorDefault); + }); + it('Verifica se há um valor predefinido de separador e o retorna (Separador = ;)', ()=>{ + const separadorDefault = ';'; + const arquivo = 'Url;Responsavel;Dispositivo;Formato ou Canal;Nome da Campanha;Bandeira;Tipo de Compra;Periodo;Campo Livre;Veiculo' + expect(CsvUtils.identifyCsvSepartor(arquivo, separadorDefault)).to.equal(separadorDefault); + }); + it('Identifica automaticamente o separador utilizado no arquivo, caso não haja um separador predefinido (Separador = ,)', ()=>{ + const separadorDefault:undefined = undefined; + const arquivo = 'Url,Responsavel,Dispositivo,Formato ou Canal,Nome da Campanha,Bandeira,Tipo de Compra,Periodo,Campo Livre,Veiculo' + expect(CsvUtils.identifyCsvSepartor(arquivo, separadorDefault)).to.equal(','); + }); + it('Identifica automaticamente o separador utilizado no arquivo, caso não haja um separador predefinido (Separador = ;)', ()=>{ + const separadorDefault:undefined = undefined; + const arquivo = 'Url;Responsavel;Dispositivo;Formato ou Canal;Nome da Campanha;Bandeira;Tipo de Compra;Periodo;Campo Livre;Veiculo' + expect(CsvUtils.identifyCsvSepartor(arquivo, separadorDefault)).to.equal(';'); + }); + }); }); From 3407e805ca550bf1673baac16d8076f1ca307ece Mon Sep 17 00:00:00 2001 From: Gustavo Ueti Date: Tue, 15 Jun 2021 09:41:59 -0300 Subject: [PATCH 58/68] =?UTF-8?q?style:=20:art:=20Remo=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20logs=20usados=20no=20desenvolvimento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/routes/build.js | 5 ----- src/ts/routes/build.ts | 6 ------ 2 files changed, 11 deletions(-) diff --git a/dist/routes/build.js b/dist/routes/build.js index 26bfe0c3..8dc29ac6 100644 --- a/dist/routes/build.js +++ b/dist/routes/build.js @@ -54,11 +54,6 @@ const build = (app) => { csvContent, CsvUtils_1.CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) ); - console.log('separador do config: ' + companyConfig.csvSeparator); - console.log( - 'separador da funcao se passado undefined: ' + - CsvUtils_1.CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) - ); const jsonParameterized = new Builder_1.Builder(jsonFromFile, companyConfig, media).build(); const configVersion = companyConfig.version; const configTimestamp = DateUtils_1.DateUtils.newDateStringFormat( diff --git a/src/ts/routes/build.ts b/src/ts/routes/build.ts index b2c02ce8..85505880 100644 --- a/src/ts/routes/build.ts +++ b/src/ts/routes/build.ts @@ -59,12 +59,6 @@ const build = (app: { [key: string]: any }): void => { csvContent, CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) ); - console.log('separador do config: ' + companyConfig.csvSeparator); - console.log( - 'separador da funcao se passado undefined: ' + - CsvUtils.identifyCsvSepartor(csvContent.split('\n')[0], companyConfig.csvSeparator) - ); - // const jsonFromFile = CsvUtils.csv2json(fileContent.split('\n')[0], companyConfig.csvSeparator); const jsonParameterized = new Builder(jsonFromFile, companyConfig, media).build(); const configVersion = companyConfig.version; const configTimestamp = DateUtils.newDateStringFormat( From 9a4818fff586ab72deaaad1fa9082b187d386b32 Mon Sep 17 00:00:00 2001 From: gustavoueti Date: Mon, 14 Jun 2021 21:46:58 +0000 Subject: [PATCH 59/68] style: :lipstick: Apply formatting changes --- package-lock.json | 8207 +-------------------------------------------- 1 file changed, 22 insertions(+), 8185 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91568d3a..5bfdcd40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8165 +1,8 @@ { "name": "penguin-adinfo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@google-cloud/firestore": "^4.11.0", - "@google-cloud/logging-bunyan": "^3.0.1", - "@google-cloud/storage": "^5.1.1", - "@types/bunyan": "^1.8.6", - "app": "^0.1.0", - "body-parser": "^1.19.0", - "bunyan": "^1.8.15", - "convert-csv-to-json": "0.0.15", - "cors": "^2.8.5", - "dotenv": "^8.2.0", - "express": "^4.17.1", - "express-fileupload": "^1.2.0", - "express-validator": "^6.11.1", - "json-2-csv": "^3.11.1", - "multer": "^1.4.2", - "remark": "^13.0.0" - }, - "devDependencies": { - "@types/chai": "^4.2.14", - "@types/cors": "^2.8.9", - "@types/express": "^4.17.11", - "@types/express-fileupload": "^1.1.6", - "@types/mocha": "^8.2.2", - "@typescript-eslint/eslint-plugin": "^4.6.1", - "@typescript-eslint/parser": "^4.22.1", - "chai": "^4.2.0", - "eslint": "^7.12.1", - "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.4.0", - "eslint-plugin-tsdoc": "^0.2.14", - "mocha": "^8.2.1", - "nodemon": "^2.0.4", - "nyc": "^15.1.0", - "prettier": "^2.1.2", - "supertest": "^6.1.3", - "ts-node": "^9.0.0", - "ts-node-dev": "^1.1.6", - "typedoc": "^0.20.36", - "typescript": "^4.2.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", - "dev": true - }, - "node_modules/@babel/core": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz", - "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/core/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/core/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/core/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/core/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.0.tgz", - "integrity": "sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz", - "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "node_modules/@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/parser": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.0.tgz", - "integrity": "sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/template/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/template/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/traverse": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", - "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.0", - "@babel/types": "^7.14.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/traverse/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/traverse/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.0.tgz", - "integrity": "sha512-O2LVLdcnWplaGxiPBz12d0HcdN8QdxdsWYhz5LSeuukV/5mn2xUUc3gBeU4QBYPJ18g/UToe8F532XJ608prmg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/@eslint/eslintrc": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", - "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@google-cloud/common": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.4.1.tgz", - "integrity": "sha512-e5z0CwsM0RXky+PnyPtQ3QK46ksqm+kE7kX8pm8X+ddBwZJipHchKeazMM5fLlGCS+AALalzXb+uYmH72TRnpQ==", - "dependencies": { - "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^6.1.1", - "retry-request": "^4.1.1", - "teeny-request": "^7.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.11.0.tgz", - "integrity": "sha512-Do9WJzEkFBBB+zVFvFfrrrIFEz086lrdgKQic7XsdoTgtYtq0yMu2u3kGLyxMbdasl2c2yf49FE4YvO3AYjQMQ==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^2.9.2", - "protobufjs": "^6.8.6" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@google-cloud/logging": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-8.2.0.tgz", - "integrity": "sha512-DJNOexKr324dnXsl1z1u/T5MzF6qqmV4f9JQsvCgmMBvdLVqpd+Y+9G3s2I677q2EnHnv97Lja0sOn0oCUV7vQ==", - "dependencies": { - "@google-cloud/common": "^3.4.1", - "@google-cloud/paginator": "^3.0.0", - "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", - "@opencensus/propagation-stackdriver": "0.0.22", - "arrify": "^2.0.1", - "dot-prop": "^6.0.0", - "eventid": "^1.0.0", - "extend": "^3.0.2", - "gcp-metadata": "^4.0.0", - "google-auth-library": "^6.0.0", - "google-gax": "^2.9.2", - "is": "^3.3.0", - "on-finished": "^2.3.0", - "pumpify": "^2.0.1", - "snakecase-keys": "^3.1.2", - "stream-events": "^1.0.5", - "through2": "^4.0.0", - "type-fest": "^0.20.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/logging-bunyan": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/logging-bunyan/-/logging-bunyan-3.0.1.tgz", - "integrity": "sha512-tp9ltnfl5bmgIjWhK2YLxNcMit6Q9vmtB17/11PWsMCDVZXsCdwTZ58HEysy+xeCjYcsHBmnTohr6Nl+A6puGA==", - "dependencies": { - "@google-cloud/logging": "^8.0.0", - "google-auth-library": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/logging/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/logging/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", - "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", - "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", - "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/storage": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.4.0.tgz", - "integrity": "sha512-3sp1y6og1vEUgiN7s9SkP1zKwjsFKqBSz9y8KJKblyy2gfZnMLm4Sdw4oeZrQsDG6UKAbKq1KHe36b72SHeMIg==", - "dependencies": { - "@google-cloud/common": "^3.3.0", - "@google-cloud/paginator": "^3.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.0", - "compressible": "^2.0.12", - "date-and-time": "^0.14.0", - "duplexify": "^4.0.0", - "extend": "^3.0.2", - "gaxios": "^4.0.0", - "gcs-resumable-upload": "^3.1.0", - "get-stream": "^6.0.0", - "hash-stream-validation": "^0.2.2", - "mime": "^2.2.0", - "mime-types": "^2.0.8", - "onetime": "^5.1.0", - "p-limit": "^3.0.1", - "pumpify": "^2.0.0", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/storage/node_modules/p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz", - "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==", - "dependencies": { - "@grpc/proto-loader": "^0.6.0-pre14", - "@types/node": "^12.12.47", - "google-auth-library": "^6.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.6.0-pre9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz", - "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.9.0", - "yargs": "^15.3.1" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", - "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "protobufjs": "^6.8.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opencensus/core": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.22.tgz", - "integrity": "sha512-ErazJtivjceNoOZI1bG9giQ6cWS45J4i6iPUtlp7dLNu58OLs/v+CD0FsaPCh47XgPxAI12vbBE8Ec09ViwHNA==", - "dependencies": { - "continuation-local-storage": "^3.2.1", - "log-driver": "^1.2.7", - "semver": "^7.0.0", - "shimmer": "^1.2.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@opencensus/core/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opencensus/propagation-stackdriver": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.0.22.tgz", - "integrity": "sha512-eBvf/ihb1mN8Yz/ASkz8nHzuMKqygu77+VNnUeR0yEh3Nj+ykB8VVR6lK+NAFXo1Rd1cOsTmgvuXAZgDAGleQQ==", - "dependencies": { - "@opencensus/core": "^0.0.22", - "hex2dec": "^1.0.1", - "uuid": "^8.0.0" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bson": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", - "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/bunyan": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.6.tgz", - "integrity": "sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.14.tgz", - "integrity": "sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ==", - "dev": true - }, - "node_modules/@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", - "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", - "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-fileupload": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@types/express-fileupload/-/express-fileupload-1.1.6.tgz", - "integrity": "sha512-8z92PCVgvWvG1TpxucRU9oRz3hZc5cUz+CkeDe4XwVmg2DJDdd/7QASMsJzIo+9Pbfp7LfTEWSeEFUJZBohv9g==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", - "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "node_modules/@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", - "dev": true - }, - "node_modules/@types/mongodb": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.3.tgz", - "integrity": "sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "12.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz", - "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==" - }, - "node_modules/@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "node_modules/@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "node_modules/@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", - "integrity": "sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.6.1", - "@typescript-eslint/scope-manager": "4.6.1", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", - "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.6.1", - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/typescript-estree": "4.6.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.1.tgz", - "integrity": "sha512-l+sUJFInWhuMxA6rtirzjooh8cM/AATAe3amvIkqKFeMzkn85V+eLzb1RyuXkHak4dLfYzOmF6DXPyflJvjQnw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.22.1", - "@typescript-eslint/types": "4.22.1", - "@typescript-eslint/typescript-estree": "4.22.1", - "debug": "^4.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.1.tgz", - "integrity": "sha512-d5bAiPBiessSmNi8Amq/RuLslvcumxLmyhf1/Xa9IuaoFJ0YtshlJKxhlbY7l2JdEk3wS0EnmnfeJWSvADOe0g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.22.1", - "@typescript-eslint/visitor-keys": "4.22.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.1.tgz", - "integrity": "sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz", - "integrity": "sha512-p3We0pAPacT+onSGM+sPR+M9CblVqdA9F1JEdIqRVlxK5Qth4ochXQgIyb9daBomyQKAXbygxp1aXQRV0GC79A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.22.1", - "@typescript-eslint/visitor-keys": "4.22.1", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz", - "integrity": "sha512-WPkOrIRm+WCLZxXQHCi+WG8T2MMTUFR70rWjdWYddLT7cEfb2P4a3O/J2U1FBVsSFTocXLCoXWY6MZGejeStvQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.22.1", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", - "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/visitor-keys": "4.6.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", - "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", - "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/visitor-keys": "4.6.1", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", - "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.6.1", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aggregate-error/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/app/-/app-0.1.0.tgz", - "integrity": "sha1-eT4S9R98zgkiwjFlJhVDeGp0f+o=", - "dependencies": { - "app-client": "x", - "connect": "x", - "cornerstone": "x", - "mime": "x", - "mongoose": "x", - "optimist": "x", - "uglify-js": "x" - } - }, - "node_modules/app-client": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/app-client/-/app-client-0.1.0.tgz", - "integrity": "sha1-K1pOexcCqmX92MnOZoN4o1hgcJ0=", - "dependencies": { - "connect": "x", - "cornerstone": "x", - "modulator": "x", - "optimist": "x" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", - "dependencies": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - }, - "engines": { - "node": "<=0.11.8 || >0.11.10" - } - }, - "node_modules/async-listener/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "devOptional": true - }, - "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bl/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", - "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001214", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.719", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "dependencies": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/busboy/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/busboy/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001219", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001219.tgz", - "integrity": "sha512-c0yixVG4v9KBc/tQ2rlbB3A/bgBFRvl8h8M4IeUbqCca4gsiCfvtaheUssbnux/Mb66Vjz7x8yYjDgYcNQOhyQ==", - "dev": true - }, - "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "devOptional": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "dependencies": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } - }, - "node_modules/convert-csv-to-json": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/convert-csv-to-json/-/convert-csv-to-json-0.0.15.tgz", - "integrity": "sha512-mXpZWoSc3RXWuA50GAx/BAj+7GIWLmYCr2/IoW9L+cwwvRt6TkTY+15emUyeNInyfl5uZf+H6sQQkpKhjwJB0w==" - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cornerstone": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/cornerstone/-/cornerstone-0.1.1.tgz", - "integrity": "sha1-D4mxPUZVrgAEgUZpOWwZUqnXjt0=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/d64": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d64/-/d64-1.0.0.tgz", - "integrity": "sha1-QAKofoUMv8n52XBrYPymE6MzbpA=" - }, - "node_modules/date-and-time": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", - "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==" - }, - "node_modules/dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "bin": { - "dateformat": "bin/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dateformat/node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deeks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/deeks/-/deeks-2.3.0.tgz", - "integrity": "sha512-mrNI+TSdnK5s2Gal4Fv3/RGcrYGtB4NC3tTXU1hu74tYsG9JS6SzNKLD8doq6UWsglouGwC86kXqB1pdO+9hyA==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-require-extensions/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "dependencies": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/dicer/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/dicer/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doc-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/doc-path/-/doc-path-2.3.0.tgz", - "integrity": "sha512-RMZA8AXl0I78jI9odw0kFzOfQvBcCFLI6/ZtOs9PwogcL4DHc+sCUZQ34fkealJyqErJryYODVBOtO2IzU/CSw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "node_modules/duplexify": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", - "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", - "dev": true, - "dependencies": { - "xtend": "^4.0.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/electron-to-chromium": { - "version": "1.3.723", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.723.tgz", - "integrity": "sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg==", - "dev": true - }, - "node_modules/emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "dependencies": { - "shimmer": "^1.2.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz", - "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", - "dev": true, - "dependencies": { - "get-stdin": "^6.0.0" - }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.14.tgz", - "integrity": "sha512-fJ3fnZRsdIoBZgzkQjv8vAj6NeeOoFkTfgosj6mKsFjX70QV256sA/wq+y/R2+OL4L8E79VVaVWrPeZnKNe8Ng==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "0.15.2" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventid/-/eventid-1.0.0.tgz", - "integrity": "sha512-4upSDsvpxhWPsmw4fsJCp0zj8S7I0qh1lCDTmZXP8V3TtryQKDI8CgQPN+e5JakbWwzaAX3lrdp2b3KSoMSUpw==", - "dependencies": { - "d64": "^1.0.0", - "uuid": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eventid/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-fileupload": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.0.tgz", - "integrity": "sha512-oe4WpKcSppXnl5peornawWUa6tKmIc1/kJxMNRGJR1A0v4zyLL6VsFR6wZ8P2a4Iq3aGx8xae3Vlr+MOMQhFPw==", - "dependencies": { - "busboy": "^0.3.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/express-fileupload/node_modules/busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "dependencies": { - "dicer": "0.3.0" - }, - "engines": { - "node": ">=4.5.0" - } - }, - "node_modules/express-fileupload/node_modules/dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "dependencies": { - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=4.5.0" - } - }, - "node_modules/express-validator": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.11.1.tgz", - "integrity": "sha512-XAMdu1P6RESd8bvKtNdgNPsW+abkY6UQ2EVUqPpK6QVqieZKaLrN7W/zeFzDWZmgAy/RPEW8M4KYXMqQk6GmTA==", - "dependencies": { - "lodash": "^4.17.21", - "validator": "^13.5.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/express-validator/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "node_modules/fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" - }, - "node_modules/fastq": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", - "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "node_modules/gaxios": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", - "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcp-metadata": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", - "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", - "dependencies": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcs-resumable-upload": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", - "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", - "dependencies": { - "abort-controller": "^3.0.0", - "configstore": "^5.0.0", - "extend": "^3.0.2", - "gaxios": "^3.0.0", - "google-auth-library": "^6.0.0", - "pumpify": "^2.0.0", - "stream-events": "^1.0.4" - }, - "bin": { - "gcs-upload": "build/src/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcs-resumable-upload/node_modules/gaxios": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", - "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", - "dev": true, - "dependencies": { - "ini": "^1.3.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-auth-library": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", - "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-gax": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.2.tgz", - "integrity": "sha512-Pve4osEzNKpBZqFXMfGKBbKCtgnHpUe5IQMh5Ou+Xtg8nLcba94L3gF0xgM5phMdGRRqJn0SMjcuEVmOYu7EBg==", - "dependencies": { - "@grpc/grpc-js": "~1.1.1", - "@grpc/proto-loader": "^0.5.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^6.1.3", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "protobufjs": "^6.9.0", - "retry-request": "^4.0.0" - }, - "bin": { - "compileProtos": "build/tools/compileProtos.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-p12-pem": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", - "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", - "dependencies": { - "node-forge": "^0.10.0" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/gtoken": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.5.tgz", - "integrity": "sha512-wvjkecutFh8kVfbcdBdUWqDRrXb+WrgD79DBDEYf1Om8S1FluhylhtFjrL7Tx69vNhh259qA3Q1P4sPtb+kUYw==", - "dependencies": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0", - "mime": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - } - }, - "node_modules/handlebars/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-stream-validation": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", - "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==" - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hex2dec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz", - "integrity": "sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA==" - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "devOptional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "engines": { - "node": "*" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-2-csv": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-3.11.1.tgz", - "integrity": "sha512-TKGRDudkwV2MXB1YJw5KHM9aqHnE/VCpCvEdmezp6w3qJWB953m0U9ILDE3BKumHMRiYHSP44c8l0B+Ydz4CJw==", - "dependencies": { - "deeks": "2.3.0", - "doc-path": "2.3.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "engines": { - "node": ">=0.8.6" - } - }, - "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" - }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/marked": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.3.tgz", - "integrity": "sha512-5otztIIcJfPc2qGTN8cVtOJEjNJZ0jwa46INMagrYfk0EvqtRuEHLsEe0LrFS0/q+ZRKT0+kXK7P2T1AN5lWRA==", - "dev": true, - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 8.16.2" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dependencies": { - "mime-db": "1.44.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "devOptional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/mocha/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/modulator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/modulator/-/modulator-0.1.0.tgz", - "integrity": "sha1-z9UVhD+R1nPxVWHZeZ33gErQMmY=", - "dependencies": { - "uglify-js": "x" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", - "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - } - }, - "node_modules/mongoose": { - "version": "5.11.9", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.11.9.tgz", - "integrity": "sha512-lmG6R64jtGGxqtn88BkkY+v470LUfGgyTKUyjswQ5c01GNgQvxA0kQd8h+tm0hZb639hKNRxL9ZBQlLleUpuIQ==", - "dependencies": { - "@types/mongodb": "^3.5.27", - "bson": "^1.1.4", - "kareem": "2.3.2", - "mongodb": "3.6.3", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.1", - "mquery": "3.2.3", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", - "sift": "7.0.1", - "sliced": "1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, - "node_modules/mpath": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.1.tgz", - "integrity": "sha512-norEinle9aFc05McBawVPwqgFZ7npkts9yu17ztIVLwPwO9rq0OTp89kGVTqvv5rNLMz96E5iWHpVORjI411vA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.3.tgz", - "integrity": "sha512-cIfbP4TyMYX+SkaQ2MntD+F2XbqaBHUYWk3j+kqdDztPWok3tgyssOZxMHMtzbV1w9DaSlvEea0Iocuro41A4g==", - "dependencies": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/mquery/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/mquery/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || >=13.7" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "node_modules/nodemon": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", - "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/onigasm": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", - "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", - "dev": true, - "dependencies": { - "lru-cache": "^5.1.1" - } - }, - "node_modules/onigasm/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/onigasm/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/optimist/node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protobufjs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", - "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": "^13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "13.13.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.38.tgz", - "integrity": "sha512-oxo8j9doh7ab9NwDA9bCeFfjHRF/uzk+fTljCy8lMjZ3YzZGAXNDKhTE3Byso/oy32UTUQIXB3HCVHu3d2T3xg==" - }, - "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", - "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", - "dependencies": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dependencies": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - } - }, - "node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "dependencies": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, - "node_modules/require_optional/node_modules/resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require_optional/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/retry-request": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", - "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", - "dependencies": { - "debug": "^4.1.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shiki": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz", - "integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==", - "dev": true, - "dependencies": { - "onigasm": "^2.2.5", - "vscode-textmate": "^5.2.0" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "node_modules/sift": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", - "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "node_modules/snakecase-keys": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-3.2.1.tgz", - "integrity": "sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==", - "dependencies": { - "map-obj": "^4.1.0", - "to-snake-case": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/snakecase-keys/node_modules/map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", - "engines": { - "node": ">=8" - } - }, - "node_modules/snakeize": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", - "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-indent/node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" - }, - "node_modules/superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 7.0.0" - } - }, - "node_modules/superagent/node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/superagent/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/supertest": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", - "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/teeny-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", - "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", - "dependencies": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-no-case": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-snake-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-snake-case/-/to-snake-case-1.0.0.tgz", - "integrity": "sha1-znRpE4l5RgGah+Yu366upMYIq4w=", - "dependencies": { - "to-space-case": "^1.0.0" - } - }, - "node_modules/to-space-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", - "dependencies": { - "to-no-case": "^1.0.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "node_modules/ts-node": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", - "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ts-node-dev": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.6.tgz", - "integrity": "sha512-RTUi7mHMNQospArGz07KiraQcdgUVNXKsgO2HAi7FoiyPMdTDqdniB6K1dqyaIxT7c9v/VpSbfBZPS6uVpaFLQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.1", - "dateformat": "~1.0.4-1.2.3", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^9.0.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ts-node-dev/node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/ts-node-dev/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/ts-node-dev/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/tsconfig/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tsconfig/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.20.36", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.36.tgz", - "integrity": "sha512-qFU+DWMV/hifQ9ZAlTjdFO9wbUIHuUBpNXzv68ZyURAP9pInjZiO4+jCPeAzHVcaBCHER9WL/+YzzTt6ZlN/Nw==", - "dev": true, - "dependencies": { - "colors": "^1.4.0", - "fs-extra": "^9.1.0", - "handlebars": "^4.7.7", - "lodash": "^4.17.21", - "lunr": "^2.3.9", - "marked": "^2.0.3", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shelljs": "^0.8.4", - "shiki": "^0.9.3", - "typedoc-default-themes": "^0.12.10" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 10.8.0" - } - }, - "node_modules/typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.12.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.3.tgz", - "integrity": "sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw==", - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "dependencies": { - "debug": "^2.2.0" - } - }, - "node_modules/undefsafe/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/undefsafe/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/unified": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", - "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "node_modules/vscode-textmate": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.4.0.tgz", - "integrity": "sha512-c0Q4zYZkcLizeYJ3hNyaVUM2AA8KDhNCA3JvXY8CeZSJuBdAy3bAvSbv46RClC4P3dSO9BdwhnKEx2zOo6vP/w==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" - } - }, "dependencies": { "@babel/code-frame": { "version": "7.10.4", @@ -9637,8 +1480,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "devOptional": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.3.1", @@ -9792,7 +1634,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10145,8 +1986,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "devOptional": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -11637,7 +3477,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "devOptional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -12334,7 +4173,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "devOptional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -13128,8 +4966,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "devOptional": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -13540,6 +5377,16 @@ "is-finite": "^1.0.0" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -13561,16 +5408,6 @@ } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "resolve": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", @@ -13989,14 +5826,6 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -14007,6 +5836,14 @@ "strip-ansi": "^6.0.0" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", From 29f435895d9c1f5aa253629eab598121623ff8dc Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Date: Tue, 15 Jun 2021 10:02:31 -0300 Subject: [PATCH 60/68] fix: :white_check_mark: Fix Config testes --- test/models/Config.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/models/Config.spec.ts b/test/models/Config.spec.ts index 2280c09f..9206de79 100644 --- a/test/models/Config.spec.ts +++ b/test/models/Config.spec.ts @@ -5,8 +5,8 @@ describe('Config', () => { describe('Valida a criação do config para Adobe', () => { it('Validação do método toJson', () => { const jsonConfig = { - csvSeparator: ',', separator: ':', + csvSeparator: ',', dependenciesConfig: [ { columnReference: 'Tipo de Compra', @@ -78,8 +78,8 @@ describe('Config', () => { }); it('Validação do método toString', () => { const jsonConfig = { - csvSeparator: ',', separator: ':', + csvSeparator: ',', dependenciesConfig: [ { columnReference: 'Tipo de Compra', @@ -202,8 +202,8 @@ describe('Config', () => { }); it('Validação da geração das regras de validação', () => { const jsonConfig = { - csvSeparator: ',', separator: ':', + csvSeparator: ',', spaceSeparator: '+', dependenciesConfig: [ { @@ -257,8 +257,8 @@ describe('Config', () => { describe('Valida a criação do config para GA', () => { it('Validação do método toJson', () => { const jsonConfig = { - csvSeparator: ',', separator: ':', + csvSeparator: ',', dependenciesConfig: [ { columnReference: 'Tipo de Compra', @@ -306,8 +306,8 @@ describe('Config', () => { }); it('Validação do método toString', () => { const jsonConfig = { - csvSeparator: ',', separator: ':', + csvSeparator: ',', dependenciesConfig: [ { columnReference: 'Tipo de Compra', From 76838e2a9220f1ce200ac28b4139866672c64ec7 Mon Sep 17 00:00:00 2001 From: Lucas Tonetto Date: Tue, 15 Jun 2021 10:09:15 -0300 Subject: [PATCH 61/68] docs: :memo: Update version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a2f4bd7c..805f64ca 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "penguin-adinfo", - "private": "true", - "version": "1.0.0", + "private": "false", + "version": "1.1.0", "description": "O Ad Info Penguin é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital. ", "main": "index.js", "scripts": { From a1b6594508eb1a754026ad8b3d2224a5d26801fb Mon Sep 17 00:00:00 2001 From: LucasTonetto Date: Tue, 15 Jun 2021 13:10:14 +0000 Subject: [PATCH 62/68] style: :lipstick: Apply formatting changes --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 5bfdcd40..fd7a3ee6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "penguin-adinfo", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { From b692e93f14e6fe0ab9bc569c947c8e74a652c24c Mon Sep 17 00:00:00 2001 From: LucasTonetto Date: Tue, 15 Jun 2021 14:14:13 +0000 Subject: [PATCH 63/68] style: :lipstick: Apply formatting changes --- package-lock.json | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd7a3ee6..0763f390 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2804,22 +2804,6 @@ } } }, - "express-validator": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.11.1.tgz", - "integrity": "sha512-XAMdu1P6RESd8bvKtNdgNPsW+abkY6UQ2EVUqPpK6QVqieZKaLrN7W/zeFzDWZmgAy/RPEW8M4KYXMqQk6GmTA==", - "requires": { - "lodash": "^4.17.21", - "validator": "^13.5.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - } - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6461,11 +6445,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", From 36c069a1c522f536464a40e5a9f847506198a1b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jun 2021 14:15:44 +0000 Subject: [PATCH 64/68] build(deps): bump @google-cloud/firestore from 4.11.0 to 4.12.2 Bumps [@google-cloud/firestore](https://github.com/googleapis/nodejs-firestore) from 4.11.0 to 4.12.2. - [Release notes](https://github.com/googleapis/nodejs-firestore/releases) - [Changelog](https://github.com/googleapis/nodejs-firestore/blob/master/CHANGELOG.md) - [Commits](https://github.com/googleapis/nodejs-firestore/compare/v4.11.0...v4.12.2) --- updated-dependencies: - dependency-name: "@google-cloud/firestore" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 119 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 8 ++-- 2 files changed, 116 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..bd7b726b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "penguin-adinfo", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -540,14 +540,115 @@ } }, "@google-cloud/firestore": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.11.0.tgz", - "integrity": "sha512-Do9WJzEkFBBB+zVFvFfrrrIFEz086lrdgKQic7XsdoTgtYtq0yMu2u3kGLyxMbdasl2c2yf49FE4YvO3AYjQMQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.12.2.tgz", + "integrity": "sha512-5rurTAJXQ0SANEf8K9eA2JAB5zAh+pu4tGRnkZx5gBWQLZXdBFdtepS+irvKuSXw1KbeAQOuRANSc/nguys6SQ==", "requires": { "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^2.9.2", + "google-gax": "^2.12.0", "protobufjs": "^6.8.6" + }, + "dependencies": { + "@grpc/grpc-js": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.2.tgz", + "integrity": "sha512-UXepkOKCATJrhHGsxt+CGfpZy9zUn1q9mop5kfcXq1fBkTePxVNPOdnISlCbJFlCtld+pSLGyZCzr9/zVprFKA==", + "requires": { + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.2.tgz", + "integrity": "sha512-q2Qle60Ht2OQBCp9S5hv1JbI4uBBq6/mqSevFNK3ZEgRDBCAkWqZPUhD/K9gXOHrHKluliHiVq2L9sw1mVyAIg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "google-auth-library": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.1.2.tgz", + "integrity": "sha512-FMipHgfe2u1LzWsf2n9zEB9KsJ8M3n8OYTHbHtlkzPCyo7IknXQR5X99nfvwUHGuX+iEpihUZxDuPm7+qBYeXg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + }, + "google-gax": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.15.0.tgz", + "integrity": "sha512-jfShUgX1DVu+DiOeAcsT5JbWlLdUnb2FsdWRb+Q/pNz6kNAUbmq8sFLB2uaWjlTxoSGHZLfrt3vJ9lpArzzQPA==", + "requires": { + "@grpc/grpc-js": "~1.3.0", + "@grpc/proto-loader": "^0.6.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^7.0.2", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^2.1.1", + "protobufjs": "^6.10.2", + "retry-request": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" + } } }, "@google-cloud/logging": { @@ -2484,8 +2585,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -4760,6 +4860,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, "object-inspect": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", diff --git a/package.json b/package.json index 5a20e46b..54b9bba7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "penguin-adinfo", - "private": "true", - "version": "1.0.0", + "private": "false", + "version": "1.1.0", "description": "O Ad Info Penguin é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital. ", "main": "index.js", "scripts": { @@ -11,7 +11,7 @@ "lint": "eslint ./src --ext .ts", "lint-prettier": "npx prettier --check .", "lint-fix": "eslint ./src --ext .ts --fix", - "compile": "del /s /q dist && tsc", + "compile": "tsc", "auto-compile": "tsc -w", "format": "npx prettier --write .", "build": "npm run compile", @@ -52,7 +52,7 @@ }, "license": "ISC", "dependencies": { - "@google-cloud/firestore": "^4.11.0", + "@google-cloud/firestore": "^4.12.2", "@google-cloud/logging-bunyan": "^3.0.1", "@google-cloud/storage": "^5.1.1", "@types/bunyan": "^1.8.6", From 2cd3c0c20be195d06cd1660b81570185dcc7deab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jun 2021 14:16:26 +0000 Subject: [PATCH 65/68] build(deps): bump @google-cloud/logging-bunyan from 3.0.1 to 3.1.0 Bumps [@google-cloud/logging-bunyan](https://github.com/googleapis/nodejs-logging-bunyan) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/googleapis/nodejs-logging-bunyan/releases) - [Changelog](https://github.com/googleapis/nodejs-logging-bunyan/blob/master/CHANGELOG.md) - [Commits](https://github.com/googleapis/nodejs-logging-bunyan/compare/v3.0.1...v3.1.0) --- updated-dependencies: - dependency-name: "@google-cloud/logging-bunyan" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 287 ++++++++++++++++++++++------------------------ package.json | 8 +- 2 files changed, 138 insertions(+), 157 deletions(-) diff --git a/package-lock.json b/package-lock.json index 539bc26d..0bd12575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "penguin-adinfo", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -551,31 +551,56 @@ } }, "@google-cloud/logging": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-8.2.0.tgz", - "integrity": "sha512-DJNOexKr324dnXsl1z1u/T5MzF6qqmV4f9JQsvCgmMBvdLVqpd+Y+9G3s2I677q2EnHnv97Lja0sOn0oCUV7vQ==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-9.4.1.tgz", + "integrity": "sha512-CT9iV2ZIRfnmgjxIj4VOOwVrZnI+h0ovq7gyNieNlpXs7xDl1I18VBzN/lYbWb4oux6BcN84/UFbEuBA93U+vg==", "requires": { "@google-cloud/common": "^3.4.1", "@google-cloud/paginator": "^3.0.0", "@google-cloud/projectify": "^2.0.0", "@google-cloud/promisify": "^2.0.0", - "@opencensus/propagation-stackdriver": "0.0.22", "arrify": "^2.0.1", "dot-prop": "^6.0.0", "eventid": "^1.0.0", "extend": "^3.0.2", "gcp-metadata": "^4.0.0", - "google-auth-library": "^6.0.0", - "google-gax": "^2.9.2", - "is": "^3.3.0", + "google-auth-library": "^7.0.0", + "google-gax": "^2.12.0", "on-finished": "^2.3.0", "pumpify": "^2.0.1", - "snakecase-keys": "^3.1.2", - "stream-events": "^1.0.5", - "through2": "^4.0.0", - "type-fest": "^0.20.0" + "stream-events": "^1.0.5" }, "dependencies": { + "@grpc/grpc-js": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.2.tgz", + "integrity": "sha512-UXepkOKCATJrhHGsxt+CGfpZy9zUn1q9mop5kfcXq1fBkTePxVNPOdnISlCbJFlCtld+pSLGyZCzr9/zVprFKA==", + "requires": { + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.2.tgz", + "integrity": "sha512-q2Qle60Ht2OQBCp9S5hv1JbI4uBBq6/mqSevFNK3ZEgRDBCAkWqZPUhD/K9gXOHrHKluliHiVq2L9sw1mVyAIg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -584,20 +609,102 @@ "is-obj": "^2.0.0" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "google-auth-library": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.1.2.tgz", + "integrity": "sha512-FMipHgfe2u1LzWsf2n9zEB9KsJ8M3n8OYTHbHtlkzPCyo7IknXQR5X99nfvwUHGuX+iEpihUZxDuPm7+qBYeXg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + }, + "google-gax": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.15.0.tgz", + "integrity": "sha512-jfShUgX1DVu+DiOeAcsT5JbWlLdUnb2FsdWRb+Q/pNz6kNAUbmq8sFLB2uaWjlTxoSGHZLfrt3vJ9lpArzzQPA==", + "requires": { + "@grpc/grpc-js": "~1.3.0", + "@grpc/proto-loader": "^0.6.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^7.0.2", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^2.1.1", + "protobufjs": "^6.10.2", + "retry-request": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" } } }, "@google-cloud/logging-bunyan": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/logging-bunyan/-/logging-bunyan-3.0.1.tgz", - "integrity": "sha512-tp9ltnfl5bmgIjWhK2YLxNcMit6Q9vmtB17/11PWsMCDVZXsCdwTZ58HEysy+xeCjYcsHBmnTohr6Nl+A6puGA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-bunyan/-/logging-bunyan-3.1.0.tgz", + "integrity": "sha512-IQ5N5wFl9dlsPfW1WChZSb6bKPOw0keuMEOJsB4V3nPZL1JKfPM+DwXfpSmH7WBTekGG/K2cipBDyGxDLBBdyQ==", "requires": { - "@google-cloud/logging": "^8.0.0", - "google-auth-library": "^6.0.0" + "@google-cloud/logging": "^9.0.0", + "google-auth-library": "^7.0.0" + }, + "dependencies": { + "google-auth-library": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.1.2.tgz", + "integrity": "sha512-FMipHgfe2u1LzWsf2n9zEB9KsJ8M3n8OYTHbHtlkzPCyo7IknXQR5X99nfvwUHGuX+iEpihUZxDuPm7+qBYeXg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + } } }, "@google-cloud/paginator": { @@ -773,38 +880,6 @@ "fastq": "^1.6.0" } }, - "@opencensus/core": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.22.tgz", - "integrity": "sha512-ErazJtivjceNoOZI1bG9giQ6cWS45J4i6iPUtlp7dLNu58OLs/v+CD0FsaPCh47XgPxAI12vbBE8Ec09ViwHNA==", - "requires": { - "continuation-local-storage": "^3.2.1", - "log-driver": "^1.2.7", - "semver": "^7.0.0", - "shimmer": "^1.2.0", - "uuid": "^8.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@opencensus/propagation-stackdriver": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.0.22.tgz", - "integrity": "sha512-eBvf/ihb1mN8Yz/ASkz8nHzuMKqygu77+VNnUeR0yEh3Nj+ykB8VVR6lK+NAFXo1Rd1cOsTmgvuXAZgDAGleQQ==", - "requires": { - "@opencensus/core": "^0.0.22", - "hex2dec": "^1.0.1", - "uuid": "^8.0.0" - } - }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -1444,22 +1519,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", - "requires": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2092,15 +2151,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } - }, "convert-csv-to-json": { "version": "0.0.15", "resolved": "https://registry.npmjs.org/convert-csv-to-json/-/convert-csv-to-json-0.0.15.tgz", @@ -2426,14 +2476,6 @@ "integrity": "sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg==", "dev": true }, - "emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "requires": { - "shimmer": "^1.2.0" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2484,8 +2526,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -3346,11 +3387,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hex2dec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz", - "integrity": "sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA==" - }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -3488,11 +3524,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" - }, "is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -3943,11 +3974,6 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" - }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -4760,6 +4786,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, "object-inspect": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", @@ -5598,11 +5629,6 @@ "vscode-textmate": "^5.2.0" } }, - "shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5678,22 +5704,6 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, - "snakecase-keys": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-3.2.1.tgz", - "integrity": "sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==", - "requires": { - "map-obj": "^4.1.0", - "to-snake-case": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==" - } - } - }, "snakeize": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", @@ -6018,25 +6028,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-no-case": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -6052,22 +6049,6 @@ "is-number": "^7.0.0" } }, - "to-snake-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-snake-case/-/to-snake-case-1.0.0.tgz", - "integrity": "sha1-znRpE4l5RgGah+Yu366upMYIq4w=", - "requires": { - "to-space-case": "^1.0.0" - } - }, - "to-space-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", - "requires": { - "to-no-case": "^1.0.0" - } - }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", diff --git a/package.json b/package.json index 5a20e46b..c088eaf8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "penguin-adinfo", - "private": "true", - "version": "1.0.0", + "private": "false", + "version": "1.1.0", "description": "O Ad Info Penguin é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital. ", "main": "index.js", "scripts": { @@ -11,7 +11,7 @@ "lint": "eslint ./src --ext .ts", "lint-prettier": "npx prettier --check .", "lint-fix": "eslint ./src --ext .ts --fix", - "compile": "del /s /q dist && tsc", + "compile": "tsc", "auto-compile": "tsc -w", "format": "npx prettier --write .", "build": "npm run compile", @@ -53,7 +53,7 @@ "license": "ISC", "dependencies": { "@google-cloud/firestore": "^4.11.0", - "@google-cloud/logging-bunyan": "^3.0.1", + "@google-cloud/logging-bunyan": "^3.1.0", "@google-cloud/storage": "^5.1.1", "@types/bunyan": "^1.8.6", "app": "^0.1.0", From a5cb3c3e85b3e70d9a446768a7368964fbc9f8dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jun 2021 14:17:19 +0000 Subject: [PATCH 66/68] build(deps-dev): bump nodemon from 2.0.6 to 2.0.7 Bumps [nodemon](https://github.com/remy/nodemon) from 2.0.6 to 2.0.7. - [Release notes](https://github.com/remy/nodemon/releases) - [Commits](https://github.com/remy/nodemon/compare/v2.0.6...v2.0.7) Signed-off-by: dependabot[bot] --- package-lock.json | 79 ++++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc7daaff..98973b72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1944,19 +1944,40 @@ "dev": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + } } }, "ci-info": { @@ -3085,9 +3106,9 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -3220,12 +3241,12 @@ } }, "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", "dev": true, "requires": { - "ini": "^1.3.5" + "ini": "1.3.7" } }, "globals": { @@ -3539,9 +3560,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true }, "interpret": { @@ -3676,9 +3697,9 @@ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-obj": { @@ -4675,9 +4696,9 @@ "dev": true }, "nodemon": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", - "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", + "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", "dev": true, "requires": { "chokidar": "^3.2.2", @@ -4693,9 +4714,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -5342,9 +5363,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" diff --git a/package.json b/package.json index 00ef4240..0faf5ac8 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-tsdoc": "^0.2.14", "mocha": "^9.0.0", - "nodemon": "^2.0.4", + "nodemon": "^2.0.7", "nyc": "^15.1.0", "prettier": "^2.1.2", "supertest": "^6.1.3", From b6b65faf4be9ad44906b5c4a15149bdd51d4a90a Mon Sep 17 00:00:00 2001 From: LucasTonetto Date: Tue, 15 Jun 2021 14:21:14 +0000 Subject: [PATCH 67/68] style: :lipstick: Apply formatting changes --- package-lock.json | 80 +++++++++++++---------------------------------- 1 file changed, 22 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29a578b6..a00ba7cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -864,40 +864,6 @@ } } }, - "@grpc/grpc-js": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz", - "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==", - "requires": { - "@grpc/proto-loader": "^0.6.0-pre14", - "@types/node": "^12.12.47", - "google-auth-library": "^6.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "@grpc/proto-loader": { - "version": "0.6.0-pre9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz", - "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.9.0", - "yargs": "^15.3.1" - } - } - } - }, - "@grpc/proto-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", - "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", - "requires": { - "lodash.camelcase": "^4.3.0", - "protobufjs": "^6.8.6" - } - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2039,7 +2005,8 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "camelcase-keys": { "version": "2.1.0", @@ -2165,6 +2132,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2470,7 +2438,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decompress-response": { "version": "3.3.0", @@ -3167,6 +3136,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3439,23 +3409,6 @@ "lru-cache": "^6.0.0" } }, - "google-gax": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.2.tgz", - "integrity": "sha512-Pve4osEzNKpBZqFXMfGKBbKCtgnHpUe5IQMh5Ou+Xtg8nLcba94L3gF0xgM5phMdGRRqJn0SMjcuEVmOYu7EBg==", - "requires": { - "@grpc/grpc-js": "~1.1.1", - "@grpc/proto-loader": "^0.5.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^6.1.3", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "protobufjs": "^6.9.0", - "retry-request": "^4.0.0" - } - }, "google-p12-pem": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", @@ -4157,6 +4110,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -5065,6 +5019,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -5073,6 +5028,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -5154,7 +5110,8 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -5578,7 +5535,8 @@ "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "require_optional": { "version": "1.0.1", @@ -5764,7 +5722,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "setprototypeof": { "version": "1.1.1", @@ -6666,7 +6625,8 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "wide-align": { "version": "1.1.3", @@ -6740,6 +6700,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6784,7 +6745,8 @@ "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "yallist": { "version": "4.0.0", @@ -6795,6 +6757,7 @@ "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -6813,6 +6776,7 @@ "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" From 84f7efc0701edf09ba97841d015a5f23bf517611 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jun 2021 14:22:09 +0000 Subject: [PATCH 68/68] build(deps-dev): bump @typescript-eslint/eslint-plugin Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.6.1 to 4.27.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.27.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 56 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index d749d7ac..277f2426 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1142,13 +1142,13 @@ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, "@typescript-eslint/eslint-plugin": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz", - "integrity": "sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", + "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.26.1", - "@typescript-eslint/scope-manager": "4.26.1", + "@typescript-eslint/experimental-utils": "4.27.0", + "@typescript-eslint/scope-manager": "4.27.0", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "lodash": "^4.17.21", @@ -1187,15 +1187,15 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz", - "integrity": "sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", + "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.26.1", - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/typescript-estree": "4.26.1", + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1276,29 +1276,29 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz", - "integrity": "sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", + "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/visitor-keys": "4.26.1" + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0" } }, "@typescript-eslint/types": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.26.1.tgz", - "integrity": "sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz", - "integrity": "sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", "dev": true, "requires": { - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/visitor-keys": "4.26.1", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -1350,12 +1350,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz", - "integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", + "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/types": "4.27.0", "eslint-visitor-keys": "^2.0.0" } }, diff --git a/package.json b/package.json index 7b57d6c8..21736a0b 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@types/express": "^4.17.11", "@types/express-fileupload": "^1.1.6", "@types/mocha": "^8.2.2", - "@typescript-eslint/eslint-plugin": "^4.26.1", + "@typescript-eslint/eslint-plugin": "^4.27.0", "@typescript-eslint/parser": "^4.22.1", "chai": "^4.2.0", "eslint": "^7.12.1",