firebase-admin-edge 1.0.12 → 1.0.13
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 -1
- package/dist/auth/firebase-admin-auth.js +33 -33
- package/dist/auth/firebase-admin-auth.js.map +1 -1
- package/dist/auth/firebase-admin-auth.test.js +71 -71
- package/dist/auth/firebase-admin-auth.test.js.map +1 -1
- package/dist/auth/firebase-auth-endpoints.js +27 -27
- package/dist/auth/firebase-auth-endpoints.test.js +29 -29
- package/dist/auth/firebase-auth-endpoints.test.js.map +1 -1
- package/dist/auth/firebase-auth.js +7 -7
- package/dist/auth/firebase-auth.js.map +1 -1
- package/dist/auth/firebase-auth.test.js +9 -9
- package/dist/auth/firebase-jwt.js +32 -32
- package/dist/auth/firebase-jwt.js.map +1 -1
- package/dist/auth/firebase-jwt.test.js +14 -14
- package/dist/auth/firebase-jwt.test.js.map +1 -1
- package/dist/auth/github-oauth.js +5 -5
- package/dist/auth/google-oauth.js +16 -16
- package/dist/auth/google-oauth.test.js +15 -15
- package/dist/auth/google-oauth.test.js.map +1 -1
- package/dist/firebase-edge-server.d.ts +1 -18
- package/dist/firebase-edge-server.d.ts.map +1 -1
- package/dist/firebase-edge-server.js +30 -32
- package/dist/firebase-edge-server.js.map +1 -1
- package/dist/firebase-edge-server.test.js +21 -21
- package/dist/firebase-edge-server.test.js.map +1 -1
- package/dist/rest-fetch.d.ts.map +1 -1
- package/dist/rest-fetch.js +7 -6
- package/dist/rest-fetch.js.map +1 -1
- package/dist/rest-fetch.test.js +48 -30
- package/dist/rest-fetch.test.js.map +1 -1
- package/package.json +1 -1
package/dist/rest-fetch.test.js
CHANGED
|
@@ -10,13 +10,16 @@ describe('restFetch', () => {
|
|
|
10
10
|
mockFetch.mockResolvedValue({
|
|
11
11
|
ok: true,
|
|
12
12
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
13
|
-
json: () => Promise.resolve({ success: true })
|
|
13
|
+
json: () => Promise.resolve({ success: true })
|
|
14
14
|
});
|
|
15
15
|
const result = await restFetch('https://api.example.com');
|
|
16
16
|
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com', {
|
|
17
17
|
method: 'POST',
|
|
18
|
-
headers: {
|
|
19
|
-
|
|
18
|
+
headers: {
|
|
19
|
+
Accept: 'application/json',
|
|
20
|
+
'Content-Type': 'application/json'
|
|
21
|
+
},
|
|
22
|
+
body: undefined
|
|
20
23
|
});
|
|
21
24
|
expect(result).toEqual({ data: { success: true }, error: null });
|
|
22
25
|
});
|
|
@@ -24,126 +27,141 @@ describe('restFetch', () => {
|
|
|
24
27
|
mockFetch.mockResolvedValue({
|
|
25
28
|
ok: true,
|
|
26
29
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
27
|
-
json: () => Promise.resolve({ data: 'test' })
|
|
30
|
+
json: () => Promise.resolve({ data: 'test' })
|
|
28
31
|
});
|
|
29
32
|
await restFetch('https://api.example.com', {
|
|
30
33
|
method: 'GET',
|
|
31
|
-
params: {
|
|
34
|
+
params: { search: 'query', limit: '10' }
|
|
35
|
+
});
|
|
36
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com?search=query&limit=10', {
|
|
37
|
+
method: 'GET',
|
|
38
|
+
headers: {
|
|
39
|
+
Accept: 'application/json',
|
|
40
|
+
'Content-Type': 'application/json'
|
|
41
|
+
},
|
|
42
|
+
body: undefined
|
|
32
43
|
});
|
|
33
|
-
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com?foo=bar&baz=qux', expect.any(Object));
|
|
34
44
|
});
|
|
35
45
|
it('should send JSON body with POST request', async () => {
|
|
36
46
|
mockFetch.mockResolvedValue({
|
|
37
47
|
ok: true,
|
|
38
48
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
39
|
-
json: () => Promise.resolve({})
|
|
49
|
+
json: () => Promise.resolve({})
|
|
40
50
|
});
|
|
41
51
|
await restFetch('https://api.example.com', {
|
|
42
52
|
method: 'POST',
|
|
43
|
-
body: { name: 'test', value: 123 }
|
|
53
|
+
body: { name: 'test', value: 123 }
|
|
44
54
|
});
|
|
45
55
|
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com', {
|
|
46
56
|
method: 'POST',
|
|
47
|
-
headers: {
|
|
48
|
-
|
|
57
|
+
headers: {
|
|
58
|
+
Accept: 'application/json',
|
|
59
|
+
'Content-Type': 'application/json'
|
|
60
|
+
},
|
|
61
|
+
body: JSON.stringify({ name: 'test', value: 123 })
|
|
49
62
|
});
|
|
50
63
|
});
|
|
51
64
|
it('should send form data when form option is true', async () => {
|
|
52
65
|
mockFetch.mockResolvedValue({
|
|
53
66
|
ok: true,
|
|
54
67
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
55
|
-
json: () => Promise.resolve({})
|
|
68
|
+
json: () => Promise.resolve({})
|
|
56
69
|
});
|
|
57
70
|
await restFetch('https://api.example.com', {
|
|
58
71
|
form: true,
|
|
59
|
-
body: { username: 'test', password: 'secret' }
|
|
72
|
+
body: { username: 'test', password: 'secret' }
|
|
60
73
|
});
|
|
61
74
|
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com', {
|
|
62
75
|
method: 'POST',
|
|
63
|
-
headers: {
|
|
64
|
-
|
|
76
|
+
headers: {
|
|
77
|
+
Accept: 'application/json',
|
|
78
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
79
|
+
},
|
|
80
|
+
body: expect.any(URLSearchParams)
|
|
65
81
|
});
|
|
66
82
|
});
|
|
67
83
|
it('should include bearer token in headers', async () => {
|
|
68
84
|
mockFetch.mockResolvedValue({
|
|
69
85
|
ok: true,
|
|
70
86
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
71
|
-
json: () => Promise.resolve({})
|
|
87
|
+
json: () => Promise.resolve({})
|
|
72
88
|
});
|
|
73
89
|
await restFetch('https://api.example.com', {
|
|
74
|
-
bearerToken: 'abc123'
|
|
90
|
+
bearerToken: 'abc123'
|
|
75
91
|
});
|
|
76
92
|
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com', {
|
|
77
93
|
method: 'POST',
|
|
78
94
|
headers: {
|
|
95
|
+
Accept: 'application/json',
|
|
79
96
|
'Content-Type': 'application/json',
|
|
80
|
-
Authorization: 'Bearer abc123'
|
|
97
|
+
Authorization: 'Bearer abc123'
|
|
81
98
|
},
|
|
82
|
-
body: undefined
|
|
99
|
+
body: undefined
|
|
83
100
|
});
|
|
84
101
|
});
|
|
85
102
|
it('should merge custom headers', async () => {
|
|
86
103
|
mockFetch.mockResolvedValue({
|
|
87
104
|
ok: true,
|
|
88
105
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
89
|
-
json: () => Promise.resolve({})
|
|
106
|
+
json: () => Promise.resolve({})
|
|
90
107
|
});
|
|
91
108
|
await restFetch('https://api.example.com', {
|
|
92
|
-
headers: { 'X-Custom': 'value' }
|
|
109
|
+
headers: { 'X-Custom': 'value' }
|
|
93
110
|
});
|
|
94
111
|
expect(mockFetch).toHaveBeenCalledWith('https://api.example.com', {
|
|
95
112
|
method: 'POST',
|
|
96
113
|
headers: {
|
|
114
|
+
Accept: 'application/json',
|
|
97
115
|
'Content-Type': 'application/json',
|
|
98
|
-
'X-Custom': 'value'
|
|
116
|
+
'X-Custom': 'value'
|
|
99
117
|
},
|
|
100
|
-
body: undefined
|
|
118
|
+
body: undefined
|
|
101
119
|
});
|
|
102
120
|
});
|
|
103
121
|
it('should handle JSON error response', async () => {
|
|
104
122
|
mockFetch.mockResolvedValue({
|
|
105
123
|
ok: false,
|
|
106
124
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
107
|
-
json: () => Promise.resolve({ message: 'Not found' })
|
|
125
|
+
json: () => Promise.resolve({ message: 'Not found' })
|
|
108
126
|
});
|
|
109
127
|
const result = await restFetch('https://api.example.com');
|
|
110
128
|
expect(result).toEqual({
|
|
111
129
|
data: null,
|
|
112
|
-
error: { message: 'Not found' }
|
|
130
|
+
error: { message: 'Not found' }
|
|
113
131
|
});
|
|
114
132
|
});
|
|
115
133
|
it('should handle text error response', async () => {
|
|
116
134
|
mockFetch.mockResolvedValue({
|
|
117
135
|
ok: false,
|
|
118
136
|
headers: new Headers({ 'content-type': 'text/plain' }),
|
|
119
|
-
text: () => Promise.resolve('Server error')
|
|
137
|
+
text: () => Promise.resolve('Server error')
|
|
120
138
|
});
|
|
121
139
|
const result = await restFetch('https://api.example.com');
|
|
122
140
|
expect(result).toEqual({
|
|
123
141
|
data: null,
|
|
124
|
-
error: 'Server error'
|
|
142
|
+
error: 'Server error'
|
|
125
143
|
});
|
|
126
144
|
});
|
|
127
145
|
it('should handle text success response', async () => {
|
|
128
146
|
mockFetch.mockResolvedValue({
|
|
129
147
|
ok: true,
|
|
130
148
|
headers: new Headers({ 'content-type': 'text/plain' }),
|
|
131
|
-
text: () => Promise.resolve('Success message')
|
|
149
|
+
text: () => Promise.resolve('Success message')
|
|
132
150
|
});
|
|
133
151
|
const result = await restFetch('https://api.example.com');
|
|
134
152
|
expect(result).toEqual({
|
|
135
153
|
data: 'Success message',
|
|
136
|
-
error: null
|
|
154
|
+
error: null
|
|
137
155
|
});
|
|
138
156
|
});
|
|
139
157
|
it('should use custom fetch function', async () => {
|
|
140
158
|
const customFetch = vi.fn().mockResolvedValue({
|
|
141
159
|
ok: true,
|
|
142
160
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
143
|
-
json: () => Promise.resolve({ custom: true })
|
|
161
|
+
json: () => Promise.resolve({ custom: true })
|
|
144
162
|
});
|
|
145
163
|
await restFetch('https://api.example.com', {
|
|
146
|
-
global: { fetch: customFetch }
|
|
164
|
+
global: { fetch: customFetch }
|
|
147
165
|
});
|
|
148
166
|
expect(customFetch).toHaveBeenCalled();
|
|
149
167
|
expect(mockFetch).not.toHaveBeenCalled();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-fetch.test.js","sourceRoot":"","sources":["../src/rest-fetch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,IAAI,SAAiD,CAAC;IAEtD,UAAU,CAAC,GAAG,EAAE;QACZ,SAAS,GAAG,EAAE,CAAC,EAAE,EAAgB,CAAC;QAClC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC1D,SAAS,CAAC,iBAAiB,CAAC;YACxB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;YAC5D,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACrC,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAE1D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB
|
|
1
|
+
{"version":3,"file":"rest-fetch.test.js","sourceRoot":"","sources":["../src/rest-fetch.test.ts"],"names":[],"mappings":"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"}
|