n8n-workflow 2.0.0-rc.2 → 2.0.1
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/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces.d.ts +13 -1
- package/dist/cjs/interfaces.d.ts.map +1 -1
- package/dist/cjs/interfaces.js.map +1 -1
- package/dist/cjs/typecheck.tsbuildinfo +1 -1
- package/dist/cjs/workflow-checksum.d.ts +3 -0
- package/dist/cjs/workflow-checksum.d.ts.map +1 -1
- package/dist/cjs/workflow-checksum.js +17 -4
- package/dist/cjs/workflow-checksum.js.map +1 -1
- package/dist/cjs/workflow-validation.d.ts +18 -0
- package/dist/cjs/workflow-validation.d.ts.map +1 -0
- package/dist/cjs/workflow-validation.js +53 -0
- package/dist/cjs/workflow-validation.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interfaces.d.ts +13 -1
- package/dist/esm/interfaces.d.ts.map +1 -1
- package/dist/esm/interfaces.js.map +1 -1
- package/dist/esm/typecheck.tsbuildinfo +1 -1
- package/dist/esm/workflow-checksum.d.ts +3 -0
- package/dist/esm/workflow-checksum.d.ts.map +1 -1
- package/dist/esm/workflow-checksum.js +13 -3
- package/dist/esm/workflow-checksum.js.map +1 -1
- package/dist/esm/workflow-validation.d.ts +18 -0
- package/dist/esm/workflow-validation.d.ts.map +1 -0
- package/dist/esm/workflow-validation.js +40 -0
- package/dist/esm/workflow-validation.js.map +1 -0
- package/package.json +3 -3
|
@@ -17,6 +17,9 @@ export interface WorkflowSnapshot {
|
|
|
17
17
|
/**
|
|
18
18
|
* Calculates SHA-256 checksum of workflow content fields for conflict detection.
|
|
19
19
|
* Excludes: id, versionId, timestamps, staticData, relations.
|
|
20
|
+
*
|
|
21
|
+
* Uses WebCrypto when available (e.g. browser in secure context), and falls back to a pure-JS SHA-256
|
|
22
|
+
* implementation to also work in environments where WebCrypto is unavailable (e.g. HTTP/insecure contexts).
|
|
20
23
|
*/
|
|
21
24
|
export declare function calculateWorkflowChecksum(workflow: WorkflowSnapshot): Promise<string>;
|
|
22
25
|
//# sourceMappingURL=workflow-checksum.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-checksum.d.ts","sourceRoot":"","sources":["../../src/workflow-checksum.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow-checksum.d.ts","sourceRoot":"","sources":["../../src/workflow-checksum.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGrF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAuCD;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB3F"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import jsSHA from 'jssha';
|
|
1
2
|
import { isObject } from './utils';
|
|
2
3
|
const CHECKSUM_FIELDS = [
|
|
3
4
|
'name',
|
|
@@ -33,6 +34,9 @@ function sortObjectKeys(value) {
|
|
|
33
34
|
/**
|
|
34
35
|
* Calculates SHA-256 checksum of workflow content fields for conflict detection.
|
|
35
36
|
* Excludes: id, versionId, timestamps, staticData, relations.
|
|
37
|
+
*
|
|
38
|
+
* Uses WebCrypto when available (e.g. browser in secure context), and falls back to a pure-JS SHA-256
|
|
39
|
+
* implementation to also work in environments where WebCrypto is unavailable (e.g. HTTP/insecure contexts).
|
|
36
40
|
*/
|
|
37
41
|
export async function calculateWorkflowChecksum(workflow) {
|
|
38
42
|
const checksumPayload = {};
|
|
@@ -44,9 +48,15 @@ export async function calculateWorkflowChecksum(workflow) {
|
|
|
44
48
|
}
|
|
45
49
|
const normalizedPayload = sortObjectKeys(checksumPayload);
|
|
46
50
|
const serializedPayload = JSON.stringify(normalizedPayload);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
const subtle = globalThis.crypto?.subtle;
|
|
52
|
+
if (subtle) {
|
|
53
|
+
const data = new TextEncoder().encode(serializedPayload);
|
|
54
|
+
const hashBuffer = await subtle.digest('SHA-256', data);
|
|
55
|
+
return arrayBufferToHex(hashBuffer);
|
|
56
|
+
}
|
|
57
|
+
const shaObj = new jsSHA('SHA-256', 'TEXT', { encoding: 'UTF8' });
|
|
58
|
+
shaObj.update(serializedPayload);
|
|
59
|
+
return shaObj.getHash('HEX').toLowerCase();
|
|
50
60
|
}
|
|
51
61
|
function arrayBufferToHex(arrayBuffer) {
|
|
52
62
|
const bytes = new Uint8Array(arrayBuffer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-checksum.js","sourceRoot":"","sources":["../../src/workflow-checksum.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow-checksum.js","sourceRoot":"","sources":["../../src/workflow-checksum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkBnC,MAAM,eAAe,GAAG;IACvB,MAAM;IACN,aAAa;IACb,OAAO;IACP,aAAa;IACb,UAAU;IACV,MAAM;IACN,SAAS;IACT,YAAY;IACZ,iBAAiB;CACwC,CAAC;AAE3D;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE9D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7C,MAAM,YAAY,GAA4B,EAAE,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,QAA0B;IACzE,MAAM,eAAe,GAA4B,EAAE,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,eAAe,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;IACF,CAAC;IAED,MAAM,iBAAiB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAwB;IACjD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { INodes, INodeType } from './interfaces';
|
|
2
|
+
export interface INodeTypesGetter {
|
|
3
|
+
getByNameAndVersion(nodeType: string, version?: number): INodeType | undefined;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Validates that a workflow has at least one trigger-like node (trigger, webhook, or polling node).
|
|
7
|
+
* A workflow can only be activated if it has a node that can start the workflow execution.
|
|
8
|
+
*
|
|
9
|
+
* @param nodes - The workflow nodes to validate
|
|
10
|
+
* @param nodeTypes - Node types getter to retrieve node definitions
|
|
11
|
+
* @param ignoreNodeTypes - Optional array of node types to ignore (e.g., manual trigger, start node)
|
|
12
|
+
* @returns Object with isValid flag and error message if invalid
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateWorkflowHasTriggerLikeNode(nodes: INodes, nodeTypes: INodeTypesGetter, ignoreNodeTypes?: string[]): {
|
|
15
|
+
isValid: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=workflow-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-validation.d.ts","sourceRoot":"","sources":["../../src/workflow-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAChC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CAC/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kCAAkC,CACjD,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,gBAAgB,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,GACxB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuCtC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that a workflow has at least one trigger-like node (trigger, webhook, or polling node).
|
|
3
|
+
* A workflow can only be activated if it has a node that can start the workflow execution.
|
|
4
|
+
*
|
|
5
|
+
* @param nodes - The workflow nodes to validate
|
|
6
|
+
* @param nodeTypes - Node types getter to retrieve node definitions
|
|
7
|
+
* @param ignoreNodeTypes - Optional array of node types to ignore (e.g., manual trigger, start node)
|
|
8
|
+
* @returns Object with isValid flag and error message if invalid
|
|
9
|
+
*/
|
|
10
|
+
export function validateWorkflowHasTriggerLikeNode(nodes, nodeTypes, ignoreNodeTypes) {
|
|
11
|
+
let node;
|
|
12
|
+
let nodeType;
|
|
13
|
+
for (const nodeName of Object.keys(nodes)) {
|
|
14
|
+
node = nodes[nodeName];
|
|
15
|
+
// Skip disabled nodes - they cannot trigger a run
|
|
16
|
+
if (node.disabled === true) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
// Skip ignored node types (e.g., manual trigger, start node)
|
|
20
|
+
if (ignoreNodeTypes?.includes(node.type)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
nodeType = nodeTypes.getByNameAndVersion(node.type, node.typeVersion);
|
|
24
|
+
if (nodeType === undefined) {
|
|
25
|
+
// Type is not known, skip validation
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (nodeType.poll !== undefined ||
|
|
29
|
+
nodeType.trigger !== undefined ||
|
|
30
|
+
nodeType.webhook !== undefined) {
|
|
31
|
+
// Is a trigger node. So workflow can be activated.
|
|
32
|
+
return { isValid: true };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
isValid: false,
|
|
37
|
+
error: 'Workflow cannot be activated because it has no trigger node. At least one trigger, webhook, or polling node is required.',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=workflow-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-validation.js","sourceRoot":"","sources":["../../src/workflow-validation.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,MAAM,UAAU,kCAAkC,CACjD,KAAa,EACb,SAA2B,EAC3B,eAA0B;IAE1B,IAAI,IAAW,CAAC;IAChB,IAAI,QAA+B,CAAC;IAEpC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEvB,kDAAkD;QAClD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5B,SAAS;QACV,CAAC;QAED,6DAA6D;QAC7D,IAAI,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,SAAS;QACV,CAAC;QAED,QAAQ,GAAG,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEtE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,qCAAqC;YACrC,SAAS;QACV,CAAC;QAED,IACC,QAAQ,CAAC,IAAI,KAAK,SAAS;YAC3B,QAAQ,CAAC,OAAO,KAAK,SAAS;YAC9B,QAAQ,CAAC,OAAO,KAAK,SAAS,EAC7B,CAAC;YACF,mDAAmD;YACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,OAAO;QACN,OAAO,EAAE,KAAK;QACd,KAAK,EACJ,0HAA0H;KAC3H,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "n8n-workflow",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Workflow base code of n8n",
|
|
5
5
|
"types": "dist/esm/index.d.ts",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"vitest": "^3.1.3",
|
|
35
35
|
"vitest-mock-extended": "^3.1.0",
|
|
36
36
|
"@n8n/config": "2.0.0-rc.1",
|
|
37
|
-
"@n8n/
|
|
38
|
-
"@n8n/
|
|
37
|
+
"@n8n/typescript-config": "1.3.0",
|
|
38
|
+
"@n8n/vitest-config": "1.5.0"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@n8n/tournament": "1.0.6",
|