firebase-admin-edge 1.0.21 → 1.0.22

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.
Files changed (37) hide show
  1. package/dist/auth/auth-endpoint-errors.test.d.ts +2 -0
  2. package/dist/auth/auth-endpoint-errors.test.d.ts.map +1 -0
  3. package/dist/auth/auth-endpoint-errors.test.js +403 -0
  4. package/dist/auth/auth-endpoint-errors.test.js.map +1 -0
  5. package/dist/auth/errors.test.d.ts +2 -0
  6. package/dist/auth/errors.test.d.ts.map +1 -0
  7. package/dist/auth/errors.test.js +123 -0
  8. package/dist/auth/errors.test.js.map +1 -0
  9. package/dist/auth/firebase-admin-auth.test.js +116 -0
  10. package/dist/auth/firebase-admin-auth.test.js.map +1 -1
  11. package/dist/auth/firebase-auth-endpoints.d.ts +42 -9
  12. package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
  13. package/dist/auth/firebase-auth-endpoints.js +93 -0
  14. package/dist/auth/firebase-auth-endpoints.js.map +1 -1
  15. package/dist/auth/firebase-auth-endpoints.test.js +324 -1
  16. package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
  17. package/dist/auth/firebase-auth.d.ts +10 -2
  18. package/dist/auth/firebase-auth.d.ts.map +1 -1
  19. package/dist/auth/firebase-auth.js +52 -7
  20. package/dist/auth/firebase-auth.js.map +1 -1
  21. package/dist/auth/firebase-auth.test.js +57 -4
  22. package/dist/auth/firebase-auth.test.js.map +1 -1
  23. package/dist/auth/firebase-types.d.ts +17 -0
  24. package/dist/auth/firebase-types.d.ts.map +1 -1
  25. package/dist/auth/oauth.d.ts +2 -2
  26. package/dist/auth/oauth.d.ts.map +1 -1
  27. package/dist/auth/oauth.js +43 -23
  28. package/dist/auth/oauth.js.map +1 -1
  29. package/dist/auth/oauth.test.js +44 -172
  30. package/dist/auth/oauth.test.js.map +1 -1
  31. package/dist/firebase-edge-server.d.ts +11 -3
  32. package/dist/firebase-edge-server.d.ts.map +1 -1
  33. package/dist/firebase-edge-server.js +18 -7
  34. package/dist/firebase-edge-server.js.map +1 -1
  35. package/dist/firebase-edge-server.test.js +2 -2
  36. package/dist/firebase-edge-server.test.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth-endpoint-errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-endpoint-errors.test.d.ts","sourceRoot":"","sources":["../../src/auth/auth-endpoint-errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,403 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mapFirebaseError } from './auth-endpoint-errors.js';
3
+ import { FirebaseEdgeError, FirebaseEndpointErrorInfo } from './errors.js';
4
+ describe('mapFirebaseError', () => {
5
+ describe('Token Errors', () => {
6
+ it('maps INVALID_CUSTOM_TOKEN to structured error', () => {
7
+ const error = mapFirebaseError({
8
+ code: 400,
9
+ message: 'INVALID_CUSTOM_TOKEN: Token format invalid'
10
+ });
11
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
12
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_CUSTOM_TOKEN.code);
13
+ });
14
+ it('maps INVALID_REFRESH_TOKEN to structured error', () => {
15
+ const error = mapFirebaseError({
16
+ code: 400,
17
+ message: 'INVALID_REFRESH_TOKEN'
18
+ });
19
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
20
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_REFRESH_TOKEN.code);
21
+ });
22
+ it('maps INVALID_GRANT to refresh token error', () => {
23
+ const error = mapFirebaseError({
24
+ code: 400,
25
+ message: 'INVALID_GRANT: Token has been revoked'
26
+ });
27
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
28
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_REFRESH_TOKEN.code);
29
+ });
30
+ it('maps TOKEN_EXPIRED to structured error', () => {
31
+ const error = mapFirebaseError({
32
+ code: 401,
33
+ message: 'TOKEN_EXPIRED'
34
+ });
35
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
36
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_TOKEN_EXPIRED.code);
37
+ });
38
+ it('maps CREDENTIAL_TOO_OLD_LOGIN_AGAIN to token expired', () => {
39
+ const error = mapFirebaseError({
40
+ code: 401,
41
+ message: 'CREDENTIAL_TOO_OLD_LOGIN_AGAIN'
42
+ });
43
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
44
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_TOKEN_EXPIRED.code);
45
+ });
46
+ it('maps INVALID_ID_TOKEN to structured error', () => {
47
+ const error = mapFirebaseError({
48
+ code: 400,
49
+ message: 'INVALID_ID_TOKEN'
50
+ });
51
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
52
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ID_TOKEN.code);
53
+ });
54
+ it('maps INVALID_CREDENTIAL to structured error', () => {
55
+ const error = mapFirebaseError({
56
+ code: 400,
57
+ message: 'INVALID_CREDENTIAL'
58
+ });
59
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
60
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_CREDENTIAL.code);
61
+ });
62
+ });
63
+ describe('User Management Errors', () => {
64
+ it('maps USER_NOT_FOUND to structured error', () => {
65
+ const error = mapFirebaseError({
66
+ code: 404,
67
+ message: 'USER_NOT_FOUND'
68
+ });
69
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
70
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND.code);
71
+ });
72
+ it('maps EMAIL_NOT_FOUND to user not found error', () => {
73
+ const error = mapFirebaseError({
74
+ code: 400,
75
+ message: 'EMAIL_NOT_FOUND'
76
+ });
77
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
78
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND.code);
79
+ });
80
+ it('maps USER_DISABLED to structured error', () => {
81
+ const error = mapFirebaseError({
82
+ code: 403,
83
+ message: 'USER_DISABLED'
84
+ });
85
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
86
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_DISABLED.code);
87
+ });
88
+ });
89
+ describe('Permission & Access Errors', () => {
90
+ it('maps PERMISSION_DENIED to structured error', () => {
91
+ const error = mapFirebaseError({
92
+ code: 403,
93
+ message: 'PERMISSION_DENIED'
94
+ });
95
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
96
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_PERMISSION_DENIED.code);
97
+ });
98
+ it('maps INSUFFICIENT_PERMISSION to structured error', () => {
99
+ const error = mapFirebaseError({
100
+ code: 403,
101
+ message: 'INSUFFICIENT_PERMISSION'
102
+ });
103
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
104
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INSUFFICIENT_PERMISSION.code);
105
+ });
106
+ });
107
+ describe('Rate Limiting & Quota Errors', () => {
108
+ it('maps TOO_MANY_ATTEMPTS_TRY_LATER to structured error', () => {
109
+ const error = mapFirebaseError({
110
+ code: 429,
111
+ message: 'TOO_MANY_ATTEMPTS_TRY_LATER'
112
+ });
113
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
114
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_TOO_MANY_REQUESTS.code);
115
+ });
116
+ it('maps QUOTA_EXCEEDED to structured error', () => {
117
+ const error = mapFirebaseError({
118
+ code: 429,
119
+ message: 'QUOTA_EXCEEDED'
120
+ });
121
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
122
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_QUOTA_EXCEEDED.code);
123
+ });
124
+ });
125
+ describe('Provider & Configuration Errors', () => {
126
+ it('maps OPERATION_NOT_ALLOWED to provider not enabled', () => {
127
+ const error = mapFirebaseError({
128
+ code: 400,
129
+ message: 'OPERATION_NOT_ALLOWED'
130
+ });
131
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
132
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_PROVIDER_NOT_ENABLED.code);
133
+ });
134
+ it('maps INVALID_IDP_RESPONSE to invalid provider id', () => {
135
+ const error = mapFirebaseError({
136
+ code: 400,
137
+ message: 'INVALID_IDP_RESPONSE'
138
+ });
139
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
140
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_PROVIDER_ID.code);
141
+ });
142
+ });
143
+ describe('API Key Errors', () => {
144
+ it('maps API KEY NOT VALID to structured error', () => {
145
+ const error = mapFirebaseError({
146
+ code: 400,
147
+ message: 'API KEY NOT VALID'
148
+ });
149
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
150
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_API_KEY.code);
151
+ });
152
+ it('maps INVALID_API_KEY to structured error', () => {
153
+ const error = mapFirebaseError({
154
+ code: 403,
155
+ message: 'INVALID_API_KEY'
156
+ });
157
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
158
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_API_KEY.code);
159
+ });
160
+ });
161
+ describe('Validation Errors', () => {
162
+ it('maps INVALID_EMAIL to invalid argument', () => {
163
+ const error = mapFirebaseError({
164
+ code: 400,
165
+ message: 'INVALID_EMAIL'
166
+ });
167
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
168
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
169
+ });
170
+ it('maps WEAK_PASSWORD to invalid argument', () => {
171
+ const error = mapFirebaseError({
172
+ code: 400,
173
+ message: 'WEAK_PASSWORD'
174
+ });
175
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
176
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
177
+ });
178
+ it('maps EMAIL_EXISTS to invalid argument', () => {
179
+ const error = mapFirebaseError({
180
+ code: 400,
181
+ message: 'EMAIL_EXISTS'
182
+ });
183
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
184
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
185
+ });
186
+ it('maps INVALID_PASSWORD to invalid argument', () => {
187
+ const error = mapFirebaseError({
188
+ code: 400,
189
+ message: 'INVALID_PASSWORD'
190
+ });
191
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
192
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
193
+ });
194
+ it('maps MISSING_REFRESH_TOKEN to invalid argument', () => {
195
+ const error = mapFirebaseError({
196
+ code: 400,
197
+ message: 'MISSING_REFRESH_TOKEN'
198
+ });
199
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
200
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
201
+ });
202
+ it('maps INVALID_GRANT_TYPE to invalid refresh token', () => {
203
+ const error = mapFirebaseError({
204
+ code: 400,
205
+ message: 'INVALID_GRANT_TYPE'
206
+ });
207
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
208
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_REFRESH_TOKEN.code);
209
+ });
210
+ });
211
+ describe('Reason Code Mapping', () => {
212
+ it('maps INVALID reason to invalid argument', () => {
213
+ const error = mapFirebaseError({
214
+ code: 400,
215
+ message: 'Some error',
216
+ errors: [
217
+ {
218
+ reason: 'INVALID',
219
+ message: 'Invalid request',
220
+ domain: 'global'
221
+ }
222
+ ]
223
+ });
224
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
225
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
226
+ });
227
+ it('maps FORBIDDEN reason to forbidden', () => {
228
+ const error = mapFirebaseError({
229
+ code: 403,
230
+ message: 'Access denied',
231
+ errors: [
232
+ {
233
+ reason: 'FORBIDDEN',
234
+ message: 'No access',
235
+ domain: 'global'
236
+ }
237
+ ]
238
+ });
239
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
240
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_FORBIDDEN.code);
241
+ });
242
+ it('maps NOTFOUND reason to user not found', () => {
243
+ const error = mapFirebaseError({
244
+ code: 404,
245
+ message: 'Resource not found',
246
+ errors: [
247
+ {
248
+ reason: 'NOTFOUND',
249
+ message: 'Not found',
250
+ domain: 'global'
251
+ }
252
+ ]
253
+ });
254
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
255
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND.code);
256
+ });
257
+ it('maps NOT_FOUND reason to user not found', () => {
258
+ const error = mapFirebaseError({
259
+ code: 404,
260
+ message: 'Resource not found',
261
+ errors: [
262
+ {
263
+ reason: 'NOT_FOUND',
264
+ message: 'Not found',
265
+ domain: 'global'
266
+ }
267
+ ]
268
+ });
269
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
270
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND.code);
271
+ });
272
+ });
273
+ describe('HTTP Status Code Fallbacks', () => {
274
+ it('maps 400 to invalid argument', () => {
275
+ const error = mapFirebaseError({
276
+ code: 400,
277
+ message: 'Unknown error'
278
+ });
279
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
280
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT.code);
281
+ });
282
+ it('maps 401 to unauthorized', () => {
283
+ const error = mapFirebaseError({
284
+ code: 401,
285
+ message: 'Unauthorized'
286
+ });
287
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
288
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_UNAUTHORIZED.code);
289
+ });
290
+ it('maps 403 to forbidden', () => {
291
+ const error = mapFirebaseError({
292
+ code: 403,
293
+ message: 'Forbidden'
294
+ });
295
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
296
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_FORBIDDEN.code);
297
+ });
298
+ it('maps 404 to user not found', () => {
299
+ const error = mapFirebaseError({
300
+ code: 404,
301
+ message: 'Not found'
302
+ });
303
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
304
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND.code);
305
+ });
306
+ it('maps 429 to too many requests', () => {
307
+ const error = mapFirebaseError({
308
+ code: 429,
309
+ message: 'Rate limit exceeded'
310
+ });
311
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
312
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_TOO_MANY_REQUESTS.code);
313
+ });
314
+ it('maps 500 to internal error', () => {
315
+ const error = mapFirebaseError({
316
+ code: 500,
317
+ message: 'Internal server error'
318
+ });
319
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
320
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INTERNAL_ERROR.code);
321
+ });
322
+ it('maps 502 to bad gateway', () => {
323
+ const error = mapFirebaseError({
324
+ code: 502,
325
+ message: 'Bad gateway'
326
+ });
327
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
328
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_BAD_GATEWAY.code);
329
+ });
330
+ it('maps 503 to service unavailable', () => {
331
+ const error = mapFirebaseError({
332
+ code: 503,
333
+ message: 'Service unavailable'
334
+ });
335
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
336
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_SERVICE_UNAVAILABLE.code);
337
+ });
338
+ it('maps 504 to timeout', () => {
339
+ const error = mapFirebaseError({
340
+ code: 504,
341
+ message: 'Gateway timeout'
342
+ });
343
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
344
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_TIMEOUT.code);
345
+ });
346
+ });
347
+ describe('Unknown Errors', () => {
348
+ it('maps unknown status code to unknown error with context', () => {
349
+ const error = mapFirebaseError({
350
+ code: 418,
351
+ message: "I'm a teapot",
352
+ errors: [
353
+ {
354
+ reason: 'TEAPOT',
355
+ message: 'Cannot brew coffee',
356
+ domain: 'global'
357
+ }
358
+ ]
359
+ });
360
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
361
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_UNKNOWN_ERROR.code);
362
+ expect(error.cause).toBeInstanceOf(Error);
363
+ expect(error.context).toEqual({
364
+ firebaseCode: 418,
365
+ firebaseMessage: "I'm a teapot",
366
+ firebaseErrors: [
367
+ {
368
+ reason: 'TEAPOT',
369
+ message: 'Cannot brew coffee',
370
+ domain: 'global'
371
+ }
372
+ ]
373
+ });
374
+ });
375
+ it('handles missing message field', () => {
376
+ const error = mapFirebaseError({
377
+ code: 999,
378
+ message: undefined
379
+ });
380
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
381
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_UNKNOWN_ERROR.code);
382
+ });
383
+ });
384
+ describe('Case Insensitivity', () => {
385
+ it('handles lowercase error codes', () => {
386
+ const error = mapFirebaseError({
387
+ code: 400,
388
+ message: 'invalid_custom_token'
389
+ });
390
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
391
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_CUSTOM_TOKEN.code);
392
+ });
393
+ it('handles mixed case error codes', () => {
394
+ const error = mapFirebaseError({
395
+ code: 400,
396
+ message: 'User_Not_Found'
397
+ });
398
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
399
+ expect(error.code).toBe(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND.code);
400
+ });
401
+ });
402
+ });
403
+ //# sourceMappingURL=auth-endpoint-errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-endpoint-errors.test.js","sourceRoot":"","sources":["../../src/auth/auth-endpoint-errors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/auth/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ensureError, FirebaseEdgeError, FirebaseAdminAuthErrorInfo } from './errors.js';
3
+ describe('Error Utilities', () => {
4
+ describe('ensureError', () => {
5
+ it('returns the error if already an Error instance', () => {
6
+ const error = new Error('Test error');
7
+ const result = ensureError(error);
8
+ expect(result).toBe(error);
9
+ expect(result.message).toBe('Test error');
10
+ });
11
+ it('returns the FirebaseEdgeError if already a FirebaseEdgeError', () => {
12
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_USER_NOT_FOUND);
13
+ const result = ensureError(error);
14
+ expect(result).toBe(error);
15
+ expect(result).toBeInstanceOf(FirebaseEdgeError);
16
+ });
17
+ it('wraps non-Error values in an Error with stringified content', () => {
18
+ const value = { code: 400, message: 'Bad Request' };
19
+ const result = ensureError(value);
20
+ expect(result).toBeInstanceOf(Error);
21
+ expect(result.message).toContain('This value was thrown as is');
22
+ expect(result.message).toContain('400');
23
+ expect(result.message).toContain('Bad Request');
24
+ });
25
+ it('handles string values', () => {
26
+ const value = 'Something went wrong';
27
+ const result = ensureError(value);
28
+ expect(result).toBeInstanceOf(Error);
29
+ expect(result.message).toContain('This value was thrown as is');
30
+ expect(result.message).toContain('Something went wrong');
31
+ });
32
+ it('handles number values', () => {
33
+ const value = 404;
34
+ const result = ensureError(value);
35
+ expect(result).toBeInstanceOf(Error);
36
+ expect(result.message).toContain('This value was thrown as is');
37
+ expect(result.message).toContain('404');
38
+ });
39
+ it('handles null values', () => {
40
+ const result = ensureError(null);
41
+ expect(result).toBeInstanceOf(Error);
42
+ expect(result.message).toContain('This value was thrown as is');
43
+ expect(result.message).toContain('null');
44
+ });
45
+ it('handles undefined values', () => {
46
+ const result = ensureError(undefined);
47
+ expect(result).toBeInstanceOf(Error);
48
+ expect(result.message).toContain('This value was thrown as is');
49
+ });
50
+ it('handles circular references gracefully', () => {
51
+ const circular = { name: 'circular' };
52
+ circular.self = circular;
53
+ const result = ensureError(circular);
54
+ expect(result).toBeInstanceOf(Error);
55
+ expect(result.message).toContain('Unable to stringify the thrown value');
56
+ });
57
+ });
58
+ describe('FirebaseEdgeError', () => {
59
+ it('creates error with message and code', () => {
60
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_USER_NOT_FOUND);
61
+ expect(error).toBeInstanceOf(Error);
62
+ expect(error).toBeInstanceOf(FirebaseEdgeError);
63
+ expect(error.name).toBe('FirebaseEdgeError');
64
+ expect(error.message).toBe(FirebaseAdminAuthErrorInfo.ADMIN_USER_NOT_FOUND.message);
65
+ expect(error.code).toBe(FirebaseAdminAuthErrorInfo.ADMIN_USER_NOT_FOUND.code);
66
+ });
67
+ it('includes cause when provided', () => {
68
+ const cause = new Error('Original error');
69
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_ID_TOKEN_VERIFY_FAILED, { cause });
70
+ expect(error.cause).toBe(cause);
71
+ expect(error.message).toBe(FirebaseAdminAuthErrorInfo.ADMIN_ID_TOKEN_VERIFY_FAILED.message);
72
+ });
73
+ it('includes context when provided', () => {
74
+ const context = { uid: 'user-123', provider: 'google.com' };
75
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_USER_LOOKUP_FAILED, { context });
76
+ expect(error.context).toEqual(context);
77
+ expect(error.message).toBe(FirebaseAdminAuthErrorInfo.ADMIN_USER_LOOKUP_FAILED.message);
78
+ });
79
+ it('includes both cause and context', () => {
80
+ const cause = new Error('Network failure');
81
+ const context = { url: 'https://api.example.com', timeout: 5000 };
82
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_API_NETWORK_ERROR, { cause, context });
83
+ expect(error.cause).toBe(cause);
84
+ expect(error.context).toEqual(context);
85
+ expect(error.code).toBe(FirebaseAdminAuthErrorInfo.ADMIN_API_NETWORK_ERROR.code);
86
+ });
87
+ it('works without options', () => {
88
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_UNKNOWN_ERROR);
89
+ expect(error.cause).toBeUndefined();
90
+ expect(error.context).toBeUndefined();
91
+ expect(error.message).toBe(FirebaseAdminAuthErrorInfo.ADMIN_UNKNOWN_ERROR.message);
92
+ });
93
+ it('maintains prototype chain', () => {
94
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_INTERNAL_ERROR);
95
+ expect(error instanceof FirebaseEdgeError).toBe(true);
96
+ expect(error instanceof Error).toBe(true);
97
+ expect(Object.getPrototypeOf(error)).toBe(FirebaseEdgeError.prototype);
98
+ });
99
+ it('is catchable and type-checkable', () => {
100
+ try {
101
+ throw new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_TOKEN_REVOCATION_CHECK_FAILED, { context: { reason: 'test' } });
102
+ }
103
+ catch (err) {
104
+ expect(err).toBeInstanceOf(FirebaseEdgeError);
105
+ if (err instanceof FirebaseEdgeError) {
106
+ expect(err.code).toBe(FirebaseAdminAuthErrorInfo
107
+ .ADMIN_TOKEN_REVOCATION_CHECK_FAILED.code);
108
+ expect(err.context).toEqual({ reason: 'test' });
109
+ }
110
+ }
111
+ });
112
+ it('supports nested JSON context', () => {
113
+ const context = {
114
+ user: { id: '123', email: 'test@example.com' },
115
+ metadata: { timestamp: 1234567890, source: 'api' },
116
+ tags: ['urgent', 'security']
117
+ };
118
+ const error = new FirebaseEdgeError(FirebaseAdminAuthErrorInfo.ADMIN_OPERATION_FAILED, { context });
119
+ expect(error.context).toEqual(context);
120
+ });
121
+ });
122
+ });
123
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/auth/errors.test.ts"],"names":[],"mappings":"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"}