n8n-nodes-pocketbase 2.2.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-pocketbase",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Interact with your PocketBase instance",
5
5
  "keywords": [
6
6
  "n8n-community-node-package"
@@ -39,6 +39,7 @@
39
39
  },
40
40
  "devDependencies": {
41
41
  "@n8n/node-cli": "^0.28.0",
42
+ "@release-it/conventional-changelog": "^10.0.6",
42
43
  "eslint-plugin-n8n-nodes-base": "^1.16.6",
43
44
  "oxfmt": "^0.46.0",
44
45
  "oxlint": "^1.60.0",
@@ -48,8 +49,13 @@
48
49
  "vite": "^8.0.8",
49
50
  "vitest": "^4.1.4"
50
51
  },
52
+ "overrides": {
53
+ "@release-it/conventional-changelog": {
54
+ "release-it": "$release-it"
55
+ }
56
+ },
51
57
  "peerDependencies": {
52
- "n8n-workflow": "^2.17.5"
58
+ "n8n-workflow": "^2.17.7"
53
59
  },
54
60
  "n8n": {
55
61
  "n8nNodesApiVersion": 1,
@@ -62,5 +68,5 @@
62
68
  "dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js"
63
69
  ]
64
70
  },
65
- "pocketbaseVersion": "0.37.2"
71
+ "pocketbaseVersion": "0.37.3"
66
72
  }
@@ -1,10 +0,0 @@
1
- import { IHttpRequestHelper, ICredentialDataDecryptedObject } from "n8n-workflow";
2
- export declare const inFlightRequests: Map<string, Promise<{
3
- token: string;
4
- }>>;
5
- export declare function login(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<{
6
- token: string;
7
- }>;
8
- export declare function refresh(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<{
9
- token: string;
10
- }>;
@@ -1,122 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.inFlightRequests = void 0;
4
- exports.login = login;
5
- exports.refresh = refresh;
6
- const node_crypto_1 = require("node:crypto");
7
- function isTokenExpired(token) {
8
- if (!token)
9
- return true;
10
- try {
11
- const parts = token.split(".");
12
- if (parts.length !== 3)
13
- return true;
14
- const base64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
15
- const payload = JSON.parse(Buffer.from(base64, "base64").toString("utf-8"));
16
- if (typeof payload.exp !== "number" || !Number.isFinite(payload.exp)) {
17
- return true;
18
- }
19
- return Date.now() / 1000 > payload.exp - 300;
20
- }
21
- catch {
22
- return true;
23
- }
24
- }
25
- exports.inFlightRequests = new Map();
26
- function getCredentialFingerprint(credentials) {
27
- const normalizedUrl = (credentials.url || "").replace(/\/$/, "");
28
- const canonical = JSON.stringify({
29
- url: normalizedUrl,
30
- username: credentials.username || "",
31
- password: credentials.password || "",
32
- });
33
- return (0, node_crypto_1.createHash)("sha256").update(canonical).digest("hex");
34
- }
35
- async function executeLogin(url, creds) {
36
- const normalizedUrl = url.endsWith("/") ? url.slice(0, -1) : url;
37
- const { token } = (await this.helpers.httpRequest({
38
- method: "POST",
39
- url: `${normalizedUrl}/api/collections/_superusers/auth-with-password`,
40
- body: {
41
- identity: creds.username,
42
- password: creds.password,
43
- },
44
- }));
45
- return { token };
46
- }
47
- function validateCredentials(credentials) {
48
- if (typeof credentials !== "object" || credentials === null) {
49
- throw new Error("Credentials must be an object");
50
- }
51
- const creds = credentials;
52
- const { username, password, url } = creds;
53
- if (typeof url !== "string" || url.trim() === "") {
54
- throw new Error("PocketBase URL is missing or invalid in Credentials");
55
- }
56
- if (typeof username !== "string" || username.trim() === "") {
57
- throw new Error("PocketBase Admin username is missing or invalid in Credentials");
58
- }
59
- if (typeof password !== "string" || password.trim() === "") {
60
- throw new Error("PocketBase Admin password is missing or invalid in Credentials");
61
- }
62
- return creds;
63
- }
64
- async function login(credentials) {
65
- const creds = validateCredentials(credentials);
66
- const { url } = creds;
67
- const fingerprint = getCredentialFingerprint(creds);
68
- const existingRequest = exports.inFlightRequests.get(fingerprint);
69
- if (existingRequest) {
70
- return await existingRequest;
71
- }
72
- const loginPromise = executeLogin.call(this, url, creds);
73
- exports.inFlightRequests.set(fingerprint, loginPromise);
74
- try {
75
- return await loginPromise;
76
- }
77
- finally {
78
- exports.inFlightRequests.delete(fingerprint);
79
- }
80
- }
81
- async function refresh(credentials) {
82
- const creds = validateCredentials(credentials);
83
- const { url, token: existingToken } = credentials;
84
- if (!isTokenExpired(existingToken)) {
85
- return { token: existingToken };
86
- }
87
- const fingerprint = getCredentialFingerprint(creds);
88
- const existingRequest = exports.inFlightRequests.get(fingerprint);
89
- if (existingRequest) {
90
- return await existingRequest;
91
- }
92
- const refreshFn = async () => {
93
- const normalizedUrl = url.endsWith("/") ? url.slice(0, -1) : url;
94
- try {
95
- const { token } = (await this.helpers.httpRequest({
96
- method: "POST",
97
- url: `${normalizedUrl}/api/collections/_superusers/auth-refresh`,
98
- headers: {
99
- Authorization: existingToken,
100
- },
101
- }));
102
- return { token };
103
- }
104
- catch (error) {
105
- const err = error;
106
- const httpCode = Number((err === null || err === void 0 ? void 0 : err.httpCode) || (err === null || err === void 0 ? void 0 : err.status));
107
- if (httpCode === 401 || httpCode === 403 || httpCode === 404) {
108
- return await executeLogin.call(this, url, creds);
109
- }
110
- throw error;
111
- }
112
- };
113
- const refreshPromise = refreshFn();
114
- exports.inFlightRequests.set(fingerprint, refreshPromise);
115
- try {
116
- return await refreshPromise;
117
- }
118
- finally {
119
- exports.inFlightRequests.delete(fingerprint);
120
- }
121
- }
122
- //# sourceMappingURL=PocketbaseAuth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PocketbaseAuth.js","sourceRoot":"","sources":["../../../nodes/Common/PocketbaseAuth.ts"],"names":[],"mappings":"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"}
@@ -1,105 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const PocketbaseAuth_1 = require("../nodes/Common/PocketbaseAuth");
5
- (0, vitest_1.describe)("PocketbaseAuth", () => {
6
- let mockThis;
7
- const credentials = {
8
- url: "http://localhost:8090",
9
- username: "test@example.com",
10
- password: "password123",
11
- };
12
- (0, vitest_1.beforeEach)(() => {
13
- vitest_1.vi.clearAllMocks();
14
- PocketbaseAuth_1.inFlightRequests.clear();
15
- mockThis = {
16
- helpers: {
17
- httpRequest: vitest_1.vi.fn(),
18
- },
19
- };
20
- });
21
- (0, vitest_1.it)("should perform login and return token", async () => {
22
- mockThis.helpers.httpRequest.mockResolvedValue({ token: "mock-token" });
23
- const result = await PocketbaseAuth_1.login.call(mockThis, credentials);
24
- (0, vitest_1.expect)(result.token).toBe("mock-token");
25
- (0, vitest_1.expect)(mockThis.helpers.httpRequest).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
26
- method: "POST",
27
- url: "http://localhost:8090/api/collections/_superusers/auth-with-password",
28
- body: {
29
- identity: "test@example.com",
30
- password: "password123",
31
- },
32
- }));
33
- });
34
- (0, vitest_1.it)("should deduplicate concurrent login requests", async () => {
35
- let resolvePromise;
36
- const pendingPromise = new Promise((resolve) => {
37
- resolvePromise = resolve;
38
- });
39
- mockThis.helpers.httpRequest.mockReturnValue(pendingPromise);
40
- const call1 = PocketbaseAuth_1.login.call(mockThis, credentials);
41
- const call2 = PocketbaseAuth_1.login.call(mockThis, credentials);
42
- (0, vitest_1.expect)(mockThis.helpers.httpRequest).toHaveBeenCalledTimes(1);
43
- resolvePromise({ token: "deduped-token" });
44
- const [res1, res2] = await Promise.all([call1, call2]);
45
- (0, vitest_1.expect)(res1.token).toBe("deduped-token");
46
- (0, vitest_1.expect)(res2.token).toBe("deduped-token");
47
- });
48
- (0, vitest_1.it)("should refresh token if expired", async () => {
49
- const expiredTime = Math.floor(Date.now() / 1000) - 60;
50
- const payload = Buffer.from(JSON.stringify({ exp: expiredTime }))
51
- .toString("base64")
52
- .replace(/\+/g, "-")
53
- .replace(/\//g, "_")
54
- .replace(/=+$/, "");
55
- const expiredToken = `header.${payload}.signature`;
56
- const credsWithToken = {
57
- ...credentials,
58
- token: expiredToken,
59
- };
60
- mockThis.helpers.httpRequest.mockResolvedValue({ token: "new-token" });
61
- const result = await PocketbaseAuth_1.refresh.call(mockThis, credsWithToken);
62
- (0, vitest_1.expect)(result.token).toBe("new-token");
63
- (0, vitest_1.expect)(mockThis.helpers.httpRequest).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
64
- method: "POST",
65
- url: "http://localhost:8090/api/collections/_superusers/auth-refresh",
66
- }));
67
- });
68
- (0, vitest_1.it)("should return existing token if not expired", async () => {
69
- const futureTime = Math.floor(Date.now() / 1000) + 3600;
70
- const payload = Buffer.from(JSON.stringify({ exp: futureTime }))
71
- .toString("base64")
72
- .replace(/\+/g, "-")
73
- .replace(/\//g, "_")
74
- .replace(/=+$/, "");
75
- const validToken = `header.${payload}.signature`;
76
- const credsWithToken = {
77
- ...credentials,
78
- token: validToken,
79
- };
80
- const result = await PocketbaseAuth_1.refresh.call(mockThis, credsWithToken);
81
- (0, vitest_1.expect)(result.token).toBe(validToken);
82
- (0, vitest_1.expect)(mockThis.helpers.httpRequest).not.toHaveBeenCalled();
83
- });
84
- (0, vitest_1.it)("should fallback to login if refresh fails with 401", async () => {
85
- const expiredTime = Math.floor(Date.now() / 1000) - 60;
86
- const payload = Buffer.from(JSON.stringify({ exp: expiredTime }))
87
- .toString("base64")
88
- .replace(/\+/g, "-")
89
- .replace(/\//g, "_")
90
- .replace(/=+$/, "");
91
- const expiredToken = `header.${payload}.signature`;
92
- const credsWithToken = {
93
- ...credentials,
94
- token: expiredToken,
95
- };
96
- const error = new Error("Unauthorized");
97
- error.status = 401;
98
- mockThis.helpers.httpRequest.mockRejectedValueOnce(error);
99
- mockThis.helpers.httpRequest.mockResolvedValueOnce({ token: "login-token" });
100
- const result = await PocketbaseAuth_1.refresh.call(mockThis, credsWithToken);
101
- (0, vitest_1.expect)(result.token).toBe("login-token");
102
- (0, vitest_1.expect)(mockThis.helpers.httpRequest).toHaveBeenCalledTimes(2);
103
- });
104
- });
105
- //# sourceMappingURL=PocketbaseAuth.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PocketbaseAuth.spec.js","sourceRoot":"","sources":["../../tests/PocketbaseAuth.spec.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,202 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const PocketbaseAuth_1 = require("../nodes/Common/PocketbaseAuth");
5
- const runIntegration = process.env.RUN_POCKETBASE_INTEGRATION === "true";
6
- vitest_1.describe.skipIf(!runIntegration)("PocketbaseAuth Integration", () => {
7
- (0, vitest_1.beforeEach)(() => {
8
- PocketbaseAuth_1.inFlightRequests.clear();
9
- });
10
- const baseUrl = process.env.POCKETBASE_TEST_URL || "http://localhost:8090";
11
- const email = process.env.POCKETBASE_TEST_USER || "test@example.com";
12
- const oldPassword = process.env.POCKETBASE_TEST_PASS || "password123";
13
- const newPassword = "newPassword123";
14
- (0, vitest_1.it)("should refresh token, and fall back to login if password changed", async () => {
15
- const authRes = await fetch(`${baseUrl}/api/collections/_superusers/auth-with-password`, {
16
- method: "POST",
17
- headers: { "Content-Type": "application/json" },
18
- body: JSON.stringify({ identity: email, password: oldPassword }),
19
- });
20
- (0, vitest_1.expect)(authRes.ok).toBe(true);
21
- const { token: initialToken, record } = (await authRes.json());
22
- const mockThis = {
23
- helpers: {
24
- httpRequest: async (options) => {
25
- const headers = { ...options.headers };
26
- let body = options.body;
27
- if (body &&
28
- typeof body === "object" &&
29
- !(body instanceof Buffer) &&
30
- !(typeof body.append === "function" && typeof body.getHeaders === "function")) {
31
- body = JSON.stringify(body);
32
- if (!headers["Content-Type"]) {
33
- headers["Content-Type"] = "application/json";
34
- }
35
- }
36
- const res = await fetch(options.url, {
37
- method: options.method,
38
- headers,
39
- body,
40
- });
41
- const data = (await res.json());
42
- if (!res.ok) {
43
- const error = new Error(data.message || "Request failed");
44
- error.status = res.status;
45
- throw error;
46
- }
47
- return data;
48
- },
49
- },
50
- };
51
- let finalResultToken;
52
- try {
53
- const credentials = {
54
- url: baseUrl,
55
- username: email,
56
- password: oldPassword,
57
- token: initialToken,
58
- };
59
- const refreshResult = await PocketbaseAuth_1.refresh.call(mockThis, credentials);
60
- (0, vitest_1.expect)(refreshResult.token).toBeDefined();
61
- const middleToken = refreshResult.token;
62
- const updateRes = await fetch(`${baseUrl}/api/collections/_superusers/records/${record.id}`, {
63
- method: "PATCH",
64
- headers: {
65
- "Content-Type": "application/json",
66
- Authorization: middleToken,
67
- },
68
- body: JSON.stringify({
69
- password: newPassword,
70
- passwordConfirm: newPassword,
71
- }),
72
- });
73
- (0, vitest_1.expect)(updateRes.ok).toBe(true);
74
- const expiredTime = Math.floor(Date.now() / 1000) - 3600;
75
- const expiredPayload = Buffer.from(JSON.stringify({ exp: expiredTime }))
76
- .toString("base64")
77
- .replace(/\+/g, "-")
78
- .replace(/\//g, "_")
79
- .replace(/=+$/, "");
80
- const forcedExpiredToken = `header.${expiredPayload}.signature`;
81
- const credentialsWithNewPass = {
82
- url: baseUrl,
83
- username: email,
84
- password: newPassword,
85
- token: forcedExpiredToken,
86
- };
87
- const finalResult = await PocketbaseAuth_1.refresh.call(mockThis, credentialsWithNewPass);
88
- (0, vitest_1.expect)(finalResult.token).toBeDefined();
89
- (0, vitest_1.expect)(finalResult.token).not.toBe(middleToken);
90
- (0, vitest_1.expect)(finalResult.token).not.toBe(forcedExpiredToken);
91
- finalResultToken = finalResult.token;
92
- const finalVerifyRes = await fetch(`${baseUrl}/api/collections/_superusers/auth-refresh`, {
93
- method: "POST",
94
- headers: {
95
- "Content-Type": "application/json",
96
- Authorization: finalResult.token,
97
- },
98
- });
99
- (0, vitest_1.expect)(finalVerifyRes.ok).toBe(true);
100
- }
101
- finally {
102
- if (record && record.id) {
103
- let cleanupToken = finalResultToken;
104
- if (!cleanupToken) {
105
- try {
106
- const authRes = await fetch(`${baseUrl}/api/collections/_superusers/auth-with-password`, {
107
- method: "POST",
108
- headers: { "Content-Type": "application/json" },
109
- body: JSON.stringify({ identity: email, password: newPassword }),
110
- });
111
- if (authRes.ok) {
112
- const data = (await authRes.json());
113
- cleanupToken = data.token;
114
- }
115
- else {
116
- const authResOld = await fetch(`${baseUrl}/api/collections/_superusers/auth-with-password`, {
117
- method: "POST",
118
- headers: { "Content-Type": "application/json" },
119
- body: JSON.stringify({ identity: email, password: oldPassword }),
120
- });
121
- if (authResOld.ok) {
122
- const data = (await authResOld.json());
123
- cleanupToken = data.token;
124
- }
125
- }
126
- }
127
- catch (err) {
128
- console.warn("Authentication cleanup failed to re-auth", err);
129
- }
130
- }
131
- if (cleanupToken) {
132
- const cleanupRes = await fetch(`${baseUrl}/api/collections/_superusers/records/${record.id}`, {
133
- method: "PATCH",
134
- headers: {
135
- "Content-Type": "application/json",
136
- Authorization: cleanupToken,
137
- },
138
- body: JSON.stringify({
139
- password: oldPassword,
140
- passwordConfirm: oldPassword,
141
- }),
142
- });
143
- if (!cleanupRes.ok) {
144
- console.warn("Failed to revert password during cleanup:", await cleanupRes.text());
145
- }
146
- }
147
- else {
148
- console.warn("Skipping cleanup: No valid token available");
149
- }
150
- }
151
- }
152
- }, 20000);
153
- (0, vitest_1.it)("should deduplicate multiple concurrent login calls to the same PocketBase instance", async () => {
154
- let httpRequestCount = 0;
155
- const mockThis = {
156
- helpers: {
157
- httpRequest: async (options) => {
158
- httpRequestCount++;
159
- await new Promise((resolve) => setTimeout(resolve, 100));
160
- const res = await fetch(options.url, {
161
- method: options.method,
162
- headers: { "Content-Type": "application/json", ...options.headers },
163
- body: JSON.stringify(options.body),
164
- });
165
- const data = (await res.json());
166
- if (!res.ok) {
167
- const error = new Error(data.message || "Request failed");
168
- error.status = res.status;
169
- throw error;
170
- }
171
- return data;
172
- },
173
- },
174
- };
175
- const credentials = {
176
- url: baseUrl,
177
- username: email,
178
- password: oldPassword,
179
- };
180
- const results = await Promise.all([
181
- PocketbaseAuth_1.login.call(mockThis, credentials),
182
- PocketbaseAuth_1.login.call(mockThis, credentials),
183
- PocketbaseAuth_1.login.call(mockThis, credentials),
184
- PocketbaseAuth_1.login.call(mockThis, credentials),
185
- PocketbaseAuth_1.login.call(mockThis, credentials),
186
- ]);
187
- (0, vitest_1.expect)(httpRequestCount).toBe(1);
188
- results.forEach((res) => {
189
- (0, vitest_1.expect)(res.token).toBeDefined();
190
- (0, vitest_1.expect)(typeof res.token).toBe("string");
191
- });
192
- const verifyRes = await fetch(`${baseUrl}/api/collections/_superusers/auth-refresh`, {
193
- method: "POST",
194
- headers: {
195
- "Content-Type": "application/json",
196
- Authorization: results[0].token,
197
- },
198
- });
199
- (0, vitest_1.expect)(verifyRes.ok).toBe(true);
200
- }, 10000);
201
- });
202
- //# sourceMappingURL=PocketbaseAuthIntegration.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PocketbaseAuthIntegration.spec.js","sourceRoot":"","sources":["../../tests/PocketbaseAuthIntegration.spec.ts"],"names":[],"mappings":"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"}