@apergrex/n8n-nodes-franklab 0.1.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/LICENSE +21 -0
- package/README.md +162 -0
- package/dist/credentials/FrankLabApi.credentials.d.ts +9 -0
- package/dist/credentials/FrankLabApi.credentials.js +50 -0
- package/dist/credentials/FrankLabApi.credentials.js.map +1 -0
- package/dist/credentials/franklab.svg +4 -0
- package/dist/nodes/C2pa/C2pa.node.json +10 -0
- package/dist/nodes/C2pa/FrankLabC2pa.node.d.ts +5 -0
- package/dist/nodes/C2pa/FrankLabC2pa.node.js +58 -0
- package/dist/nodes/C2pa/FrankLabC2pa.node.js.map +1 -0
- package/dist/nodes/C2pa/c2pa.svg +5 -0
- package/dist/nodes/Holst/FrankLabHolst.node.d.ts +5 -0
- package/dist/nodes/Holst/FrankLabHolst.node.js +99 -0
- package/dist/nodes/Holst/FrankLabHolst.node.js.map +1 -0
- package/dist/nodes/Holst/Holst.node.json +10 -0
- package/dist/nodes/Holst/holst.svg +6 -0
- package/dist/nodes/Kley/FrankLabKley.node.d.ts +5 -0
- package/dist/nodes/Kley/FrankLabKley.node.js +95 -0
- package/dist/nodes/Kley/FrankLabKley.node.js.map +1 -0
- package/dist/nodes/Kley/Kley.node.json +10 -0
- package/dist/nodes/Kley/kley.svg +6 -0
- package/dist/nodes/Plastinka/FrankLabPlastinka.node.d.ts +5 -0
- package/dist/nodes/Plastinka/FrankLabPlastinka.node.js +112 -0
- package/dist/nodes/Plastinka/FrankLabPlastinka.node.js.map +1 -0
- package/dist/nodes/Plastinka/Plastinka.node.json +10 -0
- package/dist/nodes/Plastinka/plastinka.svg +6 -0
- package/dist/nodes/Volna/FrankLabVolna.node.d.ts +5 -0
- package/dist/nodes/Volna/FrankLabVolna.node.js +246 -0
- package/dist/nodes/Volna/FrankLabVolna.node.js.map +1 -0
- package/dist/nodes/Volna/Volna.node.json +10 -0
- package/dist/nodes/Volna/volna.svg +5 -0
- package/dist/nodes/shared/client.d.ts +30 -0
- package/dist/nodes/shared/client.js +215 -0
- package/dist/nodes/shared/client.js.map +1 -0
- package/dist/nodes/shared/node-utils.d.ts +7 -0
- package/dist/nodes/shared/node-utils.js +191 -0
- package/dist/nodes/shared/node-utils.js.map +1 -0
- package/dist/nodes/shared/redaction.d.ts +1 -0
- package/dist/nodes/shared/redaction.js +48 -0
- package/dist/nodes/shared/redaction.js.map +1 -0
- package/dist/nodes/shared/registry.d.ts +29 -0
- package/dist/nodes/shared/registry.js +584 -0
- package/dist/nodes/shared/registry.js.map +1 -0
- package/dist/nodes/shared/status.d.ts +4 -0
- package/dist/nodes/shared/status.js +20 -0
- package/dist/nodes/shared/status.js.map +1 -0
- package/dist/nodes/shared/url.d.ts +4 -0
- package/dist/nodes/shared/url.js +164 -0
- package/dist/nodes/shared/url.js.map +1 -0
- package/dist/package.json +59 -0
- package/examples/holst-image-info.workflow.json +19 -0
- package/package.json +59 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeBaseUrl = normalizeBaseUrl;
|
|
4
|
+
exports.buildApiUrl = buildApiUrl;
|
|
5
|
+
exports.validatePublicMediaUrl = validatePublicMediaUrl;
|
|
6
|
+
exports.validatePublicMediaUrlsInPayload = validatePublicMediaUrlsInPayload;
|
|
7
|
+
const FRANKLAB_ORIGIN = 'https://franklab.ru';
|
|
8
|
+
const FRANKLAB_API_BASE = `${FRANKLAB_ORIGIN}/franklab/api`;
|
|
9
|
+
const BLOCKED_HOSTS = new Set([
|
|
10
|
+
'localhost',
|
|
11
|
+
'localhost.',
|
|
12
|
+
'metadata.google.internal',
|
|
13
|
+
'metadata',
|
|
14
|
+
'instance-data',
|
|
15
|
+
]);
|
|
16
|
+
const BLOCKED_HOST_SUFFIXES = ['.localhost', '.local', '.internal', '.lan', '.home', '.corp', '.private', '.intranet'];
|
|
17
|
+
function normalizeBaseUrl(rawBaseUrl) {
|
|
18
|
+
const candidate = rawBaseUrl.trim().replace(/\/+$/, '');
|
|
19
|
+
let parsed;
|
|
20
|
+
try {
|
|
21
|
+
parsed = new URL(candidate);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new Error('FrankLab Base URL must be https://franklab.ru');
|
|
25
|
+
}
|
|
26
|
+
if (parsed.protocol !== 'https:' || parsed.hostname !== 'franklab.ru') {
|
|
27
|
+
throw new Error('Only https://franklab.ru is allowed for the public FrankLab n8n package');
|
|
28
|
+
}
|
|
29
|
+
const path = parsed.pathname.replace(/\/+$/, '');
|
|
30
|
+
if (path === '' || path === '/' || path === '/franklab/api') {
|
|
31
|
+
return FRANKLAB_API_BASE;
|
|
32
|
+
}
|
|
33
|
+
throw new Error('FrankLab Base URL must be https://franklab.ru or https://franklab.ru/franklab/api');
|
|
34
|
+
}
|
|
35
|
+
function buildApiUrl(baseUrl, path, pathParams = {}) {
|
|
36
|
+
const normalizedBase = normalizeBaseUrl(baseUrl);
|
|
37
|
+
const concretePath = path.replace(/:([A-Za-z0-9_]+)/g, (_match, name) => {
|
|
38
|
+
const value = pathParams[name];
|
|
39
|
+
if (value === undefined || value === null || String(value).trim() === '') {
|
|
40
|
+
throw new Error(`Missing path parameter: ${name}`);
|
|
41
|
+
}
|
|
42
|
+
return encodeURIComponent(String(value));
|
|
43
|
+
});
|
|
44
|
+
return `${normalizedBase}${concretePath}`;
|
|
45
|
+
}
|
|
46
|
+
function validatePublicMediaUrl(rawUrl) {
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = new URL(rawUrl);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error('Media URL must be an absolute URL');
|
|
53
|
+
}
|
|
54
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
55
|
+
throw new Error('Only http and https media URLs are allowed');
|
|
56
|
+
}
|
|
57
|
+
const hostname = normalizeHostname(parsed.hostname);
|
|
58
|
+
if (isUnsafeHostname(hostname) || isUnsafeIpLiteral(hostname) || embedsUnsafeIpv4(hostname)) {
|
|
59
|
+
throw new Error('Local media URLs are not allowed');
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
function validatePublicMediaUrlsInPayload(payload) {
|
|
64
|
+
validateNestedMediaUrls(payload, 'payload');
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
function validateNestedMediaUrls(value, path) {
|
|
68
|
+
if (Array.isArray(value)) {
|
|
69
|
+
value.forEach((item, index) => validateNestedMediaUrls(item, `${path}[${index}]`));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!isRecord(value))
|
|
73
|
+
return;
|
|
74
|
+
for (const [key, nestedValue] of Object.entries(value)) {
|
|
75
|
+
const fieldPath = `${path}.${key}`;
|
|
76
|
+
if (isMediaUrlField(key) && typeof nestedValue === 'string' && nestedValue.trim() !== '') {
|
|
77
|
+
try {
|
|
78
|
+
validatePublicMediaUrl(nestedValue);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
82
|
+
throw new Error(`Media URL field ${fieldPath}: ${message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
validateNestedMediaUrls(nestedValue, fieldPath);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isRecord(value) {
|
|
89
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
90
|
+
}
|
|
91
|
+
function isMediaUrlField(key) {
|
|
92
|
+
const lower = key.toLowerCase();
|
|
93
|
+
return lower === 'url' || lower.endsWith('_url') || lower.endsWith('-url') || key.endsWith('Url') || key.endsWith('URL');
|
|
94
|
+
}
|
|
95
|
+
function normalizeHostname(hostname) {
|
|
96
|
+
const lower = hostname.toLowerCase();
|
|
97
|
+
if (lower.startsWith('[') && lower.endsWith(']'))
|
|
98
|
+
return lower.slice(1, -1);
|
|
99
|
+
return lower;
|
|
100
|
+
}
|
|
101
|
+
function isUnsafeHostname(hostname) {
|
|
102
|
+
if (BLOCKED_HOSTS.has(hostname))
|
|
103
|
+
return true;
|
|
104
|
+
return BLOCKED_HOST_SUFFIXES.some((suffix) => hostname.endsWith(suffix));
|
|
105
|
+
}
|
|
106
|
+
function isUnsafeIpLiteral(hostname) {
|
|
107
|
+
return isUnsafeIpv4(hostname) || isUnsafeIpv6(hostname);
|
|
108
|
+
}
|
|
109
|
+
function isUnsafeIpv4(hostname) {
|
|
110
|
+
const parts = hostname.split('.').map((part) => Number(part));
|
|
111
|
+
if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const [first, second] = parts;
|
|
115
|
+
return (first === 0 ||
|
|
116
|
+
first === 10 ||
|
|
117
|
+
first === 127 ||
|
|
118
|
+
(first === 100 && second >= 64 && second <= 127) ||
|
|
119
|
+
(first === 169 && second === 254) ||
|
|
120
|
+
(first === 172 && second >= 16 && second <= 31) ||
|
|
121
|
+
(first === 192 && second === 168) ||
|
|
122
|
+
(first === 198 && (second === 18 || second === 19)) ||
|
|
123
|
+
first >= 224);
|
|
124
|
+
}
|
|
125
|
+
function isUnsafeIpv6(hostname) {
|
|
126
|
+
var _a;
|
|
127
|
+
if (!hostname.includes(':'))
|
|
128
|
+
return false;
|
|
129
|
+
if (hostname === '::' || hostname === '::1')
|
|
130
|
+
return true;
|
|
131
|
+
const mappedIpv4 = parseMappedIpv4(hostname);
|
|
132
|
+
if (mappedIpv4 && isUnsafeIpv4(mappedIpv4))
|
|
133
|
+
return true;
|
|
134
|
+
const firstHextet = parseInt((_a = hostname.split(':').find(Boolean)) !== null && _a !== void 0 ? _a : '0', 16);
|
|
135
|
+
if (!Number.isFinite(firstHextet))
|
|
136
|
+
return true;
|
|
137
|
+
return ((firstHextet & 0xfe00) === 0xfc00 ||
|
|
138
|
+
(firstHextet & 0xffc0) === 0xfe80 ||
|
|
139
|
+
(firstHextet & 0xff00) === 0xff00 ||
|
|
140
|
+
hostname.startsWith('2001:db8:'));
|
|
141
|
+
}
|
|
142
|
+
function parseMappedIpv4(hostname) {
|
|
143
|
+
var _a;
|
|
144
|
+
const dotQuad = (_a = hostname.match(/(?:^|:)(\d{1,3}(?:\.\d{1,3}){3})$/)) === null || _a === void 0 ? void 0 : _a[1];
|
|
145
|
+
if (dotQuad)
|
|
146
|
+
return dotQuad;
|
|
147
|
+
if (!hostname.includes('ffff:'))
|
|
148
|
+
return null;
|
|
149
|
+
const hextets = hostname.split(':').filter(Boolean);
|
|
150
|
+
const tail = hextets.slice(-2);
|
|
151
|
+
if (tail.length !== 2)
|
|
152
|
+
return null;
|
|
153
|
+
const high = parseInt(tail[0], 16);
|
|
154
|
+
const low = parseInt(tail[1], 16);
|
|
155
|
+
if (![high, low].every((part) => Number.isInteger(part) && part >= 0 && part <= 0xffff))
|
|
156
|
+
return null;
|
|
157
|
+
return [high >> 8, high & 0xff, low >> 8, low & 0xff].join('.');
|
|
158
|
+
}
|
|
159
|
+
function embedsUnsafeIpv4(hostname) {
|
|
160
|
+
var _a;
|
|
161
|
+
const candidates = (_a = hostname.match(/\d{1,3}(?:[.-]\d{1,3}){3}/g)) !== null && _a !== void 0 ? _a : [];
|
|
162
|
+
return candidates.some((candidate) => isUnsafeIpv4(candidate.split('-').join('.')));
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../../nodes/shared/url.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@apergrex/n8n-nodes-franklab",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Official FrankLab community nodes for n8n.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/d906090-rgb/n8n-nodes-franklab#readme",
|
|
7
|
+
"keywords": ["n8n-community-node-package", "n8n", "franklab", "automation"],
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "FrankLab"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/d906090-rgb/n8n-nodes-franklab.git"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=20.19"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "n8n-node build",
|
|
23
|
+
"build:watch": "tsc --watch",
|
|
24
|
+
"dev": "n8n-node dev",
|
|
25
|
+
"lint": "n8n-node lint",
|
|
26
|
+
"lint:fix": "n8n-node lint --fix",
|
|
27
|
+
"pack:dry-run": "npm pack --dry-run",
|
|
28
|
+
"release": "n8n-node release",
|
|
29
|
+
"scan": "npm run lint && npm run pack:dry-run",
|
|
30
|
+
"scan:published": "npx @n8n/scan-community-package @apergrex/n8n-nodes-franklab",
|
|
31
|
+
"pretest": "npm run build",
|
|
32
|
+
"test": "node --test test/*.test.mjs",
|
|
33
|
+
"prepublishOnly": "n8n-node prerelease"
|
|
34
|
+
},
|
|
35
|
+
"files": ["dist", "README.md", "LICENSE", "examples"],
|
|
36
|
+
"n8n": {
|
|
37
|
+
"n8nNodesApiVersion": 1,
|
|
38
|
+
"strict": true,
|
|
39
|
+
"credentials": ["dist/credentials/FrankLabApi.credentials.js"],
|
|
40
|
+
"nodes": [
|
|
41
|
+
"dist/nodes/Holst/FrankLabHolst.node.js",
|
|
42
|
+
"dist/nodes/Kley/FrankLabKley.node.js",
|
|
43
|
+
"dist/nodes/Plastinka/FrankLabPlastinka.node.js",
|
|
44
|
+
"dist/nodes/Volna/FrankLabVolna.node.js",
|
|
45
|
+
"dist/nodes/C2pa/FrankLabC2pa.node.js"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@n8n/node-cli": "^0.23.1",
|
|
51
|
+
"eslint": "9.32.0",
|
|
52
|
+
"prettier": "3.6.2",
|
|
53
|
+
"release-it": "^19.0.4",
|
|
54
|
+
"typescript": "5.9.2"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"n8n-workflow": "*"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "FrankLab HOLST Image Info",
|
|
3
|
+
"nodes": [
|
|
4
|
+
{
|
|
5
|
+
"parameters": {
|
|
6
|
+
"operation": "submitImage",
|
|
7
|
+
"imageUrl": "https://cdn.example.com/image.png",
|
|
8
|
+
"operationName": "info",
|
|
9
|
+
"waitForCompletion": true
|
|
10
|
+
},
|
|
11
|
+
"type": "@apergrex/n8n-nodes-franklab.frankLabHolst",
|
|
12
|
+
"typeVersion": 1,
|
|
13
|
+
"position": [400, 240],
|
|
14
|
+
"id": "franklab-holst-image-info",
|
|
15
|
+
"name": "FrankLab HOLST"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"connections": {}
|
|
19
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@apergrex/n8n-nodes-franklab",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Official FrankLab community nodes for n8n.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/d906090-rgb/n8n-nodes-franklab#readme",
|
|
7
|
+
"keywords": ["n8n-community-node-package", "n8n", "franklab", "automation"],
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "FrankLab"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/d906090-rgb/n8n-nodes-franklab.git"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=20.19"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "n8n-node build",
|
|
23
|
+
"build:watch": "tsc --watch",
|
|
24
|
+
"dev": "n8n-node dev",
|
|
25
|
+
"lint": "n8n-node lint",
|
|
26
|
+
"lint:fix": "n8n-node lint --fix",
|
|
27
|
+
"pack:dry-run": "npm pack --dry-run",
|
|
28
|
+
"release": "n8n-node release",
|
|
29
|
+
"scan": "npm run lint && npm run pack:dry-run",
|
|
30
|
+
"scan:published": "npx @n8n/scan-community-package @apergrex/n8n-nodes-franklab",
|
|
31
|
+
"pretest": "npm run build",
|
|
32
|
+
"test": "node --test test/*.test.mjs",
|
|
33
|
+
"prepublishOnly": "n8n-node prerelease"
|
|
34
|
+
},
|
|
35
|
+
"files": ["dist", "README.md", "LICENSE", "examples"],
|
|
36
|
+
"n8n": {
|
|
37
|
+
"n8nNodesApiVersion": 1,
|
|
38
|
+
"strict": true,
|
|
39
|
+
"credentials": ["dist/credentials/FrankLabApi.credentials.js"],
|
|
40
|
+
"nodes": [
|
|
41
|
+
"dist/nodes/Holst/FrankLabHolst.node.js",
|
|
42
|
+
"dist/nodes/Kley/FrankLabKley.node.js",
|
|
43
|
+
"dist/nodes/Plastinka/FrankLabPlastinka.node.js",
|
|
44
|
+
"dist/nodes/Volna/FrankLabVolna.node.js",
|
|
45
|
+
"dist/nodes/C2pa/FrankLabC2pa.node.js"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@n8n/node-cli": "^0.23.1",
|
|
51
|
+
"eslint": "9.32.0",
|
|
52
|
+
"prettier": "3.6.2",
|
|
53
|
+
"release-it": "^19.0.4",
|
|
54
|
+
"typescript": "5.9.2"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"n8n-workflow": "*"
|
|
58
|
+
}
|
|
59
|
+
}
|