@zapier/zapier-sdk 0.17.0 → 0.18.1

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 (70) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +92 -92
  3. package/dist/api/schemas.d.ts +1 -1
  4. package/dist/api/schemas.js +1 -1
  5. package/dist/index.cjs +132 -93
  6. package/dist/index.d.mts +58 -100
  7. package/dist/index.mjs +132 -93
  8. package/dist/plugins/apps/index.js +2 -2
  9. package/dist/plugins/apps/schemas.d.ts +4 -3
  10. package/dist/plugins/apps/schemas.d.ts.map +1 -1
  11. package/dist/plugins/apps/schemas.js +3 -2
  12. package/dist/plugins/eventEmission/transport.d.ts +8 -18
  13. package/dist/plugins/eventEmission/transport.d.ts.map +1 -1
  14. package/dist/plugins/eventEmission/transport.js +47 -44
  15. package/dist/plugins/eventEmission/transport.test.js +36 -25
  16. package/dist/plugins/fetch/index.d.ts +2 -2
  17. package/dist/plugins/fetch/index.d.ts.map +1 -1
  18. package/dist/plugins/fetch/schemas.d.ts +1 -1
  19. package/dist/plugins/fetch/schemas.d.ts.map +1 -1
  20. package/dist/plugins/fetch/schemas.js +2 -4
  21. package/dist/plugins/findFirstAuthentication/index.test.js +4 -4
  22. package/dist/plugins/findUniqueAuthentication/index.test.js +4 -4
  23. package/dist/plugins/getAuthentication/index.js +1 -1
  24. package/dist/plugins/getAuthentication/index.test.js +9 -4
  25. package/dist/plugins/getInputFieldsSchema/schemas.d.ts +1 -1
  26. package/dist/plugins/getProfile/index.d.ts.map +1 -1
  27. package/dist/plugins/getProfile/index.js +7 -4
  28. package/dist/plugins/listAuthentications/index.test.js +9 -9
  29. package/dist/plugins/listInputFieldChoices/schemas.d.ts +1 -1
  30. package/dist/plugins/listInputFields/schemas.d.ts +1 -1
  31. package/dist/plugins/manifest/schemas.d.ts +2 -2
  32. package/dist/plugins/manifest/schemas.d.ts.map +1 -1
  33. package/dist/plugins/manifest/schemas.js +2 -5
  34. package/dist/plugins/request/index.d.ts.map +1 -1
  35. package/dist/plugins/request/index.js +2 -1
  36. package/dist/plugins/request/schemas.d.ts +2 -2
  37. package/dist/plugins/request/schemas.d.ts.map +1 -1
  38. package/dist/plugins/request/schemas.js +2 -5
  39. package/dist/plugins/runAction/schemas.d.ts +1 -1
  40. package/dist/resolvers/inputFieldKey.d.ts +1 -1
  41. package/dist/resolvers/inputFieldKey.d.ts.map +1 -1
  42. package/dist/resolvers/inputs.d.ts +1 -1
  43. package/dist/resolvers/inputs.d.ts.map +1 -1
  44. package/dist/schemas/Auth.d.ts +6 -6
  45. package/dist/schemas/Auth.d.ts.map +1 -1
  46. package/dist/schemas/Auth.js +3 -1
  47. package/dist/schemas/UserProfile.d.ts +2 -44
  48. package/dist/schemas/UserProfile.d.ts.map +1 -1
  49. package/dist/schemas/UserProfile.js +10 -21
  50. package/dist/services/implementations.d.ts +2 -2
  51. package/dist/services/implementations.d.ts.map +1 -1
  52. package/dist/services/implementations.js +3 -2
  53. package/dist/temporary-internal-core/handlers/getAuthentication.test.js +6 -6
  54. package/dist/temporary-internal-core/schemas/authentications/index.d.ts +7 -7
  55. package/dist/temporary-internal-core/schemas/authentications/index.d.ts.map +1 -1
  56. package/dist/temporary-internal-core/schemas/authentications/index.js +5 -4
  57. package/dist/temporary-internal-core/utils/transformations.d.ts.map +1 -1
  58. package/dist/temporary-internal-core/utils/transformations.js +4 -2
  59. package/dist/types/properties.d.ts +1 -1
  60. package/dist/types/properties.d.ts.map +1 -1
  61. package/dist/types/properties.js +1 -2
  62. package/dist/utils/domain-utils.d.ts.map +1 -1
  63. package/dist/utils/domain-utils.js +4 -2
  64. package/dist/utils/id-utils.d.ts +13 -0
  65. package/dist/utils/id-utils.d.ts.map +1 -0
  66. package/dist/utils/id-utils.js +22 -0
  67. package/dist/utils/id-utils.test.d.ts +2 -0
  68. package/dist/utils/id-utils.test.d.ts.map +1 -0
  69. package/dist/utils/id-utils.test.js +22 -0
  70. package/package.json +1 -1
@@ -8,70 +8,73 @@
8
8
  const DEFAULT_RETRY_ATTEMPTS = 2;
9
9
  const DEFAULT_RETRY_DELAY_MS = 300;
10
10
  // HTTP Transport - sends events to remote endpoint
11
- export class HttpTransport {
12
- constructor(config) {
13
- this.config = config;
14
- }
15
- async emit(subject, event) {
16
- try {
17
- await this.emitWithRetry(subject, event, this.config.retryAttempts || DEFAULT_RETRY_ATTEMPTS);
18
- }
19
- catch {
20
- // Silent failure - never throw
21
- }
22
- }
23
- async emitWithRetry(subject, event, attemptsLeft) {
11
+ export function createHttpTransport(config) {
12
+ const delay = async (ms) => {
13
+ return new Promise((resolve) => {
14
+ const timer = setTimeout(resolve, ms);
15
+ if (typeof timer.unref === "function") {
16
+ timer.unref();
17
+ }
18
+ });
19
+ };
20
+ const emitWithRetry = async (subject, event, attemptsLeft) => {
24
21
  try {
25
22
  const payload = {
26
23
  subject,
27
24
  properties: event,
28
25
  };
29
- const response = await fetch(this.config.endpoint, {
26
+ const response = await fetch(config.endpoint, {
30
27
  method: "POST",
31
28
  headers: {
32
29
  "Content-Type": "application/json",
33
- ...this.config.headers,
30
+ ...config.headers,
34
31
  },
35
32
  body: JSON.stringify(payload),
36
33
  });
37
34
  if (!response.ok && attemptsLeft > 1) {
38
- await this.delay(this.config.retryDelayMs || DEFAULT_RETRY_DELAY_MS);
39
- return this.emitWithRetry(subject, event, attemptsLeft - 1);
35
+ await delay(config.retryDelayMs || DEFAULT_RETRY_DELAY_MS);
36
+ return emitWithRetry(subject, event, attemptsLeft - 1);
40
37
  }
41
38
  }
42
39
  catch (error) {
43
40
  if (attemptsLeft > 1) {
44
- await this.delay(this.config.retryDelayMs || DEFAULT_RETRY_DELAY_MS);
45
- return this.emitWithRetry(subject, event, attemptsLeft - 1);
41
+ await delay(config.retryDelayMs || DEFAULT_RETRY_DELAY_MS);
42
+ return emitWithRetry(subject, event, attemptsLeft - 1);
46
43
  }
47
44
  throw error;
48
45
  }
49
- }
50
- async delay(ms) {
51
- return new Promise((resolve) => {
52
- const timer = setTimeout(resolve, ms);
53
- if (typeof timer.unref === "function") {
54
- timer.unref();
46
+ };
47
+ return {
48
+ async emit(subject, event) {
49
+ try {
50
+ await emitWithRetry(subject, event, config.retryAttempts || DEFAULT_RETRY_ATTEMPTS);
55
51
  }
56
- });
57
- }
52
+ catch {
53
+ // Silent failure - never throw
54
+ }
55
+ },
56
+ };
58
57
  }
59
58
  // Console Transport - logs events to console (for development)
60
- export class ConsoleTransport {
61
- async emit(subject, event) {
62
- try {
63
- console.log("[SDK Telemetry]", JSON.stringify({ subject, properties: event }, null, 2));
64
- }
65
- catch {
66
- // Silent failure - never throw
67
- }
68
- }
59
+ export function createConsoleTransport() {
60
+ return {
61
+ async emit(subject, event) {
62
+ try {
63
+ console.log("[SDK Telemetry]", JSON.stringify({ subject, properties: event }, null, 2));
64
+ }
65
+ catch {
66
+ // Silent failure - never throw
67
+ }
68
+ },
69
+ };
69
70
  }
70
71
  // No-op Transport - discards all events (for testing/disabled state)
71
- export class NoopTransport {
72
- async emit(_subject, _event) {
73
- // Intentionally do nothing
74
- }
72
+ export function createNoopTransport() {
73
+ return {
74
+ async emit(_subject, _event) {
75
+ // Intentionally do nothing
76
+ },
77
+ };
75
78
  }
76
79
  // Transport factory
77
80
  export function createTransport(config) {
@@ -81,21 +84,21 @@ export function createTransport(config) {
81
84
  if (!config.endpoint) {
82
85
  throw new Error("HTTP transport requires endpoint");
83
86
  }
84
- return new HttpTransport({
87
+ return createHttpTransport({
85
88
  endpoint: config.endpoint,
86
89
  headers: config.headers,
87
90
  retryAttempts: config.retryAttempts,
88
91
  retryDelayMs: config.retryDelayMs,
89
92
  });
90
93
  case "console":
91
- return new ConsoleTransport();
94
+ return createConsoleTransport();
92
95
  case "noop":
93
96
  default:
94
- return new NoopTransport();
97
+ return createNoopTransport();
95
98
  }
96
99
  }
97
100
  catch {
98
101
  // If transport creation fails, return noop to maintain silent operation
99
- return new NoopTransport();
102
+ return createNoopTransport();
100
103
  }
101
104
  }
@@ -2,7 +2,7 @@
2
2
  * Tests for Event Transport Layer
3
3
  */
4
4
  import { describe, it, expect, vi, beforeEach } from "vitest";
5
- import { HttpTransport, ConsoleTransport, NoopTransport, createTransport, } from "./transport";
5
+ import { createHttpTransport, createConsoleTransport, createNoopTransport, createTransport, } from "./transport";
6
6
  // Mock fetch globally
7
7
  const mockFetch = vi.fn();
8
8
  global.fetch = mockFetch;
@@ -20,13 +20,13 @@ describe("Transport Layer", () => {
20
20
  beforeEach(() => {
21
21
  vi.clearAllMocks();
22
22
  });
23
- describe("HttpTransport", () => {
23
+ describe("createHttpTransport", () => {
24
24
  it("should emit events via HTTP successfully", async () => {
25
25
  mockFetch.mockResolvedValueOnce({
26
26
  ok: true,
27
27
  status: 200,
28
28
  });
29
- const transport = new HttpTransport({
29
+ const transport = createHttpTransport({
30
30
  endpoint: "https://telemetry.example.com/events",
31
31
  headers: { "x-api-key": "test-key" },
32
32
  });
@@ -49,7 +49,7 @@ describe("Transport Layer", () => {
49
49
  .mockResolvedValueOnce({ ok: false, status: 500 })
50
50
  .mockResolvedValueOnce({ ok: false, status: 500 })
51
51
  .mockResolvedValueOnce({ ok: true, status: 200 });
52
- const transport = new HttpTransport({
52
+ const transport = createHttpTransport({
53
53
  endpoint: "https://telemetry.example.com/events",
54
54
  retryAttempts: 3,
55
55
  retryDelayMs: 10, // Short delay for testing
@@ -59,7 +59,7 @@ describe("Transport Layer", () => {
59
59
  });
60
60
  it("should handle network errors silently", async () => {
61
61
  mockFetch.mockRejectedValue(new Error("Network error"));
62
- const transport = new HttpTransport({
62
+ const transport = createHttpTransport({
63
63
  endpoint: "https://telemetry.example.com/events",
64
64
  retryAttempts: 1,
65
65
  retryDelayMs: 1,
@@ -69,7 +69,7 @@ describe("Transport Layer", () => {
69
69
  });
70
70
  it("should stop retrying after max attempts", async () => {
71
71
  mockFetch.mockResolvedValue({ ok: false, status: 500 });
72
- const transport = new HttpTransport({
72
+ const transport = createHttpTransport({
73
73
  endpoint: "https://telemetry.example.com/events",
74
74
  retryAttempts: 2,
75
75
  retryDelayMs: 1,
@@ -78,9 +78,9 @@ describe("Transport Layer", () => {
78
78
  expect(mockFetch).toHaveBeenCalledTimes(2);
79
79
  });
80
80
  });
81
- describe("ConsoleTransport", () => {
81
+ describe("createConsoleTransport", () => {
82
82
  it("should log events to console", async () => {
83
- const transport = new ConsoleTransport();
83
+ const transport = createConsoleTransport();
84
84
  await transport.emit(sampleSubject, sampleEvent);
85
85
  expect(mockConsoleLog).toHaveBeenCalledWith("[SDK Telemetry]", JSON.stringify({ subject: sampleSubject, properties: sampleEvent }, null, 2));
86
86
  });
@@ -88,14 +88,14 @@ describe("Transport Layer", () => {
88
88
  mockConsoleLog.mockImplementation(() => {
89
89
  throw new Error("Console error");
90
90
  });
91
- const transport = new ConsoleTransport();
91
+ const transport = createConsoleTransport();
92
92
  // Should not throw despite console error
93
93
  await expect(transport.emit(sampleSubject, sampleEvent)).resolves.toBeUndefined();
94
94
  });
95
95
  });
96
- describe("NoopTransport", () => {
96
+ describe("createNoopTransport", () => {
97
97
  it("should do nothing when emitting events", async () => {
98
- const transport = new NoopTransport();
98
+ const transport = createNoopTransport();
99
99
  await transport.emit(sampleSubject, sampleEvent);
100
100
  // Verify no side effects
101
101
  expect(mockFetch).not.toHaveBeenCalled();
@@ -103,7 +103,8 @@ describe("Transport Layer", () => {
103
103
  });
104
104
  });
105
105
  describe("createTransport", () => {
106
- it("should create HTTP transport with valid config", () => {
106
+ it("should create HTTP transport with valid config", async () => {
107
+ mockFetch.mockResolvedValueOnce({ ok: true, status: 200 });
107
108
  const transport = createTransport({
108
109
  type: "http",
109
110
  endpoint: "https://example.com",
@@ -111,42 +112,52 @@ describe("Transport Layer", () => {
111
112
  retryAttempts: 5,
112
113
  retryDelayMs: 2000,
113
114
  });
114
- expect(transport).toBeInstanceOf(HttpTransport);
115
+ expect(transport.emit).toBeTypeOf("function");
116
+ await transport.emit(sampleSubject, sampleEvent);
117
+ expect(mockFetch).toHaveBeenCalledWith("https://example.com", expect.any(Object));
115
118
  });
116
- it("should create console transport", () => {
119
+ it("should create console transport", async () => {
117
120
  const transport = createTransport({
118
121
  type: "console",
119
122
  });
120
- expect(transport).toBeInstanceOf(ConsoleTransport);
123
+ expect(transport.emit).toBeTypeOf("function");
124
+ await transport.emit(sampleSubject, sampleEvent);
125
+ expect(mockConsoleLog).toHaveBeenCalled();
121
126
  });
122
- it("should create noop transport by default", () => {
127
+ it("should create noop transport by default", async () => {
123
128
  const transport = createTransport({
124
129
  type: "noop",
125
130
  });
126
- expect(transport).toBeInstanceOf(NoopTransport);
131
+ expect(transport.emit).toBeTypeOf("function");
132
+ await transport.emit(sampleSubject, sampleEvent);
133
+ expect(mockFetch).not.toHaveBeenCalled();
134
+ expect(mockConsoleLog).not.toHaveBeenCalled();
127
135
  });
128
- it("should fallback to noop transport on invalid HTTP config", () => {
136
+ it("should fallback to noop transport on invalid HTTP config", async () => {
129
137
  const transport = createTransport({
130
138
  type: "http",
131
139
  // Missing endpoint
132
140
  });
133
- expect(transport).toBeInstanceOf(NoopTransport);
141
+ expect(transport.emit).toBeTypeOf("function");
142
+ await transport.emit(sampleSubject, sampleEvent);
143
+ expect(mockFetch).not.toHaveBeenCalled();
134
144
  });
135
- it("should fallback to noop transport on unknown type", () => {
145
+ it("should fallback to noop transport on unknown type", async () => {
136
146
  const transport = createTransport({
137
147
  type: "unknown",
138
148
  });
139
- expect(transport).toBeInstanceOf(NoopTransport);
149
+ expect(transport.emit).toBeTypeOf("function");
150
+ await transport.emit(sampleSubject, sampleEvent);
151
+ expect(mockFetch).not.toHaveBeenCalled();
152
+ expect(mockConsoleLog).not.toHaveBeenCalled();
140
153
  });
141
- it("should handle transport creation errors gracefully", () => {
142
- // Since createTransport already handles errors internally,
143
- // this test verifies that invalid configs don't throw
154
+ it("should handle transport creation errors gracefully", async () => {
144
155
  expect(() => {
145
156
  const transport = createTransport({
146
157
  type: "http",
147
158
  // Missing required endpoint - should fallback to noop
148
159
  });
149
- expect(transport).toBeInstanceOf(NoopTransport);
160
+ expect(transport.emit).toBeTypeOf("function");
150
161
  }).not.toThrow();
151
162
  });
152
163
  });
@@ -4,7 +4,7 @@ import type { z } from "zod";
4
4
  import type { EventEmissionContext } from "../eventEmission";
5
5
  export interface FetchPluginProvides {
6
6
  fetch: (url: string | URL, init?: RequestInit & {
7
- authenticationId?: number;
7
+ authenticationId?: string | number;
8
8
  callbackUrl?: string;
9
9
  authenticationTemplate?: string;
10
10
  }) => Promise<Response>;
@@ -29,7 +29,7 @@ export declare const fetchPlugin: Plugin<GetSdkType<RequestPluginProvides>, // r
29
29
  EventEmissionContext, // requires eventEmission context for telemetry
30
30
  FetchPluginProvides>;
31
31
  export type ZapierFetchInitOptions = RequestInit & {
32
- authenticationId?: number;
32
+ authenticationId?: string | number;
33
33
  callbackUrl?: string;
34
34
  authenticationTemplate?: string;
35
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/fetch/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,CACL,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE,WAAW,GAAG;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,KACE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnB,UAAU,EAAE,MAAM,EAAE,CAAC;gBACrB,UAAU,EAAE,MAAM,CAAC;gBACnB,eAAe,EAAE,KAAK,CAAC;oBAAE,IAAI,EAAE,MAAM,CAAC;oBAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAA;iBAAE,CAAC,CAAC;aAC/D,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAC9B,UAAU,CAAC,qBAAqB,CAAC,EAAE,0BAA0B;AAC7D,oBAAoB,EAAE,+CAA+C;AACrE,mBAAmB,CA2EpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/fetch/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,CACL,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE,WAAW,GAAG;QACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,KACE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnB,UAAU,EAAE,MAAM,EAAE,CAAC;gBACrB,UAAU,EAAE,MAAM,CAAC;gBACnB,eAAe,EAAE,KAAK,CAAC;oBAAE,IAAI,EAAE,MAAM,CAAC;oBAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAA;iBAAE,CAAC,CAAC;aAC/D,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAC9B,UAAU,CAAC,qBAAqB,CAAC,EAAE,0BAA0B;AAC7D,oBAAoB,EAAE,+CAA+C;AACrE,mBAAmB,CA2EpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG;IACjD,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC"}
@@ -12,7 +12,7 @@ export declare const FetchInitSchema: z.ZodOptional<z.ZodObject<{
12
12
  }>>;
13
13
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14
14
  body: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodCustom<FormData, FormData>, z.ZodCustom<URLSearchParams, URLSearchParams>]>>;
15
- authenticationId: z.ZodOptional<z.ZodNumber>;
15
+ authenticationId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
16
16
  callbackUrl: z.ZodOptional<z.ZodString>;
17
17
  authenticationTemplate: z.ZodOptional<z.ZodString>;
18
18
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/plugins/fetch/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,cAAc,2DAEI,CAAC;AAEhC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;kBA6ByB,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/plugins/fetch/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc,2DAEI,CAAC;AAEhC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;kBA0ByB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { AuthenticationIdPropertySchema } from "../../types/properties";
2
3
  // Schemas for fetch function parameters
3
4
  export const FetchUrlSchema = z
4
5
  .union([z.string(), z.instanceof(URL)])
@@ -16,10 +17,7 @@ export const FetchInitSchema = z
16
17
  z.instanceof(URLSearchParams),
17
18
  ])
18
19
  .optional(),
19
- authenticationId: z
20
- .number()
21
- .optional()
22
- .describe("Zapier authentication ID to use for the request"),
20
+ authenticationId: AuthenticationIdPropertySchema.optional(),
23
21
  callbackUrl: z
24
22
  .string()
25
23
  .optional()
@@ -6,10 +6,10 @@ import { ListAuthenticationsSchema } from "../listAuthentications/schemas";
6
6
  import { eventEmissionPlugin } from "../eventEmission";
7
7
  const mockAuthentications = [
8
8
  {
9
- id: 123,
9
+ id: "123",
10
10
  title: "My Slack",
11
11
  date: "2021-01-01",
12
- account_id: 123,
12
+ account_id: "123",
13
13
  implementation_id: "api_123",
14
14
  is_expired: "false",
15
15
  expired_at: null,
@@ -18,12 +18,12 @@ const mockAuthentications = [
18
18
  shared_with_all: false,
19
19
  },
20
20
  {
21
- id: 456,
21
+ id: "456",
22
22
  title: "Slack Workspace 2",
23
23
  is_expired: "false",
24
24
  expired_at: null,
25
25
  date: "2021-01-01",
26
- account_id: 123,
26
+ account_id: "123",
27
27
  implementation_id: "api_123",
28
28
  is_invite_only: false,
29
29
  is_private: false,
@@ -5,10 +5,10 @@ import { createSdk } from "../../sdk";
5
5
  import { ListAuthenticationsSchema } from "../listAuthentications/schemas";
6
6
  import { eventEmissionPlugin } from "../eventEmission";
7
7
  const mockAuthentication = {
8
- id: 123,
8
+ id: "123",
9
9
  title: "My Slack",
10
10
  date: "2021-01-01",
11
- account_id: 123,
11
+ account_id: "123",
12
12
  implementation_id: "api_123",
13
13
  is_expired: "false",
14
14
  expired_at: null,
@@ -19,12 +19,12 @@ const mockAuthentication = {
19
19
  const mockAuthentications = [
20
20
  mockAuthentication,
21
21
  {
22
- id: 456,
22
+ id: "456",
23
23
  title: "Slack Workspace 2",
24
24
  is_expired: "false",
25
25
  expired_at: null,
26
26
  date: "2021-01-01",
27
- account_id: 123,
27
+ account_id: "123",
28
28
  implementation_id: "api_123",
29
29
  is_invite_only: false,
30
30
  is_private: false,
@@ -8,7 +8,7 @@ export const getAuthenticationPlugin = ({ context }) => {
8
8
  const { api } = context;
9
9
  // Call the SDK API endpoint, which will be routed to the handler via handlerOverride in pathConfig.
10
10
  // When the handler is migrated to SDK API, this same API call will go over the network.
11
- return await api.get(`/api/v0/authentications/${options.authenticationId}`);
11
+ return await api.get(`/api/v0/authentications/${encodeURIComponent(options.authenticationId)}`);
12
12
  }
13
13
  const getAuthenticationDefinition = createFunction(getAuthentication, GetAuthenticationSchema, createTelemetryCallback(context.eventEmission.emitMethodCalled, getAuthentication.name));
14
14
  return {
@@ -4,9 +4,9 @@ import { getAuthenticationPlugin } from "./index";
4
4
  import { createSdk } from "../../sdk";
5
5
  import { eventEmissionPlugin } from "../eventEmission";
6
6
  const mockAuthenticationItem = {
7
- id: 123,
7
+ id: "123",
8
8
  date: "2021-01-01",
9
- account_id: 456,
9
+ account_id: "456",
10
10
  implementation_id: "SlackCLIAPI@1.21.1",
11
11
  is_invite_only: false,
12
12
  is_private: false,
@@ -50,7 +50,7 @@ describe("getAuthentication plugin", () => {
50
50
  it("should throw validation error for invalid authenticationId type", async () => {
51
51
  const sdk = createTestSdk();
52
52
  await expect(sdk.getAuthentication({
53
- authenticationId: "invalid",
53
+ authenticationId: true,
54
54
  })).rejects.toThrow(ZapierValidationError);
55
55
  });
56
56
  it("should throw validation error for negative authenticationId", async () => {
@@ -71,7 +71,7 @@ describe("getAuthentication plugin", () => {
71
71
  authenticationId: 123,
72
72
  });
73
73
  expect(result.data).toBeDefined();
74
- expect(result.data.id).toBe(123);
74
+ expect(result.data.id).toBe("123");
75
75
  });
76
76
  });
77
77
  describe("SDK API endpoint routing", () => {
@@ -80,6 +80,11 @@ describe("getAuthentication plugin", () => {
80
80
  await sdk.getAuthentication({ authenticationId: 123 });
81
81
  expect(mockApiClient.get).toHaveBeenCalledWith("/api/v0/authentications/123");
82
82
  });
83
+ it("should URI encode string authenticationId in path", async () => {
84
+ const sdk = createTestSdk();
85
+ await sdk.getAuthentication({ authenticationId: "auth/with spaces" });
86
+ expect(mockApiClient.get).toHaveBeenCalledWith("/api/v0/authentications/auth%2Fwith%20spaces");
87
+ });
83
88
  it("should return data from API response", async () => {
84
89
  const sdk = createTestSdk();
85
90
  const result = await sdk.getAuthentication({ authenticationId: 123 });
@@ -15,7 +15,7 @@ export declare const GetInputFieldsSchemaSchema: z.ZodObject<{
15
15
  write: "write";
16
16
  }>;
17
17
  actionKey: z.ZodString;
18
- authenticationId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
18
+ authenticationId: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
19
19
  inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
20
20
  }, z.core.$strip>;
21
21
  export type GetInputFieldsSchemaOptions = z.infer<typeof GetInputFieldsSchemaSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/getProfile/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,CACV,OAAO,CAAC,EAAE,iBAAiB,KACxB,OAAO,CAAC;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACxC,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,UAAU,EAAE;gBACV,WAAW,EAAE,OAAO,gBAAgB,CAAC;aACtC,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAGD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,EAAE,EAAE,sBAAsB;AAC1B,AADI,sBAAsB;AAC1B;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,oBAAoB,EAAE,4CAA4C;AACvF,wBAAwB,CA6CzB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/getProfile/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,CACV,OAAO,CAAC,EAAE,iBAAiB,KACxB,OAAO,CAAC;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACxC,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,UAAU,EAAE;gBACV,WAAW,EAAE,OAAO,gBAAgB,CAAC;aACtC,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAGD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,EAAE,EAAE,sBAAsB;AAC1B,AADI,sBAAsB;AAC1B;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,oBAAoB,EAAE,4CAA4C;AACvF,wBAAwB,CA+CzB,CAAC"}
@@ -8,12 +8,15 @@ export const getProfilePlugin = ({ context }) => {
8
8
  const profile = await context.api.get("/zapier/api/v4/profile/", {
9
9
  authRequired: true,
10
10
  });
11
- // Remove user_id since that's our internal user ID which could confuse things!
12
- const { user_id: _unusedUserId, ...data } = profile;
13
11
  return {
14
12
  data: {
15
- ...data, // Pass through all API response fields
16
- full_name: `${profile.first_name} ${profile.last_name}`, // Computed field
13
+ id: String(profile.id),
14
+ first_name: profile.first_name,
15
+ last_name: profile.last_name,
16
+ full_name: `${profile.first_name} ${profile.last_name}`,
17
+ email: profile.email,
18
+ email_confirmed: profile.email_confirmed,
19
+ timezone: profile.timezone,
17
20
  },
18
21
  };
19
22
  }
@@ -107,7 +107,7 @@ describe("listAuthentications plugin", () => {
107
107
  const result = await sdk.listAuthentications();
108
108
  expect(result.data).toHaveLength(2);
109
109
  expect(result.data[0]).toMatchObject({
110
- id: 123,
110
+ id: "123",
111
111
  });
112
112
  });
113
113
  it("should throw validation error for invalid appKey type", () => {
@@ -403,8 +403,8 @@ describe("listAuthentications plugin", () => {
403
403
  expect(pages).toHaveLength(2);
404
404
  expect(pages[0].data).toHaveLength(1);
405
405
  expect(pages[1].data).toHaveLength(1);
406
- expect(pages[0].data[0].id).toBe(123);
407
- expect(pages[1].data[0].id).toBe(789);
406
+ expect(pages[0].data[0].id).toBe("123");
407
+ expect(pages[1].data[0].id).toBe("789");
408
408
  });
409
409
  it("should support async iteration over individual items", async () => {
410
410
  const sdk = createTestSdk();
@@ -415,8 +415,8 @@ describe("listAuthentications plugin", () => {
415
415
  items.push(item);
416
416
  }
417
417
  expect(items).toHaveLength(2);
418
- expect(items[0].id).toBe(123);
419
- expect(items[1].id).toBe(789);
418
+ expect(items[0].id).toBe("123");
419
+ expect(items[1].id).toBe("789");
420
420
  });
421
421
  it("should set appropriate pageSize for API calls", async () => {
422
422
  const sdk = createTestSdk();
@@ -577,12 +577,12 @@ describe("listAuthentications plugin", () => {
577
577
  const sdk = createTestSdk();
578
578
  const result = await sdk.listAuthentications({});
579
579
  const auth = result.data[0];
580
- // Verify original fields are preserved
581
- expect(auth.id).toBe(123);
580
+ // Verify original fields are preserved (IDs are converted to strings)
581
+ expect(auth.id).toBe("123");
582
582
  expect(auth.date).toBe("2021-01-01");
583
583
  expect(auth.lastchanged).toBe("2021-01-02");
584
- expect(auth.account_id).toBe(456);
585
- expect(auth.profile_id).toBe(789);
584
+ expect(auth.account_id).toBe("456");
585
+ expect(auth.profile_id).toBe("789");
586
586
  expect(auth.implementation_id).toBe("SlackCLIAPI@1.21.1");
587
587
  expect(auth.destination_selected_api).toBe("SlackDestAPI@1.0.0");
588
588
  expect(auth.is_invite_only).toBe(true);
@@ -24,7 +24,7 @@ export declare const ListInputFieldChoicesSchema: z.ZodObject<{
24
24
  }>;
25
25
  actionKey: z.ZodString;
26
26
  inputFieldKey: z.ZodString;
27
- authenticationId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
27
+ authenticationId: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
28
28
  inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
29
29
  page: z.ZodOptional<z.ZodNumber>;
30
30
  pageSize: z.ZodOptional<z.ZodNumber>;
@@ -17,7 +17,7 @@ export declare const ListInputFieldsSchema: z.ZodObject<{
17
17
  write: "write";
18
18
  }>;
19
19
  actionKey: z.ZodString;
20
- authenticationId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
20
+ authenticationId: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
21
21
  inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
22
  pageSize: z.ZodOptional<z.ZodNumber>;
23
23
  maxItems: z.ZodOptional<z.ZodNumber>;
@@ -16,7 +16,7 @@ export declare const ActionEntrySchema: z.ZodObject<{
16
16
  appKey: z.ZodString;
17
17
  actionKey: z.ZodString;
18
18
  actionType: z.ZodString;
19
- authenticationId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
19
+ authenticationId: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
20
20
  inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
21
21
  schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
22
22
  createdAt: z.ZodString;
@@ -41,7 +41,7 @@ export declare const ManifestSchema: z.ZodObject<{
41
41
  appKey: z.ZodString;
42
42
  actionKey: z.ZodString;
43
43
  actionType: z.ZodString;
44
- authenticationId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
44
+ authenticationId: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
45
45
  inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
46
46
  schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
47
47
  createdAt: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/plugins/manifest/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,eAAO,MAAM,mBAAmB,EAAG,WAAoB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,CACzC,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAE5E;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;iBAqB5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,EAC5B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;iBAkB8C,CAAC;AAE1E,eAAO,MAAM,2BAA2B;;;;;;iBAYtC,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/plugins/manifest/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,eAAO,MAAM,mBAAmB,EAAG,WAAoB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,CACzC,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAE5E;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;iBAiB5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,EAC5B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;iBAkB8C,CAAC;AAE1E,eAAO,MAAM,2BAA2B;;;;;;iBAYtC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { AuthenticationIdPropertySchema } from "../../types/properties";
2
3
  export const DEFAULT_CONFIG_PATH = ".zapierrc";
3
4
  /**
4
5
  * Action entry for storing saved action configurations
@@ -10,11 +11,7 @@ export const ActionEntrySchema = z.object({
10
11
  actionType: z
11
12
  .string()
12
13
  .describe("Action type (e.g., 'read', 'write', 'search')"),
13
- authenticationId: z
14
- .number()
15
- .nullable()
16
- .optional()
17
- .describe("Authentication ID used"),
14
+ authenticationId: AuthenticationIdPropertySchema.nullable().optional(),
18
15
  inputs: z
19
16
  .record(z.string(), z.unknown())
20
17
  .optional()
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/request/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAmB7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,OAAO,EAAE;gBACP,WAAW,EAAE,OAAO,kBAAkB,CAAC;aACxC,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAChC,EAAE,EAAE,sBAAsB;AAC1B,AADI,sBAAsB;AAC1B;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,oBAAoB,EAAE,0BAA0B;AACrE,qBAAqB,CAwFtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/request/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAoB7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,OAAO,EAAE;gBACP,WAAW,EAAE,OAAO,kBAAkB,CAAC;aACxC,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAChC,EAAE,EAAE,sBAAsB;AAC1B,AADI,sBAAsB;AAC1B;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,oBAAoB,EAAE,0BAA0B;AACrE,qBAAqB,CA2FtB,CAAC"}