quickbase-js 0.1.0-beta.9 → 1.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.
Files changed (146) hide show
  1. package/README.md +270 -60
  2. package/dist/esm/quickbase.d.ts +2553 -3220
  3. package/dist/esm/quickbase.js +1545 -3443
  4. package/dist/esm/quickbase.js.map +1 -1
  5. package/dist/esm/quickbase.min.js +1 -1
  6. package/dist/esm/quickbase.min.js.map +1 -1
  7. package/dist/umd/quickbase.umd.js +1544 -3625
  8. package/dist/umd/quickbase.umd.js.map +1 -1
  9. package/dist/umd/quickbase.umd.min.js +1 -1
  10. package/dist/umd/quickbase.umd.min.js.map +1 -1
  11. package/package.json +25 -12
  12. package/CHANGELOG.md +0 -184
  13. package/build-common.js +0 -131
  14. package/build-esm.js +0 -71
  15. package/build-umd.js +0 -69
  16. package/examples/quicbase-jsCDN.html +0 -36
  17. package/examples/react.js +0 -48
  18. package/examples/vanillajs.html +0 -47
  19. package/open-api/fix-spec-main.ts +0 -97
  20. package/open-api/generate-override-report.ts +0 -214
  21. package/open-api/generate-unified-interface.ts +0 -336
  22. package/open-api/output/override-report.html +0 -11
  23. package/open-api/output/override-report.json +0 -14395
  24. package/open-api/output/quickbase-fixed.json +0 -11191
  25. package/open-api/regenerate-client.ts +0 -116
  26. package/open-api/schema/enhance-general.ts +0 -100
  27. package/open-api/schema/fix-arrays.ts +0 -69
  28. package/open-api/schema/tags/apps.ts +0 -90
  29. package/open-api/schema/tags/fields.ts +0 -471
  30. package/open-api/schema/tags/groups.ts +0 -51
  31. package/open-api/schema/tags/index.ts +0 -66
  32. package/open-api/schema/tags/records.ts +0 -115
  33. package/open-api/schema/tags/tables.ts +0 -211
  34. package/open-api/schema/tags/users.ts +0 -47
  35. package/open-api/types/spec.ts +0 -42
  36. package/open-api/utils/generateJsDoc.ts +0 -96
  37. package/open-api/utils/infer-schema.ts +0 -40
  38. package/open-api/utils/naming.ts +0 -10
  39. package/playwright.config.ts +0 -37
  40. package/rollup.config.js +0 -114
  41. package/specs/QuickBase_RESTful_API_2025-03-04T06_22_39.725Z.json +0 -46878
  42. package/specs/split/apps.json +0 -1315
  43. package/specs/split/auth.json +0 -191
  44. package/specs/split/fields.json +0 -3869
  45. package/specs/split/records.json +0 -754
  46. package/specs/split/reports.json +0 -619
  47. package/specs/split/tables.json +0 -1605
  48. package/src/RateLimitError.ts +0 -12
  49. package/src/ThrottleBucket.ts +0 -41
  50. package/src/authorizationStrategy.ts +0 -246
  51. package/src/generated-unified/QuickbaseClient.ts +0 -1049
  52. package/src/generated-unified/missing-types-report.json +0 -3
  53. package/src/index.ts +0 -1
  54. package/src/invokeMethod.ts +0 -242
  55. package/src/quickbaseClient.ts +0 -271
  56. package/src/rateLimiter.ts +0 -25
  57. package/src/tokenCache.ts +0 -35
  58. package/src/utils.ts +0 -7
  59. package/test-esm.js +0 -1
  60. package/test-results.json +0 -2050
  61. package/test-umd.js +0 -1
  62. package/test.ts +0 -1
  63. package/tests/playwright/qb/auth/cacheSwitching.test.ts +0 -159
  64. package/tests/playwright/qb/auth/fetchTempToken401.test.ts +0 -219
  65. package/tests/playwright/qb/auth/getAppWithTempToken.test.ts +0 -162
  66. package/tests/playwright/qb/auth/getAppWithUserToken.test.ts +0 -153
  67. package/tests/playwright/qb/auth/getTempToken.test.ts +0 -152
  68. package/tests/playwright/qb/auth/tempTokenPrefetch.test.ts +0 -179
  69. package/tests/playwright/qb/auth/tempTokenRenewal.test.ts +0 -133
  70. package/tests/setup.ts +0 -53
  71. package/tests/vitest/qb/apps/copyApp.test.ts +0 -76
  72. package/tests/vitest/qb/apps/createApp.test.ts +0 -64
  73. package/tests/vitest/qb/apps/deleteApp.test.ts +0 -76
  74. package/tests/vitest/qb/apps/getApp.test.ts +0 -44
  75. package/tests/vitest/qb/apps/getAppEvents.test.ts +0 -67
  76. package/tests/vitest/qb/apps/updateApp.test.ts +0 -58
  77. package/tests/vitest/qb/auth/mockQuickbaseServer.ts +0 -60
  78. package/tests/vitest/qb/auth/retryUserToken401.test.ts +0 -73
  79. package/tests/vitest/qb/auth/ssoTokenIntegrationWithServer.test.ts +0 -65
  80. package/tests/vitest/qb/fields/createField.test.ts +0 -77
  81. package/tests/vitest/qb/fields/deleteFields.test.ts +0 -83
  82. package/tests/vitest/qb/fields/getField.test.ts +0 -85
  83. package/tests/vitest/qb/fields/getFieldUsage.test.ts +0 -82
  84. package/tests/vitest/qb/fields/getFields.test.ts +0 -232
  85. package/tests/vitest/qb/fields/getFieldsUsage.test.ts +0 -77
  86. package/tests/vitest/qb/fields/updateField.test.ts +0 -93
  87. package/tests/vitest/qb/formulas/runFormula.test.ts +0 -96
  88. package/tests/vitest/qb/index.ts +0 -29
  89. package/tests/vitest/qb/records/deleteRecords.test.ts +0 -110
  90. package/tests/vitest/qb/records/runQuery.test.ts +0 -146
  91. package/tests/vitest/qb/records/upsert.test.ts +0 -102
  92. package/tests/vitest/qb/tables/createRelationship.test.ts +0 -102
  93. package/tests/vitest/qb/tables/createTable.test.ts +0 -55
  94. package/tests/vitest/qb/tables/deleteRelationship.test.ts +0 -143
  95. package/tests/vitest/qb/tables/deleteTable.test.ts +0 -50
  96. package/tests/vitest/qb/tables/getAppTables.test.ts +0 -46
  97. package/tests/vitest/qb/tables/getRelationships.test.ts +0 -80
  98. package/tests/vitest/qb/tables/getTable.test.ts +0 -26
  99. package/tests/vitest/qb/tables/updateRelationship.test.ts +0 -250
  100. package/tests/vitest/qb/tables/updateTable.test.ts +0 -48
  101. package/tests/vitest/unit/ThrottleBucket.test.ts +0 -95
  102. package/tests/vitest/unit/apps/copyApp.test.ts +0 -581
  103. package/tests/vitest/unit/apps/createApp.test.ts +0 -186
  104. package/tests/vitest/unit/apps/deleteApp.test.ts +0 -216
  105. package/tests/vitest/unit/apps/getApp.test.ts +0 -128
  106. package/tests/vitest/unit/apps/getAppEvents.test.ts +0 -193
  107. package/tests/vitest/unit/apps/updateApp.test.ts +0 -412
  108. package/tests/vitest/unit/auth/fetchTempToken401.test.ts +0 -63
  109. package/tests/vitest/unit/auth/getTempToken.test.ts +0 -119
  110. package/tests/vitest/unit/auth/retryTempToken401.test.ts +0 -95
  111. package/tests/vitest/unit/auth/retryTempTokenMaxRetries.test.ts +0 -235
  112. package/tests/vitest/unit/auth/retryUserToken401.test.ts +0 -69
  113. package/tests/vitest/unit/auth/ssoTokenRefresh.test.ts +0 -325
  114. package/tests/vitest/unit/fields/createField.test.ts +0 -451
  115. package/tests/vitest/unit/fields/deleteFields.test.ts +0 -141
  116. package/tests/vitest/unit/fields/getField.test.ts +0 -189
  117. package/tests/vitest/unit/fields/getFieldUsage.test.ts +0 -180
  118. package/tests/vitest/unit/fields/getFields.test.ts +0 -122
  119. package/tests/vitest/unit/fields/getFieldsUsage.test.ts +0 -160
  120. package/tests/vitest/unit/fields/updateField.test.ts +0 -285
  121. package/tests/vitest/unit/formulas/runFormula.test.ts +0 -205
  122. package/tests/vitest/unit/index.ts +0 -34
  123. package/tests/vitest/unit/inferHttpMethod.test.ts +0 -131
  124. package/tests/vitest/unit/rateLimit.test.ts +0 -191
  125. package/tests/vitest/unit/records/deleteRecords.test.ts +0 -112
  126. package/tests/vitest/unit/records/runQuery.test.ts +0 -102
  127. package/tests/vitest/unit/records/upsert.test.ts +0 -234
  128. package/tests/vitest/unit/tables/createRelationship.test.ts +0 -212
  129. package/tests/vitest/unit/tables/createTable.test.ts +0 -70
  130. package/tests/vitest/unit/tables/deleteRelationship.test.ts +0 -97
  131. package/tests/vitest/unit/tables/deleteTable.test.ts +0 -77
  132. package/tests/vitest/unit/tables/getAppTables.test.ts +0 -85
  133. package/tests/vitest/unit/tables/getRelationships.test.ts +0 -259
  134. package/tests/vitest/unit/tables/getTable.test.ts +0 -233
  135. package/tests/vitest/unit/tables/updateRelationship.test.ts +0 -307
  136. package/tests/vitest/unit/tables/updateTable.test.ts +0 -80
  137. package/tests/vitest/unit/tokenLifespan.test.ts +0 -204
  138. package/tests/vitest/unit/umd.test.ts +0 -8
  139. package/text.txt +0 -104
  140. package/tools/log-gen.ts +0 -244
  141. package/tools/log-gen.yaml +0 -5424
  142. package/tools/openapi-jars/openapi-generator-cli-7.12.0.jar +0 -0
  143. package/tsconfig.build.json +0 -17
  144. package/tsconfig.json +0 -32
  145. package/versionrc.json +0 -9
  146. package/vitest.config.ts +0 -27
@@ -1,325 +0,0 @@
1
- // tests/vitest/unit/auth/ssoTokenRefresh.test.ts
2
-
3
- import { describe, it, expect, beforeEach, vi } from "vitest";
4
- import { createClient, mockFetch, QB_REALM, QB_APP_ID } from "@tests/setup.ts";
5
-
6
- describe("QuickbaseClient Unit - SsoTokenStrategy", () => {
7
- let client: ReturnType<typeof createClient>;
8
- const mockSamlToken = "mock_saml_token_base64url";
9
- const mockSsoToken = "example_token_1NiIsImtpZCI6IjllciJ9w";
10
-
11
- beforeEach(() => {
12
- mockFetch.mockClear();
13
- client = createClient(mockFetch, {
14
- useSso: true,
15
- samlToken: mockSamlToken,
16
- realm: QB_REALM,
17
- debug: true,
18
- });
19
- });
20
-
21
- it("initializes without errors", () => {
22
- expect(client).toBeDefined();
23
- });
24
-
25
- it("has exchangeSsoToken method", () => {
26
- expect(typeof client.exchangeSsoToken).toBe("function");
27
- });
28
-
29
- it("fetches SSO token on first call", async () => {
30
- const mockResponse = {
31
- access_token: mockSsoToken,
32
- issued_token_type: "urn:quickbase:params:oauth:token-type:temp_token",
33
- token_type: "N_A",
34
- };
35
-
36
- mockFetch.mockResolvedValueOnce(
37
- new Response(JSON.stringify(mockResponse), {
38
- status: 200,
39
- headers: { "Content-Type": "application/json" },
40
- })
41
- );
42
-
43
- mockFetch.mockResolvedValueOnce(
44
- new Response(JSON.stringify({ id: QB_APP_ID, name: "Test App" }), {
45
- status: 200,
46
- headers: { "Content-Type": "application/json" },
47
- })
48
- );
49
-
50
- const result = await client.getApp({ appId: QB_APP_ID });
51
-
52
- expect(mockFetch).toHaveBeenCalledTimes(2);
53
- expect(mockFetch).toHaveBeenNthCalledWith(
54
- 1,
55
- "https://api.quickbase.com/v1/auth/oauth/token",
56
- expect.objectContaining({
57
- method: "POST",
58
- headers: expect.objectContaining({
59
- "QB-Realm-Hostname": `${QB_REALM}.quickbase.com`,
60
- "Content-Type": "application/json",
61
- }),
62
- body: JSON.stringify({
63
- grant_type: "urn:ietf:params:oauth:grant-type:token-exchange",
64
- requested_token_type:
65
- "urn:quickbase:params:oauth:token-type:temp_token",
66
- subject_token: mockSamlToken,
67
- subject_token_type: "urn:ietf:params:oauth:token-type:saml2",
68
- }),
69
- })
70
- );
71
- expect(mockFetch).toHaveBeenNthCalledWith(
72
- 2,
73
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
74
- expect.objectContaining({
75
- headers: expect.objectContaining({
76
- Authorization: `QB-TEMP-TOKEN ${mockSsoToken}`,
77
- }),
78
- })
79
- );
80
- expect(result).toEqual({ id: QB_APP_ID, name: "Test App" });
81
- });
82
-
83
- it("refreshes SSO token on 401 and retries", async () => {
84
- const newToken = "new_token_abcdef123";
85
- const appResponse = { id: QB_APP_ID, name: "Test App" };
86
-
87
- mockFetch
88
- .mockResolvedValueOnce(
89
- new Response(
90
- JSON.stringify({
91
- access_token: mockSsoToken,
92
- issued_token_type:
93
- "urn:quickbase:params:oauth:token-type:temp_token",
94
- token_type: "N_A",
95
- }),
96
- { status: 200, headers: { "Content-Type": "application/json" } }
97
- )
98
- )
99
- .mockResolvedValueOnce(
100
- new Response(JSON.stringify({ message: "Unauthorized" }), {
101
- status: 401,
102
- headers: { "Content-Type": "application/json" },
103
- })
104
- )
105
- .mockResolvedValueOnce(
106
- new Response(
107
- JSON.stringify({
108
- access_token: newToken,
109
- issued_token_type:
110
- "urn:quickbase:params:oauth:token-type:temp_token",
111
- token_type: "N_A",
112
- }),
113
- { status: 200, headers: { "Content-Type": "application/json" } }
114
- )
115
- )
116
- .mockResolvedValueOnce(
117
- new Response(JSON.stringify(appResponse), {
118
- status: 200,
119
- headers: { "Content-Type": "application/json" },
120
- })
121
- );
122
-
123
- const result = await client.getApp({ appId: QB_APP_ID });
124
-
125
- expect(result).toEqual(appResponse);
126
- expect(mockFetch).toHaveBeenCalledTimes(4);
127
- expect(mockFetch).toHaveBeenNthCalledWith(
128
- 1,
129
- "https://api.quickbase.com/v1/auth/oauth/token",
130
- expect.any(Object)
131
- );
132
- expect(mockFetch).toHaveBeenNthCalledWith(
133
- 2,
134
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
135
- expect.objectContaining({
136
- headers: expect.objectContaining({
137
- Authorization: `QB-TEMP-TOKEN ${mockSsoToken}`,
138
- }),
139
- })
140
- );
141
- expect(mockFetch).toHaveBeenNthCalledWith(
142
- 3,
143
- "https://api.quickbase.com/v1/auth/oauth/token",
144
- expect.any(Object)
145
- );
146
- expect(mockFetch).toHaveBeenNthCalledWith(
147
- 4,
148
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
149
- expect.objectContaining({
150
- headers: expect.objectContaining({
151
- Authorization: `QB-TEMP-TOKEN ${newToken}`,
152
- }),
153
- })
154
- );
155
- });
156
-
157
- it("handles API error on token exchange", async () => {
158
- // Reset client to avoid interference from beforeEach
159
- client = createClient(mockFetch, {
160
- useSso: true,
161
- samlToken: mockSamlToken,
162
- realm: QB_REALM,
163
- debug: true,
164
- });
165
-
166
- mockFetch
167
- .mockResolvedValueOnce(
168
- new Response(
169
- JSON.stringify({
170
- access_token: mockSsoToken,
171
- issued_token_type:
172
- "urn:quickbase:params:oauth:token-type:temp_token",
173
- token_type: "N_A",
174
- }),
175
- { status: 200, headers: { "Content-Type": "application/json" } }
176
- )
177
- )
178
- .mockResolvedValueOnce(
179
- new Response(JSON.stringify({ message: "Invalid SAML token" }), {
180
- status: 400,
181
- headers: { "Content-Type": "application/json" },
182
- })
183
- );
184
-
185
- await expect(
186
- client.exchangeSsoToken({
187
- grant_type: "urn:ietf:params:oauth:grant-type:token-exchange",
188
- requested_token_type:
189
- "urn:quickbase:params:oauth:token-type:temp_token",
190
- subject_token: mockSamlToken,
191
- subject_token_type: "urn:ietf:params:oauth:token-type:saml2",
192
- })
193
- ).rejects.toThrow("API Error: Invalid SAML token (Status: 400)");
194
-
195
- expect(mockFetch).toHaveBeenCalledTimes(2);
196
- expect(mockFetch).toHaveBeenNthCalledWith(
197
- 1,
198
- "https://api.quickbase.com/v1/auth/oauth/token",
199
- expect.any(Object)
200
- );
201
- expect(mockFetch).toHaveBeenNthCalledWith(
202
- 2,
203
- "https://api.quickbase.com/v1/auth/oauth/token",
204
- expect.any(Object)
205
- );
206
- });
207
-
208
- it("exhausts retries on repeated 401s", async () => {
209
- mockFetch
210
- .mockResolvedValueOnce(
211
- new Response(
212
- JSON.stringify({
213
- access_token: mockSsoToken,
214
- issued_token_type:
215
- "urn:quickbase:params:oauth:token-type:temp_token",
216
- token_type: "N_A",
217
- }),
218
- { status: 200, headers: { "Content-Type": "application/json" } }
219
- )
220
- )
221
- .mockResolvedValueOnce(
222
- new Response(JSON.stringify({ message: "Unauthorized" }), {
223
- status: 401,
224
- headers: { "Content-Type": "application/json" },
225
- })
226
- )
227
- .mockResolvedValueOnce(
228
- new Response(
229
- JSON.stringify({
230
- access_token: "retry_token_1",
231
- issued_token_type:
232
- "urn:quickbase:params:oauth:token-type:temp_token",
233
- token_type: "N_A",
234
- }),
235
- { status: 200, headers: { "Content-Type": "application/json" } }
236
- )
237
- )
238
- .mockResolvedValueOnce(
239
- new Response(JSON.stringify({ message: "Unauthorized" }), {
240
- status: 401,
241
- headers: { "Content-Type": "application/json" },
242
- })
243
- )
244
- .mockResolvedValueOnce(
245
- new Response(
246
- JSON.stringify({
247
- access_token: "retry_token_2",
248
- issued_token_type:
249
- "urn:quickbase:params:oauth:token-type:temp_token",
250
- token_type: "N_A",
251
- }),
252
- { status: 200, headers: { "Content-Type": "application/json" } }
253
- )
254
- )
255
- .mockResolvedValueOnce(
256
- new Response(JSON.stringify({ message: "Unauthorized" }), {
257
- status: 401,
258
- headers: { "Content-Type": "application/json" },
259
- })
260
- )
261
- .mockResolvedValueOnce(
262
- new Response(
263
- JSON.stringify({
264
- access_token: "retry_token_3",
265
- issued_token_type:
266
- "urn:quickbase:params:oauth:token-type:temp_token",
267
- token_type: "N_A",
268
- }),
269
- { status: 200, headers: { "Content-Type": "application/json" } }
270
- )
271
- )
272
- .mockResolvedValueOnce(
273
- new Response(JSON.stringify({ message: "Unauthorized" }), {
274
- status: 401,
275
- headers: { "Content-Type": "application/json" },
276
- })
277
- );
278
-
279
- await expect(client.getApp({ appId: QB_APP_ID })).rejects.toThrow(
280
- "API Error: Unauthorized (Status: 401)"
281
- );
282
-
283
- expect(mockFetch).toHaveBeenCalledTimes(8);
284
- expect(mockFetch).toHaveBeenNthCalledWith(
285
- 1,
286
- "https://api.quickbase.com/v1/auth/oauth/token",
287
- expect.any(Object)
288
- );
289
- expect(mockFetch).toHaveBeenNthCalledWith(
290
- 2,
291
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
292
- expect.any(Object)
293
- );
294
- expect(mockFetch).toHaveBeenNthCalledWith(
295
- 3,
296
- "https://api.quickbase.com/v1/auth/oauth/token",
297
- expect.any(Object)
298
- );
299
- expect(mockFetch).toHaveBeenNthCalledWith(
300
- 4,
301
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
302
- expect.any(Object)
303
- );
304
- expect(mockFetch).toHaveBeenNthCalledWith(
305
- 5,
306
- "https://api.quickbase.com/v1/auth/oauth/token",
307
- expect.any(Object)
308
- );
309
- expect(mockFetch).toHaveBeenNthCalledWith(
310
- 6,
311
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
312
- expect.any(Object)
313
- );
314
- expect(mockFetch).toHaveBeenNthCalledWith(
315
- 7,
316
- "https://api.quickbase.com/v1/auth/oauth/token",
317
- expect.any(Object)
318
- );
319
- expect(mockFetch).toHaveBeenNthCalledWith(
320
- 8,
321
- `https://api.quickbase.com/v1/apps/${QB_APP_ID}`,
322
- expect.any(Object)
323
- );
324
- });
325
- });