firebase-admin 13.10.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/lib/app/core.d.ts +2 -38
- package/lib/app/core.js +1 -1
- package/lib/app/credential-factory.d.ts +1 -1
- package/lib/app/credential-factory.js +1 -1
- package/lib/app/credential-internal.d.ts +1 -1
- package/lib/app/credential-internal.js +45 -14
- package/lib/app/credential.d.ts +1 -1
- package/lib/app/credential.js +1 -1
- package/lib/app/error.d.ts +47 -0
- package/lib/app/error.js +57 -0
- package/lib/app/firebase-app.d.ts +1 -1
- package/lib/app/firebase-app.js +28 -12
- package/lib/app/index.d.ts +4 -3
- package/lib/app/index.js +6 -4
- package/lib/app/lifecycle.d.ts +2 -2
- package/lib/app/lifecycle.js +46 -21
- package/lib/app-check/app-check-api-client-internal.d.ts +2 -16
- package/lib/app-check/app-check-api-client-internal.js +57 -48
- package/lib/app-check/app-check-api.d.ts +1 -1
- package/lib/app-check/app-check-api.js +1 -1
- package/lib/app-check/app-check.d.ts +1 -1
- package/lib/app-check/app-check.js +6 -2
- package/lib/app-check/error.d.ts +47 -0
- package/lib/app-check/error.js +65 -0
- package/lib/app-check/index.d.ts +2 -1
- package/lib/app-check/index.js +5 -2
- package/lib/app-check/token-generator.d.ts +1 -1
- package/lib/app-check/token-generator.js +43 -13
- package/lib/app-check/token-verifier.d.ts +1 -1
- package/lib/app-check/token-verifier.js +39 -11
- package/lib/auth/action-code-settings-builder.d.ts +1 -1
- package/lib/auth/action-code-settings-builder.js +16 -16
- package/lib/auth/auth-api-request.d.ts +6 -4
- package/lib/auth/auth-api-request.js +277 -166
- package/lib/auth/auth-config.d.ts +31 -2
- package/lib/auth/auth-config.js +103 -103
- package/lib/auth/auth.d.ts +1 -1
- package/lib/auth/auth.js +1 -1
- package/lib/auth/base-auth.d.ts +2 -1
- package/lib/auth/base-auth.js +29 -27
- package/lib/auth/error.d.ts +137 -0
- package/lib/auth/error.js +690 -0
- package/lib/auth/identifier.d.ts +1 -1
- package/lib/auth/identifier.js +1 -1
- package/lib/auth/index.d.ts +2 -2
- package/lib/auth/index.js +4 -4
- package/lib/auth/project-config-manager.d.ts +1 -1
- package/lib/auth/project-config-manager.js +1 -1
- package/lib/auth/project-config.d.ts +1 -1
- package/lib/auth/project-config.js +4 -4
- package/lib/auth/tenant-manager.d.ts +2 -1
- package/lib/auth/tenant-manager.js +13 -10
- package/lib/auth/tenant.d.ts +1 -1
- package/lib/auth/tenant.js +7 -7
- package/lib/auth/token-generator.d.ts +1 -1
- package/lib/auth/token-generator.js +13 -13
- package/lib/auth/token-verifier.d.ts +1 -1
- package/lib/auth/token-verifier.js +22 -22
- package/lib/auth/user-import-builder.d.ts +1 -1
- package/lib/auth/user-import-builder.js +22 -22
- package/lib/auth/user-record.d.ts +1 -1
- package/lib/auth/user-record.js +6 -6
- package/lib/credential/index.d.ts +1 -1
- package/lib/credential/index.js +1 -1
- package/lib/data-connect/data-connect-api-client-internal.d.ts +1 -16
- package/lib/data-connect/data-connect-api-client-internal.js +122 -65
- package/lib/data-connect/data-connect-api.d.ts +1 -1
- package/lib/data-connect/data-connect-api.js +1 -1
- package/lib/data-connect/data-connect.d.ts +1 -1
- package/lib/data-connect/data-connect.js +1 -1
- package/lib/data-connect/error.d.ts +47 -0
- package/lib/data-connect/error.js +66 -0
- package/lib/data-connect/index.d.ts +2 -1
- package/lib/data-connect/index.js +5 -2
- package/lib/data-connect/validate-admin-args.d.ts +1 -1
- package/lib/data-connect/validate-admin-args.js +6 -3
- package/lib/database/database.d.ts +1 -1
- package/lib/database/database.js +11 -6
- package/lib/database/error.d.ts +39 -0
- package/lib/database/error.js +49 -0
- package/lib/database/index.d.ts +2 -2
- package/lib/database/index.js +4 -3
- package/lib/esm/app/index.js +2 -1
- package/lib/esm/app-check/index.js +2 -0
- package/lib/esm/auth/index.js +1 -1
- package/lib/esm/data-connect/index.js +2 -0
- package/lib/esm/database/index.js +1 -0
- package/lib/esm/eventarc/index.js +2 -0
- package/lib/esm/extensions/index.js +2 -0
- package/lib/esm/firebase-admin/index.js +13 -0
- package/lib/esm/firestore/index.js +1 -0
- package/lib/esm/functions/index.js +2 -0
- package/lib/esm/installations/index.js +1 -1
- package/lib/esm/machine-learning/index.js +2 -0
- package/lib/esm/messaging/index.js +1 -1
- package/lib/esm/phone-number-verification/index.js +2 -0
- package/lib/esm/project-management/index.js +1 -0
- package/lib/esm/remote-config/index.js +2 -0
- package/lib/esm/security-rules/index.js +2 -0
- package/lib/esm/storage/index.js +2 -0
- package/lib/eventarc/cloudevent.d.ts +1 -1
- package/lib/eventarc/cloudevent.js +1 -1
- package/lib/eventarc/error.d.ts +38 -0
- package/lib/eventarc/error.js +47 -0
- package/lib/eventarc/eventarc-client-internal.d.ts +1 -1
- package/lib/eventarc/eventarc-client-internal.js +24 -9
- package/lib/eventarc/eventarc-utils.d.ts +1 -13
- package/lib/eventarc/eventarc-utils.js +34 -24
- package/lib/eventarc/eventarc.d.ts +1 -1
- package/lib/eventarc/eventarc.js +18 -6
- package/lib/eventarc/index.d.ts +2 -1
- package/lib/eventarc/index.js +5 -2
- package/lib/extensions/error.d.ts +41 -0
- package/lib/extensions/error.js +50 -0
- package/lib/extensions/extensions-api-client-internal.d.ts +1 -13
- package/lib/extensions/extensions-api-client-internal.js +40 -28
- package/lib/extensions/extensions-api.d.ts +1 -1
- package/lib/extensions/extensions-api.js +1 -1
- package/lib/extensions/extensions.d.ts +1 -1
- package/lib/extensions/extensions.js +18 -5
- package/lib/extensions/index.d.ts +2 -1
- package/lib/extensions/index.js +5 -2
- package/lib/firestore/error.d.ts +41 -0
- package/lib/firestore/error.js +51 -0
- package/lib/firestore/firestore-internal.d.ts +2 -1
- package/lib/firestore/firestore-internal.js +6 -6
- package/lib/firestore/index.d.ts +2 -2
- package/lib/firestore/index.js +7 -7
- package/lib/functions/error.d.ts +48 -0
- package/lib/functions/error.js +67 -0
- package/lib/functions/functions-api-client-internal.d.ts +1 -16
- package/lib/functions/functions-api-client-internal.js +111 -71
- package/lib/functions/functions-api.d.ts +1 -1
- package/lib/functions/functions-api.js +1 -1
- package/lib/functions/functions.d.ts +1 -1
- package/lib/functions/functions.js +14 -4
- package/lib/functions/index.d.ts +2 -1
- package/lib/functions/index.js +5 -2
- package/lib/index.d.ts +13 -8
- package/lib/index.js +19 -3
- package/lib/installations/error.d.ts +48 -0
- package/lib/installations/error.js +73 -0
- package/lib/installations/index.d.ts +2 -2
- package/lib/installations/index.js +4 -4
- package/lib/installations/installations-request-handler.d.ts +1 -1
- package/lib/installations/installations-request-handler.js +11 -5
- package/lib/installations/installations.d.ts +1 -1
- package/lib/installations/installations.js +3 -3
- package/lib/machine-learning/error.d.ts +53 -0
- package/lib/machine-learning/error.js +84 -0
- package/lib/machine-learning/index.d.ts +2 -1
- package/lib/machine-learning/index.js +5 -2
- package/lib/machine-learning/machine-learning-api-client.d.ts +1 -1
- package/lib/machine-learning/machine-learning-api-client.js +61 -24
- package/lib/machine-learning/machine-learning.d.ts +1 -1
- package/lib/machine-learning/machine-learning.js +21 -9
- package/lib/messaging/error.d.ts +63 -0
- package/lib/messaging/error.js +286 -0
- package/lib/messaging/index.d.ts +3 -3
- package/lib/messaging/index.js +4 -4
- package/lib/messaging/messaging-api-request-internal.d.ts +1 -1
- package/lib/messaging/messaging-api-request-internal.js +1 -1
- package/lib/messaging/messaging-api.d.ts +1 -280
- package/lib/messaging/messaging-api.js +1 -1
- package/lib/messaging/messaging-errors-internal.d.ts +2 -2
- package/lib/messaging/messaging-errors-internal.js +11 -8
- package/lib/messaging/messaging-internal.d.ts +1 -1
- package/lib/messaging/messaging-internal.js +48 -48
- package/lib/messaging/messaging.d.ts +1 -1
- package/lib/messaging/messaging.js +47 -50
- package/lib/phone-number-verification/error.d.ts +43 -0
- package/lib/phone-number-verification/error.js +48 -0
- package/lib/phone-number-verification/index.d.ts +2 -1
- package/lib/phone-number-verification/index.js +5 -2
- package/lib/phone-number-verification/phone-number-verification-api-client-internal.d.ts +1 -18
- package/lib/phone-number-verification/phone-number-verification-api-client-internal.js +2 -26
- package/lib/phone-number-verification/phone-number-verification-api.d.ts +2 -2
- package/lib/phone-number-verification/phone-number-verification-api.js +5 -4
- package/lib/phone-number-verification/phone-number-verification.d.ts +1 -1
- package/lib/phone-number-verification/phone-number-verification.js +1 -1
- package/lib/phone-number-verification/token-verifier.d.ts +1 -1
- package/lib/phone-number-verification/token-verifier.js +68 -20
- package/lib/project-management/android-app.d.ts +1 -1
- package/lib/project-management/android-app.js +15 -6
- package/lib/project-management/app-metadata.d.ts +1 -1
- package/lib/project-management/app-metadata.js +1 -1
- package/lib/project-management/error.d.ts +45 -0
- package/lib/project-management/error.js +55 -0
- package/lib/project-management/index.d.ts +2 -2
- package/lib/project-management/index.js +4 -3
- package/lib/project-management/ios-app.d.ts +1 -1
- package/lib/project-management/ios-app.js +6 -3
- package/lib/project-management/project-management-api-request-internal.d.ts +1 -1
- package/lib/project-management/project-management-api-request-internal.js +18 -6
- package/lib/project-management/project-management.d.ts +1 -1
- package/lib/project-management/project-management.js +13 -7
- package/lib/remote-config/condition-evaluator-internal.d.ts +1 -1
- package/lib/remote-config/condition-evaluator-internal.js +2 -2
- package/lib/remote-config/error.d.ts +49 -0
- package/lib/remote-config/error.js +70 -0
- package/lib/remote-config/index.d.ts +2 -1
- package/lib/remote-config/index.js +5 -2
- package/lib/remote-config/internal/value-impl.d.ts +1 -1
- package/lib/remote-config/internal/value-impl.js +1 -1
- package/lib/remote-config/remote-config-api-client-internal.d.ts +2 -13
- package/lib/remote-config/remote-config-api-client-internal.js +80 -52
- package/lib/remote-config/remote-config-api.d.ts +1 -1
- package/lib/remote-config/remote-config-api.js +1 -1
- package/lib/remote-config/remote-config.d.ts +1 -1
- package/lib/remote-config/remote-config.js +92 -23
- package/lib/security-rules/error.d.ts +45 -0
- package/lib/security-rules/error.js +54 -0
- package/lib/security-rules/index.d.ts +2 -1
- package/lib/security-rules/index.js +5 -2
- package/lib/security-rules/security-rules-api-client-internal.d.ts +1 -1
- package/lib/security-rules/security-rules-api-client-internal.js +50 -18
- package/lib/security-rules/security-rules.d.ts +1 -1
- package/lib/security-rules/security-rules.js +32 -11
- package/lib/storage/error.d.ts +41 -0
- package/lib/storage/error.js +50 -0
- package/lib/storage/index.d.ts +2 -1
- package/lib/storage/index.js +8 -5
- package/lib/storage/storage.d.ts +1 -1
- package/lib/storage/storage.js +12 -12
- package/lib/storage/utils.d.ts +1 -1
- package/lib/storage/utils.js +1 -1
- package/lib/utils/api-request.d.ts +12 -12
- package/lib/utils/api-request.js +97 -55
- package/lib/utils/crypto-signer.d.ts +1 -1
- package/lib/utils/crypto-signer.js +2 -7
- package/lib/utils/deep-copy.d.ts +1 -1
- package/lib/utils/deep-copy.js +1 -1
- package/lib/utils/error.d.ts +75 -570
- package/lib/utils/error.js +53 -1047
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/jwt.d.ts +1 -1
- package/lib/utils/jwt.js +1 -2
- package/lib/utils/validator.d.ts +1 -1
- package/lib/utils/validator.js +1 -1
- package/package.json +24 -29
- package/lib/app/firebase-namespace.d.ts +0 -163
- package/lib/app/firebase-namespace.js +0 -335
- package/lib/app-check/app-check-namespace.d.ts +0 -72
- package/lib/app-check/app-check-namespace.js +0 -18
- package/lib/auth/auth-namespace.d.ts +0 -257
- package/lib/auth/auth-namespace.js +0 -18
- package/lib/database/database-namespace.d.ts +0 -95
- package/lib/database/database-namespace.js +0 -23
- package/lib/default-namespace.d.ts +0 -24
- package/lib/default-namespace.js +0 -30
- package/lib/esm/instance-id/index.js +0 -6
- package/lib/firebase-namespace-api.d.ts +0 -91
- package/lib/firebase-namespace-api.js +0 -58
- package/lib/firestore/firestore-namespace.d.ts +0 -71
- package/lib/firestore/firestore-namespace.js +0 -52
- package/lib/installations/installations-namespace.d.ts +0 -55
- package/lib/installations/installations-namespace.js +0 -18
- package/lib/instance-id/index.d.ts +0 -62
- package/lib/instance-id/index.js +0 -74
- package/lib/instance-id/instance-id-namespace.d.ts +0 -38
- package/lib/instance-id/instance-id-namespace.js +0 -3
- package/lib/instance-id/instance-id.d.ts +0 -47
- package/lib/instance-id/instance-id.js +0 -77
- package/lib/machine-learning/machine-learning-namespace.d.ts +0 -81
- package/lib/machine-learning/machine-learning-namespace.js +0 -18
- package/lib/machine-learning/machine-learning-utils.d.ts +0 -22
- package/lib/machine-learning/machine-learning-utils.js +0 -47
- package/lib/messaging/messaging-namespace.d.ts +0 -161
- package/lib/messaging/messaging-namespace.js +0 -18
- package/lib/project-management/project-management-namespace.d.ts +0 -82
- package/lib/project-management/project-management-namespace.js +0 -18
- package/lib/remote-config/remote-config-namespace.d.ts +0 -141
- package/lib/remote-config/remote-config-namespace.js +0 -18
- package/lib/security-rules/security-rules-internal.d.ts +0 -21
- package/lib/security-rules/security-rules-internal.js +0 -26
- package/lib/security-rules/security-rules-namespace.d.ts +0 -69
- package/lib/security-rules/security-rules-namespace.js +0 -18
- package/lib/storage/storage-namespace.d.ts +0 -45
- package/lib/storage/storage-namespace.js +0 -18
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! firebase-admin
|
|
1
|
+
/*! firebase-admin v14.0.0 */
|
|
2
2
|
"use strict";
|
|
3
3
|
/*!
|
|
4
4
|
* Copyright 2018 Google LLC
|
|
@@ -21,7 +21,7 @@ exports.convertMultiFactorInfoToServerFormat = convertMultiFactorInfoToServerFor
|
|
|
21
21
|
const deep_copy_1 = require("../utils/deep-copy");
|
|
22
22
|
const utils = require("../utils");
|
|
23
23
|
const validator = require("../utils/validator");
|
|
24
|
-
const error_1 = require("
|
|
24
|
+
const error_1 = require("./error");
|
|
25
25
|
/**
|
|
26
26
|
* Converts a client format second factor object to server format.
|
|
27
27
|
* @param multiFactorInfo - The client format second factor.
|
|
@@ -35,7 +35,7 @@ function convertMultiFactorInfoToServerFormat(multiFactorInfo) {
|
|
|
35
35
|
enrolledAt = new Date(multiFactorInfo.enrollmentTime).toISOString();
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
38
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_ENROLLMENT_TIME, `The second factor "enrollmentTime" for "${multiFactorInfo.uid}" must be a valid ` +
|
|
39
39
|
'UTC date string.');
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -58,7 +58,7 @@ function convertMultiFactorInfoToServerFormat(multiFactorInfo) {
|
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
60
60
|
// Unsupported second factor.
|
|
61
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
61
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.UNSUPPORTED_SECOND_FACTOR, `Unsupported second factor "${JSON.stringify(multiFactorInfo)}" provided.`);
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
function isPhoneFactor(multiFactorInfo) {
|
|
@@ -98,13 +98,13 @@ function populateUploadAccountUser(user, userValidator) {
|
|
|
98
98
|
};
|
|
99
99
|
if (typeof user.passwordHash !== 'undefined') {
|
|
100
100
|
if (!validator.isBuffer(user.passwordHash)) {
|
|
101
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
101
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_PASSWORD_HASH);
|
|
102
102
|
}
|
|
103
103
|
result.passwordHash = utils.toWebSafeBase64(user.passwordHash);
|
|
104
104
|
}
|
|
105
105
|
if (typeof user.passwordSalt !== 'undefined') {
|
|
106
106
|
if (!validator.isBuffer(user.passwordSalt)) {
|
|
107
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
107
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_PASSWORD_SALT);
|
|
108
108
|
}
|
|
109
109
|
result.salt = utils.toWebSafeBase64(user.passwordSalt);
|
|
110
110
|
}
|
|
@@ -203,7 +203,7 @@ class UserImportBuilder {
|
|
|
203
203
|
importResult.errors.push({
|
|
204
204
|
// Map backend request index to original developer provided array index.
|
|
205
205
|
index: this.indexMap[failedUpload.index],
|
|
206
|
-
error: new error_1.FirebaseAuthError(error_1.
|
|
206
|
+
error: new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_USER_IMPORT, failedUpload.message),
|
|
207
207
|
});
|
|
208
208
|
});
|
|
209
209
|
// Sort errors by index.
|
|
@@ -226,14 +226,14 @@ class UserImportBuilder {
|
|
|
226
226
|
return {};
|
|
227
227
|
}
|
|
228
228
|
if (!validator.isNonNullObject(options)) {
|
|
229
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
229
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_ARGUMENT, '"UserImportOptions" are required when importing users with passwords.');
|
|
230
230
|
}
|
|
231
231
|
if (!validator.isNonNullObject(options.hash)) {
|
|
232
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
232
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.MISSING_HASH_ALGORITHM, '"hash.algorithm" is missing from the provided "UserImportOptions".');
|
|
233
233
|
}
|
|
234
234
|
if (typeof options.hash.algorithm === 'undefined' ||
|
|
235
235
|
!validator.isNonEmptyString(options.hash.algorithm)) {
|
|
236
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
236
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_ALGORITHM, '"hash.algorithm" must be a string matching the list of supported algorithms.');
|
|
237
237
|
}
|
|
238
238
|
let rounds;
|
|
239
239
|
switch (options.hash.algorithm) {
|
|
@@ -242,7 +242,7 @@ class UserImportBuilder {
|
|
|
242
242
|
case 'HMAC_SHA1':
|
|
243
243
|
case 'HMAC_MD5':
|
|
244
244
|
if (!validator.isBuffer(options.hash.key)) {
|
|
245
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
245
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_KEY, 'A non-empty "hash.key" byte buffer must be provided for ' +
|
|
246
246
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
247
247
|
}
|
|
248
248
|
populatedOptions = {
|
|
@@ -258,7 +258,7 @@ class UserImportBuilder {
|
|
|
258
258
|
rounds = getNumberField(options.hash, 'rounds');
|
|
259
259
|
const minRounds = options.hash.algorithm === 'MD5' ? 0 : 1;
|
|
260
260
|
if (isNaN(rounds) || rounds < minRounds || rounds > 8192) {
|
|
261
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
261
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_ROUNDS, `A valid "hash.rounds" number between ${minRounds} and 8192 must be provided for ` +
|
|
262
262
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
263
263
|
}
|
|
264
264
|
populatedOptions = {
|
|
@@ -271,7 +271,7 @@ class UserImportBuilder {
|
|
|
271
271
|
case 'PBKDF2_SHA256':
|
|
272
272
|
rounds = getNumberField(options.hash, 'rounds');
|
|
273
273
|
if (isNaN(rounds) || rounds < 0 || rounds > 120000) {
|
|
274
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
274
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_ROUNDS, 'A valid "hash.rounds" number between 0 and 120000 must be provided for ' +
|
|
275
275
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
276
276
|
}
|
|
277
277
|
populatedOptions = {
|
|
@@ -281,22 +281,22 @@ class UserImportBuilder {
|
|
|
281
281
|
break;
|
|
282
282
|
case 'SCRYPT': {
|
|
283
283
|
if (!validator.isBuffer(options.hash.key)) {
|
|
284
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
284
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_KEY, 'A "hash.key" byte buffer must be provided for ' +
|
|
285
285
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
286
286
|
}
|
|
287
287
|
rounds = getNumberField(options.hash, 'rounds');
|
|
288
288
|
if (isNaN(rounds) || rounds <= 0 || rounds > 8) {
|
|
289
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
289
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_ROUNDS, 'A valid "hash.rounds" number between 1 and 8 must be provided for ' +
|
|
290
290
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
291
291
|
}
|
|
292
292
|
const memoryCost = getNumberField(options.hash, 'memoryCost');
|
|
293
293
|
if (isNaN(memoryCost) || memoryCost <= 0 || memoryCost > 14) {
|
|
294
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
294
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_MEMORY_COST, 'A valid "hash.memoryCost" number between 1 and 14 must be provided for ' +
|
|
295
295
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
296
296
|
}
|
|
297
297
|
if (typeof options.hash.saltSeparator !== 'undefined' &&
|
|
298
298
|
!validator.isBuffer(options.hash.saltSeparator)) {
|
|
299
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
299
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_SALT_SEPARATOR, '"hash.saltSeparator" must be a byte buffer.');
|
|
300
300
|
}
|
|
301
301
|
populatedOptions = {
|
|
302
302
|
hashAlgorithm: options.hash.algorithm,
|
|
@@ -315,22 +315,22 @@ class UserImportBuilder {
|
|
|
315
315
|
case 'STANDARD_SCRYPT': {
|
|
316
316
|
const cpuMemCost = getNumberField(options.hash, 'memoryCost');
|
|
317
317
|
if (isNaN(cpuMemCost)) {
|
|
318
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
318
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_MEMORY_COST, 'A valid "hash.memoryCost" number must be provided for ' +
|
|
319
319
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
320
320
|
}
|
|
321
321
|
const parallelization = getNumberField(options.hash, 'parallelization');
|
|
322
322
|
if (isNaN(parallelization)) {
|
|
323
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
323
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_PARALLELIZATION, 'A valid "hash.parallelization" number must be provided for ' +
|
|
324
324
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
325
325
|
}
|
|
326
326
|
const blockSize = getNumberField(options.hash, 'blockSize');
|
|
327
327
|
if (isNaN(blockSize)) {
|
|
328
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
328
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_BLOCK_SIZE, 'A valid "hash.blockSize" number must be provided for ' +
|
|
329
329
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
330
330
|
}
|
|
331
331
|
const dkLen = getNumberField(options.hash, 'derivedKeyLength');
|
|
332
332
|
if (isNaN(dkLen)) {
|
|
333
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
333
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_DERIVED_KEY_LENGTH, 'A valid "hash.derivedKeyLength" number must be provided for ' +
|
|
334
334
|
`hash algorithm ${options.hash.algorithm}.`);
|
|
335
335
|
}
|
|
336
336
|
populatedOptions = {
|
|
@@ -343,7 +343,7 @@ class UserImportBuilder {
|
|
|
343
343
|
break;
|
|
344
344
|
}
|
|
345
345
|
default:
|
|
346
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
346
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INVALID_HASH_ALGORITHM, `Unsupported hash algorithm provider "${options.hash.algorithm}".`);
|
|
347
347
|
}
|
|
348
348
|
return populatedOptions;
|
|
349
349
|
}
|
package/lib/auth/user-record.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! firebase-admin
|
|
1
|
+
/*! firebase-admin v14.0.0 */
|
|
2
2
|
"use strict";
|
|
3
3
|
/*!
|
|
4
4
|
* @license
|
|
@@ -21,7 +21,7 @@ exports.UserRecord = exports.UserInfo = exports.UserMetadata = exports.MultiFact
|
|
|
21
21
|
const deep_copy_1 = require("../utils/deep-copy");
|
|
22
22
|
const validator_1 = require("../utils/validator");
|
|
23
23
|
const utils = require("../utils");
|
|
24
|
-
const error_1 = require("
|
|
24
|
+
const error_1 = require("./error");
|
|
25
25
|
/**
|
|
26
26
|
* 'REDACTED', encoded as a base64 string.
|
|
27
27
|
*/
|
|
@@ -110,7 +110,7 @@ class MultiFactorInfo {
|
|
|
110
110
|
initFromServerResponse(response) {
|
|
111
111
|
const factorId = response && this.getFactorId(response);
|
|
112
112
|
if (!factorId || !response || !response.mfaEnrollmentId) {
|
|
113
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
113
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INTERNAL_ERROR, 'INTERNAL ASSERT FAILED: Invalid multi-factor info response');
|
|
114
114
|
}
|
|
115
115
|
utils.addReadonlyGetter(this, 'uid', response.mfaEnrollmentId);
|
|
116
116
|
utils.addReadonlyGetter(this, 'factorId', factorId);
|
|
@@ -222,7 +222,7 @@ class MultiFactorSettings {
|
|
|
222
222
|
constructor(response) {
|
|
223
223
|
const parsedEnrolledFactors = [];
|
|
224
224
|
if (!(0, validator_1.isNonNullObject)(response)) {
|
|
225
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
225
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INTERNAL_ERROR, 'INTERNAL ASSERT FAILED: Invalid multi-factor response');
|
|
226
226
|
}
|
|
227
227
|
else if (response.mfaInfo) {
|
|
228
228
|
response.mfaInfo.forEach((factorResponse) => {
|
|
@@ -295,7 +295,7 @@ class UserInfo {
|
|
|
295
295
|
constructor(response) {
|
|
296
296
|
// Provider user id and provider id are required.
|
|
297
297
|
if (!response.rawId || !response.providerId) {
|
|
298
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
298
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INTERNAL_ERROR, 'INTERNAL ASSERT FAILED: Invalid user info response');
|
|
299
299
|
}
|
|
300
300
|
utils.addReadonlyGetter(this, 'uid', response.rawId);
|
|
301
301
|
utils.addReadonlyGetter(this, 'displayName', response.displayName);
|
|
@@ -334,7 +334,7 @@ class UserRecord {
|
|
|
334
334
|
constructor(response) {
|
|
335
335
|
// The Firebase user id is required.
|
|
336
336
|
if (!response.localId) {
|
|
337
|
-
throw new error_1.FirebaseAuthError(error_1.
|
|
337
|
+
throw new error_1.FirebaseAuthError(error_1.authClientErrorCode.INTERNAL_ERROR, 'INTERNAL ASSERT FAILED: Invalid user response');
|
|
338
338
|
}
|
|
339
339
|
utils.addReadonlyGetter(this, 'uid', response.localId);
|
|
340
340
|
utils.addReadonlyGetter(this, 'email', response.email);
|
package/lib/credential/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! firebase-admin
|
|
1
|
+
/*! firebase-admin v14.0.0 */
|
|
2
2
|
/*!
|
|
3
3
|
* @license
|
|
4
4
|
* Copyright 2024 Google LLC
|
|
@@ -15,23 +15,8 @@
|
|
|
15
15
|
* See the License for the specific language governing permissions and
|
|
16
16
|
* limitations under the License.
|
|
17
17
|
*/
|
|
18
|
-
import { PrefixedFirebaseError } from '../utils/error';
|
|
19
18
|
/**
|
|
20
19
|
* When true the SDK should communicate with the Data Connect Emulator for all API
|
|
21
20
|
* calls and also produce unsigned tokens.
|
|
22
21
|
*/
|
|
23
22
|
export declare function useEmulator(): boolean;
|
|
24
|
-
export declare const DATA_CONNECT_ERROR_CODE_MAPPING: {
|
|
25
|
-
[key: string]: DataConnectErrorCode;
|
|
26
|
-
};
|
|
27
|
-
export type DataConnectErrorCode = 'aborted' | 'invalid-argument' | 'invalid-credential' | 'internal-error' | 'permission-denied' | 'unauthenticated' | 'not-found' | 'unknown-error' | 'query-error';
|
|
28
|
-
/**
|
|
29
|
-
* Firebase Data Connect error code structure. This extends PrefixedFirebaseError.
|
|
30
|
-
*
|
|
31
|
-
* @param code - The error code.
|
|
32
|
-
* @param message - The error message.
|
|
33
|
-
* @constructor
|
|
34
|
-
*/
|
|
35
|
-
export declare class FirebaseDataConnectError extends PrefixedFirebaseError {
|
|
36
|
-
constructor(code: DataConnectErrorCode, message: string);
|
|
37
|
-
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! firebase-admin
|
|
1
|
+
/*! firebase-admin v14.0.0 */
|
|
2
2
|
"use strict";
|
|
3
3
|
/*!
|
|
4
4
|
* @license
|
|
@@ -17,10 +17,11 @@
|
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.
|
|
20
|
+
exports.DataConnectApiClient = void 0;
|
|
21
21
|
exports.useEmulator = useEmulator;
|
|
22
22
|
const api_request_1 = require("../utils/api-request");
|
|
23
23
|
const error_1 = require("../utils/error");
|
|
24
|
+
const error_2 = require("./error");
|
|
24
25
|
const utils = require("../utils/index");
|
|
25
26
|
const validator = require("../utils/validator");
|
|
26
27
|
const API_VERSION = 'v1';
|
|
@@ -69,7 +70,10 @@ class DataConnectApiClient {
|
|
|
69
70
|
this.app = app;
|
|
70
71
|
this.isUsingGen = false;
|
|
71
72
|
if (!validator.isNonNullObject(app) || !('options' in app)) {
|
|
72
|
-
throw new FirebaseDataConnectError(
|
|
73
|
+
throw new error_2.FirebaseDataConnectError({
|
|
74
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
75
|
+
message: 'First argument passed to getDataConnect() must be a valid Firebase app instance.'
|
|
76
|
+
});
|
|
73
77
|
}
|
|
74
78
|
this.httpClient = new DataConnectHttpClient(app);
|
|
75
79
|
}
|
|
@@ -111,11 +115,17 @@ class DataConnectApiClient {
|
|
|
111
115
|
*/
|
|
112
116
|
async executeGraphqlHelper(query, endpoint, options) {
|
|
113
117
|
if (!validator.isNonEmptyString(query)) {
|
|
114
|
-
throw new FirebaseDataConnectError(
|
|
118
|
+
throw new error_2.FirebaseDataConnectError({
|
|
119
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
120
|
+
message: '`query` must be a non-empty string.'
|
|
121
|
+
});
|
|
115
122
|
}
|
|
116
123
|
if (typeof options !== 'undefined') {
|
|
117
124
|
if (!validator.isNonNullObject(options)) {
|
|
118
|
-
throw new FirebaseDataConnectError(
|
|
125
|
+
throw new error_2.FirebaseDataConnectError({
|
|
126
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
127
|
+
message: 'GraphqlOptions must be a non-null object'
|
|
128
|
+
});
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
const data = {
|
|
@@ -162,11 +172,17 @@ class DataConnectApiClient {
|
|
|
162
172
|
async executeOperationHelper(endpoint, name, variables, options) {
|
|
163
173
|
if (typeof name === 'undefined' ||
|
|
164
174
|
!validator.isNonEmptyString(name)) {
|
|
165
|
-
throw new FirebaseDataConnectError(
|
|
175
|
+
throw new error_2.FirebaseDataConnectError({
|
|
176
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
177
|
+
message: '`name` must be a non-empty string.'
|
|
178
|
+
});
|
|
166
179
|
}
|
|
167
180
|
if (this.connectorConfig.connector === undefined || this.connectorConfig.connector === '') {
|
|
168
|
-
throw new FirebaseDataConnectError(
|
|
169
|
-
|
|
181
|
+
throw new error_2.FirebaseDataConnectError({
|
|
182
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
183
|
+
message: `The 'connectorConfig.connector' field used to instantiate your Data Connect
|
|
184
|
+
instance must be a non-empty string (the connectorId) when calling executeQuery or executeMutation.`
|
|
185
|
+
});
|
|
170
186
|
}
|
|
171
187
|
const data = {
|
|
172
188
|
...(variables && { variables: variables }),
|
|
@@ -242,9 +258,12 @@ class DataConnectApiClient {
|
|
|
242
258
|
return utils.findProjectId(this.app)
|
|
243
259
|
.then((projectId) => {
|
|
244
260
|
if (!validator.isNonEmptyString(projectId)) {
|
|
245
|
-
throw new FirebaseDataConnectError(
|
|
246
|
-
|
|
247
|
-
|
|
261
|
+
throw new error_2.FirebaseDataConnectError({
|
|
262
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.UNKNOWN,
|
|
263
|
+
message: 'Failed to determine project ID. Initialize the '
|
|
264
|
+
+ 'SDK with service account credentials or set project ID as an app option. '
|
|
265
|
+
+ 'Alternatively, set the GOOGLE_CLOUD_PROJECT environment variable.'
|
|
266
|
+
});
|
|
248
267
|
}
|
|
249
268
|
this.projectId = projectId;
|
|
250
269
|
return projectId;
|
|
@@ -267,27 +286,41 @@ class DataConnectApiClient {
|
|
|
267
286
|
const resp = await this.httpClient.send(request);
|
|
268
287
|
if (resp.data.errors && validator.isNonEmptyArray(resp.data.errors)) {
|
|
269
288
|
const allMessages = resp.data.errors.map((error) => error.message).join(' ');
|
|
270
|
-
throw new FirebaseDataConnectError(
|
|
289
|
+
throw new error_2.FirebaseDataConnectError({
|
|
290
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.QUERY_ERROR,
|
|
291
|
+
message: allMessages,
|
|
292
|
+
httpResponse: (0, error_1.toHttpResponse)(resp),
|
|
293
|
+
});
|
|
271
294
|
}
|
|
272
295
|
return Promise.resolve({
|
|
273
296
|
data: resp.data.data,
|
|
274
297
|
});
|
|
275
298
|
}
|
|
276
299
|
toFirebaseError(err) {
|
|
277
|
-
if (err instanceof error_1.
|
|
300
|
+
if (err instanceof error_1.FirebaseError) {
|
|
278
301
|
return err;
|
|
279
302
|
}
|
|
280
303
|
const response = err.response;
|
|
281
304
|
if (!response.isJson()) {
|
|
282
|
-
return new FirebaseDataConnectError(
|
|
305
|
+
return new error_2.FirebaseDataConnectError({
|
|
306
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.UNKNOWN,
|
|
307
|
+
message: `Unexpected response with status: ${response.status} and body: ${response.text}`,
|
|
308
|
+
httpResponse: (0, error_1.toHttpResponse)(response),
|
|
309
|
+
cause: err
|
|
310
|
+
});
|
|
283
311
|
}
|
|
284
312
|
const error = response.data.error || {};
|
|
285
|
-
let code =
|
|
286
|
-
if (error.status && error.status in
|
|
287
|
-
code =
|
|
288
|
-
}
|
|
289
|
-
const message = error.message ||
|
|
290
|
-
return new FirebaseDataConnectError(
|
|
313
|
+
let code = error_2.DATA_CONNECT_ERROR_CODE_MAPPING.UNKNOWN;
|
|
314
|
+
if (error.status && error.status in error_2.DATA_CONNECT_ERROR_CODE_MAPPING) {
|
|
315
|
+
code = error_2.DATA_CONNECT_ERROR_CODE_MAPPING[error.status];
|
|
316
|
+
}
|
|
317
|
+
const message = error.message || 'Unknown server error';
|
|
318
|
+
return new error_2.FirebaseDataConnectError({
|
|
319
|
+
code,
|
|
320
|
+
message,
|
|
321
|
+
httpResponse: (0, error_1.toHttpResponse)(response),
|
|
322
|
+
cause: err,
|
|
323
|
+
});
|
|
291
324
|
}
|
|
292
325
|
/**
|
|
293
326
|
* Converts JSON data into a GraphQL literal string.
|
|
@@ -337,8 +370,13 @@ class DataConnectApiClient {
|
|
|
337
370
|
return tableName;
|
|
338
371
|
}
|
|
339
372
|
handleBulkImportErrors(err) {
|
|
340
|
-
if (err.code === `data-connect/${
|
|
341
|
-
throw new FirebaseDataConnectError(
|
|
373
|
+
if (err.code === `data-connect/${error_2.DATA_CONNECT_ERROR_CODE_MAPPING.QUERY_ERROR}`) {
|
|
374
|
+
throw new error_2.FirebaseDataConnectError({
|
|
375
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.QUERY_ERROR,
|
|
376
|
+
message: `${err.message}. Make sure that your table name passed in matches the type name in your `
|
|
377
|
+
+ 'GraphQL schema file.',
|
|
378
|
+
cause: err,
|
|
379
|
+
});
|
|
342
380
|
}
|
|
343
381
|
throw err;
|
|
344
382
|
}
|
|
@@ -347,13 +385,23 @@ class DataConnectApiClient {
|
|
|
347
385
|
*/
|
|
348
386
|
async insert(tableName, data) {
|
|
349
387
|
if (!validator.isNonEmptyString(tableName)) {
|
|
350
|
-
throw new FirebaseDataConnectError(
|
|
388
|
+
throw new error_2.FirebaseDataConnectError({
|
|
389
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
390
|
+
message: '`tableName` must be a non-empty string.'
|
|
391
|
+
});
|
|
351
392
|
}
|
|
352
393
|
if (validator.isArray(data)) {
|
|
353
|
-
throw new FirebaseDataConnectError(
|
|
394
|
+
throw new error_2.FirebaseDataConnectError({
|
|
395
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
396
|
+
message: '`data` must be an object, not an array, for single insert. For arrays, please use '
|
|
397
|
+
+ '`insertMany` function.'
|
|
398
|
+
});
|
|
354
399
|
}
|
|
355
400
|
if (!validator.isNonNullObject(data)) {
|
|
356
|
-
throw new FirebaseDataConnectError(
|
|
401
|
+
throw new error_2.FirebaseDataConnectError({
|
|
402
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
403
|
+
message: '`data` must be a non-null object.'
|
|
404
|
+
});
|
|
357
405
|
}
|
|
358
406
|
try {
|
|
359
407
|
tableName = this.formatTableName(tableName);
|
|
@@ -363,7 +411,11 @@ class DataConnectApiClient {
|
|
|
363
411
|
return this.executeGraphql(mutation).catch(this.handleBulkImportErrors);
|
|
364
412
|
}
|
|
365
413
|
catch (e) {
|
|
366
|
-
throw new FirebaseDataConnectError(
|
|
414
|
+
throw new error_2.FirebaseDataConnectError({
|
|
415
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INTERNAL,
|
|
416
|
+
message: `Failed to construct insert mutation: ${e.message}`,
|
|
417
|
+
cause: e,
|
|
418
|
+
});
|
|
367
419
|
}
|
|
368
420
|
}
|
|
369
421
|
/**
|
|
@@ -371,10 +423,16 @@ class DataConnectApiClient {
|
|
|
371
423
|
*/
|
|
372
424
|
async insertMany(tableName, data) {
|
|
373
425
|
if (!validator.isNonEmptyString(tableName)) {
|
|
374
|
-
throw new FirebaseDataConnectError(
|
|
426
|
+
throw new error_2.FirebaseDataConnectError({
|
|
427
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
428
|
+
message: '`tableName` must be a non-empty string.'
|
|
429
|
+
});
|
|
375
430
|
}
|
|
376
431
|
if (!validator.isNonEmptyArray(data)) {
|
|
377
|
-
throw new FirebaseDataConnectError(
|
|
432
|
+
throw new error_2.FirebaseDataConnectError({
|
|
433
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
434
|
+
message: '`data` must be a non-empty array for insertMany.',
|
|
435
|
+
});
|
|
378
436
|
}
|
|
379
437
|
try {
|
|
380
438
|
tableName = this.formatTableName(tableName);
|
|
@@ -384,7 +442,11 @@ class DataConnectApiClient {
|
|
|
384
442
|
return this.executeGraphql(mutation).catch(this.handleBulkImportErrors);
|
|
385
443
|
}
|
|
386
444
|
catch (e) {
|
|
387
|
-
throw new FirebaseDataConnectError(
|
|
445
|
+
throw new error_2.FirebaseDataConnectError({
|
|
446
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INTERNAL,
|
|
447
|
+
message: `Failed to construct insertMany mutation: ${e.message}`,
|
|
448
|
+
cause: e,
|
|
449
|
+
});
|
|
388
450
|
}
|
|
389
451
|
}
|
|
390
452
|
/**
|
|
@@ -392,13 +454,23 @@ class DataConnectApiClient {
|
|
|
392
454
|
*/
|
|
393
455
|
async upsert(tableName, data) {
|
|
394
456
|
if (!validator.isNonEmptyString(tableName)) {
|
|
395
|
-
throw new FirebaseDataConnectError(
|
|
457
|
+
throw new error_2.FirebaseDataConnectError({
|
|
458
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
459
|
+
message: '`tableName` must be a non-empty string.'
|
|
460
|
+
});
|
|
396
461
|
}
|
|
397
462
|
if (validator.isArray(data)) {
|
|
398
|
-
throw new FirebaseDataConnectError(
|
|
463
|
+
throw new error_2.FirebaseDataConnectError({
|
|
464
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
465
|
+
message: '`data` must be an object, not an array, for single upsert. For arrays, please use '
|
|
466
|
+
+ '`upsertMany` function.'
|
|
467
|
+
});
|
|
399
468
|
}
|
|
400
469
|
if (!validator.isNonNullObject(data)) {
|
|
401
|
-
throw new FirebaseDataConnectError(
|
|
470
|
+
throw new error_2.FirebaseDataConnectError({
|
|
471
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
472
|
+
message: '`data` must be a non-null object.'
|
|
473
|
+
});
|
|
402
474
|
}
|
|
403
475
|
try {
|
|
404
476
|
tableName = this.formatTableName(tableName);
|
|
@@ -408,7 +480,11 @@ class DataConnectApiClient {
|
|
|
408
480
|
return this.executeGraphql(mutation).catch(this.handleBulkImportErrors);
|
|
409
481
|
}
|
|
410
482
|
catch (e) {
|
|
411
|
-
throw new FirebaseDataConnectError(
|
|
483
|
+
throw new error_2.FirebaseDataConnectError({
|
|
484
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INTERNAL,
|
|
485
|
+
message: `Failed to construct upsert mutation: ${e.message}`,
|
|
486
|
+
cause: e,
|
|
487
|
+
});
|
|
412
488
|
}
|
|
413
489
|
}
|
|
414
490
|
/**
|
|
@@ -416,10 +492,16 @@ class DataConnectApiClient {
|
|
|
416
492
|
*/
|
|
417
493
|
async upsertMany(tableName, data) {
|
|
418
494
|
if (!validator.isNonEmptyString(tableName)) {
|
|
419
|
-
throw new FirebaseDataConnectError(
|
|
495
|
+
throw new error_2.FirebaseDataConnectError({
|
|
496
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
497
|
+
message: '`tableName` must be a non-empty string.'
|
|
498
|
+
});
|
|
420
499
|
}
|
|
421
500
|
if (!validator.isNonEmptyArray(data)) {
|
|
422
|
-
throw new FirebaseDataConnectError(
|
|
501
|
+
throw new error_2.FirebaseDataConnectError({
|
|
502
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
|
|
503
|
+
message: '`data` must be a non-empty array for upsertMany.'
|
|
504
|
+
});
|
|
423
505
|
}
|
|
424
506
|
try {
|
|
425
507
|
tableName = this.formatTableName(tableName);
|
|
@@ -429,7 +511,11 @@ class DataConnectApiClient {
|
|
|
429
511
|
return this.executeGraphql(mutation).catch(this.handleBulkImportErrors);
|
|
430
512
|
}
|
|
431
513
|
catch (e) {
|
|
432
|
-
throw new FirebaseDataConnectError(
|
|
514
|
+
throw new error_2.FirebaseDataConnectError({
|
|
515
|
+
code: error_2.DATA_CONNECT_ERROR_CODE_MAPPING.INTERNAL,
|
|
516
|
+
message: `Failed to construct upsertMany mutation: ${e.message}`,
|
|
517
|
+
cause: e,
|
|
518
|
+
});
|
|
433
519
|
}
|
|
434
520
|
}
|
|
435
521
|
}
|
|
@@ -456,32 +542,3 @@ function emulatorHost() {
|
|
|
456
542
|
function useEmulator() {
|
|
457
543
|
return !!emulatorHost();
|
|
458
544
|
}
|
|
459
|
-
exports.DATA_CONNECT_ERROR_CODE_MAPPING = {
|
|
460
|
-
ABORTED: 'aborted',
|
|
461
|
-
INVALID_ARGUMENT: 'invalid-argument',
|
|
462
|
-
INVALID_CREDENTIAL: 'invalid-credential',
|
|
463
|
-
INTERNAL: 'internal-error',
|
|
464
|
-
PERMISSION_DENIED: 'permission-denied',
|
|
465
|
-
UNAUTHENTICATED: 'unauthenticated',
|
|
466
|
-
NOT_FOUND: 'not-found',
|
|
467
|
-
UNKNOWN: 'unknown-error',
|
|
468
|
-
QUERY_ERROR: 'query-error',
|
|
469
|
-
};
|
|
470
|
-
/**
|
|
471
|
-
* Firebase Data Connect error code structure. This extends PrefixedFirebaseError.
|
|
472
|
-
*
|
|
473
|
-
* @param code - The error code.
|
|
474
|
-
* @param message - The error message.
|
|
475
|
-
* @constructor
|
|
476
|
-
*/
|
|
477
|
-
class FirebaseDataConnectError extends error_1.PrefixedFirebaseError {
|
|
478
|
-
constructor(code, message) {
|
|
479
|
-
super('data-connect', code, message);
|
|
480
|
-
/* tslint:disable:max-line-length */
|
|
481
|
-
// Set the prototype explicitly. See the following link for more details:
|
|
482
|
-
// https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work
|
|
483
|
-
/* tslint:enable:max-line-length */
|
|
484
|
-
this.__proto__ = FirebaseDataConnectError.prototype;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
exports.FirebaseDataConnectError = FirebaseDataConnectError;
|