@37signals/fizzy 0.1.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 (199) hide show
  1. package/dist/auth/cookie-auth.d.ts +25 -0
  2. package/dist/auth/cookie-auth.d.ts.map +1 -0
  3. package/dist/auth/cookie-auth.js +29 -0
  4. package/dist/auth/cookie-auth.js.map +1 -0
  5. package/dist/auth/magic-link.d.ts +66 -0
  6. package/dist/auth/magic-link.d.ts.map +1 -0
  7. package/dist/auth/magic-link.js +78 -0
  8. package/dist/auth/magic-link.js.map +1 -0
  9. package/dist/auth-strategy.d.ts +32 -0
  10. package/dist/auth-strategy.d.ts.map +1 -0
  11. package/dist/auth-strategy.js +29 -0
  12. package/dist/auth-strategy.js.map +1 -0
  13. package/dist/cache/etag-cache.d.ts +49 -0
  14. package/dist/cache/etag-cache.d.ts.map +1 -0
  15. package/dist/cache/etag-cache.js +95 -0
  16. package/dist/cache/etag-cache.js.map +1 -0
  17. package/dist/client.d.ts +92 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +505 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/errors.d.ts +68 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +187 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/generated/metadata.json +1272 -0
  26. package/dist/generated/openapi-stripped.json +12446 -0
  27. package/dist/generated/path-mapping.d.ts +8 -0
  28. package/dist/generated/path-mapping.d.ts.map +1 -0
  29. package/dist/generated/path-mapping.js +124 -0
  30. package/dist/generated/path-mapping.js.map +1 -0
  31. package/dist/generated/path-mapping.ts +135 -0
  32. package/dist/generated/schema.d.ts +10272 -0
  33. package/dist/generated/services/boards.d.ts +56 -0
  34. package/dist/generated/services/boards.d.ts.map +1 -0
  35. package/dist/generated/services/boards.js +100 -0
  36. package/dist/generated/services/boards.js.map +1 -0
  37. package/dist/generated/services/boards.ts +152 -0
  38. package/dist/generated/services/cards.d.ts +164 -0
  39. package/dist/generated/services/cards.d.ts.map +1 -0
  40. package/dist/generated/services/cards.js +353 -0
  41. package/dist/generated/services/cards.js.map +1 -0
  42. package/dist/generated/services/cards.ts +522 -0
  43. package/dist/generated/services/columns.d.ts +45 -0
  44. package/dist/generated/services/columns.d.ts.map +1 -0
  45. package/dist/generated/services/columns.js +77 -0
  46. package/dist/generated/services/columns.js.map +1 -0
  47. package/dist/generated/services/columns.ts +116 -0
  48. package/dist/generated/services/comments.d.ts +42 -0
  49. package/dist/generated/services/comments.d.ts.map +1 -0
  50. package/dist/generated/services/comments.js +77 -0
  51. package/dist/generated/services/comments.js.map +1 -0
  52. package/dist/generated/services/comments.ts +114 -0
  53. package/dist/generated/services/devices.d.ts +24 -0
  54. package/dist/generated/services/devices.d.ts.map +1 -0
  55. package/dist/generated/services/devices.js +36 -0
  56. package/dist/generated/services/devices.js.map +1 -0
  57. package/dist/generated/services/devices.ts +53 -0
  58. package/dist/generated/services/identity.d.ts +16 -0
  59. package/dist/generated/services/identity.d.ts.map +1 -0
  60. package/dist/generated/services/identity.js +21 -0
  61. package/dist/generated/services/identity.js.map +1 -0
  62. package/dist/generated/services/identity.ts +30 -0
  63. package/dist/generated/services/index.d.ts +17 -0
  64. package/dist/generated/services/index.d.ts.map +1 -0
  65. package/dist/generated/services/index.js +17 -0
  66. package/dist/generated/services/index.js.map +1 -0
  67. package/dist/generated/services/index.ts +16 -0
  68. package/dist/generated/services/miscellaneous.d.ts +136 -0
  69. package/dist/generated/services/miscellaneous.d.ts.map +1 -0
  70. package/dist/generated/services/miscellaneous.js +301 -0
  71. package/dist/generated/services/miscellaneous.js.map +1 -0
  72. package/dist/generated/services/miscellaneous.ts +443 -0
  73. package/dist/generated/services/notifications.d.ts +42 -0
  74. package/dist/generated/services/notifications.d.ts.map +1 -0
  75. package/dist/generated/services/notifications.js +75 -0
  76. package/dist/generated/services/notifications.js.map +1 -0
  77. package/dist/generated/services/notifications.ts +113 -0
  78. package/dist/generated/services/pins.d.ts +16 -0
  79. package/dist/generated/services/pins.d.ts.map +1 -0
  80. package/dist/generated/services/pins.js +21 -0
  81. package/dist/generated/services/pins.js.map +1 -0
  82. package/dist/generated/services/pins.ts +29 -0
  83. package/dist/generated/services/reactions.d.ts +45 -0
  84. package/dist/generated/services/reactions.d.ts.map +1 -0
  85. package/dist/generated/services/reactions.js +90 -0
  86. package/dist/generated/services/reactions.js.map +1 -0
  87. package/dist/generated/services/reactions.ts +129 -0
  88. package/dist/generated/services/sessions.d.ts +44 -0
  89. package/dist/generated/services/sessions.d.ts.map +1 -0
  90. package/dist/generated/services/sessions.js +73 -0
  91. package/dist/generated/services/sessions.js.map +1 -0
  92. package/dist/generated/services/sessions.ts +113 -0
  93. package/dist/generated/services/steps.d.ts +43 -0
  94. package/dist/generated/services/steps.d.ts.map +1 -0
  95. package/dist/generated/services/steps.js +77 -0
  96. package/dist/generated/services/steps.js.map +1 -0
  97. package/dist/generated/services/steps.ts +114 -0
  98. package/dist/generated/services/tags.d.ts +17 -0
  99. package/dist/generated/services/tags.d.ts.map +1 -0
  100. package/dist/generated/services/tags.js +21 -0
  101. package/dist/generated/services/tags.js.map +1 -0
  102. package/dist/generated/services/tags.ts +32 -0
  103. package/dist/generated/services/uploads.d.ts +22 -0
  104. package/dist/generated/services/uploads.d.ts.map +1 -0
  105. package/dist/generated/services/uploads.js +23 -0
  106. package/dist/generated/services/uploads.js.map +1 -0
  107. package/dist/generated/services/uploads.ts +38 -0
  108. package/dist/generated/services/users.d.ts +33 -0
  109. package/dist/generated/services/users.d.ts.map +1 -0
  110. package/dist/generated/services/users.js +61 -0
  111. package/dist/generated/services/users.js.map +1 -0
  112. package/dist/generated/services/users.ts +89 -0
  113. package/dist/generated/services/webhooks.d.ts +49 -0
  114. package/dist/generated/services/webhooks.d.ts.map +1 -0
  115. package/dist/generated/services/webhooks.js +90 -0
  116. package/dist/generated/services/webhooks.js.map +1 -0
  117. package/dist/generated/services/webhooks.ts +133 -0
  118. package/dist/hooks/gating.d.ts +35 -0
  119. package/dist/hooks/gating.d.ts.map +1 -0
  120. package/dist/hooks/gating.js +58 -0
  121. package/dist/hooks/gating.js.map +1 -0
  122. package/dist/hooks/otel.d.ts +49 -0
  123. package/dist/hooks/otel.d.ts.map +1 -0
  124. package/dist/hooks/otel.js +171 -0
  125. package/dist/hooks/otel.js.map +1 -0
  126. package/dist/hooks.d.ts +99 -0
  127. package/dist/hooks.d.ts.map +1 -0
  128. package/dist/hooks.js +130 -0
  129. package/dist/hooks.js.map +1 -0
  130. package/dist/index.d.ts +64 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +97 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/pagination-utils.d.ts +22 -0
  135. package/dist/pagination-utils.d.ts.map +1 -0
  136. package/dist/pagination-utils.js +52 -0
  137. package/dist/pagination-utils.js.map +1 -0
  138. package/dist/pagination.d.ts +37 -0
  139. package/dist/pagination.d.ts.map +1 -0
  140. package/dist/pagination.js +30 -0
  141. package/dist/pagination.js.map +1 -0
  142. package/dist/resilience/bulkhead.d.ts +34 -0
  143. package/dist/resilience/bulkhead.d.ts.map +1 -0
  144. package/dist/resilience/bulkhead.js +65 -0
  145. package/dist/resilience/bulkhead.js.map +1 -0
  146. package/dist/resilience/circuit-breaker.d.ts +48 -0
  147. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  148. package/dist/resilience/circuit-breaker.js +74 -0
  149. package/dist/resilience/circuit-breaker.js.map +1 -0
  150. package/dist/resilience/index.d.ts +41 -0
  151. package/dist/resilience/index.d.ts.map +1 -0
  152. package/dist/resilience/index.js +46 -0
  153. package/dist/resilience/index.js.map +1 -0
  154. package/dist/resilience/rate-limiter.d.ts +38 -0
  155. package/dist/resilience/rate-limiter.d.ts.map +1 -0
  156. package/dist/resilience/rate-limiter.js +69 -0
  157. package/dist/resilience/rate-limiter.js.map +1 -0
  158. package/dist/security.d.ts +19 -0
  159. package/dist/security.d.ts.map +1 -0
  160. package/dist/security.js +55 -0
  161. package/dist/security.js.map +1 -0
  162. package/dist/services/base.d.ts +51 -0
  163. package/dist/services/base.d.ts.map +1 -0
  164. package/dist/services/base.js +146 -0
  165. package/dist/services/base.js.map +1 -0
  166. package/dist/webhooks/handler.d.ts +62 -0
  167. package/dist/webhooks/handler.d.ts.map +1 -0
  168. package/dist/webhooks/handler.js +204 -0
  169. package/dist/webhooks/handler.js.map +1 -0
  170. package/dist/webhooks/index.d.ts +3 -0
  171. package/dist/webhooks/index.d.ts.map +1 -0
  172. package/dist/webhooks/index.js +3 -0
  173. package/dist/webhooks/index.js.map +1 -0
  174. package/dist/webhooks/verify.d.ts +10 -0
  175. package/dist/webhooks/verify.d.ts.map +1 -0
  176. package/dist/webhooks/verify.js +23 -0
  177. package/dist/webhooks/verify.js.map +1 -0
  178. package/package.json +67 -0
  179. package/src/generated/metadata.json +1272 -0
  180. package/src/generated/openapi-stripped.json +12446 -0
  181. package/src/generated/path-mapping.ts +135 -0
  182. package/src/generated/schema.d.ts +10272 -0
  183. package/src/generated/services/boards.ts +152 -0
  184. package/src/generated/services/cards.ts +522 -0
  185. package/src/generated/services/columns.ts +116 -0
  186. package/src/generated/services/comments.ts +114 -0
  187. package/src/generated/services/devices.ts +53 -0
  188. package/src/generated/services/identity.ts +30 -0
  189. package/src/generated/services/index.ts +16 -0
  190. package/src/generated/services/miscellaneous.ts +443 -0
  191. package/src/generated/services/notifications.ts +113 -0
  192. package/src/generated/services/pins.ts +29 -0
  193. package/src/generated/services/reactions.ts +129 -0
  194. package/src/generated/services/sessions.ts +113 -0
  195. package/src/generated/services/steps.ts +114 -0
  196. package/src/generated/services/tags.ts +32 -0
  197. package/src/generated/services/uploads.ts +38 -0
  198. package/src/generated/services/users.ts +89 -0
  199. package/src/generated/services/webhooks.ts +133 -0
package/dist/client.js ADDED
@@ -0,0 +1,505 @@
1
+ /**
2
+ * Fizzy TypeScript SDK Client
3
+ *
4
+ * Creates a type-safe client for the Fizzy API using openapi-fetch.
5
+ * Includes middleware for authentication, retry with exponential backoff,
6
+ * ETag-based caching, and account scoping via forAccount().
7
+ */
8
+ import createClient from "openapi-fetch";
9
+ import { createRequire } from "node:module";
10
+ import { PATH_TO_OPERATION } from "./generated/path-mapping.js";
11
+ import { FizzyError } from "./errors.js";
12
+ import { isLocalhost } from "./security.js";
13
+ import { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
14
+ import { bearerAuth } from "./auth-strategy.js";
15
+ import { ETagCache } from "./cache/etag-cache.js";
16
+ import { BoardsService } from "./generated/services/boards.js";
17
+ import { CardsService } from "./generated/services/cards.js";
18
+ import { ColumnsService } from "./generated/services/columns.js";
19
+ import { CommentsService } from "./generated/services/comments.js";
20
+ import { DevicesService } from "./generated/services/devices.js";
21
+ import { IdentityService } from "./generated/services/identity.js";
22
+ import { NotificationsService } from "./generated/services/notifications.js";
23
+ import { PinsService } from "./generated/services/pins.js";
24
+ import { ReactionsService } from "./generated/services/reactions.js";
25
+ import { SessionsService } from "./generated/services/sessions.js";
26
+ import { StepsService } from "./generated/services/steps.js";
27
+ import { TagsService } from "./generated/services/tags.js";
28
+ import { UploadsService } from "./generated/services/uploads.js";
29
+ import { UsersService } from "./generated/services/users.js";
30
+ import { WebhooksService } from "./generated/services/webhooks.js";
31
+ import { MiscellaneousService } from "./generated/services/miscellaneous.js";
32
+ const require = createRequire(import.meta.url);
33
+ const metadata = require("./generated/metadata.json");
34
+ export const VERSION = "0.1.0";
35
+ export const API_VERSION = "2026-03-01";
36
+ const DEFAULT_BASE_URL = "https://fizzy.do";
37
+ const DEFAULT_USER_AGENT = `fizzy-sdk-ts/${VERSION} (api:${API_VERSION})`;
38
+ /**
39
+ * Creates a type-safe Fizzy API client with built-in middleware for:
40
+ * - Authentication (Bearer token or Cookie session)
41
+ * - Retry with exponential backoff (respects Retry-After header)
42
+ * - ETag-based HTTP caching
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * import { createFizzyClient } from "@37signals/fizzy";
47
+ *
48
+ * const client = createFizzyClient({
49
+ * accessToken: process.env.FIZZY_TOKEN!,
50
+ * });
51
+ *
52
+ * const { data, error } = await client.GET("/boards.json");
53
+ * ```
54
+ */
55
+ export function createFizzyClient(options) {
56
+ const { accountId, accessToken, auth, baseUrl: baseUrlOption, userAgent = DEFAULT_USER_AGENT, enableCache = false, enableRetry = true, requestTimeoutMs = 30000, hooks, } = options;
57
+ // Resolve base URL: if accountId provided, scope to that account
58
+ const baseUrl = baseUrlOption ??
59
+ (accountId ? `${DEFAULT_BASE_URL}/${accountId}` : DEFAULT_BASE_URL);
60
+ // Validate auth options: exactly one of auth or accessToken must be provided
61
+ if (auth && accessToken) {
62
+ throw new FizzyError("usage", "Provide either 'auth' or 'accessToken', not both");
63
+ }
64
+ if (!auth && !accessToken) {
65
+ throw new FizzyError("usage", "Either 'auth' or 'accessToken' is required");
66
+ }
67
+ const authStrategy = auth ?? bearerAuth(accessToken);
68
+ // Validate HTTPS (skip for localhost)
69
+ if (baseUrl) {
70
+ try {
71
+ const parsed = new URL(baseUrl);
72
+ if (parsed.protocol !== "https:" && !isLocalhost(parsed.hostname)) {
73
+ throw new FizzyError("usage", `Base URL must use HTTPS: ${baseUrl}`);
74
+ }
75
+ }
76
+ catch (err) {
77
+ if (err instanceof FizzyError)
78
+ throw err;
79
+ throw new FizzyError("usage", `Invalid base URL: ${baseUrl}`);
80
+ }
81
+ }
82
+ const client = createClient({ baseUrl });
83
+ // Apply middleware in order: auth first, then hooks, then cache, then retry
84
+ client.use(createAuthMiddleware(authStrategy, userAgent, requestTimeoutMs));
85
+ if (hooks) {
86
+ client.use(createHooksMiddleware(hooks));
87
+ }
88
+ const etagCache = enableCache ? new ETagCache() : undefined;
89
+ if (etagCache) {
90
+ client.use(createCacheMiddleware(etagCache));
91
+ }
92
+ if (enableRetry) {
93
+ client.use(createRetryMiddleware(hooks, authStrategy));
94
+ }
95
+ const enhancedClient = client;
96
+ Object.defineProperty(enhancedClient, "raw", {
97
+ value: client,
98
+ writable: false,
99
+ enumerable: false,
100
+ });
101
+ Object.defineProperty(enhancedClient, "hooks", {
102
+ value: hooks,
103
+ writable: false,
104
+ enumerable: false,
105
+ });
106
+ // forAccount: creates a new client scoped to a different account
107
+ Object.defineProperty(enhancedClient, "forAccount", {
108
+ value: (newAccountId) => {
109
+ return createFizzyClient({
110
+ ...options,
111
+ accountId: newAccountId,
112
+ baseUrl: `${DEFAULT_BASE_URL}/${newAccountId}`,
113
+ });
114
+ },
115
+ writable: false,
116
+ enumerable: false,
117
+ });
118
+ // Authenticated fetchPage closure for pagination
119
+ const fetchPage = async (url) => {
120
+ const headers = new Headers({
121
+ "User-Agent": userAgent,
122
+ Accept: "application/json",
123
+ });
124
+ await authStrategy.authenticate(headers);
125
+ return fetch(url, { headers });
126
+ };
127
+ // Lazy-initialized service cache
128
+ const serviceCache = {};
129
+ const defineService = (name, factory) => {
130
+ Object.defineProperty(enhancedClient, name, {
131
+ get() {
132
+ return (serviceCache[name] ??= factory());
133
+ },
134
+ enumerable: true,
135
+ configurable: false,
136
+ });
137
+ };
138
+ // Expose fetchPage and hooks for service internals
139
+ enhancedClient.__fetchPage = fetchPage;
140
+ enhancedClient.__hooks = hooks;
141
+ // Register all generated services as lazy accessors
142
+ registerServices(defineService, enhancedClient, fetchPage, hooks);
143
+ return enhancedClient;
144
+ }
145
+ // =============================================================================
146
+ // Auth Middleware
147
+ // =============================================================================
148
+ function createAuthMiddleware(authStrategy, userAgent, requestTimeoutMs) {
149
+ return {
150
+ async onRequest({ request }) {
151
+ await authStrategy.authenticate(request.headers);
152
+ request.headers.set("User-Agent", userAgent);
153
+ if (!request.headers.has("Content-Type")) {
154
+ request.headers.set("Content-Type", "application/json");
155
+ }
156
+ request.headers.set("Accept", "application/json");
157
+ const controller = new AbortController();
158
+ setTimeout(() => controller.abort(), requestTimeoutMs);
159
+ if (request.signal) {
160
+ request.signal.addEventListener("abort", () => controller.abort(), {
161
+ once: true,
162
+ });
163
+ }
164
+ return new Request(request.url, {
165
+ method: request.method,
166
+ headers: request.headers,
167
+ body: request.body,
168
+ signal: controller.signal,
169
+ duplex: request.body ? "half" : undefined,
170
+ });
171
+ },
172
+ };
173
+ }
174
+ let requestIdCounter = 0;
175
+ function createHooksMiddleware(hooks) {
176
+ const timings = new Map();
177
+ return {
178
+ async onRequest({ request }) {
179
+ const requestId = `${++requestIdCounter}`;
180
+ request.headers.set("X-SDK-Request-Id", requestId);
181
+ const attemptHeader = request.headers.get("X-Retry-Attempt");
182
+ const attempt = attemptHeader ? parseInt(attemptHeader, 10) + 1 : 1;
183
+ timings.set(requestId, { startTime: performance.now(), attempt });
184
+ const info = {
185
+ method: request.method,
186
+ url: request.url,
187
+ attempt,
188
+ };
189
+ try {
190
+ hooks.onRequestStart?.(info);
191
+ }
192
+ catch { /* hooks must not interrupt */ }
193
+ return request;
194
+ },
195
+ async onResponse({ request, response }) {
196
+ const requestId = request.headers.get("X-SDK-Request-Id") ?? "";
197
+ const timing = timings.get(requestId);
198
+ const durationMs = timing ? Math.round(performance.now() - timing.startTime) : 0;
199
+ const attempt = timing?.attempt ?? 1;
200
+ timings.delete(requestId);
201
+ const info = {
202
+ method: request.method,
203
+ url: request.url,
204
+ attempt,
205
+ };
206
+ const fromCacheHeader = response.headers.get("X-From-Cache");
207
+ const fromCache = fromCacheHeader === "1" || response.status === 304;
208
+ const result = {
209
+ statusCode: response.status,
210
+ durationMs,
211
+ fromCache,
212
+ };
213
+ try {
214
+ hooks.onRequestEnd?.(info, result);
215
+ }
216
+ catch { /* hooks must not interrupt */ }
217
+ return response;
218
+ },
219
+ };
220
+ }
221
+ // =============================================================================
222
+ // Cache Middleware (ETag-based)
223
+ // =============================================================================
224
+ function createCacheMiddleware(cache) {
225
+ const cacheKeyStore = new WeakMap();
226
+ return {
227
+ async onRequest({ request }) {
228
+ if (request.method !== "GET")
229
+ return request;
230
+ const cacheKey = await cache.getCacheKey(request.url, request.headers.get("Authorization") ?? request.headers.get("Cookie"));
231
+ const etag = cache.getETag(cacheKey);
232
+ if (etag) {
233
+ request.headers.set("If-None-Match", etag);
234
+ }
235
+ cacheKeyStore.set(request, cacheKey);
236
+ return request;
237
+ },
238
+ async onResponse({ request, response }) {
239
+ if (request.method !== "GET")
240
+ return response;
241
+ const cacheKey = cacheKeyStore.get(request) ??
242
+ await cache.getCacheKey(request.url, request.headers.get("Authorization") ?? request.headers.get("Cookie"));
243
+ if (response.status === 304) {
244
+ const body = cache.getBody(cacheKey);
245
+ if (body) {
246
+ const headers = new Headers(response.headers);
247
+ headers.set("X-From-Cache", "1");
248
+ return new Response(body, { status: 200, headers });
249
+ }
250
+ }
251
+ if (response.ok) {
252
+ const etag = response.headers.get("ETag");
253
+ if (etag) {
254
+ const body = await response.clone().text();
255
+ cache.set(cacheKey, etag, body);
256
+ }
257
+ }
258
+ return response;
259
+ },
260
+ };
261
+ }
262
+ const DEFAULT_RETRY_CONFIG = {
263
+ maxAttempts: 3,
264
+ baseDelayMs: 1000,
265
+ backoff: "exponential",
266
+ retryOn: [429, 503],
267
+ };
268
+ const MAX_JITTER_MS = 100;
269
+ /**
270
+ * Normalizes a URL path by replacing numeric IDs with placeholder tokens.
271
+ * For example: /boards/456/cards/789 -> /boards/{boardId}/cards/{cardNumber}
272
+ */
273
+ export function normalizeUrlPath(url) {
274
+ const urlObj = new URL(url);
275
+ let path = urlObj.pathname;
276
+ const hasJsonSuffix = path.endsWith(".json");
277
+ if (hasJsonSuffix) {
278
+ path = path.slice(0, -5);
279
+ }
280
+ const segments = path.split("/").filter(Boolean);
281
+ const idMapping = {
282
+ boards: "{boardId}",
283
+ columns: "{columnId}",
284
+ cards: "{cardNumber}",
285
+ comments: "{commentId}",
286
+ steps: "{stepId}",
287
+ reactions: "{reactionId}",
288
+ notifications: "{notificationId}",
289
+ tags: "{tagId}",
290
+ users: "{userId}",
291
+ pins: "{pinId}",
292
+ webhooks: "{webhookId}",
293
+ sessions: "{sessionId}",
294
+ devices: "{deviceId}",
295
+ };
296
+ const normalized = [];
297
+ let prevSegment = null;
298
+ let isFirstSegment = true;
299
+ for (let i = 0; i < segments.length; i++) {
300
+ const segment = segments[i];
301
+ if (/^\d+$/.test(segment)) {
302
+ if (isFirstSegment) {
303
+ normalized.push("{accountId}");
304
+ }
305
+ else {
306
+ const placeholder = prevSegment ? idMapping[prevSegment] : undefined;
307
+ normalized.push(placeholder ?? "{id}");
308
+ }
309
+ }
310
+ else {
311
+ normalized.push(segment);
312
+ }
313
+ prevSegment = segment;
314
+ isFirstSegment = false;
315
+ }
316
+ let normalizedPath = "/" + normalized.join("/");
317
+ if (hasJsonSuffix) {
318
+ normalizedPath += ".json";
319
+ }
320
+ return normalizedPath;
321
+ }
322
+ function getRetryConfigForRequest(method, url) {
323
+ const normalizedPath = normalizeUrlPath(url);
324
+ const key = `${method.toUpperCase()}:${normalizedPath}`;
325
+ const operationName = PATH_TO_OPERATION[key];
326
+ if (operationName) {
327
+ const opMeta = metadata.operations[operationName];
328
+ if (opMeta?.retry) {
329
+ return { ...DEFAULT_RETRY_CONFIG, ...opMeta.retry };
330
+ }
331
+ }
332
+ return DEFAULT_RETRY_CONFIG;
333
+ }
334
+ function createRetryMiddleware(hooks, authStrategy) {
335
+ const bodyCache = new Map();
336
+ return {
337
+ async onRequest({ request }) {
338
+ const method = request.method.toUpperCase();
339
+ if (method === "POST" || method === "PUT" || method === "PATCH") {
340
+ const requestId = `${method}:${request.url}:${Date.now()}`;
341
+ request.headers.set("X-Request-Id", requestId);
342
+ if (request.body) {
343
+ const cloned = request.clone();
344
+ bodyCache.set(requestId, await cloned.arrayBuffer());
345
+ }
346
+ else {
347
+ bodyCache.set(requestId, null);
348
+ }
349
+ }
350
+ return request;
351
+ },
352
+ async onResponse({ request, response }) {
353
+ const retryConfig = getRetryConfigForRequest(request.method, request.url);
354
+ const requestId = request.headers.get("X-Request-Id");
355
+ const cleanupBody = () => { if (requestId)
356
+ bodyCache.delete(requestId); };
357
+ let currentResponse = response;
358
+ let attempt = parseInt(request.headers.get("X-Retry-Attempt") || "0", 10);
359
+ if (Number.isNaN(attempt))
360
+ attempt = 0;
361
+ try {
362
+ while (retryConfig.retryOn.includes(currentResponse.status) &&
363
+ attempt < retryConfig.maxAttempts - 1) {
364
+ // Calculate delay (Retry-After for 429, backoff otherwise)
365
+ let delay;
366
+ if (currentResponse.status === 429) {
367
+ const ra = currentResponse.headers.get("Retry-After");
368
+ const sec = ra ? parseInt(ra, 10) : NaN;
369
+ delay = isNaN(sec) ? calculateBackoffDelay(retryConfig, attempt) : sec * 1000;
370
+ }
371
+ else {
372
+ delay = calculateBackoffDelay(retryConfig, attempt);
373
+ }
374
+ // Fire hook
375
+ if (hooks?.onRetry) {
376
+ const info = {
377
+ method: request.method,
378
+ url: request.url,
379
+ attempt: attempt + 1,
380
+ };
381
+ try {
382
+ hooks.onRetry(info, attempt + 1, new Error(`HTTP ${currentResponse.status}: ${currentResponse.statusText || "Request failed"}`), delay);
383
+ }
384
+ catch { /* hooks must not interrupt */ }
385
+ }
386
+ await sleep(delay);
387
+ attempt++;
388
+ // Build retry request
389
+ let body = null;
390
+ if (requestId && bodyCache.has(requestId)) {
391
+ body = bodyCache.get(requestId) ?? null;
392
+ }
393
+ const retryHeaders = new Headers(request.headers);
394
+ retryHeaders.set("X-Retry-Attempt", String(attempt));
395
+ if (authStrategy) {
396
+ await authStrategy.authenticate(retryHeaders);
397
+ }
398
+ currentResponse = await fetch(new Request(request.url, {
399
+ method: request.method,
400
+ headers: retryHeaders,
401
+ body,
402
+ signal: request.signal,
403
+ }));
404
+ }
405
+ return currentResponse;
406
+ }
407
+ finally {
408
+ cleanupBody();
409
+ }
410
+ },
411
+ };
412
+ }
413
+ function calculateBackoffDelay(config, attempt) {
414
+ const base = config.baseDelayMs;
415
+ let delay;
416
+ switch (config.backoff) {
417
+ case "exponential":
418
+ delay = base * Math.pow(2, attempt);
419
+ break;
420
+ case "linear":
421
+ delay = base * (attempt + 1);
422
+ break;
423
+ case "constant":
424
+ default:
425
+ delay = base;
426
+ }
427
+ const jitter = Math.random() * MAX_JITTER_MS;
428
+ return delay + jitter;
429
+ }
430
+ function sleep(ms) {
431
+ return new Promise((resolve) => setTimeout(resolve, ms));
432
+ }
433
+ // =============================================================================
434
+ // Pagination Helpers
435
+ // =============================================================================
436
+ /**
437
+ * Fetches all pages of a paginated resource using Link header pagination.
438
+ */
439
+ export async function fetchAllPages(initialResponse, parse, authHeader) {
440
+ const results = [];
441
+ let response = initialResponse;
442
+ while (true) {
443
+ const items = await parse(response.clone());
444
+ results.push(...items);
445
+ const rawNextUrl = parseNextLink(response.headers.get("Link"));
446
+ if (!rawNextUrl)
447
+ break;
448
+ const nextUrl = resolveURL(response.url, rawNextUrl);
449
+ if (!isSameOrigin(nextUrl, initialResponse.url)) {
450
+ throw new Error(`Pagination Link header points to different origin: ${nextUrl}`);
451
+ }
452
+ const headers = { Accept: "application/json" };
453
+ if (authHeader) {
454
+ headers["Authorization"] = authHeader;
455
+ }
456
+ response = await fetch(nextUrl, { headers });
457
+ }
458
+ return results;
459
+ }
460
+ /**
461
+ * Async generator that yields pages of results one at a time.
462
+ */
463
+ export async function* paginateAll(initialResponse, parse, authHeader) {
464
+ let response = initialResponse;
465
+ while (true) {
466
+ const items = await parse(response.clone());
467
+ yield items;
468
+ const rawNextUrl = parseNextLink(response.headers.get("Link"));
469
+ if (!rawNextUrl)
470
+ break;
471
+ const nextUrl = resolveURL(response.url, rawNextUrl);
472
+ if (!isSameOrigin(nextUrl, initialResponse.url)) {
473
+ throw new Error(`Pagination Link header points to different origin: ${nextUrl}`);
474
+ }
475
+ const headers = { Accept: "application/json" };
476
+ if (authHeader) {
477
+ headers["Authorization"] = authHeader;
478
+ }
479
+ response = await fetch(nextUrl, { headers });
480
+ }
481
+ }
482
+ // Re-export pagination utilities
483
+ export { parseNextLink, resolveURL, isSameOrigin };
484
+ // =============================================================================
485
+ // Service Registration
486
+ // =============================================================================
487
+ function registerServices(defineService, client, fetchPage, hooks) {
488
+ defineService("boards", () => new BoardsService(client, hooks, fetchPage));
489
+ defineService("cards", () => new CardsService(client, hooks, fetchPage));
490
+ defineService("columns", () => new ColumnsService(client, hooks, fetchPage));
491
+ defineService("comments", () => new CommentsService(client, hooks, fetchPage));
492
+ defineService("devices", () => new DevicesService(client, hooks, fetchPage));
493
+ defineService("identity", () => new IdentityService(client, hooks, fetchPage));
494
+ defineService("notifications", () => new NotificationsService(client, hooks, fetchPage));
495
+ defineService("pins", () => new PinsService(client, hooks, fetchPage));
496
+ defineService("reactions", () => new ReactionsService(client, hooks, fetchPage));
497
+ defineService("sessions", () => new SessionsService(client, hooks, fetchPage));
498
+ defineService("steps", () => new StepsService(client, hooks, fetchPage));
499
+ defineService("tags", () => new TagsService(client, hooks, fetchPage));
500
+ defineService("uploads", () => new UploadsService(client, hooks, fetchPage));
501
+ defineService("users", () => new UsersService(client, hooks, fetchPage));
502
+ defineService("webhooks", () => new WebhooksService(client, hooks, fetchPage));
503
+ defineService("miscellaneous", () => new MiscellaneousService(client, hooks, fetchPage));
504
+ }
505
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Structured error types for the Fizzy SDK.
3
+ *
4
+ * Provides typed errors with error codes, hints, and exit codes
5
+ * for CLI-friendly error handling.
6
+ */
7
+ /**
8
+ * Error codes for categorizing Fizzy API errors.
9
+ */
10
+ export type ErrorCode = "auth_required" | "forbidden" | "not_found" | "rate_limit" | "validation" | "ambiguous" | "network" | "api_error" | "usage";
11
+ /**
12
+ * Options for creating a FizzyError.
13
+ */
14
+ export interface FizzyErrorOptions {
15
+ /** User-friendly hint for resolving the error */
16
+ hint?: string;
17
+ /** HTTP status code that caused the error */
18
+ httpStatus?: number;
19
+ /** Whether the operation can be retried */
20
+ retryable?: boolean;
21
+ /** Original error that caused this error */
22
+ cause?: Error;
23
+ /** Number of seconds to wait before retrying (for rate limits) */
24
+ retryAfter?: number;
25
+ /** Request ID from the server for debugging */
26
+ requestId?: string;
27
+ }
28
+ /**
29
+ * Structured error class for Fizzy API errors.
30
+ */
31
+ export declare class FizzyError extends Error {
32
+ readonly code: ErrorCode;
33
+ readonly hint?: string;
34
+ readonly httpStatus?: number;
35
+ readonly retryable: boolean;
36
+ readonly retryAfter?: number;
37
+ readonly requestId?: string;
38
+ readonly cause?: Error;
39
+ constructor(code: ErrorCode, message: string, options?: FizzyErrorOptions);
40
+ get exitCode(): number;
41
+ toJSON(): Record<string, unknown>;
42
+ }
43
+ /**
44
+ * Factory functions for creating common error types.
45
+ */
46
+ export declare const Errors: {
47
+ auth: (hint?: string, cause?: Error) => FizzyError;
48
+ forbidden: (hint?: string, cause?: Error) => FizzyError;
49
+ notFound: (resource: string, id?: number | string) => FizzyError;
50
+ rateLimit: (retryAfter?: number, cause?: Error) => FizzyError;
51
+ validation: (message: string, hint?: string) => FizzyError;
52
+ ambiguous: (resource: string, matches: string[]) => FizzyError;
53
+ network: (message: string, cause?: Error) => FizzyError;
54
+ apiError: (message: string, httpStatus?: number, options?: Pick<FizzyErrorOptions, "hint" | "retryable" | "requestId" | "cause">) => FizzyError;
55
+ };
56
+ /**
57
+ * Creates a FizzyError from an HTTP response.
58
+ */
59
+ export declare function errorFromResponse(response: Response, requestId?: string): Promise<FizzyError>;
60
+ /**
61
+ * Type guard to check if an error is a FizzyError.
62
+ */
63
+ export declare function isFizzyError(error: unknown): error is FizzyError;
64
+ /**
65
+ * Type guard to check if an error is a specific type of FizzyError.
66
+ */
67
+ export declare function isErrorCode(error: unknown, code: ErrorCode): error is FizzyError;
68
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,WAAW,GACX,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,SAAS,GACT,WAAW,GACX,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAiB,KAAK,CAAC,EAAE,KAAK,CAAC;gBAEnB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAmBzE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAYlC;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;kBACH,MAAM,UAAU,KAAK,KAAG,UAAU;uBAO7B,MAAM,UAAU,KAAK,KAAG,UAAU;yBAOhC,MAAM,OAAO,MAAM,GAAG,MAAM,KAAG,UAAU;6BAOrC,MAAM,UAAU,KAAK,KAAG,UAAU;0BASrC,MAAM,SAAS,MAAM,KAAG,UAAU;0BAMlC,MAAM,WAAW,MAAM,EAAE,KAAG,UAAU;uBAOzC,MAAM,UAAU,KAAK,KAAG,UAAU;wBAQ1C,MAAM,eACF,MAAM,YACT,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC,KAC9E,UAAU;CAKd,CAAC;AAEF;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CAiDrB;AAqBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,IAAI,UAAU,CAEhF"}