@zapier/zapier-sdk 0.13.7 → 0.13.8

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 (45) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +5 -5
  4. package/dist/api/client.test.d.ts +2 -0
  5. package/dist/api/client.test.d.ts.map +1 -0
  6. package/dist/api/client.test.js +80 -0
  7. package/dist/api/index.d.ts +1 -0
  8. package/dist/api/index.d.ts.map +1 -1
  9. package/dist/api/index.js +3 -1
  10. package/dist/api/schemas.d.ts +20 -20
  11. package/dist/api/types.d.ts +2 -0
  12. package/dist/api/types.d.ts.map +1 -1
  13. package/dist/auth.d.ts +3 -0
  14. package/dist/auth.d.ts.map +1 -1
  15. package/dist/auth.test.d.ts +2 -0
  16. package/dist/auth.test.d.ts.map +1 -0
  17. package/dist/auth.test.js +102 -0
  18. package/dist/constants.d.ts +4 -4
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +4 -4
  21. package/dist/index.cjs +89 -21
  22. package/dist/index.d.mts +21 -1
  23. package/dist/index.d.ts +1 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +2 -0
  26. package/dist/index.mjs +88 -22
  27. package/dist/plugins/api/index.d.ts.map +1 -1
  28. package/dist/plugins/api/index.js +4 -1
  29. package/dist/plugins/eventEmission/index.d.ts +2 -0
  30. package/dist/plugins/eventEmission/index.d.ts.map +1 -1
  31. package/dist/plugins/eventEmission/index.js +35 -9
  32. package/dist/plugins/eventEmission/index.test.js +100 -0
  33. package/dist/schemas/Action.d.ts +2 -2
  34. package/dist/schemas/Auth.d.ts +4 -4
  35. package/dist/schemas/Field.d.ts +10 -10
  36. package/dist/sdk.test.js +121 -1
  37. package/dist/types/sdk.d.ts +3 -0
  38. package/dist/types/sdk.d.ts.map +1 -1
  39. package/dist/utils/url-utils.d.ts +19 -0
  40. package/dist/utils/url-utils.d.ts.map +1 -0
  41. package/dist/utils/url-utils.js +62 -0
  42. package/dist/utils/url-utils.test.d.ts +2 -0
  43. package/dist/utils/url-utils.test.d.ts.map +1 -0
  44. package/dist/utils/url-utils.test.js +103 -0
  45. package/package.json +2 -2
@@ -119,6 +119,106 @@ describe("eventEmissionPlugin", () => {
119
119
  await new Promise((resolve) => setTimeout(resolve, 10));
120
120
  expect(failingTransport.emit).toHaveBeenCalled();
121
121
  });
122
+ it("should log tracking failure only on first occurrence", async () => {
123
+ // Mock console.warn to track logging calls
124
+ const mockConsoleWarn = vi
125
+ .spyOn(console, "warn")
126
+ .mockImplementation(() => { });
127
+ // Mock transport to throw error
128
+ const failingTransport = {
129
+ emit: vi.fn().mockRejectedValue(new Error("Network error")),
130
+ close: vi.fn().mockResolvedValue(undefined),
131
+ };
132
+ vi.mocked(createTransport).mockReturnValueOnce(failingTransport);
133
+ const plugin = eventEmissionPlugin({
134
+ sdk: {},
135
+ context: {
136
+ meta: {},
137
+ options: {
138
+ eventEmission: {
139
+ enabled: true,
140
+ transport: {
141
+ type: "http",
142
+ endpoint: "https://example.com",
143
+ },
144
+ },
145
+ },
146
+ },
147
+ });
148
+ // First event should trigger logging
149
+ plugin.context.eventEmission.emit("test.event.FirstEvent", {
150
+ data: "first",
151
+ });
152
+ await new Promise((resolve) => setTimeout(resolve, 10));
153
+ // Verify logging occurred
154
+ const initialLogCount = mockConsoleWarn.mock.calls.length;
155
+ expect(initialLogCount).toBeGreaterThan(0);
156
+ // Second and third events should not trigger additional logging
157
+ plugin.context.eventEmission.emit("test.event.SecondEvent", {
158
+ data: "second",
159
+ });
160
+ plugin.context.eventEmission.emit("test.event.ThirdEvent", {
161
+ data: "third",
162
+ });
163
+ await new Promise((resolve) => setTimeout(resolve, 10));
164
+ // Verify no additional logging occurred
165
+ expect(mockConsoleWarn).toHaveBeenCalledTimes(initialLogCount);
166
+ mockConsoleWarn.mockRestore();
167
+ });
168
+ it("should not log failures after a successful emit", async () => {
169
+ // Mock console.warn to track logging calls
170
+ const mockConsoleWarn = vi
171
+ .spyOn(console, "warn")
172
+ .mockImplementation(() => { });
173
+ // Mock transport that succeeds first, then fails
174
+ let callCount = 0;
175
+ const mixedTransport = {
176
+ emit: vi.fn().mockImplementation(() => {
177
+ callCount++;
178
+ if (callCount === 1) {
179
+ return Promise.resolve(); // First call succeeds
180
+ }
181
+ else {
182
+ return Promise.reject(new Error("Network error")); // Subsequent calls fail
183
+ }
184
+ }),
185
+ close: vi.fn().mockResolvedValue(undefined),
186
+ };
187
+ vi.mocked(createTransport).mockReturnValueOnce(mixedTransport);
188
+ const plugin = eventEmissionPlugin({
189
+ sdk: {},
190
+ context: {
191
+ meta: {},
192
+ options: {
193
+ eventEmission: {
194
+ enabled: true,
195
+ transport: {
196
+ type: "http",
197
+ endpoint: "https://example.com",
198
+ },
199
+ },
200
+ },
201
+ },
202
+ });
203
+ // First emit should succeed
204
+ plugin.context.eventEmission.emit("test.event.SuccessfulEvent", {
205
+ data: "success",
206
+ });
207
+ // Give time for success to be recorded
208
+ await new Promise((resolve) => setTimeout(resolve, 10));
209
+ // Subsequent emits should fail but not log
210
+ plugin.context.eventEmission.emit("test.event.FailingEvent1", {
211
+ data: "fail1",
212
+ });
213
+ plugin.context.eventEmission.emit("test.event.FailingEvent2", {
214
+ data: "fail2",
215
+ });
216
+ // Give async emissions time to complete
217
+ await new Promise((resolve) => setTimeout(resolve, 20));
218
+ // Should not have logged any warnings because tracking worked initially
219
+ expect(mockConsoleWarn).toHaveBeenCalledTimes(0);
220
+ mockConsoleWarn.mockRestore();
221
+ });
122
222
  it("should merge options with defaults", () => {
123
223
  const plugin = eventEmissionPlugin({
124
224
  sdk: {},
@@ -15,8 +15,8 @@ export declare const ActionItemSchema: z.ZodObject<Omit<{
15
15
  title: z.ZodString;
16
16
  type: z.ZodLiteral<"action">;
17
17
  }, "strip", z.ZodTypeAny, {
18
- type: "action";
19
18
  key: string;
19
+ type: "action";
20
20
  description: string;
21
21
  title: string;
22
22
  app_key: string;
@@ -26,8 +26,8 @@ export declare const ActionItemSchema: z.ZodObject<Omit<{
26
26
  is_hidden?: boolean | undefined;
27
27
  app_version?: string | undefined;
28
28
  }, {
29
- type: "action";
30
29
  key: string;
30
+ type: "action";
31
31
  description: string;
32
32
  title: string;
33
33
  app_key: string;
@@ -35,6 +35,7 @@ export declare const AuthenticationItemSchema: z.ZodObject<Omit<{
35
35
  is_private: boolean;
36
36
  shared_with_all: boolean;
37
37
  url?: string | undefined;
38
+ members?: string | undefined;
38
39
  label?: string | null | undefined;
39
40
  lastchanged?: string | undefined;
40
41
  destination_selected_api?: string | null | undefined;
@@ -44,7 +45,6 @@ export declare const AuthenticationItemSchema: z.ZodObject<Omit<{
44
45
  identifier?: string | null | undefined;
45
46
  title?: string | null | undefined;
46
47
  groups?: string | undefined;
47
- members?: string | undefined;
48
48
  permissions?: Record<string, boolean> | undefined;
49
49
  user_id?: number | undefined;
50
50
  implementation_id?: string | undefined;
@@ -60,6 +60,7 @@ export declare const AuthenticationItemSchema: z.ZodObject<Omit<{
60
60
  is_private: boolean;
61
61
  shared_with_all: boolean;
62
62
  url?: string | undefined;
63
+ members?: string | undefined;
63
64
  label?: string | null | undefined;
64
65
  lastchanged?: string | undefined;
65
66
  destination_selected_api?: string | null | undefined;
@@ -69,7 +70,6 @@ export declare const AuthenticationItemSchema: z.ZodObject<Omit<{
69
70
  identifier?: string | null | undefined;
70
71
  title?: string | null | undefined;
71
72
  groups?: string | undefined;
72
- members?: string | undefined;
73
73
  permissions?: Record<string, boolean> | undefined;
74
74
  user_id?: number | undefined;
75
75
  implementation_id?: string | undefined;
@@ -114,6 +114,7 @@ export declare const AuthItemSchema: z.ZodObject<Omit<{
114
114
  is_private: boolean;
115
115
  shared_with_all: boolean;
116
116
  url?: string | undefined;
117
+ members?: string | undefined;
117
118
  label?: string | null | undefined;
118
119
  lastchanged?: string | undefined;
119
120
  destination_selected_api?: string | null | undefined;
@@ -123,7 +124,6 @@ export declare const AuthItemSchema: z.ZodObject<Omit<{
123
124
  identifier?: string | null | undefined;
124
125
  title?: string | null | undefined;
125
126
  groups?: string | undefined;
126
- members?: string | undefined;
127
127
  permissions?: Record<string, boolean> | undefined;
128
128
  user_id?: number | undefined;
129
129
  implementation_id?: string | undefined;
@@ -139,6 +139,7 @@ export declare const AuthItemSchema: z.ZodObject<Omit<{
139
139
  is_private: boolean;
140
140
  shared_with_all: boolean;
141
141
  url?: string | undefined;
142
+ members?: string | undefined;
142
143
  label?: string | null | undefined;
143
144
  lastchanged?: string | undefined;
144
145
  destination_selected_api?: string | null | undefined;
@@ -148,7 +149,6 @@ export declare const AuthItemSchema: z.ZodObject<Omit<{
148
149
  identifier?: string | null | undefined;
149
150
  title?: string | null | undefined;
150
151
  groups?: string | undefined;
151
- members?: string | undefined;
152
152
  permissions?: Record<string, boolean> | undefined;
153
153
  user_id?: number | undefined;
154
154
  implementation_id?: string | undefined;
@@ -3,11 +3,11 @@ export declare const BaseFieldItemSchema: z.ZodObject<{
3
3
  type: z.ZodString;
4
4
  key: z.ZodString;
5
5
  }, "strip", z.ZodTypeAny, {
6
- type: string;
7
6
  key: string;
8
- }, {
9
7
  type: string;
8
+ }, {
10
9
  key: string;
10
+ type: string;
11
11
  }>;
12
12
  export declare const InputFieldItemSchema: z.ZodObject<{
13
13
  key: z.ZodString;
@@ -30,8 +30,8 @@ export declare const InputFieldItemSchema: z.ZodObject<{
30
30
  type: string;
31
31
  }>>;
32
32
  }, "strip", z.ZodTypeAny, {
33
- type: "input_field";
34
33
  key: string;
34
+ type: "input_field";
35
35
  depends_on: string[];
36
36
  placeholder: string;
37
37
  description: string;
@@ -45,8 +45,8 @@ export declare const InputFieldItemSchema: z.ZodObject<{
45
45
  type: string;
46
46
  } | undefined;
47
47
  }, {
48
- type: "input_field";
49
48
  key: string;
49
+ type: "input_field";
50
50
  depends_on: string[];
51
51
  placeholder: string;
52
52
  description: string;
@@ -67,13 +67,13 @@ export declare const InfoFieldItemSchema: z.ZodObject<{
67
67
  description: z.ZodString;
68
68
  title: z.ZodOptional<z.ZodString>;
69
69
  }, "strip", z.ZodTypeAny, {
70
- type: "info_field";
71
70
  key: string;
71
+ type: "info_field";
72
72
  description: string;
73
73
  title?: string | undefined;
74
74
  }, {
75
- type: "info_field";
76
75
  key: string;
76
+ type: "info_field";
77
77
  description: string;
78
78
  title?: string | undefined;
79
79
  }>;
@@ -106,8 +106,8 @@ export declare const RootFieldItemSchema: z.ZodUnion<[z.ZodObject<{
106
106
  type: string;
107
107
  }>>;
108
108
  }, "strip", z.ZodTypeAny, {
109
- type: "input_field";
110
109
  key: string;
110
+ type: "input_field";
111
111
  depends_on: string[];
112
112
  placeholder: string;
113
113
  description: string;
@@ -121,8 +121,8 @@ export declare const RootFieldItemSchema: z.ZodUnion<[z.ZodObject<{
121
121
  type: string;
122
122
  } | undefined;
123
123
  }, {
124
- type: "input_field";
125
124
  key: string;
125
+ type: "input_field";
126
126
  depends_on: string[];
127
127
  placeholder: string;
128
128
  description: string;
@@ -142,13 +142,13 @@ export declare const RootFieldItemSchema: z.ZodUnion<[z.ZodObject<{
142
142
  description: z.ZodString;
143
143
  title: z.ZodOptional<z.ZodString>;
144
144
  }, "strip", z.ZodTypeAny, {
145
- type: "info_field";
146
145
  key: string;
146
+ type: "info_field";
147
147
  description: string;
148
148
  title?: string | undefined;
149
149
  }, {
150
- type: "info_field";
151
150
  key: string;
151
+ type: "info_field";
152
152
  description: string;
153
153
  title?: string | undefined;
154
154
  }>, z.ZodType<FieldsetItem, z.ZodTypeDef, FieldsetItem>]>;
package/dist/sdk.test.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Test the flat plugin system
2
- import { describe, it, expect } from "vitest";
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
3
3
  import { createZapierSdk, createSdk } from "./sdk";
4
4
  describe("Flat Plugin System", () => {
5
5
  it("should create SDK with all expected methods", () => {
@@ -133,3 +133,123 @@ describe("Flat Plugin System", () => {
133
133
  expect(context.meta).not.toBeNull();
134
134
  });
135
135
  });
136
+ describe("Environment Variable Support", () => {
137
+ let originalEnv;
138
+ beforeEach(() => {
139
+ // Save original environment variable
140
+ originalEnv = process.env.ZAPIER_BASE_URL;
141
+ });
142
+ afterEach(() => {
143
+ // Restore original environment variable
144
+ if (originalEnv !== undefined) {
145
+ process.env.ZAPIER_BASE_URL = originalEnv;
146
+ }
147
+ else {
148
+ delete process.env.ZAPIER_BASE_URL;
149
+ }
150
+ // Clear module cache to ensure constants are re-evaluated
151
+ vi.resetModules();
152
+ });
153
+ it("should use custom base URL from ZAPIER_BASE_URL environment variable", async () => {
154
+ // Set custom base URL via environment variable
155
+ const customBaseUrl = "https://custom-zapier.example.com";
156
+ process.env.ZAPIER_BASE_URL = customBaseUrl;
157
+ // Clear module cache and re-import to get fresh constants
158
+ vi.resetModules();
159
+ const { createZapierSdk } = await import("./sdk");
160
+ // Create mock fetch function to capture requests
161
+ const mockFetch = vi.fn().mockResolvedValue({
162
+ ok: true,
163
+ status: 200,
164
+ json: async () => ({
165
+ results: [],
166
+ meta: { next_cursor: null },
167
+ }),
168
+ headers: new Headers(),
169
+ });
170
+ // Create SDK instance with mock fetch
171
+ const sdk = createZapierSdk({
172
+ token: "test-token",
173
+ fetch: mockFetch,
174
+ });
175
+ // Make an API call that should use the custom base URL
176
+ await sdk.listApps();
177
+ // Verify that the request was made to the custom base URL
178
+ expect(mockFetch).toHaveBeenCalledTimes(1);
179
+ const [actualUrl] = mockFetch.mock.calls[0];
180
+ expect(actualUrl).toMatch(new RegExp(`^${customBaseUrl}`));
181
+ expect(actualUrl).toContain("/api/v4/");
182
+ });
183
+ it("should use default base URL when ZAPIER_BASE_URL is not set", async () => {
184
+ // Ensure environment variable is not set
185
+ delete process.env.ZAPIER_BASE_URL;
186
+ // Clear module cache and re-import to get fresh constants
187
+ vi.resetModules();
188
+ const { createZapierSdk } = await import("./sdk");
189
+ // Create mock fetch function to capture requests
190
+ const mockFetch = vi.fn().mockResolvedValue({
191
+ ok: true,
192
+ status: 200,
193
+ json: async () => ({
194
+ results: [],
195
+ meta: { next_cursor: null },
196
+ }),
197
+ headers: new Headers(),
198
+ });
199
+ // Create SDK instance with mock fetch
200
+ const sdk = createZapierSdk({
201
+ token: "test-token",
202
+ fetch: mockFetch,
203
+ });
204
+ // Make an API call that should use the default base URL
205
+ await sdk.listApps();
206
+ // Verify that the request was made to the default base URL
207
+ expect(mockFetch).toHaveBeenCalledTimes(1);
208
+ const [actualUrl] = mockFetch.mock.calls[0];
209
+ expect(actualUrl).toMatch(/^https:\/\/zapier\.com/);
210
+ expect(actualUrl).toContain("/api/v4/");
211
+ });
212
+ it("should use explicit baseUrl option for SDK API requests", async () => {
213
+ // Clear environment variable to ensure we're testing the explicit option
214
+ delete process.env.ZAPIER_BASE_URL;
215
+ // Clear module cache and re-import to get fresh constants
216
+ vi.resetModules();
217
+ const { createZapierSdk } = await import("./sdk");
218
+ const customBaseUrl = "https://staging.zapier.com";
219
+ // Create mock fetch function to capture requests
220
+ const mockFetch = vi.fn().mockResolvedValue({
221
+ ok: true,
222
+ status: 200,
223
+ json: async () => ({
224
+ results: [],
225
+ meta: { next_cursor: null },
226
+ }),
227
+ headers: new Headers(),
228
+ });
229
+ // Create SDK instance with explicit baseUrl option and mock fetch
230
+ const sdk = createZapierSdk({
231
+ baseUrl: customBaseUrl,
232
+ token: "test-token",
233
+ fetch: mockFetch,
234
+ });
235
+ // Make an API call that should use the custom base URL
236
+ await sdk.listApps();
237
+ // Verify that the request was made to the custom base URL
238
+ expect(mockFetch).toHaveBeenCalledTimes(1);
239
+ const [actualUrl] = mockFetch.mock.calls[0];
240
+ expect(actualUrl).toMatch(new RegExp(`^${customBaseUrl}`));
241
+ expect(actualUrl).toContain("/api/v4/");
242
+ });
243
+ it("should accept authClientId in SDK options", async () => {
244
+ delete process.env.ZAPIER_BASE_URL;
245
+ vi.resetModules();
246
+ const { createZapierSdk } = await import("./sdk");
247
+ const sdk = createZapierSdk({
248
+ authClientId: "test-client-id",
249
+ token: "test-token",
250
+ });
251
+ // Verify SDK was created successfully with authClientId option
252
+ expect(sdk).toBeDefined();
253
+ expect(sdk.listApps).toBeDefined();
254
+ });
255
+ });
@@ -10,6 +10,9 @@ export interface BaseSdkOptions {
10
10
  onEvent?: EventCallback;
11
11
  fetch?: typeof fetch;
12
12
  baseUrl?: string;
13
+ authBaseUrl?: string;
14
+ authClientId?: string;
15
+ trackingBaseUrl?: string;
13
16
  debug?: boolean;
14
17
  manifestPath?: string;
15
18
  manifest?: Manifest;
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/types/sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/types/sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Gets the Zapier base URL from a baseUrl if it matches Zapier hosting patterns.
3
+ * Returns the root domain URL or undefined if not a Zapier domain.
4
+ * This combines domain checking and URL extraction logic.
5
+ */
6
+ export declare function getZapierBaseUrl(baseUrl?: string): string | undefined;
7
+ /**
8
+ * Gets tracking base URL with the following precedence:
9
+ * 1. Explicit trackingBaseUrl parameter
10
+ * 2. ZAPIER_TRACKING_BASE_URL environment variable
11
+ * 3. Derive from baseUrl if it's a Zapier domain
12
+ * 4. Use baseUrl directly (whether Zapier-hosted or not)
13
+ * 5. Default to ZAPIER_BASE_URL constant
14
+ */
15
+ export declare function getTrackingBaseUrl({ trackingBaseUrl, baseUrl, }: {
16
+ trackingBaseUrl?: string;
17
+ baseUrl?: string;
18
+ }): string;
19
+ //# sourceMappingURL=url-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/utils/url-utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+BrE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,eAAe,EACf,OAAO,GACR,EAAE;IACD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CA0BT"}
@@ -0,0 +1,62 @@
1
+ import { ZAPIER_BASE_URL } from "../constants";
2
+ /**
3
+ * Gets the Zapier base URL from a baseUrl if it matches Zapier hosting patterns.
4
+ * Returns the root domain URL or undefined if not a Zapier domain.
5
+ * This combines domain checking and URL extraction logic.
6
+ */
7
+ export function getZapierBaseUrl(baseUrl) {
8
+ if (!baseUrl) {
9
+ return undefined;
10
+ }
11
+ try {
12
+ const url = new URL(baseUrl);
13
+ const hostname = url.hostname;
14
+ // Check if it matches Zapier hosting patterns by examining the last two parts
15
+ const hostParts = hostname.split(".");
16
+ if (hostParts.length < 2) {
17
+ return undefined;
18
+ }
19
+ // Check if any part is "zapier" or starts with "zapier-"
20
+ const hasZapierPart = hostParts.some((part) => part === "zapier" || part.startsWith("zapier-"));
21
+ if (!hasZapierPart) {
22
+ return undefined;
23
+ }
24
+ // Extract root domain using the last two parts
25
+ const rootDomain = hostParts.slice(-2).join(".");
26
+ return `${url.protocol}//${rootDomain}`;
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ }
32
+ /**
33
+ * Gets tracking base URL with the following precedence:
34
+ * 1. Explicit trackingBaseUrl parameter
35
+ * 2. ZAPIER_TRACKING_BASE_URL environment variable
36
+ * 3. Derive from baseUrl if it's a Zapier domain
37
+ * 4. Use baseUrl directly (whether Zapier-hosted or not)
38
+ * 5. Default to ZAPIER_BASE_URL constant
39
+ */
40
+ export function getTrackingBaseUrl({ trackingBaseUrl, baseUrl, }) {
41
+ // 1. Explicit parameter takes highest precedence
42
+ if (trackingBaseUrl) {
43
+ return trackingBaseUrl;
44
+ }
45
+ // 2. Environment variable override
46
+ if (process.env.ZAPIER_TRACKING_BASE_URL) {
47
+ return process.env.ZAPIER_TRACKING_BASE_URL;
48
+ }
49
+ // 3. Try to derive from baseUrl if it's a Zapier domain
50
+ if (baseUrl) {
51
+ const zapierBaseUrl = getZapierBaseUrl(baseUrl);
52
+ if (zapierBaseUrl) {
53
+ return zapierBaseUrl;
54
+ }
55
+ }
56
+ // 4. Use baseUrl directly for tracking (whether Zapier-hosted or not)
57
+ if (baseUrl) {
58
+ return baseUrl;
59
+ }
60
+ // 5. Default to ZAPIER_BASE_URL constant
61
+ return ZAPIER_BASE_URL;
62
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=url-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.test.d.ts","sourceRoot":"","sources":["../../src/utils/url-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,103 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { getZapierBaseUrl, getTrackingBaseUrl } from "./url-utils";
3
+ describe("getZapierBaseUrl", () => {
4
+ describe("with valid Zapier domains", () => {
5
+ it("should return root domain for zapier.* patterns", () => {
6
+ expect(getZapierBaseUrl("https://zapier.com")).toBe("https://zapier.com");
7
+ expect(getZapierBaseUrl("https://api.zapier.com")).toBe("https://zapier.com");
8
+ expect(getZapierBaseUrl("https://staging.zapier.com")).toBe("https://zapier.com");
9
+ expect(getZapierBaseUrl("https://custom.zapier.dev:8080")).toBe("https://zapier.dev");
10
+ });
11
+ it("should return root domain for zapier-*.* patterns", () => {
12
+ expect(getZapierBaseUrl("https://zapier-staging.dev")).toBe("https://zapier-staging.dev");
13
+ expect(getZapierBaseUrl("https://zapier-production.example.com")).toBe("https://example.com");
14
+ expect(getZapierBaseUrl("http://zapier-custom.local")).toBe("http://zapier-custom.local");
15
+ });
16
+ });
17
+ describe("with non-Zapier domains", () => {
18
+ it("should return undefined for non-Zapier domains", () => {
19
+ expect(getZapierBaseUrl("https://example.com")).toBe(undefined);
20
+ expect(getZapierBaseUrl("https://api.example.com")).toBe(undefined);
21
+ expect(getZapierBaseUrl("http://localhost")).toBe(undefined);
22
+ expect(getZapierBaseUrl("http://127.0.0.1")).toBe(undefined);
23
+ expect(getZapierBaseUrl("https://my-zapier.com")).toBe(undefined);
24
+ });
25
+ });
26
+ describe("with invalid inputs", () => {
27
+ it("should return undefined for invalid or missing URLs", () => {
28
+ expect(getZapierBaseUrl()).toBe(undefined);
29
+ expect(getZapierBaseUrl(undefined)).toBe(undefined);
30
+ expect(getZapierBaseUrl("")).toBe(undefined);
31
+ expect(getZapierBaseUrl("invalid-url")).toBe(undefined);
32
+ });
33
+ });
34
+ });
35
+ describe("getTrackingBaseUrl", () => {
36
+ let originalEnv;
37
+ beforeEach(() => {
38
+ originalEnv = {
39
+ ZAPIER_TRACKING_BASE_URL: process.env.ZAPIER_TRACKING_BASE_URL,
40
+ ZAPIER_BASE_URL: process.env.ZAPIER_BASE_URL,
41
+ };
42
+ });
43
+ afterEach(() => {
44
+ if (originalEnv.ZAPIER_TRACKING_BASE_URL !== undefined) {
45
+ process.env.ZAPIER_TRACKING_BASE_URL =
46
+ originalEnv.ZAPIER_TRACKING_BASE_URL;
47
+ }
48
+ else {
49
+ delete process.env.ZAPIER_TRACKING_BASE_URL;
50
+ }
51
+ if (originalEnv.ZAPIER_BASE_URL !== undefined) {
52
+ process.env.ZAPIER_BASE_URL = originalEnv.ZAPIER_BASE_URL;
53
+ }
54
+ else {
55
+ delete process.env.ZAPIER_BASE_URL;
56
+ }
57
+ });
58
+ describe("precedence rules", () => {
59
+ it("should prioritize trackingBaseUrl parameter", () => {
60
+ process.env.ZAPIER_TRACKING_BASE_URL = "https://env-tracking.zapier.com";
61
+ expect(getTrackingBaseUrl({
62
+ trackingBaseUrl: "https://param-tracking.zapier.com",
63
+ baseUrl: "https://api.example.com",
64
+ })).toBe("https://param-tracking.zapier.com");
65
+ });
66
+ it("should use ZAPIER_TRACKING_BASE_URL environment variable", () => {
67
+ process.env.ZAPIER_TRACKING_BASE_URL = "https://env-tracking.zapier.com";
68
+ expect(getTrackingBaseUrl({
69
+ baseUrl: "https://api.example.com",
70
+ })).toBe("https://env-tracking.zapier.com");
71
+ });
72
+ it("should derive from baseUrl if it's a Zapier domain", () => {
73
+ delete process.env.ZAPIER_TRACKING_BASE_URL;
74
+ expect(getTrackingBaseUrl({
75
+ baseUrl: "https://api.zapier.com",
76
+ })).toBe("https://zapier.com");
77
+ expect(getTrackingBaseUrl({
78
+ baseUrl: "https://custom.zapier.dev:8080",
79
+ })).toBe("https://zapier.dev");
80
+ });
81
+ it("should use baseUrl directly for non-Zapier domains", () => {
82
+ delete process.env.ZAPIER_TRACKING_BASE_URL;
83
+ expect(getTrackingBaseUrl({
84
+ baseUrl: "https://api.example.com",
85
+ })).toBe("https://api.example.com");
86
+ expect(getTrackingBaseUrl({
87
+ baseUrl: "http://localhost:3000",
88
+ })).toBe("http://localhost:3000");
89
+ });
90
+ it("should fallback to ZAPIER_BASE_URL constant", async () => {
91
+ delete process.env.ZAPIER_TRACKING_BASE_URL;
92
+ process.env.ZAPIER_BASE_URL = "https://custom.zapier.com";
93
+ // Clear module cache and re-import to get fresh constants
94
+ vi.resetModules();
95
+ const { getTrackingBaseUrl: freshGetTrackingBaseUrl } = await import("./url-utils");
96
+ expect(freshGetTrackingBaseUrl({})).toBe("https://custom.zapier.com");
97
+ delete process.env.ZAPIER_BASE_URL;
98
+ vi.resetModules();
99
+ const { getTrackingBaseUrl: defaultGetTrackingBaseUrl } = await import("./url-utils");
100
+ expect(defaultGetTrackingBaseUrl({})).toBe("https://zapier.com");
101
+ });
102
+ });
103
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zapier/zapier-sdk",
3
- "version": "0.13.7",
3
+ "version": "0.13.8",
4
4
  "description": "Complete Zapier SDK - combines all Zapier SDK packages",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -51,7 +51,7 @@
51
51
  "tsup": "^8.5.0",
52
52
  "typescript": "^5.8.3",
53
53
  "vitest": "^3.2.3",
54
- "@zapier/zapier-sdk-cli-login": "0.3.3"
54
+ "@zapier/zapier-sdk-cli-login": "0.3.4"
55
55
  },
56
56
  "scripts": {
57
57
  "build": "tsup",