From b0103b0d496262c438b40bc20304081dbfe41e73 Mon Sep 17 00:00:00 2001 From: Justin Wind Date: Mon, 26 Dec 2022 15:17:45 -0800 Subject: [PATCH] initial commit --- .eslintrc.json | 89 + .gitignore | 7 + .nycrc.json | 6 + CHANGELOG.md | 14 + README.md | 76 + bin/addProfile.js | 38 + bin/addProfileScope.js | 32 + bin/addScope.js | 32 + bin/authUserAdd.js | 70 + bin/cli-helper.js | 38 + bin/dumpProfiles.js | 32 + ...generate-engine-entity-relation-diagram.sh | 18 + bin/resourceCreate.js | 46 + config/default.js | 99 + config/development.js | 36 + config/index.js | 24 + config/test.js | 16 + documentation/media/consent-page.png | Bin 0 -> 449120 bytes documentation/media/postgres-er.svg | 184 + documentation/media/sqlite-er.svg | 183 + documentation/media/ticket-page.png | Bin 0 -> 230324 bytes package-lock.json | 9787 +++++++++++++++++ package.json | 64 + server.js | 39 + src/chores.js | 70 + src/common.js | 167 + src/db/abstract.js | 563 + src/db/errors.js | 56 + src/db/index.js | 42 + src/db/postgres/index.js | 638 ++ src/db/postgres/sql/almanac-get-all.sql | 3 + src/db/postgres/sql/almanac-get.sql | 6 + src/db/postgres/sql/almanac-upsert.sql | 9 + src/db/postgres/sql/authentication-get.sql | 4 + .../postgres/sql/authentication-success.sql | 4 + src/db/postgres/sql/authentication-upsert.sql | 9 + src/db/postgres/sql/profile-get.sql | 3 + .../sql/profile-identifier-insert.sql | 4 + src/db/postgres/sql/profile-scope-insert.sql | 5 + src/db/postgres/sql/profile-scopes-clear.sql | 6 + .../postgres/sql/profile-scopes-set-all.sql | 5 + .../sql/profiles-scopes-by-identifier.sql | 10 + src/db/postgres/sql/redeem-code.sql | 30 + src/db/postgres/sql/refresh-code.sql | 19 + src/db/postgres/sql/resource-get.sql | 4 + src/db/postgres/sql/resource-upsert.sql | 10 + src/db/postgres/sql/schema/1.0.0/apply.sql | 147 + src/db/postgres/sql/schema/1.0.0/er.dot | 105 + src/db/postgres/sql/schema/1.0.0/revert.sql | 9 + src/db/postgres/sql/schema/init.sql | 15 + src/db/postgres/sql/scope-cleanup.sql | 8 + src/db/postgres/sql/scope-delete.sql | 3 + src/db/postgres/sql/scope-in-use.sql | 13 + src/db/postgres/sql/scope-upsert.sql | 14 + src/db/postgres/sql/scopes-insert.sql | 6 + src/db/postgres/sql/token-cleanup.sql | 26 + src/db/postgres/sql/token-get-by-code-id.sql | 24 + .../sql/token-refresh-revoke-by-code-id.sql | 5 + .../postgres/sql/token-revoke-by-code-id.sql | 5 + src/db/postgres/sql/token-scopes-remove.sql | 7 + src/db/postgres/sql/token-scopes-set.sql | 4 + .../postgres/sql/tokens-get-by-identifier.sql | 26 + src/db/schema-version-helper.js | 131 + src/db/sqlite/index.js | 739 ++ src/db/sqlite/sql/almanac-get-all.sql | 2 + src/db/sqlite/sql/almanac-get.sql | 2 + src/db/sqlite/sql/almanac-upsert.sql | 9 + src/db/sqlite/sql/authentication-get.sql | 8 + src/db/sqlite/sql/authentication-success.sql | 4 + src/db/sqlite/sql/authentication-upsert.sql | 9 + src/db/sqlite/sql/profile-get.sql | 3 + .../sqlite/sql/profile-identifier-insert.sql | 4 + src/db/sqlite/sql/profile-scope-insert.sql | 5 + src/db/sqlite/sql/profile-scopes-clear.sql | 5 + .../sql/profiles-scopes-by-identifier.sql | 10 + src/db/sqlite/sql/redeem-code.sql | 27 + src/db/sqlite/sql/refresh-code.sql | 15 + src/db/sqlite/sql/resource-get.sql | 4 + src/db/sqlite/sql/resource-upsert.sql | 9 + src/db/sqlite/sql/schema/1.0.0/apply.sql | 97 + src/db/sqlite/sql/schema/1.0.0/er.dot | 106 + src/db/sqlite/sql/schema/1.0.0/revert.sql | 7 + src/db/sqlite/sql/schema/init.sql | 11 + src/db/sqlite/sql/scope-cleanup.sql | 8 + src/db/sqlite/sql/scope-delete.sql | 3 + src/db/sqlite/sql/scope-in-use.sql | 13 + src/db/sqlite/sql/scope-insert.sql | 5 + src/db/sqlite/sql/scope-upsert.sql | 16 + src/db/sqlite/sql/token-cleanup.sql | 32 + src/db/sqlite/sql/token-get-by-code-id.sql | 20 + .../sql/token-refresh-revoke-by-code-id.sql | 5 + src/db/sqlite/sql/token-revoke-by-code-id.sql | 5 + src/db/sqlite/sql/token-scope-remove.sql | 3 + src/db/sqlite/sql/token-scope-set.sql | 3 + .../sql/token-scopes-get-by-code-id.sql | 4 + .../sqlite/sql/tokens-get-by-identifier.sql | 21 + src/enum.js | 27 + src/errors.js | 21 + src/logger/data-sanitizers.js | 116 + src/logger/index.js | 13 + src/manager.js | 2015 ++++ src/service.js | 544 + src/template/admin-html.js | 214 + src/template/admin-maintenance-html.js | 86 + src/template/admin-ticket-html.js | 98 + src/template/authorization-error-html.js | 26 + src/template/authorization-request-html.js | 376 + src/template/index.js | 10 + src/template/root-html.js | 63 + src/template/template-helper.js | 53 + static/.external-link.svg.meta | 2 + static/.favicon.ico.meta | 3 + static/.logo.svg.meta | 3 + static/Makefile | 14 + static/custom.css | 6 + static/external-link.svg | 15 + static/favicon.ico | Bin 0 -> 105637 bytes static/index.html | 16 + static/logo.svg | 1 + static/robots.txt | 2 + static/theme.css | 175 + test/config.js | 23 + test/src/chores.js | 140 + test/src/common.js | 181 + test/src/db/abstract.js | 295 + test/src/db/factory.js | 49 + test/src/db/integration.js | 503 + test/src/db/postgres.js | 953 ++ test/src/db/schema-version-helper.js | 159 + test/src/db/sqlite.js | 918 ++ test/src/errors.js | 15 + test/src/logger.js | 136 + test/src/manager.js | 2323 ++++ test/src/service.js | 278 + test/src/template/admin-html.js | 112 + test/src/template/admin-maintenance-html.js | 47 + test/src/template/admin-ticket-html.js | 87 + test/src/template/authorization-error-html.js | 38 + .../template/authorization-request-html.js | 144 + test/src/template/root-html.js | 35 + test/src/template/template-helper.js | 95 + test/stub-db.js | 35 + test/stub-logger.js | 10 + 143 files changed, 24834 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .nycrc.json create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 bin/addProfile.js create mode 100644 bin/addProfileScope.js create mode 100644 bin/addScope.js create mode 100644 bin/authUserAdd.js create mode 100644 bin/cli-helper.js create mode 100644 bin/dumpProfiles.js create mode 100755 bin/generate-engine-entity-relation-diagram.sh create mode 100644 bin/resourceCreate.js create mode 100644 config/default.js create mode 100644 config/development.js create mode 100644 config/index.js create mode 100644 config/test.js create mode 100644 documentation/media/consent-page.png create mode 100644 documentation/media/postgres-er.svg create mode 100644 documentation/media/sqlite-er.svg create mode 100644 documentation/media/ticket-page.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server.js create mode 100644 src/chores.js create mode 100644 src/common.js create mode 100644 src/db/abstract.js create mode 100644 src/db/errors.js create mode 100644 src/db/index.js create mode 100644 src/db/postgres/index.js create mode 100644 src/db/postgres/sql/almanac-get-all.sql create mode 100644 src/db/postgres/sql/almanac-get.sql create mode 100644 src/db/postgres/sql/almanac-upsert.sql create mode 100644 src/db/postgres/sql/authentication-get.sql create mode 100644 src/db/postgres/sql/authentication-success.sql create mode 100644 src/db/postgres/sql/authentication-upsert.sql create mode 100644 src/db/postgres/sql/profile-get.sql create mode 100644 src/db/postgres/sql/profile-identifier-insert.sql create mode 100644 src/db/postgres/sql/profile-scope-insert.sql create mode 100644 src/db/postgres/sql/profile-scopes-clear.sql create mode 100644 src/db/postgres/sql/profile-scopes-set-all.sql create mode 100644 src/db/postgres/sql/profiles-scopes-by-identifier.sql create mode 100644 src/db/postgres/sql/redeem-code.sql create mode 100644 src/db/postgres/sql/refresh-code.sql create mode 100644 src/db/postgres/sql/resource-get.sql create mode 100644 src/db/postgres/sql/resource-upsert.sql create mode 100644 src/db/postgres/sql/schema/1.0.0/apply.sql create mode 100644 src/db/postgres/sql/schema/1.0.0/er.dot create mode 100644 src/db/postgres/sql/schema/1.0.0/revert.sql create mode 100644 src/db/postgres/sql/schema/init.sql create mode 100644 src/db/postgres/sql/scope-cleanup.sql create mode 100644 src/db/postgres/sql/scope-delete.sql create mode 100644 src/db/postgres/sql/scope-in-use.sql create mode 100644 src/db/postgres/sql/scope-upsert.sql create mode 100644 src/db/postgres/sql/scopes-insert.sql create mode 100644 src/db/postgres/sql/token-cleanup.sql create mode 100644 src/db/postgres/sql/token-get-by-code-id.sql create mode 100644 src/db/postgres/sql/token-refresh-revoke-by-code-id.sql create mode 100644 src/db/postgres/sql/token-revoke-by-code-id.sql create mode 100644 src/db/postgres/sql/token-scopes-remove.sql create mode 100644 src/db/postgres/sql/token-scopes-set.sql create mode 100644 src/db/postgres/sql/tokens-get-by-identifier.sql create mode 100644 src/db/schema-version-helper.js create mode 100644 src/db/sqlite/index.js create mode 100644 src/db/sqlite/sql/almanac-get-all.sql create mode 100644 src/db/sqlite/sql/almanac-get.sql create mode 100644 src/db/sqlite/sql/almanac-upsert.sql create mode 100644 src/db/sqlite/sql/authentication-get.sql create mode 100644 src/db/sqlite/sql/authentication-success.sql create mode 100644 src/db/sqlite/sql/authentication-upsert.sql create mode 100644 src/db/sqlite/sql/profile-get.sql create mode 100644 src/db/sqlite/sql/profile-identifier-insert.sql create mode 100644 src/db/sqlite/sql/profile-scope-insert.sql create mode 100644 src/db/sqlite/sql/profile-scopes-clear.sql create mode 100644 src/db/sqlite/sql/profiles-scopes-by-identifier.sql create mode 100644 src/db/sqlite/sql/redeem-code.sql create mode 100644 src/db/sqlite/sql/refresh-code.sql create mode 100644 src/db/sqlite/sql/resource-get.sql create mode 100644 src/db/sqlite/sql/resource-upsert.sql create mode 100644 src/db/sqlite/sql/schema/1.0.0/apply.sql create mode 100644 src/db/sqlite/sql/schema/1.0.0/er.dot create mode 100644 src/db/sqlite/sql/schema/1.0.0/revert.sql create mode 100644 src/db/sqlite/sql/schema/init.sql create mode 100644 src/db/sqlite/sql/scope-cleanup.sql create mode 100644 src/db/sqlite/sql/scope-delete.sql create mode 100644 src/db/sqlite/sql/scope-in-use.sql create mode 100644 src/db/sqlite/sql/scope-insert.sql create mode 100644 src/db/sqlite/sql/scope-upsert.sql create mode 100644 src/db/sqlite/sql/token-cleanup.sql create mode 100644 src/db/sqlite/sql/token-get-by-code-id.sql create mode 100644 src/db/sqlite/sql/token-refresh-revoke-by-code-id.sql create mode 100644 src/db/sqlite/sql/token-revoke-by-code-id.sql create mode 100644 src/db/sqlite/sql/token-scope-remove.sql create mode 100644 src/db/sqlite/sql/token-scope-set.sql create mode 100644 src/db/sqlite/sql/token-scopes-get-by-code-id.sql create mode 100644 src/db/sqlite/sql/tokens-get-by-identifier.sql create mode 100644 src/enum.js create mode 100644 src/errors.js create mode 100644 src/logger/data-sanitizers.js create mode 100644 src/logger/index.js create mode 100644 src/manager.js create mode 100644 src/service.js create mode 100644 src/template/admin-html.js create mode 100644 src/template/admin-maintenance-html.js create mode 100644 src/template/admin-ticket-html.js create mode 100644 src/template/authorization-error-html.js create mode 100644 src/template/authorization-request-html.js create mode 100644 src/template/index.js create mode 100644 src/template/root-html.js create mode 100644 src/template/template-helper.js create mode 100644 static/.external-link.svg.meta create mode 100644 static/.favicon.ico.meta create mode 100644 static/.logo.svg.meta create mode 100644 static/Makefile create mode 100644 static/custom.css create mode 100644 static/external-link.svg create mode 100644 static/favicon.ico create mode 100644 static/index.html create mode 100644 static/logo.svg create mode 100644 static/robots.txt create mode 100644 static/theme.css create mode 100644 test/config.js create mode 100644 test/src/chores.js create mode 100644 test/src/common.js create mode 100644 test/src/db/abstract.js create mode 100644 test/src/db/factory.js create mode 100644 test/src/db/integration.js create mode 100644 test/src/db/postgres.js create mode 100644 test/src/db/schema-version-helper.js create mode 100644 test/src/db/sqlite.js create mode 100644 test/src/errors.js create mode 100644 test/src/logger.js create mode 100644 test/src/manager.js create mode 100644 test/src/service.js create mode 100644 test/src/template/admin-html.js create mode 100644 test/src/template/admin-maintenance-html.js create mode 100644 test/src/template/admin-ticket-html.js create mode 100644 test/src/template/authorization-error-html.js create mode 100644 test/src/template/authorization-request-html.js create mode 100644 test/src/template/root-html.js create mode 100644 test/src/template/template-helper.js create mode 100644 test/stub-db.js create mode 100644 test/stub-logger.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..b3ffbe2 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,89 @@ +{ + "env": { + "browser": false, + "es6": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:node/recommended", + "plugin:security/recommended", + "plugin:sonarjs/recommended" + ], + "parserOptions": { + "ecmaVersion": "latest" + }, + "plugins": [ + "node", + "security", + "sonarjs" + ], + "rules": { + "array-element-newline": [ + "error", + "consistent" + ], + "arrow-parens": [ + "error", + "always" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": "error", + "callback-return": "error", + "camelcase": "error", + "class-methods-use-this": "error", + "comma-dangle": [ + "error", + "always-multiline" + ], + "comma-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "comma-style": [ + "error", + "last" + ], + "indent": [ + "warn", + 2, + { + "SwitchCase": 1 + } + ], + "sonarjs/cognitive-complexity": "warn", + "sonarjs/no-duplicate-string": "warn", + "keyword-spacing": "error", + "linebreak-style": [ + "error", + "unix" + ], + "no-unused-vars": [ + "error", { + "varsIgnorePattern": "^_" + } + ], + "object-curly-spacing": [ + "error", + "always" + ], + "prefer-const": "error", + "quotes": [ + "error", + "single" + ], + "strict": "error", + "vars-on-top": "error" + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..88f74fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +.nyc_output +coverage +.vscode +*.sqlite* +static/*.gz +static/*.br diff --git a/.nycrc.json b/.nycrc.json new file mode 100644 index 0000000..497d8af --- /dev/null +++ b/.nycrc.json @@ -0,0 +1,6 @@ +{ + "reporter": [ + "lcov", + "text" + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..80cf52d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +Releases and notable changes to this project are documented here. + +## [v1.0.0] - TBD + +### Added + +- Everything. MVP first stable release. + +--- + +[Unreleased]: https://git.squeep.com/?p=squeep-indie-auther;a=commitdiff;h=HEAD;hp=v1.0.0 +[v1.0.0]: https://git.squeep.com/?p=squeep-indie-auther;a=commitdiff;h=v1.0.0;hp=v0.0.0 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e37aea1 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# Welcome to my IndieAuth-er + +## What + +[IndieAuth](https://indieweb.org/IndieAuth) is a [protocol](https://indieauth.spec.indieweb.org/) which facilitates identifying users uniquely by the URLs they control to third-party applications. It is an extension of [Oauth 2](https://indieauth.spec.indieweb.org). + +This service implements the functionality required to negotiate that identity authentication and validation. + +## Let's Do Some Auth + +A ```user``` is an entity known to this service, with a credential (currently a password) used to authenticate and login to this service. +Authentication of a ```user``` is handled by either a [hashed password](https://en.wikipedia.org/wiki/Argon2) stored securely in one of the available database engines, or by optionally delegating to the host machine's [PAM subsystem](https://en.wikipedia.org/wiki/Pluggable_Authentication_Modules). +PAM can be used to leverage, exempli gratia, LDAP integration for user authentication. + +A ```profile``` is a URL (under control of a ```user```) which contents includes the necessary meta-data informing an application to contact this server for identification validation. Each ```user``` may have one or more ```profile```s. + +Each ```profile``` may also be associated with a customizable list of additional [scopes](https://www.oauth.com/oauth2-servers/scope/) which may be added to any application client grant for convenience. + +An example of the user-interface when granting consent to a client application: +![Consent page](./documentation/media/consent-page.png) + +A rudimentary ticket-sending UI is also available: +![Ticket Offer page](./documentation/media/ticket-page.png) + +## Resource Service Integration + +Other services (resources) may make calls to validate token grants by configuring a pre-shared secret, and authenticating to this server using [an HMAC-style bearer token scheme](https://git.squeep.com/?p=squeep-resource-authentication-module;a=blob_plain;f=README.md;hb=HEAD). + +## Ticket Auth + +This service can accept proffered [authentication tickets](https://indieweb.org/IndieAuth_Ticket_Auth). It will simply publish any proffered tickets for valid profiles to a configured AMQP/RabbitMQ queue for some other service to redeem and make use of. + +## Architecture + +A granted token is an encrypted identifier (specifically a UUID assigned to the initial authentication request) which references the user/client relationship stored in the database. Details such as granted scopes, token expiration, refreshability, and revocation status are stored there. + +Uh, more later. + +![Entity relationship diagram for Postgres engine](./documentation/media/postgres-er.svg) + +### Quirks + +This implementation is built atop an in-house API framework, for Reasons. Limiting the footprint of external dependencies as much as is reasonable is a design goal. + +### File Tour + +- bin/ - utility scripts +- config/ + - default.js - defines all configuration parameters' default values + - index.js - merges an environment's values over defaults + - *.js - environment specific values, edit these as needed +- server.js - launches the application server +- src/ + - chores.js - recurring maintenance tasks + - common.js - utility functions + - db/ + - abstract.js - base database class that any engine will implement + - errors.js - database Error types + - index.js - database factory + - schema-version-helper.js - schema migrations aide + - postgres/ + - index.js - PostgreSQL engine implementation + - sql/ - statements and schemas + - sqlite/ + - index.js - SQLite engine implementation + - sql - statements and schemas + - enum.js - invariants + - errors.js - local Error types + - logger/ + - data-sanitizers.js - logger helpers to scrub sensitive and verbose data + - index.js - a very simple logging class + - manager.js - process incoming requests, most of application logic resides here + - service.js - defines incoming endpoints, linking the API server framework to the manager methods + - template/ - HTML content +- static/ - static web assets, CSS, images, et cetera +- test/ - unit and coverage tests diff --git a/bin/addProfile.js b/bin/addProfile.js new file mode 100644 index 0000000..6a47b3c --- /dev/null +++ b/bin/addProfile.js @@ -0,0 +1,38 @@ +'use strict'; + +const DB = require('../src/db'); +const Logger = require('../src/logger'); +const Config = require('../config'); +const config = new Config(process.env.NODE_ENV); + +const logger = new Logger(config); +const db = new DB(logger, config); + + +const identifier = process.argv[2]; +const profile = process.argv[3]; + +if (!identifier) { + console.log('missing user'); + throw new Error('missing argument'); +} +if (!profile) { + console.log('missing profile'); + throw new Error('missing argument'); +} + +(async () => { + await db.initialize(); + await db.context(async (dbCtx) => { + const user = await db.authenticationGet(dbCtx, identifier); + if (!user) { + console.log('user does not exist'); + throw new Error('invalid identifier'); + } + const profileURL = new URL(profile); // Validate and normalize + const result = await db.profileIdentifierInsert(dbCtx, profileURL.href, identifier); + console.log(result); + }); + console.log('done'); + await db._closeConnection(); +})(); diff --git a/bin/addProfileScope.js b/bin/addProfileScope.js new file mode 100644 index 0000000..dfeaca0 --- /dev/null +++ b/bin/addProfileScope.js @@ -0,0 +1,32 @@ +'use strict'; + +const DB = require('../src/db'); +const Logger = require('../src/logger'); +const Config = require('../config'); +const config = new Config(process.env.NODE_ENV); + +const logger = new Logger(config); +const db = new DB(logger, config); + + +const profile = process.argv[2]; +const scope = process.argv[3]; + +if (!scope) { + console.log('missing scope'); + throw new Error('missing argument'); +} +if (!profile) { + console.log('missing profile'); + throw new Error('missing argument'); +} + +(async () => { + await db.initialize(); + await db.context(async (dbCtx) => { + const result = await db.profileScopeInsert(dbCtx, profile, scope); + console.log(result); + }); + console.log('done'); + await db._closeConnection(); +})(); diff --git a/bin/addScope.js b/bin/addScope.js new file mode 100644 index 0000000..809ee5f --- /dev/null +++ b/bin/addScope.js @@ -0,0 +1,32 @@ +'use strict'; + +const DB = require('../src/db'); +const Logger = require('../src/logger'); +const Config = require('../config'); +const config = new Config(process.env.NODE_ENV); + +const logger = new Logger(config); +const db = new DB(logger, config); + + +const scope = process.argv[2]; +const description = process.argv[3]; + +if (!scope) { + console.log('missing scope'); + throw new Error('missing argument'); +} +if (!description) { + console.log('missing description'); + throw new Error('missing argument'); +} + +(async () => { + await db.initialize(); + await db.context(async (dbCtx) => { + const result = await db.scopeUpsert(dbCtx, scope, description); + console.log(result); + }); + console.log('done'); + await db._closeConnection(); +})(); diff --git a/bin/authUserAdd.js b/bin/authUserAdd.js new file mode 100644 index 0000000..cc71552 --- /dev/null +++ b/bin/authUserAdd.js @@ -0,0 +1,70 @@ +'use strict'; + +const argon2 = require('argon2'); +const readline = require('readline'); +const stream = require('stream'); +const DB = require('../src/db'); +const Logger = require('../src/logger'); +const Config = require('../config'); +const config = new Config(process.env.NODE_ENV); + +const logger = new Logger(config); +const db = new DB(logger, config); + +const flags = { + isPAM: false, +}; +if (process.argv.includes('-P')) { + flags.isPAM = true; + process.argv.splice(process.argv.indexOf('-P'), 1); +} + +const identifier = process.argv[2]; + +if (!identifier) { + console.log('missing user to add'); + throw new Error('missing argument'); +} + +async function readPassword(prompt) { + const input = process.stdin; + const output = new stream.Writable({ + write: function (chunk, encoding, callback) { + if (!this.muted) { + process.stdout.write(chunk, encoding); + } + callback(); + }, + }); + const rl = readline.createInterface({ input, output, terminal: !!process.stdin.isTTY }); + rl.setPrompt(prompt); + rl.prompt(); + output.muted = true; + + return new Promise((resolve) => { + rl.question('', (answer) => { + output.muted = false; + rl.close(); + output.write('\n'); + resolve(answer); + }); + }); +} + +(async () => { + await db.initialize(); + let credential; + if (flags.isPAM) { + credential = '$PAM$'; + } else { + const password = await readPassword('password: '); + credential = await argon2.hash(password, { type: argon2.argon2id }); + } + console.log(`\t${identifier}:${credential}`); + await db.context(async (dbCtx) => { + const result = await db.authenticationUpsert(dbCtx, identifier, credential); + console.log(result); + }); + console.log('done'); + await db._closeConnection(); +})(); diff --git a/bin/cli-helper.js b/bin/cli-helper.js new file mode 100644 index 0000000..5f1a1a3 --- /dev/null +++ b/bin/cli-helper.js @@ -0,0 +1,38 @@ +'use strict'; + + +/** + * + * @param {String} option + * @returns {*} + */ +function getOption(option) { + let value; + while (process.argv.includes(option)) { + const optionIndex = process.argv.indexOf(option); + value = process.argv.splice(optionIndex, 2)[1]; + } + return value; +} + + +/** + * + * @param {String} flag + * @returns {Number} + */ +function getFlag(flag) { + let value = 0; + while (process.argv.includes(flag)) { + const flagIndex = process.argv.indexOf(flag); + process.argv.splice(flagIndex, 1); + value += 1; + } + return value; +} + + +module.exports = { + getFlag, + getOption, +}; \ No newline at end of file diff --git a/bin/dumpProfiles.js b/bin/dumpProfiles.js new file mode 100644 index 0000000..5b249fd --- /dev/null +++ b/bin/dumpProfiles.js @@ -0,0 +1,32 @@ +'use strict'; + +const DB = require('../src/db'); +const Logger = require('../src/logger'); +const Config = require('../config'); +const config = new Config(process.env.NODE_ENV); + +const logger = new Logger(config); +const db = new DB(logger, config); + + +const identifier = process.argv[2]; + +if (!identifier) { + console.log('missing user'); + throw new Error('missing argument'); +} + +(async () => { + await db.initialize(); + await db.context(async (dbCtx) => { + const user = await db.authenticationGet(dbCtx, identifier); + + const profiles = await db.profilesByIdentifier(dbCtx, identifier); + console.log(profiles); + if (!user) { + console.log('(user does not exist)'); + } + }); // dbCtx + console.log('done'); + await db._closeConnection(); +})(); diff --git a/bin/generate-engine-entity-relation-diagram.sh b/bin/generate-engine-entity-relation-diagram.sh new file mode 100755 index 0000000..cd54251 --- /dev/null +++ b/bin/generate-engine-entity-relation-diagram.sh @@ -0,0 +1,18 @@ +#!/bin/bash +if [[ $# -ne 2 ]] +then + echo "Usage: $(basename "$0") engine schema-version" + exit 64 # EX_USAGE +fi +engine="$1" +schema="$2" +base="$(dirname "$0")/.." +pwd="$(pwd)" +src=$(realpath --relative-to "${pwd}" "${base}/src/db/${engine}/sql/schema/${schema}/er.dot") +dst=$(realpath --relative-to "${pwd}" "${base}/documentation/media/${engine}-er.svg") +if [[ ! -e "${src}" ]] +then + echo "Missing: ${src}" 1>&2 + exit 65 # EX_DATAERR +fi +dot -Tsvg -o"${dst}" "${src}" diff --git a/bin/resourceCreate.js b/bin/resourceCreate.js new file mode 100644 index 0000000..ae7390a --- /dev/null +++ b/bin/resourceCreate.js @@ -0,0 +1,46 @@ +'use strict'; + +const cli = require('./cli-helper'); +const DB = require('../src/db'); +const Logger = require('../src/logger'); +const Config = require('../config'); +const { newSecret } = require('../src/common'); +const config = new Config(process.env.NODE_ENV, false); +const verbose = cli.getFlag('-v'); +if (!verbose) { + config.logger.ignoreBelowLevel = 'info'; +} +const logger = new Logger(config); +const db = new DB(logger, config); + + +const resourceId = cli.getOption('-i'); +let secret = cli.getOption('-s'); +const rest = process.argv.slice(2); +const description = rest.length ? rest.join(' ') : undefined; + +(async () => { + await db.initialize(); + try { + if (!resourceId) { + if (!description || !description.length) { + console.log('ERROR: description is required when creating a new resource.'); + throw new Error('Invalid parameters'); + } + if (!secret) { + secret = await newSecret(); + } + } + + await db.context(async (dbCtx) => { + const result = await db.resourceUpsert(dbCtx, resourceId, secret, description); + console.log(result); + }); + } catch (e) { + console.log(e); + } finally { + await db._closeConnection(); + } +})().then(() => { + console.log('done'); +}); diff --git a/config/default.js b/config/default.js new file mode 100644 index 0000000..55945fd --- /dev/null +++ b/config/default.js @@ -0,0 +1,99 @@ +'use strict'; + +// Provide default values for all configuration. + +const { name: packageName, version: packageVersion } = require('../package.json'); +const common = require('../src/common'); +const Enum = require('../src/enum'); +const roman = require('@squeep/roman'); + +const currentYear = (new Date()).getFullYear(); +const romanYearHTML = roman.toRoman(currentYear, true); + +const defaultOptions = { + // Uniquely identify this instance. + nodeId: common.requestId(), // Default to ephemeral ID: easiest for clustered deployments. + + encryptionSecret: '', // No default; set this to a long passphrase or randomness. + // This may also be set to an array, if secret needs to be rolled. This needs more documentation. + + // Dingus API Server Framework options. + dingus: { + // This needs to be the full externally accessible root URL, including any proxyPrefix component. + selfBaseUrl: '', + + // trustProxy: true, // If true, trust values of some headers regarding client IP address and protocol. + proxyPrefix: '', // Leading path parts to ignore when parsing routes, and include when constructing links, e.g. /indieauth + }, + + // The terminal portions of API route path endpoints. + route: { + authorization: 'auth', + consent: 'consent', + healthcheck: 'healthcheck', + introspection: 'introspect', + metadata: 'meta', + revocation: 'revoke', + ticket: 'ticket', + token: 'token', + userinfo: 'userinfo', + }, + + // Database options + db: { + connectionString: '', // e.g. sqlite://path/to/dbfile.sqlite + queryLogLevel: undefined, // Set to log queries + + // SQLite specific options + sqliteOptimizeAfterChanges: 0, // Number of changes before running pragma optimize, 0 for never + }, + + // Queue options, currently only for handing off ticket offers + queues: { + amqp: { + url: undefined, // AMQP endpoint, e.g. 'amqp://user:pass@rmq.host:5672' If not specified, ticket endpoint will be disabled + prefix: undefined, + }, + ticketPublishName: 'indieauth.ticket.proffered', // exchange to publish proffered tickets to + }, + + // Logging options + logger: { + ignoreBelowLevel: 'info', + }, + + manager: { + codeValidityTimeoutMs: 10 * 60 * 1000, + ticketLifespanSeconds: 300, + pageTitle: packageName, // title on html pages + logoUrl: 'static/logo.svg', // image to go with title + footerEntries: [ // common footers on all html pages + 'Development Repository', + `©`, + ], + allowLegacyNonPKCE: false, // Whether to process auth requests lacking code challenges + }, + + chores: { + scopeCleanupMs: 0, // how often to clean up unreferenced scopes, 0 for never + tokenCleanupMs: 0, // how often to clean up no-longer-valid scopes, 0 for never + }, + + // Outgoing request UA header. Setting these here to override helper defaults. + userAgent: { + product: packageName, + version: packageVersion, + implementation: Enum.Specification, + }, + + authenticator: { + authnEnabled: ['argon2', 'pam'], // Types of authentication to attempt. + secureAuthOnly: true, // Require secure transport for authentication. + forbiddenPAMIdentifiers: [ + 'root', + ], + }, + +}; + +module.exports = defaultOptions; diff --git a/config/development.js b/config/development.js new file mode 100644 index 0000000..2f69e39 --- /dev/null +++ b/config/development.js @@ -0,0 +1,36 @@ +'use strict'; +module.exports = [ + { + authenticator: { + authnEnabled: undefined, // remove all, then set one below + }, + }, + { + encryptionSecret: 'this is not a very good secret', + db: { + connectionString: `postgresql://${encodeURIComponent('/var/lib/postgresql/14/data')}/indieauther`, // local pg socket + queryLogLevel: 'debug', + }, + dingus: { + selfBaseUrl: 'https://ia.squeep.com/', + }, + queues: { + amqp: { + url: 'amqp://guest:guest@rmq.int:5672', + }, + }, + logger: { + ignoreBelowLevel: 'debug', + }, + authenticator: { + authnEnabled: ['argon2'], + }, + chores: { + scopeCleanupMs: 86400000, + tokenCleanupMs: 86400000, + }, + manager: { + allowLegacyNonPKCE: true, + }, + }, +]; diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..79410a6 --- /dev/null +++ b/config/index.js @@ -0,0 +1,24 @@ +'use strict'; + +const common = require('../src/common'); + +const defaultEnvironment = 'development'; +const testEnvironment = 'test'; + +function Config(environment, freeze = true) { + environment = environment || defaultEnvironment; + const defaultConfig = require('./default'); + let envConfig = require(`./${environment}`); // eslint-disable-line security/detect-non-literal-require + if (!Array.isArray(envConfig)) { + envConfig = Array(envConfig); + } + // We support arrays of config options in env to allow e.g. resetting an existing array + const combinedConfig = common.mergeDeep(defaultConfig, ...envConfig, { environment }); + if (freeze && !environment.includes(testEnvironment)) { + /* istanbul ignore next */ + common.freezeDeep(combinedConfig); + } + return combinedConfig; +} + +module.exports = Config; \ No newline at end of file diff --git a/config/test.js b/config/test.js new file mode 100644 index 0000000..b92272f --- /dev/null +++ b/config/test.js @@ -0,0 +1,16 @@ +'use strict'; +// Configuration used by test suites. +module.exports = { + encryptionSecret: 'not a great secret', + dingus: { + selfBaseUrl: 'https://example.com/indieauthie/', + }, + db: { + queryLogLevel: 'debug', + }, + queues: { + amqp: { + url: 'ampq://localhost:5432', + }, + }, +}; diff --git a/documentation/media/consent-page.png b/documentation/media/consent-page.png new file mode 100644 index 0000000000000000000000000000000000000000..fab0b424b68c9b1ed5fbf4456eac9d846f1a6249 GIT binary patch literal 449120 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%0A%xm^D9Zu~#&y=7RH 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 ZhCNq2&L;m_I*$PeJYD@<);T3K0RZCV2-*Mu literal 0 HcmV?d00001 diff --git a/documentation/media/postgres-er.svg b/documentation/media/postgres-er.svg new file mode 100644 index 0000000..670582a --- /dev/null +++ b/documentation/media/postgres-er.svg @@ -0,0 +1,184 @@ + + + + + + +indieAutherERD + +IndieAuther Entity-Relations +Postgres +Schema 1.0.0 + + +token + + +TOKEN + +code_id + +profile_id + +created + +expires + +refresh_expires + +refreshed + +duration + +refresh_duration + +refresh_count + +is_revoked + +is_token + +client_id + +resource + +profile_data + + + +token_scope + + +TOKEN_SCOPE + +code_id + +scope_id + + + +token:pk_code_id->token_scope:fk_code_id + + + + + +profile + + +PROFILE + +profile_id + +identifier_id + +profile + + + +profile:pk_profile_id->token:fk_profile_id + + + + + +profile_scope + + +PROFILE_SCOPE + +profile_id + +scope_id + + + +profile:pk_profile_id->profile_scope:fk_profile_id + + + + + +scope + + +SCOPE + +scope_id + +scope + +description + +application + +is_permanent + +is_manually_added + + + +scope:pk_scope_id->token_scope:fk_scope_id + + + + + +scope:pk_scope_id->profile_scope:fk_scope_id + + + + + +authentication + + +AUTHENTICATION + +identifier_id + +created + +last_authenticated + +identifier + +credential + + + +authentication:pk_identifier_id->profile:fk_identifier_id + + + + + +resource + + +RESOURCE + +resource_id + +description + +created + +secret + + + +almanac + + +ALMANAC + +event + +date + + + diff --git a/documentation/media/sqlite-er.svg b/documentation/media/sqlite-er.svg new file mode 100644 index 0000000..8d036ed --- /dev/null +++ b/documentation/media/sqlite-er.svg @@ -0,0 +1,183 @@ + + + + + + +indieAutherERD + +IndieAuther Entity-RelationsSQLite +Schema 1.0.0 + + +token + + +TOKEN + +code_id + +profile_id + +created + +expires + +refresh_expires + +refreshed + +duration + +refresh_duration + +refresh_count + +is_revoked + +is_token + +client_id + +resource + +profile_data + + + +token_scope + + +TOKEN_SCOPE + +code_id + +scope_id + + + +token:pk_code_id->token_scope:fk_code_id + + + + + +profile + + +PROFILE + +profile_id + +identifier_id + +profile + + + +profile:pk_profile_id->token:fk_profile_id + + + + + +profile_scope + + +PROFILE_SCOPE + +profile_id + +scope_id + + + +profile:pk_profile_id->profile_scope:fk_profile_id + + + + + +scope + + +SCOPE + +scope_id + +scope + +description + +application + +is_permanent + +is_manually_added + + + +scope:pk_scope_id->token_scope:fk_scope_id + + + + + +scope:pk_scope_id->profile_scope:fk_scope_id + + + + + +authentication + + +AUTHENTICATION + +identifier_id + +created + +last_authenticated + +identifier + +credential + + + +authentication:pk_identifier_id->profile:fk_identifier_id + + + + + +resource + + +RESOURCE + +resource_id + +description + +created + +secret + + + +almanac + + +ALMANAC + +event + +epoch + + + diff --git a/documentation/media/ticket-page.png b/documentation/media/ticket-page.png new file mode 100644 index 0000000000000000000000000000000000000000..5865180edfe87233df5fba508f79236a97e51343 GIT binary patch literal 230324 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

=ctR>?Gy6*!6J9bI%v@0gSI83mZ|009dyPL2LS$ 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.0" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", + "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.7", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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/@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", + "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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/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/@istanbuljs/load-nyc-config/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==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.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/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "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/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@squeep/amqp-helper": { + "version": "1.0.0", + "resolved": "git+https://git.squeep.com/squeep-amqp-helper#174280d3f44ba13dac0b26d42d968189a4f4fa93", + "license": "ISC", + "dependencies": { + "amqplib": "^0.10.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/api-dingus": { + "version": "1.2.9", + "resolved": "git+https://git.squeep.com/squeep-api-dingus/#3b15b5ff792fc5d61be8337989058c297460cd99", + "license": "ISC", + "dependencies": { + "mime-db": "^1.52.0", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/authentication-module": { + "version": "1.2.12", + "resolved": "git+https://git.squeep.com/squeep-authentication-module/#9a7d5352698481c0857ba8827e31c7cb97625133", + "license": "ISC", + "dependencies": { + "@squeep/api-dingus": "git+https://git.squeep.com/squeep-api-dingus/#v1.2.9", + "@squeep/html-template-helper": "git+https://git.squeep.com/squeep-html-template-helper#v1.4.0", + "@squeep/indieauth-helper": "git+https://git.squeep.com/squeep-indieauth-helper/#v1.1.7", + "@squeep/mystery-box": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "argon2": "^0.30.1", + "node-linux-pam": "^0.2.1" + } + }, + "node_modules/@squeep/base64url": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@squeep/base64url/-/base64url-1.0.5.tgz", + "integrity": "sha512-J1UBXYQ4tBuHGnFfg0MdmxCP3oEti7jJWK/qBsg520d8tZd10sL6TXiMDGdBiH9GD3OtlfSYf6wWIN4QfdW21A==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/chores": { + "version": "1.0.0", + "resolved": "git+https://git.squeep.com/squeep-chores/#d98a3c114eb33bd68477c0ca750e6f82b4d02964", + "license": "ISC" + }, + "node_modules/@squeep/html-template-helper": { + "version": "1.4.0", + "resolved": "git+https://git.squeep.com/squeep-html-template-helper#100046316a87631fb8814f80b35647709e6c7319", + "license": "ISC", + "dependencies": { + "@squeep/lazy-property": "^1.1.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/indieauth-helper": { + "version": "1.2.2", + "resolved": "git+https://git.squeep.com/squeep-indieauth-helper/#9d77dc15cee59356a4a4f7935db6a450b04a083c", + "license": "ISC", + "dependencies": { + "@squeep/base64url": "^1.0.5", + "@squeep/web-linking": "^1.0.7", + "axios": "^1.2.1", + "iconv": "^3.0.1", + "ip-address": "^8.1.0", + "microformats-parser": "^1.4.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/lazy-property": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@squeep/lazy-property/-/lazy-property-1.1.2.tgz", + "integrity": "sha512-wRdR4IOqWXoDMArx0HPo5MtM2Wk5wemAULbZ6PabVw1ylSQekkzKfoAUuupxsKuzjcRPjZvbpGDv+i04hBMnQw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/logger-json-console": { + "version": "1.0.2", + "resolved": "git+https://git.squeep.com/squeep-logger-json-console#dbff0fa5f018f7a302f73250e55f761c0ccf24b1", + "license": "ISC", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@squeep/mystery-box": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@squeep/mystery-box/-/mystery-box-1.2.0.tgz", + "integrity": "sha512-HYxsF+mv2yrOsgQO2am2i07SRgp5L4o0CySmlM3rIsVWJXlywVPGk9xZFpKtk49BXCGxopWfvtPhpM8U0roaRg==", + "dependencies": { + "@squeep/base64url": "^1.0.5" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/resource-authentication-module": { + "version": "1.0.0", + "resolved": "git+https://git.squeep.com/squeep-resource-authentication-module#69a2f5e7d73dd3f58e07b652c306daa8b253245d", + "license": "ISC", + "dependencies": { + "@squeep/api-dingus": "git+https://git.squeep.com/squeep-api-dingus/#v1.2.8", + "@squeep/base64url": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@squeep/roman": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@squeep/roman/-/roman-1.0.0.tgz", + "integrity": "sha512-D02jDw/we8tc6QiCPor7tWVviY8MLITyp/egqp3XqrrKtsFMYdguAhaFKUmIBu1ZL1uPKgoLBOy8hIptmh8cWA==" + }, + "node_modules/@squeep/test-helper": { + "version": "1.0.0", + "resolved": "git+https://git.squeep.com/squeep-test-helper#7a5a384abb99757b53c8898c508023f0ba9e94b1", + "dev": true, + "license": "ISC", + "dependencies": { + "eslint": "^8.23.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-security": "^1.5.0", + "eslint-plugin-sonarjs": "^0.15.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "pre-commit": "^1.2.2", + "sinon": "^14.0.0" + } + }, + "node_modules/@squeep/test-helper/node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@squeep/test-helper/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@squeep/test-helper/node_modules/eslint-plugin-sonarjs": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.15.0.tgz", + "integrity": "sha512-LuxHdAe6VqSbi1phsUvNjbmXLuvlobmryQJJNyQYbdubCfz6K8tmgoqNiJPnz0pP2AbYDbtuPm0ajOMgMrC+dQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@squeep/test-helper/node_modules/sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/@squeep/web-linking": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@squeep/web-linking/-/web-linking-1.0.7.tgz", + "integrity": "sha512-9d3QijrWc/WNE7p/K7NLUHbmPf92CURRqfzDLV0cGqYNA4QWAPfzwC8hxWpdUkUnep3KakvLKK60l0kEBMM3ag==", + "engines": { + "node": ">=14.0" + } + }, + "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==", + "optional": true + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "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==", + "optional": true, + "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/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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, + "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==", + "devOptional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/are-we-there-yet/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/argon2": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.2.tgz", + "integrity": "sha512-RBbXTUsrJUQH259/72CCJxQa0hV961pV4PyZ7R1czGkArSsQP4DToCS2axmNfHywXaBNEMPWMW6rM82EArulYA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "@phc/format": "^1.0.0", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/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 + }, + "node_modules/assert-options": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.0.tgz", + "integrity": "sha512-qSELrEaEz4sGwTs4Qh+swQkjiHAysC4rot21+jzXU86dJzNG+FDqBzyS3ohSoTRf4ZLA3FSwxQdiuNl5NXUtvA==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", + "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.0.1.tgz", + "integrity": "sha512-JhTZjpyapA1icCEjIZB4TSSgkGdFgpWZA2Wszg7Cf4JwJwKQmbvuNnJBeR+EYG/Z29OXvR4G//Rbg31BW/Z7Yg==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/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/bl/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/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/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.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "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/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/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "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/cliui": { + "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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "optional": true, + "engines": { + "node": ">=0.10.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==", + "devOptional": true, + "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==", + "devOptional": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "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==", + "dev": true, + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "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/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.3.1" + } + }, + "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/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "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==", + "devOptional": true + }, + "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/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-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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/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" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/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-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/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" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-node/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-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-security": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", + "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "dev": true, + "dependencies": { + "safe-regex": "^2.1.1" + } + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.17.0.tgz", + "integrity": "sha512-jtGtxI49UbJJeJj7CVRLI3+LLH+y+hkR3GOOwM7vBbci9DEFIRGCWvEd2BJScrzltZ6D6iubukTAfc9cyG7sdw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/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, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true + }, + "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": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": 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": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true + }, + "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, + "hasInstallScript": 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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "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==", + "devOptional": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "devOptional": 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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "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": "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/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/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/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/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/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier-lint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-lint/-/html-minifier-lint-2.0.0.tgz", + "integrity": "sha512-halWZUg/us7Y16irVM90DTdyAUP3ksFthWfFPJTG1jpBaYYyGHt9azTW9H++hZ8LWRArzQm9oIcrfM/o/CO+4A==", + "dev": true, + "dependencies": { + "html-minifier": "3.x" + }, + "bin": { + "html-minifier-lint": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/iconv/-/iconv-3.0.1.tgz", + "integrity": "sha512-lJnFLxVc0d82R7GfU7a9RujKVUQ3Eee19tPKWZWBJtAEGRHVEyFzCtbNl3GPKuDnHBBRT4/nDS4Ru9AIDT72qA==", + "hasInstallScript": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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==" + }, + "node_modules/ip-address": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-8.1.0.tgz", + "integrity": "sha512-Wz91gZKpNKoXtqvY8ScarKYwhXoK4r/b5QuT+uywe/azv0/nUCo7Bh0IRRI7F9DHR06kJNWtzMGLIbXavngbKA==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + }, + "engines": { + "node": ">= 12" + } + }, + "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-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-path-inside": { + "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, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "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-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/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-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "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-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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "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/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "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, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "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/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==", + "devOptional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/microformats-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/microformats-parser/-/microformats-parser-1.4.1.tgz", + "integrity": "sha512-BSg9Y/Aik8hvvme/fkxnXMRvTKuVwOeTapeZdaPQ+92DEubyM31iMtwbgFZ1383om643UvfYY5G23E9s1FY2KQ==", + "dependencies": { + "parse5": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha-steps": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mocha-steps/-/mocha-steps-1.3.0.tgz", + "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==", + "dev": true + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/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 + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-abi": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz", + "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-linux-pam": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-linux-pam/-/node-linux-pam-0.2.1.tgz", + "integrity": "sha512-OeMZW0Bs1bffsvXI/bJQbU0rkiWTOo0ceT6+mrbU84TJ33vAKykIZrLI+ApfRqkBQW5jzW5rJ7x+NSyToafqig==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "1.0.5", + "bindings": "1.5.0", + "node-addon-api": "3.1.0", + "string-template": "1.0.0", + "yargs": "15.4.1" + }, + "bin": { + "nlp": "cli.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/node-linux-pam/node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/node-linux-pam/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-linux-pam/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "node_modules/node-linux-pam/node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/node-linux-pam/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/node-linux-pam/node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/node-linux-pam/node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-linux-pam/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-linux-pam/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/node_modules/node-addon-api": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "optional": true + }, + "node_modules/node-linux-pam/node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "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/node-linux-pam/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-linux-pam/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-linux-pam/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==", + "optional": true + }, + "node_modules/node-linux-pam/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==", + "optional": true, + "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/node-linux-pam/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==", + "optional": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "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": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/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==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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==", + "dev": true + }, + "node_modules/nyc/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==", + "dev": true, + "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/nyc/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==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "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/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "devOptional": true, + "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/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "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==", + "devOptional": true, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-minify": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.2.tgz", + "integrity": "sha512-1KdmFGGTP6jplJoI8MfvRlfvMiyBivMRP7/ffh4a11RUFJ7kC2J0ZHlipoKiH/1hz+DVgceon9U2qbaHpPeyPg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-promise": { + "version": "10.15.4", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.15.4.tgz", + "integrity": "sha512-BKlHCMCdNUmF6gagVbehRWSEiVcZzPVltEx14OJExR9Iz9/1R6KETDWLLGv2l6yRqYFnEZZy1VDjRhArzeIGrw==", + "dependencies": { + "assert-options": "0.8.0", + "pg": "8.8.0", + "pg-minify": "1.6.2", + "spex": "3.2.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/pkg-dir/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==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/pre-commit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pre-commit/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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==", + "devOptional": true + }, + "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/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "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/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/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "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": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "devOptional": true, + "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==", + "devOptional": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "devOptional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/semver/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/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "devOptional": true + }, + "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/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "devOptional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sinon": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", + "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "10.0.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "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/spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.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/spex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz", + "integrity": "sha512-9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg==", + "engines": { + "node": ">=4.5" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", + "optional": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/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/tar-stream/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/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/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "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": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "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.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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "devOptional": true + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "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/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "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": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "requires": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + } + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true + }, + "@babel/core": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", + "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.7", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", + "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "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" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "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" + } + }, + "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": "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" + } + }, + "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 + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "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 + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "optional": true, + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "optional": true + }, + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0" + } + }, + "@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "@squeep/amqp-helper": { + "version": "git+https://git.squeep.com/squeep-amqp-helper#174280d3f44ba13dac0b26d42d968189a4f4fa93", + "from": "@squeep/amqp-helper@git+https://git.squeep.com/squeep-amqp-helper#v1.0.0", + "requires": { + "amqplib": "^0.10.3" + } + }, + "@squeep/api-dingus": { + "version": "git+https://git.squeep.com/squeep-api-dingus/#3b15b5ff792fc5d61be8337989058c297460cd99", + "from": "@squeep/api-dingus@git+https://git.squeep.com/squeep-api-dingus/#v1.2.9", + "requires": { + "mime-db": "^1.52.0", + "uuid": "^9.0.0" + } + }, + "@squeep/authentication-module": { + "version": "git+https://git.squeep.com/squeep-authentication-module/#9a7d5352698481c0857ba8827e31c7cb97625133", + "from": "@squeep/authentication-module@git+https://git.squeep.com/squeep-authentication-module/#v1.2.12", + "requires": { + "@squeep/api-dingus": "git+https://git.squeep.com/squeep-api-dingus/#v1.2.9", + "@squeep/html-template-helper": "git+https://git.squeep.com/squeep-html-template-helper#v1.4.0", + "@squeep/indieauth-helper": "git+https://git.squeep.com/squeep-indieauth-helper/#v1.1.7", + "@squeep/mystery-box": "^1.2.0", + "argon2": "^0.30.1", + "node-linux-pam": "^0.2.1" + } + }, + "@squeep/base64url": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@squeep/base64url/-/base64url-1.0.5.tgz", + "integrity": "sha512-J1UBXYQ4tBuHGnFfg0MdmxCP3oEti7jJWK/qBsg520d8tZd10sL6TXiMDGdBiH9GD3OtlfSYf6wWIN4QfdW21A==" + }, + "@squeep/chores": { + "version": "git+https://git.squeep.com/squeep-chores/#d98a3c114eb33bd68477c0ca750e6f82b4d02964", + "from": "@squeep/chores@git+https://git.squeep.com/squeep-chores/#v1.0.0" + }, + "@squeep/html-template-helper": { + "version": "git+https://git.squeep.com/squeep-html-template-helper#100046316a87631fb8814f80b35647709e6c7319", + "from": "@squeep/html-template-helper@git+https://git.squeep.com/squeep-html-template-helper#v1.4.0", + "requires": { + "@squeep/lazy-property": "^1.1.2" + } + }, + "@squeep/indieauth-helper": { + "version": "git+https://git.squeep.com/squeep-indieauth-helper/#9d77dc15cee59356a4a4f7935db6a450b04a083c", + "from": "@squeep/indieauth-helper@git+https://git.squeep.com/squeep-indieauth-helper/#v1.2.2", + "requires": { + "@squeep/base64url": "^1.0.5", + "@squeep/web-linking": "^1.0.7", + "axios": "^1.2.1", + "iconv": "^3.0.1", + "ip-address": "^8.1.0", + "microformats-parser": "^1.4.1" + } + }, + "@squeep/lazy-property": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@squeep/lazy-property/-/lazy-property-1.1.2.tgz", + "integrity": "sha512-wRdR4IOqWXoDMArx0HPo5MtM2Wk5wemAULbZ6PabVw1ylSQekkzKfoAUuupxsKuzjcRPjZvbpGDv+i04hBMnQw==" + }, + "@squeep/logger-json-console": { + "version": "git+https://git.squeep.com/squeep-logger-json-console#dbff0fa5f018f7a302f73250e55f761c0ccf24b1", + "from": "@squeep/logger-json-console@git+https://git.squeep.com/squeep-logger-json-console#v1.0.2" + }, + "@squeep/mystery-box": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@squeep/mystery-box/-/mystery-box-1.2.0.tgz", + "integrity": "sha512-HYxsF+mv2yrOsgQO2am2i07SRgp5L4o0CySmlM3rIsVWJXlywVPGk9xZFpKtk49BXCGxopWfvtPhpM8U0roaRg==", + "requires": { + "@squeep/base64url": "^1.0.5" + } + }, + "@squeep/resource-authentication-module": { + "version": "git+https://git.squeep.com/squeep-resource-authentication-module#69a2f5e7d73dd3f58e07b652c306daa8b253245d", + "from": "@squeep/resource-authentication-module@git+https://git.squeep.com/squeep-resource-authentication-module#v1.0.0", + "requires": { + "@squeep/api-dingus": "git+https://git.squeep.com/squeep-api-dingus/#v1.2.8", + "@squeep/base64url": "^1.0.5", + "uuid": "^9.0.0" + } + }, + "@squeep/roman": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@squeep/roman/-/roman-1.0.0.tgz", + "integrity": "sha512-D02jDw/we8tc6QiCPor7tWVviY8MLITyp/egqp3XqrrKtsFMYdguAhaFKUmIBu1ZL1uPKgoLBOy8hIptmh8cWA==" + }, + "@squeep/test-helper": { + "version": "git+https://git.squeep.com/squeep-test-helper#7a5a384abb99757b53c8898c508023f0ba9e94b1", + "dev": true, + "from": "@squeep/test-helper@git+https://git.squeep.com/squeep-test-helper#v1.0.0", + "requires": { + "eslint": "^8.23.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-security": "^1.5.0", + "eslint-plugin-sonarjs": "^0.15.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "pre-commit": "^1.2.2", + "sinon": "^14.0.0" + }, + "dependencies": { + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } + } + }, + "eslint-plugin-sonarjs": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.15.0.tgz", + "integrity": "sha512-LuxHdAe6VqSbi1phsUvNjbmXLuvlobmryQJJNyQYbdubCfz6K8tmgoqNiJPnz0pP2AbYDbtuPm0ajOMgMrC+dQ==", + "dev": true, + "requires": {} + }, + "sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + } + } + } + }, + "@squeep/web-linking": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@squeep/web-linking/-/web-linking-1.0.7.tgz", + "integrity": "sha512-9d3QijrWc/WNE7p/K7NLUHbmPf92CURRqfzDLV0cGqYNA4QWAPfzwC8hxWpdUkUnep3KakvLKK60l0kEBMM3ag==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "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==", + "optional": true, + "requires": { + "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" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "requires": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + } + }, + "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 + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "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==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==", + "optional": true + }, + "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "argon2": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.2.tgz", + "integrity": "sha512-RBbXTUsrJUQH259/72CCJxQa0hV961pV4PyZ7R1czGkArSsQP4DToCS2axmNfHywXaBNEMPWMW6rM82EArulYA==", + "optional": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.10", + "@phc/format": "^1.0.0", + "node-addon-api": "^5.0.0" + } + }, + "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 + }, + "assert-options": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.0.tgz", + "integrity": "sha512-qSELrEaEz4sGwTs4Qh+swQkjiHAysC4rot21+jzXU86dJzNG+FDqBzyS3ohSoTRf4ZLA3FSwxQdiuNl5NXUtvA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", + "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "better-sqlite3": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.0.1.tgz", + "integrity": "sha512-JhTZjpyapA1icCEjIZB4TSSgkGdFgpWZA2Wszg7Cf4JwJwKQmbvuNnJBeR+EYG/Z29OXvR4G//Rbg31BW/Z7Yg==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==" + }, + "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" + } + } + } + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "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 + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "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", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "devOptional": true + }, + "caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "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.6.0" + }, + "dependencies": { + "glob-parent": { + "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" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "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 + }, + "cliui": { + "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": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "optional": true + }, + "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==", + "devOptional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "devOptional": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "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==", + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "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, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "devOptional": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "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==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "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 + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "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==", + "devOptional": true + }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, + "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-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 + }, + "eslint": { + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "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, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "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 + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "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, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "requires": {} + }, + "eslint-plugin-security": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", + "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "dev": true, + "requires": { + "safe-regex": "^2.1.1" + } + }, + "eslint-plugin-sonarjs": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.17.0.tgz", + "integrity": "sha512-jtGtxI49UbJJeJj7CVRLI3+LLH+y+hkR3GOOwM7vBbci9DEFIRGCWvEd2BJScrzltZ6D6iubukTAfc9cyG7sdw==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "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" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "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, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "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==", + "dev": true + }, + "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 + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true + }, + "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 + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "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", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "devOptional": 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 + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "devOptional": 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" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "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 + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-minifier-lint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-lint/-/html-minifier-lint-2.0.0.tgz", + "integrity": "sha512-halWZUg/us7Y16irVM90DTdyAUP3ksFthWfFPJTG1jpBaYYyGHt9azTW9H++hZ8LWRArzQm9oIcrfM/o/CO+4A==", + "dev": true, + "requires": { + "html-minifier": "3.x" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/iconv/-/iconv-3.0.1.tgz", + "integrity": "sha512-lJnFLxVc0d82R7GfU7a9RujKVUQ3Eee19tPKWZWBJtAEGRHVEyFzCtbNl3GPKuDnHBBRT4/nDS4Ru9AIDT72qA==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "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==" + }, + "ip-address": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-8.1.0.tgz", + "integrity": "sha512-Wz91gZKpNKoXtqvY8ScarKYwhXoK4r/b5QuT+uywe/azv0/nUCo7Bh0IRRI7F9DHR06kJNWtzMGLIbXavngbKA==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + } + }, + "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, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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==", + "devOptional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "is-path-inside": { + "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": { + "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 + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "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-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 + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "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" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, + "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 + }, + "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" + } + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "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, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "log-symbols": { + "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.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "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" + } + }, + "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==", + "devOptional": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true + } + } + }, + "microformats-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/microformats-parser/-/microformats-parser-1.4.1.tgz", + "integrity": "sha512-BSg9Y/Aik8hvvme/fkxnXMRvTKuVwOeTapeZdaPQ+92DEubyM31iMtwbgFZ1383om643UvfYY5G23E9s1FY2KQ==", + "requires": { + "parse5": "^6.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "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 + }, + "supports-color": { + "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" + } + } + } + }, + "mocha-steps": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mocha-steps/-/mocha-steps-1.3.0.tgz", + "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-abi": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz", + "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==", + "requires": { + "semver": "^7.3.5" + } + }, + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "optional": true + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "optional": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-linux-pam": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-linux-pam/-/node-linux-pam-0.2.1.tgz", + "integrity": "sha512-OeMZW0Bs1bffsvXI/bJQbU0rkiWTOo0ceT6+mrbU84TJ33vAKykIZrLI+ApfRqkBQW5jzW5rJ7x+NSyToafqig==", + "optional": true, + "requires": { + "@mapbox/node-pre-gyp": "1.0.5", + "bindings": "1.5.0", + "node-addon-api": "3.1.0", + "string-template": "1.0.0", + "yargs": "15.4.1" + }, + "dependencies": { + "@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "optional": true, + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "optional": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "optional": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "node-addon-api": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "optional": true + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.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==", + "optional": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "optional": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==", + "optional": 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" + } + }, + "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "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==", + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "optional": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "optional": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "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": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "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 + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "optional": 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": { + "cliui": { + "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", + "wrap-ansi": "^6.2.0" + } + }, + "find-up": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "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": "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" + } + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "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", + "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" + } + }, + "yargs-parser": { + "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" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "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" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true + }, + "p-limit": { + "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": { + "yocto-queue": "^0.1.0" + } + }, + "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, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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==", + "devOptional": true + }, + "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" + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "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==", + "devOptional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true + }, + "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 + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-minify": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.2.tgz", + "integrity": "sha512-1KdmFGGTP6jplJoI8MfvRlfvMiyBivMRP7/ffh4a11RUFJ7kC2J0ZHlipoKiH/1hz+DVgceon9U2qbaHpPeyPg==" + }, + "pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "requires": {} + }, + "pg-promise": { + "version": "10.15.4", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.15.4.tgz", + "integrity": "sha512-BKlHCMCdNUmF6gagVbehRWSEiVcZzPVltEx14OJExR9Iz9/1R6KETDWLLGv2l6yRqYFnEZZy1VDjRhArzeIGrw==", + "requires": { + "assert-options": "0.8.0", + "pg": "8.8.0", + "pg-minify": "1.6.2", + "spex": "3.2.0" + } + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "requires": { + "split2": "^4.1.0" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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" + }, + "dependencies": { + "find-up": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "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": "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" + } + } + } + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "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 + }, + "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==", + "devOptional": true + }, + "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" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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 + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "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" + } + }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "devOptional": true + }, + "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==", + "devOptional": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "devOptional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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==" + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "devOptional": true + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "devOptional": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "sinon": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", + "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "10.0.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + } + }, + "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 + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.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" + } + }, + "spex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz", + "integrity": "sha512-9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg==" + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", + "optional": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "optional": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==" + }, + "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" + } + } + } + }, + "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", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "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, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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 + }, + "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==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "devOptional": true + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "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 + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "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, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "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 + } + } + }, + "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 + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..24e8e44 --- /dev/null +++ b/package.json @@ -0,0 +1,64 @@ +{ + "name": "@squeep/indie-auther", + "version": "1.0.0", + "description": "A stand-alone IndieAuth identity-provider service, for most of your IndieAuth endpoint needs.", + "keywords": [ + "IdP", + "Identity Provider", + "IndieAuth", + "IndieWeb", + "OAuth2", + "Authentication" + ], + "main": "server.js", + "scripts": { + "coverage": "nyc npm test", + "coverage-check": "nyc check-coverage", + "eslint": "eslint *.js src", + "test": "mocha --recursive" + }, + "pre-commit": [ + "eslint", + "coverage", + "coverage-check" + ], + "engines": { + "node": ">=14.0" + }, + "repository": { + "type": "git", + "url": "https://git.squeep.com/squeep-indie-auther/" + }, + "author": "Justin Wind ", + "license": "ISC", + "dependencies": { + "@squeep/amqp-helper": "git+https://git.squeep.com/squeep-amqp-helper#v1.0.0", + "@squeep/api-dingus": "git+https://git.squeep.com/squeep-api-dingus/#v1.2.9", + "@squeep/authentication-module": "git+https://git.squeep.com/squeep-authentication-module/#v1.2.12", + "@squeep/chores": "git+https://git.squeep.com/squeep-chores/#v1.0.0", + "@squeep/html-template-helper": "git+https://git.squeep.com/squeep-html-template-helper#v1.4.0", + "@squeep/indieauth-helper": "git+https://git.squeep.com/squeep-indieauth-helper/#v1.2.2", + "@squeep/logger-json-console": "git+https://git.squeep.com/squeep-logger-json-console#v1.0.2", + "@squeep/mystery-box": "^1.2.0", + "@squeep/resource-authentication-module": "git+https://git.squeep.com/squeep-resource-authentication-module#v1.0.0", + "@squeep/roman": "^1.0.0", + "@squeep/web-linking": "^1.0.7", + "better-sqlite3": "^8.0.1", + "pg-promise": "^10.15.4", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@squeep/test-helper": "git+https://git.squeep.com/squeep-test-helper#v1.0.0", + "eslint": "^8.30.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-security": "^1.5.0", + "eslint-plugin-sonarjs": "^0.17.0", + "html-minifier-lint": "^2.0.0", + "mocha": "^10.2.0", + "mocha-steps": "^1.3.0", + "nyc": "^15.1.0", + "pre-commit": "^1.2.2", + "sinon": "^15.0.1" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..1e9c089 --- /dev/null +++ b/server.js @@ -0,0 +1,39 @@ +'use strict'; + +const http = require('http'); + +const Config = require('./config'); +const DB = require('./src/db'); +const Service = require('./src/service'); +const Logger = require('./src/logger'); +const { fileScope } = require('./src/common'); +const _fileScope = fileScope(__filename); +const { version } = require('./package.json'); + +const PORT = process.env.PORT || 3002; +const ADDR = process.env.LISTEN_ADDR || '127.0.0.1'; + +(async function main () { + const _scope = _fileScope('main'); + let config, logger, db, service; + try { + config = new Config(process.env.NODE_ENV); + logger = new Logger(config); + db = new DB(logger, config); + await db.initialize(); + service = new Service(logger, db, config); + await service.initialize(); + + http.createServer((req, res) => { + service.dispatch(req, res); + }).listen(PORT, ADDR, (err) => { + if (err) { + logger.error(_scope, 'error starting server', err); + throw err; + } + logger.info(_scope, 'server started', { version, listenAddress: ADDR, listenPort: PORT }); + }); + } catch (e) { + (logger || console).error(_scope, 'error starting server', e); + } +})(); \ No newline at end of file diff --git a/src/chores.js b/src/chores.js new file mode 100644 index 0000000..0f3d379 --- /dev/null +++ b/src/chores.js @@ -0,0 +1,70 @@ +'use strict'; + +const common = require('./common'); +const Enum = require('./enum'); +const { Chores: BaseChores } = require('@squeep/chores'); +const _fileScope = common.fileScope(__filename); + +/** + * Wrangle periodic tasks what need doing. + */ + +class Chores extends BaseChores { + constructor(logger, db, options) { + super(logger); + this.options = options; + this.db = db; + + this.establishChore(Enum.Chore.CleanTokens, this.cleanTokens.bind(this), options?.chores?.tokenCleanupMs); + this.establishChore(Enum.Chore.CleanScopes, this.cleanScopes.bind(this), options?.chores?.scopeCleanupMs); + } + + /** + * Attempt to remove tokens which are expired or otherwise no longer valid. + * @param {Number} atLeastMsSinceLast + */ + async cleanTokens(atLeastMsSinceLast = this.options?.chores?.tokenCleanupMs || 0) { + const _scope = _fileScope('cleanTokens'); + this.logger.debug(_scope, 'called', atLeastMsSinceLast); + + let tokensCleaned; + try { + await this.db.context(async (dbCtx) => { + const codeValidityTimeoutSeconds = Math.ceil(this.options.manager.codeValidityTimeoutMs / 1000); + tokensCleaned = await this.db.tokenCleanup(dbCtx, codeValidityTimeoutSeconds, atLeastMsSinceLast); + }); // dbCtx + if (tokensCleaned) { + this.logger.info(_scope, 'finished', { tokensCleaned }); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e }); + throw e; + } + } + + + /** + * Attempt to remove ephemeral scopes which are no longer referenced by tokens. + * @param {Number} atLeastMsSinceLast + */ + async cleanScopes(atLeastMsSinceLast = this.options?.chores?.scopeCleanupMs || 0) { + const _scope = _fileScope('cleanScopes'); + this.logger.debug(_scope, 'called', atLeastMsSinceLast); + + let scopesCleaned; + try { + await this.db.context(async (dbCtx) => { + scopesCleaned = await this.db.scopeCleanup(dbCtx, atLeastMsSinceLast); + }); // dbCtx + if (scopesCleaned) { + this.logger.info(_scope, 'finished', { scopesCleaned }); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e }); + throw e; + } + } + +} // IAChores + +module.exports = Chores; \ No newline at end of file diff --git a/src/common.js b/src/common.js new file mode 100644 index 0000000..d58f535 --- /dev/null +++ b/src/common.js @@ -0,0 +1,167 @@ +'use strict'; + +const { common } = require('@squeep/api-dingus'); + +const { randomBytes } = require('crypto'); +const { promisify } = require('util'); +const randomBytesAsync = promisify(randomBytes); + +/** + * Pick out useful axios response fields. + * @param {*} res + * @returns + */ +const axiosResponseLogData = (res) => { + const data = common.pick(res, [ + 'status', + 'statusText', + 'headers', + 'elapsedTimeMs', + 'data', + ]); + if (data.data) { + data.data = logTruncate(data.data, 100); + } + return data; +}; + +/** + * Limit length of string to keep logs sane + * @param {String} str + * @param {Number} len + * @returns {String} + */ +const logTruncate = (str, len) => { + if (typeof str !== 'string' || str.toString().length <= len) { + return str; + } + return str.toString().slice(0, len) + `... (${str.toString().length} bytes)`; +}; + +/** + * Turn a snake into a camel. + * @param {String} snakeCase + * @param {String|RegExp} delimiter + * @returns {String} + */ +const camelfy = (snakeCase, delimiter = '_') => { + if (!snakeCase || typeof snakeCase.split !== 'function') { + return undefined; + } + const words = snakeCase.split(delimiter); + return [ + words.shift(), + ...words.map((word) => word.charAt(0).toUpperCase() + word.slice(1)), + ].join(''); +}; + +/** + * Return an array containing x if x is not an array. + * @param {*} x + */ +const ensureArray = (x) => { + if (x === undefined) { + return []; + } + if (!Array.isArray(x)) { + return Array(x); + } + return x; +}; + +/** + * Recursively freeze an object. + * @param {Object} o + * @returns {Object} + */ +const freezeDeep = (o) => { + Object.freeze(o); + Object.getOwnPropertyNames(o).forEach((prop) => { + if (Object.hasOwnProperty.call(o, prop) + && ['object', 'function'].includes(typeof o[prop]) // eslint-disable-line security/detect-object-injection + && !Object.isFrozen(o[prop])) { // eslint-disable-line security/detect-object-injection + return freezeDeep(o[prop]); // eslint-disable-line security/detect-object-injection + } + }); + return o; +}; + + +/** Oauth2.1 §3.2.3.1 + * %x20-21 / %x23-5B / %x5D-7E + * @param {String} char + */ +const validErrorChar = (char) => { + const value = char.charCodeAt(0); + return value === 0x20 || value === 0x21 + || (value >= 0x23 && value <= 0x5b) + || (value >= 0x5d && value <= 0x7e); +}; + + +/** + * Determine if an OAuth error message is valid. + * @param {String} error + * @returns {Boolean} + */ +const validError = (error) => { + return error && error.split('').filter((c) => !validErrorChar(c)).length === 0 || false; +}; + + +/** + * OAuth2.1 §3.2.2.1 + * scope-token = 1*( %x21 / %x23-5B / %x5D-7E ) + * @param {String} char + */ +const validScopeChar = (char) => { + const value = char.charCodeAt(0); + return value === 0x21 + || (value >= 0x23 && value <= 0x5b) + || (value >= 0x5d && value <= 0x7e); +}; + + +/** + * Determine if a scope has a valid name. + * @param {String} scope + * @returns {Boolean} + */ +const validScope = (scope) => { + return scope && scope.split('').filter((c) => !validScopeChar(c)).length === 0 || false; +}; + + +/** + * + * @param {Number} bytes + */ +const newSecret = async (bytes = 64) => { + return (await randomBytesAsync(bytes * 3 / 4)).toString('base64'); +}; + + +/** + * Convert a Date object to epoch seconds. + * @param {Date=} date + * @returns {Number} + */ +const dateToEpoch = (date) => { + const dateMs = date ? date.getTime() : Date.now(); + return Math.ceil(dateMs / 1000); +}; + +module.exports = { + ...common, + axiosResponseLogData, + camelfy, + dateToEpoch, + ensureArray, + freezeDeep, + logTruncate, + newSecret, + randomBytesAsync, + validScope, + validError, +}; + diff --git a/src/db/abstract.js b/src/db/abstract.js new file mode 100644 index 0000000..26867e4 --- /dev/null +++ b/src/db/abstract.js @@ -0,0 +1,563 @@ +/* eslint-disable no-unused-vars */ +'use strict'; + +const common = require('../common'); +const DatabaseErrors = require('./errors'); +const svh = require('./schema-version-helper'); +const uuid = require('uuid'); + +const _fileScope = common.fileScope(__filename); + +class Database { + constructor(logger, options) { + this.logger = logger; + this.options = options; + } + + + /** + * Perform tasks needed to prepare database for use. Ensure this is called + * after construction, and before any other database activity. + * At the minimum, this will validate a compatible schema is present and usable. + * Some engines will also perform other initializations or async actions which + * are easier handled outside the constructor. + */ + async initialize() { + const _scope = _fileScope('initialize'); + + const currentSchema = await this._currentSchema(); + const current = svh.schemaVersionObjectToNumber(currentSchema); + const min = svh.schemaVersionObjectToNumber(this.schemaVersionsSupported.min); + const max = svh.schemaVersionObjectToNumber(this.schemaVersionsSupported.max); + if (current >= min && current <= max) { + this.logger.debug(_scope, 'schema supported', { currentSchema, schemaVersionsSupported: this.schemaVersionsSupported }); + } else { + this.logger.error(_scope, 'schema not supported', { currentSchema, schemaVersionsSupported: this.schemaVersionsSupported }); + throw new DatabaseErrors.MigrationNeeded(); + } + } + + + /** + * Query the current schema version. + * This is a standalone query function, as it is called before statements are loaded. + * @returns {Object} version + * @returns {Number} version.major + * @returns {Number} version.minor + * @returns {Number} version.patch + */ + async _currentSchema() { + this._notImplemented('_currentSchema', arguments); + } + + + /** + * Perform db connection health-check, if applicable. + * Throw something if a database situation should pull us out of a load-balancer. + */ + async healthCheck() { + this._notImplemented('healthCheck', arguments); + } + + + /** + * Wrap a function call in a database context. + * @param {Function} fn fn(ctx) + */ + async context(fn) { + this._notImplemented('context', arguments); + } + + /** + * Wrap a function call in a transaction context. + * @param {*} dbCtx + * @param {Function} fn fn(txCtx) + */ + async transaction(dbCtx, fn) { + this._notImplemented('transaction', arguments); + } + + + /** + * @param {*} x + * @returns {Boolean} + */ + static _isUUID(x) { + try { + uuid.parse(x); + return true; + } catch (e) { + return false; + } + } + + + /** + * @param {*} x + * @returns {Boolean} + */ + static _isInfinites(x) { + return typeof(x) === 'number' + && Math.abs(x) === Infinity; + } + + /** + * Basic type checking of object properties. + * @param {Object} object + * @param {String[]} properties + * @param {String[]} types + */ + _ensureTypes(object, properties, types) { + const _scope = _fileScope('_ensureTypes'); + + if (!(object && properties && types)) { + this.logger.error(_scope, 'undefined argument', { object, properties, types }); + throw new DatabaseErrors.DataValidation(); + } + properties.forEach((p) => { + // eslint-disable-next-line security/detect-object-injection + const pObj = object[p]; + const pType = typeof pObj; + if (!types.includes(pType) + && !(types.includes('array') && Array.isArray(pObj)) + && !(types.includes('buffer') && pObj instanceof Buffer) + && !(types.includes('date') && pObj instanceof Date) + && !(types.includes('infinites')) + && !(types.includes('null') && pObj === null) + && !(types.includes('number') && pType === 'bigint') + && !(types.includes('uuid') && Database._isUUID(pObj))) { + const reason = `'${p}' is '${pType}', but must be ${types.length > 1 ? 'one of ' : ''}'${types}'`; + this.logger.error(_scope, reason, {}); + throw new DatabaseErrors.DataValidation(reason); + } + }); + } + + + /** + * @typedef {Object} Authentication + * @property {String} identifier + * @property {String=} credential + * @property {Date} created + * @property {Date=} lastAuthenticated + */ + /** + * @param {Authentication} authentication + */ + _validateAuthentication(authentication) { + [ + [['identifier'], ['string']], + [['credential'], ['string', 'null']], + [['created'], ['date']], + [['lastAuthenticated'], ['date', 'infinites']], + ].forEach(([properties, types]) => this._ensureTypes(authentication, properties, types)); + } + + + /** + * @typedef {Object} Resource + * @property {String} resourceId - uuid + * @property {String} secret + * @property {String} description + * @property {Date} created + */ + /** + * @param {Resource} resource + */ + _validateResource(resource) { + [ + [['resourceId', 'secret', 'description'], ['string']], + [['resourceId'], ['uuid']], + [['created'], ['date']], + ].forEach(([properties, types]) => this._ensureTypes(resource, properties, types)); + } + + + /** + * @typedef {Object} Token + * @property {String} codeId - uuid + * @property {String} profile + * @property {Date} created + * @property {Date=} expires + * @property {Date=} refreshExpires + * @property {Date=} refreshed + * @property {*=} duration + * @property {*=} refreshDuration + * @property {Number|BigInt=} refresh_count + * @property {Boolean} is_revoked + * @property {Boolean} is_token + * @property {String} client_id + * @property {String[]} scopes + * @property {Object=} profileData + */ + /** + * @param {Token} token + */ + _validateToken(token) { + [ + [['codeId', 'profile', 'clientId'], ['string']], + [['codeId'], ['uuid']], + [['created'], ['date']], + [['expires', 'refreshExpires', 'refreshed'], ['date', 'null']], + [['isToken', 'isRevoked'], ['boolean']], + [['scopes'], ['array']], + [['profileData'], ['object', 'null']], + ].forEach(([properties, types]) => this._ensureTypes(token, properties, types)); + this._ensureTypes(token.scopes, Object.keys(token.scopes), ['string']); + } + + + /** + * Interface methods need implementations. Ensure the db-interaction + * methods on the base class call this, so they may be overridden by + * implementation classes. + * @param {String} method + * @param {arguments} args + */ + _notImplemented(method, args) { + this.logger.error(_fileScope(method), 'abstract method called', Array.from(args)); + throw new DatabaseErrors.NotImplemented(method); + } + + + /** + * Get all the almanac entries. + * @param {*} dbCtx + */ + async almanacGetAll(dbCtx) { + this._notImplemented('almanacGetAll', arguments); + } + + + /** + * Fetch the authentication record for an identifier. + * @param {*} dbCtx + * @param {String} identifier + * @returns {Promise} + */ + async authenticationGet(dbCtx, identifier) { + this._notImplemented('authenticationGet', arguments); + } + + + /** + * Update the authentication record for the identifier that + * correct credentials have been supplied. + * @param {*} dbCtx + * @param {String} identifier + * @returns {Promise} + */ + async authenticationSuccess(dbCtx, identifier) { + this._notImplemented('authenticationSuccess', arguments); + } + + + /** + * Insert or update the credential for an identifier. + * @param {*} dbCtx + * @param {String} identifier + * @param {String} credential + * @returns {Promise} + */ + async authenticationUpsert(dbCtx, identifier, credential) { + this._notImplemented('authenticationUpsert', arguments); + } + + + /** + * Determine if profile url is known to this service. + * @param {*} dbCtx + * @param {String} profile + * @returns {Promise} + */ + async profileIsValid(dbCtx, profile) { + this._notImplemented('profileGet', arguments); + } + + + /** + * Insert a new relationship between a profile endpoint and + * an authenticated identifier. + * @param {*} dbCtx + * @param {String} profile + * @param {String} identifier + * @returns {Promise} + */ + async profileIdentifierInsert(dbCtx, profile, identifier) { + this._notImplemented('profileIdentifierInsert', arguments); + } + + + /** + * Adds a scope to be available for a profile to include on any authorization request. + * @param {*} dbCtx + * @param {String} profile + * @param {String} scope + * @returns {Promise} + */ + async profileScopeInsert(dbCtx, profile, scope) { + this._notImplemented('profileScopeInsert', arguments); + } + + + /** + * @typedef {Object} ScopeDetails + * @property {String} description + * @property {String[]=} profiles + */ + /** + * @typedef {Object.} ProfileScopes + * @property {Object.} profile + * @property {Object.} profile.scope + */ + /** + * @typedef {Object.} ScopeIndex + * @property {ScopeDetails} scope + */ + /** + * @typedef {Object} ProfilesScopesReturn + * @property {ProfileScopes} profileScopes + * @property {ScopeIndex} scopeIndex + * @property {String[]} profiles + */ + /** + * Returns an object containing: + * - an object with profiles as keys to objects with scopes as keys to scope objects, + * which each contain a description of the scope and a list of profiles offering it + * - an object with scopes as keys to the same scope objects + * - a list of profiles + * @param {*} dbCtx + * @param {String} identifier + * @returns {Promise} + */ + async profilesScopesByIdentifier(dbCtx, identifier) { + this._notImplemented('profilesScopesByIdentifier', arguments); + } + + + /** + * @typedef ProfileScopesRow + * @property profile + * @property scope + * @property description + * @property application + * @property isPermanent + * @property isManuallyAdded + */ + /** + * Convert db row data into associative structures. + * Same behavior is shared by multiple engines. + * @param {ProfileScopesRow[]} profileScopesRows + * @returns {ProfileScopesReturn} + */ + static _profilesScopesBuilder(profileScopesRows) { + const scopeIndex = {}; + const profileScopes = {}; + const profileSet = new Set(); + + (profileScopesRows || []).forEach(({ profile, scope, description, application, isPermanent, isManuallyAdded }) => { + if (scope && !(scope in scopeIndex)) { + scopeIndex[scope] = { // eslint-disable-line security/detect-object-injection + description, + application, + isPermanent, + isManuallyAdded, + profiles: [], + }; + } + if (profile) { + profileSet.add(profile); + if (!(profile in profileScopes)) { + profileScopes[profile] = {}; // eslint-disable-line security/detect-object-injection + } + } + if (profile && scope) { + scopeIndex[scope].profiles.push(profile); // eslint-disable-line security/detect-object-injection + profileScopes[profile][scope] = scopeIndex[scope]; // eslint-disable-line security/detect-object-injection + } + }); + + return { + profiles: [...profileSet], + profileScopes, + scopeIndex, + }; + } + + + /** + * Sets list of additional scopes available to profile. + * @param {*} dbCtx + * @param {String} profile + * @param {String[]} scopes + * @returns {Promise} + */ + async profileScopesSetAll(dbCtx, profile, scopes) { + this._notImplemented('profileScopesSetAll', arguments); + } + + + /** + * Create (or revoke a duplicate) code as a token entry. + * @param {*} dbCtx + * @param {Object} data + * @param {String} data.codeId + * @param {Date} data.created + * @param {Boolean} data.isToken + * @param {String} data.clientId + * @param {String} data.profile - profile uri + * @param {String} data.identifier + * @param {String[]} data.scopes + * @param {Number|Null} data.lifespanSeconds - null sets expiration to Infinity + * @param {Number|Null} data.refreshLifespanSeconds - null sets refresh to none + * @param {String|Null} data.resource + * @param {Object|Null} data.profileData - profile data from profile uri + * @returns {Promise} whether redemption was successful + */ + async redeemCode(dbCtx, { codeId, created, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, profileData } = {}) { + this._notImplemented('redeemCode', arguments); + } + + + /** + * @typedef {Object} RefreshedToken + * @property {Date} expires + * @property {Date} refreshExpires + * @property {String[]=} scopes if scopes were reduced + */ + /** + * Redeem a refresh token to renew token codeId. + * @param {*} dbCtx + * @param {String} codeId + * @param {Date} refreshed + * @param {String[]} removeScopes + * @returns {Promise} + */ + async refreshCode(dbCtx, codeId, refreshed, removeScopes) { + this._notImplemented('refreshCode', arguments); + } + + + /** + * Fetch a resource server record. + * @param {*} dbCtx + * @param {String} identifier uuid + * @returns {Promise} + */ + async resourceGet(dbCtx, resourceId) { + this._notImplemented('resourceGet', arguments); + } + + + /** + * Create, or update description of, a resourceId. + * @param {*} dbCtx + * @param {String=} resourceId uuid + * @param {String=} secret + * @param {String=} description + * @returns {Promise} + */ + async resourceUpsert(dbCtx, resourceId, secret, description) { + this._notImplemented('resourceUpsert', arguments); + } + + + /** + * Register a scope and its description. + * @param {*} dbCtx + * @param {String} scope + * @param {String} application + * @param {String} description + * @returns {Promise} + */ + async scopeUpsert(dbCtx, scope, application, description, manuallyAdded = false) { + this._notImplemented('scopeUpsert', arguments); + } + + + /** + * Remove a non-permanent scope if it is not currently in use. + * @param {*} dbCtx + * @param {String} scope + * @returns {Promise} + */ + async scopeDelete(dbCtx, scope) { + this._notImplemented('scopeDelete', arguments); + } + + + /** + * @typedef {Number|BigInt} CleanupResult + */ + /** + * @typedef {Object} CleanupResult + */ + /** + * Remove any non-permanent and non-manually-created scopes not currently in use. + * @param {*} dbCtx + * @param {Number} atLeastMsSinceLast skip cleanup if already executed this recently + * @returns {Promise} + */ + async scopeCleanup(dbCtx, atLeastMsSinceLast) { + this._notImplemented('scopeClean', arguments); + } + + + /** + * Forget tokens after they have expired, and redeemed codes after they have expired. + * @param {*} dbCtx + * @param {Number} codeLifespanSeconds + * @param {Number} atLeastMsSinceLast skip cleanup if already executed this recently + * @returns {Promise} + */ + async tokenCleanup(dbCtx, codeLifespanSeconds, atLeastMsSinceLast) { + this._notImplemented('tokenCleanup', arguments); + } + + + /** + * Look up a redeemed token by code_id. + * @param {*} dbCtx + * @param {String} codeId + * @returns {Promise} + */ + async tokenGetByCodeId(dbCtx, codeId) { + this._notImplemented('tokenGetByCodeId', arguments); + } + + + /** + * Sets a redeemed token as revoked. + * @param {*} dbCtx + * @param {String} codeId - uuid + * @returns {Promise} + */ + async tokenRevokeByCodeId(dbCtx, codeId) { + this._notImplemented('tokenRevokeByCodeId', arguments); + } + + + /** + * Revoke the refreshability of a codeId. + * @param {*} dbCtx + * @param {String} codeId - uuid + * @returns {Promise} + */ + async tokenRefreshRevokeByCodeId(dbCtx, codeId) { + this._notImplemented('tokenRefreshRevokeByCodeId', arguments); + } + + + /** + * Get all tokens assigned to identifier. + * @param {*} dbCtx + * @param {String} identifier + * @returns {Promise} + */ + async tokensGetByIdentifier(dbCtx, identifier) { + this._notImplemented('tokensGetByIdentifier', arguments); + } + +} + +module.exports = Database; \ No newline at end of file diff --git a/src/db/errors.js b/src/db/errors.js new file mode 100644 index 0000000..cd43239 --- /dev/null +++ b/src/db/errors.js @@ -0,0 +1,56 @@ +'use strict'; + +class DatabaseError extends Error { + constructor(...args) { + super(...args); + Error.captureStackTrace(DatabaseError); + } + + get name() { + /* istanbul ignore next */ + return this.constructor.name; + } +} + +class DataValidation extends DatabaseError { + constructor(...args) { + super(...args); + Error.captureStackTrace(DataValidation); + } +} + +class NotImplemented extends DatabaseError { + constructor(...args) { + super(...args); + Error.captureStackTrace(NotImplemented); + } +} + +class UnexpectedResult extends DatabaseError { + constructor(...args) { + super(...args); + Error.captureStackTrace(UnexpectedResult); + } +} + +class UnsupportedEngine extends DatabaseError { + constructor(...args) { + super(...args); + Error.captureStackTrace(UnsupportedEngine); + } +} + +class MigrationNeeded extends DatabaseError { + constructor(...args) { + super(...args); + } +} + +module.exports = { + DatabaseError, + DataValidation, + MigrationNeeded, + NotImplemented, + UnexpectedResult, + UnsupportedEngine, +}; diff --git a/src/db/index.js b/src/db/index.js new file mode 100644 index 0000000..0d5ef16 --- /dev/null +++ b/src/db/index.js @@ -0,0 +1,42 @@ +'use strict'; + +const common = require('../common'); +const DatabaseErrors = require('./errors'); + +const _fileScope = common.fileScope(__filename); + +class DatabaseFactory { + constructor(logger, options, ...rest) { + const _scope = _fileScope('constructor'); + + const connectionString = options.db.connectionString || ''; + const protocol = connectionString.slice(0, connectionString.indexOf('://')).toLowerCase(); + + let Engine; + switch (protocol) { + case DatabaseFactory.Engines.PostgreSQL: + Engine = require('./postgres'); + break; + + case DatabaseFactory.Engines.SQLite: + Engine = require('./sqlite'); + break; + + default: + logger.error(_scope, 'unsupported connectionString', { protocol, options }); + throw new DatabaseErrors.UnsupportedEngine(protocol); + } + + return new Engine(logger, options, ...rest); + } + + static get Engines() { + return { + PostgreSQL: 'postgresql', + SQLite: 'sqlite', + }; + } + +} + +module.exports = DatabaseFactory; diff --git a/src/db/postgres/index.js b/src/db/postgres/index.js new file mode 100644 index 0000000..54c6e9b --- /dev/null +++ b/src/db/postgres/index.js @@ -0,0 +1,638 @@ +/* eslint-disable security/detect-object-injection */ +'use strict'; + +const pgpInitOptions = { + capSQL: true, +}; + +const path = require('path'); +const pgp = require('pg-promise')(pgpInitOptions); +const svh = require('../schema-version-helper'); +const Database = require('../abstract'); +const DBErrors = require('../errors'); +const common = require('../../common'); + +const _fileScope = common.fileScope(__filename); + +const PGTypeIdINT8 = 20; // Type Id 20 == INT8 (BIGINT) +const PGTYpeIdINT8Array = 1016; //Type Id 1016 == INT8[] (BIGINT[]) +pgp.pg.types.setTypeParser(PGTypeIdINT8, BigInt); // Type Id 20 = INT8 (BIGINT) +const parseBigIntArray = pgp.pg.types.getTypeParser(PGTYpeIdINT8Array); // Type Id 1016 = INT8[] (BIGINT[]) +pgp.pg.types.setTypeParser(PGTYpeIdINT8Array, (a) => parseBigIntArray(a).map(BigInt)); + +const schemaVersionsSupported = { + min: { + major: 1, + minor: 0, + patch: 0, + }, + max: { + major: 1, + minor: 0, + patch: 0, + }, +}; + +class DatabasePostgres extends Database { + constructor(logger, options, _pgp = pgp) { + super(logger, options); + + this.db = _pgp(options.db.connectionString); + this.schemaVersionsSupported = schemaVersionsSupported; + + // Suppress QF warnings when running tests + this.noWarnings = options.db.noWarnings; + + // Log queries + const queryLogLevel = options.db.queryLogLevel; + if (queryLogLevel) { + const queryScope = _fileScope('pgp:query'); + pgpInitOptions.query = (event) => { + this.logger[queryLogLevel](queryScope, '', { ...common.pick(event, ['query', 'params']) }); + }; + } + + // Log errors + const errorScope = _fileScope('pgp:error'); + pgpInitOptions.error = (err, event) => { + this.logger.error(errorScope, '', { err, event }); + }; + + // Deophidiate column names in-place, log results + pgpInitOptions.receive = (data, result, event) => { + const exemplaryRow = data[0]; + for (const prop in exemplaryRow) { + const camel = common.camelfy(prop); + if (!(camel in exemplaryRow)) { + for (const d of data) { + d[camel] = d[prop]; + delete d[prop]; + } + } + } + if (queryLogLevel) { + // Omitting .rows + const resultLog = common.pick(result, ['command', 'rowCount', 'duration']); + this.logger[queryLogLevel](_fileScope('pgp:result'), '', { query: event.query, ...resultLog }); + } + }; + + // Expose these for test coverage + this.pgpInitOptions = pgpInitOptions; + this._pgp = _pgp; + + this._initStatements(_pgp); + } + + + _queryFileHelper(_pgp) { + return (file) => { + const _scope = _fileScope('_queryFile'); + /* istanbul ignore next */ + const qfParams = { + minify: true, + ...(this.noWarnings && { noWarnings: this.noWarnings }), + }; + const qf = new _pgp.QueryFile(file, qfParams); + if (qf.error) { + this.logger.error(_scope, 'failed to create SQL statement', { error: qf.error, file }); + throw qf.error; + } + return qf; + }; + } + + + async initialize(applyMigrations = true) { + const _scope = _fileScope('initialize'); + this.logger.debug(_scope, 'called', { applyMigrations }); + if (applyMigrations) { + await this._initTables(); + } + await super.initialize(); + if (this.listener) { + await this.listener.start(); + } + } + + + async _initTables(_pgp) { + const _scope = _fileScope('_initTables'); + this.logger.debug(_scope, 'called', {}); + + const _queryFile = this._queryFileHelper(_pgp || this._pgp); + + // Migrations rely upon this table, ensure it exists. + const metaVersionTable = '_meta_schema_version'; + + const tableExists = async (name) => this.db.oneOrNone('SELECT table_name FROM information_schema.tables WHERE table_name=$(name)', { name }); + let metaExists = await tableExists(metaVersionTable); + if (!metaExists) { + const fPath = path.join(__dirname, 'sql', 'schema', 'init.sql'); + const initSql = _queryFile(fPath); + const results = await this.db.multiResult(initSql); + this.logger.debug(_scope, 'executed init sql', { results }); + metaExists = await tableExists(metaVersionTable); + /* istanbul ignore if */ + if (!metaExists) { + throw new DBErrors.UnexpectedResult(`did not create ${metaVersionTable} table`); + } + this.logger.info(_scope, 'created schema version table', { metaVersionTable }); + } + + // Apply migrations + const currentSchema = await this._currentSchema(); + const migrationsWanted = svh.unappliedSchemaVersions(__dirname, currentSchema, this.schemaVersionsSupported); + this.logger.debug(_scope, 'schema migrations wanted', { migrationsWanted }); + for (const v of migrationsWanted) { + const fPath = path.join(__dirname, 'sql', 'schema', v, 'apply.sql'); + const migrationSql = _queryFile(fPath); + const results = await this.db.multiResult(migrationSql); + this.logger.debug(_scope, 'executed migration sql', { version: v, results }); + this.logger.info(_scope, 'applied migration', { version: v }); + } + } + + + _initStatements(_pgp) { + const _scope = _fileScope('_initStatements'); + const _queryFile = this._queryFileHelper(_pgp); + this.statement = _pgp.utils.enumSql(path.join(__dirname, 'sql'), {}, _queryFile); + this.logger.debug(_scope, 'statements initialized', { statements: Object.keys(this.statement).length }); + } + + + async healthCheck() { + const _scope = _fileScope('healthCheck'); + this.logger.debug(_scope, 'called', {}); + const c = await this.db.connect(); + c.done(); + return { serverVersion: c.client.serverVersion }; + } + + + async _currentSchema() { + return this.db.one('SELECT major, minor, patch FROM _meta_schema_version ORDER BY major DESC, minor DESC, patch DESC LIMIT 1'); + } + + + async _closeConnection() { + const _scope = _fileScope('_closeConnection'); + try { + if (this.listener) { + await this.listener.stop(); + } + await this._pgp.end(); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e }); + throw e; + } + } + + + /* istanbul ignore next */ + async _purgeTables(really = false) { + const _scope = _fileScope('_purgeTables'); + try { + if (really) { + await this.db.tx(async (t) => { + await t.batch([ + 'authentication', + 'resource', + 'profile', + 'token', + ].map(async (table) => t.query('TRUNCATE TABLE $(table:name) CASCADE', { table }))); + }); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e }); + throw e; + } + } + + + async context(fn) { + return this.db.task(async (t) => fn(t)); + } + + + // eslint-disable-next-line class-methods-use-this + async transaction(dbCtx, fn) { + return dbCtx.txIf(async (t) => fn(t)); + } + + + async almanacGetAll(dbCtx) { + const _scope = _fileScope('almanacGetAll'); + this.logger.debug(_scope, 'called'); + + try { + return await dbCtx.manyOrNone(this.statement.almanacGetAll); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e }); + throw e; + } + } + + + async authenticationGet(dbCtx, identifier) { + const _scope = _fileScope('authenticationGet'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + return await dbCtx.oneOrNone(this.statement.authenticationGet, { identifier }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + + + async authenticationSuccess(dbCtx, identifier) { + const _scope = _fileScope('authenticationSuccess'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + const result = await dbCtx.result(this.statement.authenticationSuccess, { identifier }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not update authentication success event'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + + + async authenticationUpsert(dbCtx, identifier, credential) { + const _scope = _fileScope('authenticationUpsert'); + const scrubbedCredential = '*'.repeat((credential || '').length); + this.logger.debug(_scope, 'called', { identifier, scrubbedCredential }); + + try { + const result = await dbCtx.result(this.statement.authenticationUpsert, { identifier, credential }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not upsert authentication'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier, scrubbedCredential }); + throw e; + } + } + + + async profileIdentifierInsert(dbCtx, profile, identifier) { + const _scope = _fileScope('profileIdentifierInsert'); + this.logger.debug(_scope, 'called', { profile, identifier }); + + try { + const result = await dbCtx.result(this.statement.profileIdentifierInsert, { profile, identifier }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not insert identifier'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile, identifier }); + throw e; + } + } + + + async profileIsValid(dbCtx, profile) { + const _scope = _fileScope('profileIsValid'); + this.logger.debug(_scope, 'called', { profile }); + + try { + const profileResponse = await dbCtx.oneOrNone(this.statement.profileGet, { profile }); + return !!profileResponse; + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile }); + throw e; + } + } + + + async profileScopeInsert(dbCtx, profile, scope) { + const _scope = _fileScope('profileScopeInsert'); + this.logger.debug(_scope, 'called', { profile, scope }); + + try { + const result = await dbCtx.result(this.statement.profileScopeInsert, { profile, scope }); + // Duplicate inserts get ignored + if (result.rowCount != 1 && result.rowCount != 0) { + throw new DBErrors.UnexpectedResult('did not insert profile scope'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile, scope }); + throw e; + } + } + + + async profileScopesSetAll(dbCtx, profile, scopes) { + const _scope = _fileScope('profileScopesSetAll'); + this.logger.debug(_scope, 'called', { profile, scopes }); + + try { + await this.transaction(dbCtx, async (txCtx) => { + await txCtx.result(this.statement.profileScopesClear, { profile }); + if (scopes.length) { + await txCtx.result(this.statement.profileScopesSetAll, { profile, scopes }); + } + }); // transaction + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile, scopes }); + throw e; + } + } + + + async profilesScopesByIdentifier(dbCtx, identifier) { + const _scope = _fileScope('profilesScopesByIdentifier'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + const profileScopesRows = await dbCtx.manyOrNone(this.statement.profilesScopesByIdentifier, { identifier }); + return Database._profilesScopesBuilder(profileScopesRows); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + + + async redeemCode(dbCtx, { codeId, created, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, resource, profileData }) { + const _scope = _fileScope('redeemCode'); + this.logger.debug(_scope, 'called', { codeId, created, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, resource, profileData }); + + let result, ret = false; + try { + await this.transaction(dbCtx, async (txCtx) => { + result = await txCtx.result(this.statement.redeemCode, { codeId, created, isToken, clientId, profile, identifier, lifespanSeconds, refreshLifespanSeconds, resource, profileData }); + if (result.rowCount != 1) { + this.logger.error(_scope, 'failed', { result }); + throw new DBErrors.UnexpectedResult('did not redeem code'); + } + // Abort and return false if redemption resulted in revocation. + if (result.rows[0].isRevoked) { + return; + } + this.logger.debug(_scope, 'code redeemed', { redeemed: result.rows[0] }); + + // Ensure there are entries for all scopes. + if (scopes.length !== 0) { + await txCtx.result(this.statement.scopesInsert, { scopes }); + } + + // Record accepted scopes for this token. + result = await txCtx.result(this.statement.tokenScopesSet, { codeId, scopes }); + if (result.rowCount != scopes.length) { + this.logger.error(_scope, 'token scope count mismatch', { codeId, scopes, result }); + throw new DBErrors.UnexpectedResult('did not set all scopes on token'); + } + ret = true; + }); // txCtx + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId, created, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, profileData }); + throw e; + } + + return ret; + } + + + async refreshCode(dbCtx, codeId, refreshed, removeScopes) { + const _scope = _fileScope('refreshCode'); + this.logger.debug(_scope, 'called', { codeId, refreshed, removeScopes }); + + try { + return await this.transaction(dbCtx, async (txCtx) => { + const refreshedToken = await txCtx.oneOrNone(this.statement.refreshCode, { codeId, refreshed }); + if (refreshedToken) { + if (removeScopes.length) { + const removeResult = await txCtx.result(this.statement.tokenScopesRemove, { codeId, removeScopes }); + if (removeResult.rowCount != removeScopes.length) { + this.logger.error(_scope, 'failed to remove token scopes', { actual: removeResult.rowCount, expected: removeScopes.length }); + throw new DBErrors.UnexpectedResult('did not remove scopes from token'); + } + } else { + delete refreshedToken.scopes; // Not updated, remove from response. + } + } else { + this.logger.debug(_scope, 'did not refresh token', {}); + } + return refreshedToken; + }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + async resourceGet(dbCtx, resourceId) { + const _scope = _fileScope('resourceGet'); + this.logger.debug(_scope, 'called', { resourceId }); + + try { + return await dbCtx.oneOrNone(this.statement.resourceGet, { resourceId }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, resourceId }); + throw e; + } + } + + + async resourceUpsert(dbCtx, resourceId, secret, description) { + const _scope = _fileScope('resourceUpsert'); + const logSecret = secret?.length && common.logTruncate('*'.repeat(secret.length), 3) || undefined; + this.logger.debug(_scope, 'called', { resourceId, secret: logSecret, description }); + + try { + const result = await dbCtx.result(this.statement.resourceUpsert, { resourceId, secret, description }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not upsert resource'); + } + return result.rows[0]; + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, resourceId, secret: logSecret, description }); + throw e; + } + } + + + async scopeCleanup(dbCtx, atLeastMsSinceLast) { + const _scope = _fileScope('scopeCleanup'); + this.logger.debug(_scope, 'called', { atLeastMsSinceLast }); + + const almanacEvent = 'scopeCleanup'; + try { + return await this.transaction(dbCtx, async (txCtx) => { + + // Check that enough time has passed since last cleanup + const now = new Date(); + const cleanupNotAfter = new Date(now.getTime() - atLeastMsSinceLast); + const { date: lastCleanupDate } = await txCtx.oneOrNone(this.statement.almanacGet, { event: almanacEvent }) || { date: new Date(0) }; + if (lastCleanupDate >= cleanupNotAfter) { + this.logger.debug(_scope, 'skipping token cleanup, too soon', { lastCleanupDate, cleanupNotAfter, atLeastMsSinceLast }); + return; + } + + // Do the cleanup + const { rowCount: scopesRemoved } = await txCtx.result(this.statement.scopeCleanup); + + // Update the last cleanup time + const result = await txCtx.result(this.statement.almanacUpsert, { event: almanacEvent, date: now }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not update almanac'); + } + + this.logger.debug(_scope, 'completed', { scopesRemoved, atLeastMsSinceLast }); + return scopesRemoved; + }); // tx + + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, atLeastMsSinceLast }); + throw e; + } + } + + + async scopeDelete(dbCtx, scope) { + const _scope = _fileScope('scopeDelete'); + this.logger.debug(_scope, 'called', { scope }); + + try { + return await this.transaction(dbCtx, async (txCtx) => { + const { inUse } = await txCtx.one(this.statement.scopeInUse, { scope }); + if (inUse) { + this.logger.debug(_scope, 'not deleted, in use', { scope }); + return false; + } + const result = await txCtx.result(this.statement.scopeDelete, { scope }); + if (result.rowCount == 0) { + this.logger.debug(_scope, 'no such scope', { scope }); + } else { + this.logger.debug(_scope, 'deleted', { scope }); + } + return true; + }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, scope }); + throw e; + } + } + + + async scopeUpsert(dbCtx, scope, application, description, manuallyAdded = false) { + const _scope = _fileScope('scopeUpsert'); + this.logger.debug(_scope, 'called', { scope, description }); + + try { + const result = await dbCtx.result(this.statement.scopeUpsert, { scope, application, description, manuallyAdded }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not upsert scope'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, scope, application, description }); + throw e; + } + } + + + async tokenCleanup(dbCtx, codeLifespanSeconds, atLeastMsSinceLast) { + const _scope = _fileScope('tokenCleanup'); + this.logger.debug(_scope, 'called', { codeLifespanSeconds, atLeastMsSinceLast }); + + const almanacEvent = 'tokenCleanup'; + try { + return await this.transaction(dbCtx, async (txCtx) => { + + // Check that enough time has passed since last cleanup + const now = new Date(); + const cleanupNotAfter = new Date(now.getTime() - atLeastMsSinceLast); + const { date: lastCleanupDate } = await txCtx.oneOrNone(this.statement.almanacGet, { event: almanacEvent }) || { date: new Date(0) }; + if (lastCleanupDate >= cleanupNotAfter) { + this.logger.debug(_scope, 'skipping token cleanup, too soon', { lastCleanupDate, cleanupNotAfter, codeLifespanSeconds, atLeastMsSinceLast }); + return; + } + + // Do the cleanup + const { rowCount: tokensRemoved } = await txCtx.result(this.statement.tokenCleanup, { codeLifespanSeconds }); + + // Update the last cleanup time + const result = await txCtx.result(this.statement.almanacUpsert, { event: almanacEvent, date: now }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not update almanac'); + } + + this.logger.debug(_scope, 'completed', { tokensRemoved, codeLifespanSeconds, atLeastMsSinceLast }); + return tokensRemoved; + }); // tx + + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, atLeastMsSinceLast }); + throw e; + } + } + + + async tokenGetByCodeId(dbCtx, codeId) { + const _scope = _fileScope('tokenGetByCodeId'); + this.logger.debug(_scope, 'called', { codeId }); + + try { + return await dbCtx.oneOrNone(this.statement.tokenGetByCodeId, { codeId }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + async tokenRevokeByCodeId(dbCtx, codeId) { + const _scope = _fileScope('tokenRevokeByCodeId'); + this.logger.debug(_scope, 'called', { codeId }); + + try { + const result = await dbCtx.result(this.statement.tokenRevokeByCodeId, { codeId }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not revoke token'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + async tokenRefreshRevokeByCodeId(dbCtx, codeId) { + const _scope = _fileScope('tokenRefreshRevokeByCodeId'); + this.logger.debug(_scope, 'called', { codeId }); + + try { + const result = await dbCtx.result(this.statement.tokenRefreshRevokeByCodeId, { codeId }); + if (result.rowCount != 1) { + throw new DBErrors.UnexpectedResult('did not revoke token'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + async tokensGetByIdentifier(dbCtx, identifier) { + const _scope = _fileScope('tokensGetByIdentifier'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + return await dbCtx.manyOrNone(this.statement.tokensGetByIdentifier, { identifier }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + +} + +module.exports = DatabasePostgres; diff --git a/src/db/postgres/sql/almanac-get-all.sql b/src/db/postgres/sql/almanac-get-all.sql new file mode 100644 index 0000000..b534d20 --- /dev/null +++ b/src/db/postgres/sql/almanac-get-all.sql @@ -0,0 +1,3 @@ +-- +SELECT * FROM almanac + diff --git a/src/db/postgres/sql/almanac-get.sql b/src/db/postgres/sql/almanac-get.sql new file mode 100644 index 0000000..077dfe2 --- /dev/null +++ b/src/db/postgres/sql/almanac-get.sql @@ -0,0 +1,6 @@ +-- +SELECT date +FROM almanac +WHERE event = $(event) +FOR UPDATE + diff --git a/src/db/postgres/sql/almanac-upsert.sql b/src/db/postgres/sql/almanac-upsert.sql new file mode 100644 index 0000000..4bda1bc --- /dev/null +++ b/src/db/postgres/sql/almanac-upsert.sql @@ -0,0 +1,9 @@ +-- +INSERT INTO almanac + (event, date) +VALUES + ($(event), $(date)) +ON CONFLICT (event) DO UPDATE +SET + date = $(date) + diff --git a/src/db/postgres/sql/authentication-get.sql b/src/db/postgres/sql/authentication-get.sql new file mode 100644 index 0000000..f75533e --- /dev/null +++ b/src/db/postgres/sql/authentication-get.sql @@ -0,0 +1,4 @@ +-- +SELECT * +FROM authentication +WHERE identifier = $(identifier) diff --git a/src/db/postgres/sql/authentication-success.sql b/src/db/postgres/sql/authentication-success.sql new file mode 100644 index 0000000..81983ea --- /dev/null +++ b/src/db/postgres/sql/authentication-success.sql @@ -0,0 +1,4 @@ +-- +UPDATE authentication + SET last_authentication = now() + WHERE identifier = $(identifier) diff --git a/src/db/postgres/sql/authentication-upsert.sql b/src/db/postgres/sql/authentication-upsert.sql new file mode 100644 index 0000000..e86d4fb --- /dev/null +++ b/src/db/postgres/sql/authentication-upsert.sql @@ -0,0 +1,9 @@ +-- +INSERT INTO authentication + (identifier, credential) +VALUES + ($(identifier), $(credential)) +ON CONFLICT (identifier) DO UPDATE +SET + identifier = $(identifier), + credential = $(credential) diff --git a/src/db/postgres/sql/profile-get.sql b/src/db/postgres/sql/profile-get.sql new file mode 100644 index 0000000..e4172d1 --- /dev/null +++ b/src/db/postgres/sql/profile-get.sql @@ -0,0 +1,3 @@ +-- +SELECT * FROM profile +WHERE profile = $(profile) diff --git a/src/db/postgres/sql/profile-identifier-insert.sql b/src/db/postgres/sql/profile-identifier-insert.sql new file mode 100644 index 0000000..2c42fac --- /dev/null +++ b/src/db/postgres/sql/profile-identifier-insert.sql @@ -0,0 +1,4 @@ +-- +INSERT INTO profile (profile, identifier_id) + SELECT $(profile), identifier_id FROM authentication WHERE identifier = $(identifier) +ON CONFLICT (identifier_id, profile) DO NOTHING diff --git a/src/db/postgres/sql/profile-scope-insert.sql b/src/db/postgres/sql/profile-scope-insert.sql new file mode 100644 index 0000000..26cc6bb --- /dev/null +++ b/src/db/postgres/sql/profile-scope-insert.sql @@ -0,0 +1,5 @@ +-- +INSERT INTO profile_scope (profile_id, scope_id) + SELECT p.profile_id, s.scope_id FROM profile p, scope s + WHERE p.profile = $(profile) AND s.scope = $(scope) +ON CONFLICT (profile_id, scope_id) DO NOTHING diff --git a/src/db/postgres/sql/profile-scopes-clear.sql b/src/db/postgres/sql/profile-scopes-clear.sql new file mode 100644 index 0000000..bd7827b --- /dev/null +++ b/src/db/postgres/sql/profile-scopes-clear.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM profile_scope +WHERE profile_id IN ( + SELECT profile_id FROM profile WHERE profile = $(profile) +) + diff --git a/src/db/postgres/sql/profile-scopes-set-all.sql b/src/db/postgres/sql/profile-scopes-set-all.sql new file mode 100644 index 0000000..a7e74cf --- /dev/null +++ b/src/db/postgres/sql/profile-scopes-set-all.sql @@ -0,0 +1,5 @@ +-- +INSERT INTO profile_scope (profile_id, scope_id) + SELECT p.profile_id, s.scope_id FROM profile p, scope s + WHERE p.profile = $(profile) AND s.scope = ANY ($(scopes)) + diff --git a/src/db/postgres/sql/profiles-scopes-by-identifier.sql b/src/db/postgres/sql/profiles-scopes-by-identifier.sql new file mode 100644 index 0000000..525ced6 --- /dev/null +++ b/src/db/postgres/sql/profiles-scopes-by-identifier.sql @@ -0,0 +1,10 @@ +-- +SELECT p.profile, s.* + FROM profile p + INNER JOIN authentication a USING (identifier_id) + FULL JOIN profile_scope ps USING (profile_id) + FULL JOIN scope s USING (scope_id) + WHERE a.identifier = $(identifier) +UNION ALL SELECT NULL AS profile, * + FROM scope + WHERE is_manually_added OR is_permanent diff --git a/src/db/postgres/sql/redeem-code.sql b/src/db/postgres/sql/redeem-code.sql new file mode 100644 index 0000000..e61d503 --- /dev/null +++ b/src/db/postgres/sql/redeem-code.sql @@ -0,0 +1,30 @@ +-- +INSERT INTO token ( + created, + code_id, + is_token, + client_id, + profile_id, + duration, + expires, + refresh_duration, + refresh_expires, + resource, + profile_data +) SELECT + $(created)::timestamptz, + $(codeId), + $(isToken), + $(clientId), + p.profile_id, + $(lifespanSeconds)::text::interval, + CASE WHEN $(lifespanSeconds) IS NULL THEN NULL ELSE $(created)::timestamptz + $(lifespanSeconds)::text::interval END, + $(refreshLifespanSeconds)::text::interval, + CASE WHEN $(refreshLifespanSeconds) IS NULL THEN NULL ELSE $(created)::timestamptz + $(refreshLifespanSeconds)::text::interval END, + $(resource), + $(profileData) +FROM profile p INNER JOIN authentication a USING (identifier_id) +WHERE p.profile = $(profile) AND a.identifier = $(identifier) +ON CONFLICT (code_id) DO UPDATE -- repeated redemption attempt invalidates existing token + SET is_revoked = true +RETURNING * diff --git a/src/db/postgres/sql/refresh-code.sql b/src/db/postgres/sql/refresh-code.sql new file mode 100644 index 0000000..339e488 --- /dev/null +++ b/src/db/postgres/sql/refresh-code.sql @@ -0,0 +1,19 @@ +-- +UPDATE token SET + expires = $(refreshed)::timestamptz + duration, + refreshed = $(refreshed)::timestamptz, + refresh_expires = $(refreshed)::timestamptz + refresh_duration, + refresh_count = refresh_count + 1 +WHERE + code_id = $(codeId) +AND + NOT is_revoked +AND + (refresh_expires IS NOT NULL AND refresh_expires > $(refreshed)::timestamptz) +RETURNING + expires, + refresh_expires, + ARRAY( + SELECT s.scope FROM token_scope ts INNER JOIN scope s USING (scope_id) + WHERE ts.code_id = code_id + ) AS scopes diff --git a/src/db/postgres/sql/resource-get.sql b/src/db/postgres/sql/resource-get.sql new file mode 100644 index 0000000..53100f1 --- /dev/null +++ b/src/db/postgres/sql/resource-get.sql @@ -0,0 +1,4 @@ +-- +SELECT * +FROM resource +WHERE resource_id = $(resourceId) diff --git a/src/db/postgres/sql/resource-upsert.sql b/src/db/postgres/sql/resource-upsert.sql new file mode 100644 index 0000000..51d4e94 --- /dev/null +++ b/src/db/postgres/sql/resource-upsert.sql @@ -0,0 +1,10 @@ +-- +INSERT INTO resource + (resource_id, secret, description) +VALUES + (COALESCE($(resourceId)::UUID, uuid_generate_v4()), $(secret), $(description)) +ON CONFLICT (resource_id) DO UPDATE +SET + secret = COALESCE(EXCLUDED.secret, resource.secret), + description = COALESCE(EXCLUDED.description, resource.description) +RETURNING * diff --git a/src/db/postgres/sql/schema/1.0.0/apply.sql b/src/db/postgres/sql/schema/1.0.0/apply.sql new file mode 100644 index 0000000..274dd7a --- /dev/null +++ b/src/db/postgres/sql/schema/1.0.0/apply.sql @@ -0,0 +1,147 @@ +BEGIN; + + CREATE TABLE almanac ( + event TEXT NOT NULL PRIMARY KEY, + date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT '-infinity'::timestamptz + ); + COMMENT ON TABLE almanac IS $docstring$ +Notable events for service administration. + $docstring$; + + CREATE TABLE authentication ( + identifier_id BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + last_authentication TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT '-infinity'::timestamptz, + identifier TEXT NOT NULL UNIQUE, + credential TEXT + ); + COMMENT ON TABLE authentication IS $docstring$ +Users and their credentials. + $docstring$; + + CREATE TABLE resource ( + resource_id UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(), -- few insertions, v4 preferred over v1 + description TEXT NOT NULL DEFAULT '', + created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + secret TEXT NOT NULL CHECK(length(secret) > 0) + ); + COMMENT ON TABLE resource IS $docstring$ +External resource servers and their credentials. + $docstring$; + + CREATE TABLE profile ( + profile_id BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + identifier_id BIGINT NOT NULL REFERENCES authentication(identifier_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + profile TEXT NOT NULL, + CONSTRAINT unique_identifier_id_profile UNIQUE (identifier_id, profile) + ); + CREATE INDEX profile_identifier_id_idx ON profile(identifier_id); + CREATE INDEX profile_profile_idx ON profile(profile); + COMMENT ON TABLE profile IS $docstring$ +Profile URIs and the users they are associated with. +$docstring$; + + CREATE TABLE scope ( + scope_id BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + scope TEXT NOT NULL UNIQUE, + description TEXT NOT NULL DEFAULT '', + application TEXT NOT NULL DEFAULT '', + is_permanent BOOLEAN NOT NULL DEFAULT false, + is_manually_added BOOLEAN NOT NULL DEFAULT false + ); + COMMENT ON TABLE scope IS $docstring$ +All and any scopes encountered. +$docstring$; + COMMENT ON COLUMN scope.is_permanent IS $docstring$ +Prevents deletion of scope, set on seeded scope rows. +$docstring$; + COMMENT ON COLUMN scope.is_manually_added IS $docstring$ +Prevents deletion of scope when no longer referenced, set on user-added scopes. +User can still delete manually. +$docstring$; + CREATE INDEX scope_garbage_collectable_idx ON scope(scope_id) WHERE NOT (is_permanent OR is_manually_added); + COMMENT ON INDEX scope_garbage_collectable_idx IS $docstring$ +Shadow the primary index with a partial to help GC cleanup of client-provided scopes. +$docstring$; + CREATE INDEX scope_is_permanent_idx ON scope(scope_id) WHERE is_permanent; + CREATE INDEX scope_is_manual_idx ON scope(scope_id) WHERE is_manually_added; + + CREATE TABLE profile_scope ( + profile_id BIGINT NOT NULL REFERENCES profile(profile_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + scope_id BIGINT NOT NULL REFERENCES scope(scope_id) ON DELETE NO ACTION ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + PRIMARY KEY (profile_id, scope_id) + ); + COMMENT ON TABLE profile_scope IS $docstring$ +Convenience bindings of available scopes for a profile. +$docstring$; + CREATE INDEX profile_scope_scope_id_idx ON profile_scope(scope_id); + + CREATE TABLE token ( + code_id UUID NOT NULL PRIMARY KEY, + profile_id BIGINT NOT NULL REFERENCES profile(profile_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + expires TIMESTAMP WITH TIME ZONE, + refresh_expires TIMESTAMP WITH TIME ZONE, + refreshed TIMESTAMP WITH TIME ZONE, + duration INTERVAL, + CONSTRAINT expires_needs_duration CHECK (expires IS NULL OR duration IS NOT NULL), + refresh_duration INTERVAL, + CONSTRAINT refresh_expires_needs_refresh_duration CHECK (refresh_expires IS NULL OR refresh_duration IS NOT NULL), + refresh_count BIGINT NOT NULL DEFAULT 0, + is_revoked BOOLEAN NOT NULL DEFAULT false, + is_token BOOLEAN NOT NULL, + client_id TEXT NOT NULL, + resource TEXT, + profile_data JSONB + ); + CREATE INDEX token_profile_id_idx ON token(profile_id); + CREATE INDEX token_created_idx ON token(created); + CREATE INDEX token_expires_idx ON token(expires); + CREATE INDEX token_refresh_expires_idx ON token(refresh_expires); + CREATE INDEX token_is_revoked_idx ON token(is_revoked) WHERE is_revoked; + COMMENT ON TABLE token IS $docstring$ +Redeemed codes and their current states. +$docstring$; + COMMENT ON COLUMN token.is_token IS $docstring$ +Whether code was redeemed for a token, or only a profile. +We track non-token redemptions to prevent re-redemption while +code is still valid. +$docstring$; + COMMENT ON COLUMN token.resource IS $docstring$ +Tokens granted by ticket redemption are associated with a +resource url for which they are valid. +$docstring$; + COMMENT ON INDEX token_is_revoked_idx IS $docstring$ +A partial index on revoked tokens, to ease cleanup query. +$docstring$; + + CREATE TABLE token_scope ( + code_id UUID NOT NULL REFERENCES token(code_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + scope_id BIGINT NOT NULL REFERENCES scope(scope_id) ON DELETE NO ACTION ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + PRIMARY KEY (code_id, scope_id) + ); + COMMENT ON TABLE token_scope IS $docstring$ +Scopes associated with a token. +$docstring$; + CREATE INDEX token_scope_scope_id_idx ON token_scope(scope_id); + + -- Update schema version + INSERT INTO _meta_schema_version (major, minor, patch) VALUES (1, 0, 0); + + -- Seed scope data + INSERT INTO scope (scope, description, application, is_permanent) VALUES + ('profile', 'Access detailed profile information, including name, image, and url.', 'IndieAuth', true), + ('email', 'Include email address with detailed profile information.', 'IndieAuth', true), + ('create', 'Create new items.', 'MicroPub', true), + ('draft', 'All created items are drafts.', 'MicroPub', true), + ('update', 'Edit existing items.', 'MicroPub', true), + ('delete', 'Remove items.', 'MicroPub', true), + ('media', 'Allow file uploads.', 'MicroPub', true), + ('read', 'Read access to channels.', 'MicroSub', true), + ('follow', 'Management of following list.', 'MicroSub', true), + ('mute', 'Management of user muting.', 'MicroSub', true), + ('block', 'Management of user blocking.', 'MicroSub', true), + ('channels', 'Management of channels.', 'MicroSub', true) + ; + +COMMIT; diff --git a/src/db/postgres/sql/schema/1.0.0/er.dot b/src/db/postgres/sql/schema/1.0.0/er.dot new file mode 100644 index 0000000..147f50b --- /dev/null +++ b/src/db/postgres/sql/schema/1.0.0/er.dot @@ -0,0 +1,105 @@ +digraph indieAutherERD { + graph[ + rankdir=LR, + overlap=false, + splines=true, + label="IndieAuther Entity-Relations\nPostgres\nSchema 1.0.0", + labelloc="t", + fontsize=26, + ]; + // layout=neato; + node[shape=plain]; + edge[arrowhead=crow]; + + token [label=< + + + + + + + + + + + + + + + + +
TOKEN
code_id
profile_id
created
expires
refresh_expires
refreshed
duration
refresh_duration
refresh_count
is_revoked
is_token
client_id
resource
profile_data
+ >]; + profile:pk_profile_id -> token:fk_profile_id; + + scope [label=< + + + + + + + + +
SCOPE
scope_id
scope
description
application
is_permanent
is_manually_added
+ >]; + + token_scope [label=< + + + + +
TOKEN_SCOPE
code_id
scope_id
+ >]; + token:pk_code_id -> token_scope:fk_code_id; + scope:pk_scope_id -> token_scope:fk_scope_id; + + profile [label=< + + + + + +
PROFILE
profile_id
identifier_id
profile
+ >]; + authentication:pk_identifier_id -> profile:fk_identifier_id; + + profile_scope [label=< + + + + +
PROFILE_SCOPE
profile_id
scope_id
+ >]; + profile:pk_profile_id -> profile_scope:fk_profile_id; + scope:pk_scope_id -> profile_scope:fk_scope_id; + + authentication [label=< + + + + + + + +
AUTHENTICATION
identifier_id
created
last_authenticated
identifier
credential
+ >]; + + resource [label=< + + + + + + +
RESOURCE
resource_id
description
created
secret
+ >]; + + almanac [label=< + + + + +
ALMANAC
event
date
+ >]; +} diff --git a/src/db/postgres/sql/schema/1.0.0/revert.sql b/src/db/postgres/sql/schema/1.0.0/revert.sql new file mode 100644 index 0000000..af4665a --- /dev/null +++ b/src/db/postgres/sql/schema/1.0.0/revert.sql @@ -0,0 +1,9 @@ +BEGIN; + DROP TABLE authentication CASCADE; + DROP TABLE profile CASCADE; + DROP TABLE token CASCADE; + DROP TABLE scope CASCADE; + DROP TABLE profile_scope CASCADE; + + DELETE FROM _meta_schema_version WHERE major = 1 AND minor = 0 AND patch = 0; +COMMIT; diff --git a/src/db/postgres/sql/schema/init.sql b/src/db/postgres/sql/schema/init.sql new file mode 100644 index 0000000..618781f --- /dev/null +++ b/src/db/postgres/sql/schema/init.sql @@ -0,0 +1,15 @@ +-- +CREATE EXTENSION IF NOT EXISTS pg_stat_statements; +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +-- +BEGIN; +CREATE TABLE IF NOT EXISTS _meta_schema_version ( + major BIGINT NOT NULL, + minor BIGINT NOT NULL, + patch BIGINT NOT NULL, + applied TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + PRIMARY KEY (major, minor, patch) +); +INSERT INTO _meta_schema_version (major, minor, patch) VALUES (0, 0, 0); +COMMIT; diff --git a/src/db/postgres/sql/scope-cleanup.sql b/src/db/postgres/sql/scope-cleanup.sql new file mode 100644 index 0000000..120e3d6 --- /dev/null +++ b/src/db/postgres/sql/scope-cleanup.sql @@ -0,0 +1,8 @@ +-- Remove any un-used, non-permament, non-manually-created scopes. +DELETE FROM scope WHERE scope_id NOT IN ( + SELECT scope_id FROM scope s + INNER JOIN profile_scope ps USING (scope_id) + UNION All + SELECT scope_id FROM scope s + INNER JOIN token_scope ts USING (scope_id) +) AND NOT (is_permanent OR is_manually_added) diff --git a/src/db/postgres/sql/scope-delete.sql b/src/db/postgres/sql/scope-delete.sql new file mode 100644 index 0000000..9fd42a2 --- /dev/null +++ b/src/db/postgres/sql/scope-delete.sql @@ -0,0 +1,3 @@ +-- remove an inpermanent scope +DELETE FROM scope + WHERE scope = $(scope) AND is_permanent = false diff --git a/src/db/postgres/sql/scope-in-use.sql b/src/db/postgres/sql/scope-in-use.sql new file mode 100644 index 0000000..a09c540 --- /dev/null +++ b/src/db/postgres/sql/scope-in-use.sql @@ -0,0 +1,13 @@ +-- return whether a scope is currently in use, either a profile setting or on a token +SELECT EXISTS ( + SELECT 1 FROM scope s + INNER JOIN profile_scope ps USING (scope_id) + WHERE s.scope = $(scope) + UNION All + SELECT 1 FROM scope s + INNER JOIN token_scope ts USING (scope_id) + WHERE s.scope = $(scope) + UNION All + SELECT 1 FROM scope s + WHERE s.scope = $(scope) AND s.is_permanent +) AS in_use diff --git a/src/db/postgres/sql/scope-upsert.sql b/src/db/postgres/sql/scope-upsert.sql new file mode 100644 index 0000000..543d89d --- /dev/null +++ b/src/db/postgres/sql/scope-upsert.sql @@ -0,0 +1,14 @@ +-- +-- N.B. weirdness with postgres empty string null equivalence and coalesce +INSERT INTO scope ( + scope, application, description, is_manually_added +) VALUES ( + $(scope), + CASE WHEN $(application) IS NULL THEN '' ELSE $(application) END, + CASE WHEN $(description) IS NULL THEN '' ELSE $(description) END, + COALESCE($(manuallyAdded), false) +) ON CONFLICT (scope) DO UPDATE +SET + application = CASE WHEN $(application) IS NULL THEN EXCLUDED.application ELSE $(application) END, + description = CASE WHEN $(description) IS NULL THEN EXCLUDED.description ELSE $(description) END, + is_manually_added = EXCLUDED.is_manually_added OR COALESCE($(manuallyAdded), false) diff --git a/src/db/postgres/sql/scopes-insert.sql b/src/db/postgres/sql/scopes-insert.sql new file mode 100644 index 0000000..a933e28 --- /dev/null +++ b/src/db/postgres/sql/scopes-insert.sql @@ -0,0 +1,6 @@ +-- Insert an externally-provided scope, or ignore. +INSERT INTO scope + (scope) +SELECT + unnest(${scopes}) +ON CONFLICT (scope) DO NOTHING diff --git a/src/db/postgres/sql/token-cleanup.sql b/src/db/postgres/sql/token-cleanup.sql new file mode 100644 index 0000000..9c2c744 --- /dev/null +++ b/src/db/postgres/sql/token-cleanup.sql @@ -0,0 +1,26 @@ +-- Remove tokens no longer in use. +-- only clean after code has expired +WITH +cleanable_codes AS ( + SELECT t.code_id, t.is_token, t.is_revoked, t.expires, t.refresh_expires FROM token t + WHERE t.created < (now() - $(codeLifespanSeconds)::text::interval) +) +DELETE FROM token WHERE code_id IN ( + SELECT code_id FROM cleanable_codes + WHERE + NOT is_token -- profile-only redemptions + OR ( + is_token AND ( + is_revoked -- revoked + OR ( + expires < now() AND ( + -- expired and unrefreshable + refresh_expires IS NULL + OR + -- expired and refresh expired + (refresh_expires IS NOT NULL AND refresh_expires < now()) + ) + ) + ) + ) +) diff --git a/src/db/postgres/sql/token-get-by-code-id.sql b/src/db/postgres/sql/token-get-by-code-id.sql new file mode 100644 index 0000000..23f0f73 --- /dev/null +++ b/src/db/postgres/sql/token-get-by-code-id.sql @@ -0,0 +1,24 @@ +-- +SELECT + t.code_id, + p.profile, + t.created, + t.expires, + t.refresh_expires, + t.refreshed, + t.duration, + t.refresh_duration, + t.refresh_count, + t.is_revoked, + t.is_token, + t.client_id, + t.profile_data, + a.identifier, + ARRAY( + SELECT s.scope FROM token_scope ts INNER JOIN scope s USING (scope_id) + WHERE ts.code_id = t.code_id + ) AS scopes +FROM token t + INNER JOIN profile p USING (profile_id) + INNER JOIN authentication a USING (identifier_id) +WHERE code_id = $(codeId) diff --git a/src/db/postgres/sql/token-refresh-revoke-by-code-id.sql b/src/db/postgres/sql/token-refresh-revoke-by-code-id.sql new file mode 100644 index 0000000..4c7033d --- /dev/null +++ b/src/db/postgres/sql/token-refresh-revoke-by-code-id.sql @@ -0,0 +1,5 @@ +-- Revoke the refresh-token for a token +UPDATE token SET + refresh_expires = NULL, + refresh_duration = NULL +WHERE code_id = $(codeId) diff --git a/src/db/postgres/sql/token-revoke-by-code-id.sql b/src/db/postgres/sql/token-revoke-by-code-id.sql new file mode 100644 index 0000000..7a57efc --- /dev/null +++ b/src/db/postgres/sql/token-revoke-by-code-id.sql @@ -0,0 +1,5 @@ +-- +UPDATE token SET + is_revoked = true, + refresh_expires = NULL +WHERE code_id = $(codeId) diff --git a/src/db/postgres/sql/token-scopes-remove.sql b/src/db/postgres/sql/token-scopes-remove.sql new file mode 100644 index 0000000..dd667f2 --- /dev/null +++ b/src/db/postgres/sql/token-scopes-remove.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM token_scope +WHERE (code_id, scope_id) IN ( + SELECT code_id, scope_id FROM token_scope ts + INNER JOIN scope s USING (scope_id) + WHERE scope = ANY($(removeScopes)) AND code_id = $(codeId) +) diff --git a/src/db/postgres/sql/token-scopes-set.sql b/src/db/postgres/sql/token-scopes-set.sql new file mode 100644 index 0000000..1557179 --- /dev/null +++ b/src/db/postgres/sql/token-scopes-set.sql @@ -0,0 +1,4 @@ +-- +INSERT INTO token_scope (code_id, scope_id) + SELECT $(codeId), scope_id FROM scope WHERE scope = ANY ($(scopes)) + diff --git a/src/db/postgres/sql/tokens-get-by-identifier.sql b/src/db/postgres/sql/tokens-get-by-identifier.sql new file mode 100644 index 0000000..f8ec90e --- /dev/null +++ b/src/db/postgres/sql/tokens-get-by-identifier.sql @@ -0,0 +1,26 @@ +-- +SELECT + t.code_id, + p.profile, + t.created, + t.expires, + t.refresh_expires, + t.refreshed, + t.duration, + t.refresh_duration, + t.refresh_count, + t.is_revoked, + t.is_token, + t.client_id, + t.resource, + t.profile_data, + a.identifier, + ARRAY( + SELECT s.scope FROM token_scope ts INNER JOIN scope s USING (scope_id) + WHERE ts.code_id = t.code_id + ) AS scopes +FROM token t + INNER JOIN profile p USING (profile_id) + INNER JOIN authentication a USING (identifier_id) + WHERE a.identifier = $(identifier) + ORDER BY GREATEST(t.created, t.refreshed) DESC diff --git a/src/db/schema-version-helper.js b/src/db/schema-version-helper.js new file mode 100644 index 0000000..65a1e39 --- /dev/null +++ b/src/db/schema-version-helper.js @@ -0,0 +1,131 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +/** + * Utility functions for wrangling schema migrations. + * This mostly just deals with sorting and comparing 'x.y.z' version + * strings, with some presumptions about directory layouts and whatnot. + */ + +/** + * @typedef {Object} SchemaVersionObject + * @property {Number} major + * @property {Number} minor + * @property {Number} patch + */ + + +/** + * Split a dotted version string into parts. + * @param {String} v + * @returns {SchemaVersionObject} + */ +function schemaVersionStringToObject(v) { + const [ major, minor, patch ] = v.split('.', 3).map((x) => parseInt(x, 10)); + return { major, minor, patch }; +} + + +/** + * Render a version object numerically. + * @param {SchemaVersionObject} v + * @returns {Number} + */ +function schemaVersionObjectToNumber(v) { + const vScale = 1000; + return parseInt(v.major) * vScale * vScale + parseInt(v.minor) * vScale + parseInt(v.patch); +} + + +/** + * Convert dotted version string into number. + * @param {String} v + * @returns {Number} + */ +function schemaVersionStringToNumber(v) { + return schemaVersionObjectToNumber(schemaVersionStringToObject(v)); +} + + +/** + * Version string comparison, for sorting. + * @param {String} a + * @param {String} b + * @returns {Number} + */ +function schemaVersionStringCmp(a, b) { + return schemaVersionStringToNumber(a) - schemaVersionStringToNumber(b); +} + + +/** + * Check if an entry in a directory is a directory containing a migration file. + * @param {String} schemaDir + * @param {String} name + * @returns {Boolean} + */ +function isSchemaMigrationDirectory(schemaDir, name, migrationFile = 'apply.sql') { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const nameStat = fs.statSync(path.join(schemaDir, name)); + if (nameStat.isDirectory()) { + let applyStat; + try { + // eslint-disable-next-line security/detect-non-literal-fs-filename + applyStat = fs.statSync(path.join(schemaDir, name, migrationFile)); + return applyStat.isFile(); + } catch (e) { + return false; + } + } + return false; +} + + +/** + * Return an array of schema migration directory names within engineDir, + * sorted in increasing order. + * @param {String} engineDir + * @returns {String[]} + */ +function allSchemaVersions(engineDir) { + const schemaDir = path.join(engineDir, 'sql', 'schema'); + // eslint-disable-next-line security/detect-non-literal-fs-filename + const availableVersions = fs.readdirSync(schemaDir).filter((d) => isSchemaMigrationDirectory(schemaDir, d)); + availableVersions.sort(schemaVersionStringCmp); + return availableVersions; +} + + +/** + * Return an array of schema migration directory names within engineDir, + * which are within supported range, and are greater than the current + * @param {String} engineDir + * @param {SchemaVersionObject} current + * @param {Object} supported + * @param {SchemaVersionObject} supported.min + * @param {SchemaVersionObject} supported.max + * @returns {String[]} + */ +function unappliedSchemaVersions(engineDir, current, supported) { + const min = schemaVersionObjectToNumber(supported.min); + const max = schemaVersionObjectToNumber(supported.max); + const cur = schemaVersionObjectToNumber(current); + const available = allSchemaVersions(engineDir); + return available.filter((a) => { + a = schemaVersionStringToNumber(a); + return a >= min && a <= max && a > cur; + }); +} + + +module.exports = { + schemaVersionStringToObject, + schemaVersionObjectToNumber, + schemaVersionStringToNumber, + schemaVersionStringCmp, + isSchemaMigrationDirectory, + allSchemaVersions, + unappliedSchemaVersions, +}; \ No newline at end of file diff --git a/src/db/sqlite/index.js b/src/db/sqlite/index.js new file mode 100644 index 0000000..878a004 --- /dev/null +++ b/src/db/sqlite/index.js @@ -0,0 +1,739 @@ +'use strict'; + +const common = require('../../common'); +const Database = require('../abstract'); +const DBErrors = require('../errors'); +const svh = require('../schema-version-helper'); +const SQLite = require('better-sqlite3'); +const fs = require('fs'); +const path = require('path'); +const uuid = require('uuid'); +const { performance } = require('perf_hooks'); + +const _fileScope = common.fileScope(__filename); + +const schemaVersionsSupported = { + min: { + major: 1, + minor: 0, + patch: 0, + }, + max: { + major: 1, + minor: 0, + patch: 0, + }, +}; + +// max of signed int64 (2^63 - 1), should be enough +// const EPOCH_FOREVER = BigInt('9223372036854775807'); + +class DatabaseSQLite extends Database { + constructor(logger, options) { + super(logger, options); + + const connectionString = options.db.connectionString || 'sqlite://:memory:'; + const csDelim = '://'; + const dbFilename = connectionString.slice(connectionString.indexOf(csDelim) + csDelim.length); + + const queryLogLevel = options.db.queryLogLevel; + + const sqliteOptions = { + ...(queryLogLevel && { + // eslint-disable-next-line security/detect-object-injection + verbose: (query) => this.logger[queryLogLevel](_fileScope('SQLite:verbose'), '', { query }), + }), + }; + this.db = new SQLite(dbFilename, sqliteOptions); + this.schemaVersionsSupported = schemaVersionsSupported; + this.changesSinceLastOptimize = BigInt(0); + this.optimizeAfterChanges = options.db.sqliteOptimizeAfterChanges || 0; // Default to no periodic optimization. + this.db.pragma('foreign_keys = on'); // Enforce consistency. + this.db.pragma('journal_mode = WAL'); // Be faster, expect local filesystem. + this.db.defaultSafeIntegers(true); // This probably isn't necessary, but by using these BigInts we keep weird floats out of the query logs. + + this._initTables(); + this._initStatements(); + } + + + /** + * Boolean to 0/1 representation for SQLite params. + * @param {Boolean} bool + * @returns {Number} + */ + static _booleanToNumeric(bool) { + // eslint-disable-next-line security/detect-object-injection + return { + true: 1, + false: 0, + }[bool]; + } + + + /** + * SQLite cannot prepare its statements without a schema, ensure such exists. + */ + _initTables() { + const _scope = _fileScope('_initTables'); + + // Migrations rely upon this table, ensure it exists. + const metaVersionTable = '_meta_schema_version'; + const tableExists = this.db.prepare('SELECT name FROM sqlite_master WHERE type=:type AND name=:name').pluck(true).bind({ type: 'table', name: metaVersionTable }); + let metaExists = tableExists.get(); + if (metaExists === undefined) { + const fPath = path.join(__dirname, 'sql', 'schema', 'init.sql'); + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fSql = fs.readFileSync(fPath, { encoding: 'utf8' }); + this.db.exec(fSql); + metaExists = tableExists.get(); + /* istanbul ignore if */ + if (metaExists === undefined) { + throw new DBErrors.UnexpectedResult(`did not create ${metaVersionTable} table`); + } + this.logger.info(_scope, 'created schema version table', { metaVersionTable }); + } + + // Apply migrations + const currentSchema = this._currentSchema(); + const migrationsWanted = svh.unappliedSchemaVersions(__dirname, currentSchema, this.schemaVersionsSupported); + this.logger.debug(_scope, 'schema migrations wanted', { migrationsWanted }); + migrationsWanted.forEach((v) => { + const fPath = path.join(__dirname, 'sql', 'schema', v, 'apply.sql'); + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fSql = fs.readFileSync(fPath, { encoding: 'utf8' }); + this.logger.info(_scope, 'applying migration', { version: v }); + this.db.exec(fSql); + }); + } + + + _initStatements() { + const _scope = _fileScope('_initStatements'); + const sqlDir = path.join(__dirname, 'sql'); + this.statement = {}; + + // Decorate the statement calls we use with timing and logging. + const wrapFetch = (logName, statementName, fn) => { + const _wrapScope = _fileScope(logName); + return (...args) => { + const startTimestampMs = performance.now(); + const rows = fn(...args); + DatabaseSQLite._deOphidiate(rows); + const elapsedTimeMs = performance.now() - startTimestampMs; + this.logger.debug(_wrapScope, 'complete', { statementName, elapsedTimeMs }); + return rows; + }; + }; + const wrapRun = (logName, statementName, fn) => { + const _wrapScope = _fileScope(logName); + return (...args) => { + const startTimestampMs = performance.now(); + const result = fn(...args); + const elapsedTimeMs = performance.now() - startTimestampMs; + this._updateChanges(result); + this.logger.debug(_wrapScope, 'complete', { ...result, statementName, elapsedTimeMs }); + result.duration = elapsedTimeMs; + return result; + }; + }; + + // eslint-disable-next-line security/detect-non-literal-fs-filename + for (const f of fs.readdirSync(sqlDir)) { + const fPath = path.join(sqlDir, f); + const { name: fName, ext: fExt } = path.parse(f); + // eslint-disable-next-line security/detect-non-literal-fs-filename + const stat = fs.statSync(fPath); + if (!stat.isFile() + || fExt.toLowerCase() !== '.sql') { + continue; + } + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fSql = fs.readFileSync(fPath, { encoding: 'utf8' }); + const statementName = common.camelfy(fName.toLowerCase(), '-'); + let statement; + try { + statement = this.db.prepare(fSql); + } catch (e) /* istanbul ignore next */ { + this.logger.error(_scope, 'failed to prepare statement', { error: e, file: f }); + throw e; + } + // eslint-disable-next-line security/detect-object-injection + this.statement[statementName] = statement; + const { get: origGet, all: origAll, run: origRun } = statement; + statement.get = wrapFetch('SQLite:get', statementName, origGet.bind(statement)); + statement.all = wrapFetch('SQLite:all', statementName, origAll.bind(statement)); + statement.run = wrapRun('SQLite:run', statementName, origRun.bind(statement)); + } + this.statement._optimize = this.db.prepare('SELECT * FROM pragma_optimize(0xffff)'); + + this.logger.debug(_scope, 'statements initialized', { statements: Object.keys(this.statement).length }); + } + + + static _deOphidiate(rows) { + const rowsIsArray = Array.isArray(rows); + if (!rowsIsArray) { + rows = [rows]; + } + const exemplaryRow = rows[0]; + for (const prop in exemplaryRow) { + const camel = common.camelfy(prop); + if (!(camel in exemplaryRow)) { + for (const d of rows) { + d[camel] = d[prop]; // eslint-disable-line security/detect-object-injection + delete d[prop]; // eslint-disable-line security/detect-object-injection + } + } + } + return rowsIsArray ? rows : rows[0]; + } + + + _currentSchema() { + return this.db.prepare('SELECT major, minor, patch FROM _meta_schema_version ORDER BY major DESC, minor DESC, patch DESC LIMIT 1').get(); + } + + + healthCheck() { + const _scope = _fileScope('healthCheck'); + this.logger.debug(_scope, 'called', {}); + if (!this.db.open) { + throw new DBErrors.UnexpectedResult('database is not open'); + } + return { open: this.db.open }; + } + + + _closeConnection() { + this.db.close(); + } + + + _optimize() { + const _scope = _fileScope('_optimize'); + + const optimize = this.statement._optimize.all(); + this.logger.debug(_scope, 'optimize', { optimize, changes: this.changesSinceLastOptimize }); + this.db.pragma('optimize'); + this.changesSinceLastOptimize = BigInt(0); + } + + + _updateChanges(dbResult) { + if (this.optimizeAfterChanges) { + this.changesSinceLastOptimize += BigInt(dbResult.changes); + if (this.changesSinceLastOptimize >= this.optimizeAfterChanges) { + this._optimize(); + } + } + } + + + _purgeTables(really) { + if (really) { + [ + 'authentication', + 'profile', + 'token', + ].map((table) => { + const result = this.db.prepare(`DELETE FROM ${table}`).run(); + this.logger.debug(_fileScope('_purgeTables'), 'success', { table, result }); + }); + } + } + + + context(fn) { + return fn(this.db); + } + + + transaction(dbCtx, fn) { + dbCtx = dbCtx || this.db; + return dbCtx.transaction(fn)(); + } + + + static _almanacToNative(entry) { + return { + event: entry.event, + date: new Date(Number(entry.epoch) * 1000), + }; + } + + almanacGetAll(dbCtx) { // eslint-disable-line no-unused-vars + const _scope = _fileScope('almanacGetAll'); + this.logger.debug(_scope, 'called'); + + try { + const entries = this.statement.almanacGetAll.all(); + return entries.map((entry) => DatabaseSQLite._almanacToNative(entry)); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e }); + throw e; + } + } + + + static _authenticationToNative(authentication) { + if (authentication) { + authentication.created = new Date(Number(authentication.created) * 1000); + authentication.lastAuthentication = new Date(Number(authentication.lastAuthentication) * 1000); + } + return authentication; + } + + + authenticationGet(dbCtx, identifier) { + const _scope = _fileScope('authenticationGet'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + const authentication = this.statement.authenticationGet.get({ identifier }); + return DatabaseSQLite._authenticationToNative(authentication); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + + + authenticationSuccess(dbCtx, identifier) { + const _scope = _fileScope('authenticationSuccess'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + const result = this.statement.authenticationSuccess.run({ identifier }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not update authentication success'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + + + authenticationUpsert(dbCtx, identifier, credential) { + const _scope = _fileScope('authenticationUpsert'); + const scrubbedCredential = '*'.repeat((credential || '').length); + this.logger.debug(_scope, 'called', { identifier, scrubbedCredential }); + + let result; + try { + result = this.statement.authenticationUpsert.run({ identifier, credential }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not upsert authentication'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier, scrubbedCredential }); + throw e; + } + } + + + profileIdentifierInsert(dbCtx, profile, identifier) { + const _scope = _fileScope('profileIdentifierInsert'); + this.logger.debug(_scope, 'called', { profile, identifier }); + + try { + const result = this.statement.profileIdentifierInsert.run({ profile, identifier }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not insert profile identifier relationship'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile, identifier }); + throw e; + } + } + + + profileIsValid(dbCtx, profile) { + const _scope = _fileScope('profileIsValid'); + this.logger.debug(_scope, 'called', { profile }); + + try { + const profileResponse = this.statement.profileGet.get({ profile }); + return !!profileResponse; + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile }); + throw e; + } + } + + + profileScopeInsert(dbCtx, profile, scope) { + const _scope = _fileScope('profileScopeInsert'); + this.logger.debug(_scope, 'called', { profile, scope }); + + try { + const result = this.statement.profileScopeInsert.run({ profile, scope }); + // Duplicate inserts get ignored + if (result.changes != 1 && result.changes != 0) { + throw new DBErrors.UnexpectedResult('did not insert profile scope'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile, scope }); + throw e; + } + } + + + profileScopesSetAll(dbCtx, profile, scopes) { + const _scope = _fileScope('profileScopesSetAll'); + this.logger.debug(_scope, 'called', { profile, scopes }); + + try { + this.transaction(dbCtx, () => { + this.statement.profileScopesClear.run({ profile }); + if (scopes.length) { + scopes.forEach((scope) => { + this.statement.profileScopeInsert.run({ profile, scope }); + }); + } + }); // transaction + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, profile, scopes }); + throw e; + } + } + + + profilesScopesByIdentifier(dbCtx, identifier) { + const _scope = _fileScope('profilesScopesByIdentifier'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + const profileScopesRows = this.statement.profilesScopesByIdentifier.all({ identifier }); + return Database._profilesScopesBuilder(profileScopesRows); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + + + redeemCode(dbCtx, { codeId, created, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, profileData }) { + const _scope = _fileScope('redeemCode'); + this.logger.debug(_scope, 'called', { codeId, created, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, profileData }); + + let result, ret = false; + try { + if (profileData) { + profileData = JSON.stringify(profileData); + } + this.transaction(dbCtx, () => { + result = this.statement.redeemCode.get({ codeId, created: common.dateToEpoch(created), isToken: DatabaseSQLite._booleanToNumeric(isToken), clientId, profile, identifier, lifespanSeconds, refreshLifespanSeconds, profileData }); + if (!result) { + this.logger.error(_scope, 'failed', { result }); + throw new DBErrors.UnexpectedResult('did not redeem code'); + } + // Abort and return false if redemption resulted in revocation. + if (result.isRevoked) { + return; + } + + // Ensure there are entries for all scopes, and associate with token. + scopes.forEach((scope) => { + this.statement.scopeInsert.run({ scope }); + this.statement.tokenScopeSet.run({ codeId, scope }); + }); + ret = true; + }); // tx + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId, isToken, clientId, profile, identifier, scopes, lifespanSeconds, refreshLifespanSeconds, profileData }); + throw e; + } + return ret; + } + + + static _refreshCodeResponseToNative(refreshResponse) { + if (refreshResponse) { + ['expires', 'refreshExpires'].forEach((epochField) => { + if (refreshResponse[epochField]) { // eslint-disable-line security/detect-object-injection + refreshResponse[epochField] = new Date(Number(refreshResponse[epochField]) * 1000); // eslint-disable-line security/detect-object-injection + } + }); + } + return refreshResponse; + } + + + refreshCode(dbCtx, codeId, refreshed, removeScopes) { + const _scope = _fileScope('refreshCode'); + this.logger.debug(_scope, 'called', { codeId, refreshed, removeScopes }); + + try { + return this.transaction(dbCtx, () => { + const refreshResponse = this.statement.refreshCode.get({ codeId, refreshed: common.dateToEpoch(refreshed) }); + if (refreshResponse) { + removeScopes.forEach((scope) => { + const result = this.statement.tokenScopeRemove.run({ codeId, scope }); + if (result?.changes != 1) { + this.logger.error(_scope, 'failed to remove token scope', { codeId, scope }); + throw new DBErrors.UnexpectedResult('did not remove scope from token'); + } + }); + if (removeScopes.length) { + refreshResponse.scopes = (this.statement.tokenScopesGetByCodeId.all({ codeId }) || []) + .map((row) => row.scope); + } + } else { + this.logger.debug(_scope, 'did not refresh token', {}); + } + return DatabaseSQLite._refreshCodeResponseToNative(refreshResponse); + }); // tx + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId, refreshed }); + throw e; + } + } + + + static _resourceToNative(resource) { + if (resource) { + resource.created = new Date(Number(resource.created) * 1000); + } + return resource; + } + + + resourceGet(dbCtx, resourceId) { + const _scope = _fileScope('resourceGet'); + this.logger.debug(_scope, 'called', { resourceId }); + + try { + const resource = this.statement.resourceGet.get({ resourceId }); + return DatabaseSQLite._resourceToNative(resource); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, resourceId }); + throw e; + } + } + + + resourceUpsert(dbCtx, resourceId, secret, description) { + const _scope = _fileScope('resourceUpsert'); + this.logger.debug(_scope, 'called', { resourceId }); + + try { + if (!resourceId) { + resourceId = uuid.v4(); + } + const result = this.statement.resourceUpsert.run({ resourceId, secret, description }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not upsert resource'); + } + const resource = this.statement.resourceGet.get({ resourceId }); + return DatabaseSQLite._resourceToNative(resource); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, resourceId, secret, description }); + throw e; + } + } + + + scopeCleanup(dbCtx, atLeastMsSinceLast) { + const _scope = _fileScope('scopeCleanup'); + this.logger.debug(_scope, 'called', { atLeastMsSinceLast }); + + const almanacEvent = 'scopeCleanup'; + try { + return this.db.transaction(() => { + + // Check that enough time has passed since last cleanup + const nowEpoch = BigInt(common.dateToEpoch()); + const { epoch: lastCleanupEpoch } = this.statement.almanacGet.get({ event: almanacEvent }) || { epoch: 0n }; + const elapsedMs = (nowEpoch - lastCleanupEpoch) * 1000n; + if (elapsedMs < atLeastMsSinceLast) { + this.logger.debug(_scope, 'skipping token cleanup, too soon', { lastCleanupEpoch, elapsedMs, atLeastMsSinceLast }); + return; + } + + // Do the cleanup + const { changes: scopesRemoved } = this.statement.scopeCleanup.run(); + + // Update the last cleanup time + const result = this.statement.almanacUpsert.run({ event: almanacEvent, epoch: nowEpoch }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not update almanac'); + } + + this.logger.debug(_scope, 'finished', { scopesRemoved, atLeastMsSinceLast }); + return scopesRemoved; + }).exclusive(); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, atLeastMsSinceLast }); + throw e; + } + } + + + scopeDelete(dbCtx, scope) { + const _scope = _fileScope('scopeDelete'); + this.logger.debug(_scope, 'called', { scope }); + + try { + return this.transaction(dbCtx, () => { + const { inUse } = this.statement.scopeInUse.get({ scope }); + if (inUse) { + this.logger.debug(_scope, 'not deleted, in use', { scope }); + return false; + } + const result = this.statement.scopeDelete.run({ scope }); + if (result.changes == 0) { + this.logger.debug(_scope, 'no such scope', { scope }); + } else { + this.logger.debug(_scope, 'deleted', { scope }); + } + return true; + }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, scope }); + throw e; + } + } + + + scopeUpsert(dbCtx, scope, application, description, manuallyAdded) { + const _scope = _fileScope('scopeUpsert'); + this.logger.debug(_scope, 'called', { scope, application, description, manuallyAdded }); + + try { + const result = this.statement.scopeUpsert.run({ scope, application, description, manuallyAdded: DatabaseSQLite._booleanToNumeric(manuallyAdded) }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not upsert scope'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, scope, application, description, manuallyAdded }); + throw e; + } + } + + + tokenCleanup(dbCtx, codeLifespanSeconds, atLeastMsSinceLast) { + const _scope = _fileScope('tokenCleanup'); + this.logger.debug(_scope, 'called', { codeLifespanSeconds, atLeastMsSinceLast }); + + const almanacEvent = 'tokenCleanup'; + try { + return this.db.transaction(() => { + + // Check that enough time has passed since last cleanup + const nowEpoch = BigInt(common.dateToEpoch()); + const { epoch: lastCleanupEpoch } = this.statement.almanacGet.get({ event: almanacEvent }) || { epoch: 0n }; + const elapsedMs = (nowEpoch - lastCleanupEpoch) * 1000n; + if (elapsedMs < atLeastMsSinceLast) { + this.logger.debug(_scope, 'skipping token cleanup, too soon', { lastCleanupEpoch, elapsedMs, atLeastMsSinceLast }); + return; + } + + // Do the cleanup + const { changes: tokensRemoved } = this.statement.tokenCleanup.run({ codeLifespanSeconds }); + + // Update the last cleanup time + const result = this.statement.almanacUpsert.run({ event: almanacEvent, epoch: nowEpoch }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not update almanac'); + } + + this.logger.debug(_scope, 'finished', { tokensRemoved, codeLifespanSeconds, atLeastMsSinceLast }); + return tokensRemoved; + }).exclusive(); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeLifespanSeconds, atLeastMsSinceLast }); + throw e; + } + } + + + static _tokenToNative(token) { + if (token) { + token.created = new Date(Number(token.created) * 1000); + if (token.expires || token.expires == 0) { + token.expires = new Date(Number(token.expires) * 1000); + } + if (token.refreshExpires || token.refreshExpires == 0) { + token.refreshExpires = new Date(Number(token.refreshExpires) * 1000); + } + if (token.refreshed || token.refreshed == 0) { + token.refreshed = new Date(Number(token.refreshed) * 1000); + } + token.isRevoked = !!token.isRevoked; + token.isToken = !!token.isToken; + if (token.profileData) { + token.profileData = JSON.parse(token.profileData); + } + } + return token; + } + + + tokenGetByCodeId(dbCtx, codeId) { + const _scope = _fileScope('tokenGetByCodeId'); + this.logger.debug(_scope, 'called', { codeId }); + + try { + return this.transaction(dbCtx, () => { + const token = this.statement.tokenGetByCodeId.get({ codeId }); + token.scopes = (this.statement.tokenScopesGetByCodeId.all({ codeId }) || []) + .map((row) => row.scope); + return DatabaseSQLite._tokenToNative(token); + }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + tokenRefreshRevokeByCodeId(dbCtx, codeId) { + const _scope = _fileScope('tokenRefreshRevokeByCodeId'); + this.logger.debug(_scope, 'called', { codeId }); + + try { + const result = this.statement.tokenRefreshRevokeByCodeId.run({ codeId }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not revoke refresh'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + tokenRevokeByCodeId(dbCtx, codeId) { + const _scope = _fileScope('tokenRevokeByCodeId'); + this.logger.debug(_scope, 'called', { codeId }); + + try { + const result = this.statement.tokenRevokeByCodeId.run({ codeId }); + if (result.changes != 1) { + throw new DBErrors.UnexpectedResult('did not revoke token'); + } + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, codeId }); + throw e; + } + } + + + tokensGetByIdentifier(dbCtx, identifier) { + const _scope = _fileScope('tokensGetByIdentifier'); + this.logger.debug(_scope, 'called', { identifier }); + + try { + const tokens = this.statement.tokensGetByIdentifier.all({ identifier }); + return tokens.map(DatabaseSQLite._tokenToNative); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, identifier }); + throw e; + } + } + +} + +module.exports = DatabaseSQLite; \ No newline at end of file diff --git a/src/db/sqlite/sql/almanac-get-all.sql b/src/db/sqlite/sql/almanac-get-all.sql new file mode 100644 index 0000000..fddd282 --- /dev/null +++ b/src/db/sqlite/sql/almanac-get-all.sql @@ -0,0 +1,2 @@ +-- +SELECT * FROM almanac diff --git a/src/db/sqlite/sql/almanac-get.sql b/src/db/sqlite/sql/almanac-get.sql new file mode 100644 index 0000000..00dc708 --- /dev/null +++ b/src/db/sqlite/sql/almanac-get.sql @@ -0,0 +1,2 @@ +-- +SELECT epoch FROM almanac WHERE event = :event diff --git a/src/db/sqlite/sql/almanac-upsert.sql b/src/db/sqlite/sql/almanac-upsert.sql new file mode 100644 index 0000000..fc8be48 --- /dev/null +++ b/src/db/sqlite/sql/almanac-upsert.sql @@ -0,0 +1,9 @@ +-- +INSERT INTO almanac + (event, epoch) +VALUES + (:event, :epoch) +ON CONFLICT (event) DO UPDATE +SET + epoch = :epoch + diff --git a/src/db/sqlite/sql/authentication-get.sql b/src/db/sqlite/sql/authentication-get.sql new file mode 100644 index 0000000..687e54a --- /dev/null +++ b/src/db/sqlite/sql/authentication-get.sql @@ -0,0 +1,8 @@ +-- +SELECT + created, + last_authentication, + identifier, + credential +FROM authentication +WHERE identifier = :identifier diff --git a/src/db/sqlite/sql/authentication-success.sql b/src/db/sqlite/sql/authentication-success.sql new file mode 100644 index 0000000..b4c45a6 --- /dev/null +++ b/src/db/sqlite/sql/authentication-success.sql @@ -0,0 +1,4 @@ +-- +UPDATE authentication + SET last_authentication = strftime('%s', 'now') + WHERE identifier = :identifier diff --git a/src/db/sqlite/sql/authentication-upsert.sql b/src/db/sqlite/sql/authentication-upsert.sql new file mode 100644 index 0000000..8a141ee --- /dev/null +++ b/src/db/sqlite/sql/authentication-upsert.sql @@ -0,0 +1,9 @@ +-- +INSERT INTO authentication + (identifier, credential) +VALUES + (:identifier, :credential) +ON CONFLICT (identifier) DO UPDATE +SET + identifier = :identifier, + credential = :credential diff --git a/src/db/sqlite/sql/profile-get.sql b/src/db/sqlite/sql/profile-get.sql new file mode 100644 index 0000000..74aa7a5 --- /dev/null +++ b/src/db/sqlite/sql/profile-get.sql @@ -0,0 +1,3 @@ +-- +SELECT * FROM profile +WHERE profile = :profile diff --git a/src/db/sqlite/sql/profile-identifier-insert.sql b/src/db/sqlite/sql/profile-identifier-insert.sql new file mode 100644 index 0000000..b357dce --- /dev/null +++ b/src/db/sqlite/sql/profile-identifier-insert.sql @@ -0,0 +1,4 @@ +-- +INSERT INTO profile (profile, identifier_id) + SELECT :profile, identifier_id FROM authentication WHERE identifier = :identifier + diff --git a/src/db/sqlite/sql/profile-scope-insert.sql b/src/db/sqlite/sql/profile-scope-insert.sql new file mode 100644 index 0000000..be4f212 --- /dev/null +++ b/src/db/sqlite/sql/profile-scope-insert.sql @@ -0,0 +1,5 @@ +-- +INSERT INTO profile_scope (profile_id, scope_id) + SELECT p.profile_id, s.scope_id FROM profile p, scope s + WHERE p.profile = :profile AND s.scope = :scope +ON CONFLICT (profile_id, scope_id) DO NOTHING diff --git a/src/db/sqlite/sql/profile-scopes-clear.sql b/src/db/sqlite/sql/profile-scopes-clear.sql new file mode 100644 index 0000000..be544fc --- /dev/null +++ b/src/db/sqlite/sql/profile-scopes-clear.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM profile_scope +WHERE profile_id IN( + SELECT profile_id FROM profile WHERE profile = :profile +) diff --git a/src/db/sqlite/sql/profiles-scopes-by-identifier.sql b/src/db/sqlite/sql/profiles-scopes-by-identifier.sql new file mode 100644 index 0000000..485d043 --- /dev/null +++ b/src/db/sqlite/sql/profiles-scopes-by-identifier.sql @@ -0,0 +1,10 @@ +-- +SELECT p.profile, s.* + FROM profile p + INNER JOIN authentication a USING (identifier_id) + FULL JOIN profile_scope ps USING (profile_id) + FULL JOIN scope s USING (scope_id) + WHERE a.identifier = :identifier +UNION ALL SELECT NULL AS profile, * + FROM scope + WHERE is_manually_added OR is_permanent diff --git a/src/db/sqlite/sql/redeem-code.sql b/src/db/sqlite/sql/redeem-code.sql new file mode 100644 index 0000000..5f237e8 --- /dev/null +++ b/src/db/sqlite/sql/redeem-code.sql @@ -0,0 +1,27 @@ +-- +INSERT INTO token ( + code_id, + created, + is_token, + client_id, + profile_id, + expires, + duration, + refresh_expires, + refresh_duration +) + SELECT + :codeId, + :created, + :isToken, + :clientId, + p.profile_id, + CASE WHEN :lifespanSeconds IS NULL THEN NULL ELSE :created + :lifespanSeconds END, + :lifespanSeconds, + CASE WHEN :refreshLifespanSeconds IS NULL THEN NULL ELSE :created + :refreshLifespanSeconds END, + :refreshLifespanSeconds + FROM profile p INNER JOIN authentication a USING (identifier_id) + WHERE p.profile = :profile AND a.identifier = :identifier +ON CONFLICT (code_id) DO UPDATE + SET is_revoked = true +RETURNING is_revoked diff --git a/src/db/sqlite/sql/refresh-code.sql b/src/db/sqlite/sql/refresh-code.sql new file mode 100644 index 0000000..e2820c8 --- /dev/null +++ b/src/db/sqlite/sql/refresh-code.sql @@ -0,0 +1,15 @@ +-- +UPDATE token set + refreshed = :refreshed, + expires = :refreshed + duration, + refresh_expires = :refreshed + refresh_duration, + refresh_count = refresh_count + 1 +WHERE + code_id = :codeId +AND + NOT is_revoked +AND + (refresh_expires IS NOT NULL AND refresh_expires > :refreshed) +RETURNING + expires, + refresh_expires diff --git a/src/db/sqlite/sql/resource-get.sql b/src/db/sqlite/sql/resource-get.sql new file mode 100644 index 0000000..6e481d5 --- /dev/null +++ b/src/db/sqlite/sql/resource-get.sql @@ -0,0 +1,4 @@ +-- +SELECT * +FROM resource +WHERE resource_id = :resourceId diff --git a/src/db/sqlite/sql/resource-upsert.sql b/src/db/sqlite/sql/resource-upsert.sql new file mode 100644 index 0000000..84d333c --- /dev/null +++ b/src/db/sqlite/sql/resource-upsert.sql @@ -0,0 +1,9 @@ +-- +INSERT INTO resource + (resource_id, secret, description) +VALUES (:resourceId, :secret, :description) +ON CONFLICT (resource_id) DO UPDATE +SET + secret = COALESCE(EXCLUDED.secret, resource.secret), + description = COALESCE(EXCLUDED.description, resource.description) +RETURNING * diff --git a/src/db/sqlite/sql/schema/1.0.0/apply.sql b/src/db/sqlite/sql/schema/1.0.0/apply.sql new file mode 100644 index 0000000..2b2be31 --- /dev/null +++ b/src/db/sqlite/sql/schema/1.0.0/apply.sql @@ -0,0 +1,97 @@ +BEGIN; + + CREATE TABLE almanac ( + event TEXT NOT NULL PRIMARY KEY CHECK (typeof(event) = 'text'), + epoch INTEGER NOT NULL DEFAULT 0 CHECK (typeof(epoch) = 'integer') + ); + + CREATE TABLE authentication ( + identifier_id INTEGER NOT NULL PRIMARY KEY, + created INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) CHECK (typeof(created) = 'integer'), + last_authentication INTEGER NOT NULL DEFAULT 0 CHECK (typeof(last_authentication) = 'integer'), + identifier TEXT NOT NULL UNIQUE CHECK (typeof(identifier) = 'text'), + credential TEXT CHECK (typeof(credential) IN ('text', 'null')) + ); + + CREATE TABLE resource ( + resource_id TEXT NOT NULL PRIMARY KEY CHECK (typeof(resource_id) = 'text'), + description TEXT NOT NULL DEFAULT '' CHECK (typeof(description) = 'text'), + created INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) CHECK (typeof(created) = 'integer'), + secret TEXT NOT NULL CHECK (typeof(secret) = 'text') + ); + + CREATE TABLE profile ( + profile_id INTEGER NOT NULL PRIMARY KEY, + identifier_id INTEGER NOT NULL REFERENCES authentication(identifier_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + profile TEXT NOT NULL CHECK (typeof(profile) = 'text'), + UNIQUE (identifier_id, profile) ON CONFLICT IGNORE + ); + CREATE INDEX profile_identifier_id_idx ON profile(identifier_id); + CREATE INDEX profile_profile_idx ON profile(profile); + + CREATE TABLE scope ( + scope_id INTEGER NOT NULL PRIMARY KEY, + scope TEXT NOT NULL UNIQUE CHECK (typeof(scope) = 'text'), + description TEXT NOT NULL ON CONFLICT REPLACE DEFAULT '' CHECK (typeof(description) = 'text'), + application TEXT NOT NULL ON CONFLICT REPLACE DEFAULT '' CHECK (typeof(application) = 'text'), + is_permanent INTEGER NOT NULL DEFAULT 0 CHECK (typeof(is_permanent) = 'integer' AND is_permanent IN (0, 1)), + is_manually_added INTEGER NOT NULL DEFAULT 0 CHECK (typeof(is_manually_added) = 'integer' AND is_manually_added IN (0, 1)) + ); + + CREATE TABLE profile_scope ( + profile_id INTEGER NOT NULL REFERENCES profile(profile_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + scope_id INTEGER NOT NULL REFERENCES scope(scope_id) ON DELETE NO ACTION ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + PRIMARY KEY (profile_id, scope_id) + ); + CREATE INDEX profile_scope_scope_id_idx ON profile_scope(scope_id); + + CREATE TABLE token ( + code_id TEXT NOT NULL PRIMARY KEY CHECK (typeof(code_id) = 'text'), + profile_id INTEGER NOT NULL REFERENCES profile (profile_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + created INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) CHECK (typeof(created) = 'integer'), + expires INTEGER CHECK (typeof(expires) IN ('integer', 'null')), + refresh_expires INTEGER CHECK (typeof(refresh_expires) IN ('integer', 'null')), + refreshed INTEGER CHECK (typeof(refreshed) IN ('integer', 'null')), + duration INTEGER CHECK (typeof(duration) IN ('integer', 'null')), + refresh_duration INTEGER CHECK (typeof(refresh_duration) IN ('integer', 'null')), + refresh_count INTEGER NOT NULL DEFAULT 0 CHECK (typeof(refresh_count) = 'integer'), + is_revoked INTEGER NOT NULL DEFAULT 0 CHECK (typeof(is_revoked) = 'integer' AND is_revoked IN (0, 1)), + is_token INTEGER NOT NULL CHECK (typeof(is_token) = 'integer' AND is_token IN (0, 1)), + client_id TEXT NOT NULL CHECK (typeof(client_id) = 'text'), + resource TEXT CHECK (typeof(resource) IN ('integer', 'null')), + profile_data TEXT, + CONSTRAINT expires_needs_duration CHECK (expires IS NULL OR duration IS NOT NULL), + CONSTRAINT refresh_expires_needs_refresh_duration CHECK (refresh_expires IS NULL OR refresh_duration IS NOT NULL) + ); + CREATE INDEX token_profile_id_idx ON token(profile_id); + CREATE INDEX token_created_idx ON token(created); + CREATE INDEX token_expires_idx ON token(expires) WHERE expires IS NOT NULL; + CREATE INDEX token_refresh_expires_idx ON token(refresh_expires) WHERE refresh_expires IS NOT NULL; + + CREATE TABLE token_scope ( + code_id TEXT NOT NULL REFERENCES token(code_id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + scope_id INTEGER NOT NULL REFERENCES scope(scope_id) ON DELETE NO ACTION ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED, + PRIMARY KEY (code_id, scope_id) + ); + CREATE INDEX token_scope_scope_id_idx ON token_scope(scope_id); + + -- Update schema version + INSERT INTO _meta_schema_version (major, minor, patch) VALUES (1, 0, 0); + + -- Seed scope data + INSERT INTO scope (scope, description, application, is_permanent) VALUES + ('profile', 'Access detailed profile information, including name, image, and url.', 'IndieAuth', 1), + ('email', 'Include email address with detailed profile information.', 'IndieAuth', 1), + ('create', 'Create new items.', 'MicroPub', 1), + ('draft', 'All created items are drafts.', 'MicroPub', 1), + ('update', 'Edit existing items.', 'MicroPub', 1), + ('delete', 'Remove items.', 'MicroPub', 1), + ('media', 'Allow file uploads.', 'MicroPub', 1), + ('read', 'Read access to channels.', 'MicroSub', 1), + ('follow', 'Management of following list.', 'MicroSub', 1), + ('mute', 'Management of user muting.', 'MicroSub', 1), + ('block', 'Management of user blocking.', 'MicroSub', 1), + ('channels', 'Management of channels.', 'MicroSub', 1) + ; + +COMMIT; diff --git a/src/db/sqlite/sql/schema/1.0.0/er.dot b/src/db/sqlite/sql/schema/1.0.0/er.dot new file mode 100644 index 0000000..2e43133 --- /dev/null +++ b/src/db/sqlite/sql/schema/1.0.0/er.dot @@ -0,0 +1,106 @@ +digraph indieAutherERD { + graph[ + rankdir=LR, + overlap=false, + splines=true, + label="IndieAuther Entity-Relations\SQLite\nSchema 1.0.0", + labelloc="t", + fontsize=26, + ]; + // layout=neato; + node[shape=plain]; + edge[arrowhead=crow]; + + token [label=< + + + + + + + + + + + + + + + + +
TOKEN
code_id
profile_id
created
expires
refresh_expires
refreshed
duration
refresh_duration
refresh_count
is_revoked
is_token
client_id
resource
profile_data
+ >]; + profile:pk_profile_id -> token:fk_profile_id; + + scope [label=< + + + + + + + + +
SCOPE
scope_id
scope
description
application
is_permanent
is_manually_added
+ >]; + + token_scope [label=< + + + + +
TOKEN_SCOPE
code_id
scope_id
+ >]; + token:pk_code_id -> token_scope:fk_code_id; + scope:pk_scope_id -> token_scope:fk_scope_id; + + profile [label=< + + + + + +
PROFILE
profile_id
identifier_id
profile
+ >]; + authentication:pk_identifier_id -> profile:fk_identifier_id; + + profile_scope [label=< + + + + +
PROFILE_SCOPE
profile_id
scope_id
+ >]; + profile:pk_profile_id -> profile_scope:fk_profile_id; + scope:pk_scope_id -> profile_scope:fk_scope_id; + + authentication [label=< + + + + + + + +
AUTHENTICATION
identifier_id
created
last_authenticated
identifier
credential
+ >]; + + resource [label=< + + + + + + +
RESOURCE
resource_id
description
created
secret
+ >]; + + almanac [label=< + + + + +
ALMANAC
event
epoch
+ >]; + +} diff --git a/src/db/sqlite/sql/schema/1.0.0/revert.sql b/src/db/sqlite/sql/schema/1.0.0/revert.sql new file mode 100644 index 0000000..20ccf68 --- /dev/null +++ b/src/db/sqlite/sql/schema/1.0.0/revert.sql @@ -0,0 +1,7 @@ +BEGIN; + DROP TABLE authentication; + DROP TABLE profile; + DROP TABLE token; + DROP TABLE scope; + DROP TABLE profile_scope; +COMMIT; \ No newline at end of file diff --git a/src/db/sqlite/sql/schema/init.sql b/src/db/sqlite/sql/schema/init.sql new file mode 100644 index 0000000..8e2a475 --- /dev/null +++ b/src/db/sqlite/sql/schema/init.sql @@ -0,0 +1,11 @@ +-- +BEGIN; + CREATE TABLE _meta_schema_version ( + major INTEGER NOT NULL CHECK (typeof(major) = 'integer'), + minor INTEGER NOT NULL CHECK (typeof(minor) = 'integer'), + patch INTEGER NOT NULL CHECK (typeof(patch) = 'integer'), + applied INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) CHECK (typeof(applied) = 'integer'), + PRIMARY KEY (major DESC, minor DESC, patch DESC) + ) WITHOUT ROWID; + INSERT INTO _meta_schema_version (major, minor, patch) VALUES (0, 0, 0); +COMMIT; diff --git a/src/db/sqlite/sql/scope-cleanup.sql b/src/db/sqlite/sql/scope-cleanup.sql new file mode 100644 index 0000000..4e9bd37 --- /dev/null +++ b/src/db/sqlite/sql/scope-cleanup.sql @@ -0,0 +1,8 @@ +-- Remove any un-used, non-permanent, non-manually-created scopes. +DELETE FROM scope WHERE scope_id NOT IN ( + SELECT scope_id FROM scope s + INNER JOIN profile_scope ps USING (scope_id) + UNION ALL + SELECT scope_id FROM scope s + INNER JOIN token_scope ts USING (scope_id) +) AND NOT (is_permanent OR is_manually_added) diff --git a/src/db/sqlite/sql/scope-delete.sql b/src/db/sqlite/sql/scope-delete.sql new file mode 100644 index 0000000..562bb58 --- /dev/null +++ b/src/db/sqlite/sql/scope-delete.sql @@ -0,0 +1,3 @@ +-- remove an impermanent scope +DELETE FROM scope + WHERE scope = :scope AND is_permanent = false diff --git a/src/db/sqlite/sql/scope-in-use.sql b/src/db/sqlite/sql/scope-in-use.sql new file mode 100644 index 0000000..1129caf --- /dev/null +++ b/src/db/sqlite/sql/scope-in-use.sql @@ -0,0 +1,13 @@ +-- return whether a scope is currently in use, either a profile setting or on a token +SELECT EXISTS ( + SELECT 1 FROM scope s + INNER JOIN profile_scope ps USING (scope_id) + WHERE s.scope = :scope + UNION All + SELECT 1 FROM scope s + INNER JOIN token_scope ts USING (scope_id) + WHERE s.scope = :scope + UNION All + SELECT 1 FROM scope s + WHERE s.scope = :scope AND s.is_permanent +) AS in_use diff --git a/src/db/sqlite/sql/scope-insert.sql b/src/db/sqlite/sql/scope-insert.sql new file mode 100644 index 0000000..78d26c0 --- /dev/null +++ b/src/db/sqlite/sql/scope-insert.sql @@ -0,0 +1,5 @@ +-- Insert an externally-provided scope, or ignore. +INSERT INTO scope + (scope) +VALUES (:scope) +ON CONFLICT (scope) DO NOTHING diff --git a/src/db/sqlite/sql/scope-upsert.sql b/src/db/sqlite/sql/scope-upsert.sql new file mode 100644 index 0000000..cb2770f --- /dev/null +++ b/src/db/sqlite/sql/scope-upsert.sql @@ -0,0 +1,16 @@ +-- +INSERT INTO scope ( + scope, + description, + application, + is_manually_added +) VALUES ( + :scope, + CASE WHEN :application IS NULL THEN '' ELSE :application END, + CASE WHEN :description IS NULL THEN '' ELSE :description END, + COALESCE(:manuallyAdded, false) +) ON CONFLICT (scope) DO UPDATE +SET + application = COALESCE(:application, EXCLUDED.application), + description = COALESCE(:description, EXCLUDED.description), + is_manually_added = EXCLUDED.is_manually_added OR COALESCE(:manuallyAdded, false) diff --git a/src/db/sqlite/sql/token-cleanup.sql b/src/db/sqlite/sql/token-cleanup.sql new file mode 100644 index 0000000..45f16b7 --- /dev/null +++ b/src/db/sqlite/sql/token-cleanup.sql @@ -0,0 +1,32 @@ +-- Remove tokens no longer in use. +WITH +-- reduce verbosity of using epoch timestamps +times AS ( + SELECT + (strftime('%s', 'now') - :codeLifespanSeconds) AS code_valid_offset, + strftime('%s', 'now') AS now +), +-- only clean after code has expired +cleanable_codes AS ( + SELECT t.code_id, t.is_token, t.is_revoked, t.expires, t.refresh_expires FROM token t, times + WHERE t.created < times.code_valid_offset +) +DELETE FROM token WHERE code_id IN ( + SELECT code_id FROM cleanable_codes c, times + WHERE + NOT c.is_token -- profile-only redemption + OR ( + c.is_token AND ( + c.is_revoked -- revoked + OR ( + c.expires < times.now AND ( + -- expired and unrefreshable + refresh_expires IS NULL + OR + -- expired and refresh expired + (refresh_expires IS NOT NULL AND refresh_expires < times.now) + ) + ) + ) + ) +) \ No newline at end of file diff --git a/src/db/sqlite/sql/token-get-by-code-id.sql b/src/db/sqlite/sql/token-get-by-code-id.sql new file mode 100644 index 0000000..c3ea5bb --- /dev/null +++ b/src/db/sqlite/sql/token-get-by-code-id.sql @@ -0,0 +1,20 @@ +-- +SELECT + t.code_id, + p.profile, + t.created, + t.expires, + t.refresh_expires, + t.refreshed, + t.duration, + t.refresh_duration, + t.refresh_count, + t.is_revoked, + t.is_token, + t.client_id, + t.profile_data, + a.identifier +FROM token t + INNER JOIN profile p USING (profile_id) + INNER JOIN authentication a USING (identifier_id) +WHERE code_id = :codeId diff --git a/src/db/sqlite/sql/token-refresh-revoke-by-code-id.sql b/src/db/sqlite/sql/token-refresh-revoke-by-code-id.sql new file mode 100644 index 0000000..52a851c --- /dev/null +++ b/src/db/sqlite/sql/token-refresh-revoke-by-code-id.sql @@ -0,0 +1,5 @@ +-- Revoke the refreshability for a token +UPDATE token SET + refresh_expires = NULL, + refresh_duration = NULL +WHERE code_id = :codeId diff --git a/src/db/sqlite/sql/token-revoke-by-code-id.sql b/src/db/sqlite/sql/token-revoke-by-code-id.sql new file mode 100644 index 0000000..27febe1 --- /dev/null +++ b/src/db/sqlite/sql/token-revoke-by-code-id.sql @@ -0,0 +1,5 @@ +-- +UPDATE token SET + is_revoked = true, + refresh_expires = NULL +WHERE code_id = :codeId diff --git a/src/db/sqlite/sql/token-scope-remove.sql b/src/db/sqlite/sql/token-scope-remove.sql new file mode 100644 index 0000000..94debac --- /dev/null +++ b/src/db/sqlite/sql/token-scope-remove.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM token_scope +WHERE code_id = :codeId AND scope_id = (SELECT scope_id FROM scope WHERE scope = :scope) diff --git a/src/db/sqlite/sql/token-scope-set.sql b/src/db/sqlite/sql/token-scope-set.sql new file mode 100644 index 0000000..7b52dc6 --- /dev/null +++ b/src/db/sqlite/sql/token-scope-set.sql @@ -0,0 +1,3 @@ +-- +INSERT INTO token_scope (code_id, scope_id) + SELECT :codeId, scope_id FROM scope WHERE scope = :scope diff --git a/src/db/sqlite/sql/token-scopes-get-by-code-id.sql b/src/db/sqlite/sql/token-scopes-get-by-code-id.sql new file mode 100644 index 0000000..5bd7b30 --- /dev/null +++ b/src/db/sqlite/sql/token-scopes-get-by-code-id.sql @@ -0,0 +1,4 @@ +-- +SELECT s.scope FROM token_scope ts + INNER JOIN scope s USING (scope_id) + WHERE ts.code_id = :codeId diff --git a/src/db/sqlite/sql/tokens-get-by-identifier.sql b/src/db/sqlite/sql/tokens-get-by-identifier.sql new file mode 100644 index 0000000..63a3f2c --- /dev/null +++ b/src/db/sqlite/sql/tokens-get-by-identifier.sql @@ -0,0 +1,21 @@ +-- +SELECT + t.code_id, + p.profile, + t.created, + t.expires, + t.refresh_expires, + t.refreshed, + t.duration, + t.refresh_duration, + t.refresh_count, + t.is_revoked, + t.is_token, + t.client_id, + t.profile_data, + a.identifier +FROM token t + INNER JOIN profile p USING (profile_id) + INNER JOIN authentication a USING (identifier_id) +WHERE a.identifier = :identifier +ORDER BY max(t.created, COALESCE(t.refreshed, 0)) DESC diff --git a/src/enum.js b/src/enum.js new file mode 100644 index 0000000..8179941 --- /dev/null +++ b/src/enum.js @@ -0,0 +1,27 @@ +'use strict'; +const common = require('./common'); +const { Enum } = require('@squeep/api-dingus'); + +common.mergeEnum(Enum, { + Specification: 'living-standard-20220212', + + ContentType: { + ApplicationOctetStream: 'application/octet-stream', + }, + + Header: { + Authorization: 'Authorization', + Link: 'Link', + Location: 'Location', + Pragma: 'Pragma', + UserAgent: 'User-Agent', + WWWAuthenticate: 'WWW-Authenticate', + }, + + Chore: { + CleanTokens: 'cleanTokens', + CleanScopes: 'cleanScopes', + }, +}); + +module.exports = Enum; diff --git a/src/errors.js b/src/errors.js new file mode 100644 index 0000000..9f4cb2b --- /dev/null +++ b/src/errors.js @@ -0,0 +1,21 @@ +'use strict'; + +const { Errors } = require('@squeep/api-dingus'); + +/** + * A stack-less exception for general data issues. + */ +class ValidationError extends Error { + constructor(...args) { + super(...args); + delete this.stack; + } + + get name() { + return this.constructor.name; + } +} +module.exports = { + ...Errors, + ValidationError, +}; \ No newline at end of file diff --git a/src/logger/data-sanitizers.js b/src/logger/data-sanitizers.js new file mode 100644 index 0000000..450842e --- /dev/null +++ b/src/logger/data-sanitizers.js @@ -0,0 +1,116 @@ +'use strict'; + +/** + * Scrub credential from POST login body data. + * @param {Object} data + * @param {Boolean} sanitize + * @returns {Boolean} + */ +function sanitizePostCredential(data, sanitize = true) { + let unclean = false; + + const credentialLength = data?.ctx?.parsedBody?.credential?.length; + if (credentialLength) { + unclean = true; + } + if (unclean && sanitize) { + data.ctx.parsedBody.credential = '*'.repeat(credentialLength); + } + + return unclean; +} + + +/** + * Reduce logged data about scopes from profilesScopes. + * For all referenced scopes, only include profiles list. + * Remove scopes without profile references from scopeIndex. + * @param {Object} data + * @param {Boolean} sanitize + */ +function reduceScopeVerbosity(data, sanitize = true) { + let unclean = false; + + const { + scopesEntries: ctxScopesEntries, + profilesEntries: ctxProfilesEntries, + needsSanitize: ctxNeedsSanitize, + } = _scopesFrom(data?.ctx?.profilesScopes); + + const { + scopesEntries: sessionScopesEntries, + profilesEntries: sessionProfilesEntries, + needsSanitize: sessionNeedsSanitize, + } = _scopesFrom(data?.ctx?.session); + + if (ctxNeedsSanitize || sessionNeedsSanitize) { + unclean = true; + } + if (unclean && sanitize) { + if (ctxNeedsSanitize) { + Object.assign(data.ctx.profilesScopes, _sanitizeProfilesScopes(ctxScopesEntries, ctxProfilesEntries)); + } + if (sessionNeedsSanitize) { + Object.assign(data.ctx.session, _sanitizeProfilesScopes(sessionScopesEntries, sessionProfilesEntries)); + } + } + + return unclean; +} + + +/** + * Return any scope entries on an object, and whether sanitization is needed. + * @param {Object=} obj + * @returns {Object} + */ +const _scopesFrom = (obj) => { + const scopesEntries = Object.entries(obj?.scopeIndex || {}); + const profilesEntries = Object.entries(obj?.profileScopes || {}); + const needsSanitize = scopesEntries.length || profilesEntries.length; + return { + scopesEntries, + profilesEntries, + needsSanitize, + }; +}; + + +/** + * @typedef {[String, Object]} ScopeEntry + */ +/** + * Return new list of entries with scrubbed scopeDetails. + * @param {ScopeEntry[]} entries + * @returns {ScopeEntry[]} + */ +const _scopeEntriesScrubber = (entries) => entries.map(([scopeName, scopeDetails]) => ([scopeName, { profiles: scopeDetails.profiles }])); + + +/** + * Create a new profilesScopes type object with scrubbed scope details. + * @param {ScopeEntry[]} scopesEntries + * @param {ScopeEntry[]} profilesEntries + * @returns {Object} + */ +const _sanitizeProfilesScopes = (scopesEntries, profilesEntries) => { + const referencedScopesEntries = scopesEntries.filter(([_scopeName, scopeDetails]) => scopeDetails?.profiles?.length); // eslint-disable-line no-unused-vars + const scrubbedScopesEntries = _scopeEntriesScrubber(referencedScopesEntries); + + const scrubbedProfilesEntries = profilesEntries.map(([profileName, profileScopes]) => { + const profileScopeEntries = Object.entries(profileScopes); + const scrubbedProfileScopeEntries = _scopeEntriesScrubber(profileScopeEntries); + const scrubbedProfileScopes = Object.fromEntries(scrubbedProfileScopeEntries); + return [profileName, scrubbedProfileScopes]; + }); + + return { + scopeIndex: Object.fromEntries(scrubbedScopesEntries), + profileScopes: Object.fromEntries(scrubbedProfilesEntries), + }; +}; + +module.exports = { + sanitizePostCredential, + reduceScopeVerbosity, +}; \ No newline at end of file diff --git a/src/logger/index.js b/src/logger/index.js new file mode 100644 index 0000000..7944cf6 --- /dev/null +++ b/src/logger/index.js @@ -0,0 +1,13 @@ +'use strict'; + +const BaseLogger = require('@squeep/logger-json-console'); +const dataSanitizers = require('./data-sanitizers'); + +class Logger extends BaseLogger { + constructor(options, ...args) { + super(options, ...args); + Array.prototype.push.apply(this.dataSanitizers, Object.values(dataSanitizers)); + } +} + +module.exports = Logger; \ No newline at end of file diff --git a/src/manager.js b/src/manager.js new file mode 100644 index 0000000..6c16414 --- /dev/null +++ b/src/manager.js @@ -0,0 +1,2015 @@ +'use strict'; + +const common = require('./common'); +const { ResponseError, ValidationError } = require('./errors'); +const Enum = require('./enum'); +const { Communication, Errors: CommunicationErrors } = require('@squeep/indieauth-helper'); +const Template = require('./template'); +const { MysteryBox } = require('@squeep/mystery-box'); +const DBErrors = require('./db/errors'); +const Chores = require('./chores'); +const { Publisher: QueuePublisher } = require('@squeep/amqp-helper'); + +const _fileScope = common.fileScope(__filename); + +// These are used during request ingestion and validation +const validBase64URLRE = /^[-A-Za-z0-9_]+$/; +const scopeSplitRE = / +/; + +const supportedCodeChallengeMethods = ['S256', 'SHA256']; + +class Manager { + constructor(logger, db, options) { + this.options = options; + this.logger = logger; + this.db = db; + this.chores = new Chores(logger, db, options); + this.communication = new Communication(logger, options); + if (options.queues.amqp.url) { + this.queuePublisher = new QueuePublisher(logger, options.queues.amqp); + } + this.mysteryBox = new MysteryBox(logger, options); + + // We need to know how the outside world sees us, to verify if a + // profile indicates us as the auth server. + // selfBaseUrl should already include proxy prefix and end with a / + this.selfAuthorizationEndpoint = options.dingus.selfBaseUrl + options.route.authorization; + } + + + /** + * Perform any async startup tasks. + */ + async initialize() { + if (this.queuePublisher) { + await this._connectQueues(); + } + } + + + async _connectQueues() { + await this.queuePublisher.connect(); + await this.queuePublisher.establishAMQPPlumbing(this.options.queues.ticketPublishName); + } + + + /** + * Add an error to a session, keeping only the most-severe code, but all descriptions. + * This error is sent along on the redirection back to client endpoint. + * @param {Object} ctx + * @param {Object} ctx.session + * @param {String[]=} ctx.session.errorDescriptions + * @param {String=} ctx.session.error + * @param {String} error + * @param {String} errorDescription + */ + static _setError(ctx, error, errorDescription) { + const errorPrecedence = [ // By increasing severity + 'invalid_scope', + 'unsupported_response_type', + 'access_denied', + 'unauthorized_client', + 'invalid_grant', + 'invalid_request', + 'temporarily_unavailable', + 'server_error', + ]; + if (!(errorPrecedence.includes(error))) { + throw new RangeError(`invalid error value '${error}'`); + } + if (!ctx.session.errorDescriptions) { + ctx.session.errorDescriptions = []; + } + if (!common.validError(errorDescription)) { + throw new RangeError(`invalid error description '${errorDescription}'`); + } + const isHigherPrecedence = errorPrecedence.indexOf(error) > errorPrecedence.indexOf(ctx.session.error); + if (!ctx.session.error || isHigherPrecedence) { + ctx.session.error = error; + } + if (isHigherPrecedence) { + ctx.session.errorDescriptions.unshift(errorDescription); + } else { + ctx.session.errorDescriptions.push(errorDescription); + } + } + + + /** + * Discourage caching of a response. + * OAuth 2.1 §3.2.3 + * The authorization server MUST include the HTTP Cache-Control response + * header field with a value of no-store in any response + * containing tokens, credentials, or other sensitive information. + * @param {http.ServerResponse} res + */ + static _sensitiveResponse(res) { + Object.entries({ + [Enum.Header.CacheControl]: 'no-store', + [Enum.Header.Pragma]: 'no-cache', + }).forEach(([k, v]) => res.setHeader(k, v)); + } + + + /** + * Sets params entries as url search parameters. + * @param {URL} url + * @param {Object} params + */ + static _setSearchParams(url, params) { + Object.entries(params).forEach((param) => url.searchParams.set(...param)); + } + + + /** + * Serve the informational root page. + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getRoot(res, ctx) { + const _scope = _fileScope('getRoot'); + this.logger.debug(_scope, 'called', { ctx }); + + res.end(Template.rootHTML(ctx, this.options)); + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Serve the metadata for this service. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getMeta(res, ctx) { + const _scope = _fileScope('getMeta'); + this.logger.debug(_scope, 'called', { ctx }); + + const base = this.options.dingus.selfBaseUrl; + const endpoint = (r) => `${base}${this.options.route[r]}`; // eslint-disable-line security/detect-object-injection + + const metadata = { + issuer: base, + 'authorization_endpoint': endpoint('authorization'), + 'token_endpoint': endpoint('token'), + ...(this.queuePublisher && { 'ticket_endpoint': endpoint('ticket') }), + 'introspection_endpoint': endpoint('introspection'), + 'introspection_endpoint_auth_methods_supported': ['Bearer'], + 'revocation_endpoint': endpoint('revocation'), + 'revocation_endpoint_auth_methods_supported': ['none'], + 'scopes_supported': ['profile', 'email'], // only advertise minimum IA scopes + 'response_types_supported': 'code', + 'grant_types_supported': [ + 'authorization_code', + 'refresh_token', + ...(this.queuePublisher && ['ticket'] || []), + ], + 'service_documentation': 'https://indieauth.spec.indieweb.org/', + 'code_challenge_methods_supported': supportedCodeChallengeMethods, + 'authorization_response_iss_parameter_supported': true, + 'userinfo_endpoint': endpoint('userinfo'), + }; + + res.end(JSON.stringify(metadata)); + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Process an authorization request from a client. + * User has authenticated, check if user matches profile, + * present user with consent form. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getAuthorization(res, ctx) { + const _scope = _fileScope('getAuthorization'); + this.logger.debug(_scope, 'called', { ctx }); + + ctx.session = Object.assign({}, ctx.session, { + errorDescriptions: [], + }); + + // Ingest and validate expected data, populating ctx.session. + await this._clientIdRequired(ctx); + Manager._redirectURIRequired(ctx); + Manager._responseTypeRequired(ctx); + Manager._stateRequired(ctx); + this._codeChallengeMethodRequired(ctx); + this._codeChallengeRequired(ctx); + this._scopeOptional(ctx); + await this._meOptional(ctx); + + if (!ctx.session.clientIdentifier || !ctx.session.redirectUri) { + // Do not redirect if either of these fields were invalid, just report error. + this.logger.debug(_scope, 'invalid request, not redirecting', { ctx }); + + // Set error response for template to render. + ctx.errors.push('Cannot redirect to client application.'); + ctx.errorContent = [ + 'There was an error in the request sent by the application attempting to authenticate you. Check with that service.', + ]; + res.statusCode = 400; + res.end(Template.authorizationErrorHTML(ctx, this.options)); + this.logger.info(_scope, 'bad request', { ctx }); + return; + } + + await this.db.context(async (dbCtx) => { + const profilesScopes = await this.db.profilesScopesByIdentifier(dbCtx, ctx.authenticationId); + Object.assign(ctx.session, { + profiles: [], + profileScopes: {}, + scopeIndex: {}, + }, profilesScopes); + }); // dbCtx + + if (!ctx.session.profiles.length) { + this.logger.error(_scope, 'identifier has no profiles', { ctx }); + Manager._setError(ctx, 'access_denied', 'Profile not valid for the authenticated user.'); + } + + if (!this._profileValidForIdentifier(ctx)) { + // if the hinted profile supplied in me does not match any known + // profile mappings for the authenticated identifier, remove the + // hint. UI will prompt to choose from available profiles. + this.logger.debug(_scope, 'removing provided me hint, not valid for identifier', { ctx }); + delete ctx.session.me; + } + + // Ugly support logic for allowing legacy non-pkce requests, for the micropub.rocks site until it is updated. + // Require both be missing to qualify as a legacy request, otherwise still fail. + const isMissingBothPKCE = (!ctx.session.codeChallengeMethod) && (!ctx.session.codeChallenge); + if (isMissingBothPKCE && this.options.manager.allowLegacyNonPKCE) { + ctx.notifications.push('

'); + } else { + if (!ctx.session.codeChallenge) { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'code_challenge\''); + } + if (!ctx.session.codeChallengeMethod) { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'code_challenge_method\''); + } + } + + // If anything went wrong, redirect with error report. + if (ctx.session.error) { + // Valid redirect_url and client_id, errors hop back to them. + this.logger.debug(_scope, 'invalid request, redirecting', { ctx }); + + Manager._setSearchParams(ctx.session.redirectUri, { + 'state': ctx.session.state, + 'error': ctx.session.error, + 'error_description': ctx.session.errorDescriptions.join(', '), + }); + res.statusCode = 302; // Found + res.setHeader(Enum.Header.Location, ctx.session.redirectUri.href); + res.end(); + this.logger.info(_scope, 'bad request', { ctx }); + return; + } + + // Store the current state of this session, to be forwarded on to consent processing. + // This blob will be passed on as a form field in consent response. + ctx.session.persist = await this.mysteryBox.pack({ + id: common.requestId(), // codeId in database + clientId: ctx.session.clientId.href, + clientIdentifier: ctx.session.clientIdentifier, + redirectUri: ctx.session.redirectUri.href, + responseType: ctx.session.responseType, + state: ctx.session.state, + codeChallengeMethod: ctx.session.codeChallengeMethod, + codeChallenge: ctx.session.codeChallenge, + me: ctx.session.me, + profiles: ctx.session.profiles, + requestedScopes: ctx.session.scope, + authenticationId: ctx.authenticationId, + }); + + // Present authenticated user the option to submit consent + const content = Template.authorizationRequestHTML(ctx, this.options); + res.end(content); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Validates, fetches, and parses client_id url, populating clientIdentifier with client h-app data. + * @param {Object} ctx + */ + async _clientIdRequired(ctx) { + if (ctx.queryParams['client_id']) { + try { + ctx.session.clientId = await this.communication.validateClientIdentifier(ctx.queryParams['client_id']); + ctx.session.clientIdentifier = await this.communication.fetchClientIdentifier(ctx.session.clientId); + if (!ctx.session.clientIdentifier) { + Manager._setError(ctx, 'invalid_request', 'invalid client_id: could not fetch'); + throw new ValidationError('could not fetch'); + } + } catch (e) { + ctx.session.clientId = undefined; + if (e instanceof CommunicationErrors.ValidationError) { + Manager._setError(ctx, 'invalid_request', e.message); + } + Manager._setError(ctx, 'invalid_request', 'invalid value for parameter \'client_id\''); + } + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'client_id\''); + } + } + + + /** + * Ensure redirect_uri exists and is corroborated by clientIdentifier data. + * @param {Object} ctx + */ + static _redirectURIRequired(ctx) { + if (ctx.queryParams['redirect_uri']) { + try { + ctx.session.redirectUri = new URL(ctx.queryParams['redirect_uri']); + + if (ctx.session.clientId) { + // Either all these parts must match, or a specific alternative must be specified. + const redirectMatchesClientId = ['protocol', 'hostname', 'port'] + .map((p) => ctx.session.redirectUri[p] == ctx.session.clientId[p]) // eslint-disable-line security/detect-object-injection + .reduce((acc, match) => acc && match, true); + + // Check for alternate redirect_uri entries on client_id data if no initial match + if (!redirectMatchesClientId) { + const validRedirectUris = ctx.session?.clientIdentifier?.['rels']?.['redirect_uri'] || []; + if (!validRedirectUris.includes(ctx.session.redirectUri.href)) { + Manager._setError(ctx, 'invalid_request', 'redirect_uri not valid for that client_id'); + // Remove invalid redirect_uri from session; doing this eases error routing. + ctx.session.redirectUri = undefined; + } + } + } + } catch (e) { + Manager._setError(ctx, 'invalid_request', 'invalid value for parameter \'redirect_uri\''); + } + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'redirect_uri\''); + } + } + + + /** + * response_type must be valid + * @param {Object} ctx + */ + static _responseTypeRequired(ctx) { + ctx.session.responseType = ctx.queryParams['response_type']; + if (ctx.session.responseType) { + // Must be one of these types + if (!['code'].includes(ctx.session.responseType)) { + Manager._setError(ctx, 'unsupported_response_type', 'invalid value for parameter \'response_type\''); + } + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'response_type\''); + } + } + + + /** + * A state parameter must be present + * @param {Object} ctx + */ + static _stateRequired(ctx) { + ctx.session.state = ctx.queryParams['state']; + if (ctx.session.state) { + // No restrictions on content of this + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'state\''); + } + } + + + /** + * A code_challenge_method must be present and valid + * @param {Object} ctx + */ + _codeChallengeMethodRequired(ctx) { + ctx.session.codeChallengeMethod = ctx.queryParams['code_challenge_method']; + if (ctx.session.codeChallengeMethod) { + if (!supportedCodeChallengeMethods.includes(ctx.session.codeChallengeMethod)) { + Manager._setError(ctx, 'invalid_request', 'unsupported code_challenge_method'); + } + } else { + if (this.options.manager.allowLegacyNonPKCE) { + return; + } + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'code_challenge_method\''); + } + } + + + /** + * A code_challenge must be present + * @param {Object} ctx + */ + _codeChallengeRequired(ctx) { + ctx.session.codeChallenge = ctx.queryParams['code_challenge']; + if (ctx.session.codeChallenge) { + if (!validBase64URLRE.test(ctx.session.codeChallenge)) { + Manager._setError(ctx, 'invalid_request', 'invalid value for parameter \'code_challenge\''); + } + } else { + if (this.options.manager.allowLegacyNonPKCE) { + return; + } + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'code_challenge\''); + } + } + + + /** + * Scopes may be present, with one known combination limitation + * @param {Object} ctx + */ + _scopeOptional(ctx) { + const _scope = _fileScope('_scopeOptional'); + const scope = ctx.queryParams['scope']; + ctx.session.scope = []; + if (scope) { + const allScopes = scope.split(scopeSplitRE); + const validScopes = allScopes.filter((s) => common.validScope(s)); + ctx.session.scope.push(...validScopes); + if (allScopes.length != validScopes.length) { + const invalidScopes = allScopes.filter((s) => !common.validScope(s)); + this.logger.debug(_scope, 'client requested invalid scope', { ctx, invalidScopes }); + } + } + // If email scope is requested, profile scope must also be explicitly requested. + if (ctx.session.scope.includes('email') + && !ctx.session.scope.includes('profile')) { + Manager._setError(ctx, 'invalid_scope', 'cannot provide \'email\' scope without \'profile\' scope'); + } + } + + + /** + * Parses me, if provided + * @param {Object} ctx + */ + async _meOptional(ctx) { + const me = ctx.queryParams['me']; + if (me) { + try { + ctx.session.me = await this.communication.validateProfile(me); + } catch (e) { + ctx.session.me = undefined; + } + } + } + + + /** + * Ensure authenticated identifier matches profile. + * @param {Object} ctx + * @returns {Boolean} + */ + _profileValidForIdentifier(ctx) { + const _scope = _fileScope('_profileValidForIdentifier'); + + if (!ctx.session.me) { + this.logger.debug(_scope, 'no profile provided, cannot correlate', { ctx }); + return false; + } + + return ctx.session.profiles.includes(ctx.session.me.href); + } + + + /** + * Get numeric value from form field data. + * @param {*} ctx + * @param {String} field + * @param {String} customField + * @returns {Number=} + */ + _parseLifespan(ctx, field, customField) { + const _scope = _fileScope('_parseLifespan'); + + const presetValues = { + 'never': undefined, + '1d': 86400, + '1w': 86400 * 7, + '1m': 86400 * 31, + }; + const fieldValue = ctx.parsedBody[field]; // eslint-disable-line security/detect-object-injection + if (fieldValue in presetValues) { + return presetValues[fieldValue]; // eslint-disable-line security/detect-object-injection + } + + if (fieldValue === 'custom') { + const expiresSeconds = parseInt(ctx.parsedBody[customField], 10); // eslint-disable-line security/detect-object-injection + if (isFinite(expiresSeconds) && expiresSeconds > 0) { + return expiresSeconds; + } else { + this.logger.debug(_scope, 'invalid custom value', { ctx, field, customField }); + } + } + + this.logger.debug(_scope, 'invalid value', { ctx, field, customField }); + return undefined; + } + + + /** + * Validate any accepted scopes, ensure uniqueness, return as array. + * @param {Object} ctx + * @returns {String=} + */ + _parseConsentScopes(ctx) { + const _scope = _fileScope('_ingestConsentScopes'); + const acceptedScopesSet = new Set(); + const rejectedScopesSet = new Set(); + + const submittedScopes = common.ensureArray(ctx.parsedBody['accepted_scopes']) + .concat((ctx.parsedBody['ad_hoc_scopes'] || '').split(scopeSplitRE)); + submittedScopes.forEach((scope) => { + if (scope) { + (common.validScope(scope) ? acceptedScopesSet : rejectedScopesSet).add(scope); + } + }); + + // If email scope was accepted but profile was not, elide email scope + if (acceptedScopesSet.has('email') + && !acceptedScopesSet.has('profile')) { + acceptedScopesSet.delete('email'); + rejectedScopesSet.add('email (without profile)'); + } + + if (rejectedScopesSet.size) { + this.logger.debug(_scope, 'ignoring invalid scopes', { ctx, rejectedScopes: Array.from(rejectedScopesSet) }); + } + + return Array.from(acceptedScopesSet); + } + + + /** + * Parse and validate selected me is a valid profile option. + * @param {Object} ctx + * @returns {URL} + */ + _parseConsentMe(ctx) { + const _scope = _fileScope('_parseConsentMe'); + const selectedMe = ctx.parsedBody['me']; + try { + const me = new URL(selectedMe); + if (ctx.session.profiles.includes(me.href)) { + return me; + } else { + this.logger.debug(_scope, 'selected \'me\' profile not among available', { me, available: ctx.session.profiles, ctx }); + Manager._setError(ctx, 'invalid_request', 'invalid profile url'); + } + } catch (e) { + this.logger.debug(_scope, 'failed to parse selected \'me\' as url', { error: e, ctx }); + Manager._setError(ctx, 'invalid_request', 'invalid profile url'); + } + return undefined; + } + + + /** + * Get up-to-date profile data from selected profile endpoint. + * @param {Object} ctx + * @returns {Object} + */ + async _fetchConsentProfileData(ctx) { + const _scope = _fileScope('_fetchConsentProfileData'); + try { + const profile = await this.communication.fetchProfile(ctx.session.me); + if (!profile) { + this.logger.debug(_scope, 'no profile data at \'me\' endpoint', { ctx }); + Manager._setError(ctx, 'temporarily_unavailable', 'unable to retrieve profile'); + } else { + // Profile info gets persisted in code, only include known profile fields to help keep size down. + return common.pick(profile, [ + 'name', + 'photo', + 'url', + 'email', + ]); + } + } catch (e) { + this.logger.debug(_scope, 'failed to fetch \'me\' endpoint', { error: e, ctx }); + Manager._setError(ctx, 'temporarily_unavailable', 'could not reach profile endpoint'); + } + return undefined; + } + + + /** + * Ingest user consent response details, redirect as needed. + * Receives POST request from consent page, expecting these form fields: + * session - encrypted data collected from initial auth call + * accept - 'true' if consent was granted + * accepted_scopes - list of scopes to grant + * ad_hoc_scopes - additional scopes specified by user + * me - selected profile to identify as + * expires - optional lifespan + * expires-seconds - optional custom lifespan + * refresh - optional refresh lifespan + * refresh-seconds - optional custom refresh lifespan + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postConsent(res, ctx) { + const _scope = _fileScope('postConsent'); + this.logger.debug(_scope, 'called', { ctx }); + + // Ensure session exists, persisting any login session data. + ctx.session = Object.assign({}, ctx.session); + try { + // Recover the session established on initial auth request. + const oldSession = await this.mysteryBox.unpack(ctx.parsedBody['session']); + Object.assign(ctx.session, oldSession); + ctx.session.redirectUri = new URL(ctx.session.redirectUri); + ctx.session.clientId = new URL(ctx.session.clientId); + } catch (e) { + this.logger.debug(_scope, 'failed to unpack session', { error: e, ctx }); + Manager._setError(ctx, 'invalid_request', 'un-parsable data in authorization consent'); + } + + // If these are missing, we cannot proceed. + if (!ctx.session.clientId || !ctx.session.redirectUri) { + // Set error response for html template to render. + ctx.errors = [ + 'Cannot redirect to client application.', + ]; + ctx.errorContent = [ + 'There was an error in the request sent by the application attempting to authenticate you. Check with that service.', + ]; + res.statusCode = 400; + res.end(Template.authorizationErrorHTML(ctx, this.options)); + this.logger.info(_scope, 'bad request, cannot redirect', { ctx }); + return; + } + + // TODO: Should probably re-validate more unpacked session values, even though those should be trustable. + + // Check if we need to check anything else. + ctx.session.accept = (ctx.parsedBody['accept'] === 'true'); + if (!ctx.session.accept) { + this.logger.debug(_scope, 'consent denied', { ctx }); + Manager._setError(ctx, 'access_denied', 'authorization was not granted'); + } else { + // Ingest form data. + ctx.session.acceptedScopes = this._parseConsentScopes(ctx); + ctx.session.me = this._parseConsentMe(ctx); + ctx.session.profile = await this._fetchConsentProfileData(ctx); + ctx.session.tokenLifespan = this._parseLifespan(ctx, 'expires', 'expires-seconds'); + if (ctx.session.tokenLifespan) { + ctx.session.refreshLifespan = this._parseLifespan(ctx, 'refresh', 'refresh-seconds'); + } + } + + if (ctx.session.error) { + this.logger.debug(_scope, 'invalid request, redirecting', { ctx }); + + // Set all errors as parameters for client to interpret upon redirection. + Manager._setSearchParams(ctx.session.redirectUri, { + 'state': ctx.session.state, + 'error': ctx.session.error, + 'error_description': ctx.session.errorDescriptions.join(', '), + }); + res.statusCode = 302; // Found + res.setHeader(Enum.Header.Location, ctx.session.redirectUri.href); + res.end(); + this.logger.info(_scope, 'bad request, redirected', { ctx }); + return; + } + + // Consented, off we go. Keep all this session state as the code. + const code = await this.mysteryBox.pack({ + codeId: ctx.session.id, + codeChallengeMethod: ctx.session.codeChallengeMethod, + codeChallenge: ctx.session.codeChallenge, + clientId: ctx.session.clientId.href, + redirectUri: ctx.session.redirectUri.href, + acceptedScopes: ctx.session.acceptedScopes, + tokenLifespan: ctx.session.tokenLifespan, + refreshLifespan: ctx.session.refreshLifespan, + me: ctx.session.me.href, + profile: ctx.session.profile, + identifier: ctx.session.authenticatedIdentifier, // need this to pair with profile + minted: Date.now(), + }); + + Manager._setSearchParams(ctx.session.redirectUri, { + 'code': code, + 'state': ctx.session.state, + 'iss': this.options.dingus.selfBaseUrl, + }); + res.statusCode = 302; + res.setHeader(Enum.Header.Location, ctx.session.redirectUri.href); + res.end(); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Redeem a code for a profile url, and maybe more profile info. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postAuthorization(res, ctx) { + const _scope = _fileScope('postAuthorization'); + this.logger.debug(_scope, 'called', { ctx }); + + await this._ingestPostAuthorizationRequest(ctx); + + const response = { + me: ctx.session.me, + ...(ctx.session?.acceptedScopes?.includes('profile') && { profile: ctx.session.profile }), + scope: ctx.session.acceptedScopes, + }; + if (response.profile && !ctx.session?.acceptedScopes?.includes('email')) { + delete response.profile.email; + } + + if (!ctx.session.error) { + await this.db.context(async (dbCtx) => { + // Record code redemption without token. + const valid = await this.db.redeemCode(dbCtx, { + codeId: ctx.session.codeId, + created: new Date(), + isToken: false, + clientId: ctx.session.clientId.href, + profile: ctx.session.me, + identifier: ctx.session.identifier, + scopes: ctx.session.acceptedScopes, + lifespanSeconds: Math.ceil(this.options.manager.codeValidityTimeoutMs / 1000), + profileData: response.profile, + }); + if (!valid) { + this.logger.debug(_scope, 'code already redeemed', { ctx }); + Manager._setError(ctx, 'access_denied', 'code already redeemed'); + } + }); // dbCtx + } + + if (ctx.session.error) { + res.statusCode = 400; + res.end(JSON.stringify({ + 'error': ctx.session.error, + 'error_description': ctx.session.errorDescriptions.join(', '), + })); + this.logger.info(_scope, 'invalid request', { ctx }); + return; + } + + res.end(JSON.stringify(response)); + + this.logger.info(_scope, 'finished', { ctx, response }); + } + + + /** + * Ingest an incoming authorization redemption request, parsing fields + * onto a new session object on the context. + * @param {*} dbCtx + * @param {Object} ctx + */ + async _ingestPostAuthorizationRequest(ctx) { + const _scope = _fileScope('_ingestPostAuthorizationRequest'); + + ctx.session = Object.assign({}, ctx.session, { + errorDescriptions: [], + }); + + if (!ctx.parsedBody) { + this.logger.debug(_scope, 'no body data', { ctx }); + Manager._setError(ctx, 'invalid_request', 'missing data'); + } + + await this._restoreSessionFromCode(ctx); + this._checkSessionMatchingClientId(ctx); + this._checkSessionMatchingRedirectUri(ctx); + this._checkGrantType(ctx); + this._checkSessionMatchingCodeVerifier(ctx); + + if (!ctx.session.me || !ctx.session.minted) { + this.logger.debug(_scope, 'session missing fields', { ctx }); + Manager._setError(ctx, 'invalid_request', 'malformed code'); + return; + } + + const expires = new Date(ctx.session.minted + this.options.manager.codeValidityTimeoutMs); + const now = new Date(); + if (expires < now) { + this.logger.debug(_scope, 'code expired', { ctx }); + Manager._setError(ctx, 'invalid_request', 'code has expired'); + } + } + + + /** + * Unpack the session data from provided code overtop of context session .. + * @param {Object} ctx + */ + async _restoreSessionFromCode(ctx) { + const _scope = _fileScope('_restoreSessionFromCode'); + + const code = ctx.parsedBody['code']; + if (code) { + try { + const oldSession = await this.mysteryBox.unpack(code); + + // TODO: Validate unpacked fields better + const missingFields = [ + 'codeId', + 'codeChallengeMethod', + 'codeChallenge', + 'clientId', + 'redirectUri', + 'acceptedScopes', + 'me', + 'profile', + 'identifier', + 'minted', + ].filter((requiredField) => !(requiredField in oldSession)); + if (missingFields.length) { + if (this.options.manager.allowLegacyNonPKCE + && missingFields.length === 2 + && missingFields.includes('codeChallenge') + && missingFields.includes('codeChallengeMethod')) { + this.logger.debug(_scope, 'allowing legacy non-PKCE session', { ctx }); + } else { + this.logger.debug(_scope, 'unpacked code is missing required field', { missingFields, ctx }); + Manager._setError(ctx, 'invalid_request', 'code is not valid'); + } + } + + Object.assign(ctx.session, oldSession); + } catch (e) { + this.logger.debug(_scope, 'failed to parse code', { error: e, ctx }); + Manager._setError(ctx, 'invalid_request', 'code is not valid'); + } + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'code\''); + } + } + + + /** + * Ensure provided client_id matches session clientId. + * @param {Object} ctx + */ + _checkSessionMatchingClientId(ctx) { + const _scope = _fileScope('_checkSessionMatchingClientId'); + + let clientId = ctx.parsedBody['client_id']; + if (clientId) { + try { + clientId = new URL(clientId); + ctx.session.clientId = new URL(ctx.session.clientId); + } catch (e) { + this.logger.debug(_scope, 'un-parsable client_id url', { ctx }); + delete ctx.session.clientId; + Manager._setError(ctx, 'invalid_request', 'malformed client_id'); + return; + } + if (clientId.href !== ctx.session.clientId.href) { + this.logger.debug(_scope, 'clientId mismatched', { clientId, ctx }); + delete ctx.session.clientId; + Manager._setError(ctx, 'invalid_request', 'code does not belong to that client_id'); + } + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'client_id\''); + } + } + + + /** + * @param {Object} ctx + */ + _checkSessionMatchingRedirectUri(ctx) { + const _scope = _fileScope('_checkSessionMatchingClientId'); + + let redirectUri = ctx.parsedBody['redirect_uri']; + if (redirectUri) { + try { + redirectUri = new URL(redirectUri); + ctx.session.redirectUri = new URL(ctx.session.redirectUri); + } catch (e) { + this.logger.debug(_scope, 'un-parsable redirect_uri url', { ctx }); + delete ctx.session.redirectUri; + Manager._setError(ctx, 'invalid_request', 'malformed redirect_url'); + return; + } + if (redirectUri.href !== ctx.session.redirectUri.href) { + this.logger.debug(_scope, 'redirectUri mismatched', { redirectUri, ctx }); + delete ctx.session.redirectUri; + Manager._setError(ctx, 'invalid_request', 'code does not belong to that redirect_uri'); + } + } else { + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'redirect_uri\''); + } + } + + + /** + * Validate grant_type, either persist on session or set error. + * @param {Object} ctx + * @param {String[]} validGrantTypes + * @param {Boolean} treatEmptyAs + */ + _checkGrantType(ctx, validGrantTypes = ['authorization_code'], treatEmptyAs = 'authorization_code') { + const _scope = _fileScope('_checkGrantType'); + + const grantType = ctx.parsedBody['grant_type'] || treatEmptyAs; + if (!ctx.parsedBody['grant_type'] && treatEmptyAs) { + this.logger.debug(_scope, `missing grant_type, treating as ${treatEmptyAs}`, { ctx }); + } + if (validGrantTypes.includes(grantType)) { + ctx.session.grantType = grantType; + } else { + Manager._setError(ctx, 'invalid_request', 'grant_type not supported'); + } + } + + + /** + * @param {Object} ctx + */ + _checkSessionMatchingCodeVerifier(ctx) { + const _scope = _fileScope('_checkSessionMatchingCodeVerifier'); + + const codeVerifier = ctx.parsedBody['code_verifier']; + if (codeVerifier) { + try { + const valid = Communication.verifyChallenge(ctx.session.codeChallenge, codeVerifier, ctx.session.codeChallengeMethod); + if (!valid) { + this.logger.debug(_scope, 'challenge mismatched', { ctx }); + Manager._setError(ctx, 'invalid_request', 'challenge verification failed'); + } + } catch (e) /* istanbul ignore next */ { + this.logger.error(_scope, 'challenge validation failed', { error: e, ctx }); + Manager._setError(ctx, 'invalid_request', 'challenge verification failed'); + } + } else { + if (this.options.manager.allowLegacyNonPKCE + && !ctx.session.codeChallenge + && !ctx.session.codeChallengeMethod) { + this.logger.debug(_scope, 'allowing non-PKCE', { ctx }); + return; + } + Manager._setError(ctx, 'invalid_request', 'missing required parameter \'code_verifier\''); + } + } + + + /** + * Attempt to revoke a token. + * @param {*} dbCtx + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async _revokeToken(dbCtx, res, ctx) { + const _scope = _fileScope('_revokeToken'); + try { + const token = ctx.parsedBody['token']; + const tokenTypeHint = ctx.parsedBody['token_type_hint']; + switch (tokenTypeHint) { + case undefined: + break; + case 'access_token': + break; + case 'refresh_token': + break; + default: + this.logger.debug(_scope, 'unknown token_type_hint', { ctx }); + } + if (!token) { + throw new ValidationError('Token Missing'); + } + ctx.token = await this.mysteryBox.unpack(token); + if (!(ctx.token?.c || ctx.token?.rc)) { + throw new ValidationError('Token Invalid'); + } + } catch (e) { + this.logger.debug(_scope, 'invalid token', { error: e, ctx }); + res.statusCode = 400; + res.end(); + this.logger.info(_scope, 'finished, revoke request not valid', { error: e, ctx }); + return; + } + + try { + if (ctx.token.c) { + await this.db.tokenRevokeByCodeId(dbCtx, ctx.token.c); + } else { + await this.db.tokenRefreshRevokeByCodeId(dbCtx, ctx.token.rc); + } + } catch (e) { + if (e instanceof DBErrors.UnexpectedResult) { + res.statusCode = 404; + res.end(); + this.logger.info(_scope, 'finished, no token to revoke', { error: e, ctx }); + return; + } + this.logger.error(_scope, 'revoke token failed', { error: e, ctx }); + throw e; + } + + res.end(); + this.logger.info(_scope, 'finished, token revoked', { ctx }); + } + + + /** + * Legacy token validation flow. + * @param {*} dbCtx + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async _validateToken(dbCtx, req, res, ctx) { + const _scope = _fileScope('_validateToken'); + await this._checkTokenValidationRequest(dbCtx, req, ctx); + if (ctx.bearer.isValid) { + Manager._sensitiveResponse(res); + res.end(JSON.stringify({ + me: ctx.token.profile, + 'client_id': ctx.token.clientId, + scope: ctx.token.scopes, + })); + this.logger.info(_scope, 'finished, token validated', { ctx }); + } else { + const responseErrorParts = ['Bearer']; + const error = ctx.session.error ? `error="${ctx.session.error}"` : ''; + if (error) { + responseErrorParts.push(error); + } + const errorDescription = ctx.session.errorDescriptions ? `error_description="${ctx.session.errorDescriptions.join(', ')}"` : ''; + if (errorDescription) { + responseErrorParts.push(errorDescription); + } + res.setHeader(Enum.Header.WWWAuthenticate, responseErrorParts.join(', ')); + this.logger.info(_scope, 'finished, token not validated', { ctx }); + throw new ResponseError(Enum.ErrorResponse.Unauthorized); + } + } + + + /** + * Given a list of newly-requested scopes, return a list of scopes + * from previousScopes which are not in requestedScopes. + * @param {String[]} previousScopes + * @param {String[]} requestedScopes + * @returns {String[]} + */ + static _scopeDifference(previousScopes, requestedScopes) { + const scopesToRemove = []; + const existingScopesSet = new Set(previousScopes); + const validRequestedScopes = requestedScopes.filter((s) => common.validScope(s)); + const requestedScopesSet = new Set(validRequestedScopes); + existingScopesSet.forEach((s) => { + if (!requestedScopesSet.has(s)) { + scopesToRemove.push(s); + } + }); + return scopesToRemove; + } + + + /** + * Redeem a refresh token for a new token. + * @param {*} dbCtx + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async _refreshToken(dbCtx, req, res, ctx) { + const _scope = _fileScope('_refreshToken'); + this.logger.debug(_scope, 'called', { ctx }); + + const { + 'client_id': clientId, + scope, + } = ctx.parsedBody; + + try { + ctx.refreshToken = await this.mysteryBox.unpack(ctx.parsedBody['refresh_token']); + } catch (e) { + this.logger.debug(_scope, 'failed to unpack token', { error: e, ctx }); + } + + const now = new Date(); + const nowEpoch = common.dateToEpoch(now); + + await this.db.transaction(dbCtx, async (txCtx) => { + if (ctx.refreshToken?.rc) { + ctx.token = await this.db.tokenGetByCodeId(txCtx, ctx.refreshToken.rc); + } + + if (!ctx.token) { + this.logger.debug(_scope, 'no token to refresh', { ctx }); + throw new ResponseError(Enum.ErrorResponse.NotFound); + } + + if (!ctx.token.refreshExpires + || ctx.token.refreshExpires < now) { + this.logger.debug(_scope, 'token not refreshable or refresh expired', { ctx }); + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + const refreshExpiresEpoch = common.dateToEpoch(ctx.token.refreshExpires); + if (ctx.refreshToken.exp < refreshExpiresEpoch) { + this.logger.debug(_scope, 'token already refreshed', { ctx }); + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + if (clientId !== ctx.token.clientId) { + this.logger.debug(_scope, 'client identifier mismatch', { ctx }); + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + const scopesToRemove = scope ? Manager._scopeDifference(ctx.token.scopes, scope.split(scopeSplitRE)) : []; + if (scopesToRemove.length) { + this.logger.debug(_scope, 'scope reduction requested', { ctx, scopesToRemove }); + } + + const refreshedTokenData = await this.db.refreshCode(txCtx, ctx.refreshToken.rc, now, scopesToRemove); + if (refreshedTokenData) { + Object.assign(ctx.token, refreshedTokenData); + } else { + this.logger.debug(_scope, 'could not refresh token', { ctx }); + throw new ResponseError(Enum.ErrorResponse.NotFound); + } + }); // tx + + const [token, refreshToken] = await Promise.all([ + { + c: ctx.token.codeId, + ts: nowEpoch, + }, + { + rc: ctx.token.codeId, + ts: nowEpoch, + exp: nowEpoch + ctx.token.refreshDuration, + }, + ].map(this.mysteryBox.pack)); + + const response = { + 'access_token': token, + 'token_type': 'Bearer', + ...(ctx.token.duration && { 'expires_in': nowEpoch + ctx.token.duration }), + ...(refreshToken && { 'refresh_token': refreshToken }), + scope: ctx.token.scopes.join(' '), + me: ctx.session.me, + ...(ctx.token.scopes.includes('profile') && { profile: ctx.token.profileData }), + }; + if (ctx.token.scopes.includes('profile') && !ctx.token.scopes.includes('email')) { + delete response?.profile?.email; + } + + Manager._sensitiveResponse(res); + res.end(JSON.stringify(response)); + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Generate a new ticket for later redemption. + * @param {Object} payload + * @param {} payload.subject deliver ticket to this endpoint + * @param {} payload.resource url the redeemed ticket is valid for accessing + * @param {String[]} payload.scopes list of scopes assigned to ticket + * @param {String} payload.identifier user generating ticket + * @param {} payload.profile profile of user generating ticket + * @param {Number} payload.ticketLifespanSeconds ticket redeemable for this long + * @returns {String} + */ + async _mintTicket({ subject, resource, scopes, identifier, profile, ticketLifespanSeconds }) { + const _scope = _fileScope('_mintTicket'); + this.logger.debug(_scope, 'called', { subject, resource, scopes, identifier, profile, ticketLifespanSeconds }); + + const nowEpoch = common.dateToEpoch(); + return this.mysteryBox.pack({ + c: common.requestId(), + iss: nowEpoch, + exp: nowEpoch + ticketLifespanSeconds, + sub: subject, + res: resource, + scope: scopes, + ident: identifier, + profile: profile, + }); + } + + + /** + * @typedef Ticket + * @property {String} codeId + * @property {Date} issued + * @property {Date} expires + * @property {URL} subject + * @property {URL} resource + * @property {String[]} scopes + * @property {String} identifier + * @property {URL} profile + */ + /** + * + * @param {String} ticket + * @returns {Ticket} + */ + async _unpackTicket(ticket) { + const ticketObj = await this.mysteryBox.unpack(ticket); + return { + codeId: ticketObj.c, + issued: new Date(ticketObj.iss * 1000), + expires: new Date(ticketObj.exp * 1000), + subject: new URL(ticketObj.sub), + resource: new URL(ticketObj.res), + scopes: ticketObj.scope, + identifier: ticketObj.ident, + profile: new URL(ticketObj.profile), + }; + } + + + /** + * Redeem a ticket for a token. + * @param {*} dbCtx + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async _ticketAuthToken(dbCtx, req, res, ctx) { + const _scope = _fileScope('_ticketAuthToken'); + this.logger.debug(_scope, 'called', { ctx }); + + try { + ctx.ticket = await this._unpackTicket(ctx.parsedBody['ticket']); + } catch (e) { + this.logger.debug(_scope, 'failed to unpack ticket', { error: e, ctx }); + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + const now = new Date(); + if (now > ctx.ticket.expires) { + this.logger.debug(_scope, 'ticket has expired', { ctx }); + throw new ResponseError(Enum.ErrorResponse.Forbidden, { reason: 'Ticket has expired.', expired: ctx.ticket.expires }); + } + + const nowEpoch = common.dateToEpoch(now); + const token = await this.mysteryBox.pack({ + c: ctx.ticket.codeId, + ts: nowEpoch, + }); + + const response = { + 'access_token': token, + 'token_type': 'Bearer', + scope: ctx.ticket.scopes.join(' '), + me: ctx.ticket.profile.href, + }; + + const isValid = await this.db.redeemCode(dbCtx, { + created: now, + codeId: ctx.ticket.codeId, + isToken: true, + clientId: ctx.ticket.subject.href, + resource: ctx.ticket.resource.href, + profile: ctx.ticket.profile.href, + identifier: ctx.ticket.identifier, + scopes: ctx.ticket.scopes, + }); + if (!isValid) { + this.logger.debug(_scope, 'redemption failed, already redeemed', { ctx }); + throw new ResponseError(Enum.ErrorResponse.Forbidden); + } + + Manager._sensitiveResponse(res); + res.end(JSON.stringify(response)); + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Redeem a code for a token. + * @param {*} dbCtx + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async _codeToken(dbCtx, req, res, ctx) { + const _scope = _fileScope('_codeToken'); + this.logger.debug(_scope, 'called', { ctx }); + + await this._restoreSessionFromCode(ctx); + await this._checkSessionMatchingRedirectUri(ctx); + + if (ctx.session.error) { + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + /** + * Note the creation date here rather than in database, so that stored + * expire dates are ensured to match those packed in tokens. + * An alternative would be to return the date generated by the database, + * but then we would need to hold the transaction open while minting the + * tokens to ensure success. Perhaps that would be worth it, but for now + * this is how it is. + */ + const now = new Date(); + const nowEpoch = common.dateToEpoch(now); + const tokenMinters = []; + + tokenMinters.push(this.mysteryBox.pack({ + c: ctx.session.codeId, + ts: nowEpoch, + ...(ctx.session.tokenLifespan && { exp: nowEpoch + ctx.session.tokenLifespan }), + })); + + if (ctx.session.tokenLifespan + && ctx.session.refreshLifespan) { + tokenMinters.push(this.mysteryBox.pack({ + rc: ctx.session.codeId, + ts: nowEpoch, + exp: nowEpoch + ctx.session.refreshLifespan, + })); + } + + const [token, refreshToken] = await Promise.all(tokenMinters); + + const response = { + 'access_token': token, + 'token_type': 'Bearer', + ...(ctx.session.tokenLifespan && { 'expires_in': nowEpoch + ctx.session.tokenLifespan }), + ...(refreshToken && { 'refresh_token': refreshToken }), + scope: ctx.session.acceptedScopes.join(' '), + me: ctx.session.me, + ...(ctx.session.acceptedScopes.includes('profile') && { profile: ctx.session.profile }), + }; + if (!ctx.session.acceptedScopes.includes('email') && response.profile) { + delete response.profile.email; + } + + const isValid = await this.db.redeemCode(dbCtx, { + created: now, + codeId: ctx.session.codeId, + isToken: true, + clientId: ctx.session.clientId, + profile: ctx.session.me, + identifier: ctx.session.identifier, + scopes: ctx.session.acceptedScopes, + lifespanSeconds: ctx.session.tokenLifespan, + refreshLifespanSeconds: ctx.session.refreshLifespan, + profileData: response.profile, + }); + if (!isValid) { + this.logger.debug(_scope, 'redemption failed, already redeemed', { ctx }); + throw new ResponseError(Enum.ErrorResponse.Forbidden); + } + + Manager._sensitiveResponse(res); + res.end(JSON.stringify(response)); + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Issue, refresh, or validate a token. + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postToken(req, res, ctx) { + const _scope = _fileScope('postToken'); + this.logger.debug(_scope, 'called', { ctx }); + + ctx.session = Object.assign({}, ctx.session); + + await this.db.context(async (dbCtx) => { + + // Is this a (legacy) revocation request? + if (ctx.parsedBody['action'] === 'revoke') { + await this._revokeToken(dbCtx, res, ctx); + return; + } + + // Is this a (legacy) token validation request? + if (req.getHeader(Enum.Header.Authorization)) { + await this._validateToken(dbCtx, res, ctx); + return; + } + + const validGrantTypes = [ + 'authorization_code', + 'refresh_token', + ...(this.queuePublisher && ['ticket'] || []), + ]; + this._checkGrantType(ctx, validGrantTypes, 'authorization_code'); + + switch (ctx.session.grantType) { + case 'refresh_token': + return this._refreshToken(dbCtx, req, res, ctx); + + case 'ticket': + return this._ticketAuthToken(dbCtx, req, res, ctx); + + case 'authorization_code': + return this._codeToken(dbCtx, req, res, ctx); + + default: + this.logger.debug(_scope, 'unknown grant_type', { ctx }); + Manager._setError(ctx, 'invalid_request', 'grant_type not supported'); + } + + // Only way of getting here is due to error. + throw new ResponseError(Enum.ErrorResponse.BadRequest); + }); // dbCtx + } + + + /** + * Ingest token from authorization header, setting ctx.bearer.isValid appropriately. + * ctx.bearer not set if auth method not recognized. + * This is for legacy validation on token endpoint. + * @param {*} dbCtx + * @param {http.ClientRequest} req + * @param {Object} ctx + */ + async _checkTokenValidationRequest(dbCtx, req, ctx) { + const _scope = _fileScope('_checkTokenValidationRequest'); + const authHeader = req.getHeader(Enum.Header.Authorization); + + if (authHeader) { + const [authMethod, authString] = common.splitFirst(authHeader, ' ', ''); + switch (authMethod.toLowerCase()) { // eslint-disable-line sonarjs/no-small-switch + case 'bearer': { + ctx.bearer = { + isValid: false, + }; + try { + Object.assign(ctx.bearer, await this.mysteryBox.unpack(authString)); + } catch (e) { + this.logger.debug(_scope, 'failed to unpack token', { ctx }); + Manager._setError(ctx, 'invalid_request', 'invalid token'); + return; + } + if (!ctx.bearer.c) { + this.logger.debug(_scope, 'incomplete token', { ctx }); + Manager._setError(ctx, 'invalid_request', 'invalid token'); + return; + } + + try { + ctx.token = await this.db.tokenGetByCodeId(dbCtx, ctx.bearer.c); + } catch (e) { + this.logger.error(_scope, 'failed to look up token', { error: e, ctx }); + throw e; + } + + if (!ctx.token) { + this.logger.debug(_scope, 'no token found', { ctx }); + Manager._setError(ctx, 'invalid_request', 'invalid token'); + return; + } + + if (!ctx.token.isRevoked + && ctx.token.expires > new Date()) { + ctx.bearer.isValid = true; + } + break; + } + + default: + this.logger.debug(_scope, 'unknown authorization scheme', { ctx }); + return; + } + } + } + + + /** + * Accept an unsolicited ticket proffering. + * @param {http.ClientRequest} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postTicket(req, res, ctx) { + const _scope = _fileScope('postTicket'); + this.logger.debug(_scope, 'called', { ctx }); + + if (!this.queuePublisher) { + this.logger.debug(_scope, 'ticket endpoint not configured', { ctx }); + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + const queueName = this.options.queues.ticketPublishName; + const { ticket, resource, subject } = ctx.parsedBody; + + try { + new URL(resource); + } catch (e) { + this.logger.debug(_scope, 'unparsable resource', { ticket, resource, subject, ctx }); + throw new ResponseError(Enum.ErrorResponse.BadRequest); + } + + await this.db.context(async (dbCtx) => { + const isValidProfile = await this.db.profileIsValid(dbCtx, subject); + if (!isValidProfile) { + this.logger.debug(_scope, 'invalid subject', { ticket, resource, subject, ctx }); + throw new ResponseError(Enum.ErrorResponse.NotFound, { error: 'subject not under our purview' }); + } + + try { + const result = await this.queuePublisher.publish(queueName, { ticket, resource, subject }); + this.logger.debug(_scope, 'accepted ticket offer', { queueName, ticket, resource, subject, ctx, result }); + } catch (e) { + this.logger.error(_scope, 'failed to publish ticket to queue', { error: e, queueName, ticket, resource, subject, ctx }); + throw e; // return a 500 + } + + res.statusCode = 202; + res.end(); + this.logger.info(_scope, 'finished', { resource, subject, ctx }); + }); + } + + + /** + * Validate a token and return data about it. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postIntrospection(res, ctx) { + const _scope = _fileScope('postIntrospection'); + this.logger.debug(_scope, 'called', { ctx }); + + let response = { + active: false, + }; + + const tokenIsTicket = (ctx.parsedBody['token_hint_type'] || '').toLowerCase() === 'ticket'; + + try { + const token = ctx.parsedBody['token']; + if (tokenIsTicket) { + ctx.token = await this._unpackTicket(token); + } else { + ctx.token = await this.mysteryBox.unpack(token); + } + } catch (e) { + this.logger.debug(_scope, 'failed to unpack token', { error: e, ctx }); + } + + if (ctx.token + && !tokenIsTicket) { + await this.db.context(async (dbCtx) => { + ctx.token = await this.db.tokenGetByCodeId(dbCtx, ctx.token.c); + }); // dbCtx + } + + if (ctx.token + && !ctx.token.isRevoked) { + // fuss around for postgres 'Infinity' date + const expiresMs = (ctx.token.expires instanceof Date) ? ctx.token.expires.getTime() : ctx.token.expires; + if (expiresMs > Date.now()) { + response = { + active: true, + me: ctx.token.profile, + ...(ctx.token.clientId && { 'client_id': ctx.token.clientId }), + scope: ctx.token.scopes.join(' '), + iat: common.dateToEpoch(ctx.token.created || ctx.token.issued), + ...(isFinite(expiresMs) && { exp: Math.ceil(expiresMs / 1000) }), + ...(tokenIsTicket && { 'token_type': 'ticket' }), + }; + } + } + + Manager._sensitiveResponse(res); + res.end(JSON.stringify(response)); + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Revoke a token or refresh token. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postRevocation(res, ctx) { + const _scope = _fileScope('postRevocation'); + this.logger.debug(_scope, 'called', { ctx }); + + try { + await this.db.context(async (dbCtx) => { + await this._revokeToken(dbCtx, res, ctx); + }); + } catch (e) { + this.logger.error(_scope, 'failed', { error: e, ctx }); + throw e; + } + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Profile information for a token. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postUserInfo(res, ctx) { + const _scope = _fileScope('postUserInfo'); + this.logger.debug(_scope, 'called', { ctx }); + + const token = ctx.parsedBody['token']; + if (!token) { + res.statusCode = 400; + res.end('"invalid_request"'); + this.logger.info(_scope, 'finished, invalid request', { ctx }); + return; + } + + try { + ctx.token = await this.mysteryBox.unpack(ctx.parsedBody['token']); + } catch (e) { + this.logger.debug(_scope, 'failed to unpack token', { error: e, ctx }); + } + + if (ctx.token) { + await this.db.context(async (dbCtx) => { + ctx.token = await this.db.tokenGetByCodeId(dbCtx, ctx.token.c); + }); // dbCtx + } + + if (!ctx.token + || ctx.token.isRevoked + // || tokenIsExpired(token) + ) { + res.statusCode = 401; + res.end('"invalid_token"'); + this.logger.info(_scope, 'finished, invalid token', { ctx }); + return; + } + + if (!ctx.token.scopes.includes('profile')) { + res.statusCode = 403; + res.end('"insufficient_scope"'); + this.logger.info(_scope, 'finished, insufficient scope', { ctx }); + return; + } + + const response = { + ...ctx.token.profile, + }; + if (!ctx.token.scopes.includes('email')) { + delete response.email; + } + + Manager._sensitiveResponse(res); + res.end(JSON.stringify(response)); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Show admin interface, allowing manipulation of profiles and scopes. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getAdmin(res, ctx) { + const _scope = _fileScope('getAdmin'); + this.logger.debug(_scope, 'called', { ctx }); + + const identifier = ctx.session.authenticatedIdentifier; + + await this.db.context(async (dbCtx) => { + ctx.profilesScopes = await this.db.profilesScopesByIdentifier(dbCtx, identifier); + ctx.tokens = await this.db.tokensGetByIdentifier(dbCtx, identifier); + }); // dbCtx + + res.end(Template.adminHTML(ctx, this.options)); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Process admin interface events. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postAdmin(res, ctx) { + const _scope = _fileScope('postAdmin'); + this.logger.debug(_scope, 'called', { ctx }); + + await this.db.context(async (dbCtx) => { + const identifier = ctx.session.authenticatedIdentifier; + const action = ctx?.parsedBody?.['action'] || ''; + + if (action === 'save-scopes') { + // Update the convenience scopes set for profiles. + // Expect 'scopes-' with value of array of scopes + const profileKeys = ctx.parsedBody && Object.keys(ctx.parsedBody) + .filter((k) => k.startsWith('scopes-')); + try { + await this.db.transaction(dbCtx, async (txCtx) => { + await Promise.all( + /* For each scopes-profile submitted, set those. */ + profileKeys.map((profileKey) => { + /* elide 'scope-' prefix to get the profile */ + const profile = profileKey.slice(7); + /* (should validate profile here) */ + + /* remove invalid scopes from submitted list */ + const scopes = ctx.parsedBody[profileKey].filter((scope) => scope && common.validScope(scope)); // eslint-disable-line security/detect-object-injection + return this.db.profileScopesSetAll(txCtx, profile, scopes); + }), + ); + }); // txCtx + ctx.notifications.push('Profile/Scope Availability Matrix updated!'); + } catch (e) { + this.logger.error(_scope, 'did not set profile scopes', { error: e, ctx }); + ctx.errors.push('Failed to update profile scopes.'); + } + + } else if (action === 'new-profile') { + // Validate and create a new profile uri. + let profile; + const profileUri = ctx.parsedBody['profile']; + try { + profile = await this.communication.validateProfile(profileUri); + } catch (e) { + this.logger.debug(_scope, 'invalid profile url', { error: e, ctx }); + ctx.errors.push(`'${profileUri}' is not a valid profile URI.${(e instanceof CommunicationErrors.ValidationError) ? ('(' + e.message + ')') : ''}`); + } + if (profile) { + // Validate profile uri + const profileData = await this.communication.fetchProfile(profile); + if (profileData.metadata.authorizationEndpoint !== this.selfAuthorizationEndpoint) { + this.logger.debug(_scope, 'profile does not list this server as auth', { profileData, ctx }); + ctx.errors.push('Requested profile does not list this service, not adding.'); + } else { + try { + await this.db.transaction(dbCtx, async (txCtx) => { + await this.db.profileIdentifierInsert(txCtx, profile.href, identifier); + await this.db.profileScopesSetAll(txCtx, profile.href, ['profile', 'email']); + }); // txCtx + ctx.notifications.push('Profile added!'); + } catch (e) { + this.logger.error(_scope, 'did not insert profile', { error: e, ctx }); + ctx.errors.push('Failed to add profile.'); + } + } + } + + } else if (action === 'new-scope') { + // Add or update a manually-added convenience scope. + const { scope, application = '', description = '' } = ctx.parsedBody; + if (scope) { + if (!common.validScope(scope)) { + ctx.errors.push(`"${scope}" is not a valid scope name, did not add it.`); + } else { + try { + await this.db.scopeUpsert(dbCtx, scope, application, description, true); + ctx.notifications.push('Scope List updated!'); + } catch (e) { + this.logger.error(_scope, 'did not upsert scope', { error: e, scope, application, description, ctx }); + ctx.errors.push('Failed to update scope.'); + } + } + } + + } else if (action.startsWith('delete-scope-')) { + // Remove a manually-added convenience scope. + const scope = decodeURIComponent(action.slice(13)); + if (scope) { + try { + const deleted = await this.db.scopeDelete(dbCtx, scope); + if (deleted) { + ctx.notifications.push('Scope deleted.'); + } else { + ctx.notifications.push('Unable to delete scope.'); + } + } catch (e) { + this.logger.error(_scope, 'did not delete scope', { error: e, scope, ctx }); + ctx.errors.push('Failed to delete scope.'); + } + } + + } else if (action.startsWith('revoke-')) { + // Revoke an active token. + const codeId = action.slice(8); + if (codeId) { + try { + await this.db.tokenRevokeByCodeId(dbCtx, codeId, identifier); + ctx.notifications.push('Revoked token!'); + } catch (e) { + this.logger.error(_scope, 'did not revoke token', { error: e, codeId, identifier, ctx }); + ctx.errors.push('Unable to revoke token.'); + } + } + + } else if (action) { + ctx.errors.push(`Do not know how to '${action}'.`); + } + + ctx.profilesScopes = await this.db.profilesScopesByIdentifier(dbCtx, identifier); + ctx.tokens = await this.db.tokensGetByIdentifier(dbCtx, identifier); + }); // dbCtx + + res.end(Template.adminHTML(ctx, this.options)); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Show ticket proffer interface. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getAdminTicket(res, ctx) { + const _scope = _fileScope('getAdminTicket'); + this.logger.debug(_scope, 'called', { ctx }); + + const identifier = ctx.session.authenticatedIdentifier; + + await this.db.context(async (dbCtx) => { + ctx.profilesScopes = await this.db.profilesScopesByIdentifier(dbCtx, identifier); + ctx.profiles = ctx.profilesScopes.profiles; + ctx.scopes = Object.keys(ctx.profilesScopes.scopeIndex); + }); // dbCtx + + res.end(Template.adminTicketHTML(ctx, this.options)); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Handle ticket proffer interface submission. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async postAdminTicket(res, ctx) { + const _scope = _fileScope('postAdminTicket'); + this.logger.debug(_scope, 'called', { ctx }); + + switch (ctx.parsedBody['action']) { // eslint-disable-line sonarjs/no-small-switch + case 'proffer-ticket': { + const identifier = ctx.session.authenticatedIdentifier; + [ + { ctxProp: 'ticketProfileUrl', bodyParam: 'profile', err: 'Invalid Profile URL selected.' }, + { ctxProp: 'ticketResourceUrl', bodyParam: 'resource', err: 'Invalid Resource URL.' }, + { ctxProp: 'ticketSubjectUrl', bodyParam: 'subject', err: 'Invalid Recipient URL.' }, + ].forEach((param) => { + try { + ctx[param.ctxProp] = new URL(ctx.parsedBody[param.bodyParam]); + } catch (e) { + this.logger.debug(_scope, `invalid ${param.bodyParam}`, { ctx }); + ctx.errors.push(param.err); + } + }); + + const subjectData = await this.communication.fetchProfile(ctx.ticketSubjectUrl); + if (!subjectData?.metadata?.ticketEndpoint) { + this.logger.debug(_scope, 'subject has no ticket endpoint', { ctx }); + ctx.errors.push('Recipient does not list a ticket endpoint to deliver to.'); + } else { + try { + ctx.ticketEndpointUrl = new URL(subjectData.metadata.ticketEndpoint); + } catch (e) { + this.logger.debug(_scope, 'subject has invalid ticket endpoint', { error: e, ctx }); + ctx.errors.push(`Recipient lists an invalid ticket endpoint, cannot deliver. (${e})`); + } + } + + const scopesSet = new Set(); + const rawScopes = [ + ...(common.ensureArray(ctx.parsedBody['scopes'])), + ...((ctx.parsedBody['adhoc'] || '').split(scopeSplitRE)), + ].filter((scope) => scope); + rawScopes.forEach((scope) => { + if (common.validScope(scope)) { + scopesSet.add(scope); + } else { + this.logger.debug(_scope, 'invalid adhoc scope', { scope, ctx }); + ctx.errors.push(`'${scope}' is not a valid scope.`); + } + }); + ctx.ticketScopes = [...scopesSet]; + const actionScopes = ctx.ticketScopes.filter((scope) => !['profile', 'email'].includes(scope)); + if (!actionScopes.length) { + this.logger.debug(_scope, 'no valid scopes included', { ctx }); + ctx.errors.push('At least one actionable scope must be included.'); + } + + if (!ctx.errors.length) { + const ticketData = { + subject: ctx.ticketSubjectUrl.href, + resource: ctx.ticketResourceUrl.href, + scopes: ctx.ticketScopes, + identifier, + profile: ctx.ticketProfileUrl.href, + ticketLifespanSeconds: this.options.manager.ticketLifespanSeconds, + }; + const ticket = await this._mintTicket(ticketData); + + await this.db.context(async (dbCtx) => { + // re-populate form fields + ctx.profilesScopes = await this.db.profilesScopesByIdentifier(dbCtx, identifier); + + // TODO: queue ticket for delivery/retry to subject instead of trying immediately + // ctx.notifications.push('Success! Ticket will be delivered!'); + + this.logger.debug(_scope, 'ticket created', { ctx, ticketData, subjectData }); + + try { + const result = await this.communication.deliverTicket(ctx.ticketEndpointUrl, ctx.ticketResourceUrl, ctx.ticketSubjectUrl, ticket); + ctx.notifications.push(`Success! Ticket was delivered. (${result?.statusText})`); + this.logger.info(_scope, 'ticket delivered', { ctx, result }); + } catch (e) { + this.logger.error(_scope, 'failed to deliver ticket', { ctx, error: e }); + ctx.errors.push(`Failed to deliver ticket. (${e})`); + } + + }); // dbCtx + + } else { + // populate form fields again + await this.db.context(async (dbCtx) => { + ctx.profilesScopes = await this.db.profilesScopesByIdentifier(dbCtx, identifier); + ctx.scopes = Object.keys(ctx.profilesScopes.scopeIndex); + }); // dbCtx + } + + break; + } + + default: + this.logger.debug(_scope, 'unknown action', { ctx }); + } + + res.end(Template.adminTicketHTML(ctx, this.options)); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * Report on generally uninteresting backend information. + * Also allow a few event invocations. + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getAdminMaintenance(res, ctx) { + const _scope = _fileScope('getAdminMaintenance'); + this.logger.debug(_scope, 'called', { ctx }); + + const maintenanceTasks = []; + + await this.db.context(async (dbCtx) => { + + Object.values(Enum.Chore).forEach((chore) => { + if (chore in ctx.queryParams) { + maintenanceTasks.push( + this.chores.runChore(chore, 0), // Provide arg to force chore run. + ); + ctx.notifications.push(`Running maintenance chore "${chore}".`); + } + }); + + await Promise.all(maintenanceTasks); + + ctx.almanac = await this.db.almanacGetAll(dbCtx); + }); // dbCtx + + const winnowChoreEntry = ([name, value]) => [name, common.pick(value, ['intervalMs', 'nextSchedule'])]; + ctx.chores = Object.fromEntries( + Object.entries(this.chores.chores).map(winnowChoreEntry), + ); + + res.end(Template.adminMaintenanceHTML(ctx, this.options)); + + this.logger.info(_scope, 'finished', { ctx }); + } + + + /** + * + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async getHealthcheck(res, ctx) { + const _scope = _fileScope('getHealthcheck'); + this.logger.debug(_scope, 'called', { ctx }); + await this.db.healthCheck(); + res.end(); + } + +} + +module.exports = Manager; \ No newline at end of file diff --git a/src/service.js b/src/service.js new file mode 100644 index 0000000..5fbf950 --- /dev/null +++ b/src/service.js @@ -0,0 +1,544 @@ +'use strict'; + +/** + * Here we extend the base API server to define our routes and any route-specific + * behavior (middlewares) before handing off to the manager. + */ + +const path = require('path'); +const { Dingus } = require('@squeep/api-dingus'); +const common = require('./common'); +const Manager = require('./manager'); +const { Authenticator, SessionManager } = require('@squeep/authentication-module'); +const { ResourceAuthenticator } = require('@squeep/resource-authentication-module'); +const { TemplateHelper: { initContext } } = require('@squeep/html-template-helper'); +const Enum = require('./enum'); + +const _fileScope = common.fileScope(__filename); + +class Service extends Dingus { + constructor(logger, db, options) { + super(logger, { + ...options.dingus, + ignoreTrailingSlash: false, + }); + + this.staticPath = path.normalize(path.join(__dirname, '..', 'static')); + this.manager = new Manager(logger, db, options); + this.authenticator = new Authenticator(logger, db, options); + this.sessionManager = new SessionManager(logger, this.authenticator, options); + this.resourceAuthenticator = new ResourceAuthenticator(logger, db, options); + this.loginPath = `${options.dingus.proxyPrefix}/admin/login`; + + // N.B. /admin routes not currently configurable + const route = (r) => `/${options.route[r]}`; // eslint-disable-line security/detect-object-injection + + // Service discovery + this.on(['GET', 'HEAD'], route('metadata'), this.handlerGetMeta.bind(this)); + // Also respond with metadata on well-known oauth2 endpoint if base has no prefix + if ((options?.dingus?.selfBaseUrl?.match(/\//g) || []).length === 3) { + this.on(['GET', 'HEAD'], '/.well-known/oauth-authorization-server', this.handlerGetMeta.bind(this)); + } + + // Primary endpoints + this.on(['GET'], route('authorization'), this.handlerGetAuthorization.bind(this)); + this.on(['POST'], route('authorization'), this.handlerPostAuthorization.bind(this)); + this.on(['POST'], route('consent'), this.handlerPostConsent.bind(this)); + this.on(['POST'], route('revocation'), this.handlerPostRevocation.bind(this)); + this.on(['POST'], route('ticket'), this.handlerPostTicket.bind(this)); + this.on(['POST'], route('token'), this.handlerPostToken.bind(this)); + + // Resource endpoints + this.on('POST', route('introspection'), this.handlerPostIntrospection.bind(this)); + this.on('POST', route('userinfo'), this.handlerPostUserInfo.bind(this)); + + // Information page about service + this.on(['GET', 'HEAD'], '/', this.handlerGetRoot.bind(this)); + + // Give load-balancers something to check + this.on(['GET', 'HEAD'], route('healthcheck'), this.handlerGetHealthcheck.bind(this)); + + // These routes are intended for accessing static content during development. + // In production, a proxy server would likely handle these first. + this.on(['GET', 'HEAD'], '/static', this.handlerRedirect.bind(this), `${options.dingus.proxyPrefix}/static/`); + this.on(['GET', 'HEAD'], '/static/', this.handlerGetStaticFile.bind(this), 'index.html'); + this.on(['GET', 'HEAD'], '/static/:file', this.handlerGetStaticFile.bind(this)); + this.on(['GET', 'HEAD'], '/favicon.ico', this.handlerGetStaticFile.bind(this), 'favicon.ico'); + this.on(['GET', 'HEAD'], '/robots.txt', this.handlerGetStaticFile.bind(this), 'robots.txt'); + + // Profile and token management for authenticated sessions + this.on(['GET', 'HEAD'], '/admin', this.handlerRedirect.bind(this), `${options.dingus.proxyPrefix}/admin/`); + this.on(['GET', 'HEAD'], '/admin/', this.handlerGetAdmin.bind(this)); + this.on(['POST'], '/admin/', this.handlerPostAdmin.bind(this)); + + // Ticket-proffering interface for authenticated sessions + this.on(['GET', 'HEAD'], '/admin/ticket', this.handlerGetAdminTicket.bind(this)); + this.on(['POST'], '/admin/ticket', this.handlerPostAdminTicket.bind(this)); + + // User authentication and session establishment + this.on(['GET', 'HEAD'], '/admin/login', this.handlerGetAdminLogin.bind(this)); + this.on(['POST'], '/admin/login', this.handlerPostAdminLogin.bind(this)); + this.on(['GET'], '/admin/logout', this.handlerGetAdminLogout.bind(this)); + + // Page for upkeep info et cetera + this.on(['GET', 'HEAD'], '/admin/maintenance', this.handlerGetAdminMaintenance.bind(this)); + + } + + + /** + * Perform any async startup tasks. + */ + async initialize() { + await this.manager.initialize(); + } + + + /** + * Do a little more on each request. + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async preHandler(req, res, ctx) { + await super.preHandler(req, res, ctx); + ctx.url = req.url; // Persist this for logout redirect + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetAdminLogin(req, res, ctx) { + const _scope = _fileScope('handlerGetAdminLogin'); + this.logger.debug(_scope, 'called', { req, ctx }); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + await this.sessionManager.getAdminLogin(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostAdminLogin(req, res, ctx) { + const _scope = _fileScope('handlerPostAdminLogin'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + await this.authenticator.sessionOptionalLocal(req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.sessionManager.postAdminLogin(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetAdminLogout(req, res, ctx) { + const _scope = _fileScope('handlerGetAdminLogout'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + await this.authenticator.sessionOptionalLocal(req, res, ctx); + + await this.sessionManager.getAdminLogout(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetAdmin(req, res, ctx) { + const _scope = _fileScope('handlerGetAdmin'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + if (await this.authenticator.sessionRequiredLocal(req, res, ctx, this.loginPath)) { + await this.manager.getAdmin(res, ctx); + } + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostAdmin(req, res, ctx) { + const _scope = _fileScope('handlerPostAdmin'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + if (await this.authenticator.sessionRequiredLocal(req, res, ctx, this.loginPath)) { + await this.ingestBody(req, res, ctx); + await this.manager.postAdmin(res, ctx); + } + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetAdminTicket(req, res, ctx) { + const _scope = _fileScope('handlerGetAdminTicket'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + if (await this.authenticator.sessionRequiredLocal(req, res, ctx, this.loginPath)) { + await this.manager.getAdminTicket(res, ctx); + } + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostAdminTicket(req, res, ctx) { + const _scope = _fileScope('handlerPostAdminTicket'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + if (await this.authenticator.sessionRequiredLocal(req, res, ctx, this.loginPath)) { + await this.ingestBody(req, res, ctx); + await this.manager.postAdminTicket(res, ctx); + } + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetMeta(req, res, ctx) { + const _scope = _fileScope('handlerGetMeta'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(responseTypes, req, res, ctx); + + await this.authenticator.sessionOptionalLocal(req, res, ctx); + + await this.manager.getMeta(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetAuthorization(req, res, ctx) { + const _scope = _fileScope('handlerGetAuthorization'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + if (await this.authenticator.sessionRequiredLocal(req, res, ctx, this.loginPath)) { + await this.manager.getAuthorization(res, ctx); + } + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostAuthorization(req, res, ctx) { + const _scope = _fileScope('handlerPostAuthorization'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + this.setResponseType(responseTypes, req, res, ctx); + + await this.authenticator.sessionOptionalLocal(req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postAuthorization(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostConsent(req, res, ctx) { + const _scope = _fileScope('handlerPostConsent'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + // This isn't specified as required as any valid payload carries intrinsic auth data. + await this.authenticator.sessionOptionalLocal(req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postConsent(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostTicket(req, res, ctx) { + const _scope = _fileScope('handlerPostTicket'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + this.setResponseType(responseTypes, req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postTicket(req, res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostToken(req, res, ctx) { + const _scope = _fileScope('handlerPostToken'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + this.setResponseType(responseTypes, req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postToken(req, res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostRevocation(req, res, ctx) { + const _scope = _fileScope('handlerPostRevocation'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + this.setResponseType(responseTypes, req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postRevocation(req, res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostIntrospection(req, res, ctx) { + const _scope = _fileScope('handlerPostIntrospection'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + await this.resourceAuthenticator.required(req, res, ctx); + + this.setResponseType(responseTypes, req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postIntrospection(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerPostUserInfo(req, res, ctx) { + const _scope = _fileScope('handlerPostUserInfo'); + this.logger.debug(_scope, 'called', { req, ctx }); + + const responseTypes = [ + Enum.ContentType.ApplicationJson, + Enum.ContentType.TextPlain, + ]; + + this.setResponseType(responseTypes, req, res, ctx); + + await this.ingestBody(req, res, ctx); + + await this.manager.postUserInfo(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetRoot(req, res, ctx) { + const _scope = _fileScope('handlerGetRoot'); + const responseTypes = [ + Enum.ContentType.TextHTML, + ]; + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(responseTypes, req, res, ctx); + + await this.authenticator.sessionOptionalLocal(req, res, ctx); + + await this.manager.getRoot(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetHealthcheck(req, res, ctx) { + const _scope = _fileScope('handlerGetHealthcheck'); + this.logger.debug(_scope, 'called', { req, ctx }); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + await this.manager.getHealthcheck(res, ctx); + } + + + /** + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerGetAdminMaintenance(req, res, ctx) { + const _scope = _fileScope('handlerGetAdminMaintenance'); + this.logger.debug(_scope, 'called', { req, ctx }); + + initContext(ctx); + + Dingus.setHeadHandler(req, res, ctx); + + this.setResponseType(this.responseTypes, req, res, ctx); + + if (await this.authenticator.sessionRequiredLocal(req, res, ctx, this.loginPath)) { + await this.manager.getAdminMaintenance(res, ctx); + } + } + + + /** + * FIXME: This doesn't seem to be working as envisioned. Maybe override render error method instead??? + * Intercept this and redirect if we have enough information, otherwise default to framework. + * The redirect attempt should probably be contained in a Manager method, but here it is for now. + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + * @param {Object} ctx + */ + async handlerInternalServerError(req, res, ctx) { + const _scope = _fileScope('handlerInternalServerError'); + this.logger.debug(_scope, 'called', { req, ctx }); + + if (ctx?.session?.redirectUri && ctx?.session?.clientIdentifier) { + Object.entries({ + ...(ctx.session.state && { 'state': ctx.session.state }), + 'error': 'server_error', + 'error_description': 'An internal server error occurred', + }).forEach(([name, value]) => ctx.session.redirectUri.searchParams.set(name, value)); + res.statusCode = 302; // Found + res.setHeader(Enum.Header.Location, ctx.session.redirectUri.href); + res.end(); + return; + } + + super.handlerInternalServerError(req, res, ctx); + } + + +} + +module.exports = Service; + diff --git a/src/template/admin-html.js b/src/template/admin-html.js new file mode 100644 index 0000000..085b95a --- /dev/null +++ b/src/template/admin-html.js @@ -0,0 +1,214 @@ +'use strict'; + +/** + * This renders the administrative view for an account, + * allowing for adding profile URIs, custom scope bundles, + * and management of issued tokens. + */ + +const th = require('./template-helper'); + + +function renderProfileLI(profile) { + return `\t
  • ${profile}
  • `; +} + + +function renderProfileScopeIndicator(profile, scope, selected) { + const checked = selected ? ' checked' : ''; + return `\t\t +\t\t\t +\t\t`; +} + +function renderScopeRow(scope, details, profiles) { + return `\t +${(profiles || []).map((profile) => renderProfileScopeIndicator(profile, scope, details.profiles.includes(profile))).join('\n')} +\t\t

    +$gVqumAD(dp>5)P4hKt^9OD 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