@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.
- package/CHANGELOG.md +8 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +5 -5
- package/dist/api/client.test.d.ts +2 -0
- package/dist/api/client.test.d.ts.map +1 -0
- package/dist/api/client.test.js +80 -0
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -1
- package/dist/api/schemas.d.ts +20 -20
- package/dist/api/types.d.ts +2 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/auth.d.ts +3 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.test.d.ts +2 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +102 -0
- package/dist/constants.d.ts +4 -4
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -4
- package/dist/index.cjs +89 -21
- package/dist/index.d.mts +21 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.mjs +88 -22
- package/dist/plugins/api/index.d.ts.map +1 -1
- package/dist/plugins/api/index.js +4 -1
- package/dist/plugins/eventEmission/index.d.ts +2 -0
- package/dist/plugins/eventEmission/index.d.ts.map +1 -1
- package/dist/plugins/eventEmission/index.js +35 -9
- package/dist/plugins/eventEmission/index.test.js +100 -0
- package/dist/schemas/Action.d.ts +2 -2
- package/dist/schemas/Auth.d.ts +4 -4
- package/dist/schemas/Field.d.ts +10 -10
- package/dist/sdk.test.js +121 -1
- package/dist/types/sdk.d.ts +3 -0
- package/dist/types/sdk.d.ts.map +1 -1
- package/dist/utils/url-utils.d.ts +19 -0
- package/dist/utils/url-utils.d.ts.map +1 -0
- package/dist/utils/url-utils.js +62 -0
- package/dist/utils/url-utils.test.d.ts +2 -0
- package/dist/utils/url-utils.test.d.ts.map +1 -0
- package/dist/utils/url-utils.test.js +103 -0
- 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: {},
|
package/dist/schemas/Action.d.ts
CHANGED
|
@@ -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;
|
package/dist/schemas/Auth.d.ts
CHANGED
|
@@ -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;
|
package/dist/schemas/Field.d.ts
CHANGED
|
@@ -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
|
+
});
|
package/dist/types/sdk.d.ts
CHANGED
package/dist/types/sdk.d.ts.map
CHANGED
|
@@ -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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAGD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACzF,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,4CAA4C,CAAC;AACrG,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,6CAA6C,CAAC;AACvG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAMlE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAGD,MAAM,WAAW,kBACf,SAAQ,0BAA0B,EAChC,4BAA4B,EAC5B,kCAAkC,EAClC,mCAAmC,EACnC,uBAAuB;CAE1B;AAUD,MAAM,WAAW,SACf,SAAQ,UAAU,CAChB,sBAAsB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,sBAAsB,GACtB,sBAAsB,GACtB,oBAAoB,GACpB,yBAAyB,GACzB,uBAAuB,GACvB,uBAAuB,GACvB,iCAAiC,GACjC,+BAA+B,GAC/B,qCAAqC,GACrC,sCAAsC,GACtC,6BAA6B,GAC7B,mCAAmC,GACnC,qBAAqB,GACrB,wBAAwB,GACxB,qBAAqB,GACrB,iBAAiB,CACpB;IAED,IAAI,EAAE,WAAW,GAAG,aAAa,CAAC;CACnC"}
|
|
@@ -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 @@
|
|
|
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.
|
|
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.
|
|
54
|
+
"@zapier/zapier-sdk-cli-login": "0.3.4"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"build": "tsup",
|