diff --git a/entrypoints.json b/entrypoints.json
index d35b7b8edf..975db81888 100644
--- a/entrypoints.json
+++ b/entrypoints.json
@@ -24,6 +24,10 @@
"typings": "./lib/firestore/index.d.ts",
"dist": "./lib/firestore/index.js"
},
+ "firebase-admin/installations": {
+ "typings": "./lib/installations/index.d.ts",
+ "dist": "./lib/installations/index.js"
+ },
"firebase-admin/instance-id": {
"typings": "./lib/instance-id/index.d.ts",
"dist": "./lib/instance-id/index.js"
diff --git a/etc/firebase-admin.api.md b/etc/firebase-admin.api.md
index c82698b5a3..29d2e783d8 100644
--- a/etc/firebase-admin.api.md
+++ b/etc/firebase-admin.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
import { Bucket } from '@google-cloud/storage';
import { FirebaseDatabase } from '@firebase/database-types';
@@ -27,6 +29,8 @@ export namespace app {
// (undocumented)
firestore(): firestore.Firestore;
// (undocumented)
+ installations(): installations.Installations;
+ // @deprecated (undocumented)
instanceId(): instanceId.InstanceId;
// (undocumented)
machineLearning(): machineLearning.MachineLearning;
@@ -52,6 +56,10 @@ export namespace appCheck {
export type AppCheck = AppCheck;
// Warning: (ae-forgotten-export) The symbol "AppCheckToken" needs to be exported by the entry point default-namespace.d.ts
export type AppCheckToken = AppCheckToken;
+ // Warning: (ae-forgotten-export) The symbol "AppCheckTokenOptions" needs to be exported by the entry point default-namespace.d.ts
+ //
+ // (undocumented)
+ export type AppCheckTokenOptions = AppCheckTokenOptions;
// Warning: (ae-forgotten-export) The symbol "DecodedAppCheckToken" needs to be exported by the entry point default-namespace.d.ts
export type DecodedAppCheckToken = DecodedAppCheckToken;
// Warning: (ae-forgotten-export) The symbol "VerifyAppCheckTokenResponse" needs to be exported by the entry point default-namespace.d.ts
@@ -271,6 +279,15 @@ export interface GoogleOAuthAccessToken {
// @public (undocumented)
export function initializeApp(options?: AppOptions, name?: string): app.App;
+// @public
+export function installations(app?: App): installations.Installations;
+
+// @public (undocumented)
+export namespace installations {
+ // Warning: (ae-forgotten-export) The symbol "Installations" needs to be exported by the entry point default-namespace.d.ts
+ export type Installations = Installations;
+}
+
// @public
export function instanceId(app?: App): instanceId.InstanceId;
@@ -473,5 +490,4 @@ export namespace storage {
export type Storage = Storage;
}
-
```
diff --git a/etc/firebase-admin.app-check.api.md b/etc/firebase-admin.app-check.api.md
index 7455692bec..fb4e10ff64 100644
--- a/etc/firebase-admin.app-check.api.md
+++ b/etc/firebase-admin.app-check.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public
@@ -12,7 +14,7 @@ export class AppCheck {
//
// (undocumented)
readonly app: App;
- createToken(appId: string): Promise;
+ createToken(appId: string, options?: AppCheckTokenOptions): Promise;
verifyToken(appCheckToken: string): Promise;
}
@@ -22,6 +24,11 @@ export interface AppCheckToken {
ttlMillis: number;
}
+// @public
+export interface AppCheckTokenOptions {
+ ttlMillis?: number;
+}
+
// @public
export interface DecodedAppCheckToken {
// (undocumented)
@@ -43,5 +50,4 @@ export interface VerifyAppCheckTokenResponse {
token: DecodedAppCheckToken;
}
-
```
diff --git a/etc/firebase-admin.app.api.md b/etc/firebase-admin.app.api.md
index 794a74e9e4..13b925d89e 100644
--- a/etc/firebase-admin.app.api.md
+++ b/etc/firebase-admin.app.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public
@@ -84,5 +86,4 @@ export interface ServiceAccount {
projectId?: string;
}
-
```
diff --git a/etc/firebase-admin.auth.api.md b/etc/firebase-admin.auth.api.md
index 563e2204bb..36b2dcf686 100644
--- a/etc/firebase-admin.auth.api.md
+++ b/etc/firebase-admin.auth.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public
@@ -26,7 +28,7 @@ export class Auth extends BaseAuth {
// Warning: (ae-forgotten-export) The symbol "App" needs to be exported by the entry point index.d.ts
get app(): App;
tenantManager(): TenantManager;
- }
+}
// @public
export type AuthFactorType = 'phone';
@@ -299,7 +301,7 @@ export class Tenant {
[phoneNumber: string]: string;
};
toJSON(): object;
- }
+}
// @public
export class TenantAwareAuth extends BaseAuth {
@@ -472,5 +474,4 @@ export class UserRecord {
readonly uid: string;
}
-
```
diff --git a/etc/firebase-admin.database.api.md b/etc/firebase-admin.database.api.md
index abc6b75a0c..e2411ce4be 100644
--- a/etc/firebase-admin.database.api.md
+++ b/etc/firebase-admin.database.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
import { DataSnapshot } from '@firebase/database-types';
import { EventType } from '@firebase/database-types';
@@ -47,5 +49,4 @@ export const ServerValue: rtdb.ServerValue;
export { ThenableReference }
-
```
diff --git a/etc/firebase-admin.firestore.api.md b/etc/firebase-admin.firestore.api.md
index 392d55a71c..48373f54b6 100644
--- a/etc/firebase-admin.firestore.api.md
+++ b/etc/firebase-admin.firestore.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
import { BulkWriter } from '@google-cloud/firestore';
import { BulkWriterOptions } from '@google-cloud/firestore';
@@ -95,5 +97,4 @@ export { WriteBatch }
export { WriteResult }
-
```
diff --git a/etc/firebase-admin.installations.api.md b/etc/firebase-admin.installations.api.md
new file mode 100644
index 0000000000..a3581a317f
--- /dev/null
+++ b/etc/firebase-admin.installations.api.md
@@ -0,0 +1,23 @@
+## API Report File for "firebase-admin.installations"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+///
+
+import { Agent } from 'http';
+
+// Warning: (ae-forgotten-export) The symbol "App" needs to be exported by the entry point index.d.ts
+//
+// @public
+export function getInstallations(app?: App): Installations;
+
+// @public
+export class Installations {
+ constructor(app: App);
+ get app(): App;
+ deleteInstallation(fid: string): Promise;
+}
+
+```
diff --git a/etc/firebase-admin.instance-id.api.md b/etc/firebase-admin.instance-id.api.md
index 0754a74e69..2e2a43f642 100644
--- a/etc/firebase-admin.instance-id.api.md
+++ b/etc/firebase-admin.instance-id.api.md
@@ -4,18 +4,19 @@
```ts
+///
+
import { Agent } from 'http';
// Warning: (ae-forgotten-export) The symbol "App" needs to be exported by the entry point index.d.ts
//
-// @public
+// @public @deprecated
export function getInstanceId(app?: App): InstanceId;
-// @public
+// @public @deprecated
export class InstanceId {
get app(): App;
deleteInstanceId(instanceId: string): Promise;
- }
-
+}
```
diff --git a/etc/firebase-admin.machine-learning.api.md b/etc/firebase-admin.machine-learning.api.md
index 149a81c61a..80fa32bcc5 100644
--- a/etc/firebase-admin.machine-learning.api.md
+++ b/etc/firebase-admin.machine-learning.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public (undocumented)
@@ -89,5 +91,4 @@ export interface TFLiteModel {
readonly sizeBytes: number;
}
-
```
diff --git a/etc/firebase-admin.messaging.api.md b/etc/firebase-admin.messaging.api.md
index a7ac9f1182..c37466734c 100644
--- a/etc/firebase-admin.messaging.api.md
+++ b/etc/firebase-admin.messaging.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public
@@ -190,7 +192,7 @@ export class Messaging {
sendToTopic(topic: string, payload: MessagingPayload, options?: MessagingOptions): Promise;
subscribeToTopic(registrationTokenOrTokens: string | string[], topic: string): Promise;
unsubscribeFromTopic(registrationTokenOrTokens: string | string[], topic: string): Promise;
- }
+}
// @public
export interface MessagingConditionResponse {
@@ -350,5 +352,4 @@ export interface WebpushNotification {
vibrate?: number | number[];
}
-
```
diff --git a/etc/firebase-admin.project-management.api.md b/etc/firebase-admin.project-management.api.md
index a2d20dc539..2b8d28297c 100644
--- a/etc/firebase-admin.project-management.api.md
+++ b/etc/firebase-admin.project-management.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public
@@ -75,7 +77,7 @@ export class ProjectManagement {
listIosApps(): Promise;
setDisplayName(newDisplayName: string): Promise;
shaCertificate(shaHash: string): ShaCertificate;
- }
+}
// @public
export class ShaCertificate {
@@ -86,5 +88,4 @@ export class ShaCertificate {
readonly shaHash: string;
}
-
```
diff --git a/etc/firebase-admin.remote-config.api.md b/etc/firebase-admin.remote-config.api.md
index 6e0e2eb142..933f8536d7 100644
--- a/etc/firebase-admin.remote-config.api.md
+++ b/etc/firebase-admin.remote-config.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// @public
@@ -113,5 +115,4 @@ export interface Version {
versionNumber?: string;
}
-
```
diff --git a/etc/firebase-admin.security-rules.api.md b/etc/firebase-admin.security-rules.api.md
index c3a75dd97e..890da538d1 100644
--- a/etc/firebase-admin.security-rules.api.md
+++ b/etc/firebase-admin.security-rules.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
// Warning: (ae-forgotten-export) The symbol "App" needs to be exported by the entry point index.d.ts
@@ -56,5 +58,4 @@ export class SecurityRules {
releaseStorageRulesetFromSource(source: string | Buffer, bucket?: string): Promise;
}
-
```
diff --git a/etc/firebase-admin.storage.api.md b/etc/firebase-admin.storage.api.md
index 278148d2b2..204c033a6b 100644
--- a/etc/firebase-admin.storage.api.md
+++ b/etc/firebase-admin.storage.api.md
@@ -4,6 +4,8 @@
```ts
+///
+
import { Agent } from 'http';
import { Bucket } from '@google-cloud/storage';
@@ -16,7 +18,6 @@ export function getStorage(app?: App): Storage;
export class Storage {
get app(): App;
bucket(name?: string): Bucket;
- }
-
+}
```
diff --git a/package-lock.json b/package-lock.json
index d1097b9d83..a32e9e19e6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "firebase-admin",
- "version": "9.100.0-alpha.0",
+ "version": "9.100.0-alpha.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -14,9 +14,9 @@
}
},
"@babel/compat-data": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz",
- "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz",
+ "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==",
"dev": true
},
"@babel/core": {
@@ -42,11 +42,87 @@
"source-map": "^0.5.0"
},
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+ "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.0",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
}
}
},
@@ -70,14 +146,14 @@
}
},
"@babel/helper-compilation-targets": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz",
- "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==",
+ "version": "7.13.16",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz",
+ "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.14.4",
+ "@babel/compat-data": "^7.13.15",
"@babel/helper-validator-option": "^7.12.17",
- "browserslist": "^4.16.6",
+ "browserslist": "^4.14.5",
"semver": "^6.3.0"
}
},
@@ -133,6 +209,14 @@
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.14.2",
"@babel/types": "^7.14.2"
+ },
+ "dependencies": {
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "dev": true
+ }
}
},
"@babel/helper-optimise-call-expression": {
@@ -145,15 +229,15 @@
}
},
"@babel/helper-replace-supers": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz",
- "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz",
+ "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==",
"dev": true,
"requires": {
"@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
"@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.4"
+ "@babel/types": "^7.14.2"
}
},
"@babel/helper-simple-access": {
@@ -261,9 +345,9 @@
}
},
"@babel/parser": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz",
- "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz",
+ "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==",
"dev": true
},
"@babel/template": {
@@ -275,6 +359,84 @@
"@babel/code-frame": "^7.12.13",
"@babel/parser": "^7.12.13",
"@babel/types": "^7.12.13"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+ "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.0",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
"@babel/traverse": {
@@ -293,22 +455,121 @@
"globals": "^11.1.0"
},
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+ "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.0",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
}
}
},
"@babel/types": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz",
- "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz",
+ "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.14.0",
"to-fast-properties": "^2.0.0"
+ },
+ "dependencies": {
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "dev": true
+ }
+ }
+ },
+ "@cspotcode/source-map-consumer": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
+ "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
+ "dev": true
+ },
+ "@cspotcode/source-map-support": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz",
+ "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==",
+ "dev": true,
+ "requires": {
+ "@cspotcode/source-map-consumer": "0.8.0"
}
},
"@firebase/api-documenter": {
@@ -325,21 +586,87 @@
"js-yaml": "4.0.0",
"resolve": "~1.17.0",
"tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "@microsoft/tsdoc": {
+ "version": "0.12.24",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.24.tgz",
+ "integrity": "sha512-Mfmij13RUTmHEMi9vRUhMXD7rnGR2VvxeNYtaGtaJ4redwwjT4UXYJ+nzmVJF7hhd4pn/Fx5sncDKxMVFJSWPg==",
+ "dev": true
+ },
+ "@rushstack/node-core-library": {
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.36.0.tgz",
+ "integrity": "sha512-bID2vzXpg8zweXdXgQkKToEdZwVrVCN9vE9viTRk58gqzYaTlz4fMId6V3ZfpXN6H0d319uGi2KDlm+lUEeqCg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.17.13",
+ "colors": "~1.2.1",
+ "fs-extra": "~7.0.1",
+ "import-lazy": "~4.0.0",
+ "jju": "~1.4.0",
+ "resolve": "~1.17.0",
+ "semver": "~7.3.0",
+ "timsort": "~0.3.0",
+ "z-schema": "~3.18.3"
+ }
+ },
+ "@rushstack/ts-command-line": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.7.8.tgz",
+ "integrity": "sha512-8ghIWhkph7NnLCMDJtthpsb7TMOsVGXVDvmxjE/CeklTqjbbUFBjGXizJfpbEkRQTELuZQ2+vGn7sGwIWKN2uA==",
+ "dev": true,
+ "requires": {
+ "@types/argparse": "1.0.38",
+ "argparse": "~1.0.9",
+ "colors": "~1.2.1",
+ "string-argv": "~0.3.1"
+ }
+ },
+ "@types/node": {
+ "version": "10.17.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz",
+ "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+ "dev": true
+ }
}
},
"@firebase/app": {
- "version": "0.6.22",
- "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.22.tgz",
- "integrity": "sha512-9E0KP7Z+LpBOx/oQauLYvf3XleYpbfoi058wStADUtP+eOX5GIImAFNDTOO4ZNuJfLgyrHpKi7Cct6mDdxrz+g==",
+ "version": "0.6.26",
+ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.26.tgz",
+ "integrity": "sha512-y4tpb+uiYLQC5+/AHBtIGZMaTjJ2BHQEsXmPqxyhfVFDzWMcXFsc//RVxA/0OejajhJR6GeqDcIS3m47mUD+Aw==",
"dev": true,
"requires": {
"@firebase/app-types": "0.6.2",
- "@firebase/component": "0.5.0",
+ "@firebase/component": "0.5.2",
"@firebase/logger": "0.2.6",
"@firebase/util": "1.1.0",
"dom-storage": "2.1.0",
"tslib": "^2.1.0",
"xmlhttprequest": "1.8.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+ "dev": true
+ }
}
},
"@firebase/app-types": {
@@ -348,9 +675,9 @@
"integrity": "sha512-2VXvq/K+n8XMdM4L2xy5bYp2ZXMawJXluUIDzUBvMthVR+lhxK4pfFiqr1mmDbv9ydXvEAuFsD+6DpcZuJcSSw=="
},
"@firebase/auth": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.16.6.tgz",
- "integrity": "sha512-1Lj3AY40Z2weCK6FuJqUEkeVJpRaaCo1LT6P5s3VIR99PDYLHeMm2m02rBaskE7ralJA975Vkv7sHrpykRfDrA==",
+ "version": "0.16.5",
+ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.16.5.tgz",
+ "integrity": "sha512-Cgs/TlVot2QkbJyEphvKmu+2qxYlNN+Q2+29aqZwryrnn1eLwlC7nT89K6O91/744HJRtiThm02bMj2Wh61E3Q==",
"dev": true,
"requires": {
"@firebase/auth-types": "0.10.3"
@@ -368,26 +695,51 @@
"dev": true
},
"@firebase/component": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.0.tgz",
- "integrity": "sha512-v18csWtXb0ri+3m7wuGLY/UDgcb89vuMlZGQ//+7jEPLIQeLbylvZhol1uzW9WzoOpxMxOS2W5qyVGX36wZvEA==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.2.tgz",
+ "integrity": "sha512-QT+o6VaBCz/k8wmC/DErU9dQK2QeIoHtkBkryZVTSRkrvulglEWNIpbPp86UbuqZZd1wwzoh6m7BL6JbdEp9SQ==",
+ "dev": true,
"requires": {
"@firebase/util": "1.1.0",
"tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+ "dev": true
+ }
}
},
"@firebase/database": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.10.2.tgz",
- "integrity": "sha512-jMGtl5eBES9k0rOIZd6/EAuVB6m3LzRei1lvEiqWWBje2Xoz//7sjZcxOYtAKCCLldEI1EUrzW8Tv5yEAoPPpg==",
+ "version": "0.10.7",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.10.7.tgz",
+ "integrity": "sha512-7BFj8LFhGL+TmLiPOffOVfkrO2wm44mGcT0jqrkTkt1KydapmjABFJBRvONvlLij5LoWrJK1cSuE8wYDQrDq2Q==",
"requires": {
"@firebase/auth-interop-types": "0.1.6",
- "@firebase/component": "0.5.0",
+ "@firebase/component": "0.5.4",
"@firebase/database-types": "0.7.2",
"@firebase/logger": "0.2.6",
"@firebase/util": "1.1.0",
"faye-websocket": "0.11.3",
"tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "@firebase/component": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.4.tgz",
+ "integrity": "sha512-KoLDPTsvxWr6FT9kn/snffJItaWXZLHLJlZVKiiw+flKE6MVA8Eec+ctvM2zcsMZzC2Z47gFnVqywfBlOevmpQ==",
+ "requires": {
+ "@firebase/util": "1.1.0",
+ "tslib": "^2.1.0"
+ }
+ },
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ }
}
},
"@firebase/database-types": {
@@ -409,6 +761,13 @@
"integrity": "sha512-lfuSASuPKNdfebuFR8rjFamMQUPH9iiZHcKS755Rkm/5gRT0qC7BMhCh3ZkHf7NVbplzIc/GhmX2jM+igDRCag==",
"requires": {
"tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ }
}
},
"@google-cloud/common": {
@@ -429,14 +788,14 @@
}
},
"@google-cloud/firestore": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.12.2.tgz",
- "integrity": "sha512-5rurTAJXQ0SANEf8K9eA2JAB5zAh+pu4tGRnkZx5gBWQLZXdBFdtepS+irvKuSXw1KbeAQOuRANSc/nguys6SQ==",
+ "version": "4.13.1",
+ "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.13.1.tgz",
+ "integrity": "sha512-LtxboFZQ3MGwy1do8a0ykMJocM+TFgOpZoAihMwW498UDd641DJgJu0Kw0CD0bPpEaYUfhbeAUBq2ZO63DOz7g==",
"optional": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"functional-red-black-tree": "^1.0.1",
- "google-gax": "^2.12.0",
+ "google-gax": "^2.17.0",
"protobufjs": "^6.8.6"
}
},
@@ -492,18 +851,18 @@
}
},
"@grpc/grpc-js": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.2.tgz",
- "integrity": "sha512-UXepkOKCATJrhHGsxt+CGfpZy9zUn1q9mop5kfcXq1fBkTePxVNPOdnISlCbJFlCtld+pSLGyZCzr9/zVprFKA==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.4.tgz",
+ "integrity": "sha512-AxtZcm0mArQhY9z8T3TynCYVEaSKxNCa9mVhVwBCUnsuUEe8Zn94bPYYKVQSLt+hJJ1y0ukr3mUvtWfcATL/IQ==",
"optional": true,
"requires": {
"@types/node": ">=12.12.47"
}
},
"@grpc/proto-loader": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.2.tgz",
- "integrity": "sha512-q2Qle60Ht2OQBCp9S5hv1JbI4uBBq6/mqSevFNK3ZEgRDBCAkWqZPUhD/K9gXOHrHKluliHiVq2L9sw1mVyAIg==",
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.4.tgz",
+ "integrity": "sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ==",
"optional": true,
"requires": {
"@types/long": "^4.0.1",
@@ -513,6 +872,48 @@
"yargs": "^16.1.1"
},
"dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "optional": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "optional": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "optional": true
+ },
"yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -569,33 +970,6 @@
"esprima": "^4.0.0"
}
},
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -633,6 +1007,15 @@
"tar": "^6.1.0"
},
"dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -641,39 +1024,39 @@
"requires": {
"lru-cache": "^6.0.0"
}
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
"@microsoft/api-extractor": {
- "version": "7.15.2",
- "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.15.2.tgz",
- "integrity": "sha512-/Y/n+QOc1vM6Vg3OAUByT/wXdZciE7jV3ay33+vxl3aKva5cNsuOauL14T7XQWUiLko3ilPwrcnFcEjzXpLsuA==",
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.18.4.tgz",
+ "integrity": "sha512-Wx45VuIAu09Pk9Qwzt0I57OX31BaWO2r6+mfSXqYFsJjYTqwUkdFh92G1GKYgvuR9oF/ai7w10wrFpx5WZYbGg==",
"dev": true,
"requires": {
- "@microsoft/api-extractor-model": "7.13.2",
+ "@microsoft/api-extractor-model": "7.13.4",
"@microsoft/tsdoc": "0.13.2",
"@microsoft/tsdoc-config": "~0.15.2",
- "@rushstack/node-core-library": "3.38.0",
- "@rushstack/rig-package": "0.2.12",
- "@rushstack/ts-command-line": "4.7.10",
+ "@rushstack/node-core-library": "3.39.1",
+ "@rushstack/rig-package": "0.2.13",
+ "@rushstack/ts-command-line": "4.8.1",
"colors": "~1.2.1",
"lodash": "~4.17.15",
"resolve": "~1.17.0",
"semver": "~7.3.0",
"source-map": "~0.6.1",
- "typescript": "~4.2.4"
+ "typescript": "~4.3.5"
},
"dependencies": {
- "@microsoft/tsdoc": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz",
- "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==",
- "dev": true
- },
"@rushstack/node-core-library": {
- "version": "3.38.0",
- "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.38.0.tgz",
- "integrity": "sha512-cmvl0yQx8sSmbuXwiRYJi8TO+jpTtrLJQ8UmFHhKvgPVJAW8cV8dnpD1Xx/BvTGrJZ2XtRAIkAhBS9okBnap4w==",
+ "version": "3.39.1",
+ "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.39.1.tgz",
+ "integrity": "sha512-HHgMEHZTXQ3NjpQzWd5+fSt2Eod9yFwj6qBPbaeaNtDNkOL8wbLoxVimQNtcH0Qhn4wxF5u2NTDNFsxf2yd1jw==",
"dev": true,
"requires": {
"@types/node": "10.17.13",
@@ -687,24 +1070,21 @@
"z-schema": "~3.18.3"
}
},
- "@rushstack/ts-command-line": {
- "version": "4.7.10",
- "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.7.10.tgz",
- "integrity": "sha512-8t042g8eerypNOEcdpxwRA3uCmz0duMo21rG4Z2mdz7JxJeylDmzjlU3wDdef2t3P1Z61JCdZB6fbm1Mh0zi7w==",
- "dev": true,
- "requires": {
- "@types/argparse": "1.0.38",
- "argparse": "~1.0.9",
- "colors": "~1.2.1",
- "string-argv": "~0.3.1"
- }
- },
"@types/node": {
"version": "10.17.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz",
"integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -715,68 +1095,34 @@
}
},
"typescript": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
- "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==",
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
+ "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
},
"@microsoft/api-extractor-model": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.13.2.tgz",
- "integrity": "sha512-gA9Q8q5TPM2YYk7rLinAv9KqcodrmRC13BVmNzLswjtFxpz13lRh0BmrqD01/sddGpGMIuWFYlfUM4VSWxnggA==",
+ "version": "7.13.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.13.4.tgz",
+ "integrity": "sha512-NYaR3hJinh089/Gkee8fvmEFf9zKkoUvNxgkqUlKBCDXH2+Ou4tNDuL8G6zjhKBPicHkp2VcL8l7q9H6txUkjQ==",
"dev": true,
"requires": {
"@microsoft/tsdoc": "0.13.2",
"@microsoft/tsdoc-config": "~0.15.2",
- "@rushstack/node-core-library": "3.38.0"
- },
- "dependencies": {
- "@microsoft/tsdoc": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz",
- "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==",
- "dev": true
- },
- "@rushstack/node-core-library": {
- "version": "3.38.0",
- "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.38.0.tgz",
- "integrity": "sha512-cmvl0yQx8sSmbuXwiRYJi8TO+jpTtrLJQ8UmFHhKvgPVJAW8cV8dnpD1Xx/BvTGrJZ2XtRAIkAhBS9okBnap4w==",
- "dev": true,
- "requires": {
- "@types/node": "10.17.13",
- "colors": "~1.2.1",
- "fs-extra": "~7.0.1",
- "import-lazy": "~4.0.0",
- "jju": "~1.4.0",
- "resolve": "~1.17.0",
- "semver": "~7.3.0",
- "timsort": "~0.3.0",
- "z-schema": "~3.18.3"
- }
- },
- "@types/node": {
- "version": "10.17.13",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz",
- "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==",
- "dev": true
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
+ "@rushstack/node-core-library": "3.39.1"
}
},
"@microsoft/tsdoc": {
- "version": "0.12.24",
- "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.24.tgz",
- "integrity": "sha512-Mfmij13RUTmHEMi9vRUhMXD7rnGR2VvxeNYtaGtaJ4redwwjT4UXYJ+nzmVJF7hhd4pn/Fx5sncDKxMVFJSWPg==",
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz",
+ "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==",
"dev": true
},
"@microsoft/tsdoc-config": {
@@ -791,11 +1137,17 @@
"resolve": "~1.19.0"
},
"dependencies": {
- "@microsoft/tsdoc": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz",
- "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==",
- "dev": true
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
},
"resolve": {
"version": "1.19.0",
@@ -809,6 +1161,32 @@
}
}
},
+ "@nodelib/fs.scandir": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.4",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.4",
+ "fastq": "^1.6.0"
+ }
+ },
"@panva/asn1.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz",
@@ -879,9 +1257,9 @@
"optional": true
},
"@rushstack/node-core-library": {
- "version": "3.36.0",
- "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.36.0.tgz",
- "integrity": "sha512-bID2vzXpg8zweXdXgQkKToEdZwVrVCN9vE9viTRk58gqzYaTlz4fMId6V3ZfpXN6H0d319uGi2KDlm+lUEeqCg==",
+ "version": "3.39.1",
+ "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.39.1.tgz",
+ "integrity": "sha512-HHgMEHZTXQ3NjpQzWd5+fSt2Eod9yFwj6qBPbaeaNtDNkOL8wbLoxVimQNtcH0Qhn4wxF5u2NTDNFsxf2yd1jw==",
"dev": true,
"requires": {
"@types/node": "10.17.13",
@@ -901,6 +1279,15 @@
"integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -909,13 +1296,19 @@
"requires": {
"lru-cache": "^6.0.0"
}
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
"@rushstack/rig-package": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.2.12.tgz",
- "integrity": "sha512-nbePcvF8hQwv0ql9aeQxcaMPK/h1OLAC00W7fWCRWIvD2MchZOE8jumIIr66HGrfG2X1sw++m/ZYI4D+BM5ovQ==",
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.2.13.tgz",
+ "integrity": "sha512-qQMAFKvfb2ooaWU9DrGIK9d8QfyHy/HiuITJbWenlKgzcDXQvQgEduk57YF4Y7LLasDJ5ZzLaaXwlfX8qCRe5Q==",
"dev": true,
"requires": {
"resolve": "~1.17.0",
@@ -923,9 +1316,9 @@
}
},
"@rushstack/ts-command-line": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.7.8.tgz",
- "integrity": "sha512-8ghIWhkph7NnLCMDJtthpsb7TMOsVGXVDvmxjE/CeklTqjbbUFBjGXizJfpbEkRQTELuZQ2+vGn7sGwIWKN2uA==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.8.1.tgz",
+ "integrity": "sha512-rmxvYdCNRbyRs+DYAPye3g6lkCkWHleqO40K8UPvUAzFqEuj6+YCVssBiOmrUDCoM5gaegSNT0wFDYhz24DWtw==",
"dev": true,
"requires": {
"@types/argparse": "1.0.38",
@@ -975,6 +1368,30 @@
"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
"optional": true
},
+ "@tsconfig/node10": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
+ "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
+ "dev": true
+ },
+ "@tsconfig/node12": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
+ "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
+ "dev": true
+ },
+ "@tsconfig/node14": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
+ "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
+ "dev": true
+ },
+ "@tsconfig/node16": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
+ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
+ "dev": true
+ },
"@types/argparse": {
"version": "1.0.38",
"resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz",
@@ -982,10 +1399,13 @@
"dev": true
},
"@types/bcrypt": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-2.0.0.tgz",
- "integrity": "sha512-/r/ihQBlYMUYHqcFXix76I3OLYTaUcU8xV2agtB2hCds2rfJI56UyKu0e2LkAW2/4HHmQKmQRFXqM8D6y3Tc5g==",
- "dev": true
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz",
+ "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
},
"@types/bluebird": {
"version": "3.5.35",
@@ -994,9 +1414,9 @@
"dev": true
},
"@types/body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
+ "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==",
"requires": {
"@types/connect": "*",
"@types/node": "*"
@@ -1009,9 +1429,9 @@
"dev": true
},
"@types/chai": {
- "version": "4.2.18",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.18.tgz",
- "integrity": "sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ==",
+ "version": "4.2.21",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.21.tgz",
+ "integrity": "sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg==",
"dev": true
},
"@types/chai-as-promised": {
@@ -1024,9 +1444,9 @@
}
},
"@types/connect": {
- "version": "3.4.34",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz",
- "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==",
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
"requires": {
"@types/node": "*"
}
@@ -1038,9 +1458,9 @@
"dev": true
},
"@types/express": {
- "version": "4.17.12",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz",
- "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==",
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
+ "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
"requires": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.18",
@@ -1058,9 +1478,9 @@
}
},
"@types/express-serve-static-core": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz",
- "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==",
+ "version": "4.17.24",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz",
+ "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==",
"requires": {
"@types/node": "*",
"@types/qs": "*",
@@ -1068,16 +1488,16 @@
}
},
"@types/express-unless": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz",
- "integrity": "sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz",
+ "integrity": "sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ==",
"requires": {
"@types/express": "*"
}
},
"@types/firebase-token-generator": {
"version": "2.0.28",
- "resolved": "https://registry.npmjs.org/@types/firebase-token-generator/-/firebase-token-generator-2.0.28.tgz",
+ "resolved": "http://registry.npmjs.org/@types/firebase-token-generator/-/firebase-token-generator-2.0.28.tgz",
"integrity": "sha1-Z1VIHZMk4mt6XItFXWgUg3aCw5Y=",
"dev": true
},
@@ -1097,9 +1517,9 @@
}
},
"@types/lodash": {
- "version": "4.14.170",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz",
- "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==",
+ "version": "4.14.171",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz",
+ "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==",
"dev": true
},
"@types/long": {
@@ -1120,45 +1540,45 @@
"dev": true
},
"@types/minimist": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
- "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
+ "version": "1.2.2",
+ "resolved": "http://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
"dev": true
},
"@types/mocha": {
- "version": "2.2.48",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
- "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz",
+ "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==",
"dev": true
},
"@types/nock": {
- "version": "9.3.1",
- "resolved": "https://registry.npmjs.org/@types/nock/-/nock-9.3.1.tgz",
- "integrity": "sha512-eOVHXS5RnWOjTVhu3deCM/ruy9E6JCgeix2g7wpFiekQh3AaEAK1cz43tZDukKmtSmQnwvSySq7ubijCA32I7Q==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/@types/nock/-/nock-11.1.0.tgz",
+ "integrity": "sha512-jI/ewavBQ7X5178262JQR0ewicPAcJhXS/iFaNJl0VHLfyosZ/kwSrsa6VNQNSO8i9d8SqdRgOtZSOKJ/+iNMw==",
"dev": true,
"requires": {
- "@types/node": "*"
+ "nock": "*"
}
},
"@types/node": {
- "version": "15.12.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.0.tgz",
- "integrity": "sha512-+aHJvoCsVhO2ZCuT4o5JtcPrCPyDE3+1nvbDprYes+pPkEsbjH7AGUCNtjMOXS0fqH14t+B7yLzaqSz92FPWyw=="
+ "version": "15.0.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz",
+ "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA=="
},
"@types/qs": {
- "version": "6.9.6",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz",
- "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA=="
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
},
"@types/range-parser": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
- "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
},
"@types/request": {
- "version": "2.48.5",
- "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz",
- "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==",
+ "version": "2.48.6",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.6.tgz",
+ "integrity": "sha512-vrZaV3Ij7j/l/3hz6OttZFtpRCu7zlq7XgkYHJP6FwVEAZkGQ095WqyJV08/GlW9eyXKVcp/xmtruHm8eHpw1g==",
"dev": true,
"requires": {
"@types/caseless": "*",
@@ -1178,21 +1598,32 @@
}
},
"@types/serve-static": {
- "version": "1.13.9",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz",
- "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==",
+ "version": "1.13.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
+ "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
"requires": {
"@types/mime": "^1",
"@types/node": "*"
}
},
"@types/sinon": {
- "version": "9.0.11",
- "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz",
- "integrity": "sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==",
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz",
+ "integrity": "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==",
"dev": true,
"requires": {
- "@types/sinonjs__fake-timers": "*"
+ "@sinonjs/fake-timers": "^7.1.0"
+ },
+ "dependencies": {
+ "@sinonjs/fake-timers": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz",
+ "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ }
}
},
"@types/sinon-chai": {
@@ -1205,16 +1636,10 @@
"@types/sinon": "*"
}
},
- "@types/sinonjs__fake-timers": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz",
- "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==",
- "dev": true
- },
"@types/tough-cookie": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz",
- "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz",
+ "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==",
"dev": true
},
"@typescript-eslint/eslint-plugin": {
@@ -1406,6 +1831,21 @@
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"color-convert": "^2.0.1"
+ },
+ "dependencies": {
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ }
}
},
"ansi-wrap": {
@@ -1449,6 +1889,46 @@
"requires": {
"@microsoft/tsdoc": "0.12.24",
"@rushstack/node-core-library": "3.36.0"
+ },
+ "dependencies": {
+ "@microsoft/tsdoc": {
+ "version": "0.12.24",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.24.tgz",
+ "integrity": "sha512-Mfmij13RUTmHEMi9vRUhMXD7rnGR2VvxeNYtaGtaJ4redwwjT4UXYJ+nzmVJF7hhd4pn/Fx5sncDKxMVFJSWPg==",
+ "dev": true
+ },
+ "@rushstack/node-core-library": {
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.36.0.tgz",
+ "integrity": "sha512-bID2vzXpg8zweXdXgQkKToEdZwVrVCN9vE9viTRk58gqzYaTlz4fMId6V3ZfpXN6H0d319uGi2KDlm+lUEeqCg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.17.13",
+ "colors": "~1.2.1",
+ "fs-extra": "~7.0.1",
+ "import-lazy": "~4.0.0",
+ "jju": "~1.4.0",
+ "resolve": "~1.17.0",
+ "semver": "~7.3.0",
+ "timsort": "~0.3.0",
+ "z-schema": "~3.18.3"
+ }
+ },
+ "@types/node": {
+ "version": "10.17.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz",
+ "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
}
},
"append-buffer": {
@@ -1533,7 +2013,6 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
@@ -1647,18 +2126,9 @@
}
},
"array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "dev": true,
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true
},
"array-unique": {
@@ -2033,9 +2503,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001233",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001233.tgz",
- "integrity": "sha512-BmkbxLfStqiPA7IEzQpIk0UFZFf3A4E6fzjPJ6OR+bFC2L8ES9J8zGA/asoi47p8XDVkev+WJo2I2Nc8c/34Yg==",
+ "version": "1.0.30001228",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz",
+ "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==",
"dev": true
},
"caseless": {
@@ -2197,6 +2667,7 @@
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
@@ -2291,19 +2762,6 @@
"object-visit": "^1.0.0"
}
},
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
"color-support": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
@@ -2676,24 +3134,34 @@
}
},
"del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
+ "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
"dev": true,
- "requires": {
- "globby": "^5.0.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "rimraf": "^2.2.8"
+ "requires": {
+ "globby": "^11.0.1",
+ "graceful-fs": "^4.2.4",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.2",
+ "p-map": "^4.0.0",
+ "rimraf": "^3.0.2",
+ "slash": "^3.0.0"
},
"dependencies": {
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
"rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
@@ -2739,6 +3207,23 @@
"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
"dev": true
},
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ }
+ }
+ },
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -2804,9 +3289,9 @@
}
},
"electron-to-chromium": {
- "version": "1.3.746",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.746.tgz",
- "integrity": "sha512-3ffyGODL38apwSsIgXaWnAKNXChsjXhAmBTjbqCbrv1fBbVltuNLWh0zdrQbwK/oxPQ/Gss/kYfFAPPGu9mszQ==",
+ "version": "1.3.736",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz",
+ "integrity": "sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig==",
"dev": true
},
"emoji-regex": {
@@ -3139,8 +3624,7 @@
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
"esquery": {
"version": "1.4.0",
@@ -3395,6 +3879,73 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
+ "fast-glob": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
+ "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ },
+ "dependencies": {
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -3413,6 +3964,15 @@
"integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==",
"optional": true
},
+ "fastq": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
+ "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
"faye-websocket": {
"version": "0.11.3",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
@@ -3517,7 +4077,7 @@
},
"firebase-token-generator": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/firebase-token-generator/-/firebase-token-generator-2.0.0.tgz",
+ "resolved": "http://registry.npmjs.org/firebase-token-generator/-/firebase-token-generator-2.0.0.tgz",
"integrity": "sha1-l2fXWewTq9yZuhFf1eqZ2Lk9EgY=",
"dev": true
},
@@ -4087,23 +4647,23 @@
}
},
"globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "version": "11.0.3",
+ "resolved": "http://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
+ "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
"dev": true,
"requires": {
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
},
"dependencies": {
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
}
}
@@ -4135,9 +4695,9 @@
}
},
"google-gax": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.14.1.tgz",
- "integrity": "sha512-I5RDEN7MEptrCxeHX3ht7nKFGfyjgYX4hQKI9eVMBohMzVbFSwWUndo0CcKXu8es7NhB4gt2XYLm1AHkXhtHpA==",
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.17.1.tgz",
+ "integrity": "sha512-CoR7OYuEzIDt3mp7cLYL+oGPmYdImS1WEwIvjF0zk0LhEBBmvRjWHTpBwazLGsT8hz+6zPh/4fjIjNaUxzIvzg==",
"optional": true,
"requires": {
"@grpc/grpc-js": "~1.3.0",
@@ -4146,12 +4706,121 @@
"abort-controller": "^3.0.0",
"duplexify": "^4.0.0",
"fast-text-encoding": "^1.0.3",
- "google-auth-library": "^7.0.2",
+ "google-auth-library": "^7.3.0",
"is-stream-ended": "^0.1.4",
"node-fetch": "^2.6.1",
"object-hash": "^2.1.1",
"protobufjs": "^6.10.2",
"retry-request": "^4.0.0"
+ },
+ "dependencies": {
+ "duplexify": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz",
+ "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==",
+ "optional": true,
+ "requires": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "gaxios": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.0.tgz",
+ "integrity": "sha512-pHplNbslpwCLMyII/lHPWFQbJWOX0B3R1hwBEOvzYi1GmdKZruuEHK4N9V6f7tf1EaPYyF80mui1+344p6SmLg==",
+ "optional": true,
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.3.0"
+ }
+ },
+ "gcp-metadata": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.0.tgz",
+ "integrity": "sha512-L9XQUpvKJCM76YRSmcxrR4mFPzPGsgZUH+GgHMxAET8qc6+BhRJq63RLhWakgEO2KKVgeSDVfyiNjkGSADwNTA==",
+ "optional": true,
+ "requires": {
+ "gaxios": "^4.0.0",
+ "json-bigint": "^1.0.0"
+ }
+ },
+ "google-auth-library": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.3.0.tgz",
+ "integrity": "sha512-MPeeMlnsYnoiiVFMwX3hgaS684aiXrSqKoDP+xL4Ejg4Z0qLvIeg4XsaChemyFI8ZUO7ApwDAzNtgmhWSDNh5w==",
+ "optional": true,
+ "requires": {
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^4.0.0",
+ "gcp-metadata": "^4.2.0",
+ "gtoken": "^5.0.4",
+ "jws": "^4.0.0",
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "google-p12-pem": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.0.tgz",
+ "integrity": "sha512-JUtEHXL4DY/N+xhlm7TC3qL797RPAtk0ZGXNs3/gWyiDHYoA/8Rjes0pztkda+sZv4ej1EoO2KhWgW5V9KTrSQ==",
+ "optional": true,
+ "requires": {
+ "node-forge": "^0.10.0"
+ }
+ },
+ "gtoken": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.0.tgz",
+ "integrity": "sha512-mCcISYiaRZrJpfqOs0QWa6lfEM/C1V9ASkzFmuz43XBb5s1Vynh+CZy1ECeeJXVGx2PRByjYzb4Y4/zr1byr0w==",
+ "optional": true,
+ "requires": {
+ "gaxios": "^4.0.0",
+ "google-p12-pem": "^3.0.3",
+ "jws": "^4.0.0"
+ }
+ },
+ "json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "optional": true,
+ "requires": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "optional": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "optional": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "optional": true
+ }
}
},
"google-p12-pem": {
@@ -4325,14 +4994,15 @@
}
},
"gulp-filter": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-6.0.0.tgz",
- "integrity": "sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-7.0.0.tgz",
+ "integrity": "sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==",
"dev": true,
"requires": {
- "multimatch": "^4.0.0",
+ "multimatch": "^5.0.0",
"plugin-error": "^1.0.1",
- "streamfilter": "^3.0.0"
+ "streamfilter": "^3.0.0",
+ "to-absolute-glob": "^2.0.2"
}
},
"gulp-header": {
@@ -4345,6 +5015,48 @@
"lodash.template": "^4.5.0",
"map-stream": "0.0.7",
"through2": "^2.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ }
}
},
"gulp-typescript": {
@@ -4759,9 +5471,9 @@
"dev": true
},
"is-core-module": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
- "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz",
+ "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==",
"dev": true,
"requires": {
"has": "^1.0.3"
@@ -4883,28 +5595,16 @@
"optional": true
},
"is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
"dev": true
},
- "is-path-in-cwd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
- "dev": true,
- "requires": {
- "is-path-inside": "^1.0.0"
- }
- },
"is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "dev": true,
- "requires": {
- "path-is-inside": "^1.0.1"
- }
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
},
"is-plain-obj": {
"version": "2.1.0",
@@ -5081,6 +5781,15 @@
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -5122,6 +5831,23 @@
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^3.0.0",
"supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"istanbul-lib-source-maps": {
@@ -5133,6 +5859,14 @@
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
"source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
"istanbul-reports": {
@@ -5330,15 +6064,25 @@
}
},
"jwks-rsa": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.3.tgz",
- "integrity": "sha512-/rkjXRWAp0cS00tunsHResw68P5iTQru8+jHufLNv3JHc4nObFEndfEUSuPugh09N+V9XYxKUqi7QrkmCHSSSg==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.4.tgz",
+ "integrity": "sha512-iJqVCECYZZ+3oPmY1qXv3Fq+3ywDtuNEVBvG41pPlaR0zyGxa12nC0beAOBBUhETJmc05puS50mRQN4NkCGhmg==",
"requires": {
"@types/express-jwt": "0.0.42",
- "debug": "^4.1.0",
+ "debug": "^4.3.2",
"jose": "^2.0.5",
"limiter": "^1.1.5",
- "lru-memoizer": "^2.1.2"
+ "lru-memoizer": "^2.1.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ }
}
},
"jws": {
@@ -5471,12 +6215,12 @@
}
},
"locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^5.0.0"
+ "p-locate": "^4.1.0"
}
},
"lodash": {
@@ -5601,6 +6345,13 @@
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"requires": {
"yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
}
},
"lru-memoizer": {
@@ -5713,6 +6464,12 @@
"integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
"dev": true
},
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
"micromatch": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -5780,6 +6537,14 @@
"dev": true,
"requires": {
"yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
}
},
"minizlib": {
@@ -5790,6 +6555,14 @@
"requires": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
}
},
"mixin-deep": {
@@ -5813,12 +6586,6 @@
}
}
},
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
"mocha": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz",
@@ -5960,12 +6727,30 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -6008,6 +6793,22 @@
"isexe": "^2.0.0"
}
},
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q=="
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
"yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -6037,9 +6838,9 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"multimatch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz",
- "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
"dev": true,
"requires": {
"@types/minimatch": "^3.0.3",
@@ -6047,14 +6848,6 @@
"array-union": "^2.1.0",
"arrify": "^2.0.1",
"minimatch": "^3.0.4"
- },
- "dependencies": {
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- }
}
},
"mute-stdout": {
@@ -6144,9 +6937,9 @@
}
},
"nock": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.1.0.tgz",
- "integrity": "sha512-3N3DUY8XYrxxzWazQ+nSBpiaJ3q6gcpNh4gXovC/QBxrsvNp4tq+wsLHF6mJ3nrn3lPLn7KCJqKxy/9aD+0fdw==",
+ "version": "13.1.1",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-13.1.1.tgz",
+ "integrity": "sha512-YKTR9MjfK3kS9/l4nuTxyYm30cgOExRHzkLNhL8nhEUyU4f8Za/dRxOqjhVT1vGs0svWo3dDnJTUX1qxYeWy5w==",
"dev": true,
"requires": {
"debug": "^4.1.0",
@@ -6431,6 +7224,21 @@
"yargs": "^15.0.2"
},
"dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -6448,6 +7256,21 @@
"wrap-ansi": "^6.2.0"
}
},
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -6458,32 +7281,17 @@
"path-exists": "^4.0.0"
}
},
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
},
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
},
"path-exists": {
"version": "4.0.0",
@@ -6503,6 +7311,35 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
@@ -6520,12 +7357,6 @@
"strip-ansi": "^6.0.0"
}
},
- "y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
- },
"yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
@@ -6767,20 +7598,31 @@
"dev": true
},
"p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+ "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
"requires": {
- "yocto-queue": "^0.1.0"
+ "p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^3.0.2"
+ "p-limit": "^2.2.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ }
}
},
"p-map": {
@@ -6795,8 +7637,7 @@
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"package-hash": {
"version": "4.0.0",
@@ -6874,16 +7715,10 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
- "dev": true
- },
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
@@ -7003,33 +7838,6 @@
"path-exists": "^4.0.0"
}
},
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -7064,7 +7872,7 @@
},
"pretty-hrtime": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
"integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
"dev": true
},
@@ -7166,6 +7974,12 @@
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
},
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -7396,15 +8210,27 @@
"request-promise-core": "1.1.4",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
- }
- },
- "request-promise-core": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
- "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.19"
+ },
+ "dependencies": {
+ "request-promise-core": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+ "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ }
}
},
"require-directory": {
@@ -7489,6 +8315,12 @@
"debug": "^4.1.1"
}
},
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -7504,6 +8336,15 @@
"integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
"dev": true
},
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"run-sequence": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
@@ -7631,7 +8472,7 @@
},
"safe-regex": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"dev": true,
"requires": {
@@ -7741,6 +8582,21 @@
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
}
}
},
@@ -7750,6 +8606,12 @@
"integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==",
"dev": true
},
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
"slice-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -7946,16 +8808,6 @@
"urix": "^0.1.0"
}
},
- "source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
"source-map-url": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
@@ -7982,6 +8834,15 @@
"which": "^2.0.1"
},
"dependencies": {
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -8037,8 +8898,7 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"sshpk": {
"version": "1.16.1",
@@ -8221,6 +9081,14 @@
"dev": true,
"requires": {
"has-flag": "^4.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ }
}
},
"sver-compat": {
@@ -8286,9 +9154,9 @@
}
},
"tar": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
- "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.3.tgz",
+ "integrity": "sha512-3rUqwucgVZXTeyJyL2jqtUau8/8r54SioM1xj3AmTX3HnWQdj2AydfJ2qYYayPyIIznSplcvU9mhBb7dR2XF3w==",
"dev": true,
"requires": {
"chownr": "^2.0.0",
@@ -8297,6 +9165,20 @@
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
}
},
"teeny-request": {
@@ -8504,19 +9386,37 @@
}
},
"ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
- "dev": true,
- "requires": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.0.tgz",
+ "integrity": "sha512-FstYHtQz6isj8rBtYMN4bZdnXN1vq4HCbqn9vdNQcInRqtB86PePJQIxE6es0PhxKWhj2PHuwbG40H+bxkZPmg==",
+ "dev": true,
+ "requires": {
+ "@cspotcode/source-map-support": "0.6.1",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
"yn": "3.1.1"
},
"dependencies": {
+ "acorn": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
+ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
+ "dev": true
+ },
+ "acorn-walk": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz",
+ "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==",
+ "dev": true
+ },
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -8525,11 +9425,6 @@
}
}
},
- "tslib": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
- "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="
- },
"tsutils": {
"version": "3.21.0",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
@@ -9114,14 +10009,10 @@
"dev": true
},
"y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
},
"yargs": {
"version": "17.0.1",
@@ -9136,12 +10027,87 @@
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ }
}
},
"yargs-parser": {
"version": "20.2.7",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
- "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw=="
+ "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+ "optional": true
},
"yargs-unparser": {
"version": "2.0.0",
@@ -9175,11 +10141,6 @@
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true
},
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
- },
"z-schema": {
"version": "3.18.4",
"resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz",
diff --git a/package.json b/package.json
index 14f0b0b771..8cbcedeef1 100644
--- a/package.json
+++ b/package.json
@@ -77,6 +77,9 @@
"firestore": [
"lib/firestore"
],
+ "installations": [
+ "lib/installations"
+ ],
"instance-id": [
"lib/instance-id"
],
@@ -122,6 +125,10 @@
"require": "./lib/firestore/index.js",
"import": "./lib/esm/firestore/index.js"
},
+ "./installations": {
+ "require": "./lib/installations/index.js",
+ "import": "./lib/esm/installations/index.js"
+ },
"./instance-id": {
"require": "./lib/instance-id/index.js",
"import": "./lib/esm/instance-id/index.js"
@@ -166,22 +173,22 @@
},
"devDependencies": {
"@firebase/api-documenter": "^0.1.2",
- "@firebase/app": "^0.6.13",
- "@firebase/auth": "^0.16.2",
- "@firebase/auth-types": "^0.10.1",
+ "@firebase/app": "^0.6.21",
+ "@firebase/auth": "^0.16.5",
+ "@firebase/auth-types": "^0.10.3",
"@microsoft/api-extractor": "^7.11.2",
- "@types/bcrypt": "^2.0.0",
+ "@types/bcrypt": "^5.0.0",
"@types/chai": "^4.0.0",
"@types/chai-as-promised": "^7.1.0",
"@types/firebase-token-generator": "^2.0.28",
"@types/jsonwebtoken": "^8.5.0",
"@types/lodash": "^4.14.104",
"@types/minimist": "^1.2.0",
- "@types/mocha": "^2.2.48",
- "@types/nock": "^9.1.0",
+ "@types/mocha": "^8.2.2",
+ "@types/nock": "^11.1.0",
"@types/request": "^2.47.0",
"@types/request-promise": "^4.1.41",
- "@types/sinon": "^9.0.0",
+ "@types/sinon": "^10.0.2",
"@types/sinon-chai": "^3.0.0",
"@typescript-eslint/eslint-plugin": "^2.20.0",
"@typescript-eslint/parser": "^2.20.0",
@@ -190,11 +197,11 @@
"chai-as-promised": "^7.0.0",
"chalk": "^4.1.1",
"child-process-promise": "^2.2.1",
- "del": "^2.2.1",
+ "del": "^6.0.0",
"eslint": "^6.8.0",
"firebase-token-generator": "^2.0.0",
"gulp": "^4.0.2",
- "gulp-filter": "^6.0.0",
+ "gulp-filter": "^7.0.0",
"gulp-header": "^2.0.9",
"gulp-typescript": "^5.0.1",
"http-message-parser": "^0.0.34",
@@ -210,7 +217,7 @@
"run-sequence": "^2.2.1",
"sinon": "^9.0.0",
"sinon-chai": "^3.0.0",
- "ts-node": "^9.0.0",
+ "ts-node": "^10.2.0",
"typescript": "^3.7.3",
"yargs": "^17.0.1"
}
diff --git a/src/app-check/app-check-api-client-internal.ts b/src/app-check/app-check-api-client-internal.ts
index a57fa0a8e4..e7427f838a 100644
--- a/src/app-check/app-check-api-client-internal.ts
+++ b/src/app-check/app-check-api-client-internal.ts
@@ -52,7 +52,7 @@ export class AppCheckApiClient {
/**
* Exchange a signed custom token to App Check token
- *
+ *
* @param customToken The custom token to be exchanged.
* @param appId The mobile App ID.
* @returns A promise that fulfills with a `AppCheckToken`.
@@ -159,9 +159,9 @@ export class AppCheckApiClient {
*
* @param duration The duration as a string with the suffix "s" preceded by the
* number of seconds, with fractional seconds. For example, 3 seconds with 0 nanoseconds
- * is expressed as "3s", while 3 seconds and 1 nanosecond is expressed as "3.000000001s",
+ * is expressed as "3s", while 3 seconds and 1 nanosecond is expressed as "3.000000001s",
* and 3 seconds and 1 microsecond is expressed as "3.000001s".
- *
+ *
* @returns The duration in milliseconds.
*/
private stringToMilliseconds(duration: string): number {
diff --git a/src/app-check/app-check-api.ts b/src/app-check/app-check-api.ts
index 4eeaa1bce5..ab959af04d 100644
--- a/src/app-check/app-check-api.ts
+++ b/src/app-check/app-check-api.ts
@@ -30,6 +30,17 @@ export interface AppCheckToken {
ttlMillis: number;
}
+/**
+ * Interface representing App Check token options.
+ */
+export interface AppCheckTokenOptions {
+ /**
+ * The length of time, in milliseconds, for which the App Check token will
+ * be valid. This value must be between 30 minutes and 7 days, inclusive.
+ */
+ ttlMillis?: number;
+}
+
/**
* Interface representing a decoded Firebase App Check token, returned from the
* {@link AppCheck.verifyToken} method.
diff --git a/src/app-check/app-check-namespace.ts b/src/app-check/app-check-namespace.ts
index 4e5de379b2..128cedd474 100644
--- a/src/app-check/app-check-namespace.ts
+++ b/src/app-check/app-check-namespace.ts
@@ -17,6 +17,7 @@
import { App } from '../app';
import {
AppCheckToken as TAppCheckToken,
+ AppCheckTokenOptions as TAppCheckTokenOptions,
DecodedAppCheckToken as TDecodedAppCheckToken,
VerifyAppCheckTokenResponse as TVerifyAppCheckTokenResponse,
} from './app-check-api';
@@ -71,4 +72,6 @@ export namespace appCheck {
* Type alias to {@link firebase-admin.app-check#VerifyAppCheckTokenResponse}.
*/
export type VerifyAppCheckTokenResponse = TVerifyAppCheckTokenResponse;
+
+ export type AppCheckTokenOptions = TAppCheckTokenOptions;
}
diff --git a/src/app-check/app-check.ts b/src/app-check/app-check.ts
index 815ab7bf8d..97fc24f933 100644
--- a/src/app-check/app-check.ts
+++ b/src/app-check/app-check.ts
@@ -18,13 +18,14 @@
import { App } from '../app';
import { AppCheckApiClient } from './app-check-api-client-internal';
import {
- appCheckErrorFromCryptoSignerError, AppCheckTokenGenerator
+ appCheckErrorFromCryptoSignerError, AppCheckTokenGenerator,
} from './token-generator';
import { AppCheckTokenVerifier } from './token-verifier';
import { cryptoSignerFromApp } from '../utils/crypto-signer';
import {
AppCheckToken,
+ AppCheckTokenOptions,
VerifyAppCheckTokenResponse,
} from './app-check-api';
@@ -57,11 +58,12 @@ export class AppCheck {
* back to a client.
*
* @param appId The app ID to use as the JWT app_id.
+ * @param options Optional options object when creating a new App Check Token.
*
* @returns A promise that fulfills with a `AppCheckToken`.
*/
- public createToken(appId: string): Promise {
- return this.tokenGenerator.createCustomToken(appId)
+ public createToken(appId: string, options?: AppCheckTokenOptions): Promise {
+ return this.tokenGenerator.createCustomToken(appId, options)
.then((customToken) => {
return this.client.exchangeToken(customToken, appId);
});
diff --git a/src/app-check/index.ts b/src/app-check/index.ts
index cf057ad7ab..3ff1ae302d 100644
--- a/src/app-check/index.ts
+++ b/src/app-check/index.ts
@@ -27,6 +27,7 @@ import { AppCheck } from './app-check';
export {
AppCheckToken,
+ AppCheckTokenOptions,
DecodedAppCheckToken,
VerifyAppCheckTokenResponse,
} from './app-check-api';
diff --git a/src/app-check/token-generator.ts b/src/app-check/token-generator.ts
index 0ebe9196eb..97ebb3fb40 100644
--- a/src/app-check/token-generator.ts
+++ b/src/app-check/token-generator.ts
@@ -16,24 +16,26 @@
*/
import * as validator from '../utils/validator';
-import { toWebSafeBase64 } from '../utils';
-
+import { toWebSafeBase64, transformMillisecondsToSecondsString } from '../utils';
import { CryptoSigner, CryptoSignerError, CryptoSignerErrorCode } from '../utils/crypto-signer';
-import {
+import {
FirebaseAppCheckError,
AppCheckErrorCode,
- APP_CHECK_ERROR_CODE_MAPPING,
+ APP_CHECK_ERROR_CODE_MAPPING,
} from './app-check-api-client-internal';
+import { AppCheckTokenOptions } from './app-check-api';
import { HttpError } from '../utils/api-request';
-const ONE_HOUR_IN_SECONDS = 60 * 60;
+const ONE_MINUTE_IN_SECONDS = 60;
+const ONE_MINUTE_IN_MILLIS = ONE_MINUTE_IN_SECONDS * 1000;
+const ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000;
// Audience to use for Firebase App Check Custom tokens
const FIREBASE_APP_CHECK_AUDIENCE = 'https://firebaseappcheck.googleapis.com/google.firebase.appcheck.v1beta.TokenExchangeService';
/**
* Class for generating Firebase App Check tokens.
- *
+ *
* @internal
*/
export class AppCheckTokenGenerator {
@@ -59,16 +61,20 @@ export class AppCheckTokenGenerator {
* Creates a new custom token that can be exchanged to an App Check token.
*
* @param appId The Application ID to use for the generated token.
- *
+ *
* @return A Promise fulfilled with a custom token signed with a service account key
* that can be exchanged to an App Check token.
*/
- public createCustomToken(appId: string): Promise {
+ public createCustomToken(appId: string, options?: AppCheckTokenOptions): Promise {
if (!validator.isNonEmptyString(appId)) {
throw new FirebaseAppCheckError(
'invalid-argument',
'`appId` must be a non-empty string.');
}
+ let customOptions = {};
+ if (typeof options !== 'undefined') {
+ customOptions = this.validateTokenOptions(options);
+ }
return this.signer.getAccountId().then((account) => {
const header = {
alg: this.signer.algorithm,
@@ -81,8 +87,9 @@ export class AppCheckTokenGenerator {
// eslint-disable-next-line @typescript-eslint/camelcase
app_id: appId,
aud: FIREBASE_APP_CHECK_AUDIENCE,
- exp: iat + ONE_HOUR_IN_SECONDS,
+ exp: iat + (ONE_MINUTE_IN_SECONDS * 5),
iat,
+ ...customOptions,
};
const token = `${this.encodeSegment(header)}.${this.encodeSegment(body)}`;
return this.signer.sign(Buffer.from(token))
@@ -98,6 +105,35 @@ export class AppCheckTokenGenerator {
const buffer: Buffer = (segment instanceof Buffer) ? segment : Buffer.from(JSON.stringify(segment));
return toWebSafeBase64(buffer).replace(/=+$/, '');
}
+
+ /**
+ * Checks if a given `AppCheckTokenOptions` object is valid. If successful, returns an object with
+ * custom properties.
+ *
+ * @param options An options object to be validated.
+ * @returns A custom object with ttl converted to protobuf Duration string format.
+ */
+ private validateTokenOptions(options: AppCheckTokenOptions): {[key: string]: any} {
+ if (!validator.isNonNullObject(options)) {
+ throw new FirebaseAppCheckError(
+ 'invalid-argument',
+ 'AppCheckTokenOptions must be a non-null object.');
+ }
+ if (typeof options.ttlMillis !== 'undefined') {
+ if (!validator.isNumber(options.ttlMillis)) {
+ throw new FirebaseAppCheckError('invalid-argument',
+ 'ttlMillis must be a duration in milliseconds.');
+ }
+ // ttlMillis must be between 30 minutes and 7 days (inclusive)
+ if (options.ttlMillis < (ONE_MINUTE_IN_MILLIS * 30) || options.ttlMillis > (ONE_DAY_IN_MILLIS * 7)) {
+ throw new FirebaseAppCheckError(
+ 'invalid-argument',
+ 'ttlMillis must be a duration in milliseconds between 30 minutes and 7 days (inclusive).');
+ }
+ return { ttl: transformMillisecondsToSecondsString(options.ttlMillis) };
+ }
+ return {};
+ }
}
/**
diff --git a/src/app-check/token-verifier.ts b/src/app-check/token-verifier.ts
index 9924f62b3f..a60a3a5bbd 100644
--- a/src/app-check/token-verifier.ts
+++ b/src/app-check/token-verifier.ts
@@ -30,7 +30,7 @@ const JWKS_URL = 'https://firebaseappcheck.googleapis.com/v1beta/jwks';
/**
* Class for verifying Firebase App Check tokens.
- *
+ *
* @internal
*/
export class AppCheckTokenVerifier {
@@ -141,7 +141,7 @@ export class AppCheckTokenVerifier {
/**
* Maps JwtError to FirebaseAppCheckError
- *
+ *
* @param error JwtError to be mapped.
* @returns FirebaseAppCheckError instance.
*/
diff --git a/src/app/firebase-app.ts b/src/app/firebase-app.ts
index 0fdabacbbd..920dce3323 100644
--- a/src/app/firebase-app.ts
+++ b/src/app/firebase-app.ts
@@ -31,6 +31,7 @@ import { Storage } from '../storage/index';
import { Database } from '../database/index';
import { Firestore } from '../firestore/index';
import { InstanceId } from '../instance-id/index';
+import { Installations } from '../installations/index';
import { ProjectManagement } from '../project-management/index';
import { SecurityRules } from '../security-rules/index';
import { RemoteConfig } from '../remote-config/index';
@@ -261,6 +262,16 @@ export class FirebaseApp implements app.App {
return fn(this);
}
+ /**
+ * Returns the InstanceId service instance associated with this app.
+ *
+ * @returns The InstanceId service instance of this app.
+ */
+ public installations(): Installations {
+ const fn = require('../installations/index').getInstallations;
+ return fn(this);
+ }
+
/**
* Returns the MachineLearning service instance associated with this app.
*
diff --git a/src/app/firebase-namespace.ts b/src/app/firebase-namespace.ts
index 18b870dd4e..f39eed6b9d 100644
--- a/src/app/firebase-namespace.ts
+++ b/src/app/firebase-namespace.ts
@@ -20,7 +20,7 @@ import fs = require('fs');
import { AppErrorCodes, FirebaseAppError } from '../utils/error';
import {
app, appCheck, auth, messaging, machineLearning, storage, firestore, database,
- instanceId, projectManagement, securityRules , remoteConfig, AppOptions,
+ instanceId, installations, projectManagement, securityRules , remoteConfig, AppOptions,
} from '../firebase-namespace-api';
import { FirebaseApp } from './firebase-app';
import { cert, refreshToken, applicationDefault } from './credential-factory';
@@ -34,6 +34,7 @@ import AppCheck = appCheck.AppCheck;
import Auth = auth.Auth;
import Database = database.Database;
import Firestore = firestore.Firestore;
+import Installations = installations.Installations;
import InstanceId = instanceId.InstanceId;
import MachineLearning = machineLearning.MachineLearning;
import Messaging = messaging.Messaging;
@@ -302,6 +303,18 @@ export class FirebaseNamespace {
return Object.assign(fn, { MachineLearning: machineLearning });
}
+ /**
+ * Gets the `Installations` service namespace. The returned namespace can be used to get the
+ * `Installations` service for the default app or an explicitly specified app.
+ */
+ get installations(): FirebaseServiceNamespace {
+ const fn: FirebaseServiceNamespace = (app?: App) => {
+ return this.ensureApp(app).installations();
+ };
+ const installations = require('../installations/installations').Installations;
+ return Object.assign(fn, { Installations: installations });
+ }
+
/**
* Gets the `InstanceId` service namespace. The returned namespace can be used to get the
* `Instance` service for the default app or an explicitly specified app.
diff --git a/src/auth/auth-config.ts b/src/auth/auth-config.ts
index c833449532..f6934be4d7 100644
--- a/src/auth/auth-config.ts
+++ b/src/auth/auth-config.ts
@@ -1241,7 +1241,7 @@ export class OIDCConfig implements OIDCAuthProviderConfig {
}
if (typeof options.responseType !== 'undefined') {
request.responseType = options.responseType;
- }
+ }
return request;
}
@@ -1358,18 +1358,18 @@ export class OIDCConfig implements OIDCAuthProviderConfig {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_CONFIG,
`"${key}" is not a valid OAuthResponseType parameter.`,
- );
+ );
}
});
-
+
const idToken = options.responseType.idToken;
- if (typeof idToken !== 'undefined' && !validator.isBoolean(idToken)) {
+ if (typeof idToken !== 'undefined' && !validator.isBoolean(idToken)) {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
'"OIDCAuthProviderConfig.responseType.idToken" must be a boolean.',
);
}
-
+
const code = options.responseType.code;
if (typeof code !== 'undefined') {
if (!validator.isBoolean(code)) {
@@ -1378,16 +1378,16 @@ export class OIDCConfig implements OIDCAuthProviderConfig {
'"OIDCAuthProviderConfig.responseType.code" must be a boolean.',
);
}
-
+
// If code flow is enabled, client secret must be provided.
if (code && typeof options.clientSecret === 'undefined') {
throw new FirebaseAuthError(
AuthClientErrorCode.MISSING_OAUTH_CLIENT_SECRET,
'The OAuth configuration client secret is required to enable OIDC code flow.',
- );
+ );
}
}
-
+
const allKeys = Object.keys(options.responseType).length;
const enabledCount = Object.values(options.responseType).filter(Boolean).length;
// Only one of OAuth response types can be set to true.
diff --git a/src/firebase-namespace-api.ts b/src/firebase-namespace-api.ts
index d1bea3d509..185fbfd53f 100644
--- a/src/firebase-namespace-api.ts
+++ b/src/firebase-namespace-api.ts
@@ -19,6 +19,7 @@ import { auth } from './auth/auth-namespace';
import { database } from './database/database-namespace';
import { firestore } from './firestore/firestore-namespace';
import { instanceId } from './instance-id/instance-id-namespace';
+import { installations } from './installations/installations-namespace';
import { machineLearning } from './machine-learning/machine-learning-namespace';
import { messaging } from './messaging/messaging-namespace';
import { projectManagement } from './project-management/project-management-namespace';
@@ -47,6 +48,8 @@ export namespace app {
auth(): auth.Auth;
database(url?: string): database.Database;
firestore(): firestore.Firestore;
+ installations(): installations.Installations;
+ /** @deprecated */
instanceId(): instanceId.InstanceId;
machineLearning(): machineLearning.MachineLearning;
messaging(): messaging.Messaging;
@@ -82,6 +85,7 @@ export { auth } from './auth/auth-namespace';
export { database } from './database/database-namespace';
export { firestore } from './firestore/firestore-namespace';
export { instanceId } from './instance-id/instance-id-namespace';
+export { installations } from './installations/installations-namespace';
export { machineLearning } from './machine-learning/machine-learning-namespace';
export { messaging } from './messaging/messaging-namespace';
export { projectManagement } from './project-management/project-management-namespace';
diff --git a/src/installations/index.ts b/src/installations/index.ts
new file mode 100644
index 0000000000..9974852875
--- /dev/null
+++ b/src/installations/index.ts
@@ -0,0 +1,63 @@
+/*!
+ * Copyright 2020 Google Inc.
+ *
+ * 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.
+ */
+
+/**
+ * Firebase Instance ID service.
+ *
+ * @packageDocumentation
+ */
+
+import { App, getApp } from '../app/index';
+import { Installations } from './installations';
+import { FirebaseApp } from '../app/firebase-app';
+
+export { Installations };
+
+/**
+ * Gets the {@link Installations} service for the default app or a given app.
+ *
+ * `getInstallations()` can be called with no arguments to access the default
+ * app's `Installations` service or as `getInstallations(app)` to access the
+ * `Installations` service associated with a specific app.
+ *
+ * @example
+ * ```javascript
+ * // Get the Installations service for the default app
+ * const defaultInstallations = getInstallations();
+ * ```
+ *
+ * @example
+ * ```javascript
+ * // Get the Installations service for a given app
+ * const otherInstallations = getInstallations(otherApp);
+ *```
+ *
+ * @param app Optional app whose `Installations` service to
+ * return. If not provided, the default `Installations` service will be
+ * returned.
+ *
+ * @returns The default `Installations` service if
+ * no app is provided or the `Installations` service associated with the
+ * provided app.
+ */
+export function getInstallations(app?: App): Installations {
+ if (typeof app === 'undefined') {
+ app = getApp();
+ }
+
+ const firebaseApp: FirebaseApp = app as FirebaseApp;
+ return firebaseApp.getOrInitService('installations', (app) => new Installations(app));
+}
diff --git a/src/installations/installations-namespace.ts b/src/installations/installations-namespace.ts
new file mode 100644
index 0000000000..dc51e08476
--- /dev/null
+++ b/src/installations/installations-namespace.ts
@@ -0,0 +1,58 @@
+/*!
+ * Copyright 2021 Google Inc.
+ *
+ * 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 { App } from '../app/index';
+import { Installations as TInstallations } from './installations';
+
+/**
+ * Gets the {@link installations.Installations `Installations`} service for the
+ * default app or a given app.
+ *
+ * `admin.installations()` can be called with no arguments to access the default
+ * app's {@link installations.Installations `Installations`} service or as
+ * `admin.installations(app)` to access the
+ * {@link installations.Installations `Installations`} service associated with a
+ * specific app.
+ *
+ * @example
+ * ```javascript
+ * // Get the Installations service for the default app
+ * var defaultInstallations = admin.installations();
+ * ```
+ *
+ * @example
+ * ```javascript
+ * // Get the Installations service for a given app
+ * var otherInstallations = admin.installations(otherApp);
+ *```
+ *
+ * @param app Optional app whose `Installations` service to
+ * return. If not provided, the default `Installations` service is
+ * returned.
+ *
+ * @return The default `Installations` service if
+ * no app is provided or the `Installations` service associated with the
+ * provided app.
+ */
+export declare function installations(app?: App): installations.Installations;
+
+/* eslint-disable @typescript-eslint/no-namespace */
+export namespace installations {
+ /**
+ * Type alias to {@link firebase-admin.installations#Installations}.
+ */
+ export type Installations = TInstallations;
+}
diff --git a/src/instance-id/instance-id-request-internal.ts b/src/installations/installations-request-handler.ts
similarity index 76%
rename from src/instance-id/instance-id-request-internal.ts
rename to src/installations/installations-request-handler.ts
index 52441b84ee..44d17e41d4 100644
--- a/src/instance-id/instance-id-request-internal.ts
+++ b/src/installations/installations-request-handler.ts
@@ -1,6 +1,6 @@
/*!
* @license
- * Copyright 2017 Google Inc.
+ * Copyright 2021 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
import { App } from '../app/index';
import { FirebaseApp } from '../app/firebase-app';
-import { FirebaseInstanceIdError, InstanceIdClientErrorCode } from '../utils/error';
+import { FirebaseInstallationsError, InstallationsClientErrorCode } from '../utils/error';
import {
ApiSettings, AuthorizedHttpClient, HttpRequestConfig, HttpError,
} from '../utils/api-request';
@@ -34,10 +34,10 @@ const FIREBASE_IID_TIMEOUT = 10000;
/** HTTP error codes raised by the backend server. */
const ERROR_CODES: {[key: number]: string} = {
- 400: 'Malformed instance ID argument.',
+ 400: 'Malformed installation ID argument.',
401: 'Request not authorized.',
- 403: 'Project does not match instance ID or the client does not have sufficient privileges.',
- 404: 'Failed to find the instance ID.',
+ 403: 'Project does not match installation ID or the client does not have sufficient privileges.',
+ 404: 'Failed to find the installation ID.',
409: 'Already deleted.',
429: 'Request throttled out by the backend server.',
500: 'Internal server error.',
@@ -45,9 +45,9 @@ const ERROR_CODES: {[key: number]: string} = {
};
/**
- * Class that provides mechanism to send requests to the Firebase Instance ID backend endpoints.
+ * Class that provides mechanism to send requests to the FIS backend endpoints.
*/
-export class FirebaseInstanceIdRequestHandler {
+export class FirebaseInstallationsRequestHandler {
private readonly host: string = FIREBASE_IID_HOST;
private readonly timeout: number = FIREBASE_IID_TIMEOUT;
@@ -63,14 +63,14 @@ export class FirebaseInstanceIdRequestHandler {
this.httpClient = new AuthorizedHttpClient(app as FirebaseApp);
}
- public deleteInstanceId(instanceId: string): Promise {
- if (!validator.isNonEmptyString(instanceId)) {
- return Promise.reject(new FirebaseInstanceIdError(
- InstanceIdClientErrorCode.INVALID_INSTANCE_ID,
- 'Instance ID must be a non-empty string.',
+ public deleteInstallation(fid: string): Promise {
+ if (!validator.isNonEmptyString(fid)) {
+ return Promise.reject(new FirebaseInstallationsError(
+ InstallationsClientErrorCode.INVALID_INSTALLATION_ID,
+ 'Installation ID must be a non-empty string.',
));
}
- return this.invokeRequestHandler(new ApiSettings(instanceId, 'DELETE'));
+ return this.invokeRequestHandler(new ApiSettings(fid, 'DELETE'));
}
/**
@@ -99,8 +99,8 @@ export class FirebaseInstanceIdRequestHandler {
response.data.error : response.text;
const template: string = ERROR_CODES[response.status];
const message: string = template ?
- `Instance ID "${apiSettings.getEndpoint()}": ${template}` : errorMessage;
- throw new FirebaseInstanceIdError(InstanceIdClientErrorCode.API_ERROR, message);
+ `Installation ID "${apiSettings.getEndpoint()}": ${template}` : errorMessage;
+ throw new FirebaseInstallationsError(InstallationsClientErrorCode.API_ERROR, message);
}
// In case of timeouts and other network errors, the HttpClient returns a
// FirebaseError wrapped in the response. Simply throw it here.
@@ -117,9 +117,9 @@ export class FirebaseInstanceIdRequestHandler {
.then((projectId) => {
if (!validator.isNonEmptyString(projectId)) {
// Assert for an explicit projct ID (either via AppOptions or the cert itself).
- throw new FirebaseInstanceIdError(
- InstanceIdClientErrorCode.INVALID_PROJECT_ID,
- 'Failed to determine project ID for InstanceId. Initialize the '
+ throw new FirebaseInstallationsError(
+ InstallationsClientErrorCode.INVALID_PROJECT_ID,
+ 'Failed to determine project ID for Installations. Initialize the '
+ 'SDK with service account credentials or set project ID as an app option. '
+ 'Alternatively set the GOOGLE_CLOUD_PROJECT environment variable.',
);
diff --git a/src/installations/installations.ts b/src/installations/installations.ts
new file mode 100644
index 0000000000..5604cef34b
--- /dev/null
+++ b/src/installations/installations.ts
@@ -0,0 +1,65 @@
+/*!
+ * Copyright 2021 Google Inc.
+ *
+ * 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 { App } from '../app/index';
+import { FirebaseInstallationsError, InstallationsClientErrorCode } from '../utils/error';
+import { FirebaseInstallationsRequestHandler } from './installations-request-handler';
+import * as validator from '../utils/validator';
+
+/**
+ * The `Installations` service for the current app.
+ */
+export class Installations {
+
+ private app_: App;
+ private requestHandler: FirebaseInstallationsRequestHandler;
+
+ /**
+ * @param app The app for this Installations service.
+ * @constructor
+ */
+ constructor(app: App) {
+ if (!validator.isNonNullObject(app) || !('options' in app)) {
+ throw new FirebaseInstallationsError(
+ InstallationsClientErrorCode.INVALID_ARGUMENT,
+ 'First argument passed to admin.installations() must be a valid Firebase app instance.',
+ );
+ }
+
+ this.app_ = app;
+ this.requestHandler = new FirebaseInstallationsRequestHandler(app);
+ }
+
+ /**
+ * Deletes the specified installation ID and the associated data from Firebase.
+ *
+ * @param fid The Firebase installation ID to be deleted.
+ *
+ * @return A promise fulfilled when the installation ID is deleted.
+ */
+ public deleteInstallation(fid: string): Promise {
+ return this.requestHandler.deleteInstallation(fid);
+ }
+
+ /**
+ * Returns the app associated with this Installations instance.
+ *
+ * @returns The app associated with this Installations instance.
+ */
+ get app(): App {
+ return this.app_;
+ }
+}
diff --git a/src/instance-id/index.ts b/src/instance-id/index.ts
index 40043b9467..7a1d5226f8 100644
--- a/src/instance-id/index.ts
+++ b/src/instance-id/index.ts
@@ -29,6 +29,10 @@ export { InstanceId };
/**
* Gets the {@link InstanceId} service for the default app or a given app.
*
+ * This API is deprecated. Developers are advised to use the
+ * {@link firebase-admin.installations#getInstallations}
+ * API to delete their instance IDs and Firebase installation IDs.
+ *
* `getInstanceId()` can be called with no arguments to access the default
* app's `InstanceId` service or as `getInstanceId(app)` to access the
* `InstanceId` service associated with a specific app.
@@ -52,6 +56,8 @@ export { InstanceId };
* @returns The default `InstanceId` service if
* no app is provided or the `InstanceId` service associated with the
* provided app.
+ *
+ * @deprecated
*/
export function getInstanceId(app?: App): InstanceId {
if (typeof app === 'undefined') {
diff --git a/src/instance-id/instance-id.ts b/src/instance-id/instance-id.ts
index eb4492b2a1..cd01932007 100644
--- a/src/instance-id/instance-id.ts
+++ b/src/instance-id/instance-id.ts
@@ -14,19 +14,23 @@
* limitations under the License.
*/
+import { FirebaseApp } from '../app/firebase-app';
import { App } from '../app/index';
-import { FirebaseInstanceIdError, InstanceIdClientErrorCode } from '../utils/error';
-import { FirebaseInstanceIdRequestHandler } from './instance-id-request-internal';
+import {
+ FirebaseInstallationsError, FirebaseInstanceIdError,
+ InstallationsClientErrorCode, InstanceIdClientErrorCode,
+} from '../utils/error';
import * as validator from '../utils/validator';
/**
* The `InstanceId` service enables deleting the Firebase instance IDs
* associated with Firebase client app instances.
+ *
+ * @deprecated
*/
export class InstanceId {
private app_: App;
- private requestHandler: FirebaseInstanceIdRequestHandler;
/**
* @param app The app for this InstanceId service.
@@ -42,7 +46,6 @@ export class InstanceId {
}
this.app_ = app;
- this.requestHandler = new FirebaseInstanceIdRequestHandler(app);
}
/**
@@ -60,9 +63,18 @@ export class InstanceId {
* @returns A promise fulfilled when the instance ID is deleted.
*/
public deleteInstanceId(instanceId: string): Promise {
- return this.requestHandler.deleteInstanceId(instanceId)
- .then(() => {
- // Return nothing on success
+ return (this.app as FirebaseApp).installations().deleteInstallation(instanceId)
+ .catch((err) => {
+ if (err instanceof FirebaseInstallationsError) {
+ let code = err.code.replace('installations/', '');
+ if (code === InstallationsClientErrorCode.INVALID_INSTALLATION_ID.code) {
+ code = InstanceIdClientErrorCode.INVALID_INSTANCE_ID.code;
+ }
+
+ throw new FirebaseInstanceIdError({ code, message: err.message });
+ }
+
+ throw err;
});
}
diff --git a/src/messaging/messaging-internal.ts b/src/messaging/messaging-internal.ts
index 3e832a2a8c..178ca0a0d7 100644
--- a/src/messaging/messaging-internal.ts
+++ b/src/messaging/messaging-internal.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { renameProperties } from '../utils/index';
+import { renameProperties, transformMillisecondsToSecondsString } from '../utils/index';
import { MessagingClientErrorCode, FirebaseMessagingError, } from '../utils/error';
import * as validator from '../utils/validator';
@@ -579,28 +579,3 @@ function validateAndroidFcmOptions(fcmOptions: AndroidFcmOptions | undefined): v
MessagingClientErrorCode.INVALID_PAYLOAD, 'analyticsLabel must be a string value');
}
}
-
-/**
- * Transforms milliseconds to the format expected by FCM service.
- * Returns the duration in seconds with up to nine fractional
- * digits, terminated by 's'. Example: "3.5s".
- *
- * @param milliseconds The duration in milliseconds.
- * @returns The resulting formatted string in seconds with up to nine fractional
- * digits, terminated by 's'.
- */
-function transformMillisecondsToSecondsString(milliseconds: number): string {
- let duration: string;
- const seconds = Math.floor(milliseconds / 1000);
- const nanos = (milliseconds - seconds * 1000) * 1000000;
- if (nanos > 0) {
- let nanoString = nanos.toString();
- while (nanoString.length < 9) {
- nanoString = '0' + nanoString;
- }
- duration = `${seconds}.${nanoString}s`;
- } else {
- duration = `${seconds}s`;
- }
- return duration;
-}
diff --git a/src/utils/error.ts b/src/utils/error.ts
index 551203a128..00ad8ab594 100644
--- a/src/utils/error.ts
+++ b/src/utils/error.ts
@@ -224,6 +224,23 @@ export class FirebaseInstanceIdError extends FirebaseError {
constructor(info: ErrorInfo, message?: string) {
// Override default message if custom message provided.
super({ code: 'instance-id/' + info.code, message: message || info.message });
+ (this as any).__proto__ = FirebaseInstanceIdError.prototype;
+ }
+}
+
+/**
+ * Firebase Installations service error code structure. This extends `FirebaseError`.
+ *
+ * @param info The error code info.
+ * @param message The error message. This will override the default
+ * message if provided.
+ * @constructor
+ */
+export class FirebaseInstallationsError extends FirebaseError {
+ constructor(info: ErrorInfo, message?: string) {
+ // Override default message if custom message provided.
+ super({ code: 'installations/' + info.code, message: message || info.message });
+ (this as any).__proto__ = FirebaseInstallationsError.prototype;
}
}
@@ -808,7 +825,7 @@ export class MessagingClientErrorCode {
};
}
-export class InstanceIdClientErrorCode {
+export class InstallationsClientErrorCode {
public static INVALID_ARGUMENT = {
code: 'invalid-argument',
message: 'Invalid argument provided.',
@@ -817,13 +834,20 @@ export class InstanceIdClientErrorCode {
code: 'invalid-project-id',
message: 'Invalid project ID provided.',
};
- public static INVALID_INSTANCE_ID = {
- code: 'invalid-instance-id',
- message: 'Invalid instance ID provided.',
+ public static INVALID_INSTALLATION_ID = {
+ code: 'invalid-installation-id',
+ message: 'Invalid installation ID provided.',
};
public static API_ERROR = {
code: 'api-error',
- message: 'Instance ID API call failed.',
+ message: 'Installation ID API call failed.',
+ };
+}
+
+export class InstanceIdClientErrorCode extends InstallationsClientErrorCode {
+ public static INVALID_INSTANCE_ID = {
+ code: 'invalid-instance-id',
+ message: 'Invalid instance ID provided.',
};
}
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 372dc6a5a6..a3b1b45bfc 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -191,3 +191,29 @@ export function generateUpdateMask(
}
return updateMask;
}
+
+/**
+ * Transforms milliseconds to a protobuf Duration type string.
+ * Returns the duration in seconds with up to nine fractional
+ * digits, terminated by 's'. Example: "3 seconds 0 nano seconds as 3s,
+ * 3 seconds 1 nano seconds as 3.000000001s".
+ *
+ * @param milliseconds The duration in milliseconds.
+ * @returns The resulting formatted string in seconds with up to nine fractional
+ * digits, terminated by 's'.
+ */
+export function transformMillisecondsToSecondsString(milliseconds: number): string {
+ let duration: string;
+ const seconds = Math.floor(milliseconds / 1000);
+ const nanos = Math.floor((milliseconds - seconds * 1000) * 1000000);
+ if (nanos > 0) {
+ let nanoString = nanos.toString();
+ while (nanoString.length < 9) {
+ nanoString = '0' + nanoString;
+ }
+ duration = `${seconds}.${nanoString}s`;
+ } else {
+ duration = `${seconds}s`;
+ }
+ return duration;
+}
diff --git a/test/integration/app-check.spec.ts b/test/integration/app-check.spec.ts
index 32386f32bc..82ad153498 100644
--- a/test/integration/app-check.spec.ts
+++ b/test/integration/app-check.spec.ts
@@ -53,6 +53,20 @@ describe('admin.appCheck', () => {
expect(token).to.have.keys(['token', 'ttlMillis']);
expect(token.token).to.be.a('string').and.to.not.be.empty;
expect(token.ttlMillis).to.be.a('number');
+ expect(token.ttlMillis).to.equals(3600000);
+ });
+ });
+
+ it('should succeed with a valid token and a custom ttl', function() {
+ if (!appId) {
+ this.skip();
+ }
+ return admin.appCheck().createToken(appId as string, { ttlMillis: 1800000 })
+ .then((token) => {
+ expect(token).to.have.keys(['token', 'ttlMillis']);
+ expect(token.token).to.be.a('string').and.to.not.be.empty;
+ expect(token.ttlMillis).to.be.a('number');
+ expect(token.ttlMillis).to.equals(1800000);
});
});
diff --git a/test/integration/auth.spec.ts b/test/integration/auth.spec.ts
index 84ab010b93..d52b77783c 100644
--- a/test/integration/auth.spec.ts
+++ b/test/integration/auth.spec.ts
@@ -275,6 +275,56 @@ describe('admin.auth', () => {
});
});
+ it('getUserByProviderUid() returns a user record with the matching provider id', async () => {
+ // TODO(rsgowman): Once we can link a provider id with a user, just do that
+ // here instead of creating a new user.
+ const randomUid = 'import_' + generateRandomString(20).toLowerCase();
+ const importUser: UserImportRecord = {
+ uid: randomUid,
+ email: 'user@example.com',
+ phoneNumber: '+15555550000',
+ emailVerified: true,
+ disabled: false,
+ metadata: {
+ lastSignInTime: 'Thu, 01 Jan 1970 00:00:00 UTC',
+ creationTime: 'Thu, 01 Jan 1970 00:00:00 UTC',
+ },
+ providerData: [{
+ displayName: 'User Name',
+ email: 'user@example.com',
+ phoneNumber: '+15555550000',
+ photoURL: 'http://example.com/user',
+ providerId: 'google.com',
+ uid: 'google_uid',
+ }],
+ };
+
+ await getAuth().importUsers([importUser]);
+
+ try {
+ await getAuth().getUserByProviderUid('google.com', 'google_uid')
+ .then((userRecord) => {
+ expect(userRecord.uid).to.equal(importUser.uid);
+ });
+ } finally {
+ await safeDelete(importUser.uid);
+ }
+ });
+
+ it('getUserByProviderUid() redirects to getUserByEmail if given an email', () => {
+ return getAuth().getUserByProviderUid('email', mockUserData.email)
+ .then((userRecord) => {
+ expect(userRecord.uid).to.equal(newUserUid);
+ });
+ });
+
+ it('getUserByProviderUid() redirects to getUserByPhoneNumber if given a phone number', () => {
+ return getAuth().getUserByProviderUid('phone', mockUserData.phoneNumber)
+ .then((userRecord) => {
+ expect(userRecord.uid).to.equal(newUserUid);
+ });
+ });
+
describe('getUsers()', () => {
/**
* Filters a list of object to another list of objects that only contains
@@ -791,6 +841,11 @@ describe('admin.auth', () => {
.should.eventually.be.rejected.and.have.property('code', 'auth/user-not-found');
});
+ it('getUserByProviderUid() fails when called with a non-existing provider id', () => {
+ return getAuth().getUserByProviderUid('google.com', nonexistentUid)
+ .should.eventually.be.rejected.and.have.property('code', 'auth/user-not-found');
+ });
+
it('updateUser() fails when called with a non-existing UID', () => {
return getAuth().updateUser(nonexistentUid, {
emailVerified: true,
diff --git a/test/integration/installations.spec.ts b/test/integration/installations.spec.ts
new file mode 100644
index 0000000000..98eb3ad72a
--- /dev/null
+++ b/test/integration/installations.spec.ts
@@ -0,0 +1,31 @@
+/*!
+ * Copyright 2021 Google Inc.
+ *
+ * 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 { getInstallations } from '../../lib/installations/index';
+import * as chai from 'chai';
+import * as chaiAsPromised from 'chai-as-promised';
+
+chai.should();
+chai.use(chaiAsPromised);
+
+describe('admin.installations', () => {
+ it('deleteInstallation() fails when called with fictive-ID0 instance ID', () => {
+ // instance ids have to conform to /[cdef][A-Za-z0-9_-]{9}[AEIMQUYcgkosw048]/
+ return getInstallations().deleteInstallation('fictive-ID0')
+ .should.eventually.be
+ .rejectedWith('Installation ID "fictive-ID0": Failed to find the installation ID.');
+ });
+});
diff --git a/test/integration/instance-id.spec.ts b/test/integration/instance-id.spec.ts
index 841d110772..2155205990 100644
--- a/test/integration/instance-id.spec.ts
+++ b/test/integration/instance-id.spec.ts
@@ -26,6 +26,6 @@ describe('admin.instanceId', () => {
// instance ids have to conform to /[cdef][A-Za-z0-9_-]{9}[AEIMQUYcgkosw048]/
return getInstanceId().deleteInstanceId('fictive-ID0')
.should.eventually.be
- .rejectedWith('Instance ID "fictive-ID0": Failed to find the instance ID.');
+ .rejectedWith('Installation ID "fictive-ID0": Failed to find the installation ID.');
});
});
diff --git a/test/unit/app-check/app-check.spec.ts b/test/unit/app-check/app-check.spec.ts
index 0818a27945..5b8b48cc6c 100644
--- a/test/unit/app-check/app-check.spec.ts
+++ b/test/unit/app-check/app-check.spec.ts
@@ -23,7 +23,7 @@ import * as sinon from 'sinon';
import * as mocks from '../../resources/mocks';
import { FirebaseApp } from '../../../src/app/firebase-app';
-import { AppCheck } from '../../../src/app-check/app-check';
+import { AppCheck } from '../../../src/app-check/index';
import { AppCheckApiClient, FirebaseAppCheckError } from '../../../src/app-check/app-check-api-client-internal';
import { AppCheckTokenGenerator } from '../../../src/app-check/token-generator';
import { HttpClient } from '../../../src/utils/api-request';
@@ -147,6 +147,15 @@ describe('AppCheck', () => {
.should.eventually.be.rejected.and.deep.equal(INTERNAL_ERROR);
});
+ it('should propagate API errors with custom options', () => {
+ const stub = sinon
+ .stub(AppCheckApiClient.prototype, 'exchangeToken')
+ .rejects(INTERNAL_ERROR);
+ stubs.push(stub);
+ return appCheck.createToken(APP_ID, { ttlMillis: 1800000 })
+ .should.eventually.be.rejected.and.deep.equal(INTERNAL_ERROR);
+ });
+
it('should resolve with AppCheckToken on success', () => {
const response = { token: 'token', ttlMillis: 3000 };
const stub = sinon
@@ -172,7 +181,7 @@ describe('AppCheck', () => {
});
it('should resolve with VerifyAppCheckTokenResponse on success', () => {
- const response = {
+ const response = {
sub: 'app-id',
iss: 'https://firebaseappcheck.googleapis.com/123456',
// eslint-disable-next-line @typescript-eslint/camelcase
diff --git a/test/unit/app-check/token-generator.spec.ts b/test/unit/app-check/token-generator.spec.ts
index ba47850f30..4a0e8deee9 100644
--- a/test/unit/app-check/token-generator.spec.ts
+++ b/test/unit/app-check/token-generator.spec.ts
@@ -43,7 +43,7 @@ chai.use(chaiAsPromised);
const expect = chai.expect;
const ALGORITHM = 'RS256';
-const ONE_HOUR_IN_SECONDS = 60 * 60;
+const FIVE_MIN_IN_SECONDS = 5 * 60;
const FIREBASE_APP_CHECK_AUDIENCE = 'https://firebaseappcheck.googleapis.com/google.firebase.appcheck.v1beta.TokenExchangeService';
/**
@@ -137,7 +137,7 @@ describe('AppCheckTokenGenerator', () => {
// eslint-disable-next-line @typescript-eslint/camelcase
app_id: APP_ID,
iat: 1,
- exp: ONE_HOUR_IN_SECONDS + 1,
+ exp: FIVE_MIN_IN_SECONDS + 1,
aud: FIREBASE_APP_CHECK_AUDIENCE,
iss: mocks.certificateObject.client_email,
sub: mocks.certificateObject.client_email,
@@ -177,7 +177,7 @@ describe('AppCheckTokenGenerator', () => {
});
});
- it('should be fulfilled with a JWT which expires after one hour', () => {
+ it('should be fulfilled with a JWT which expires after five minutes', () => {
clock = sinon.useFakeTimers(1000);
let token: string;
@@ -185,7 +185,7 @@ describe('AppCheckTokenGenerator', () => {
.then((result) => {
token = result;
- clock!.tick((ONE_HOUR_IN_SECONDS * 1000) - 1);
+ clock!.tick((FIVE_MIN_IN_SECONDS * 1000) - 1);
// Token should still be valid
return verifyToken(token, mocks.keyPairs[0].public);
@@ -210,7 +210,7 @@ describe('AppCheckTokenGenerator', () => {
expect(appCheckError).to.have.property('code', 'app-check/invalid-argument');
expect(appCheckError).to.have.property('message', 'test error.');
});
-
+
it('should convert CryptoSignerError HttpError to FirebaseAppCheckError', () => {
const cryptoError = new CryptoSignerError({
code: CryptoSignerErrorCode.SERVER_ERROR,
@@ -243,7 +243,7 @@ describe('AppCheckTokenGenerator', () => {
'Error returned from server while signing a custom token: '+
'{"status":500,"headers":{},"data":{"error":{}},"text":"{\\"error\\":{}}"}');
});
-
+
it('should convert CryptoSignerError HttpError with no errorcode to FirebaseAppCheckError', () => {
const cryptoError = new CryptoSignerError({
code: CryptoSignerErrorCode.SERVER_ERROR,
diff --git a/test/unit/app/firebase-app.spec.ts b/test/unit/app/firebase-app.spec.ts
index 8ef2a69d4a..043d8eb679 100644
--- a/test/unit/app/firebase-app.spec.ts
+++ b/test/unit/app/firebase-app.spec.ts
@@ -34,7 +34,7 @@ import {
} from '../../../src/app/firebase-namespace';
import {
auth, messaging, machineLearning, storage, firestore, database,
- instanceId, projectManagement, securityRules , remoteConfig, appCheck,
+ instanceId, installations, projectManagement, securityRules , remoteConfig, appCheck,
} from '../../../src/firebase-namespace-api';
import { FirebaseAppError, AppErrorCodes } from '../../../src/utils/error';
@@ -44,6 +44,7 @@ import Messaging = messaging.Messaging;
import MachineLearning = machineLearning.MachineLearning;
import Storage = storage.Storage;
import Firestore = firestore.Firestore;
+import Installations = installations.Installations;
import InstanceId = instanceId.InstanceId;
import ProjectManagement = projectManagement.ProjectManagement;
import SecurityRules = securityRules.SecurityRules;
@@ -561,6 +562,32 @@ describe('FirebaseApp', () => {
});
});
+ describe('installations()', () => {
+ it('should throw if the app has already been deleted', () => {
+ const app = firebaseNamespace.initializeApp(mocks.appOptions, mocks.appName);
+
+ return app.delete().then(() => {
+ expect(() => {
+ return app.installations();
+ }).to.throw(`Firebase app named "${mocks.appName}" has already been deleted.`);
+ });
+ });
+
+ it('should return the InstanceId client', () => {
+ const app = firebaseNamespace.initializeApp(mocks.appOptions, mocks.appName);
+
+ const fis: Installations = app.installations();
+ expect(fis).not.be.null;
+ });
+
+ it('should return a cached version of InstanceId on subsequent calls', () => {
+ const app = firebaseNamespace.initializeApp(mocks.appOptions, mocks.appName);
+ const service1: Installations = app.installations();
+ const service2: Installations = app.installations();
+ expect(service1).to.equal(service2);
+ });
+ });
+
describe('instanceId()', () => {
it('should throw if the app has already been deleted', () => {
const app = firebaseNamespace.initializeApp(mocks.appOptions, mocks.appName);
diff --git a/test/unit/app/firebase-namespace.spec.ts b/test/unit/app/firebase-namespace.spec.ts
index 220d76579b..aee55a965f 100644
--- a/test/unit/app/firebase-namespace.spec.ts
+++ b/test/unit/app/firebase-namespace.spec.ts
@@ -49,11 +49,12 @@ import { getSdkVersion } from '../../../src/utils/index';
import {
app, auth, messaging, machineLearning, storage, firestore, database,
- instanceId, projectManagement, securityRules , remoteConfig, appCheck,
+ instanceId, installations, projectManagement, securityRules , remoteConfig, appCheck,
} from '../../../src/firebase-namespace-api';
import { AppCheck as AppCheckImpl } from '../../../src/app-check/app-check';
import { Auth as AuthImpl } from '../../../src/auth/auth';
import { InstanceId as InstanceIdImpl } from '../../../src/instance-id/instance-id';
+import { Installations as InstallationsImpl } from '../../../src/installations/installations';
import { MachineLearning as MachineLearningImpl } from '../../../src/machine-learning/machine-learning';
import { Messaging as MessagingImpl } from '../../../src/messaging/messaging';
import { ProjectManagement as ProjectManagementImpl } from '../../../src/project-management/project-management';
@@ -68,6 +69,7 @@ import AppCheck = appCheck.AppCheck;
import Auth = auth.Auth;
import Database = database.Database;
import Firestore = firestore.Firestore;
+import Installations = installations.Installations;
import InstanceId = instanceId.InstanceId;
import MachineLearning = machineLearning.MachineLearning;
import Messaging = messaging.Messaging;
@@ -598,6 +600,46 @@ describe('FirebaseNamespace', () => {
});
});
+ describe('#installations()', () => {
+ it('should throw when called before initializing an app', () => {
+ expect(() => {
+ firebaseNamespace.installations();
+ }).to.throw(DEFAULT_APP_NOT_FOUND);
+ });
+
+ it('should throw when default app is not initialized', () => {
+ firebaseNamespace.initializeApp(mocks.appOptions, 'testApp');
+ expect(() => {
+ firebaseNamespace.installations();
+ }).to.throw(DEFAULT_APP_NOT_FOUND);
+ });
+
+ it('should return a valid namespace when the default app is initialized', () => {
+ const app: App = firebaseNamespace.initializeApp(mocks.appOptions);
+ const fis: Installations = firebaseNamespace.installations();
+ expect(fis).to.not.be.null;
+ expect(fis.app).to.be.deep.equal(app);
+ });
+
+ it('should return a valid namespace when the named app is initialized', () => {
+ const app: App = firebaseNamespace.initializeApp(mocks.appOptions, 'testApp');
+ const fis: Installations = firebaseNamespace.installations(app);
+ expect(fis).to.not.be.null;
+ expect(fis.app).to.be.deep.equal(app);
+ });
+
+ it('should return a reference to Installations type', () => {
+ expect(firebaseNamespace.installations.Installations).to.be.deep.equal(InstallationsImpl);
+ });
+
+ it('should return a cached version of Installations on subsequent calls', () => {
+ firebaseNamespace.initializeApp(mocks.appOptions);
+ const service1: Installations = firebaseNamespace.installations();
+ const service2: Installations = firebaseNamespace.installations();
+ expect(service1).to.equal(service2);
+ });
+ });
+
describe('#instanceId()', () => {
it('should throw when called before initializing an app', () => {
expect(() => {
@@ -792,7 +834,7 @@ describe('FirebaseNamespace', () => {
after(clearGlobalAppDefaultCred);
});
-
+
describe('#appCheck()', () => {
it('should throw when called before initializing an app', () => {
expect(() => {
diff --git a/test/unit/auth/token-verifier.spec.ts b/test/unit/auth/token-verifier.spec.ts
index ea3bd9ff90..d422b90b61 100644
--- a/test/unit/auth/token-verifier.spec.ts
+++ b/test/unit/auth/token-verifier.spec.ts
@@ -448,7 +448,7 @@ describe('FirebaseTokenVerifier', () => {
createTokenVerifier(mockAppWithAgent);
expect(verifierSpy.args[0][1]).to.equal(agentForApp);
-
+
verifierSpy.restore();
});
diff --git a/test/unit/index.spec.ts b/test/unit/index.spec.ts
index 7434f07366..9c0b51f831 100644
--- a/test/unit/index.spec.ts
+++ b/test/unit/index.spec.ts
@@ -65,10 +65,13 @@ import './storage/index.spec';
import './firestore/firestore.spec';
import './firestore/index.spec';
+// Installations
+import './installations/installations.spec';
+import './installations/installations-request-handler.spec';
+
// InstanceId
import './instance-id/index.spec';
import './instance-id/instance-id.spec';
-import './instance-id/instance-id-request.spec';
// ProjectManagement
import './project-management/index.spec';
diff --git a/test/unit/instance-id/instance-id-request.spec.ts b/test/unit/installations/installations-request-handler.spec.ts
similarity index 72%
rename from test/unit/instance-id/instance-id-request.spec.ts
rename to test/unit/installations/installations-request-handler.spec.ts
index 37c7347a0e..36e696dd2d 100644
--- a/test/unit/instance-id/instance-id-request.spec.ts
+++ b/test/unit/installations/installations-request-handler.spec.ts
@@ -28,7 +28,7 @@ import * as mocks from '../../resources/mocks';
import { FirebaseApp } from '../../../src/app/firebase-app';
import { HttpClient } from '../../../src/utils/api-request';
-import { FirebaseInstanceIdRequestHandler } from '../../../src/instance-id/instance-id-request-internal';
+import { FirebaseInstallationsRequestHandler } from '../../../src/installations/installations-request-handler';
chai.should();
chai.use(sinonChai);
@@ -36,7 +36,7 @@ chai.use(chaiAsPromised);
const expect = chai.expect;
-describe('FirebaseInstanceIdRequestHandler', () => {
+describe('FirebaseInstallationsRequestHandler', () => {
const projectId = 'project_id';
const mockAccessToken: string = utils.generateRandomAccessToken();
let stubs: sinon.SinonStub[] = [];
@@ -69,24 +69,24 @@ describe('FirebaseInstanceIdRequestHandler', () => {
describe('Constructor', () => {
it('should succeed with a FirebaseApp instance', () => {
expect(() => {
- return new FirebaseInstanceIdRequestHandler(mockApp);
+ return new FirebaseInstallationsRequestHandler(mockApp);
}).not.to.throw(Error);
});
});
- describe('deleteInstanceId', () => {
+ describe('deleteInstallation', () => {
const httpMethod = 'DELETE';
const host = 'console.firebase.google.com';
- const path = `/v1/project/${projectId}/instanceId/test-iid`;
+ const path = `/v1/project/${projectId}/instanceId/test-fid`;
const timeout = 10000;
- it('should be fulfilled given a valid instance ID', () => {
+ it('should be fulfilled given a valid installation ID', () => {
const stub = sinon.stub(HttpClient.prototype, 'send')
.resolves(utils.responseFrom(''));
stubs.push(stub);
- const requestHandler = new FirebaseInstanceIdRequestHandler(mockApp);
- return requestHandler.deleteInstanceId('test-iid')
+ const requestHandler = new FirebaseInstallationsRequestHandler(mockApp);
+ return requestHandler.deleteInstallation('test-fid')
.then(() => {
expect(stub).to.have.been.calledOnce.and.calledWith({
method: httpMethod,
@@ -102,14 +102,14 @@ describe('FirebaseInstanceIdRequestHandler', () => {
.rejects(utils.errorFrom({}, 404));
stubs.push(stub);
- const requestHandler = new FirebaseInstanceIdRequestHandler(mockApp);
- return requestHandler.deleteInstanceId('test-iid')
+ const requestHandler = new FirebaseInstallationsRequestHandler(mockApp);
+ return requestHandler.deleteInstallation('test-fid')
.then(() => {
throw new Error('Unexpected success');
})
.catch((error) => {
- expect(error.code).to.equal('instance-id/api-error');
- expect(error.message).to.equal('Instance ID "test-iid": Failed to find the instance ID.');
+ expect(error.code).to.equal('installations/api-error');
+ expect(error.message).to.equal('Installation ID "test-fid": Failed to find the installation ID.');
});
});
@@ -118,14 +118,14 @@ describe('FirebaseInstanceIdRequestHandler', () => {
.rejects(utils.errorFrom({}, 409));
stubs.push(stub);
- const requestHandler = new FirebaseInstanceIdRequestHandler(mockApp);
- return requestHandler.deleteInstanceId('test-iid')
+ const requestHandler = new FirebaseInstallationsRequestHandler(mockApp);
+ return requestHandler.deleteInstallation('test-fid')
.then(() => {
throw new Error('Unexpected success');
})
.catch((error) => {
- expect(error.code).to.equal('instance-id/api-error');
- expect(error.message).to.equal('Instance ID "test-iid": Already deleted.');
+ expect(error.code).to.equal('installations/api-error');
+ expect(error.message).to.equal('Installation ID "test-fid": Already deleted.');
});
});
@@ -135,13 +135,13 @@ describe('FirebaseInstanceIdRequestHandler', () => {
.rejects(utils.errorFrom(expectedResult, 511));
stubs.push(stub);
- const requestHandler = new FirebaseInstanceIdRequestHandler(mockApp);
- return requestHandler.deleteInstanceId('test-iid')
+ const requestHandler = new FirebaseInstallationsRequestHandler(mockApp);
+ return requestHandler.deleteInstallation('test-fid')
.then(() => {
throw new Error('Unexpected success');
})
.catch((error) => {
- expect(error.code).to.equal('instance-id/api-error');
+ expect(error.code).to.equal('installations/api-error');
expect(error.message).to.equal('test error');
});
});
diff --git a/test/unit/installations/installations.spec.ts b/test/unit/installations/installations.spec.ts
new file mode 100644
index 0000000000..6a38c8413c
--- /dev/null
+++ b/test/unit/installations/installations.spec.ts
@@ -0,0 +1,190 @@
+/*!
+ * @license
+ * Copyright 2017 Google Inc.
+ *
+ * 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.
+ */
+
+'use strict';
+
+import * as _ from 'lodash';
+import * as chai from 'chai';
+import * as sinon from 'sinon';
+import * as sinonChai from 'sinon-chai';
+import * as chaiAsPromised from 'chai-as-promised';
+
+import * as utils from '../utils';
+import * as mocks from '../../resources/mocks';
+
+import { Installations } from '../../../src/installations/installations';
+import { FirebaseInstallationsRequestHandler } from '../../../src/installations/installations-request-handler';
+import { FirebaseApp } from '../../../src/app/firebase-app';
+import { FirebaseInstallationsError, InstallationsClientErrorCode } from '../../../src/utils/error';
+
+chai.should();
+chai.use(sinonChai);
+chai.use(chaiAsPromised);
+
+const expect = chai.expect;
+
+describe('Installations', () => {
+ let fis: Installations;
+ let mockApp: FirebaseApp;
+ let mockCredentialApp: FirebaseApp;
+ let getTokenStub: sinon.SinonStub;
+
+ let nullAccessTokenClient: Installations;
+ let malformedAccessTokenClient: Installations;
+ let rejectedPromiseAccessTokenClient: Installations;
+
+ let googleCloudProject: string | undefined;
+ let gcloudProject: string | undefined;
+
+ const noProjectIdError = 'Failed to determine project ID for Installations. Initialize the SDK '
+ + 'with service account credentials or set project ID as an app option. Alternatively set the '
+ + 'GOOGLE_CLOUD_PROJECT environment variable.';
+
+ beforeEach(() => {
+ mockApp = mocks.app();
+ getTokenStub = utils.stubGetAccessToken(undefined, mockApp);
+ mockCredentialApp = mocks.mockCredentialApp();
+ fis = new Installations(mockApp);
+
+ googleCloudProject = process.env.GOOGLE_CLOUD_PROJECT;
+ gcloudProject = process.env.GCLOUD_PROJECT;
+
+ nullAccessTokenClient = new Installations(mocks.appReturningNullAccessToken());
+ malformedAccessTokenClient = new Installations(mocks.appReturningMalformedAccessToken());
+ rejectedPromiseAccessTokenClient = new Installations(mocks.appRejectedWhileFetchingAccessToken());
+ });
+
+ afterEach(() => {
+ getTokenStub.restore();
+ process.env.GOOGLE_CLOUD_PROJECT = googleCloudProject;
+ process.env.GCLOUD_PROJECT = gcloudProject;
+ return mockApp.delete();
+ });
+
+
+ describe('Constructor', () => {
+ const invalidApps = [null, NaN, 0, 1, true, false, '', 'a', [], [1, 'a'], {}, { a: 1 }, _.noop];
+ invalidApps.forEach((invalidApp) => {
+ it('should throw given invalid app: ' + JSON.stringify(invalidApp), () => {
+ expect(() => {
+ const iidAny: any = Installations;
+ return new iidAny(invalidApp);
+ }).to.throw('First argument passed to admin.installations() must be a valid Firebase app instance.');
+ });
+ });
+
+ it('should throw given no app', () => {
+ expect(() => {
+ const iidAny: any = Installations;
+ return new iidAny();
+ }).to.throw('First argument passed to admin.installations() must be a valid Firebase app instance.');
+ });
+
+ it('should reject given an invalid credential without project ID', () => {
+ // Project ID not set in the environment.
+ delete process.env.GOOGLE_CLOUD_PROJECT;
+ delete process.env.GCLOUD_PROJECT;
+ const installations = new Installations(mockCredentialApp);
+ return installations.deleteInstallation('iid')
+ .should.eventually.rejectedWith(noProjectIdError);
+ });
+
+ it('should not throw given a valid app', () => {
+ expect(() => {
+ return new Installations(mockApp);
+ }).not.to.throw();
+ });
+ });
+
+ describe('app', () => {
+ it('returns the app from the constructor', () => {
+ // We expect referential equality here
+ expect(fis.app).to.equal(mockApp);
+ });
+
+ it('is read-only', () => {
+ expect(() => {
+ (fis as any).app = mockApp;
+ }).to.throw('Cannot set property app of # which has only a getter');
+ });
+ });
+
+ describe('deleteInstallation()', () => {
+
+ // Stubs used to simulate underlying api calls.
+ let stubs: sinon.SinonStub[] = [];
+ const expectedError = new FirebaseInstallationsError(InstallationsClientErrorCode.API_ERROR);
+ const testInstallationId = 'test-iid';
+
+ afterEach(() => {
+ _.forEach(stubs, (stub) => stub.restore());
+ stubs = [];
+ });
+
+ it('should be rejected given no installation ID', () => {
+ return (fis as any).deleteInstallation()
+ .should.eventually.be.rejected.and.have.property('code', 'installations/invalid-installation-id');
+ });
+
+ it('should be rejected given an invalid installation ID', () => {
+ return fis.deleteInstallation('')
+ .should.eventually.be.rejected.and.have.property('code', 'installations/invalid-installation-id');
+ });
+
+ it('should be rejected given an app which returns null access tokens', () => {
+ return nullAccessTokenClient.deleteInstallation(testInstallationId)
+ .should.eventually.be.rejected.and.have.property('code', 'app/invalid-credential');
+ });
+
+ it('should be rejected given an app which returns invalid access tokens', () => {
+ return malformedAccessTokenClient.deleteInstallation(testInstallationId)
+ .should.eventually.be.rejected.and.have.property('code', 'app/invalid-credential');
+ });
+
+ it('should be rejected given an app which fails to generate access tokens', () => {
+ return rejectedPromiseAccessTokenClient.deleteInstallation(testInstallationId)
+ .should.eventually.be.rejected.and.have.property('code', 'app/invalid-credential');
+ });
+
+ it('should resolve without errors on success', () => {
+ const stub = sinon.stub(FirebaseInstallationsRequestHandler.prototype, 'deleteInstallation')
+ .resolves();
+ stubs.push(stub);
+ return fis.deleteInstallation(testInstallationId)
+ .then(() => {
+ // Confirm underlying API called with expected parameters.
+ expect(stub).to.have.been.calledOnce.and.calledWith(testInstallationId);
+ });
+ });
+
+ it('should throw an error when the backend returns an error', () => {
+ // Stub deleteInstallation to throw a backend error.
+ const stub = sinon.stub(FirebaseInstallationsRequestHandler.prototype, 'deleteInstallation')
+ .rejects(expectedError);
+ stubs.push(stub);
+ return fis.deleteInstallation(testInstallationId)
+ .then(() => {
+ throw new Error('Unexpected success');
+ }, (error) => {
+ // Confirm underlying API called with expected parameters.
+ expect(stub).to.have.been.calledOnce.and.calledWith(testInstallationId);
+ // Confirm expected error returned.
+ expect(error).to.equal(expectedError);
+ });
+ });
+ });
+});
diff --git a/test/unit/instance-id/index.spec.ts b/test/unit/instance-id/index.spec.ts
index b5a96eb39e..2f1d690e6a 100644
--- a/test/unit/instance-id/index.spec.ts
+++ b/test/unit/instance-id/index.spec.ts
@@ -35,7 +35,7 @@ describe('InstanceId', () => {
let mockApp: App;
let mockCredentialApp: App;
- const noProjectIdError = 'Failed to determine project ID for InstanceId. Initialize the SDK '
+ const noProjectIdError = 'Failed to determine project ID for Installations. Initialize the SDK '
+ 'with service account credentials or set project ID as an app option. Alternatively set the '
+ 'GOOGLE_CLOUD_PROJECT environment variable.';
diff --git a/test/unit/instance-id/instance-id.spec.ts b/test/unit/instance-id/instance-id.spec.ts
index e6669c7fa8..a610d7678d 100644
--- a/test/unit/instance-id/instance-id.spec.ts
+++ b/test/unit/instance-id/instance-id.spec.ts
@@ -27,9 +27,12 @@ import * as utils from '../utils';
import * as mocks from '../../resources/mocks';
import { InstanceId } from '../../../src/instance-id/index';
-import { FirebaseInstanceIdRequestHandler } from '../../../src/instance-id/instance-id-request-internal';
+import { Installations } from '../../../src/installations/index';
import { FirebaseApp } from '../../../src/app/firebase-app';
-import { FirebaseInstanceIdError, InstanceIdClientErrorCode } from '../../../src/utils/error';
+import {
+ FirebaseInstanceIdError, InstanceIdClientErrorCode,
+ FirebaseInstallationsError, InstallationsClientErrorCode,
+} from '../../../src/utils/error';
chai.should();
chai.use(sinonChai);
@@ -50,7 +53,7 @@ describe('InstanceId', () => {
let googleCloudProject: string | undefined;
let gcloudProject: string | undefined;
- const noProjectIdError = 'Failed to determine project ID for InstanceId. Initialize the SDK '
+ const noProjectIdError = 'Failed to determine project ID for Installations. Initialize the SDK '
+ 'with service account credentials or set project ID as an app option. Alternatively set the '
+ 'GOOGLE_CLOUD_PROJECT environment variable.';
@@ -127,7 +130,6 @@ describe('InstanceId', () => {
// Stubs used to simulate underlying api calls.
let stubs: sinon.SinonStub[] = [];
- const expectedError = new FirebaseInstanceIdError(InstanceIdClientErrorCode.API_ERROR);
const testInstanceId = 'test-iid';
afterEach(() => {
@@ -161,7 +163,7 @@ describe('InstanceId', () => {
});
it('should resolve without errors on success', () => {
- const stub = sinon.stub(FirebaseInstanceIdRequestHandler.prototype, 'deleteInstanceId')
+ const stub = sinon.stub(Installations.prototype, 'deleteInstallation')
.resolves();
stubs.push(stub);
return iid.deleteInstanceId(testInstanceId)
@@ -171,10 +173,11 @@ describe('InstanceId', () => {
});
});
- it('should throw an error when the backend returns an error', () => {
+ it('should throw a FirebaseInstanceIdError error when the backend returns an error', () => {
// Stub deleteInstanceId to throw a backend error.
- const stub = sinon.stub(FirebaseInstanceIdRequestHandler.prototype, 'deleteInstanceId')
- .returns(Promise.reject(expectedError));
+ const originalError = new FirebaseInstallationsError(InstallationsClientErrorCode.API_ERROR);
+ const stub = sinon.stub(Installations.prototype, 'deleteInstallation')
+ .rejects(originalError);
stubs.push(stub);
return iid.deleteInstanceId(testInstanceId)
.then(() => {
@@ -183,7 +186,9 @@ describe('InstanceId', () => {
// Confirm underlying API called with expected parameters.
expect(stub).to.have.been.calledOnce.and.calledWith(testInstanceId);
// Confirm expected error returned.
- expect(error).to.equal(expectedError);
+ const expectedError = new FirebaseInstanceIdError(InstanceIdClientErrorCode.API_ERROR);
+ expect(error).to.be.instanceOf(FirebaseInstanceIdError)
+ expect(error).to.deep.include(expectedError);
});
});
});
diff --git a/test/unit/utils/index.spec.ts b/test/unit/utils/index.spec.ts
index f85510f33c..7d007f2f78 100644
--- a/test/unit/utils/index.spec.ts
+++ b/test/unit/utils/index.spec.ts
@@ -22,7 +22,7 @@ import * as sinon from 'sinon';
import * as mocks from '../../resources/mocks';
import {
addReadonlyGetter, getExplicitProjectId, findProjectId,
- toWebSafeBase64, formatString, generateUpdateMask,
+ toWebSafeBase64, formatString, generateUpdateMask, transformMillisecondsToSecondsString,
} from '../../../src/utils/index';
import { isNonEmptyString } from '../../../src/utils/validator';
import { FirebaseApp } from '../../../src/app/firebase-app';
@@ -383,3 +383,16 @@ describe('generateUpdateMask()', () => {
.to.deep.equal(['b', 'c', 'd', 'e', 'f', 'k', 'l', 'n']);
});
});
+
+
+describe('transformMillisecondsToSecondsString()', () => {
+ [
+ [3000.000001, '3s'], [3000.001, '3.000001000s'],
+ [3000, '3s'], [3500, '3.500000000s']
+ ].forEach((duration) => {
+ it('should transform to protobuf duration string when provided milliseconds:' + JSON.stringify(duration[0]),
+ () => {
+ expect(transformMillisecondsToSecondsString(duration[0] as number)).to.equal(duration[1]);
+ });
+ });
+});
diff --git a/test/unit/utils/jwt.spec.ts b/test/unit/utils/jwt.spec.ts
index 3b7a02a4de..4f31c88a16 100644
--- a/test/unit/utils/jwt.spec.ts
+++ b/test/unit/utils/jwt.spec.ts
@@ -685,7 +685,7 @@ describe('JwksFetcher', () => {
expect(https.request).not.to.have.been.called;
return jwksFetcher.fetchPublicKeys()
- .then((result) => {
+ .then((result) => {
expect(https.request).to.have.been.calledOnce;
expect(result).to.have.key(mocks.jwksResponse.keys[0].kid);
});