diff --git a/.changeset/stale-ducks-live.md b/.changeset/stale-ducks-live.md new file mode 100644 index 00000000000..a01da06e64e --- /dev/null +++ b/.changeset/stale-ducks-live.md @@ -0,0 +1,5 @@ +--- +"@firebase/rules-unit-testing": major +--- + +BREAKING: Implement Rules Unit Testing v2 with new design and APIs. diff --git a/packages/rules-unit-testing/index.ts b/packages/rules-unit-testing/index.ts index a8bd500634d..8219dd0a474 100644 --- a/packages/rules-unit-testing/index.ts +++ b/packages/rules-unit-testing/index.ts @@ -1,6 +1,6 @@ /** * @license - * Copyright 2017 Google LLC + * 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. @@ -21,19 +21,4 @@ * creating a dependency on @firebase/rules-unit-testing. */ -export { - apps, - assertFails, - assertSucceeds, - discoverEmulators, - clearFirestoreData, - database, - firestore, - initializeAdminApp, - initializeTestApp, - loadDatabaseRules, - loadFirestoreRules, - loadStorageRules, - useEmulators, - withFunctionTriggersDisabled -} from './src/api'; +export const TODO = 'TODO'; diff --git a/packages/rules-unit-testing/package.json b/packages/rules-unit-testing/package.json index 2c0997b473b..48ff8cf7fa7 100644 --- a/packages/rules-unit-testing/package.json +++ b/packages/rules-unit-testing/package.json @@ -5,7 +5,7 @@ "author": "Firebase (https://firebase.google.com/)", "main": "dist/index.cjs.js", "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=10.10.0" }, "files": [ "dist" @@ -19,25 +19,12 @@ "test:ci": "node ../../scripts/run_tests_in_ci.js -s test" }, "license": "Apache-2.0", - "dependencies": { - "firebase": "8.10.0", - "@firebase/component": "0.5.6", - "@firebase/logger": "0.2.6", - "@firebase/util": "1.3.0", - "request": "2.88.2" - }, "devDependencies": { - "@google-cloud/firestore": "4.12.3", - "@types/request": "2.48.5", - "firebase-admin": "9.9.0", - "firebase-tools": "9.14.0", - "firebase-functions": "3.14.1", "rollup": "2.52.2", "rollup-plugin-typescript2": "0.30.0" }, "peerDependencies": { - "@google-cloud/firestore": "^4.2.0", - "firebase-admin": "^9.7.0" + "firebase": "^8.10.0" }, "repository": { "directory": "packages/rules-unit-testing", diff --git a/packages/rules-unit-testing/test/database.test.ts b/packages/rules-unit-testing/test/database.test.ts deleted file mode 100644 index 6378ef3d54f..00000000000 --- a/packages/rules-unit-testing/test/database.test.ts +++ /dev/null @@ -1,516 +0,0 @@ -/** - * @license - * Copyright 2017 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 * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as request from 'request'; -import * as sinon from 'sinon'; -import * as firebase from '../src/api'; -import { base64 } from '@firebase/util'; -import { _FirebaseApp } from '@firebase/app-types/private'; - -const expect = chai.expect; - -before(() => { - chai.use(chaiAsPromised); -}); - -describe('Testing Module Tests', function () { - let sandbox: sinon.SinonSandbox; - beforeEach(function () { - sandbox = sinon.createSandbox(); - }); - - afterEach(function () { - sandbox && sandbox.restore(); - }); - - it('assertSucceeds() iff success', async function () { - const success = Promise.resolve('success'); - const failure = Promise.reject('failure'); - await firebase.assertSucceeds(success).catch(() => { - throw new Error('Expected success to succeed.'); - }); - await firebase - .assertSucceeds(failure) - .then(() => { - throw new Error('Expected failure to fail.'); - }) - .catch(() => {}); - }); - - it('assertFails() iff PERMISSION_DENIED', async function () { - const success = Promise.resolve('success'); - const permissionDenied = Promise.reject({ - message: 'PERMISSION_DENIED' - }); - const otherFailure = Promise.reject('failure'); - await firebase - .assertFails(success) - .then(() => { - throw new Error('Expected success to fail.'); - }) - .catch(() => {}); - - await firebase.assertFails(permissionDenied).catch(() => { - throw new Error('Expected permissionDenied to succeed.'); - }); - - await firebase - .assertFails(otherFailure) - .then(() => { - throw new Error('Expected otherFailure to fail.'); - }) - .catch(() => {}); - }); - - it('assertFails() if code is permission-denied', async function () { - const success = Promise.resolve('success'); - const permissionDenied = Promise.reject({ - code: 'permission-denied' - }); - const otherFailure = Promise.reject('failure'); - await firebase - .assertFails(success) - .then(() => { - throw new Error('Expected success to fail.'); - }) - .catch(() => {}); - - await firebase.assertFails(permissionDenied).catch(() => { - throw new Error('Expected permissionDenied to succeed.'); - }); - - await firebase - .assertFails(otherFailure) - .then(() => { - throw new Error('Expected otherFailure to fail.'); - }) - .catch(() => {}); - }); - - it('assertFails() if code is PERMISSION_DENIED', async function () { - const success = Promise.resolve('success'); - const permissionDenied = Promise.reject({ - code: 'PERMISSION_DENIED' - }); - const otherFailure = Promise.reject('failure'); - await firebase - .assertFails(success) - .then(() => { - throw new Error('Expected success to fail.'); - }) - .catch(() => {}); - - await firebase.assertFails(permissionDenied).catch(() => { - throw new Error('Expected permissionDenied to succeed.'); - }); - - await firebase - .assertFails(otherFailure) - .then(() => { - throw new Error('Expected otherFailure to fail.'); - }) - .catch(() => {}); - }); - - it('assertFails() if message is Permission denied', async function () { - const success = Promise.resolve('success'); - const permissionDenied = Promise.reject({ - message: 'Permission denied' - }); - const otherFailure = Promise.reject('failure'); - await firebase - .assertFails(success) - .then(() => { - throw new Error('Expected success to fail.'); - }) - .catch(() => {}); - - await firebase.assertFails(permissionDenied).catch(() => { - throw new Error('Expected permissionDenied to succeed.'); - }); - - await firebase - .assertFails(otherFailure) - .then(() => { - throw new Error('Expected otherFailure to fail.'); - }) - .catch(() => {}); - }); - - it('assertFails() if message contains unauthorized', async function () { - const success = Promise.resolve('success'); - const permissionDenied = Promise.reject({ - message: 'User does not have permission to access \'file\'. (storage/unauthorized)' - }); - const otherFailure = Promise.reject('failure'); - await firebase - .assertFails(success) - .then(() => { - throw new Error('Expected success to fail.'); - }) - .catch(() => {}); - - await firebase.assertFails(permissionDenied).catch(() => { - throw new Error('Expected permissionDenied to succeed.'); - }); - - await firebase - .assertFails(otherFailure) - .then(() => { - throw new Error('Expected otherFailure to fail.'); - }) - .catch(() => {}); - }); - - it('discoverEmulators() finds all running emulators', async () => { - const options = await firebase.discoverEmulators(); - - expect(options).to.deep.equal({ - database: { - host: 'localhost', - port: 9002 - }, - firestore: { - host: 'localhost', - port: 9003 - }, - storage: { - host: 'localhost', - port: 9199 - }, - hub: { - host: 'localhost', - port: 4400 - } - }); - }); - - it('initializeTestApp() with auth=null does not set access token', async function () { - const app = firebase.initializeTestApp({ - projectId: 'foo', - auth: undefined - }); - - const authInternal = ((app as unknown) as _FirebaseApp).container - .getProvider('auth-internal') - .getImmediate({ optional: true }); - // Auth instance will not be available because no API Key is provided - expect(authInternal).to.be.null; - }); - - it('initializeTestApp() with auth sets the correct access token', async function () { - const auth = { uid: 'alice' }; - const app = firebase.initializeTestApp({ - projectId: 'foo', - auth: auth - }); - const authInternal = ((app as unknown) as _FirebaseApp).container - .getProvider('auth-internal') - .getImmediate(); - - const token = await authInternal.getToken(); - expect(token).to.have.keys('accessToken'); - const claims = JSON.parse( - base64.decodeString(token!.accessToken.split('.')[1], /*webSafe=*/ false) - ); - // We add an 'iat' field. - expect(claims).to.deep.equal({ - iss: 'https://securetoken.google.com/foo', - aud: 'foo', - iat: 0, - exp: 3600, - auth_time: 0, - sub: 'alice', - user_id: 'alice', - firebase: { - sign_in_provider: 'custom', - identities: {} - } - }); - }); - - it('initializeAdminApp() has admin access to RTDB', async function () { - await firebase.loadDatabaseRules({ - databaseName: 'foo', - rules: '{ "rules": {".read": false, ".write": false} }' - }); - - const app = firebase.initializeAdminApp({ - projectId: 'foo', - databaseName: 'foo', - storageBucket: 'foo' - }); - - await firebase.assertSucceeds( - app.database().ref().child('/foo/bar').set({ hello: 'world' }) - ); - }); - - it('initializeAdminApp() has admin access to Firestore', async function () { - await firebase.loadFirestoreRules({ - projectId: 'foo', - rules: `service cloud.firestore { - match /databases/{db}/documents/{doc=**} { - allow read, write: if false; - } - }` - }); - - const app = firebase.initializeAdminApp({ - projectId: 'foo', - databaseName: 'foo', - storageBucket: 'foo' - }); - - await firebase.assertSucceeds( - app.firestore().doc('/foo/bar').set({ hello: 'world' }) - ); - }); - - it('initializeAdminApp() has admin access to storage', async function () { - await firebase.loadStorageRules({ - rules: `rules_version = '2'; - service firebase.storage { - match /b/{bucket}/o { - match /{allPaths=**} { - allow read, write: if false; - } - } - }` - }); - - const app = firebase.initializeAdminApp({ - projectId: 'foo', - databaseName: 'foo', - storageBucket: 'foo' - }); - - // TODO: This test cannot be enabled without adding credentials to the test environment - // due to an underlying issue with firebase-admin storage. For now we will run it - // locally but not in CI. - if (process.env.CI !== 'true') { - await firebase.assertSucceeds( - app.storage().bucket().file('/foo/bar.txt').save('Hello, World!') - ); - } - }); - - it('initializeAdminApp() and initializeTestApp() work together', async function () { - await firebase.loadDatabaseRules({ - databaseName: 'foo', - rules: JSON.stringify({ - 'rules': { - 'public': { '.read': true, '.write': true }, - 'private': { '.read': false, '.write': false } - } - }) - }); - - const adminApp = firebase.initializeAdminApp({ - projectId: 'foo', - databaseName: 'foo', - storageBucket: 'foo' - }); - - const testApp = firebase.initializeTestApp({ - projectId: 'foo', - databaseName: 'foo', - storageBucket: 'foo' - }); - - // Admin app can write anywhere - await firebase.assertSucceeds( - adminApp.database().ref().child('/public/doc').set({ hello: 'admin' }) - ); - await firebase.assertSucceeds( - adminApp.database().ref().child('/private/doc').set({ hello: 'admin' }) - ); - - // Test app can only write to public, not to private - await firebase.assertSucceeds( - testApp.database().ref().child('/public/doc').set({ hello: 'test' }) - ); - await firebase.assertFails( - testApp.database().ref().child('/private/doc').set({ hello: 'test' }) - ); - }); - - it('initializeAdminApp() works with custom claims', async function () { - await firebase.loadFirestoreRules({ - projectId: 'foo', - rules: `service cloud.firestore { - match /databases/{db}/documents/{doc=**} { - allow read, write: if request.auth.token.custom_claim == 'foo'; - } - }` - }); - - const noClaim = firebase.initializeTestApp({ - projectId: 'foo', - auth: { - uid: 'noClaim' - } - }); - - const hasClaim = firebase.initializeTestApp({ - projectId: 'foo', - auth: { - uid: 'hasClaim', - custom_claim: 'foo' - } - }); - - const wrongClaim = firebase.initializeTestApp({ - projectId: 'foo', - auth: { - uid: 'wrongClaim', - custom_claim: 'bar' - } - }); - - await firebase.assertSucceeds( - hasClaim.firestore().doc('test/test').set({ hello: 'test' }) - ); - await firebase.assertFails( - noClaim.firestore().doc('test/test').set({ hello: 'test' }) - ); - await firebase.assertFails( - wrongClaim.firestore().doc('test/test').set({ hello: 'test' }) - ); - }); - - it('initializeTestApp() does not destroy user input', function () { - const options = { - projectId: 'fakeproject', - auth: { - uid: 'sam', - email: 'sam@sam.com' - } - }; - const optionsCopy = Object.assign({}, options); - - firebase.initializeTestApp(options); - expect(options).to.deep.equal(optionsCopy); - }); - - it('loadDatabaseRules() throws if no databaseName or rules', async function () { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - await expect( - firebase.loadDatabaseRules({} as any) - ).to.eventually.be.rejectedWith(/databaseName not specified/); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - await expect( - firebase.loadDatabaseRules({ - databaseName: 'foo' - } as any) - ).to.eventually.be.rejectedWith(/must provide rules/); - await expect( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - firebase.loadDatabaseRules({ rules: '{}' } as any) - ).to.eventually.be.rejectedWith(/databaseName not specified/); - }); - - it('loadDatabaseRules() succeeds on valid input', async function () { - await firebase.loadDatabaseRules({ - databaseName: 'foo', - rules: '{ "rules": {} }' - }); - }); - - it('loadFirestoreRules() succeeds on valid input', async function () { - await firebase.loadFirestoreRules({ - projectId: 'foo', - rules: `service cloud.firestore { - match /databases/{db}/documents/{doc=**} { - allow read, write; - } - }` - }); - }); - - it('loadStorageRules() succeeds on valid input', async function () { - await firebase.loadStorageRules({ - rules: `rules_version = '2'; - service firebase.storage { - match /b/{bucket}/o { - match /{allPaths=**} { - allow read, write: if false; - } - } - }` - }); - }); - - it('loadStorageRules() fails on invalid input', async function () { - const p = firebase.loadStorageRules({ - rules: `rules_version = '2'; - service firebase.storage { - banana - }` - }); - - await expect(p).to.eventually.be.rejected; - }); - - it('clearFirestoreData() succeeds on valid input', async function () { - await firebase.clearFirestoreData({ - projectId: 'foo' - }); - }); - - it('apps() returns apps created with initializeTestApp', async function () { - const numApps = firebase.apps().length; - await firebase.initializeTestApp({ databaseName: 'foo', auth: undefined }); - expect(firebase.apps().length).to.equal(numApps + 1); - await firebase.initializeTestApp({ databaseName: 'bar', auth: undefined }); - expect(firebase.apps().length).to.equal(numApps + 2); - }); - - it('there is a way to get database timestamps', function () { - expect(firebase.database.ServerValue.TIMESTAMP).to.deep.equal({ - '.sv': 'timestamp' - }); - }); - - it('there is a way to get firestore timestamps', function () { - expect(firebase.firestore.FieldValue.serverTimestamp()).not.to.be.null; - }); - - it('disabling function triggers does not throw, returns value', async function () { - const putSpy = sandbox.spy(request, 'put'); - - const res = await firebase.withFunctionTriggersDisabled(() => { - return Promise.resolve(1234); - }); - - expect(res).to.eq(1234); - expect(putSpy.callCount).to.equal(2); - }); - - it('disabling function triggers always re-enables, event when the function throws', async function () { - const putSpy = sandbox.spy(request, 'put'); - - const res = firebase.withFunctionTriggersDisabled(() => { - throw new Error('I throw!'); - }); - - await expect(res).to.eventually.be.rejectedWith('I throw!'); - expect(putSpy.callCount).to.equal(2); - }); -}); diff --git a/scripts/emulator-testing/emulators/emulator.ts b/scripts/emulator-testing/emulators/emulator.ts index bea75d39dc4..a6e533a1454 100644 --- a/scripts/emulator-testing/emulators/emulator.ts +++ b/scripts/emulator-testing/emulators/emulator.ts @@ -21,7 +21,7 @@ import { ChildProcess } from 'child_process'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; -import * as request from 'request'; +import fetch from 'node-fetch'; // @ts-ignore import * as tmp from 'tmp'; @@ -57,25 +57,29 @@ export abstract class Emulator { const writeStream: fs.WriteStream = fs.createWriteStream(filepath); console.log(`Downloading emulator from [${this.binaryUrl}] ...`); - request(this.binaryUrl) - .pipe(writeStream) - .on('finish', () => { - console.log(`Saved emulator binary file to [${filepath}].`); - // Change emulator binary file permission to 'rwxr-xr-x'. - // The execute permission is required for it to be able to start - // with 'java -jar'. - fs.chmod(filepath, 0o755, err => { - if (err) reject(err); - console.log(`Changed emulator file permissions to 'rwxr-xr-x'.`); - this.binaryPath = filepath; - - if (this.copyToCache()) { - console.log(`Cached emulator at ${this.cacheBinaryPath}`); - } - resolve(); - }); - }) - .on('error', reject); + fetch(this.binaryUrl).then(resp => { + resp.body + .pipe(writeStream) + .on('finish', () => { + console.log(`Saved emulator binary file to [${filepath}].`); + // Change emulator binary file permission to 'rwxr-xr-x'. + // The execute permission is required for it to be able to start + // with 'java -jar'. + fs.chmod(filepath, 0o755, err => { + if (err) reject(err); + console.log( + `Changed emulator file permissions to 'rwxr-xr-x'.` + ); + this.binaryPath = filepath; + + if (this.copyToCache()) { + console.log(`Cached emulator at ${this.cacheBinaryPath}`); + } + resolve(); + }); + }) + .on('error', reject); + }); }); }); } @@ -116,19 +120,17 @@ export abstract class Emulator { reject(`Emulator not ready after ${timeout}s. Exiting ...`); } else { console.log(`Ping emulator at [http://localhost:${this.port}] ...`); - request(`http://localhost:${this.port}`, (error, response) => { - if (error && error.code === 'ECONNREFUSED') { - setTimeout(wait, 1000, resolve, reject); - } else if (response) { + fetch(`http://localhost:${this.port}`).then( + () => { // Database and Firestore emulators will return 400 and 200 respectively. // As long as we get a response back, it means the emulator is ready. console.log(`Emulator has started up after ${elapsed}s!`); resolve(); - } else { - // This should not happen. - reject({ error, response }); + }, + error => { + setTimeout(wait, 1000, resolve, reject); } - }); + ); } }; setTimeout(wait, 1000, resolve, reject); diff --git a/yarn.lock b/yarn.lock index 16066789560..1777bbdc9a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1349,34 +1349,6 @@ 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" @@ -1386,48 +1358,6 @@ 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.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@google-cloud/common/-/common-3.6.0.tgz#c2f6da5f79279a4a9ac7c71fc02d582beab98e8b" - integrity sha512-aHIFTqJZmeTNO9md8XxV+ywuvXF3xBm5WNmgWeeCK+XN5X+kGW0WEX94wGwj+/MdOnrVf4dL2RvSIt9J5yJG6Q== - 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.1.1" - teeny-request "^7.0.0" - -"@google-cloud/firestore@4.12.3": - version "4.12.3" - resolved "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.12.3.tgz#eef62aceec5b1193385cfe3a2f39b628db353484" - integrity sha512-FTty3+paAj73KEfTJEpDxG9apLp9K3DySTeeewLLdljusRjZFgJ3jIiqi7tAKJjVsKOiXY4NRk4/0rpEQhHitQ== - dependencies: - fast-deep-equal "^3.1.1" - functional-red-black-tree "^1.0.1" - google-gax "^2.12.0" - protobufjs "^6.8.6" - -"@google-cloud/firestore@^4.5.0": - version "4.11.1" - resolved "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.11.1.tgz#03e12e5721383165efc09e208143378f3ea681d6" - integrity sha512-iNsCGYwKBxYZS+TpkUAJLGkGko2QtWaf11JDNx6kvqOVN0359qSnZlF1SWFTvm26ZsKyX6uR4oAiFmmjfXTlCg== - dependencies: - fast-deep-equal "^3.1.1" - functional-red-black-tree "^1.0.1" - google-gax "^2.12.0" - 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" @@ -1472,33 +1402,6 @@ lodash.snakecase "^4.1.1" p-defer "^3.0.0" -"@google-cloud/storage@^5.3.0": - version "5.8.5" - resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.8.5.tgz#2cf1e2e0ef8ca552abc4450301fef3fea4900ef6" - integrity sha512-i0gB9CRwQeOBYP7xuvn14M40LhHCwMjceBjxE4CTvsqL519sVY5yVKxLiAedHWGwUZHJNRa7Q2CmNfkdRwVNPg== - dependencies: - "@google-cloud/common" "^3.6.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 "^1.0.0" - duplexify "^4.0.0" - extend "^3.0.2" - gaxios "^4.0.0" - gcs-resumable-upload "^3.1.4" - 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" @@ -2511,11 +2414,6 @@ 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" @@ -2787,11 +2685,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== - "@types/chai-as-promised@7.1.3": version "7.1.3" resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" @@ -2881,14 +2774,6 @@ 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" @@ -2898,32 +2783,6 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express-serve-static-core@^4.17.18": - version "4.17.21" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz#a427278e106bca77b83ad85221eae709a3414d42" - integrity sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express-unless@*": - version "0.5.1" - resolved "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz#4f440b905e42bbf53382b8207bc337dc5ff9fd1f" - integrity sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw== - dependencies: - "@types/express" "*" - -"@types/express@*": - version "4.17.12" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz#4bc1bf3cd0cfe6d3f6f2853648b40db7d54de350" - integrity sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q== - 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" @@ -3120,16 +2979,6 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/request@2.48.5": - version "2.48.5" - resolved "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz#019b8536b402069f6d11bee1b2c03e7f232937a0" - integrity sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ== - dependencies: - "@types/caseless" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -3204,11 +3053,6 @@ resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.0.tgz#e3f52b4d7397eaa9193592ef3fdd44dc0af4298c" integrity sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ== -"@types/tough-cookie@*": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" - integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== - "@types/vinyl@^2.0.4": version "2.0.4" resolved "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.4.tgz#9a7a8071c8d14d3a95d41ebe7135babe4ad5995a" @@ -4262,13 +4106,6 @@ 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.1" - resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" - integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== - dependencies: - retry "0.12.0" - async-settle@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" @@ -5661,7 +5498,7 @@ compress-commons@^4.1.0: normalize-path "^3.0.0" readable-stream "^3.6.0" -compressible@^2.0.12, compressible@~2.0.16: +compressible@~2.0.16: version "2.0.18" resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -5721,7 +5558,7 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" -configstore@^5.0.0, configstore@^5.0.1: +configstore@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== @@ -6169,11 +6006,6 @@ dataloader@^1.4.0: resolved "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== -date-and-time@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/date-and-time/-/date-and-time-1.0.0.tgz#0062394bdf6f44e961f0db00511cb19cdf3cc0a5" - integrity sha512-477D7ypIiqlXBkxhU7YtG9wWZJEQ+RUpujt2quTfgf4+E8g5fNUkB0QIL0bVyP5/TKBg8y55Hfa1R/c4bt3dEw== - date-fns@^1.27.2: version "1.30.1" resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" @@ -6489,13 +6321,6 @@ 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" @@ -6622,7 +6447,7 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -duplexify@^4.0.0, duplexify@^4.1.1: +duplexify@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== @@ -6776,7 +6601,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= @@ -7745,22 +7570,6 @@ fined@^1.0.1: object.pick "^1.2.0" parse-filepath "^1.0.1" -firebase-admin@9.9.0: - version "9.9.0" - resolved "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.9.0.tgz#40442704b5ac0fddfdcdf4255601f8acb1e6fab3" - integrity sha512-04HT7JAAqcJYty95qf15IBD9CXf+vr7S8zNU6Zt1ayC1J05DLaCsUd19/sCNAjZ614KHexAYUtyLgZoJwu2wOQ== - 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" @@ -7927,15 +7736,6 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - form-data@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -8147,19 +7947,6 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" -gcs-resumable-upload@^3.1.4: - version "3.1.4" - resolved "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.4.tgz#2e591889efb02247af26868de300b398346b17b5" - integrity sha512-5dyDfHrrVcIskiw/cPssVD4HRiwoHjhk1Nd6h5W3pQ/qffDvhfy4oNCr1f3ZXFPwTnxkCbibsB+73oOM+NvmJQ== - 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" @@ -8917,11 +8704,6 @@ 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" @@ -10211,13 +9993,6 @@ 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" @@ -10460,17 +10235,6 @@ jwa@^2.0.0: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jwks-rsa@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.3.tgz#4059f25e27f1d9cb5681dd12a98e46f8aa39fcbd" - integrity sha512-/rkjXRWAp0cS00tunsHResw68P5iTQru8+jHufLNv3JHc4nObFEndfEUSuPugh09N+V9XYxKUqi7QrkmCHSSSg== - dependencies: - "@types/express-jwt" "0.0.42" - debug "^4.1.0" - jose "^2.0.5" - limiter "^1.1.5" - lru-memoizer "^2.1.2" - jws@^3.2.2: version "3.2.2" resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" @@ -10830,11 +10594,6 @@ 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" @@ -11324,22 +11083,6 @@ 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.2: - 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" @@ -11662,7 +11405,7 @@ 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-types@^2.0.8, 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: +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" integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== @@ -11674,7 +11417,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.2.0, mime@^2.4.4, mime@^2.5.2: +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== @@ -12833,7 +12576,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.1, p-limit@^3.0.2, p-limit@^3.1.0: +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== @@ -13486,7 +13229,7 @@ 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, protobufjs@^6.8.6: +protobufjs@6.11.2, protobufjs@^6.10.0, protobufjs@^6.10.2: version "6.11.2" resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== @@ -13563,7 +13306,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.1, pseudomap@^1.0.2: +pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= @@ -13610,15 +13353,6 @@ 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" @@ -14149,7 +13883,7 @@ replacestream@^4.0.3: object-assign "^4.0.1" readable-stream "^2.0.2" -request@2.88.2, request@^2.87.0, request@^2.88.0, request@^2.88.2: +request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -14280,14 +14014,14 @@ ret@~0.1.10: resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry-request@^4.0.0, retry-request@^4.1.1: +retry-request@^4.0.0: version "4.1.3" resolved "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz#d5f74daf261372cff58d08b0a1979b4d7cab0fde" integrity sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ== dependencies: debug "^4.1.1" -retry@0.12.0, retry@^0.12.0: +retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= @@ -14892,11 +14626,6 @@ 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" @@ -15261,13 +14990,6 @@ 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" @@ -15322,11 +15044,6 @@ 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" @@ -15509,11 +15226,6 @@ 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" @@ -15689,17 +15401,6 @@ tcp-port-used@^1.0.1: debug "4.3.1" is2 "^2.0.6" -teeny-request@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz#bdd41fdffea5f8fbc0d29392cb47bec4f66b2b4c" - integrity sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw== - dependencies: - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.1" - stream-events "^1.0.5" - uuid "^8.0.0" - temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -16652,11 +16353,6 @@ 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" @@ -17301,7 +16997,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.0.0, yallist@^2.1.2: +yallist@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=