@n8n/workflow-sdk 0.25.1 → 0.27.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 (119) hide show
  1. package/dist/ast-interpreter/index.d.ts +1 -1
  2. package/dist/ast-interpreter/index.js +2 -1
  3. package/dist/ast-interpreter/index.js.map +1 -1
  4. package/dist/build.tsbuildinfo +1 -1
  5. package/dist/cli/index.js +19 -9
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/node-definition-dirs.d.ts +6 -0
  8. package/dist/cli/node-definition-dirs.js +63 -0
  9. package/dist/cli/node-definition-dirs.js.map +1 -0
  10. package/dist/cli/validate.d.ts +5 -0
  11. package/dist/cli/validate.js +203 -0
  12. package/dist/cli/validate.js.map +1 -0
  13. package/dist/codegen/code-generator.js +4 -1
  14. package/dist/codegen/code-generator.js.map +1 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.js +10 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/lint/ast-walk.d.ts +7 -0
  19. package/dist/lint/ast-walk.js +43 -0
  20. package/dist/lint/ast-walk.js.map +1 -0
  21. package/dist/lint/code-node/extract-snippets.d.ts +13 -0
  22. package/dist/lint/code-node/extract-snippets.js +110 -0
  23. package/dist/lint/code-node/extract-snippets.js.map +1 -0
  24. package/dist/lint/code-node/js.d.ts +8 -0
  25. package/dist/lint/code-node/js.js +219 -0
  26. package/dist/lint/code-node/js.js.map +1 -0
  27. package/dist/lint/code-node/python.d.ts +5 -0
  28. package/dist/lint/code-node/python.js +25 -0
  29. package/dist/lint/code-node/python.js.map +1 -0
  30. package/dist/lint/index.d.ts +8 -0
  31. package/dist/lint/index.js +25 -0
  32. package/dist/lint/index.js.map +1 -0
  33. package/dist/lint/lint-workflow-source.d.ts +2 -0
  34. package/dist/lint/lint-workflow-source.js +47 -0
  35. package/dist/lint/lint-workflow-source.js.map +1 -0
  36. package/dist/lint/sdk/workflow-sdk-lint.d.ts +12 -0
  37. package/dist/lint/sdk/workflow-sdk-lint.js +271 -0
  38. package/dist/lint/sdk/workflow-sdk-lint.js.map +1 -0
  39. package/dist/lint/types.d.ts +15 -0
  40. package/dist/lint/types.js +7 -0
  41. package/dist/lint/types.js.map +1 -0
  42. package/dist/mock-data/context.d.ts +5 -2
  43. package/dist/mock-data/context.js +109 -6
  44. package/dist/mock-data/context.js.map +1 -1
  45. package/dist/mock-data/index.d.ts +2 -1
  46. package/dist/mock-data/index.js +4 -1
  47. package/dist/mock-data/index.js.map +1 -1
  48. package/dist/mock-data/parse.js +23 -4
  49. package/dist/mock-data/parse.js.map +1 -1
  50. package/dist/mock-data/prompt.d.ts +1 -1
  51. package/dist/mock-data/prompt.js +11 -3
  52. package/dist/mock-data/prompt.js.map +1 -1
  53. package/dist/mock-data/types.d.ts +12 -0
  54. package/dist/mock-data/validate.d.ts +10 -0
  55. package/dist/mock-data/validate.js +77 -0
  56. package/dist/mock-data/validate.js.map +1 -0
  57. package/dist/prompts/sdk-reference/index.d.ts +1 -1
  58. package/dist/prompts/sdk-reference/index.js +2 -1
  59. package/dist/prompts/sdk-reference/index.js.map +1 -1
  60. package/dist/prompts/sdk-reference/sdk-language.d.ts +1 -0
  61. package/dist/prompts/sdk-reference/sdk-language.js +43 -20
  62. package/dist/prompts/sdk-reference/sdk-language.js.map +1 -1
  63. package/dist/types/base.d.ts +9 -1
  64. package/dist/validation/index.d.ts +7 -34
  65. package/dist/validation/index.js +22 -698
  66. package/dist/validation/index.js.map +1 -1
  67. package/dist/validation/informational-validation-codes.d.ts +1 -0
  68. package/dist/validation/informational-validation-codes.js +7 -0
  69. package/dist/validation/informational-validation-codes.js.map +1 -0
  70. package/dist/validation/issue-severity.d.ts +6 -0
  71. package/dist/validation/issue-severity.js +24 -0
  72. package/dist/validation/issue-severity.js.map +1 -0
  73. package/dist/validation/{resolve-schema.d.ts → node-parameter-schema/resolve-schema.d.ts} +1 -1
  74. package/dist/validation/{resolve-schema.js → node-parameter-schema/resolve-schema.js} +1 -1
  75. package/dist/validation/node-parameter-schema/resolve-schema.js.map +1 -0
  76. package/dist/validation/{schema-helpers.d.ts → node-parameter-schema/schema-helpers.d.ts} +1 -1
  77. package/dist/validation/{schema-helpers.js → node-parameter-schema/schema-helpers.js} +1 -1
  78. package/dist/validation/node-parameter-schema/schema-helpers.js.map +1 -0
  79. package/dist/validation/{schema-validator.js → node-parameter-schema/schema-validator.js} +1 -1
  80. package/dist/validation/node-parameter-schema/schema-validator.js.map +1 -0
  81. package/dist/validation/{test-schema-setup.js → node-parameter-schema/test-schema-setup.js} +3 -3
  82. package/dist/validation/node-parameter-schema/test-schema-setup.js.map +1 -0
  83. package/dist/validation/{input-resolver.js → node-port-resolvers/resolve-main-input-count.js} +1 -1
  84. package/dist/validation/node-port-resolvers/resolve-main-input-count.js.map +1 -0
  85. package/dist/validation/{output-resolver.js → node-port-resolvers/resolve-main-output-count.js} +1 -1
  86. package/dist/validation/node-port-resolvers/resolve-main-output-count.js.map +1 -0
  87. package/dist/validation/validate-workflow-builder.d.ts +44 -0
  88. package/dist/validation/validate-workflow-builder.js +132 -0
  89. package/dist/validation/validate-workflow-builder.js.map +1 -0
  90. package/dist/validation/validate-workflow.d.ts +36 -0
  91. package/dist/validation/validate-workflow.js +723 -0
  92. package/dist/validation/validate-workflow.js.map +1 -0
  93. package/dist/validation.d.ts +2 -2
  94. package/dist/validation.js +6 -2
  95. package/dist/validation.js.map +1 -1
  96. package/dist/workflow-builder/plugins/serializers/json-serializer.js +12 -7
  97. package/dist/workflow-builder/plugins/serializers/json-serializer.js.map +1 -1
  98. package/dist/workflow-builder/plugins/types.d.ts +6 -7
  99. package/dist/workflow-builder/plugins/types.js.map +1 -1
  100. package/dist/workflow-builder/plugins/validators/disconnected-node-validator.js +1 -1
  101. package/dist/workflow-builder/plugins/validators/disconnected-node-validator.js.map +1 -1
  102. package/dist/workflow-builder/plugins/validators/missing-trigger-validator.js +1 -1
  103. package/dist/workflow-builder/plugins/validators/missing-trigger-validator.js.map +1 -1
  104. package/dist/workflow-builder/workflow-import.d.ts +2 -6
  105. package/dist/workflow-builder/workflow-import.js +5 -2
  106. package/dist/workflow-builder/workflow-import.js.map +1 -1
  107. package/dist/workflow-builder.js +7 -9
  108. package/dist/workflow-builder.js.map +1 -1
  109. package/package.json +14 -9
  110. package/dist/validation/input-resolver.js.map +0 -1
  111. package/dist/validation/output-resolver.js.map +0 -1
  112. package/dist/validation/resolve-schema.js.map +0 -1
  113. package/dist/validation/schema-helpers.js.map +0 -1
  114. package/dist/validation/schema-validator.js.map +0 -1
  115. package/dist/validation/test-schema-setup.js.map +0 -1
  116. /package/dist/validation/{schema-validator.d.ts → node-parameter-schema/schema-validator.d.ts} +0 -0
  117. /package/dist/validation/{test-schema-setup.d.ts → node-parameter-schema/test-schema-setup.d.ts} +0 -0
  118. /package/dist/validation/{input-resolver.d.ts → node-port-resolvers/resolve-main-input-count.d.ts} +0 -0
  119. /package/dist/validation/{output-resolver.d.ts → node-port-resolvers/resolve-main-output-count.d.ts} +0 -0
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareSourceForLint = prepareSourceForLint;
4
+ exports.lintWorkflowSdkAst = lintWorkflowSdkAst;
5
+ exports.lintWorkflowSdkSource = lintWorkflowSdkSource;
6
+ const ast_interpreter_1 = require("../../ast-interpreter");
7
+ const ast_walk_1 = require("../ast-walk");
8
+ const extract_snippets_1 = require("../code-node/extract-snippets");
9
+ const types_1 = require("../types");
10
+ const NATIVE_ARRAY_METHODS = new Set([
11
+ 'map',
12
+ 'join',
13
+ 'filter',
14
+ 'reduce',
15
+ 'forEach',
16
+ 'flatMap',
17
+ 'find',
18
+ 'some',
19
+ 'every',
20
+ ]);
21
+ const SDK_FLUENT_METHODS = new Set([
22
+ 'to',
23
+ 'add',
24
+ 'onTrue',
25
+ 'onFalse',
26
+ 'onCase',
27
+ 'onDone',
28
+ 'onEachBatch',
29
+ 'onError',
30
+ 'input',
31
+ 'output',
32
+ 'settings',
33
+ 'update',
34
+ 'then',
35
+ 'group',
36
+ ]);
37
+ function prepareSourceForLint(source) {
38
+ let code = source;
39
+ const blankSameLines = (match) => '\n'.repeat((match.match(/\n/g) ?? []).length);
40
+ const spaces = (match) => ' '.repeat(match.length);
41
+ code = code.replace(/^\s*import\s[\s\S]*?from\s+['"][^'"]+['"];?\s*$/gm, blankSameLines);
42
+ code = code.replace(/^\s*import\s+type\s[\s\S]*?;?\s*$/gm, blankSameLines);
43
+ code = code.replace(/\b((?:const|let|var)\s+[A-Za-z_$][\w$]*)\s*:\s*[A-Za-z_$][\w$.|<>[\]\s,&?]*(?=\s*=)/g, '$1');
44
+ code = code.replace(/([,(]\s*[A-Za-z_$][\w$]*)\s*:\s*[A-Za-z_$][\w$.|<>[\]\s,&?]*(?=\s*[,)=])/g, '$1');
45
+ const asConstMatches = [];
46
+ const asConstPattern = /\bas\s+const\b/g;
47
+ const lines = code.split(/\r?\n/);
48
+ for (let i = 0; i < lines.length; i++) {
49
+ asConstPattern.lastIndex = 0;
50
+ let match;
51
+ while ((match = asConstPattern.exec(lines[i] ?? '')) !== null) {
52
+ asConstMatches.push({ line: i + 1, column: match.index });
53
+ }
54
+ }
55
+ code = code.replace(/\bas\s+const\b/g, spaces);
56
+ code = code.replace(/\bas\s+[A-Za-z_$][\w$.<>,\s|&[\]?]*/g, spaces);
57
+ code = code.replace(/\bsatisfies\s+[A-Za-z_$][\w$.|<>[\]\s,&?]*/g, spaces);
58
+ return { code, asConstMatches };
59
+ }
60
+ function locationOf(node) {
61
+ if (!node.loc)
62
+ return {};
63
+ return { line: node.loc.start.line, column: node.loc.start.column + 1 };
64
+ }
65
+ function isPlaceholderCall(node) {
66
+ return node.callee.type === 'Identifier' && node.callee.name === 'placeholder';
67
+ }
68
+ function isExprCall(node) {
69
+ return node.callee.type === 'Identifier' && node.callee.name === 'expr';
70
+ }
71
+ function directReceiverName(member) {
72
+ if (member.object.type === 'Identifier') {
73
+ return member.object.name;
74
+ }
75
+ return undefined;
76
+ }
77
+ function stringContentRanges(ast) {
78
+ const ranges = [];
79
+ (0, ast_walk_1.walkAst)(ast, (node) => {
80
+ const isString = node.type === 'TemplateLiteral' ||
81
+ (node.type === 'Literal' && typeof node.value === 'string');
82
+ if (!isString || !node.loc)
83
+ return;
84
+ ranges.push({
85
+ startLine: node.loc.start.line,
86
+ startColumn: node.loc.start.column,
87
+ endLine: node.loc.end.line,
88
+ endColumn: node.loc.end.column,
89
+ });
90
+ });
91
+ return ranges;
92
+ }
93
+ function rangeContains(range, line, column) {
94
+ if (line < range.startLine || line > range.endLine)
95
+ return false;
96
+ if (line === range.startLine && column < range.startColumn)
97
+ return false;
98
+ if (line === range.endLine && column >= range.endColumn)
99
+ return false;
100
+ return true;
101
+ }
102
+ function lintWorkflowSdkAst(ast, asConstMatches = []) {
103
+ const issues = [];
104
+ const stringRanges = stringContentRanges(ast);
105
+ for (const match of asConstMatches) {
106
+ if (stringRanges.some((range) => rangeContains(range, match.line, match.column)))
107
+ continue;
108
+ issues.push((0, types_1.lintIssue)({
109
+ code: 'SDK_AS_CONST',
110
+ message: '`as const` is TypeScript-only and the workflow parser cannot interpret it. Remove the assertion.',
111
+ line: match.line,
112
+ column: match.column + 1,
113
+ lintTarget: 'sdk',
114
+ }));
115
+ }
116
+ const exportIndex = ast.body.findIndex((stmt) => stmt.type === 'ExportDefaultDeclaration');
117
+ if (exportIndex >= 0) {
118
+ for (let i = exportIndex + 1; i < ast.body.length; i++) {
119
+ const stmt = ast.body[i];
120
+ if (!stmt || stmt.type === 'EmptyStatement')
121
+ continue;
122
+ issues.push((0, types_1.lintIssue)({
123
+ code: 'SDK_CODE_AFTER_EXPORT_DEFAULT',
124
+ message: 'Statement after `export default workflow(...)` never reaches the builder — nodes/wiring here are dropped. ' +
125
+ 'Compose all `.to()` / `.onTrue()` / `.onFalse()` / `.onCase()` inside the export default chain.',
126
+ ...locationOf(stmt),
127
+ lintTarget: 'sdk',
128
+ }));
129
+ }
130
+ }
131
+ const branchCounts = new Map();
132
+ (0, ast_walk_1.walkAst)(ast, (node, parent) => {
133
+ if (node.type === 'ImportDeclaration')
134
+ return;
135
+ const forbidden = ast_interpreter_1.FORBIDDEN_NODE_TYPES[node.type];
136
+ if (forbidden) {
137
+ issues.push((0, types_1.lintIssue)({
138
+ code: 'SDK_FORBIDDEN_CONSTRUCT',
139
+ message: forbidden,
140
+ ...locationOf(node),
141
+ lintTarget: 'sdk',
142
+ }));
143
+ }
144
+ if (node.type === 'Identifier' && ast_interpreter_1.DANGEROUS_GLOBALS.has(node.name)) {
145
+ const isPropertyName = parent?.type === 'MemberExpression' && parent.property === node && !parent.computed;
146
+ const isObjectKey = parent?.type === 'Property' && parent.key === node;
147
+ const isSafeMethodObject = parent?.type === 'MemberExpression' &&
148
+ parent.object === node &&
149
+ !parent.computed &&
150
+ parent.property.type === 'Identifier' &&
151
+ (0, ast_interpreter_1.getSafeJSONMethod)(node.name, parent.property.name) !== undefined;
152
+ if (!isPropertyName && !isObjectKey && !isSafeMethodObject) {
153
+ issues.push((0, types_1.lintIssue)({
154
+ code: 'SDK_FORBIDDEN_CONSTRUCT',
155
+ message: `Global '${node.name}' is unavailable in SDK builder code. Move runtime logic to a Code node or expr().`,
156
+ ...locationOf(node),
157
+ lintTarget: 'sdk',
158
+ }));
159
+ }
160
+ }
161
+ if (node.type !== 'CallExpression')
162
+ return;
163
+ const call = node;
164
+ if (call.callee.type === 'Identifier' && call.callee.name === 'sticky') {
165
+ issues.push((0, types_1.lintIssue)({
166
+ code: 'SDK_UNSOLICITED_STICKY',
167
+ message: 'Do not add sticky() / stickyNote nodes unless the user explicitly asked for canvas notes. ' +
168
+ 'Put explanations in the chat reply instead.',
169
+ ...locationOf(call),
170
+ lintTarget: 'sdk',
171
+ }));
172
+ }
173
+ if (call.callee.type === 'MemberExpression' &&
174
+ !call.callee.computed &&
175
+ call.callee.property.type === 'Identifier') {
176
+ const method = call.callee.property.name;
177
+ if (method === 'onTrue' || method === 'onFalse') {
178
+ const receiver = directReceiverName(call.callee);
179
+ if (receiver) {
180
+ const key = `${receiver}.${method}`;
181
+ const prev = branchCounts.get(key);
182
+ if (prev) {
183
+ prev.count += 1;
184
+ }
185
+ else {
186
+ branchCounts.set(key, { count: 1, ...locationOf(call) });
187
+ }
188
+ }
189
+ }
190
+ if (!SDK_FLUENT_METHODS.has(method) && NATIVE_ARRAY_METHODS.has(method)) {
191
+ issues.push((0, types_1.lintIssue)({
192
+ code: 'SDK_FORBIDDEN_CONSTRUCT',
193
+ message: `'.${method}()' is not available on SDK builder objects. Build strings with template ` +
194
+ 'literals, or do transforms in a Code node / expr().',
195
+ ...locationOf(call),
196
+ lintTarget: 'sdk',
197
+ }));
198
+ }
199
+ }
200
+ if (isExprCall(call)) {
201
+ for (const arg of call.arguments) {
202
+ if (arg.type === 'SpreadElement')
203
+ continue;
204
+ if (arg.type === 'CallExpression' && isPlaceholderCall(arg)) {
205
+ issues.push((0, types_1.lintIssue)({
206
+ code: 'SDK_PLACEHOLDER_WRAPPED',
207
+ message: "Do not wrap placeholder() in expr(). Use placeholder('hint') directly as the parameter value.",
208
+ ...locationOf(call),
209
+ lintTarget: 'sdk',
210
+ }));
211
+ }
212
+ if (arg.type === 'TemplateLiteral') {
213
+ for (const expr of arg.expressions) {
214
+ if (expr.type === 'CallExpression' && isPlaceholderCall(expr)) {
215
+ issues.push((0, types_1.lintIssue)({
216
+ code: 'SDK_PLACEHOLDER_WRAPPED',
217
+ message: 'Do not embed placeholder() inside expr()/template strings. Use placeholder() as the direct parameter value.',
218
+ ...locationOf(call),
219
+ lintTarget: 'sdk',
220
+ }));
221
+ }
222
+ }
223
+ }
224
+ if (arg.type === 'ArrayExpression') {
225
+ for (const el of arg.elements) {
226
+ if (el && el.type === 'CallExpression' && isPlaceholderCall(el)) {
227
+ issues.push((0, types_1.lintIssue)({
228
+ code: 'SDK_PLACEHOLDER_WRAPPED',
229
+ message: 'Do not wrap placeholder() in an array unless the node definition expects an array and placeholder is a direct element value with no expr() wrapper.',
230
+ ...locationOf(call),
231
+ lintTarget: 'sdk',
232
+ }));
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }, { skipChildren: extract_snippets_1.isEmbeddedCodePropertyValue });
239
+ for (const [key, info] of branchCounts) {
240
+ if (info.count < 2)
241
+ continue;
242
+ const [, method] = key.split('.');
243
+ issues.push((0, types_1.lintIssue)({
244
+ code: 'SDK_REPEATED_BRANCH_WIRING',
245
+ message: `Repeated \`.${method}()\` (${info.count} times) — each call overwrites the previous target. ` +
246
+ 'Wire once on the workflow builder chain.',
247
+ line: info.line,
248
+ column: info.column,
249
+ lintTarget: 'sdk',
250
+ }));
251
+ }
252
+ return (0, ast_walk_1.dedupeSourceLintIssues)(issues);
253
+ }
254
+ function lintWorkflowSdkSource(source) {
255
+ const { code, asConstMatches } = prepareSourceForLint(source);
256
+ let ast;
257
+ try {
258
+ ast = (0, ast_interpreter_1.parseSDKCode)(code);
259
+ }
260
+ catch {
261
+ return (0, ast_walk_1.dedupeSourceLintIssues)(asConstMatches.map((match) => (0, types_1.lintIssue)({
262
+ code: 'SDK_AS_CONST',
263
+ message: '`as const` is TypeScript-only and the workflow parser cannot interpret it. Remove the assertion.',
264
+ line: match.line,
265
+ column: match.column + 1,
266
+ lintTarget: 'sdk',
267
+ })));
268
+ }
269
+ return lintWorkflowSdkAst(ast, asConstMatches);
270
+ }
271
+ //# sourceMappingURL=workflow-sdk-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-sdk-lint.js","sourceRoot":"","sources":["../../../src/lint/sdk/workflow-sdk-lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { IssueSeverity } from '../validation/issue-severity';
2
+ export type LintTarget = 'sdk' | 'jsCode' | 'pythonCode';
3
+ export interface SourceLintIssue {
4
+ code: string;
5
+ message: string;
6
+ severity: Extract<IssueSeverity, 'informational'>;
7
+ line?: number;
8
+ column?: number;
9
+ lintTarget: LintTarget;
10
+ nodeName?: string;
11
+ parameterPath?: 'jsCode' | 'pythonCode';
12
+ }
13
+ export declare function lintIssue(issue: Omit<SourceLintIssue, 'severity'> & {
14
+ severity?: 'informational';
15
+ }): SourceLintIssue;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lintIssue = lintIssue;
4
+ function lintIssue(issue) {
5
+ return { severity: 'informational', ...issue };
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lint/types.ts"],"names":[],"mappings":";;;AAuBA,mBACC,KAAyE;IAEzE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,CAAC;AAChD,CAAC"}
@@ -1,6 +1,9 @@
1
- import type { NodeSchemaContext, OutputParserContext, OutputSchemaLookup } from './types';
1
+ import type { DataTableColumnInfo, NodeSchemaContext, OutputParserContext, OutputSchemaLookup } from './types';
2
2
  import type { NodeJSON, WorkflowJSON } from '../types/base';
3
- export declare function buildSchemaContexts(nodes: NodeJSON[], outputSchemaLookup?: OutputSchemaLookup, outputParserTargets?: Map<string, OutputParserContext>): NodeSchemaContext[];
3
+ export declare const INFORMATION_EXTRACTOR_NODE_TYPE = "@n8n/n8n-nodes-langchain.informationExtractor";
4
+ export declare function buildSchemaContexts(nodes: NodeJSON[], outputSchemaLookup?: OutputSchemaLookup, outputParserTargets?: Map<string, OutputParserContext>, dataTableColumns?: Record<string, DataTableColumnInfo[]>): NodeSchemaContext[];
5
+ export declare function resolveEnvelopeKey(nodeType: string, schema: Record<string, unknown> | undefined): string | undefined;
6
+ export declare function schemaDeclarationText(candidate: unknown): string | undefined;
4
7
  export declare function findOutputParserTargets(workflow: WorkflowJSON): Map<string, OutputParserContext>;
5
8
  export declare function collectDownstreamConsumers(workflow: WorkflowJSON, nodeName: string): Array<{
6
9
  name: string;
@@ -1,32 +1,134 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INFORMATION_EXTRACTOR_NODE_TYPE = void 0;
3
4
  exports.buildSchemaContexts = buildSchemaContexts;
5
+ exports.resolveEnvelopeKey = resolveEnvelopeKey;
6
+ exports.schemaDeclarationText = schemaDeclarationText;
4
7
  exports.findOutputParserTargets = findOutputParserTargets;
5
8
  exports.collectDownstreamConsumers = collectDownstreamConsumers;
6
- function buildSchemaContexts(nodes, outputSchemaLookup, outputParserTargets) {
9
+ const n8n_workflow_1 = require("n8n-workflow");
10
+ const ai_root_shapes_1 = require("./ai-root-shapes");
11
+ exports.INFORMATION_EXTRACTOR_NODE_TYPE = '@n8n/n8n-nodes-langchain.informationExtractor';
12
+ function buildSchemaContexts(nodes, outputSchemaLookup, outputParserTargets, dataTableColumns) {
7
13
  return nodes.map((node) => {
8
14
  const params = node.parameters;
9
15
  const resource = typeof params?.resource === 'string' ? params.resource : undefined;
10
16
  const operation = typeof params?.operation === 'string' ? params.operation : undefined;
11
- const outputParser = node.name ? outputParserTargets?.get(node.name) : undefined;
17
+ const outputParser = (node.name ? outputParserTargets?.get(node.name) : undefined) ??
18
+ (node.type === exports.INFORMATION_EXTRACTOR_NODE_TYPE
19
+ ? extractInformationExtractorSchema(params)
20
+ : undefined);
12
21
  const schema = outputSchemaLookup?.({
13
22
  type: node.type,
14
23
  typeVersion: node.typeVersion,
15
24
  resource,
16
25
  operation,
17
- hasOutputParser: outputParser !== undefined,
26
+ hasOutputParser: node.name ? outputParserTargets?.has(node.name) === true : false,
18
27
  });
28
+ const nodeName = node.name ?? node.type;
29
+ const columns = dataTableColumns?.[nodeName];
19
30
  return {
20
- nodeName: node.name ?? node.type,
31
+ nodeName,
21
32
  nodeType: node.type,
22
33
  typeVersion: node.typeVersion,
23
34
  resource,
24
35
  operation,
25
36
  schema,
26
37
  outputParser,
38
+ dataTableColumns: columns,
39
+ declaredFields: buildDeclaredFieldContract(node.type, schema, outputParser, columns),
27
40
  };
28
41
  });
29
42
  }
43
+ function resolveEnvelopeKey(nodeType, schema) {
44
+ return ((0, ai_root_shapes_1.findEnvelopeKey)(schema) ?? (nodeType === exports.INFORMATION_EXTRACTOR_NODE_TYPE ? 'output' : undefined));
45
+ }
46
+ function buildDeclaredFieldContract(nodeType, schema, outputParser, columns) {
47
+ if (columns && columns.length > 0) {
48
+ return {
49
+ keys: [...n8n_workflow_1.DATA_TABLE_SYSTEM_COLUMNS, ...columns.map((c) => c.name)],
50
+ exact: true,
51
+ source: 'data-table-columns',
52
+ };
53
+ }
54
+ if (outputParser?.schemaText) {
55
+ const keys = deriveTopLevelKeys(outputParser.schemaText, outputParser.schemaIsExample);
56
+ if (keys.length > 0) {
57
+ const envelopeKey = resolveEnvelopeKey(nodeType, schema);
58
+ return { keys, envelopeKey, exact: false, source: 'declared-schema' };
59
+ }
60
+ }
61
+ return undefined;
62
+ }
63
+ function deriveTopLevelKeys(schemaText, isExample) {
64
+ let parsed;
65
+ try {
66
+ parsed = JSON.parse(schemaText);
67
+ }
68
+ catch {
69
+ return [];
70
+ }
71
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
72
+ return [];
73
+ const record = parsed;
74
+ if (isExample)
75
+ return Object.keys(record);
76
+ const properties = record.properties;
77
+ if (typeof properties !== 'object' || properties === null)
78
+ return [];
79
+ return Object.keys(properties);
80
+ }
81
+ function extractInformationExtractorSchema(params) {
82
+ if (!params)
83
+ return undefined;
84
+ const schemaType = typeof params.schemaType === 'string' ? params.schemaType : 'fromAttributes';
85
+ if (schemaType === 'fromAttributes') {
86
+ const attributesWrapper = params.attributes;
87
+ const attributes = Array.isArray(attributesWrapper?.attributes)
88
+ ? attributesWrapper.attributes
89
+ : [];
90
+ const properties = {};
91
+ const required = [];
92
+ for (const attribute of attributes) {
93
+ if (typeof attribute !== 'object' || attribute === null)
94
+ continue;
95
+ const { name, type, description } = attribute;
96
+ if (typeof name !== 'string' || name.length === 0)
97
+ continue;
98
+ properties[name] = {
99
+ type: typeof type === 'string' ? type : 'string',
100
+ ...(typeof description === 'string' && description ? { description } : {}),
101
+ };
102
+ if (attribute.required === true)
103
+ required.push(name);
104
+ }
105
+ if (Object.keys(properties).length === 0)
106
+ return undefined;
107
+ return {
108
+ schemaText: JSON.stringify({ type: 'object', properties, required }, null, 2),
109
+ schemaIsExample: false,
110
+ };
111
+ }
112
+ const candidate = schemaType === 'manual' ? params.inputSchema : params.jsonSchemaExample;
113
+ const schemaText = schemaDeclarationText(candidate);
114
+ if (schemaText) {
115
+ return { schemaText, schemaIsExample: schemaType !== 'manual' };
116
+ }
117
+ return undefined;
118
+ }
119
+ function schemaDeclarationText(candidate) {
120
+ if (typeof candidate === 'string' && candidate.trim().length > 0)
121
+ return candidate.trim();
122
+ if (typeof candidate === 'object' && candidate !== null) {
123
+ try {
124
+ return JSON.stringify(candidate);
125
+ }
126
+ catch {
127
+ return undefined;
128
+ }
129
+ }
130
+ return undefined;
131
+ }
30
132
  function findOutputParserTargets(workflow) {
31
133
  const result = new Map();
32
134
  const nodesByName = new Map();
@@ -65,8 +167,9 @@ function extractParserContext(parserNode) {
65
167
  [example, true],
66
168
  [legacySchema, false],
67
169
  ]) {
68
- if (typeof candidate === 'string' && candidate.trim().length > 0) {
69
- return { schemaText: candidate.trim(), schemaIsExample: isExample };
170
+ const schemaText = schemaDeclarationText(candidate);
171
+ if (schemaText) {
172
+ return { schemaText, schemaIsExample: isExample };
70
173
  }
71
174
  }
72
175
  return { schemaIsExample: false };
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/mock-data/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/mock-data/context.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- export type { PinData, OutputSchemaLookup, OutputParserContext, NodeSchemaContext, PinDataGenerationInstructions, } from './types';
1
+ export type { PinData, OutputSchemaLookup, OutputParserContext, NodeSchemaContext, PinDataGenerationInstructions, DataTableColumnInfo, DeclaredFieldContract, } from './types';
2
2
  export { AGENT_NODE_TYPE, isAiRootNodeType, describeAiRootShape, findEnvelopeKey, } from './ai-root-shapes';
3
3
  export { buildSchemaContexts, findOutputParserTargets, collectDownstreamConsumers, } from './context';
4
4
  export { workflowToMermaid } from './mermaid';
5
5
  export { buildDateAnchors } from './date-anchors';
6
6
  export { PIN_DATA_SYSTEM_PROMPT, buildPinDataUserPrompt, buildNodeSchemaSection, type BuildPinDataUserPromptOptions, } from './prompt';
7
7
  export { parsePinDataResponse, repairStructuredOutput } from './parse';
8
+ export { collectPinFieldViolations, buildFieldViolationRetryMessage, type PinFieldViolation, } from './validate';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.repairStructuredOutput = exports.parsePinDataResponse = exports.buildNodeSchemaSection = exports.buildPinDataUserPrompt = exports.PIN_DATA_SYSTEM_PROMPT = exports.buildDateAnchors = exports.workflowToMermaid = exports.collectDownstreamConsumers = exports.findOutputParserTargets = exports.buildSchemaContexts = exports.findEnvelopeKey = exports.describeAiRootShape = exports.isAiRootNodeType = exports.AGENT_NODE_TYPE = void 0;
3
+ exports.buildFieldViolationRetryMessage = exports.collectPinFieldViolations = exports.repairStructuredOutput = exports.parsePinDataResponse = exports.buildNodeSchemaSection = exports.buildPinDataUserPrompt = exports.PIN_DATA_SYSTEM_PROMPT = exports.buildDateAnchors = exports.workflowToMermaid = exports.collectDownstreamConsumers = exports.findOutputParserTargets = exports.buildSchemaContexts = exports.findEnvelopeKey = exports.describeAiRootShape = exports.isAiRootNodeType = exports.AGENT_NODE_TYPE = void 0;
4
4
  var ai_root_shapes_1 = require("./ai-root-shapes");
5
5
  Object.defineProperty(exports, "AGENT_NODE_TYPE", { enumerable: true, get: function () { return ai_root_shapes_1.AGENT_NODE_TYPE; } });
6
6
  Object.defineProperty(exports, "isAiRootNodeType", { enumerable: true, get: function () { return ai_root_shapes_1.isAiRootNodeType; } });
@@ -21,4 +21,7 @@ Object.defineProperty(exports, "buildNodeSchemaSection", { enumerable: true, get
21
21
  var parse_1 = require("./parse");
22
22
  Object.defineProperty(exports, "parsePinDataResponse", { enumerable: true, get: function () { return parse_1.parsePinDataResponse; } });
23
23
  Object.defineProperty(exports, "repairStructuredOutput", { enumerable: true, get: function () { return parse_1.repairStructuredOutput; } });
24
+ var validate_1 = require("./validate");
25
+ Object.defineProperty(exports, "collectPinFieldViolations", { enumerable: true, get: function () { return validate_1.collectPinFieldViolations; } });
26
+ Object.defineProperty(exports, "buildFieldViolationRetryMessage", { enumerable: true, get: function () { return validate_1.buildFieldViolationRetryMessage; } });
24
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mock-data/index.ts"],"names":[],"mappings":";;;AAOA,mDAK0B;AAJzB,iHAAA,eAAe,OAAA;AACf,kHAAA,gBAAgB,OAAA;AAChB,qHAAA,mBAAmB,OAAA;AACnB,iHAAA,eAAe,OAAA;AAEhB,qCAImB;AAHlB,8GAAA,mBAAmB,OAAA;AACnB,kHAAA,uBAAuB,OAAA;AACvB,qHAAA,0BAA0B,OAAA;AAE3B,qCAA8C;AAArC,4GAAA,iBAAiB,OAAA;AAC1B,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AACzB,mCAKkB;AAJjB,gHAAA,sBAAsB,OAAA;AACtB,gHAAA,sBAAsB,OAAA;AACtB,gHAAA,sBAAsB,OAAA;AAGvB,iCAAuE;AAA9D,6GAAA,oBAAoB,OAAA;AAAE,+GAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mock-data/index.ts"],"names":[],"mappings":";;;AASA,mDAK0B;AAJzB,iHAAA,eAAe,OAAA;AACf,kHAAA,gBAAgB,OAAA;AAChB,qHAAA,mBAAmB,OAAA;AACnB,iHAAA,eAAe,OAAA;AAEhB,qCAImB;AAHlB,8GAAA,mBAAmB,OAAA;AACnB,kHAAA,uBAAuB,OAAA;AACvB,qHAAA,0BAA0B,OAAA;AAE3B,qCAA8C;AAArC,4GAAA,iBAAiB,OAAA;AAC1B,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AACzB,mCAKkB;AAJjB,gHAAA,sBAAsB,OAAA;AACtB,gHAAA,sBAAsB,OAAA;AACtB,gHAAA,sBAAsB,OAAA;AAGvB,iCAAuE;AAA9D,6GAAA,oBAAoB,OAAA;AAAE,+GAAA,sBAAsB,OAAA;AACrD,uCAIoB;AAHnB,qHAAA,yBAAyB,OAAA;AACzB,2HAAA,+BAA+B,OAAA"}
@@ -21,15 +21,25 @@ function parsePinDataResponse(responseText, expectedNodes) {
21
21
  const nodeData = parsed[nodeName];
22
22
  if (!Array.isArray(nodeData))
23
23
  continue;
24
- pinData[nodeName] = nodeData.map((item) => {
24
+ pinData[nodeName] = nodeData
25
+ .map((item) => {
25
26
  if (typeof item === 'object' && item !== null && 'json' in item) {
26
27
  return item;
27
28
  }
28
29
  return { json: item ?? {} };
29
- });
30
+ })
31
+ .filter((item) => !isEmptyFixtureItem(item));
30
32
  }
31
33
  return pinData;
32
34
  }
35
+ function isEmptyFixtureItem(item) {
36
+ const json = item.json;
37
+ if (typeof json !== 'object' || json === null)
38
+ return false;
39
+ if (Object.keys(json).length > 0)
40
+ return false;
41
+ return !Object.keys(item).some((key) => key !== 'json' && key !== 'pairedItem');
42
+ }
33
43
  function tryParseJsonContainer(text) {
34
44
  const trimmed = text.trim();
35
45
  if (!trimmed.startsWith('{') && !trimmed.startsWith('['))
@@ -47,11 +57,20 @@ function tryParseJsonContainer(text) {
47
57
  function repairStructuredOutput(pinData, workflow, schemaContexts) {
48
58
  const schemaByName = new Map((schemaContexts ?? []).map((ctx) => [ctx.nodeName, ctx.schema]));
49
59
  const repaired = { ...pinData };
50
- for (const nodeName of (0, context_1.findOutputParserTargets)(workflow).keys()) {
60
+ const targets = new Set((0, context_1.findOutputParserTargets)(workflow).keys());
61
+ const extractorNames = new Set();
62
+ for (const node of workflow.nodes) {
63
+ if (node.name && node.type === context_1.INFORMATION_EXTRACTOR_NODE_TYPE) {
64
+ targets.add(node.name);
65
+ extractorNames.add(node.name);
66
+ }
67
+ }
68
+ for (const nodeName of targets) {
51
69
  const items = repaired[nodeName];
52
70
  if (!items)
53
71
  continue;
54
- const envelopeKey = (0, ai_root_shapes_1.findEnvelopeKey)(schemaByName.get(nodeName));
72
+ const envelopeKey = (0, ai_root_shapes_1.findEnvelopeKey)(schemaByName.get(nodeName)) ??
73
+ (extractorNames.has(nodeName) ? 'output' : undefined);
55
74
  if (!envelopeKey)
56
75
  continue;
57
76
  repaired[nodeName] = items.map((item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/mock-data/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/mock-data/parse.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { NodeSchemaContext, PinDataGenerationInstructions } from './types';
2
2
  import type { WorkflowJSON } from '../types/base';
3
- export declare const PIN_DATA_SYSTEM_PROMPT = "You are a test data generator for n8n workflow automation. Generate realistic mock API response data for service nodes in a workflow.\n\nRULES:\n1. Data must be consistent across nodes. If node A creates an entity with id \"abc-123\", downstream nodes referencing that entity must use \"abc-123\". When a node's \"Direct downstream consumers\" are listed, emit EXACTLY the field names their parameters/expressions/code read (e.g. a Code node reading item.json.last_details requires a field named \"last_details\") \u2014 never rename or synonymize them.\n2. Generate 1-2 items per node.\n3. When a JSON Schema is provided, follow its structure exactly.\n4. When no schema is provided, generate a realistic response based on the node type, resource, and operation.\n5. Use realistic but clearly fake values (e.g., \"jane@example.com\", \"proj_abc123\").\n6. Dates and timestamps MUST be derived from the \"## Date anchors\" block at the end of the prompt \u2014 never from training data. Workflows compare pinned data against the real execution clock ($now, Date.now()); values months in the past get silently filtered out, and HTTP mocks generated later use the same anchors, so stale years make \"stored matches current\" comparisons impossible. When the data description mentions a relative window (\"last 24 hours\", \"past 2 weeks\"), place timestamps safely INSIDE it, never on the boundary.\n7. AI root nodes (Agent/Chain) have NODE-TYPE-SPECIFIC output shapes \u2014 follow each node's schema or \"AI ROOT OUTPUT SHAPE\" instruction exactly and never invent a different envelope key. Summary: agent wraps in { \"output\": ... } (a parsed object matching the parser schema when one is attached, otherwise a plain text string \u2014 never a JSON-encoded string); chainLlm uses { \"text\": \"<string>\" } without a parser, or { \"output\": <parsed object> } like agent when a parser is attached; chainRetrievalQa uses { \"response\": \"<string>\" }; chainSummarization uses { \"output\": { \"output_text\": \"<summary>\" } }; informationExtractor wraps the extracted fields in { \"output\": <object> }; textClassifier passes the input item through unchanged; sentimentAnalysis is the input item plus a \"sentimentAnalysis\" object.\n8. CRITICAL: If a \"Test Scenario\" section is provided, it is the authoritative test state and OVERRIDES everything else, including the general data context and your own sense of realism. When it describes stored/previous records (e.g. \"the store already holds a record with status X\"), exact values, counts, literal substrings, or that stored data matches current data, reproduce those constraints EXACTLY \u2014 never substitute more \"interesting\" or more typical data. A boring no-change/empty/matching case is usually the point of the test.\n9. Return ONLY a valid JSON object, no explanation or markdown fencing.\n10. CRITICAL: You MUST generate data for EVERY node listed in \"Nodes Requiring Mock Data\". Never skip a node, even if the test scenario describes an empty or error response. An empty response is still valid data.";
3
+ export declare const PIN_DATA_SYSTEM_PROMPT = "You are a test data generator for n8n workflow automation. Generate realistic mock API response data for service nodes in a workflow.\n\nRULES:\n1. Data must be consistent across nodes. If node A creates an entity with id \"abc-123\", downstream nodes referencing that entity must use \"abc-123\". When a node's \"Direct downstream consumers\" are listed, emit EXACTLY the field names their parameters/expressions/code read (e.g. a Code node reading item.json.last_details requires a field named \"last_details\") \u2014 never rename or synonymize them.\n2. Generate 1-2 items per node \u2014 UNLESS the Test Scenario calls for zero items for a node (no stored data, empty list, nothing new, all already seen): then that node's value MUST be an empty array []. NEVER represent \"no data\" as a single item with no fields ({}): a phantom empty item flows downstream and corrupts the run; the empty array IS the correct representation.\n3. When a JSON Schema is provided, follow its structure exactly.\n4. When no schema is provided, generate a realistic response based on the node type, resource, and operation.\n5. Use realistic but clearly fake values (e.g., \"jane@example.com\", \"proj_abc123\").\n6. Dates and timestamps MUST be derived from the \"## Date anchors\" block at the end of the prompt \u2014 never from training data. Workflows compare pinned data against the real execution clock ($now, Date.now()); values months in the past get silently filtered out, and HTTP mocks generated later use the same anchors, so stale years make \"stored matches current\" comparisons impossible. When the data description mentions a relative window (\"last 24 hours\", \"past 2 weeks\"), place timestamps safely INSIDE it, never on the boundary.\n7. AI root nodes (Agent/Chain) have NODE-TYPE-SPECIFIC output shapes \u2014 follow each node's schema or \"AI ROOT OUTPUT SHAPE\" instruction exactly and never invent a different envelope key. Summary: agent wraps in { \"output\": ... } (a parsed object matching the parser schema when one is attached, otherwise a plain text string \u2014 never a JSON-encoded string); chainLlm uses { \"text\": \"<string>\" } without a parser, or { \"output\": <parsed object> } like agent when a parser is attached; chainRetrievalQa uses { \"response\": \"<string>\" }; chainSummarization uses { \"output\": { \"output_text\": \"<summary>\" } }; informationExtractor wraps the extracted fields in { \"output\": <object> }; textClassifier passes the input item through unchanged; sentimentAnalysis is the input item plus a \"sentimentAnalysis\" object.\n8. CRITICAL: If a \"Test Scenario\" section is provided, it is the authoritative test state and OVERRIDES everything else, including the general data context and your own sense of realism. When it describes stored/previous records (e.g. \"the store already holds a record with status X\"), exact values, counts, literal substrings, or that stored data matches current data, reproduce those constraints EXACTLY \u2014 never substitute more \"interesting\" or more typical data. A boring no-change/empty/matching case is usually the point of the test.\n9. Return ONLY a valid JSON object, no explanation or markdown fencing.\n10. CRITICAL: You MUST generate data for EVERY node listed in \"Nodes Requiring Mock Data\". Never skip a node, even if the test scenario describes an empty or error response. An empty response is still valid data \u2014 represent it as an empty array [], never as [{}].";
4
4
  export declare function buildNodeSchemaSection(ctx: NodeSchemaContext): string[];
5
5
  export interface BuildPinDataUserPromptOptions {
6
6
  instructions?: PinDataGenerationInstructions;