n8n-nodes-pocketbase 2.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +19 -1
  2. package/dist/credentials/PocketbaseHttpApi.credentials.d.ts +1 -1
  3. package/dist/credentials/PocketbaseHttpApi.credentials.js +13 -9
  4. package/dist/credentials/PocketbaseHttpApi.credentials.js.map +1 -1
  5. package/dist/nodes/{PocketbaseHttp → Common}/GenericFunctions.d.ts +3 -2
  6. package/dist/nodes/Common/GenericFunctions.js +85 -0
  7. package/dist/nodes/Common/GenericFunctions.js.map +1 -0
  8. package/dist/nodes/{PocketbaseHttp → Common}/LoadOptions.d.ts +1 -1
  9. package/dist/nodes/{PocketbaseHttp → Common}/LoadOptions.js +47 -20
  10. package/dist/nodes/Common/LoadOptions.js.map +1 -0
  11. package/dist/nodes/Common/RequestBodyFunctions.js +131 -0
  12. package/dist/nodes/Common/RequestBodyFunctions.js.map +1 -0
  13. package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.js +4 -3
  14. package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.js.map +1 -1
  15. package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.json +2 -2
  16. package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.d.ts +13 -0
  17. package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js +239 -0
  18. package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js.map +1 -0
  19. package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.json +18 -0
  20. package/dist/nodes/PocketbaseTrigger/pocketbaseTrigger.dark.svg +10 -0
  21. package/dist/nodes/PocketbaseTrigger/pocketbaseTrigger.svg +10 -0
  22. package/dist/package.json +17 -7
  23. package/dist/tests/GenericFunctions.spec.js +177 -0
  24. package/dist/tests/GenericFunctions.spec.js.map +1 -0
  25. package/dist/tests/PocketbaseCredentials.spec.d.ts +1 -0
  26. package/dist/tests/PocketbaseCredentials.spec.js +47 -0
  27. package/dist/tests/PocketbaseCredentials.spec.js.map +1 -0
  28. package/dist/tests/PocketbaseTrigger.spec.d.ts +1 -0
  29. package/dist/tests/PocketbaseTrigger.spec.js +243 -0
  30. package/dist/tests/PocketbaseTrigger.spec.js.map +1 -0
  31. package/dist/tests/PocketbaseTriggerIntegration.spec.d.ts +1 -0
  32. package/dist/tests/PocketbaseTriggerIntegration.spec.js +125 -0
  33. package/dist/tests/PocketbaseTriggerIntegration.spec.js.map +1 -0
  34. package/dist/tests/RequestBodyFunctions.spec.d.ts +1 -0
  35. package/dist/tests/RequestBodyFunctions.spec.js +232 -0
  36. package/dist/tests/RequestBodyFunctions.spec.js.map +1 -0
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +17 -7
  39. package/dist/nodes/PocketbaseHttp/GenericFunctions.js +0 -42
  40. package/dist/nodes/PocketbaseHttp/GenericFunctions.js.map +0 -1
  41. package/dist/nodes/PocketbaseHttp/LoadOptions.js.map +0 -1
  42. package/dist/nodes/PocketbaseHttp/PocketbaseAuth.d.ts +0 -7
  43. package/dist/nodes/PocketbaseHttp/PocketbaseAuth.js +0 -50
  44. package/dist/nodes/PocketbaseHttp/PocketbaseAuth.js.map +0 -1
  45. package/dist/nodes/PocketbaseHttp/RequestBodyFunctions.js +0 -62
  46. package/dist/nodes/PocketbaseHttp/RequestBodyFunctions.js.map +0 -1
  47. package/dist/tests/PocketbaseAuth.spec.js +0 -75
  48. package/dist/tests/PocketbaseAuth.spec.js.map +0 -1
  49. /package/dist/nodes/{PocketbaseHttp → Common}/RequestBodyFunctions.d.ts +0 -0
  50. /package/dist/tests/{PocketbaseAuth.spec.d.ts → GenericFunctions.spec.d.ts} +0 -0
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const PocketbaseTrigger_node_1 = require("../nodes/PocketbaseTrigger/PocketbaseTrigger.node");
5
+ const eventsource_1 = require("eventsource");
6
+ vitest_1.vi.mock("eventsource", () => {
7
+ return {
8
+ EventSource: vitest_1.vi.fn(),
9
+ };
10
+ });
11
+ (0, vitest_1.describe)("PocketbaseTrigger", () => {
12
+ let triggerFunctions;
13
+ let node;
14
+ let esInstance;
15
+ (0, vitest_1.beforeEach)(() => {
16
+ vitest_1.vi.clearAllMocks();
17
+ node = new PocketbaseTrigger_node_1.PocketbaseTrigger();
18
+ triggerFunctions = {
19
+ getCredentials: vitest_1.vi.fn().mockResolvedValue({ url: "http://localhost:8090" }),
20
+ getNodeParameter: vitest_1.vi.fn(),
21
+ helpers: {
22
+ httpRequestWithAuthentication: vitest_1.vi.fn(),
23
+ returnJsonArray: vitest_1.vi.fn((data) => [{ json: data }]),
24
+ },
25
+ emit: vitest_1.vi.fn(),
26
+ emitError: vitest_1.vi.fn(),
27
+ logger: {
28
+ error: vitest_1.vi.fn(),
29
+ },
30
+ };
31
+ esInstance = {
32
+ addEventListener: vitest_1.vi.fn(),
33
+ removeEventListener: vitest_1.vi.fn(),
34
+ close: vitest_1.vi.fn(),
35
+ };
36
+ vitest_1.vi.mocked(eventsource_1.EventSource).mockImplementation(function () {
37
+ return esInstance;
38
+ });
39
+ });
40
+ (0, vitest_1.it)("should perform handshake on PB_CONNECT", async () => {
41
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
42
+ if (name === "collection")
43
+ return "posts";
44
+ if (name === "events")
45
+ return ["create", "update", "delete"];
46
+ return undefined;
47
+ });
48
+ await node.trigger.call(triggerFunctions);
49
+ (0, vitest_1.expect)(eventsource_1.EventSource).toHaveBeenCalledWith("http://localhost:8090/api/realtime");
50
+ (0, vitest_1.expect)(esInstance.addEventListener).toHaveBeenCalledWith("PB_CONNECT", vitest_1.expect.any(Function));
51
+ const pbConnectCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "PB_CONNECT")[1];
52
+ await pbConnectCallback({ data: JSON.stringify({ clientId: "mock-client-id" }) });
53
+ (0, vitest_1.expect)(triggerFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith("pocketbaseHttpApi", {
54
+ method: "POST",
55
+ url: "http://localhost:8090/api/realtime",
56
+ body: {
57
+ clientId: "mock-client-id",
58
+ subscriptions: ["posts"],
59
+ },
60
+ });
61
+ });
62
+ (0, vitest_1.it)("should emit data on matching event", async () => {
63
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
64
+ if (name === "collection")
65
+ return "posts";
66
+ if (name === "events")
67
+ return ["create"];
68
+ return undefined;
69
+ });
70
+ await node.trigger.call(triggerFunctions);
71
+ const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
72
+ await collectionCallback({
73
+ data: JSON.stringify({
74
+ action: "create",
75
+ record: { id: "1", title: "Hello" },
76
+ }),
77
+ });
78
+ (0, vitest_1.expect)(triggerFunctions.emit).toHaveBeenCalledWith([
79
+ [{ json: { __action: "create", id: "1", title: "Hello" } }],
80
+ ]);
81
+ });
82
+ (0, vitest_1.it)("should handle record action collisions in onMessage", async () => {
83
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
84
+ if (name === "collection")
85
+ return "posts";
86
+ if (name === "events")
87
+ return ["create"];
88
+ return undefined;
89
+ });
90
+ await node.trigger.call(triggerFunctions);
91
+ const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
92
+ await collectionCallback({
93
+ data: JSON.stringify({
94
+ action: "create",
95
+ record: { id: "1", action: "original-action-value" },
96
+ }),
97
+ });
98
+ (0, vitest_1.expect)(triggerFunctions.emit).toHaveBeenCalledWith([
99
+ [
100
+ {
101
+ json: {
102
+ id: "1",
103
+ action: "original-action-value",
104
+ __original_action: "original-action-value",
105
+ __action: "create",
106
+ },
107
+ },
108
+ ],
109
+ ]);
110
+ });
111
+ (0, vitest_1.it)("should emit sample data on manualTriggerFunction", async () => {
112
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
113
+ if (name === "collection")
114
+ return "posts";
115
+ if (name === "events")
116
+ return ["create", "update", "delete"];
117
+ return undefined;
118
+ });
119
+ const response = await node.trigger.call(triggerFunctions);
120
+ if (response.manualTriggerFunction) {
121
+ await response.manualTriggerFunction();
122
+ (0, vitest_1.expect)(triggerFunctions.emit).toHaveBeenCalledWith([
123
+ [
124
+ {
125
+ json: vitest_1.expect.objectContaining({
126
+ __action: "create",
127
+ collectionName: "posts",
128
+ }),
129
+ },
130
+ ],
131
+ ]);
132
+ }
133
+ else {
134
+ throw new Error("manualTriggerFunction should be defined");
135
+ }
136
+ });
137
+ (0, vitest_1.it)("should not emit data on non-matching event", async () => {
138
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
139
+ if (name === "collection")
140
+ return "posts";
141
+ if (name === "events")
142
+ return ["create"];
143
+ return undefined;
144
+ });
145
+ await node.trigger.call(triggerFunctions);
146
+ const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
147
+ await collectionCallback({
148
+ data: JSON.stringify({
149
+ action: "update",
150
+ record: { id: "1", title: "Hello" },
151
+ }),
152
+ });
153
+ (0, vitest_1.expect)(triggerFunctions.emit).not.toHaveBeenCalled();
154
+ });
155
+ (0, vitest_1.it)("should close EventSource on closeFunction", async () => {
156
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
157
+ if (name === "collection")
158
+ return "posts";
159
+ if (name === "events")
160
+ return ["create"];
161
+ return undefined;
162
+ });
163
+ const response = await node.trigger.call(triggerFunctions);
164
+ await response.closeFunction();
165
+ (0, vitest_1.expect)(esInstance.close).toHaveBeenCalled();
166
+ });
167
+ (0, vitest_1.it)("should handle EventSource connection failure", async () => {
168
+ vitest_1.vi.useFakeTimers();
169
+ try {
170
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
171
+ if (name === "collection")
172
+ return "posts";
173
+ if (name === "events")
174
+ return ["create"];
175
+ return undefined;
176
+ });
177
+ const response = await node.trigger.call(triggerFunctions);
178
+ const errorCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "error")[1];
179
+ const mockError = new Error("Connection failed");
180
+ errorCallback(mockError);
181
+ (0, vitest_1.expect)(triggerFunctions.logger.error).toHaveBeenCalledWith("PocketBase SSE connection failure", vitest_1.expect.objectContaining({ error: mockError, baseUrl: "http://localhost:8090" }));
182
+ (0, vitest_1.expect)(triggerFunctions.emitError).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
183
+ message: "Connection failed",
184
+ originalErrorEvent: mockError,
185
+ }));
186
+ (0, vitest_1.expect)(esInstance.close).toHaveBeenCalled();
187
+ await response.closeFunction();
188
+ }
189
+ finally {
190
+ vitest_1.vi.useRealTimers();
191
+ }
192
+ });
193
+ (0, vitest_1.it)("should handle EventSource delivering a non-Error error event", async () => {
194
+ vitest_1.vi.useFakeTimers();
195
+ try {
196
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
197
+ if (name === "collection")
198
+ return "posts";
199
+ if (name === "events")
200
+ return ["create"];
201
+ return undefined;
202
+ });
203
+ const response = await node.trigger.call(triggerFunctions);
204
+ const errorCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "error")[1];
205
+ const mockError = { message: "Conn failed", code: 500 };
206
+ errorCallback(mockError);
207
+ (0, vitest_1.expect)(triggerFunctions.logger.error).toHaveBeenCalledWith("PocketBase SSE connection failure", vitest_1.expect.objectContaining({ error: mockError, baseUrl: "http://localhost:8090" }));
208
+ (0, vitest_1.expect)(triggerFunctions.emitError).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
209
+ message: "Conn failed",
210
+ code: 500,
211
+ originalErrorEvent: mockError,
212
+ }));
213
+ (0, vitest_1.expect)(esInstance.close).toHaveBeenCalled();
214
+ await response.closeFunction();
215
+ }
216
+ finally {
217
+ vitest_1.vi.useRealTimers();
218
+ }
219
+ });
220
+ (0, vitest_1.it)("should redact sensitive data on parse failure", async () => {
221
+ triggerFunctions.getNodeParameter.mockImplementation((name) => {
222
+ if (name === "collection")
223
+ return "posts";
224
+ if (name === "events")
225
+ return ["create"];
226
+ return undefined;
227
+ });
228
+ await node.trigger.call(triggerFunctions);
229
+ const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
230
+ const invalidData = '{ "action": "create", "password": "secret", "token": "xyz", "email": "test@example.com", "msg": "Send it to someone@else.com", "invalid": ';
231
+ collectionCallback({ data: invalidData });
232
+ (0, vitest_1.expect)(triggerFunctions.logger.error).toHaveBeenCalledWith("Failed to parse PocketBase SSE message", vitest_1.expect.objectContaining({
233
+ collection: "posts",
234
+ }));
235
+ const loggedMeta = triggerFunctions.logger.error.mock.calls[0][1];
236
+ (0, vitest_1.expect)(loggedMeta.redactedPreview).toContain('"password": "[REDACTED]"');
237
+ (0, vitest_1.expect)(loggedMeta.redactedPreview).toContain('"token": "[REDACTED]"');
238
+ (0, vitest_1.expect)(loggedMeta.redactedPreview).toContain('"email": "[REDACTED]"');
239
+ (0, vitest_1.expect)(loggedMeta.redactedPreview).toContain("Send it to [REDACTED]");
240
+ (0, vitest_1.expect)(loggedMeta.redactedPreview.length).toBeLessThanOrEqual(200);
241
+ });
242
+ });
243
+ //# sourceMappingURL=PocketbaseTrigger.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PocketbaseTrigger.spec.js","sourceRoot":"","sources":["../../tests/PocketbaseTrigger.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const PocketbaseTrigger_node_1 = require("../nodes/PocketbaseTrigger/PocketbaseTrigger.node");
5
+ const runIntegration = process.env.RUN_POCKETBASE_INTEGRATION === "true";
6
+ vitest_1.describe.skipIf(!runIntegration)("PocketbaseTrigger Integration", () => {
7
+ const baseUrl = process.env.POCKETBASE_TEST_URL || "http://localhost:8090";
8
+ const email = process.env.POCKETBASE_TEST_USER || "test@example.com";
9
+ const password = process.env.POCKETBASE_TEST_PASS || "password123";
10
+ (0, vitest_1.it)("should trigger when a record is created in PocketBase", async () => {
11
+ const authRes = await fetch(`${baseUrl}/api/collections/_superusers/auth-with-password`, {
12
+ method: "POST",
13
+ headers: { "Content-Type": "application/json" },
14
+ body: JSON.stringify({ identity: email, password }),
15
+ });
16
+ if (!authRes.ok) {
17
+ throw new Error(`Auth failed: ${authRes.status} ${await authRes.text()}`);
18
+ }
19
+ const authData = (await authRes.json());
20
+ const token = authData.token;
21
+ if (!token) {
22
+ throw new Error(`No token returned for user ${email}`);
23
+ }
24
+ const node = new PocketbaseTrigger_node_1.PocketbaseTrigger();
25
+ let triggeredData = null;
26
+ const triggerFunctions = {
27
+ getCredentials: async () => ({ url: baseUrl, token }),
28
+ getNodeParameter: (name) => {
29
+ if (name === "collection")
30
+ return "users";
31
+ if (name === "events")
32
+ return ["create"];
33
+ return undefined;
34
+ },
35
+ helpers: {
36
+ httpRequestWithAuthentication: async (cred, options) => {
37
+ const res = await fetch(options.url, {
38
+ method: options.method,
39
+ headers: {
40
+ ...options.headers,
41
+ "Content-Type": "application/json",
42
+ Authorization: token,
43
+ },
44
+ body: JSON.stringify(options.body),
45
+ });
46
+ if (res.status === 204)
47
+ return {};
48
+ if (!res.ok) {
49
+ const text = await res.text();
50
+ throw new Error(`Request failed: ${res.status} ${text}`);
51
+ }
52
+ const contentType = res.headers.get("content-type");
53
+ if (contentType && contentType.includes("application/json")) {
54
+ return res.json();
55
+ }
56
+ return { body: await res.text() };
57
+ },
58
+ returnJsonArray: (data) => [{ json: data }],
59
+ },
60
+ emit: (data) => {
61
+ triggeredData = data;
62
+ },
63
+ logger: {
64
+ error: console.error,
65
+ info: console.log,
66
+ debug: console.debug,
67
+ warn: console.warn,
68
+ },
69
+ emitError: (err) => {
70
+ console.error("Trigger emitted error:", err);
71
+ },
72
+ };
73
+ const { closeFunction } = await node.trigger.call(triggerFunctions);
74
+ let createdRecordId;
75
+ try {
76
+ await new Promise((resolve) => setTimeout(resolve, 2000));
77
+ const uniqueEmail = `test-trigger-${Date.now()}@example.com`;
78
+ const createRes = await fetch(`${baseUrl}/api/collections/users/records`, {
79
+ method: "POST",
80
+ headers: {
81
+ "Content-Type": "application/json",
82
+ Authorization: token,
83
+ },
84
+ body: JSON.stringify({
85
+ username: `user${Date.now()}`,
86
+ email: uniqueEmail,
87
+ password: "password123",
88
+ passwordConfirm: "password123",
89
+ name: "Trigger Test User",
90
+ }),
91
+ });
92
+ if (!createRes.ok) {
93
+ const error = await createRes.text();
94
+ throw new Error(`Failed to create record: ${error}`);
95
+ }
96
+ const createData = (await createRes.json());
97
+ createdRecordId = createData.id;
98
+ for (let i = 0; i < 40; i++) {
99
+ if (triggeredData)
100
+ break;
101
+ await new Promise((resolve) => setTimeout(resolve, 500));
102
+ }
103
+ (0, vitest_1.expect)(triggeredData, "Timeout waiting for Pocketbase trigger: triggeredData not set after 20s").toBeDefined();
104
+ (0, vitest_1.expect)(triggeredData).toHaveLength(1);
105
+ (0, vitest_1.expect)(triggeredData[0]).toHaveLength(1);
106
+ (0, vitest_1.expect)(triggeredData[0][0].json.email).toBe(uniqueEmail);
107
+ }
108
+ finally {
109
+ if (createdRecordId) {
110
+ const deleteRes = await fetch(`${baseUrl}/api/collections/users/records/${createdRecordId}`, {
111
+ method: "DELETE",
112
+ headers: {
113
+ Authorization: token,
114
+ },
115
+ });
116
+ if (!deleteRes.ok) {
117
+ console.warn(`Failed to cleanup test record ${createdRecordId}: ${deleteRes.status}`);
118
+ }
119
+ }
120
+ if (closeFunction)
121
+ await closeFunction();
122
+ }
123
+ }, 30000);
124
+ });
125
+ //# sourceMappingURL=PocketbaseTriggerIntegration.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PocketbaseTriggerIntegration.spec.js","sourceRoot":"","sources":["../../tests/PocketbaseTriggerIntegration.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const RequestBodyFunctions_1 = require("../nodes/Common/RequestBodyFunctions");
8
+ const form_data_1 = __importDefault(require("form-data"));
9
+ (0, vitest_1.describe)("RequestBodyFunctions", () => {
10
+ (0, vitest_1.describe)("prepareRequestBody", () => {
11
+ (0, vitest_1.afterEach)(() => {
12
+ vitest_1.vi.restoreAllMocks();
13
+ });
14
+ (0, vitest_1.it)("should parse and assign bodyJson correctly in JSON mode", async () => {
15
+ const mockThis = {
16
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
17
+ if (name === "bodyType")
18
+ return ["bodyJson"];
19
+ if (name === "bodyJson")
20
+ return '{"a": 1}';
21
+ return defaultValue;
22
+ }),
23
+ logger: {
24
+ info: vitest_1.vi.fn(),
25
+ debug: vitest_1.vi.fn(),
26
+ },
27
+ };
28
+ const requestOptions = { url: "http://test.com", method: "POST" };
29
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
30
+ (0, vitest_1.expect)(result.body).toEqual({ a: 1 });
31
+ });
32
+ (0, vitest_1.it)("should preserve nested objects and include null values in bodyJson in JSON mode", async () => {
33
+ const mockThis = {
34
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
35
+ if (name === "bodyType")
36
+ return ["bodyJson"];
37
+ if (name === "bodyJson")
38
+ return '{"a": 1, "b": {"c": 2}, "": "empty", " ": "whitespace", "nullVal": null}';
39
+ return defaultValue;
40
+ }),
41
+ logger: {
42
+ info: vitest_1.vi.fn(),
43
+ debug: vitest_1.vi.fn(),
44
+ },
45
+ };
46
+ const requestOptions = { url: "http://test.com", method: "POST" };
47
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
48
+ (0, vitest_1.expect)(result.body).toEqual({
49
+ a: 1,
50
+ b: { c: 2 },
51
+ nullVal: null,
52
+ });
53
+ });
54
+ (0, vitest_1.it)("should throw error for invalid JSON in bodyJson", async () => {
55
+ const mockThis = {
56
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name) => {
57
+ if (name === "bodyType")
58
+ return ["bodyJson"];
59
+ if (name === "bodyJson")
60
+ return "{invalid}";
61
+ return undefined;
62
+ }),
63
+ };
64
+ const requestOptions = { url: "http://test.com", method: "POST" };
65
+ await (0, vitest_1.expect)(RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions)).rejects.toThrow("Invalid JSON in Body");
66
+ });
67
+ (0, vitest_1.it)("should throw error if bodyJson is not an object", async () => {
68
+ const mockThis = {
69
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name) => {
70
+ if (name === "bodyType")
71
+ return ["bodyJson"];
72
+ if (name === "bodyJson")
73
+ return '"string"';
74
+ return undefined;
75
+ }),
76
+ };
77
+ const requestOptions = { url: "http://test.com", method: "POST" };
78
+ await (0, vitest_1.expect)(RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions)).rejects.toThrow("JSON Body must be a JSON object");
79
+ });
80
+ (0, vitest_1.it)("should parse and append bodyJson correctly in Multipart mode, converting null to 'null' string and removing stale Content-Type", async () => {
81
+ const appendSpy = vitest_1.vi.spyOn(form_data_1.default.prototype, "append");
82
+ const mockThis = {
83
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
84
+ if (name === "bodyType")
85
+ return ["bodyJson", "binaryData"];
86
+ if (name === "bodyJson")
87
+ return '{"a": 1, "b": {"c": 2}, "nullVal": null}';
88
+ if (name === "binaryPropertyName")
89
+ return "data";
90
+ if (name === "binaryFieldName")
91
+ return "file";
92
+ return defaultValue;
93
+ }),
94
+ logger: {
95
+ info: vitest_1.vi.fn(),
96
+ debug: vitest_1.vi.fn(),
97
+ },
98
+ helpers: {
99
+ assertBinaryData: vitest_1.vi
100
+ .fn()
101
+ .mockReturnValue({ mimeType: "text/plain", fileName: "test.txt" }),
102
+ getBinaryDataBuffer: vitest_1.vi.fn().mockResolvedValue(Buffer.from("hello")),
103
+ },
104
+ };
105
+ const requestOptions = {
106
+ url: "http://test.com",
107
+ method: "POST",
108
+ headers: { "Content-Type": "application/json" },
109
+ };
110
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
111
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("a", "1");
112
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("b", '{"c":2}');
113
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("nullVal", "null");
114
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("file", vitest_1.expect.any(Buffer), vitest_1.expect.objectContaining({
115
+ contentType: "text/plain",
116
+ filename: "test.txt",
117
+ }));
118
+ (0, vitest_1.expect)(result.headers).toBeDefined();
119
+ (0, vitest_1.expect)(result.headers["content-type"]).toContain("multipart/form-data");
120
+ (0, vitest_1.expect)(Object.keys(result.headers)).not.toContain("Content-Type");
121
+ });
122
+ (0, vitest_1.describe)("fields bodyType", () => {
123
+ const fields = {
124
+ assignments: [
125
+ { name: "", value: "empty name" },
126
+ { name: " ", value: "whitespace name" },
127
+ { name: 123, value: "non-string name" },
128
+ { name: "nullValue", value: null },
129
+ { name: "undefinedValue", value: undefined },
130
+ { name: "validString", value: "hello" },
131
+ { name: "validObject", value: { foo: "bar" } },
132
+ ],
133
+ };
134
+ (0, vitest_1.it)("should trim field names in JSON mode", async () => {
135
+ const mockThis = {
136
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
137
+ if (name === "bodyType")
138
+ return ["fields"];
139
+ if (name === "fields")
140
+ return { assignments: [{ name: " trimmedKey ", value: "value" }] };
141
+ return defaultValue;
142
+ }),
143
+ logger: {
144
+ info: vitest_1.vi.fn(),
145
+ debug: vitest_1.vi.fn(),
146
+ },
147
+ };
148
+ const requestOptions = { url: "http://test.com", method: "POST" };
149
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
150
+ (0, vitest_1.expect)(result.body).toEqual({ trimmedKey: "value" });
151
+ });
152
+ (0, vitest_1.it)("should trim JSON keys in JSON mode", async () => {
153
+ const mockThis = {
154
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
155
+ if (name === "bodyType")
156
+ return ["bodyJson"];
157
+ if (name === "bodyJson")
158
+ return '{" jsonKey ": "value"}';
159
+ return defaultValue;
160
+ }),
161
+ logger: {
162
+ info: vitest_1.vi.fn(),
163
+ debug: vitest_1.vi.fn(),
164
+ },
165
+ };
166
+ const requestOptions = { url: "http://test.com", method: "POST" };
167
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
168
+ (0, vitest_1.expect)(result.body).toEqual({ jsonKey: "value" });
169
+ });
170
+ (0, vitest_1.it)("should filter invalid entries and include null as null in JSON mode", async () => {
171
+ const mockThis = {
172
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
173
+ if (name === "bodyType")
174
+ return ["fields"];
175
+ if (name === "fields")
176
+ return fields;
177
+ return defaultValue;
178
+ }),
179
+ logger: {
180
+ info: vitest_1.vi.fn(),
181
+ debug: vitest_1.vi.fn(),
182
+ },
183
+ };
184
+ const requestOptions = { url: "http://test.com", method: "POST" };
185
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
186
+ (0, vitest_1.expect)(result.body).toEqual({
187
+ nullValue: null,
188
+ validString: "hello",
189
+ validObject: { foo: "bar" },
190
+ });
191
+ });
192
+ (0, vitest_1.it)("should filter invalid entries and convert null to 'null' string in Multipart mode", async () => {
193
+ const appendSpy = vitest_1.vi.spyOn(form_data_1.default.prototype, "append");
194
+ const mockThis = {
195
+ getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
196
+ if (name === "bodyType")
197
+ return ["fields", "binaryData"];
198
+ if (name === "fields")
199
+ return fields;
200
+ if (name === "binaryPropertyName")
201
+ return "data";
202
+ if (name === "binaryFieldName")
203
+ return "file";
204
+ return defaultValue;
205
+ }),
206
+ logger: {
207
+ info: vitest_1.vi.fn(),
208
+ debug: vitest_1.vi.fn(),
209
+ },
210
+ helpers: {
211
+ assertBinaryData: vitest_1.vi
212
+ .fn()
213
+ .mockReturnValue({ mimeType: "text/plain", fileName: "test.txt" }),
214
+ getBinaryDataBuffer: vitest_1.vi.fn().mockResolvedValue(Buffer.from("hello")),
215
+ },
216
+ };
217
+ const requestOptions = { url: "http://test.com", method: "POST" };
218
+ const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
219
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("validString", "hello");
220
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("validObject", '{"foo":"bar"}');
221
+ (0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("nullValue", "null");
222
+ const appendedKeys = appendSpy.mock.calls.map((call) => call[0]);
223
+ (0, vitest_1.expect)(appendedKeys).not.toContain("");
224
+ (0, vitest_1.expect)(appendedKeys).not.toContain(" ");
225
+ (0, vitest_1.expect)(appendedKeys).not.toContain(123);
226
+ (0, vitest_1.expect)(appendedKeys).not.toContain("undefinedValue");
227
+ (0, vitest_1.expect)(result.headers["content-type"]).toContain("multipart/form-data");
228
+ });
229
+ });
230
+ });
231
+ });
232
+ //# sourceMappingURL=RequestBodyFunctions.spec.js.map