@finlight/n8n-nodes-finlight 0.1.3 → 0.1.5
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/dist/nodes/finlight/actions/FinlightArticleSearch.node.js +250 -0
- package/dist/nodes/finlight/credentials/FinlightApi.credentials.js +33 -0
- package/dist/nodes/finlight/finlight.svg +2 -0
- package/dist/nodes/finlight/helpers/types.js +2 -0
- package/dist/nodes/finlight/helpers/utils.js +14 -0
- package/dist/nodes/finlight/index.js +6 -0
- package/dist/nodes/finlight/triggers/FinlightWebhookTrigger.node.js +124 -0
- package/package.json +4 -4
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FinlightArticleSearch = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class FinlightArticleSearch {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.description = {
|
|
8
|
+
displayName: "finlight Article Search",
|
|
9
|
+
name: "finlightArticleSearch",
|
|
10
|
+
group: ["transform"],
|
|
11
|
+
version: 1,
|
|
12
|
+
description: "Search articles using the finlight REST API",
|
|
13
|
+
defaults: {
|
|
14
|
+
name: "finlight Article Search",
|
|
15
|
+
},
|
|
16
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
17
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
18
|
+
icon: "file:../finlight.svg",
|
|
19
|
+
credentials: [{ name: "finlightApi", required: true }],
|
|
20
|
+
properties: [
|
|
21
|
+
// ---- Operation ----
|
|
22
|
+
{
|
|
23
|
+
displayName: "Operation",
|
|
24
|
+
name: "operation",
|
|
25
|
+
type: "options",
|
|
26
|
+
options: [
|
|
27
|
+
{
|
|
28
|
+
name: "Search Articles",
|
|
29
|
+
value: "search",
|
|
30
|
+
description: "Search articles using the finlight REST API",
|
|
31
|
+
action: "Search articles",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
default: "search",
|
|
35
|
+
},
|
|
36
|
+
// ---- All optional inputs grouped ----
|
|
37
|
+
{
|
|
38
|
+
displayName: "Additional Options",
|
|
39
|
+
name: "additionalOptions",
|
|
40
|
+
type: "collection",
|
|
41
|
+
placeholder: "Add option",
|
|
42
|
+
default: {},
|
|
43
|
+
options: [
|
|
44
|
+
{
|
|
45
|
+
displayName: "Query",
|
|
46
|
+
name: "query",
|
|
47
|
+
type: "string",
|
|
48
|
+
default: "",
|
|
49
|
+
placeholder: "earnings OR guidance AND (NVIDIA OR ticker:NVDA)",
|
|
50
|
+
description: "Full-text query to filter articles",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
displayName: "From (ISO date)",
|
|
54
|
+
name: "from",
|
|
55
|
+
type: "string",
|
|
56
|
+
default: "",
|
|
57
|
+
description: "Start of date range, e.g. 2025-09-01T00:00:00Z",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
displayName: "To (ISO date)",
|
|
61
|
+
name: "to",
|
|
62
|
+
type: "string",
|
|
63
|
+
default: "",
|
|
64
|
+
description: "End of date range, e.g. 2025-09-06T23:59:59Z",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
displayName: "Sources",
|
|
68
|
+
name: "sources",
|
|
69
|
+
type: "fixedCollection",
|
|
70
|
+
placeholder: "Add Source",
|
|
71
|
+
default: {},
|
|
72
|
+
typeOptions: { multipleValues: true },
|
|
73
|
+
options: [
|
|
74
|
+
{
|
|
75
|
+
name: "sourceList",
|
|
76
|
+
displayName: "Source List",
|
|
77
|
+
values: [
|
|
78
|
+
{
|
|
79
|
+
displayName: "Source",
|
|
80
|
+
name: "source",
|
|
81
|
+
type: "string",
|
|
82
|
+
default: "",
|
|
83
|
+
placeholder: "reuters.com",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
displayName: "Exclude Sources",
|
|
91
|
+
name: "excludeSources",
|
|
92
|
+
type: "fixedCollection",
|
|
93
|
+
placeholder: "Exclude Source",
|
|
94
|
+
default: {},
|
|
95
|
+
typeOptions: { multipleValues: true },
|
|
96
|
+
options: [
|
|
97
|
+
{
|
|
98
|
+
name: "sourceList",
|
|
99
|
+
displayName: "Source List",
|
|
100
|
+
values: [
|
|
101
|
+
{
|
|
102
|
+
displayName: "Source",
|
|
103
|
+
name: "source",
|
|
104
|
+
type: "string",
|
|
105
|
+
default: "",
|
|
106
|
+
placeholder: "example.com",
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
displayName: "Tickers",
|
|
114
|
+
name: "tickers",
|
|
115
|
+
type: "fixedCollection",
|
|
116
|
+
placeholder: "Add Ticker",
|
|
117
|
+
default: {},
|
|
118
|
+
typeOptions: { multipleValues: true },
|
|
119
|
+
options: [
|
|
120
|
+
{
|
|
121
|
+
name: "tickerList",
|
|
122
|
+
displayName: "Ticker List",
|
|
123
|
+
values: [
|
|
124
|
+
{
|
|
125
|
+
displayName: "Ticker",
|
|
126
|
+
name: "ticker",
|
|
127
|
+
type: "string",
|
|
128
|
+
default: "",
|
|
129
|
+
placeholder: "AAPL",
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
displayName: "Language",
|
|
137
|
+
name: "language",
|
|
138
|
+
type: "string",
|
|
139
|
+
default: "en",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
displayName: "Order",
|
|
143
|
+
name: "order",
|
|
144
|
+
type: "options",
|
|
145
|
+
options: [
|
|
146
|
+
{ name: "DESC", value: "DESC" },
|
|
147
|
+
{ name: "ASC", value: "ASC" },
|
|
148
|
+
],
|
|
149
|
+
default: "DESC",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
displayName: "Page Size",
|
|
153
|
+
name: "pageSize",
|
|
154
|
+
type: "number",
|
|
155
|
+
default: 20,
|
|
156
|
+
typeOptions: { minValue: 1, maxValue: 100 },
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
displayName: "Page",
|
|
160
|
+
name: "page",
|
|
161
|
+
type: "number",
|
|
162
|
+
default: 1,
|
|
163
|
+
typeOptions: { minValue: 1 },
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
displayName: "Include Content",
|
|
167
|
+
name: "includeContent",
|
|
168
|
+
type: "boolean",
|
|
169
|
+
default: false,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
displayName: "Include Entities",
|
|
173
|
+
name: "includeEntities",
|
|
174
|
+
type: "boolean",
|
|
175
|
+
default: false,
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
displayName: "Exclude Empty Content",
|
|
179
|
+
name: "excludeEmptyContent",
|
|
180
|
+
type: "boolean",
|
|
181
|
+
default: false,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
displayOptions: {
|
|
185
|
+
show: { operation: ["search"] },
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async execute() {
|
|
192
|
+
const items = this.getInputData();
|
|
193
|
+
const returnData = [];
|
|
194
|
+
const apiKey = (await this.getCredentials("finlightApi"));
|
|
195
|
+
for (let i = 0; i < items.length; i++) {
|
|
196
|
+
const operation = this.getNodeParameter("operation", i);
|
|
197
|
+
if (operation !== "search") {
|
|
198
|
+
throw new Error(`Unknown operation: ${operation}`);
|
|
199
|
+
}
|
|
200
|
+
// Build the body from optional collection only
|
|
201
|
+
const additional = (this.getNodeParameter("additionalOptions", i, {}) || {});
|
|
202
|
+
const body = {};
|
|
203
|
+
if (additional.query)
|
|
204
|
+
body.query = additional.query;
|
|
205
|
+
if (additional.from)
|
|
206
|
+
body.from = additional.from;
|
|
207
|
+
if (additional.to)
|
|
208
|
+
body.to = additional.to;
|
|
209
|
+
const sourcesRaw = additional.sources?.sourceList || [];
|
|
210
|
+
if (sourcesRaw.length)
|
|
211
|
+
body.sources = sourcesRaw.map(s => s.source);
|
|
212
|
+
const excludeSourcesRaw = additional.excludeSources?.sourceList || [];
|
|
213
|
+
if (excludeSourcesRaw.length)
|
|
214
|
+
body.excludeSources = excludeSourcesRaw.map(s => s.source);
|
|
215
|
+
const tickersRaw = additional.tickers?.tickerList || [];
|
|
216
|
+
if (tickersRaw.length)
|
|
217
|
+
body.tickers = tickersRaw.map(t => t.ticker);
|
|
218
|
+
// Defaults if not provided (harmless if user leaves everything empty)
|
|
219
|
+
body.language = additional.language !== undefined ? additional.language : "en";
|
|
220
|
+
body.order = additional.order !== undefined ? additional.order : "DESC";
|
|
221
|
+
body.pageSize = additional.pageSize !== undefined ? Number(additional.pageSize) : 20;
|
|
222
|
+
body.page = additional.page !== undefined ? Number(additional.page) : 1;
|
|
223
|
+
if (typeof additional.includeContent === "boolean")
|
|
224
|
+
body.includeContent = additional.includeContent;
|
|
225
|
+
else
|
|
226
|
+
body.includeContent = false;
|
|
227
|
+
if (typeof additional.includeEntities === "boolean")
|
|
228
|
+
body.includeEntities = additional.includeEntities;
|
|
229
|
+
else
|
|
230
|
+
body.includeEntities = false;
|
|
231
|
+
if (typeof additional.excludeEmptyContent === "boolean")
|
|
232
|
+
body.excludeEmptyContent = additional.excludeEmptyContent;
|
|
233
|
+
else
|
|
234
|
+
body.excludeEmptyContent = false;
|
|
235
|
+
const response = await this.helpers.httpRequest({
|
|
236
|
+
method: "POST",
|
|
237
|
+
url: "https://api.finlight.me/v2/articles",
|
|
238
|
+
headers: {
|
|
239
|
+
"Content-Type": "application/json",
|
|
240
|
+
"x-api-key": apiKey.apiKey,
|
|
241
|
+
},
|
|
242
|
+
body,
|
|
243
|
+
json: true,
|
|
244
|
+
});
|
|
245
|
+
returnData.push(...(Array.isArray(response?.articles) ? response.articles : [response]));
|
|
246
|
+
}
|
|
247
|
+
return [this.helpers.returnJsonArray(returnData)];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.FinlightArticleSearch = FinlightArticleSearch;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FinlightApi = void 0;
|
|
4
|
+
class FinlightApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = "finlightApi";
|
|
7
|
+
this.displayName = "finlight API Key";
|
|
8
|
+
this.properties = [
|
|
9
|
+
{
|
|
10
|
+
displayName: "API Key",
|
|
11
|
+
name: "apiKey",
|
|
12
|
+
type: "credentials",
|
|
13
|
+
default: "",
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
this.test = {
|
|
17
|
+
request: {
|
|
18
|
+
baseURL: "https://api.finlight.me/",
|
|
19
|
+
url: "v2/articles",
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
"x-api-key": "={{$credentials.apiKey}}",
|
|
24
|
+
},
|
|
25
|
+
body: {
|
|
26
|
+
pageSize: 1,
|
|
27
|
+
page: 1,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.FinlightApi = FinlightApi;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="132.6951 99.9025 29.2313 60.7847" width="29.2313px" height="60.7847px"><g id="Ebene_1-2" transform="matrix(1.95135498046875, 0, 0, 1.95135498046875, 162.93136596679688, 190.97030639648438)"><path d="M -2.045 -45.889 C -3.065 -46.409 -4.545 -46.669 -6.465 -46.669 C -8.235 -46.669 -9.805 -46.389 -11.165 -45.819 C -12.525 -45.249 -13.585 -44.379 -14.345 -43.189 C -15.105 -41.999 -15.495 -40.439 -15.495 -38.519 L -15.495 -17.949 C -15.495 -17.059 -15.255 -16.439 -14.785 -16.069 C -14.315 -15.699 -13.585 -15.519 -12.605 -15.519 C -12.085 -15.519 -11.615 -15.559 -11.185 -15.629 C -10.755 -15.699 -10.425 -15.789 -10.175 -15.879 L -10.175 -31.819 L -3.255 -31.819 C -2.675 -31.819 -2.215 -31.989 -1.885 -32.319 C -1.545 -32.659 -1.385 -33.189 -1.385 -33.919 C -1.385 -34.379 -1.445 -34.779 -1.565 -35.129 C -1.685 -35.479 -1.815 -35.759 -1.935 -35.979 L -10.365 -35.979 L -10.365 -38.269 C -10.365 -39.739 -9.995 -40.779 -9.265 -41.409 C -8.535 -42.039 -7.355 -42.349 -5.735 -42.349 C -4.945 -42.349 -4.175 -42.269 -3.425 -42.119 C -2.675 -41.969 -2.025 -41.769 -1.475 -41.519 C -1.205 -41.759 -0.975 -42.059 -0.785 -42.409 C -0.605 -42.759 -0.515 -43.169 -0.515 -43.619 C -0.515 -44.599 -1.025 -45.349 -2.055 -45.869 L -2.045 -45.889 Z"/></g></svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAuthHeaders = getAuthHeaders;
|
|
4
|
+
function getAuthHeaders(params) {
|
|
5
|
+
const headers = {};
|
|
6
|
+
if (params.authentication === "apiKey" && params.apiKey) {
|
|
7
|
+
headers["x-finlight-key"] = params.apiKey;
|
|
8
|
+
}
|
|
9
|
+
if (params.authentication === "basicAuth" && params.credentials) {
|
|
10
|
+
const token = Buffer.from(`${params.credentials.user}:${params.credentials.password}`).toString("base64");
|
|
11
|
+
headers["Authorization"] = `Basic ${token}`;
|
|
12
|
+
}
|
|
13
|
+
return headers;
|
|
14
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nodes = void 0;
|
|
4
|
+
const FinlightWebhookTrigger_node_1 = require("./triggers/FinlightWebhookTrigger.node");
|
|
5
|
+
const FinlightArticleSearch_node_1 = require("./actions/FinlightArticleSearch.node");
|
|
6
|
+
exports.nodes = [FinlightWebhookTrigger_node_1.FinlightWebhookTrigger, FinlightArticleSearch_node_1.FinlightArticleSearch];
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FinlightWebhookTrigger = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class FinlightWebhookTrigger {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.description = {
|
|
8
|
+
displayName: "finlight Webhook Trigger",
|
|
9
|
+
name: "finlightWebhookTrigger",
|
|
10
|
+
group: ["trigger"],
|
|
11
|
+
version: 1,
|
|
12
|
+
description: "Triggers on new webhook events from finlight",
|
|
13
|
+
defaults: {
|
|
14
|
+
name: "finlight Webhook Trigger",
|
|
15
|
+
},
|
|
16
|
+
inputs: [],
|
|
17
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
18
|
+
credentials: [
|
|
19
|
+
{
|
|
20
|
+
name: "finlightApi",
|
|
21
|
+
required: true,
|
|
22
|
+
displayOptions: {
|
|
23
|
+
show: {
|
|
24
|
+
authentication: ["apiKey"],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "httpBasicAuth",
|
|
30
|
+
required: true,
|
|
31
|
+
displayOptions: {
|
|
32
|
+
show: {
|
|
33
|
+
authentication: ["basicAuth"],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
properties: [
|
|
39
|
+
{
|
|
40
|
+
displayName: "Authentication Method",
|
|
41
|
+
name: "authentication",
|
|
42
|
+
type: "options",
|
|
43
|
+
options: [
|
|
44
|
+
{ name: "API Key Header (x-finlight-key)", value: "apiKey" },
|
|
45
|
+
{ name: "Basic Auth", value: "basicAuth" },
|
|
46
|
+
{ name: "None", value: "none" },
|
|
47
|
+
],
|
|
48
|
+
default: "apiKey",
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
webhooks: [
|
|
52
|
+
{
|
|
53
|
+
name: "default",
|
|
54
|
+
httpMethod: "POST",
|
|
55
|
+
responseMode: "onReceived",
|
|
56
|
+
path: "finlight",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
documentationUrl: "https://docs.finlight.me",
|
|
60
|
+
icon: "file:../finlight.svg",
|
|
61
|
+
};
|
|
62
|
+
this.webhookMethods = {
|
|
63
|
+
default: {
|
|
64
|
+
async checkExists() {
|
|
65
|
+
return true;
|
|
66
|
+
},
|
|
67
|
+
async create() {
|
|
68
|
+
return true;
|
|
69
|
+
},
|
|
70
|
+
async delete() {
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async webhook() {
|
|
77
|
+
const req = this.getRequestObject();
|
|
78
|
+
const headers = req.headers;
|
|
79
|
+
const body = req.body;
|
|
80
|
+
const authMethod = this.getNodeParameter("authentication", "");
|
|
81
|
+
// Auth: API Key Header
|
|
82
|
+
if (authMethod === "apiKey") {
|
|
83
|
+
const expectedKey = this.getNodeParameter("apiKey", "");
|
|
84
|
+
const receivedKey = headers["x-finlight-key"];
|
|
85
|
+
if (!receivedKey || receivedKey !== expectedKey) {
|
|
86
|
+
throw new Error("Unauthorized: Invalid API key");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Auth: Basic
|
|
90
|
+
if (authMethod === "basicAuth") {
|
|
91
|
+
const credentials = await this.getCredentials("httpBasicAuth");
|
|
92
|
+
const authHeader = headers["authorization"];
|
|
93
|
+
const expected = "Basic " + Buffer.from(`${credentials.user}:${credentials.password}`).toString("base64");
|
|
94
|
+
if (authHeader !== expected) {
|
|
95
|
+
throw new Error("Unauthorized: Invalid Basic Auth");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Build clean output with optional fields
|
|
99
|
+
const payload = body;
|
|
100
|
+
const output = {
|
|
101
|
+
link: payload.link,
|
|
102
|
+
source: payload.source,
|
|
103
|
+
title: payload.title,
|
|
104
|
+
publishDate: payload.publishDate,
|
|
105
|
+
language: payload.language,
|
|
106
|
+
};
|
|
107
|
+
if (payload.summary)
|
|
108
|
+
output.summary = payload.summary;
|
|
109
|
+
if (payload.content)
|
|
110
|
+
output.content = payload.content;
|
|
111
|
+
if (payload.sentiment)
|
|
112
|
+
output.sentiment = payload.sentiment;
|
|
113
|
+
if (payload.confidence)
|
|
114
|
+
output.confidence = payload.confidence;
|
|
115
|
+
if (payload.images?.length)
|
|
116
|
+
output.images = payload.images;
|
|
117
|
+
if (payload.companies?.length)
|
|
118
|
+
output.companies = payload.companies;
|
|
119
|
+
return {
|
|
120
|
+
workflowData: [[{ json: output }]],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.FinlightWebhookTrigger = FinlightWebhookTrigger;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finlight/n8n-nodes-finlight",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Official n8n integration for finlight: real-time finance and news API",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Ali Büyükkakac",
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"main": "index.js",
|
|
18
18
|
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
19
|
+
"build": "tsc && cp nodes/finlight/finlight.svg dist/nodes/finlight/",
|
|
20
20
|
"lint": "eslint . --ext .ts",
|
|
21
|
-
"test": "jest"
|
|
21
|
+
"test": "jest",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {},
|
|
24
25
|
"devDependencies": {
|
|
@@ -27,7 +28,6 @@
|
|
|
27
28
|
"@typescript-eslint/parser": "^8.38.0",
|
|
28
29
|
"eslint": "^9.32.0",
|
|
29
30
|
"eslint-plugin-n8n-nodes-base": "^1.16.3",
|
|
30
|
-
"n8n-core": "^1.14.1",
|
|
31
31
|
"jest": "^29.4.0",
|
|
32
32
|
"n8n-workflow": "*",
|
|
33
33
|
"ts-jest": "^29.4.0",
|