@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
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Cookie-based authentication strategy for the Fizzy SDK.
3
+ *
4
+ * CookieAuth sets the Cookie header for session-based authentication,
5
+ * used by mobile and web clients.
6
+ */
7
+ import type { AuthStrategy } from "../auth-strategy.js";
8
+ /**
9
+ * Provider for cookie values — either a static string or an async function.
10
+ */
11
+ export type CookieProvider = string | (() => Promise<string>);
12
+ /**
13
+ * Cookie-based authentication strategy.
14
+ * Sets the Cookie header with the provided session cookie.
15
+ */
16
+ export declare class CookieAuth implements AuthStrategy {
17
+ private cookieProvider;
18
+ constructor(cookieProvider: CookieProvider);
19
+ authenticate(headers: Headers): Promise<void>;
20
+ }
21
+ /**
22
+ * Creates a CookieAuth strategy from a CookieProvider.
23
+ */
24
+ export declare function cookieAuth(cookieProvider: CookieProvider): AuthStrategy;
25
+ //# sourceMappingURL=cookie-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-auth.d.ts","sourceRoot":"","sources":["../../src/auth/cookie-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE9D;;;GAGG;AACH,qBAAa,UAAW,YAAW,YAAY;IAC7C,OAAO,CAAC,cAAc,CAAiB;gBAE3B,cAAc,EAAE,cAAc;IAIpC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAEvE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Cookie-based authentication strategy for the Fizzy SDK.
3
+ *
4
+ * CookieAuth sets the Cookie header for session-based authentication,
5
+ * used by mobile and web clients.
6
+ */
7
+ /**
8
+ * Cookie-based authentication strategy.
9
+ * Sets the Cookie header with the provided session cookie.
10
+ */
11
+ export class CookieAuth {
12
+ cookieProvider;
13
+ constructor(cookieProvider) {
14
+ this.cookieProvider = cookieProvider;
15
+ }
16
+ async authenticate(headers) {
17
+ const cookie = typeof this.cookieProvider === "function"
18
+ ? await this.cookieProvider()
19
+ : this.cookieProvider;
20
+ headers.set("Cookie", cookie);
21
+ }
22
+ }
23
+ /**
24
+ * Creates a CookieAuth strategy from a CookieProvider.
25
+ */
26
+ export function cookieAuth(cookieProvider) {
27
+ return new CookieAuth(cookieProvider);
28
+ }
29
+ //# sourceMappingURL=cookie-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-auth.js","sourceRoot":"","sources":["../../src/auth/cookie-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,cAAc,CAAiB;IAEvC,YAAY,cAA8B;QACxC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB;QACjC,MAAM,MAAM,GACV,OAAO,IAAI,CAAC,cAAc,KAAK,UAAU;YACvC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE;YAC7B,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,cAA8B;IACvD,OAAO,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Magic-link passwordless login flow for the Fizzy SDK.
3
+ *
4
+ * Two-step orchestrator:
5
+ * 1. CreateSession — sends a magic link to the user's email
6
+ * 2. RedeemMagicLink — exchanges the magic link token for a session
7
+ */
8
+ import type { AuthStrategy } from "../auth-strategy.js";
9
+ /**
10
+ * Result of the magic link request step.
11
+ */
12
+ export interface MagicLinkRequestResult {
13
+ /** Whether the magic link email was sent successfully */
14
+ sent: boolean;
15
+ /** User-facing message (e.g., "Check your email") */
16
+ message: string;
17
+ }
18
+ /**
19
+ * Result of the magic link redemption step.
20
+ */
21
+ export interface MagicLinkRedeemResult {
22
+ /** The session token to use for subsequent requests */
23
+ sessionToken: string;
24
+ /** The authentication strategy configured with the session */
25
+ auth: AuthStrategy;
26
+ }
27
+ /**
28
+ * Options for the magic link flow.
29
+ */
30
+ export interface MagicLinkFlowOptions {
31
+ /** Base URL of the Fizzy API (defaults to https://fizzy.do) */
32
+ baseUrl?: string;
33
+ /** User-Agent header for requests */
34
+ userAgent?: string;
35
+ }
36
+ /**
37
+ * Orchestrates the magic-link passwordless login flow.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const flow = new MagicLinkFlow();
42
+ *
43
+ * // Step 1: Request the magic link
44
+ * const { sent } = await flow.requestLink("user@example.com");
45
+ *
46
+ * // Step 2: User clicks the link, you capture the token
47
+ * const { auth } = await flow.redeemToken(token);
48
+ *
49
+ * // Step 3: Use the auth strategy with the client
50
+ * const client = createFizzyClient({ auth });
51
+ * ```
52
+ */
53
+ export declare class MagicLinkFlow {
54
+ private readonly baseUrl;
55
+ private readonly userAgent;
56
+ constructor(options?: MagicLinkFlowOptions);
57
+ /**
58
+ * Step 1: Request a magic link be sent to the user's email.
59
+ */
60
+ requestLink(email: string): Promise<MagicLinkRequestResult>;
61
+ /**
62
+ * Step 2: Redeem a magic link token for a session.
63
+ */
64
+ redeemToken(token: string): Promise<MagicLinkRedeemResult>;
65
+ }
66
+ //# sourceMappingURL=magic-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-link.d.ts","sourceRoot":"","sources":["../../src/auth/magic-link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,IAAI,EAAE,OAAO,CAAC;IACd,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,IAAI,EAAE,YAAY,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,CAAC,EAAE,oBAAoB;IAK1C;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAsBjE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAgCjE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Magic-link passwordless login flow for the Fizzy SDK.
3
+ *
4
+ * Two-step orchestrator:
5
+ * 1. CreateSession — sends a magic link to the user's email
6
+ * 2. RedeemMagicLink — exchanges the magic link token for a session
7
+ */
8
+ import { FizzyError } from "../errors.js";
9
+ /**
10
+ * Orchestrates the magic-link passwordless login flow.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const flow = new MagicLinkFlow();
15
+ *
16
+ * // Step 1: Request the magic link
17
+ * const { sent } = await flow.requestLink("user@example.com");
18
+ *
19
+ * // Step 2: User clicks the link, you capture the token
20
+ * const { auth } = await flow.redeemToken(token);
21
+ *
22
+ * // Step 3: Use the auth strategy with the client
23
+ * const client = createFizzyClient({ auth });
24
+ * ```
25
+ */
26
+ export class MagicLinkFlow {
27
+ baseUrl;
28
+ userAgent;
29
+ constructor(options) {
30
+ this.baseUrl = options?.baseUrl ?? "https://fizzy.do";
31
+ this.userAgent = options?.userAgent ?? "fizzy-sdk-ts/0.1.0";
32
+ }
33
+ /**
34
+ * Step 1: Request a magic link be sent to the user's email.
35
+ */
36
+ async requestLink(email) {
37
+ const response = await fetch(`${this.baseUrl}/sessions`, {
38
+ method: "POST",
39
+ headers: {
40
+ "Content-Type": "application/json",
41
+ "User-Agent": this.userAgent,
42
+ Accept: "application/json",
43
+ },
44
+ body: JSON.stringify({ email }),
45
+ });
46
+ if (!response.ok) {
47
+ throw new FizzyError("api_error", `Magic link request failed: ${response.status} ${response.statusText}`, { httpStatus: response.status });
48
+ }
49
+ return { sent: true, message: "Check your email for the magic link" };
50
+ }
51
+ /**
52
+ * Step 2: Redeem a magic link token for a session.
53
+ */
54
+ async redeemToken(token) {
55
+ const response = await fetch(`${this.baseUrl}/sessions/redeem`, {
56
+ method: "POST",
57
+ headers: {
58
+ "Content-Type": "application/json",
59
+ "User-Agent": this.userAgent,
60
+ Accept: "application/json",
61
+ },
62
+ body: JSON.stringify({ token }),
63
+ });
64
+ if (!response.ok) {
65
+ throw new FizzyError("auth_required", `Magic link redemption failed: ${response.status} ${response.statusText}`, { httpStatus: response.status, hint: "The magic link may have expired. Request a new one." });
66
+ }
67
+ const body = await response.json();
68
+ const sessionToken = body.session_token ?? body.token;
69
+ if (!sessionToken || typeof sessionToken !== "string") {
70
+ throw new FizzyError("api_error", "No session token in magic link response");
71
+ }
72
+ // Import CookieAuth dynamically to avoid circular dependency at module level
73
+ const { CookieAuth } = await import("./cookie-auth.js");
74
+ const auth = new CookieAuth(sessionToken);
75
+ return { sessionToken, auth };
76
+ }
77
+ }
78
+ //# sourceMappingURL=magic-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-link.js","sourceRoot":"","sources":["../../src/auth/magic-link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgC1C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,CAAS;IAChB,SAAS,CAAS;IAEnC,YAAY,OAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,kBAAkB,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,oBAAoB,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,IAAI,CAAC,SAAS;gBAC5B,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,UAAU,CAClB,WAAW,EACX,8BAA8B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EACtE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAChC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,IAAI,CAAC,SAAS;gBAC5B,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,UAAU,CAClB,eAAe,EACf,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EACzE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,qDAAqD,EAAE,CAC7F,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAgD,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC;QAEtD,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,yCAAyC,CAAC,CAAC;QAC/E,CAAC;QAED,6EAA6E;QAC7E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;QAE1C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Authentication strategy for the Fizzy SDK.
3
+ *
4
+ * AuthStrategy controls how authentication is applied to HTTP requests.
5
+ * Fizzy supports Bearer tokens and Cookie sessions.
6
+ */
7
+ import type { TokenProvider } from "./client.js";
8
+ /**
9
+ * AuthStrategy controls how authentication is applied to HTTP requests.
10
+ * Called before every HTTP request to apply credentials to headers.
11
+ */
12
+ export interface AuthStrategy {
13
+ /**
14
+ * Apply authentication to the given request headers.
15
+ * Called before every HTTP request.
16
+ */
17
+ authenticate(headers: Headers): Promise<void>;
18
+ }
19
+ /**
20
+ * Bearer token authentication strategy.
21
+ * Sets the Authorization header with "Bearer {token}".
22
+ */
23
+ export declare class BearerAuth implements AuthStrategy {
24
+ private tokenProvider;
25
+ constructor(tokenProvider: TokenProvider);
26
+ authenticate(headers: Headers): Promise<void>;
27
+ }
28
+ /**
29
+ * Creates a BearerAuth strategy from a TokenProvider.
30
+ */
31
+ export declare function bearerAuth(tokenProvider: TokenProvider): AuthStrategy;
32
+ //# sourceMappingURL=auth-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-strategy.d.ts","sourceRoot":"","sources":["../src/auth-strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;;GAGG;AACH,qBAAa,UAAW,YAAW,YAAY;IAC7C,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,EAAE,aAAa;IAIlC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,aAAa,GAAG,YAAY,CAErE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Authentication strategy for the Fizzy SDK.
3
+ *
4
+ * AuthStrategy controls how authentication is applied to HTTP requests.
5
+ * Fizzy supports Bearer tokens and Cookie sessions.
6
+ */
7
+ /**
8
+ * Bearer token authentication strategy.
9
+ * Sets the Authorization header with "Bearer {token}".
10
+ */
11
+ export class BearerAuth {
12
+ tokenProvider;
13
+ constructor(tokenProvider) {
14
+ this.tokenProvider = tokenProvider;
15
+ }
16
+ async authenticate(headers) {
17
+ const token = typeof this.tokenProvider === "function"
18
+ ? await this.tokenProvider()
19
+ : this.tokenProvider;
20
+ headers.set("Authorization", `Bearer ${token}`);
21
+ }
22
+ }
23
+ /**
24
+ * Creates a BearerAuth strategy from a TokenProvider.
25
+ */
26
+ export function bearerAuth(tokenProvider) {
27
+ return new BearerAuth(tokenProvider);
28
+ }
29
+ //# sourceMappingURL=auth-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-strategy.js","sourceRoot":"","sources":["../src/auth-strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,aAAa,CAAgB;IAErC,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB;QACjC,MAAM,KAAK,GACT,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU;YACtC,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE;YAC5B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,aAA4B;IACrD,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * In-memory ETag cache for the Fizzy SDK.
3
+ *
4
+ * Provides HTTP conditional request support using ETag/If-None-Match headers.
5
+ * Entries are isolated by auth token hash to prevent cache poisoning across
6
+ * different auth contexts.
7
+ */
8
+ export interface ETagCacheOptions {
9
+ /** Maximum number of cached responses (default: 1000) */
10
+ maxEntries?: number;
11
+ /** Maximum number of token hash entries (default: 100) */
12
+ maxTokenHashes?: number;
13
+ }
14
+ /**
15
+ * In-memory ETag cache with token-hash isolation.
16
+ * Uses Map insertion-order iteration to approximate LRU eviction.
17
+ */
18
+ export declare class ETagCache {
19
+ private readonly cache;
20
+ private readonly maxEntries;
21
+ private readonly maxTokenHashes;
22
+ private readonly hashTokenMap;
23
+ private readonly pendingHashes;
24
+ constructor(options?: ETagCacheOptions);
25
+ /**
26
+ * Get the stored ETag for a URL (if any).
27
+ */
28
+ getETag(cacheKey: string): string | undefined;
29
+ /**
30
+ * Get the stored response body for a URL (if any).
31
+ */
32
+ getBody(cacheKey: string): string | undefined;
33
+ /**
34
+ * Store an ETag and response body.
35
+ */
36
+ set(cacheKey: string, etag: string, body: string): void;
37
+ /**
38
+ * Derive a cache key from URL and auth header.
39
+ */
40
+ getCacheKey(url: string, authHeader: string | null): Promise<string>;
41
+ /** Number of cached entries. */
42
+ get size(): number;
43
+ /** Clear all cached entries. */
44
+ clear(): void;
45
+ private getTokenHash;
46
+ private evictOldest;
47
+ private evictOldestHash;
48
+ }
49
+ //# sourceMappingURL=etag-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"etag-cache.d.ts","sourceRoot":"","sources":["../../src/cache/etag-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;gBAExD,OAAO,CAAC,EAAE,gBAAgB;IAKtC;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKvD;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,gCAAgC;IAChC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,gCAAgC;IAChC,KAAK,IAAI,IAAI;YAIC,YAAY;IA2B1B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,eAAe;CAMxB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * In-memory ETag cache for the Fizzy SDK.
3
+ *
4
+ * Provides HTTP conditional request support using ETag/If-None-Match headers.
5
+ * Entries are isolated by auth token hash to prevent cache poisoning across
6
+ * different auth contexts.
7
+ */
8
+ /**
9
+ * In-memory ETag cache with token-hash isolation.
10
+ * Uses Map insertion-order iteration to approximate LRU eviction.
11
+ */
12
+ export class ETagCache {
13
+ cache = new Map();
14
+ maxEntries;
15
+ maxTokenHashes;
16
+ hashTokenMap = new Map();
17
+ pendingHashes = new Map();
18
+ constructor(options) {
19
+ this.maxEntries = options?.maxEntries ?? 1000;
20
+ this.maxTokenHashes = options?.maxTokenHashes ?? 100;
21
+ }
22
+ /**
23
+ * Get the stored ETag for a URL (if any).
24
+ */
25
+ getETag(cacheKey) {
26
+ return this.cache.get(cacheKey)?.etag;
27
+ }
28
+ /**
29
+ * Get the stored response body for a URL (if any).
30
+ */
31
+ getBody(cacheKey) {
32
+ return this.cache.get(cacheKey)?.body;
33
+ }
34
+ /**
35
+ * Store an ETag and response body.
36
+ */
37
+ set(cacheKey, etag, body) {
38
+ this.evictOldest();
39
+ this.cache.set(cacheKey, { etag, body });
40
+ }
41
+ /**
42
+ * Derive a cache key from URL and auth header.
43
+ */
44
+ async getCacheKey(url, authHeader) {
45
+ const tokenHash = await this.getTokenHash(authHeader);
46
+ return `${tokenHash}:${url}`;
47
+ }
48
+ /** Number of cached entries. */
49
+ get size() {
50
+ return this.cache.size;
51
+ }
52
+ /** Clear all cached entries. */
53
+ clear() {
54
+ this.cache.clear();
55
+ }
56
+ async getTokenHash(authHeader) {
57
+ if (!authHeader)
58
+ return "";
59
+ const cached = this.hashTokenMap.get(authHeader);
60
+ if (cached)
61
+ return cached;
62
+ const pending = this.pendingHashes.get(authHeader);
63
+ if (pending)
64
+ return pending;
65
+ const promise = (async () => {
66
+ const data = new TextEncoder().encode(authHeader);
67
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
68
+ const hashArray = new Uint8Array(hashBuffer);
69
+ const hash = Array.from(hashArray.slice(0, 8))
70
+ .map((b) => b.toString(16).padStart(2, "0"))
71
+ .join("");
72
+ this.evictOldestHash();
73
+ this.hashTokenMap.set(authHeader, hash);
74
+ return hash;
75
+ })();
76
+ this.pendingHashes.set(authHeader, promise);
77
+ promise.finally(() => this.pendingHashes.delete(authHeader));
78
+ return promise;
79
+ }
80
+ evictOldest() {
81
+ if (this.cache.size >= this.maxEntries) {
82
+ const firstKey = this.cache.keys().next().value;
83
+ if (firstKey)
84
+ this.cache.delete(firstKey);
85
+ }
86
+ }
87
+ evictOldestHash() {
88
+ if (this.hashTokenMap.size >= this.maxTokenHashes) {
89
+ const firstKey = this.hashTokenMap.keys().next().value;
90
+ if (firstKey)
91
+ this.hashTokenMap.delete(firstKey);
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=etag-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"etag-cache.js","sourceRoot":"","sources":["../../src/cache/etag-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
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 type { paths } from "./generated/schema.js";
10
+ import type { FizzyHooks } from "./hooks.js";
11
+ import { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
12
+ import { type AuthStrategy } from "./auth-strategy.js";
13
+ export type { paths };
14
+ /**
15
+ * Raw client type from openapi-fetch.
16
+ */
17
+ export type RawClient = ReturnType<typeof createClient<paths>>;
18
+ /**
19
+ * Enhanced Fizzy client with hooks support and service accessors.
20
+ */
21
+ export interface FizzyClient extends RawClient {
22
+ readonly raw: RawClient;
23
+ readonly hooks?: FizzyHooks;
24
+ /**
25
+ * Returns a new client scoped to the given account ID.
26
+ * The new client shares auth strategy, hooks, and settings but
27
+ * targets a different account URL prefix.
28
+ */
29
+ forAccount(accountId: string): FizzyClient;
30
+ }
31
+ /**
32
+ * Token provider — either a static token string or an async function that returns a token.
33
+ */
34
+ export type TokenProvider = string | (() => Promise<string>);
35
+ /**
36
+ * Configuration options for creating a Fizzy client.
37
+ */
38
+ export interface FizzyClientOptions {
39
+ /** Fizzy account ID (found in your Fizzy URL) */
40
+ accountId?: string;
41
+ /** Bearer access token or async function that returns one */
42
+ accessToken?: TokenProvider;
43
+ /** Authentication strategy (alternative to accessToken for custom auth schemes) */
44
+ auth?: AuthStrategy;
45
+ /** Base URL override (defaults to https://fizzy.do) */
46
+ baseUrl?: string;
47
+ /** User-Agent header (defaults to fizzy-sdk-ts/VERSION (api:API_VERSION)) */
48
+ userAgent?: string;
49
+ /** Enable ETag-based caching (defaults to false) */
50
+ enableCache?: boolean;
51
+ /** Enable automatic retry on 429/503 (defaults to true) */
52
+ enableRetry?: boolean;
53
+ /** Request timeout in milliseconds (defaults to 30000) */
54
+ requestTimeoutMs?: number;
55
+ /** Hooks for observability (logging, metrics, tracing) */
56
+ hooks?: FizzyHooks;
57
+ }
58
+ export declare const VERSION = "0.1.0";
59
+ export declare const API_VERSION = "2026-03-01";
60
+ /**
61
+ * Creates a type-safe Fizzy API client with built-in middleware for:
62
+ * - Authentication (Bearer token or Cookie session)
63
+ * - Retry with exponential backoff (respects Retry-After header)
64
+ * - ETag-based HTTP caching
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * import { createFizzyClient } from "@37signals/fizzy";
69
+ *
70
+ * const client = createFizzyClient({
71
+ * accessToken: process.env.FIZZY_TOKEN!,
72
+ * });
73
+ *
74
+ * const { data, error } = await client.GET("/boards.json");
75
+ * ```
76
+ */
77
+ export declare function createFizzyClient(options: FizzyClientOptions): FizzyClient;
78
+ /**
79
+ * Normalizes a URL path by replacing numeric IDs with placeholder tokens.
80
+ * For example: /boards/456/cards/789 -> /boards/{boardId}/cards/{cardNumber}
81
+ */
82
+ export declare function normalizeUrlPath(url: string): string;
83
+ /**
84
+ * Fetches all pages of a paginated resource using Link header pagination.
85
+ */
86
+ export declare function fetchAllPages<T>(initialResponse: Response, parse: (response: Response) => Promise<T[]>, authHeader?: string): Promise<T[]>;
87
+ /**
88
+ * Async generator that yields pages of results one at a time.
89
+ */
90
+ export declare function paginateAll<T>(initialResponse: Response, parse: (response: Response) => Promise<T[]>, authHeader?: string): AsyncGenerator<T[], void, unknown>;
91
+ export { parseNextLink, resolveURL, isSameOrigin };
92
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,YAAiC,MAAM,eAAe,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAA8B,MAAM,YAAY,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAuBnE,YAAY,EAAE,KAAK,EAAE,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAE5B;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC;CAI5C;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,mFAAmF;IACnF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,WAAW,eAAe,CAAC;AAIxC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAkH1E;AAsLD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsDpD;AAoID;;GAEG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,eAAe,EAAE,QAAQ,EACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EAC3C,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,EAAE,CAAC,CA0Bd;AAED;;GAEG;AACH,wBAAuB,WAAW,CAAC,CAAC,EAClC,eAAe,EAAE,QAAQ,EACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EAC3C,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAuBpC;AAGD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}