diff --git a/packages/rules-unit-testing/index.ts b/packages/rules-unit-testing/index.ts index 8219dd0a474..753a0be3471 100644 --- a/packages/rules-unit-testing/index.ts +++ b/packages/rules-unit-testing/index.ts @@ -21,4 +21,6 @@ * creating a dependency on @firebase/rules-unit-testing. */ -export const TODO = 'TODO'; +export * from './src/public_types'; +export * from './src/initialize'; +export * from './src/util'; diff --git a/packages/rules-unit-testing/mocharc.node.js b/packages/rules-unit-testing/mocharc.node.js new file mode 100644 index 00000000000..76f724e65d9 --- /dev/null +++ b/packages/rules-unit-testing/mocharc.node.js @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const base = require('../../config/mocharc.node.js'); + +module.exports = { + ...base, + require: [base.require, 'test/setup.ts'] +}; diff --git a/packages/rules-unit-testing/package.json b/packages/rules-unit-testing/package.json index 48ff8cf7fa7..ad2fbfc5dac 100644 --- a/packages/rules-unit-testing/package.json +++ b/packages/rules-unit-testing/package.json @@ -14,12 +14,14 @@ "build": "rollup -c", "build:deps": "lerna run --scope @firebase/rules-unit-testing --include-dependencies build", "dev": "rollup -c -w", - "test:nyc": "TS_NODE_CACHE=NO TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc --reporter lcovonly -- mocha 'test/{,!(browser)/**/}*.test.ts' --config ../../config/mocharc.node.js", - "test": "FIREBASE_CLI_PREVIEWS=storageemulator STORAGE_EMULATOR_HOST=http://localhost:9199 firebase --project=foo --debug emulators:exec 'yarn test:nyc'", + "test:nyc": "TS_NODE_CACHE=NO TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc --reporter lcovonly -- mocha 'test/{,!(browser)/**/}*.test.ts' --config ./mocharc.node.js", + "test": "firebase --project=demo-foo --debug emulators:exec 'yarn test:nyc'", "test:ci": "node ../../scripts/run_tests_in_ci.js -s test" }, "license": "Apache-2.0", "devDependencies": { + "firebase-admin": "9.11.1", + "firebase-functions": "3.15.4", "rollup": "2.52.2", "rollup-plugin-typescript2": "0.30.0" }, @@ -34,5 +36,8 @@ "typings": "dist/index.d.ts", "bugs": { "url": "https://github.com/firebase/firebase-js-sdk/issues" + }, + "dependencies": { + "node-fetch": "2.6.1" } } diff --git a/packages/rules-unit-testing/src/initialize.ts b/packages/rules-unit-testing/src/initialize.ts new file mode 100644 index 00000000000..f8ab2038995 --- /dev/null +++ b/packages/rules-unit-testing/src/initialize.ts @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { RulesTestEnvironment, TestEnvironmentConfig } from './public_types'; + +/** + * Initializes a test environment for rules unit testing. Call this function first for test setup. + * + * Requires emulators to be running. This function tries to discover those emulators via environment + * variables or through the Firebase Emulator hub if hosts and ports are unspecified. It is strongly + * recommended to specify security rules for emulators used for testing. See minimal example below. + * + * @param config the configuration for emulators. most fields are optional if they can be discovered + * @returns a promise that resolves with an environment ready for testing, or rejects on error. + * @public + * @example + * ```javascript + * const testEnv = await initializeTestEnvironment({ + * firestore: { + * rules: fs.readFileSync("/path/to/firestore.rules", "utf8"), // Load rules from file + * // host and port can be omitted if they can be discovered from the hub. + * }, + * // ... + * }); + * ``` + */ +export async function initializeTestEnvironment(): Promise { + throw new Error('unimplemented'); +} diff --git a/packages/rules-unit-testing/src/public_types/index.ts b/packages/rules-unit-testing/src/public_types/index.ts new file mode 100644 index 00000000000..0cdec67491a --- /dev/null +++ b/packages/rules-unit-testing/src/public_types/index.ts @@ -0,0 +1,278 @@ +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FirebaseSignInProvider } from '@firebase/util'; +import { Firestore, FirestoreSettings } from '@firebase/firestore/exp'; +import { Database } from '@firebase/database/exp'; +import { FirebaseStorage } from '@firebase/storage/exp'; + +/** + * More options for the mock user token to be used for testing, including developer-specfied custom + * claims or optional overrides for Firebase Auth token payloads. + * @public + */ +export type TokenOptions = { + /** The token issue time, in seconds since epoch */ + iat?: number; + + /** The token expiry time, normally 'iat' + 3600 */ + exp?: number; + + /** The time the user authenticated, normally 'iat' */ + auth_time?: number; + + /** The sign in provider, only set when the provider is 'anonymous' */ + provider_id?: 'anonymous'; + + /** The user's primary email */ + email?: string; + + /** The user's email verification status */ + email_verified?: boolean; + + /** The user's primary phone number */ + phone_number?: string; + + /** The user's display name */ + name?: string; + + /** The user's profile photo URL */ + picture?: string; + + /** Information on all identities linked to this user */ + firebase?: { + /** The primary sign-in provider */ + sign_in_provider: FirebaseSignInProvider; + + /** A map of providers to the user's list of unique identifiers from each provider */ + identities?: { [provider in FirebaseSignInProvider]?: string[] }; + }; + + /** Set to PROJECT_ID by default. In rare cases, you may want to specify an override. */ + aud?: string; + + /** Set to https://securetoken.google.com/PROJECT_ID by default. In rare cases, you may want to specify an override. */ + iss?: string; + + /** Custom claims set by the developer */ + [claim: string]: unknown; + + // The fields below needs to be explicitly excluded from the index signature above. + + /** DO NOT USE. The user ID MUST be specified as the first param in authenticatedContext(uid, options) instead. */ + uid?: never; + /** DO NOT USE. The user ID MUST be specified as the first param in authenticatedContext(uid, options) instead. */ + sub?: never; + /** DO NOT USE. The user ID MUST be specified as the first param in authenticatedContext(uid, options) instead. */ + user_id?: never; +}; + +/** + * Configuration of the unit testing environment, including emulators. + * @public + */ +export interface TestEnvironmentConfig { + /** + * The project ID of the test environment. Can also be specified via the environment variable GCLOUD_PROJECT. + * + * A "demo-*" project ID is strongly recommended, especially for unit testing. + * See: https://firebase.google.com/docs/emulator-suite/connect_firestore#choose_a_firebase_project + */ + projectId?: string; + + /** + * The Firebase Emulator hub. Can also be specified via the environment variable FIREBASE_EMULATOR_HUB. + * If specified either way, other running emulators can be automatically discovered, and thus do + * not to be explicity specified. + */ + hub?: HostAndPort; + + /** + * The Database emulator. Its host and port can also be discovered automatically through the hub + * (see field "hub") or specified via the environment variable FIREBASE_DATABASE_EMULATOR_HOST. + */ + database?: EmulatorConfig; + + /** + * The Firestore emulator. Its host and port can also be discovered automatically through the hub + * (see field "hub") or specified via the environment variable FIRESTORE_EMULATOR_HOST. + */ + firestore?: EmulatorConfig; + + /** + * The Storage emulator. Its host and port can also be discovered automatically through the hub + * (see field "hub") or specified via the environment variable FIREBASE_STORAGE_EMULATOR_HOST. + */ + storage?: EmulatorConfig; +} + +/** + * An object containing the hostname and port number of an emulator. + * @public + */ +export interface HostAndPort { + /** + * The host of the emulator. Can be omitted if discovered automatically through the hub or + * specified via environment variables. See {@code TestEnvironmentConfig} for details. + */ + host: string; + + /** + * The port of the emulator. Can be omitted if discovered automatically through the hub or + * specified via environment variables. See {@code TestEnvironmentConfig} for details. + */ + port: number; +} + +/** + * Configuration for a given emulator. + * @public + */ +export type EmulatorConfig = { + /** The security rules source code under test for this emulator. Strongly recommended. */ + rules?: string; +} & (HostAndPort | {}); // Both or none of host and port should be specified. + +/** + * An object used to control the rules unit test environment. Can be used to create RulesTestContext + * for different authentication situations. + * @public + */ +export interface RulesTestEnvironment { + /** The project ID specified or discovered at test environment creation. */ + readonly projectId: string; + + /** + * A readonly copy of the emulator config specified or discovered at test environment creation. + */ + readonly emulators: { + database?: HostAndPort; + firestore?: HostAndPort; + storage?: HostAndPort; + }; + + /** + * Create a {@code RulesTestContext} which behaves like an authenticated Firebase Auth user. + * + * Requests created via the returned context will have a mock Firebase Auth token attached. + * + * @param user_id the User ID of the user. Specifies the value of "user_id" and "sub" on the token + * @param tokenOptions custom claims or overrides for Firebase Auth token payloads + * + * @example + * ```javascript + * const alice = testEnv.authenticatedContext('alice'); + * await assertSucceeds(get(doc(alice.firestore(), '/doc/readable/by/alice'), { ... }); + * ``` + */ + authenticatedContext( + user_id: string, + tokenOptions?: TokenOptions + ): RulesTestContext; + + /** + * Create a {@code RulesTestContext} which behaves like client that is NOT logged in via Firebase + * Auth. + * + * Requests created via the returned context will not have Firebase Auth tokens attached. + * + * @example + * ```javascript + * const unauthed = testEnv.unauthenticatedContext(); + * await assertFails(get(doc(unauthed.firestore(), '/private/doc'), { ... }); + * ``` + */ + unauthenticatedContext(): RulesTestContext; + + /* + * Run a setup function with a context that behaves as if Security Rules were disabled. + * + * This can be used for test setup by importing data into emulators without blocked by Rules. + * ONLY requests issued through the context passed into the callback will bypass Security Rules. + * Requests issued through other contexts will go through Security Rules as normal. + * + * @param callback a function which takes the Security-Rules-bypassing context and returns a promise. + * The context will be destroyed once the promise resolves / rejects. + */ + withSecurityRulesDisabled( + callback: (context: RulesTestContext) => Promise + ): Promise; + + /** + * Clear all data in the Realtime Database emulator namespace. + */ + clearDatabase(): Promise; + + /** + * Clear data in the Firestore that belongs to the {@code projectId} in the Firestore emulator. + */ + clearFirestore(): Promise; + + /** + * Clear Storage files and metadata in all buckets in the Storage emulator. + */ + clearStorage(): Promise; + + /** + * At the very end of your test code, call the cleanup function. Destroy all RulesTestContexts + * created in test environment and clean up the underlying resources, allowing a clean exit. + * + * This method does not change the state in emulators in any way. To reset data between tests, + * see {@code clearDatabase()}, {@code clearFirestore()} and {@code clearStorage()}. + */ + cleanup(): Promise; +} + +/** + * A test context that represents a client. Can be used to access emulators for rules unit testing. + * @public + */ +export interface RulesTestContext { + /** + * Get a Firestore instance for this test context. The returned Firebase JS Client SDK instance + * can be used with the client SDK APIs (v9 modular or v9 compat). + * + * See: https://firebase.google.com/docs/reference/js/v9/firestore_ + * @param settings a settings object to configure the {@code Firestore} instance + * @returns a Firestore instance configured to connect to the emulator + * @public + */ + firestore(settings?: FirestoreSettings): Firestore; + + /** + * Get a Firestore instance for this test context. The returned Firebase JS Client SDK instance + * can be used with the client SDK APIs (v9 modular or v9 compat). + * + * See: https://firebase.google.com/docs/reference/js/v9/firestore_ + * @param databaseURL the URL of the Realtime Database instance. If specified, returns an instance + * for an emulated version of the namespace with parameters extracted from URL + * @returns a Database instance configured to connect to the emulator. It never connects to + * production even if a production databaseURL is specified + */ + database(databaseURL?: string): Database; + + /** + * Get a Storage instance for this test context. The returned Firebase JS Client SDK instance + * can be used with the client SDK APIs (v9 modular or v9 compat). + * + * See: https://firebase.google.com/docs/reference/js/v9/firestore_ + * @param settings the gs:// url to the Firebase Storage Bucket for testing. If specified, + * returns a Storage instance for an emulated version of the bucket name + * @returns a Storage instance configured to connect to the emulator + */ + storage(bucketUrl?: string): FirebaseStorage; +} diff --git a/packages/rules-unit-testing/src/util.ts b/packages/rules-unit-testing/src/util.ts new file mode 100644 index 00000000000..8822e73b91e --- /dev/null +++ b/packages/rules-unit-testing/src/util.ts @@ -0,0 +1,91 @@ +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Run a setup function with background Cloud Functions triggers disabled. This can be used to + * import data into the Realtime Database or Cloud Firestore emulator without triggering locally + * emulated Cloud Functions. + * + * This method only works with Firebase CLI version 8.13.0 or higher. This overload works only if + * the Emulator hub host:port is specified by the environment variable FIREBASE_EMULATOR_HUB. + * + * @param fn an function which may be sync or async (returns a promise) + * @public + */ +export async function withFunctionTriggersDisabled( + fn: () => TResult | Promise +): Promise; + +/** + * Run a setup function with background Cloud Functions triggers disabled. This can be used to + * import data into the Realtime Database or Cloud Firestore emulator without triggering locally + * emulated Cloud Functions. + * + * This method only works with Firebase CLI version 8.13.0 or higher. The Emulator hub must be + * running, which host and port are specified in this overload. + * + * @param fn an function which may be sync or async (returns a promise) + * @param hub the host and port of the Emulator Hub (ex: `{host: 'localhost', port: 4400}`) + * @public + */ export async function withFunctionTriggersDisabled( + hub: { host: string; port: number }, + fn: () => TResult | Promise +): Promise; + +export async function withFunctionTriggersDisabled( + fnOrHub: { host: string; port: number } | (() => TResult | Promise), + maybeFn?: () => TResult | Promise +): Promise { + throw new Error('unimplemented'); +} + +/** + * Assert the promise to be rejected with a "permission denied" error. + * + * Useful to assert a certain request to be denied by Security Rules. See example below. + * This function recognizes permission-denied errors from Database, Firestore, and Storage JS SDKs. + * + * @param pr the promise to be asserted + * @returns a Promise that is fulfilled if pr is rejected with "permission denied". If pr is + * rejected with any other error or resolved, the returned promise rejects. + * @public + * @example + * ```javascript + * const unauthed = testEnv.unauthenticatedContext(); + * await assertFails(get(doc(unauthed.firestore(), '/private/doc'), { ... }); + * ``` + */ +export function assertFails(pr: Promise): Promise { + throw new Error('unimplemented'); +} + +/** + * Assert the promise to be rejected with a "permission denied" error. + * + * This is a no-op function returning the passed promise as-is, but can be used for documentational + * purposes in test code to emphasize that a certain request should succeed (e.g. allowed by rules). + * + * @public + * @example + * ```javascript + * const alice = testEnv.authenticatedContext('alice'); + * await assertSucceeds(get(doc(alice.firestore(), '/doc/readable/by/alice'), { ... }); + * ``` + */ +export function assertSucceeds(pr: Promise): Promise { + return pr; +} diff --git a/packages/rules-unit-testing/test/dummy.test.ts b/packages/rules-unit-testing/test/dummy.test.ts new file mode 100644 index 00000000000..8814d9353df --- /dev/null +++ b/packages/rules-unit-testing/test/dummy.test.ts @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { expect } from 'chai'; + +// TODO: Real tests (coming in the following PRs). +it('true should equal to true', () => { + expect(true).to.be.true; +}); diff --git a/packages/rules-unit-testing/test/setup.ts b/packages/rules-unit-testing/test/setup.ts new file mode 100644 index 00000000000..e0295f1590c --- /dev/null +++ b/packages/rules-unit-testing/test/setup.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { use } from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import { restore } from 'sinon'; +import * as sinonChai from 'sinon-chai'; + +use(chaiAsPromised); +use(sinonChai); + +export const mochaHooks = { + afterEach() { + restore(); + } +}; diff --git a/yarn.lock b/yarn.lock index 1777bbdc9a1..c98da845cdf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1349,6 +1349,34 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@firebase/component@0.5.5": + version "0.5.5" + resolved "https://registry.npmjs.org/@firebase/component/-/component-0.5.5.tgz#849ccf7cbf0398a43058f274ffcd43620ae9521f" + integrity sha512-L41SdS/4a164jx2iGfakJgaBUPPBI3DI+RrUlmh3oHSUljTeCwfj/Nhcv3S7e2lyXsGFJtAyepfPUx4IQ05crw== + dependencies: + "@firebase/util" "1.2.0" + tslib "^2.1.0" + +"@firebase/database-types@0.7.3", "@firebase/database-types@^0.7.2": + version "0.7.3" + resolved "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.3.tgz#819f16dd4c767c864b460004458620f265a3f735" + integrity sha512-dSOJmhKQ0nL8O4EQMRNGpSExWCXeHtH57gGg0BfNAdWcKhC8/4Y+qfKLfWXzyHvrSecpLmO0SmAi/iK2D5fp5A== + dependencies: + "@firebase/app-types" "0.6.3" + +"@firebase/database@^0.10.0": + version "0.10.9" + resolved "https://registry.npmjs.org/@firebase/database/-/database-0.10.9.tgz#79f7b03cbe8a127dddfb7ea7748a3e923990f046" + integrity sha512-Jxi9SiE4cNOftO9YKlG71ccyWFw4kSM9AG/xYu6vWXUGBr39Uw1TvYougANOcU21Q0TP4J08VPGnOnpXk/FGbQ== + dependencies: + "@firebase/auth-interop-types" "0.1.6" + "@firebase/component" "0.5.5" + "@firebase/database-types" "0.7.3" + "@firebase/logger" "0.2.6" + "@firebase/util" "1.2.0" + faye-websocket "0.11.3" + tslib "^2.1.0" + "@firebase/polyfill@0.3.36": version "0.3.36" resolved "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz#c057cce6748170f36966b555749472b25efdb145" @@ -1358,6 +1386,38 @@ promise-polyfill "8.1.3" whatwg-fetch "2.0.4" +"@firebase/util@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@firebase/util/-/util-1.2.0.tgz#4d4e419bf8c9bc1bc51308d1953dc2e4353c0770" + integrity sha512-8W9TTGImXr9cu+oyjBJ7yjoEd/IVAv0pBZA4c1uIuKrpGZi2ee38m+8xlZOBRmsAaOU/tR9DXz1WF/oeM6Fb7Q== + dependencies: + tslib "^2.1.0" + +"@google-cloud/common@^3.7.0": + version "3.7.1" + resolved "https://registry.npmjs.org/@google-cloud/common/-/common-3.7.1.tgz#e6a4b512ea0c72435b853831565bfba6a8dff2ac" + integrity sha512-BJfcV5BShbunYcn5HniebXLVp2Y6fpuesNegyar5CG8H2AKYHlKxnVID+FSwy92WAW4N2lpGdvxRsmiAn8Fc3w== + dependencies: + "@google-cloud/projectify" "^2.0.0" + "@google-cloud/promisify" "^2.0.0" + arrify "^2.0.1" + duplexify "^4.1.1" + ent "^2.2.0" + extend "^3.0.2" + google-auth-library "^7.0.2" + retry-request "^4.2.2" + teeny-request "^7.0.0" + +"@google-cloud/firestore@^4.5.0": + version "4.14.2" + resolved "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.14.2.tgz#2890e81f68269ba8d153992a630798096a70019a" + integrity sha512-5KmcmBqtgD/cC3Rx7HkTju9OepIaBP54ZtWviU28cuJK9OA4O8eBbzr3x54/h/DTHGjfr/i7h8X2sU6QryRCkg== + dependencies: + fast-deep-equal "^3.1.1" + functional-red-black-tree "^1.0.1" + google-gax "^2.24.1" + protobufjs "^6.8.6" + "@google-cloud/paginator@^3.0.0": version "3.0.5" resolved "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz#9d6b96c421a89bd560c1bc2c197c7611ef21db6c" @@ -1402,6 +1462,32 @@ lodash.snakecase "^4.1.1" p-defer "^3.0.0" +"@google-cloud/storage@^5.3.0": + version "5.13.1" + resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.13.1.tgz#9a48f9fec4fe78abb79fb531b411dd6f4c228b4d" + integrity sha512-iOyHn5pkIQY7AYdMmpo2FScHz12pE58ZECXmwUJXHP8pGpin8yQDjSxtKtOiFaSObI3mS5/DvsyYwDvg15NMlA== + dependencies: + "@google-cloud/common" "^3.7.0" + "@google-cloud/paginator" "^3.0.0" + "@google-cloud/promisify" "^2.0.0" + arrify "^2.0.0" + async-retry "^1.3.1" + compressible "^2.0.12" + date-and-time "^2.0.0" + duplexify "^4.0.0" + extend "^3.0.2" + gcs-resumable-upload "^3.3.0" + get-stream "^6.0.0" + hash-stream-validation "^0.2.2" + mime "^2.2.0" + mime-types "^2.0.8" + onetime "^5.1.0" + p-limit "^3.0.1" + pumpify "^2.0.0" + snakeize "^0.1.0" + stream-events "^1.0.1" + xdg-basedir "^4.0.0" + "@grpc/grpc-js@^1.3.2", "@grpc/grpc-js@~1.3.0": version "1.3.2" resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.2.tgz#eae97e6daf5abd49a7818aadeca0744dfb1ebca1" @@ -2414,6 +2500,11 @@ resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.18.2.tgz#a0f15d2ef752567713c1f59f69c6742edb03030c" integrity sha512-+0P+PrP9qSFVaayNdek4P1OAGE+PEl2SsufuHDRmUpOY25Wzjo7Atyar56Trjc32jkNy4lID6ZFT6BahsR9P9A== +"@panva/asn1.js@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6" + integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2731,7 +2822,7 @@ resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== -"@types/cors@^2.8.8": +"@types/cors@^2.8.5", "@types/cors@^2.8.8": version "2.8.12" resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== @@ -2774,6 +2865,14 @@ resolved "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5" integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== +"@types/express-jwt@0.0.42": + version "0.0.42" + resolved "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz#4f04e1fadf9d18725950dc041808a4a4adf7f5ae" + integrity sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag== + dependencies: + "@types/express" "*" + "@types/express-unless" "*" + "@types/express-serve-static-core@*": version "4.17.19" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" @@ -2783,6 +2882,32 @@ "@types/qs" "*" "@types/range-parser" "*" +"@types/express-serve-static-core@^4.17.18": + version "4.17.24" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express-unless@*": + version "0.5.2" + resolved "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz#07e29883d280778588644b03563d8796f870f20e" + integrity sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ== + dependencies: + "@types/express" "*" + +"@types/express@*": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/express@4.17.3": version "4.17.3" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz#38e4458ce2067873b09a73908df488870c303bd9" @@ -4106,6 +4231,13 @@ async-each@^1.0.1: resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-retry@^1.3.1: + version "1.3.3" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + async-settle@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" @@ -5498,7 +5630,7 @@ compress-commons@^4.1.0: normalize-path "^3.0.0" readable-stream "^3.6.0" -compressible@~2.0.16: +compressible@^2.0.12, compressible@~2.0.16: version "2.0.18" resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -5558,7 +5690,7 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" -configstore@^5.0.1: +configstore@^5.0.0, configstore@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== @@ -6006,6 +6138,11 @@ dataloader@^1.4.0: resolved "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== +date-and-time@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/date-and-time/-/date-and-time-2.0.0.tgz#99f5fb6b6c7bcd4d1f6dcbeb37553dc0ff797b65" + integrity sha512-HJSzj25iPm8E01nt+rSmCIlwjsmjvKfUivG/kXBglpymcHF1FolWAqWwTEV4FvN1Lx5UjPf0J1W4H8yQsVBfFg== + date-fns@^1.27.2: version "1.30.1" resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" @@ -6063,7 +6200,7 @@ debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" -debug@~4.3.1: +debug@^4.3.2, debug@~4.3.1: version "4.3.2" resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -6321,6 +6458,13 @@ di@^0.0.1: resolved "https://registry.npmjs.org/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= +dicer@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== + dependencies: + streamsearch "0.1.2" + diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" @@ -6457,6 +6601,16 @@ duplexify@^4.0.0: readable-stream "^3.1.1" stream-shift "^1.0.0" +duplexify@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + each-props@^1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" @@ -6601,7 +6755,7 @@ enquirer@^2.3.0, enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -ent@~2.2.0: +ent@^2.2.0, ent@~2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= @@ -7570,6 +7724,22 @@ fined@^1.0.1: object.pick "^1.2.0" parse-filepath "^1.0.1" +firebase-admin@9.11.1: + version "9.11.1" + resolved "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.11.1.tgz#b4f472ed51951937f333a4d88a0693ad37ffc90a" + integrity sha512-Y9fjelljy6MKqwsSbM/UN1k8gBQh5zfm5fCTe0Z6Gch2T3nDUIPsTcf+jfe4o40/MPYuybili9XJjTMmM2e5MQ== + dependencies: + "@firebase/database" "^0.10.0" + "@firebase/database-types" "^0.7.2" + "@types/node" ">=12.12.47" + dicer "^0.3.0" + jsonwebtoken "^8.5.1" + jwks-rsa "^2.0.2" + node-forge "^0.10.0" + optionalDependencies: + "@google-cloud/firestore" "^4.5.0" + "@google-cloud/storage" "^5.3.0" + firebase-functions@3.14.1: version "3.14.1" resolved "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.14.1.tgz#3ac5bc70989365874f41d06bca3b42a233dd6039" @@ -7580,6 +7750,17 @@ firebase-functions@3.14.1: express "^4.17.1" lodash "^4.17.14" +firebase-functions@3.15.4: + version "3.15.4" + resolved "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.15.4.tgz#c9309a565abb1f57a1e50d41b3e54bcee6a3ee51" + integrity sha512-6Zq+QIqdslZLsSwWg25Hv39cgFBZr0oUAbCjfe/MXqSHMy8ZK/1Vdy/WKx5IRC6hE7+JrmfVylIyEonTyNcheA== + dependencies: + "@types/cors" "^2.8.5" + "@types/express" "4.17.3" + cors "^2.8.5" + express "^4.17.1" + lodash "^4.17.14" + firebase-tools@9.14.0: version "9.14.0" resolved "https://registry.npmjs.org/firebase-tools/-/firebase-tools-9.14.0.tgz#30d837c7ce8454746e69c5bf7e4f3689ae686dcb" @@ -7947,6 +8128,19 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" +gcs-resumable-upload@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.3.0.tgz#d1a866173f9b47e045d4406cafaa658dbb01e624" + integrity sha512-MQKWi+9hOSTyg5/SI1NBW4gAjL1wlkoevHefvr1PCBBXH4uKYLsug5qRrcotWKolDPLfWS51cWaHRN0CTtQNZw== + dependencies: + abort-controller "^3.0.0" + configstore "^5.0.0" + extend "^3.0.2" + gaxios "^4.0.0" + google-auth-library "^7.0.0" + pumpify "^2.0.0" + stream-events "^1.0.4" + geckodriver@1.22.3: version "1.22.3" resolved "https://registry.npmjs.org/geckodriver/-/geckodriver-1.22.3.tgz#324b3102944e8928e67bde61ca129afac417dece" @@ -8357,6 +8551,21 @@ google-auth-library@^7.0.0, google-auth-library@^7.0.2: jws "^4.0.0" lru-cache "^6.0.0" +google-auth-library@^7.6.1: + version "7.6.2" + resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.6.2.tgz#8654985dbd06d8519f09c9c2318c4092f289a501" + integrity sha512-yvEnwVsvgH8RXTtpf6e84e7dqIdUEKJhmQvTJwzYP+RDdHjLrDp9sk2u2ZNDJPLKZ7DJicx/+AStcQspJiq+Qw== + dependencies: + arrify "^2.0.0" + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + fast-text-encoding "^1.0.0" + gaxios "^4.0.0" + gcp-metadata "^4.2.0" + gtoken "^5.0.4" + jws "^4.0.0" + lru-cache "^6.0.0" + google-closure-compiler-java@^20210601.0.0: version "20210601.0.0" resolved "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20210601.0.0.tgz#88dc11b334bee6a704d9674c5143fd2e0d553517" @@ -8415,6 +8624,25 @@ google-gax@^2.12.0: protobufjs "^6.10.2" retry-request "^4.0.0" +google-gax@^2.24.1: + version "2.24.2" + resolved "https://registry.npmjs.org/google-gax/-/google-gax-2.24.2.tgz#b2f1b5a0edb4673c00ddb79514a6643152456c98" + integrity sha512-4OtyEIt/KAXRX5o2W/6DGf8MnMs1lMXwcGoPHR4PwXfTUVKjK7ywRe2/yRIMkYEDzAwu/kppPgfpX+kCG2rWfw== + dependencies: + "@grpc/grpc-js" "~1.3.0" + "@grpc/proto-loader" "^0.6.1" + "@types/long" "^4.0.0" + abort-controller "^3.0.0" + duplexify "^4.0.0" + fast-text-encoding "^1.0.3" + google-auth-library "^7.6.1" + is-stream-ended "^0.1.4" + node-fetch "^2.6.1" + object-hash "^2.1.1" + proto3-json-serializer "^0.1.1" + protobufjs "6.11.2" + retry-request "^4.0.0" + google-p12-pem@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz#673ac3a75d3903a87f05878f3c75e06fc151669e" @@ -8704,6 +8932,11 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-stream-validation@^0.2.2: + version "0.2.4" + resolved "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz#ee68b41bf822f7f44db1142ec28ba9ee7ccb7512" + integrity sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ== + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -9993,6 +10226,13 @@ join-path@^1.1.1: url-join "0.0.1" valid-url "^1" +jose@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz#29746a18d9fff7dcf9d5d2a6f62cb0c7cd27abd3" + integrity sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA== + dependencies: + "@panva/asn1.js" "^1.0.0" + jquery@^3.4.1: version "3.6.0" resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -10235,6 +10475,17 @@ jwa@^2.0.0: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" +jwks-rsa@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.4.tgz#59d95e39f300783a8582ef8aa37d5ebbc6a8aa6f" + integrity sha512-iJqVCECYZZ+3oPmY1qXv3Fq+3ywDtuNEVBvG41pPlaR0zyGxa12nC0beAOBBUhETJmc05puS50mRQN4NkCGhmg== + dependencies: + "@types/express-jwt" "0.0.42" + debug "^4.3.2" + jose "^2.0.5" + limiter "^1.1.5" + lru-memoizer "^2.1.4" + jws@^3.2.2: version "3.2.2" resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" @@ -10594,6 +10845,11 @@ liftoff@^3.1.0: rechoir "^0.6.2" resolve "^1.1.7" +limiter@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -11083,6 +11339,22 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@~4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + integrity sha1-HRdnnAac2l0ECZGgnbwsDbN35V4= + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +lru-memoizer@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz#b864d92b557f00b1eeb322156a0409cb06dafac6" + integrity sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ== + dependencies: + lodash.clonedeep "^4.5.0" + lru-cache "~4.0.0" + lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" @@ -11405,6 +11677,18 @@ mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== + +mime-types@^2.0.8: + version "2.1.32" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + dependencies: + mime-db "1.49.0" + mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.30" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" @@ -11417,7 +11701,7 @@ mime@1.6.0, mime@^1.6.0: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4, mime@^2.5.2: +mime@^2.2.0, mime@^2.4.4, mime@^2.5.2: version "2.5.2" resolved "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== @@ -12576,7 +12860,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.1, p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -13229,7 +13513,12 @@ proto-list@~1.2.1: resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -protobufjs@6.11.2, protobufjs@^6.10.0, protobufjs@^6.10.2: +proto3-json-serializer@^0.1.1: + version "0.1.3" + resolved "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.3.tgz#3b4d5f481dbb923dd88e259ed03b0629abc9a8e7" + integrity sha512-X0DAtxCBsy1NDn84huVFGOFgBslT2gBmM+85nY6/5SOAaCon1jzVNdvi74foIyFvs5CjtSbQsepsM5TsyNhqQw== + +protobufjs@6.11.2, protobufjs@^6.10.0, protobufjs@^6.10.2, protobufjs@^6.8.6: version "6.11.2" resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== @@ -13306,7 +13595,7 @@ prr@~1.0.1: resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: +pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= @@ -13353,6 +13642,15 @@ pumpify@^1.3.3, pumpify@^1.3.5: inherits "^2.0.3" pump "^2.0.0" +pumpify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" + integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== + dependencies: + duplexify "^4.1.1" + inherits "^2.0.3" + pump "^3.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -14021,6 +14319,19 @@ retry-request@^4.0.0: dependencies: debug "^4.1.1" +retry-request@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz#b7d82210b6d2651ed249ba3497f07ea602f1a903" + integrity sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg== + dependencies: + debug "^4.1.1" + extend "^3.0.2" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -14626,6 +14937,11 @@ smartwrap@^1.2.3: wcwidth "^1.0.1" yargs "^15.1.0" +snakeize@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz#10c088d8b58eb076b3229bb5a04e232ce126422d" + integrity sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0= + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -14990,6 +15306,13 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" +stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" + integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== + dependencies: + stubs "^3.0.0" + stream-exhaust@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" @@ -15044,6 +15367,11 @@ streamroller@^2.2.4: debug "^4.1.1" fs-extra "^8.1.0" +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -15226,6 +15554,11 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" +stubs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= + superstatic@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/superstatic/-/superstatic-7.1.0.tgz#42cc773a0f500fb691841e0533d0b8c31f25997f" @@ -15401,6 +15734,17 @@ tcp-port-used@^1.0.1: debug "4.3.1" is2 "^2.0.6" +teeny-request@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz#2b0d156f4a8ad81de44303302ba8d7f1f05e20e6" + integrity sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg== + dependencies: + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" + stream-events "^1.0.5" + uuid "^8.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -16353,6 +16697,11 @@ uuid@^3.0.0, uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.0.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -16997,7 +17346,7 @@ y18n@^5.0.5: resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: +yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=