firebase-admin-edge 1.0.17 → 1.0.19

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 (80) hide show
  1. package/README.md +28 -0
  2. package/dist/auth/auth-endpoint-errors.d.ts +15 -0
  3. package/dist/auth/auth-endpoint-errors.d.ts.map +1 -0
  4. package/dist/auth/auth-endpoint-errors.js +120 -0
  5. package/dist/auth/auth-endpoint-errors.js.map +1 -0
  6. package/dist/auth/auth-error-codes.d.ts +777 -0
  7. package/dist/auth/auth-error-codes.d.ts.map +1 -0
  8. package/dist/auth/auth-error-codes.js +823 -0
  9. package/dist/auth/auth-error-codes.js.map +1 -0
  10. package/dist/auth/errors.d.ts +20 -0
  11. package/dist/auth/errors.d.ts.map +1 -0
  12. package/dist/auth/errors.js +29 -0
  13. package/dist/auth/errors.js.map +1 -0
  14. package/dist/auth/firebase-admin-auth.d.ts +6 -45
  15. package/dist/auth/firebase-admin-auth.d.ts.map +1 -1
  16. package/dist/auth/firebase-admin-auth.js +17 -39
  17. package/dist/auth/firebase-admin-auth.js.map +1 -1
  18. package/dist/auth/firebase-admin-auth.test.js +38 -54
  19. package/dist/auth/firebase-admin-auth.test.js.map +1 -1
  20. package/dist/auth/firebase-auth-endpoints.d.ts +9 -72
  21. package/dist/auth/firebase-auth-endpoints.d.ts.map +1 -1
  22. package/dist/auth/firebase-auth-endpoints.js +10 -8
  23. package/dist/auth/firebase-auth-endpoints.js.map +1 -1
  24. package/dist/auth/firebase-auth-endpoints.test.js +13 -4
  25. package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
  26. package/dist/auth/firebase-auth.d.ts +3 -24
  27. package/dist/auth/firebase-auth.d.ts.map +1 -1
  28. package/dist/auth/firebase-auth.js +58 -20
  29. package/dist/auth/firebase-auth.js.map +1 -1
  30. package/dist/auth/firebase-auth.test.js +26 -9
  31. package/dist/auth/firebase-auth.test.js.map +1 -1
  32. package/dist/auth/firebase-jwt.d.ts +5 -29
  33. package/dist/auth/firebase-jwt.d.ts.map +1 -1
  34. package/dist/auth/firebase-jwt.js +74 -27
  35. package/dist/auth/firebase-jwt.js.map +1 -1
  36. package/dist/auth/firebase-jwt.test.js +31 -11
  37. package/dist/auth/firebase-jwt.test.js.map +1 -1
  38. package/dist/auth/firebase-types.d.ts +12 -8
  39. package/dist/auth/firebase-types.d.ts.map +1 -1
  40. package/dist/auth/github-oauth.d.ts +5 -2
  41. package/dist/auth/github-oauth.d.ts.map +1 -1
  42. package/dist/auth/github-oauth.js +126 -13
  43. package/dist/auth/github-oauth.js.map +1 -1
  44. package/dist/auth/github-oauth.test.d.ts +2 -0
  45. package/dist/auth/github-oauth.test.d.ts.map +1 -0
  46. package/dist/auth/github-oauth.test.js +202 -0
  47. package/dist/auth/github-oauth.test.js.map +1 -0
  48. package/dist/auth/google-oauth.d.ts +7 -22
  49. package/dist/auth/google-oauth.d.ts.map +1 -1
  50. package/dist/auth/google-oauth.js +103 -40
  51. package/dist/auth/google-oauth.js.map +1 -1
  52. package/dist/auth/google-oauth.test.js +107 -32
  53. package/dist/auth/google-oauth.test.js.map +1 -1
  54. package/dist/auth/oauth.d.ts +3 -0
  55. package/dist/auth/oauth.d.ts.map +1 -0
  56. package/dist/auth/oauth.js +28 -0
  57. package/dist/auth/oauth.js.map +1 -0
  58. package/dist/auth/oauth.test.d.ts +2 -0
  59. package/dist/auth/oauth.test.d.ts.map +1 -0
  60. package/dist/auth/oauth.test.js +233 -0
  61. package/dist/auth/oauth.test.js.map +1 -0
  62. package/dist/firebase-edge-errors.d.ts +95 -0
  63. package/dist/firebase-edge-errors.d.ts.map +1 -0
  64. package/dist/firebase-edge-errors.js +102 -0
  65. package/dist/firebase-edge-errors.js.map +1 -0
  66. package/dist/firebase-edge-errors.test.d.ts +2 -0
  67. package/dist/firebase-edge-errors.test.d.ts.map +1 -0
  68. package/dist/firebase-edge-errors.test.js +72 -0
  69. package/dist/firebase-edge-errors.test.js.map +1 -0
  70. package/dist/firebase-edge-server.d.ts +4 -35
  71. package/dist/firebase-edge-server.d.ts.map +1 -1
  72. package/dist/firebase-edge-server.js +29 -12
  73. package/dist/firebase-edge-server.js.map +1 -1
  74. package/dist/firebase-edge-server.test.js +10 -7
  75. package/dist/firebase-edge-server.test.js.map +1 -1
  76. package/dist/rest-fetch.js +4 -5
  77. package/dist/rest-fetch.js.map +1 -1
  78. package/dist/rest-fetch.test.js +0 -6
  79. package/dist/rest-fetch.test.js.map +1 -1
  80. package/package.json +1 -1
package/README.md CHANGED
@@ -109,3 +109,31 @@ redirect(302, '/');
109
109
  - ✅ **Session Management** - Secure HTTP-only cookies
110
110
  - ✅ **Google OAuth** - Complete OAuth 2.0 flow
111
111
  - ✅ **Token Management** - Generate client tokens from server sessions
112
+
113
+ ## Currently Working On - (in no particular order)
114
+
115
+ - ☐ LinkProvider (auto link?)
116
+ - ☐ Unlink Provider
117
+ - ☐ Create Error Classes
118
+ - ☐ Tenants
119
+ - ☐ App Check
120
+ - ☐ Magic Link (auto save email?)
121
+ - ☐ Email / Password
122
+ - ☐ Custom oAuth Scopes
123
+ - ☐ Get User
124
+ - ☐ Update User
125
+ - ☐ Delete User
126
+ - ☐ Add / Remove Claims
127
+ - ☐ Get all Users / Pagination
128
+ - ☐ All Providers
129
+ - ☐ Ban Users
130
+ - ☐ RBAC
131
+
132
+ ### Other TODO Notes
133
+
134
+ - Cookie Name, Cookie Options, Callback Path, Debug, TenantId
135
+ - (enableTokenRefreshOnExpiredKidHeader ? cookieSignatureKeys ?)
136
+ - loginWIthCodeFromURL(url)
137
+ - next path?
138
+
139
+ ## Then to DB, then Storage...
@@ -0,0 +1,15 @@
1
+ import type { FirebaseRestError } from './firebase-types.js';
2
+ import { FirebaseEdgeError } from './errors.js';
3
+ /**
4
+ * Maps Firebase REST API errors to structured FirebaseEdgeError instances.
5
+ * This function analyzes the Firebase error codes and HTTP status codes to determine
6
+ * the most appropriate structured error type.
7
+ *
8
+ * Firebase errors come with specific error codes in the message field (e.g., USER_NOT_FOUND)
9
+ * and additional details in the errors array with reason codes.
10
+ *
11
+ * @param firebaseError - The error object from Firebase REST API
12
+ * @returns A structured FirebaseEdgeError instance
13
+ */
14
+ export declare function mapFirebaseError(firebaseError: FirebaseRestError['error']): FirebaseEdgeError;
15
+ //# sourceMappingURL=auth-endpoint-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-endpoint-errors.d.ts","sourceRoot":"","sources":["../../src/auth/auth-endpoint-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAA6B,MAAM,aAAa,CAAC;AAE3E;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC5B,aAAa,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAC1C,iBAAiB,CAuLnB"}
@@ -0,0 +1,120 @@
1
+ import { FirebaseEdgeError, FirebaseEndpointErrorInfo } from './errors.js';
2
+ /**
3
+ * Maps Firebase REST API errors to structured FirebaseEdgeError instances.
4
+ * This function analyzes the Firebase error codes and HTTP status codes to determine
5
+ * the most appropriate structured error type.
6
+ *
7
+ * Firebase errors come with specific error codes in the message field (e.g., USER_NOT_FOUND)
8
+ * and additional details in the errors array with reason codes.
9
+ *
10
+ * @param firebaseError - The error object from Firebase REST API
11
+ * @returns A structured FirebaseEdgeError instance
12
+ */
13
+ export function mapFirebaseError(firebaseError) {
14
+ const { code, message, errors } = firebaseError;
15
+ // First, check for specific Firebase error codes in the message field
16
+ const firebaseErrorCode = message?.toUpperCase?.() || '';
17
+ const reasonCode = errors?.[0]?.reason?.toUpperCase?.() || '';
18
+ // Map specific Firebase error codes to structured errors (check if message contains the error code)
19
+ if (firebaseErrorCode.includes('INVALID_CUSTOM_TOKEN')) {
20
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_CUSTOM_TOKEN);
21
+ }
22
+ if (firebaseErrorCode.includes('INVALID_REFRESH_TOKEN') ||
23
+ firebaseErrorCode.includes('INVALID_GRANT')) {
24
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_REFRESH_TOKEN);
25
+ }
26
+ if (firebaseErrorCode.includes('TOKEN_EXPIRED') ||
27
+ firebaseErrorCode.includes('CREDENTIAL_TOO_OLD_LOGIN_AGAIN')) {
28
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_TOKEN_EXPIRED);
29
+ }
30
+ if (firebaseErrorCode.includes('INVALID_ID_TOKEN')) {
31
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ID_TOKEN);
32
+ }
33
+ if (firebaseErrorCode.includes('INVALID_CREDENTIAL')) {
34
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_CREDENTIAL);
35
+ }
36
+ // User Management Errors
37
+ if (firebaseErrorCode.includes('USER_NOT_FOUND') ||
38
+ firebaseErrorCode.includes('EMAIL_NOT_FOUND')) {
39
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND);
40
+ }
41
+ if (firebaseErrorCode.includes('USER_DISABLED')) {
42
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_USER_DISABLED);
43
+ }
44
+ // Permission & Access Errors
45
+ if (firebaseErrorCode.includes('PERMISSION_DENIED')) {
46
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_PERMISSION_DENIED);
47
+ }
48
+ if (firebaseErrorCode.includes('INSUFFICIENT_PERMISSION')) {
49
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INSUFFICIENT_PERMISSION);
50
+ }
51
+ // Rate Limiting & Quota Errors
52
+ if (firebaseErrorCode.includes('TOO_MANY_ATTEMPTS_TRY_LATER')) {
53
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_TOO_MANY_REQUESTS);
54
+ }
55
+ if (firebaseErrorCode.includes('QUOTA_EXCEEDED')) {
56
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_QUOTA_EXCEEDED);
57
+ }
58
+ // Provider & Configuration Errors
59
+ if (firebaseErrorCode.includes('OPERATION_NOT_ALLOWED')) {
60
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_PROVIDER_NOT_ENABLED);
61
+ }
62
+ if (firebaseErrorCode.includes('INVALID_IDP_RESPONSE')) {
63
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_PROVIDER_ID);
64
+ }
65
+ // Project & API Key Errors
66
+ if (firebaseErrorCode.includes('API KEY NOT VALID') ||
67
+ firebaseErrorCode.includes('INVALID_API_KEY')) {
68
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_API_KEY);
69
+ }
70
+ // Validation Errors
71
+ if (firebaseErrorCode.includes('INVALID_EMAIL') ||
72
+ firebaseErrorCode.includes('WEAK_PASSWORD') ||
73
+ firebaseErrorCode.includes('EMAIL_EXISTS') ||
74
+ firebaseErrorCode.includes('INVALID_PASSWORD') ||
75
+ firebaseErrorCode.includes('MISSING_REFRESH_TOKEN') ||
76
+ firebaseErrorCode.includes('INVALID_GRANT_TYPE')) {
77
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT);
78
+ }
79
+ // Check reason codes if main message didn't match
80
+ if (reasonCode.includes('INVALID')) {
81
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT);
82
+ }
83
+ if (reasonCode.includes('FORBIDDEN')) {
84
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_FORBIDDEN);
85
+ }
86
+ if (reasonCode.includes('NOTFOUND') || reasonCode.includes('NOT_FOUND')) {
87
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND);
88
+ }
89
+ // Fallback to HTTP status code mapping if no specific Firebase error code matched
90
+ switch (code) {
91
+ case 400:
92
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INVALID_ARGUMENT);
93
+ case 401:
94
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_UNAUTHORIZED);
95
+ case 403:
96
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_FORBIDDEN);
97
+ case 404:
98
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_USER_NOT_FOUND);
99
+ case 429:
100
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_TOO_MANY_REQUESTS);
101
+ case 500:
102
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_INTERNAL_ERROR);
103
+ case 502:
104
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_BAD_GATEWAY);
105
+ case 503:
106
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_SERVICE_UNAVAILABLE);
107
+ case 504:
108
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_TIMEOUT);
109
+ default:
110
+ return new FirebaseEdgeError(FirebaseEndpointErrorInfo.ENDPOINT_UNKNOWN_ERROR, {
111
+ cause: new Error(message),
112
+ context: {
113
+ firebaseCode: code,
114
+ firebaseMessage: message,
115
+ firebaseErrors: errors
116
+ }
117
+ });
118
+ }
119
+ }
120
+ //# sourceMappingURL=auth-endpoint-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-endpoint-errors.js","sourceRoot":"","sources":["../../src/auth/auth-endpoint-errors.ts"],"names":[],"mappings":"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"}