@openapi-flow/n8n 0.0.0-stage → 0.2.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 (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -2
  3. package/THIRD_PARTY_NOTICES.md +9 -0
  4. package/dist/legacy/workflow/common/plan-validation.d.ts +1 -0
  5. package/dist/legacy/workflow/common/plan-validation.js +11 -0
  6. package/dist/legacy/workflow/common/workflow-id.d.ts +1 -0
  7. package/dist/legacy/workflow/common/workflow-id.js +8 -0
  8. package/dist/legacy/workflow/inbound/build-inbound-workflow.d.ts +2 -0
  9. package/dist/legacy/workflow/inbound/build-inbound-workflow.js +60 -0
  10. package/dist/legacy/workflow/inbound/compile-inbound-workflow.d.ts +2 -0
  11. package/dist/legacy/workflow/inbound/compile-inbound-workflow.js +25 -0
  12. package/dist/legacy/workflow/inbound/inbound-response.d.ts +2 -0
  13. package/dist/legacy/workflow/inbound/inbound-response.js +51 -0
  14. package/dist/legacy/workflow/request/base-url.d.ts +1 -0
  15. package/dist/legacy/workflow/request/base-url.js +14 -0
  16. package/dist/legacy/workflow/request/build-request-workflow.d.ts +3 -0
  17. package/dist/legacy/workflow/request/build-request-workflow.js +47 -0
  18. package/dist/legacy/workflow/request/build-sequence-workflow.d.ts +3 -0
  19. package/dist/legacy/workflow/request/build-sequence-workflow.js +53 -0
  20. package/dist/legacy/workflow/request/compile-catalog-sequence.d.ts +2 -0
  21. package/dist/legacy/workflow/request/compile-catalog-sequence.js +122 -0
  22. package/dist/legacy/workflow/request/compile-sequence.d.ts +2 -0
  23. package/dist/legacy/workflow/request/compile-sequence.js +41 -0
  24. package/dist/legacy/workflow/request/compile-workflow.d.ts +4 -0
  25. package/dist/legacy/workflow/request/compile-workflow.js +93 -0
  26. package/dist/legacy/workflow/request/credential-binding.d.ts +5 -0
  27. package/dist/legacy/workflow/request/credential-binding.js +31 -0
  28. package/dist/legacy/workflow/request/effect-policy.d.ts +4 -0
  29. package/dist/legacy/workflow/request/effect-policy.js +16 -0
  30. package/dist/legacy/workflow/request/http-request-node.d.ts +2 -0
  31. package/dist/legacy/workflow/request/http-request-node.js +69 -0
  32. package/dist/legacy/workflow/request/prepare-sequence.d.ts +4 -0
  33. package/dist/legacy/workflow/request/prepare-sequence.js +103 -0
  34. package/dist/legacy/workflow/request/request-body.d.ts +4 -0
  35. package/dist/legacy/workflow/request/request-body.js +64 -0
  36. package/dist/legacy/workflow/request/request-headers.d.ts +4 -0
  37. package/dist/legacy/workflow/request/request-headers.js +30 -0
  38. package/dist/legacy/workflow/request/request-url.d.ts +4 -0
  39. package/dist/legacy/workflow/request/request-url.js +34 -0
  40. package/dist/legacy/workflow/request/response-assertion-code.d.ts +3 -0
  41. package/dist/legacy/workflow/request/response-assertion-code.js +28 -0
  42. package/dist/legacy/workflow/request/sequence-url.d.ts +4 -0
  43. package/dist/legacy/workflow/request/sequence-url.js +104 -0
  44. package/dist/legacy-api.d.ts +25 -0
  45. package/dist/legacy-api.js +20 -0
  46. package/dist/nodes/common/validation/compile-standalone-validator.d.ts +3 -0
  47. package/dist/nodes/common/validation/compile-standalone-validator.js +44 -0
  48. package/dist/nodes/gap/create-gap-node.d.ts +3 -0
  49. package/dist/nodes/gap/create-gap-node.js +35 -0
  50. package/dist/nodes/native/arrays/create-array-node-fragment.d.ts +4 -0
  51. package/dist/nodes/native/arrays/create-array-node-fragment.js +42 -0
  52. package/dist/nodes/native/arrays/create-array-reader-code.d.ts +3 -0
  53. package/dist/nodes/native/arrays/create-array-reader-code.js +12 -0
  54. package/dist/nodes/native/arrays/create-native-array-capability.d.ts +3 -0
  55. package/dist/nodes/native/arrays/create-native-array-capability.js +64 -0
  56. package/dist/nodes/native/common/create-native-fragment.d.ts +2 -0
  57. package/dist/nodes/native/common/create-native-fragment.js +10 -0
  58. package/dist/nodes/native/common/response-references.d.ts +3 -0
  59. package/dist/nodes/native/common/response-references.js +5 -0
  60. package/dist/nodes/native/create-exclusive-branch-merge-capability.d.ts +3 -0
  61. package/dist/nodes/native/create-exclusive-branch-merge-capability.js +33 -0
  62. package/dist/nodes/native/create-json-output-capability.d.ts +3 -0
  63. package/dist/nodes/native/create-json-output-capability.js +38 -0
  64. package/dist/nodes/native/create-native-capabilities.d.ts +2 -0
  65. package/dist/nodes/native/create-native-capabilities.js +14 -0
  66. package/dist/nodes/native/create-pass-through-capability.d.ts +3 -0
  67. package/dist/nodes/native/create-pass-through-capability.js +30 -0
  68. package/dist/nodes/native/create-response-array-capability.d.ts +3 -0
  69. package/dist/nodes/native/create-response-array-capability.js +73 -0
  70. package/dist/nodes/native/create-response-collection-capability.d.ts +3 -0
  71. package/dist/nodes/native/create-response-collection-capability.js +132 -0
  72. package/dist/nodes/native/if-capability.d.ts +2 -0
  73. package/dist/nodes/native/if-capability.js +76 -0
  74. package/dist/nodes/native/item-join/create-item-join-capability.d.ts +3 -0
  75. package/dist/nodes/native/item-join/create-item-join-capability.js +153 -0
  76. package/dist/nodes/native/item-join/create-item-join-reader-code.d.ts +2 -0
  77. package/dist/nodes/native/item-join/create-item-join-reader-code.js +18 -0
  78. package/dist/nodes/native/item-join/runtime/item-join-runtime.bundle.js +24 -0
  79. package/dist/nodes/native/item-join/runtime/join-api-items.d.ts +3 -0
  80. package/dist/nodes/native/item-join/runtime/join-api-items.js +37 -0
  81. package/dist/nodes/native/merge-append-capability.d.ts +2 -0
  82. package/dist/nodes/native/merge-append-capability.js +31 -0
  83. package/dist/nodes/native/response-assertion-capability.d.ts +2 -0
  84. package/dist/nodes/native/response-assertion-capability.js +53 -0
  85. package/dist/nodes/native/response-check-code.d.ts +3 -0
  86. package/dist/nodes/native/response-check-code.js +59 -0
  87. package/dist/nodes/native/response-checks/create-response-check-guard.d.ts +4 -0
  88. package/dist/nodes/native/response-checks/create-response-check-guard.js +22 -0
  89. package/dist/nodes/native/response-checks/create-response-check-reader.d.ts +3 -0
  90. package/dist/nodes/native/response-checks/create-response-check-reader.js +23 -0
  91. package/dist/nodes/native/stop-and-error-capability.d.ts +2 -0
  92. package/dist/nodes/native/stop-and-error-capability.js +29 -0
  93. package/dist/nodes/request/authentication/credential-field-name.d.ts +1 -0
  94. package/dist/nodes/request/authentication/credential-field-name.js +3 -0
  95. package/dist/nodes/request/authentication/resolve-http-request-authentication.d.ts +2 -0
  96. package/dist/nodes/request/authentication/resolve-http-request-authentication.js +42 -0
  97. package/dist/nodes/request/bindings/compile-native-output-validators.d.ts +3 -0
  98. package/dist/nodes/request/bindings/compile-native-output-validators.js +12 -0
  99. package/dist/nodes/request/bindings/compile-request-validator.d.ts +3 -0
  100. package/dist/nodes/request/bindings/compile-request-validator.js +13 -0
  101. package/dist/nodes/request/bindings/compile-source-response-validators.d.ts +2 -0
  102. package/dist/nodes/request/bindings/compile-source-response-validators.js +12 -0
  103. package/dist/nodes/request/bindings/create-bound-request-fragment.d.ts +3 -0
  104. package/dist/nodes/request/bindings/create-bound-request-fragment.js +77 -0
  105. package/dist/nodes/request/bindings/create-output-reader-code.d.ts +3 -0
  106. package/dist/nodes/request/bindings/create-output-reader-code.js +26 -0
  107. package/dist/nodes/request/bindings/resolve-output-binding-sources.d.ts +3 -0
  108. package/dist/nodes/request/bindings/resolve-output-binding-sources.js +36 -0
  109. package/dist/nodes/request/create-http-request-node.d.ts +2 -0
  110. package/dist/nodes/request/create-http-request-node.js +94 -0
  111. package/dist/nodes/request/deployment/create-request-deployment-notes.d.ts +2 -0
  112. package/dist/nodes/request/deployment/create-request-deployment-notes.js +3 -0
  113. package/dist/nodes/request/deployment/resolve-http-request-deployment.d.ts +2 -0
  114. package/dist/nodes/request/deployment/resolve-http-request-deployment.js +33 -0
  115. package/dist/nodes/request/response/create-http-response-decoder.d.ts +4 -0
  116. package/dist/nodes/request/response/create-http-response-decoder.js +56 -0
  117. package/dist/nodes/request/response/decode-http-response.d.ts +3 -0
  118. package/dist/nodes/request/response/decode-http-response.js +42 -0
  119. package/dist/nodes/request/response/http-response-media.d.ts +2 -0
  120. package/dist/nodes/request/response/http-response-media.js +32 -0
  121. package/dist/nodes/request/response/response-runtime.bundle.js +24 -0
  122. package/dist/nodes/request/runtime/materialize-http-request.d.ts +3 -0
  123. package/dist/nodes/request/runtime/materialize-http-request.js +17 -0
  124. package/dist/nodes/request/runtime/request-runtime.bundle.js +24 -0
  125. package/dist/nodes/request/serialization/create-serialized-http-request-node.d.ts +3 -0
  126. package/dist/nodes/request/serialization/create-serialized-http-request-node.js +17 -0
  127. package/dist/nodes/request/serialization/serialize-http-request.d.ts +5 -0
  128. package/dist/nodes/request/serialization/serialize-http-request.js +70 -0
  129. package/dist/public-api.d.ts +30 -0
  130. package/dist/public-api.js +17 -0
  131. package/dist/schemas/batch-execution-schema.d.ts +15 -0
  132. package/dist/schemas/batch-execution-schema.js +14 -0
  133. package/dist/schemas/create-native-comparison-planning-schema.d.ts +81 -0
  134. package/dist/schemas/create-native-comparison-planning-schema.js +36 -0
  135. package/dist/schemas/exclusive-branch-merge-schema.d.ts +4 -0
  136. package/dist/schemas/exclusive-branch-merge-schema.js +7 -0
  137. package/dist/schemas/item-join-schema.d.ts +13 -0
  138. package/dist/schemas/item-join-schema.js +26 -0
  139. package/dist/schemas/native-array-schema.d.ts +11 -0
  140. package/dist/schemas/native-array-schema.js +19 -0
  141. package/dist/schemas/native-capability-schemas.d.ts +100 -0
  142. package/dist/schemas/native-capability-schemas.js +62 -0
  143. package/dist/schemas/request-deployment-schema.d.ts +9 -0
  144. package/dist/schemas/request-deployment-schema.js +27 -0
  145. package/dist/schemas/response-array-schema.d.ts +11 -0
  146. package/dist/schemas/response-array-schema.js +19 -0
  147. package/dist/schemas/response-collection-schema.d.ts +11 -0
  148. package/dist/schemas/response-collection-schema.js +19 -0
  149. package/dist/types/array-iteration.d.ts +8 -0
  150. package/dist/types/array-iteration.js +1 -0
  151. package/dist/types/array-split.d.ts +13 -0
  152. package/dist/types/array-split.js +1 -0
  153. package/dist/types/authentication.d.ts +14 -0
  154. package/dist/types/authentication.js +1 -0
  155. package/dist/types/batch-execution.d.ts +23 -0
  156. package/dist/types/batch-execution.js +1 -0
  157. package/dist/types/http-response-decoding.d.ts +16 -0
  158. package/dist/types/http-response-decoding.js +1 -0
  159. package/dist/types/item-join.d.ts +40 -0
  160. package/dist/types/item-join.js +1 -0
  161. package/dist/types/legacy/catalog-workflow.d.ts +37 -0
  162. package/dist/types/legacy/catalog-workflow.js +1 -0
  163. package/dist/types/legacy/inbound-workflow.d.ts +27 -0
  164. package/dist/types/legacy/inbound-workflow.js +1 -0
  165. package/dist/types/legacy/request-node.d.ts +23 -0
  166. package/dist/types/legacy/request-node.js +1 -0
  167. package/dist/types/legacy/request-workflow.d.ts +43 -0
  168. package/dist/types/legacy/request-workflow.js +1 -0
  169. package/dist/types/legacy/sequence-workflow.d.ts +57 -0
  170. package/dist/types/legacy/sequence-workflow.js +1 -0
  171. package/dist/types/native-array.d.ts +8 -0
  172. package/dist/types/native-array.js +1 -0
  173. package/dist/types/native-capability.d.ts +37 -0
  174. package/dist/types/native-capability.js +1 -0
  175. package/dist/types/node-fragment.d.ts +51 -0
  176. package/dist/types/node-fragment.js +1 -0
  177. package/dist/types/output-binding-source.d.ts +22 -0
  178. package/dist/types/output-binding-source.js +1 -0
  179. package/dist/types/request-deployment.d.ts +17 -0
  180. package/dist/types/request-deployment.js +1 -0
  181. package/dist/types/request-materialization.d.ts +22 -0
  182. package/dist/types/request-materialization.js +1 -0
  183. package/dist/types/response-check-compilation.d.ts +11 -0
  184. package/dist/types/response-check-compilation.js +1 -0
  185. package/dist/types/response-check-guard.d.ts +6 -0
  186. package/dist/types/response-check-guard.js +1 -0
  187. package/dist/types/response-collection.d.ts +7 -0
  188. package/dist/types/response-collection.js +1 -0
  189. package/dist/types/reviewable-workflow.d.ts +27 -0
  190. package/dist/types/reviewable-workflow.js +1 -0
  191. package/dist/types/schema-compilation.d.ts +5 -0
  192. package/dist/types/schema-compilation.js +1 -0
  193. package/dist/types/serialized-http-request.d.ts +4 -0
  194. package/dist/types/serialized-http-request.js +1 -0
  195. package/dist/types/workflow-compilation.d.ts +36 -0
  196. package/dist/types/workflow-compilation.js +1 -0
  197. package/dist/utils/bundled-license-banner.d.ts +3 -0
  198. package/dist/utils/bundled-license-banner.js +32 -0
  199. package/dist/utils/javascript-json-literal.d.ts +2 -0
  200. package/dist/utils/javascript-json-literal.js +10 -0
  201. package/dist/utils/json-values-equal.cjs +24 -0
  202. package/dist/utils/json-values-equal.d.cts +1 -0
  203. package/dist/workflow/assemble-n8n-workflow.d.ts +2 -0
  204. package/dist/workflow/assemble-n8n-workflow.js +11 -0
  205. package/dist/workflow/batch/compile-batched-n8n-workflow.d.ts +3 -0
  206. package/dist/workflow/batch/compile-batched-n8n-workflow.js +18 -0
  207. package/dist/workflow/batch/create-batch-execution-scopes.d.ts +3 -0
  208. package/dist/workflow/batch/create-batch-execution-scopes.js +59 -0
  209. package/dist/workflow/batch/validate-batch-exclusive-rejoin.d.ts +3 -0
  210. package/dist/workflow/batch/validate-batch-exclusive-rejoin.js +49 -0
  211. package/dist/workflow/batch/validate-batch-item-flow.d.ts +3 -0
  212. package/dist/workflow/batch/validate-batch-item-flow.js +98 -0
  213. package/dist/workflow/build-n8n-workflow.d.ts +2 -0
  214. package/dist/workflow/build-n8n-workflow.js +143 -0
  215. package/dist/workflow/compile-native-workflow-nodes.d.ts +3 -0
  216. package/dist/workflow/compile-native-workflow-nodes.js +26 -0
  217. package/dist/workflow/compile-planned-n8n-workflow.d.ts +3 -0
  218. package/dist/workflow/compile-planned-n8n-workflow.js +17 -0
  219. package/dist/workflow/compile-reviewable-n8n-workflow.d.ts +3 -0
  220. package/dist/workflow/compile-reviewable-n8n-workflow.js +70 -0
  221. package/dist/workflow/compile-validated-workflow-fragments.d.ts +3 -0
  222. package/dist/workflow/compile-validated-workflow-fragments.js +20 -0
  223. package/dist/workflow/create-n8n-native-output-sources.d.ts +3 -0
  224. package/dist/workflow/create-n8n-native-output-sources.js +17 -0
  225. package/dist/workflow/review/create-gap-review-content.d.ts +2 -0
  226. package/dist/workflow/review/create-gap-review-content.js +28 -0
  227. package/dist/workflow/review/create-gap-review-region.d.ts +2 -0
  228. package/dist/workflow/review/create-gap-review-region.js +23 -0
  229. package/dist/workflow/review/escape-review-markdown.d.ts +1 -0
  230. package/dist/workflow/review/escape-review-markdown.js +7 -0
  231. package/dist/workflow/review/gap-review-region-layout.d.ts +4 -0
  232. package/dist/workflow/review/gap-review-region-layout.js +21 -0
  233. package/dist/workflow/validate-compiled-binding-sources.d.ts +4 -0
  234. package/dist/workflow/validate-compiled-binding-sources.js +40 -0
  235. package/dist/workflow/validate-node-fragments.d.ts +3 -0
  236. package/dist/workflow/validate-node-fragments.js +58 -0
  237. package/package.json +54 -4
@@ -0,0 +1,104 @@
1
+ import { responseFieldSchemas, responseFieldType, } from '@openapi-flow/core/internal';
2
+ import { checkSchemaValue } from '@openapi-flow/core/internal';
3
+ import { serializePathParameter, serializeQueryParameter, } from '@openapi-flow/core/internal';
4
+ import { UnsupportedOperationError } from '@openapi-flow/core/internal';
5
+ import { isObject } from '@openapi-flow/core/internal';
6
+ import { looksLikeCredential } from './credential-binding.js';
7
+ import { absoluteOperationPath, makeUrl } from './request-url.js';
8
+ export function sequenceUrl(operation, origin, inputs, previous, requiredOutputs, missing) {
9
+ let path = operation.path;
10
+ const references = new Map();
11
+ for (const parameter of operation.parameters) {
12
+ if (parameter.in !== 'path' && parameter.in !== 'query')
13
+ continue;
14
+ const key = parameter.in + '.' + parameter.name;
15
+ const value = inputs[key];
16
+ if (value === undefined) {
17
+ if (parameter.required)
18
+ missing.push(key);
19
+ continue;
20
+ }
21
+ if (isObject(value)) {
22
+ if (typeof value.fromStep !== 'string' ||
23
+ typeof value.field !== 'string' ||
24
+ Object.keys(value).length !== 2) {
25
+ throw new Error('plan.inputs.' + key + ' must have fromStep and field');
26
+ }
27
+ if (looksLikeCredential(value.field)) {
28
+ throw new Error('plan.inputs.' + key + ' references a credential-like response field');
29
+ }
30
+ const source = previous.get(value.fromStep);
31
+ if (!source || responseFieldSchemas(source, value.field).length === 0) {
32
+ throw new Error('plan.inputs.' + key + ' must reference a prior response field');
33
+ }
34
+ const sourceType = responseFieldType(source, value.field);
35
+ const targetType = typeof parameter.schema === 'object'
36
+ ? parameter.schema.type
37
+ : undefined;
38
+ if ((parameter.in === 'path' && parameter.style !== 'simple') ||
39
+ (parameter.in === 'query' && parameter.style !== 'form') ||
40
+ parameter.contentMediaType !== undefined ||
41
+ parameter.allowReserved ||
42
+ !['string', 'number', 'integer', 'boolean'].includes(String(targetType)))
43
+ throw new UnsupportedOperationError(operation.operationRef, `operationRef ${operation.operationRef} parameter ${key} cannot serialize a sequence response reference`);
44
+ if (sourceType !== targetType &&
45
+ !(sourceType === 'integer' && targetType === 'number')) {
46
+ throw new Error('plan.inputs.' + key + ' has a response type mismatch');
47
+ }
48
+ const required = requiredOutputs.get(value.fromStep) ?? new Set();
49
+ required.add(value.field);
50
+ requiredOutputs.set(value.fromStep, required);
51
+ references.set(key, '$node[' +
52
+ JSON.stringify('Request ' + value.fromStep) +
53
+ '].json.body[' +
54
+ JSON.stringify(value.field) +
55
+ ']');
56
+ }
57
+ else {
58
+ checkSchemaValue(value, parameter.schema, 'plan.inputs.' + key);
59
+ if (parameter.in === 'path')
60
+ path = path.replace('{' + parameter.name + '}', serializePathParameter(parameter, operation.operationRef, value));
61
+ }
62
+ }
63
+ if (missing.length)
64
+ return '';
65
+ if (references.size === 0)
66
+ return makeUrl(operation, origin, inputs, []);
67
+ const absolute = absoluteOperationPath(origin, path);
68
+ const parts = [];
69
+ let offset = 0;
70
+ for (const match of absolute.matchAll(/\{([^}]+)\}/g)) {
71
+ const key = 'path.' + match[1];
72
+ const reference = references.get(key);
73
+ if (!reference)
74
+ throw new Error('plan.inputs.' + key + ' is required');
75
+ parts.push(JSON.stringify(absolute.slice(offset, match.index)), 'encodeURIComponent(' + reference + ')');
76
+ offset = match.index + match[0].length;
77
+ }
78
+ parts.push(JSON.stringify(absolute.slice(offset)));
79
+ let expression = parts.join(' + ');
80
+ let firstQuery = true;
81
+ for (const parameter of operation.parameters) {
82
+ if (parameter.in !== 'query' ||
83
+ inputs['query.' + parameter.name] === undefined)
84
+ continue;
85
+ const key = 'query.' + parameter.name;
86
+ const reference = references.get(key);
87
+ if (reference) {
88
+ expression +=
89
+ ' + ' +
90
+ JSON.stringify((firstQuery ? '?' : '&') + encodeURIComponent(parameter.name) + '=') +
91
+ ' + encodeURIComponent(' +
92
+ reference +
93
+ ')';
94
+ }
95
+ else {
96
+ expression +=
97
+ ' + ' +
98
+ JSON.stringify((firstQuery ? '?' : '&') +
99
+ serializeQueryParameter(parameter, operation.operationRef, inputs[key]).join('&'));
100
+ }
101
+ firstQuery = false;
102
+ }
103
+ return '={{ ' + expression + ' }}';
104
+ }
@@ -0,0 +1,25 @@
1
+ export * from './legacy/workflow/common/plan-validation.js';
2
+ export * from './legacy/workflow/common/workflow-id.js';
3
+ export * from './legacy/workflow/inbound/build-inbound-workflow.js';
4
+ export * from './legacy/workflow/inbound/compile-inbound-workflow.js';
5
+ export * from './legacy/workflow/inbound/inbound-response.js';
6
+ export * from './legacy/workflow/request/base-url.js';
7
+ export * from './legacy/workflow/request/build-request-workflow.js';
8
+ export * from './legacy/workflow/request/build-sequence-workflow.js';
9
+ export * from './legacy/workflow/request/compile-catalog-sequence.js';
10
+ export * from './legacy/workflow/request/compile-sequence.js';
11
+ export * from './legacy/workflow/request/compile-workflow.js';
12
+ export * from './legacy/workflow/request/credential-binding.js';
13
+ export * from './legacy/workflow/request/effect-policy.js';
14
+ export * from './legacy/workflow/request/http-request-node.js';
15
+ export * from './legacy/workflow/request/prepare-sequence.js';
16
+ export * from './legacy/workflow/request/request-body.js';
17
+ export * from './legacy/workflow/request/request-headers.js';
18
+ export * from './legacy/workflow/request/request-url.js';
19
+ export * from './legacy/workflow/request/response-assertion-code.js';
20
+ export * from './legacy/workflow/request/sequence-url.js';
21
+ export type * from './types/legacy/catalog-workflow.js';
22
+ export type * from './types/legacy/inbound-workflow.js';
23
+ export type * from './types/legacy/request-node.js';
24
+ export type * from './types/legacy/request-workflow.js';
25
+ export type * from './types/legacy/sequence-workflow.js';
@@ -0,0 +1,20 @@
1
+ export * from './legacy/workflow/common/plan-validation.js';
2
+ export * from './legacy/workflow/common/workflow-id.js';
3
+ export * from './legacy/workflow/inbound/build-inbound-workflow.js';
4
+ export * from './legacy/workflow/inbound/compile-inbound-workflow.js';
5
+ export * from './legacy/workflow/inbound/inbound-response.js';
6
+ export * from './legacy/workflow/request/base-url.js';
7
+ export * from './legacy/workflow/request/build-request-workflow.js';
8
+ export * from './legacy/workflow/request/build-sequence-workflow.js';
9
+ export * from './legacy/workflow/request/compile-catalog-sequence.js';
10
+ export * from './legacy/workflow/request/compile-sequence.js';
11
+ export * from './legacy/workflow/request/compile-workflow.js';
12
+ export * from './legacy/workflow/request/credential-binding.js';
13
+ export * from './legacy/workflow/request/effect-policy.js';
14
+ export * from './legacy/workflow/request/http-request-node.js';
15
+ export * from './legacy/workflow/request/prepare-sequence.js';
16
+ export * from './legacy/workflow/request/request-body.js';
17
+ export * from './legacy/workflow/request/request-headers.js';
18
+ export * from './legacy/workflow/request/request-url.js';
19
+ export * from './legacy/workflow/request/response-assertion-code.js';
20
+ export * from './legacy/workflow/request/sequence-url.js';
@@ -0,0 +1,3 @@
1
+ import type { CompileStandaloneValidatorInput } from '../../../types/schema-compilation.js';
2
+ /** Compile on the host; generated n8n nodes receive validators, not eval. */
3
+ export declare function compileStandaloneValidator({ schema, globalName, }: CompileStandaloneValidatorInput): string;
@@ -0,0 +1,44 @@
1
+ import { Ajv2020 } from 'ajv/dist/2020.js';
2
+ import { _ } from 'ajv/dist/compile/codegen/index.js';
3
+ import addFormats from 'ajv-formats';
4
+ import standaloneCode from 'ajv/dist/standalone/index.js';
5
+ import { buildSync } from 'esbuild';
6
+ import { createRequire } from 'node:module';
7
+ import { dirname } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { bundledLicenseBanner } from '../../../utils/bundled-license-banner.js';
10
+ /** Compile on the host; generated n8n nodes receive validators, not eval. */
11
+ export function compileStandaloneValidator({ schema, globalName, }) {
12
+ const ajv = new Ajv2020({
13
+ strict: false,
14
+ allErrors: true,
15
+ discriminator: true,
16
+ code: {
17
+ source: true,
18
+ // Own the standalone format expression with this compiler's Code class.
19
+ formats: _ `require("ajv-formats/dist/formats").fullFormats`,
20
+ },
21
+ });
22
+ addFormats.default(ajv);
23
+ const compiled = standaloneCode.default(ajv, ajv.compile(schema));
24
+ const built = buildSync({
25
+ stdin: { contents: compiled, resolveDir: import.meta.dirname },
26
+ bundle: true,
27
+ platform: 'browser',
28
+ format: 'iife',
29
+ globalName,
30
+ target: 'es2022',
31
+ minify: true,
32
+ write: false,
33
+ legalComments: 'inline',
34
+ metafile: true,
35
+ // Standard keywords stay intact. JSON equality must not inspect constructors.
36
+ alias: {
37
+ 'ajv/dist/runtime/equal': fileURLToPath(new URL('../../../utils/json-values-equal.cjs', import.meta.url)),
38
+ },
39
+ });
40
+ const require = createRequire(import.meta.url);
41
+ return (bundledLicenseBanner(built.metafile, [
42
+ dirname(require.resolve('ajv/package.json')),
43
+ ]) + built.outputFiles[0].text);
44
+ }
@@ -0,0 +1,3 @@
1
+ import type { CreateGapNodeInput } from '../../types/reviewable-workflow.js';
2
+ import type { N8nNodeFragment } from '../../types/node-fragment.js';
3
+ export declare function createGapNode(input: CreateGapNodeInput): N8nNodeFragment;
@@ -0,0 +1,35 @@
1
+ import { node } from '@n8n/workflow-sdk';
2
+ import { javascriptJsonLiteral } from '../../utils/javascript-json-literal.js';
3
+ export function createGapNode(input) {
4
+ if (!input.nodeId.trim() || !input.gaps.length)
5
+ throw new Error('gap node requires an ID and reported gaps');
6
+ const message = 'OPENAPI_FLOW_UNRESOLVED_STEP ' +
7
+ input.nodeId +
8
+ ': ' +
9
+ input.gaps.map((gap) => gap.description).join('; ');
10
+ const placeholder = node({
11
+ type: 'n8n-nodes-base.code',
12
+ version: 2,
13
+ config: {
14
+ id: input.nodeId,
15
+ name: '확인 필요 · ' + input.nodeId,
16
+ position: input.position,
17
+ notes: '미해결 단계입니다. 실행하면 오류로 중단됩니다.',
18
+ notesInFlow: true,
19
+ onError: 'stopWorkflow',
20
+ parameters: {
21
+ mode: 'runOnceForAllItems',
22
+ language: 'javaScript',
23
+ jsCode: `throw new Error(${javascriptJsonLiteral(message)});`,
24
+ },
25
+ },
26
+ });
27
+ return {
28
+ nodeId: input.nodeId,
29
+ nodes: [placeholder],
30
+ entry: placeholder,
31
+ exit: placeholder,
32
+ inputPorts: { main: 0 },
33
+ outputPorts: { main: 0 },
34
+ };
35
+ }
@@ -0,0 +1,4 @@
1
+ import type { CreateArrayNodeFragmentInput } from '../../../types/array-split.js';
2
+ import type { N8nNodeFragment } from '../../../types/node-fragment.js';
3
+ /** Share SDK array mechanics without merging API and native source contracts. */
4
+ export declare function createArrayNodeFragment({ planned, position, source, parameters, linked, }: CreateArrayNodeFragmentInput): N8nNodeFragment;
@@ -0,0 +1,42 @@
1
+ import { node } from '@n8n/workflow-sdk';
2
+ import { createArrayReaderCode } from './create-array-reader-code.js';
3
+ /** Share SDK array mechanics without merging API and native source contracts. */
4
+ export function createArrayNodeFragment({ planned, position, source, parameters, linked, }) {
5
+ const extract = node({
6
+ type: 'n8n-nodes-base.code',
7
+ version: 2,
8
+ config: {
9
+ id: `${planned.id}-read-array`,
10
+ name: `Read array ${planned.id}`,
11
+ position,
12
+ parameters: {
13
+ mode: 'runOnceForAllItems',
14
+ jsCode: createArrayReaderCode(source, parameters, linked),
15
+ },
16
+ },
17
+ });
18
+ const split = node({
19
+ type: 'n8n-nodes-base.splitOut',
20
+ version: 1,
21
+ config: {
22
+ id: planned.id,
23
+ name: planned.id,
24
+ position: [position[0] + 220, position[1]],
25
+ parameters: {
26
+ fieldToSplitOut: 'items',
27
+ include: 'noOtherFields',
28
+ options: { destinationFieldName: 'item', disableDotNotation: true },
29
+ },
30
+ },
31
+ });
32
+ return {
33
+ nodeId: planned.id,
34
+ bindingSources: [source],
35
+ nodes: [extract, split],
36
+ entry: extract,
37
+ exit: split,
38
+ inputPorts: { main: 0 },
39
+ outputPorts: { main: 0 },
40
+ internalEdges: [{ from: extract.id, output: 0, to: split.id, input: 0 }],
41
+ };
42
+ }
@@ -0,0 +1,3 @@
1
+ import type { N8nOutputBindingSource } from '../../../types/output-binding-source.js';
2
+ import type { ArraySplitParameters } from '../../../types/array-split.js';
3
+ export declare function createArrayReaderCode(source: N8nOutputBindingSource, parameters: ArraySplitParameters, linked: boolean): string;
@@ -0,0 +1,12 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createOutputReaderCode } from '../../request/bindings/create-output-reader-code.js';
3
+ import { javascriptJsonLiteral } from '../../../utils/javascript-json-literal.js';
4
+ export function createArrayReaderCode(source, parameters, linked) {
5
+ const runtime = readFileSync(new URL('../../request/runtime/request-runtime.bundle.js', import.meta.url), 'utf8');
6
+ const read = createOutputReaderCode([source], linked);
7
+ const extract = `${read}\nconst parameters=${javascriptJsonLiteral(parameters)};\nconst array=OpenApiFlowRequestRuntime.pointerValue(responses[parameters.sourceNodeId],parameters.pointer);if(array===undefined)throw new Error('Missing array pointer '+parameters.sourceNodeId+parameters.pointer);if(!Array.isArray(array))throw new Error('Output '+parameters.sourceNodeId+parameters.pointer+' must be an array');`;
8
+ const iteration = linked
9
+ ? `return inputItems.map((_,inputIndex)=>{${extract}\nreturn {json:{items:array},pairedItem:{item:inputIndex}};});`
10
+ : `if(inputItems.length!==1)throw new Error('Array extraction requires one input item; got '+inputItems.length);\n${extract}\nreturn [{json:{items:array},pairedItem:{item:0}}];`;
11
+ return `${runtime}\nconst inputItems=$input.all();\n${iteration}`;
12
+ }
@@ -0,0 +1,3 @@
1
+ import type { N8nNativeCapability } from '../../../types/native-capability.js';
2
+ import type { CreateNativeArrayCapabilityInput } from '../../../types/native-array.js';
3
+ export declare function createNativeArrayCapability(input: CreateNativeArrayCapabilityInput): N8nNativeCapability;
@@ -0,0 +1,64 @@
1
+ import { createNativeArrayItemSchema, validateNativeOutputContracts, } from '@openapi-flow/core';
2
+ import { createNativeArrayParametersSchema } from '../../../schemas/native-array-schema.js';
3
+ import { createArrayNodeFragment } from './create-array-node-fragment.js';
4
+ export function createNativeArrayCapability(input) {
5
+ if (input.itemMode !== undefined && input.itemMode !== 'linked')
6
+ throw new Error('native array capability: itemMode must be linked or omitted');
7
+ validateNativeOutputContracts(input.sources);
8
+ if (!input.sources.length ||
9
+ input.sources.some((source) => typeof source.nodeName !== 'string' || !source.nodeName.trim()))
10
+ throw new Error('native array capability requires sources with compiled names');
11
+ const sources = new Map(input.sources.map((source) => [source.nodeId, source]));
12
+ const parametersSchema = createNativeArrayParametersSchema([
13
+ ...sources.keys(),
14
+ ]);
15
+ function source(parameters) {
16
+ const output = sources.get(parameters.sourceNodeId);
17
+ if (!output)
18
+ throw new Error(`native array: unknown sourceNodeId ${parameters.sourceNodeId}`);
19
+ createNativeArrayItemSchema(output, parameters.pointer);
20
+ return { ...output, kind: 'native-json' };
21
+ }
22
+ return {
23
+ name: 'split-native-output-array',
24
+ description: 'Split a supplied native JSON output array into {item: unchangedElement} using official n8n Split Out. Validate the full native output schema first. Linked mode preserves parent ancestry across nested splits. Empty arrays emit no child items; never convert, flatten or fabricate values.',
25
+ parametersSchema,
26
+ inputPorts: () => ['main'],
27
+ outputPorts: () => ['main'],
28
+ responseReferences: () => [],
29
+ nodeOutputReferences: (values) => {
30
+ const parameters = parametersSchema.parse(values);
31
+ source(parameters);
32
+ return [
33
+ {
34
+ source: 'node-output',
35
+ nodeId: parameters.sourceNodeId,
36
+ pointer: parameters.pointer,
37
+ },
38
+ ];
39
+ },
40
+ waitsForAllInputs: false,
41
+ exclusiveOutputPorts: false,
42
+ outputSchema: (values) => {
43
+ const parameters = parametersSchema.parse(values);
44
+ return {
45
+ type: 'object',
46
+ properties: {
47
+ item: createNativeArrayItemSchema(source(parameters), parameters.pointer),
48
+ },
49
+ required: ['item'],
50
+ additionalProperties: false,
51
+ };
52
+ },
53
+ compile: ({ planned, position }) => {
54
+ const parameters = parametersSchema.parse(planned.parameters);
55
+ return createArrayNodeFragment({
56
+ planned,
57
+ position,
58
+ source: source(parameters),
59
+ parameters,
60
+ linked: input.itemMode === 'linked',
61
+ });
62
+ },
63
+ };
64
+ }
@@ -0,0 +1,2 @@
1
+ import type { N8nNodeFragment, N8nSdkNode } from '../../../types/node-fragment.js';
2
+ export declare function createNativeFragment(sdkNode: N8nSdkNode, inputs: string[], outputs: string[]): N8nNodeFragment;
@@ -0,0 +1,10 @@
1
+ export function createNativeFragment(sdkNode, inputs, outputs) {
2
+ return {
3
+ nodeId: sdkNode.id,
4
+ nodes: [sdkNode],
5
+ entry: sdkNode,
6
+ exit: sdkNode,
7
+ inputPorts: Object.fromEntries(inputs.map((port, index) => [port, index])),
8
+ outputPorts: Object.fromEntries(outputs.map((port, index) => [port, index])),
9
+ };
10
+ }
@@ -0,0 +1,3 @@
1
+ import type { WorkflowResponseReference } from '@openapi-flow/core';
2
+ import type { NativeCheck } from '../../../types/native-capability.js';
3
+ export declare function responseReferences(checks: NativeCheck[]): WorkflowResponseReference[];
@@ -0,0 +1,5 @@
1
+ export function responseReferences(checks) {
2
+ return checks
3
+ .flatMap((check) => [check.left, check.right])
4
+ .filter((operand) => operand.source === 'response');
5
+ }
@@ -0,0 +1,3 @@
1
+ import type { N8nNativeCapability } from '../../types/native-capability.js';
2
+ /** Separate semantic contract from the all-independent-inputs Merge capability. */
3
+ export declare function createExclusiveBranchMergeCapability(): N8nNativeCapability;
@@ -0,0 +1,33 @@
1
+ import { node } from '@n8n/workflow-sdk';
2
+ import { exclusiveBranchMergeParametersSchema } from '../../schemas/exclusive-branch-merge-schema.js';
3
+ import { createNativeFragment } from './common/create-native-fragment.js';
4
+ /** Separate semantic contract from the all-independent-inputs Merge capability. */
5
+ export function createExclusiveBranchMergeCapability() {
6
+ return {
7
+ name: 'rejoin-exclusive-branches',
8
+ description: 'Rejoin both alternative paths of one supplied IF instance using official Merge append. input1 and input2 each cover a distinct true/false path. Preserves existing items and ancestry; never creates an empty completion item. Both paths must return, including a skip path when no business call is required.',
9
+ parametersSchema: exclusiveBranchMergeParametersSchema,
10
+ inputPorts: () => ['input1', 'input2'],
11
+ outputPorts: () => ['main'],
12
+ responseReferences: () => [],
13
+ waitsForAllInputs: false,
14
+ exclusiveOutputPorts: false,
15
+ rejoinsExclusiveOutputs: (parameters) => exclusiveBranchMergeParametersSchema.parse(parameters).sourceNodeId,
16
+ compile: ({ planned, position }) => {
17
+ const { sourceNodeId } = exclusiveBranchMergeParametersSchema.parse(planned.parameters);
18
+ return {
19
+ ...createNativeFragment(node({
20
+ type: 'n8n-nodes-base.merge',
21
+ version: 3.2,
22
+ config: {
23
+ id: planned.id,
24
+ name: planned.id,
25
+ position,
26
+ parameters: { mode: 'append', numberInputs: 2 },
27
+ },
28
+ }), ['input1', 'input2'], ['main']),
29
+ rejoinsExclusiveOutputs: sourceNodeId,
30
+ };
31
+ },
32
+ };
33
+ }
@@ -0,0 +1,3 @@
1
+ import type { CreateJsonOutputCapabilityInput, N8nNativeCapability } from '../../types/native-capability.js';
2
+ /** Explicit typed literals through Edit Fields JSON mode; no casts or mapping expressions. */
3
+ export declare function createJsonOutputCapability(input: CreateJsonOutputCapabilityInput): N8nNativeCapability;
@@ -0,0 +1,38 @@
1
+ import { node } from '@n8n/workflow-sdk';
2
+ import { z } from 'zod';
3
+ import { parseNativeNodeParameters } from '@openapi-flow/core';
4
+ import { javascriptJsonLiteral } from '../../utils/javascript-json-literal.js';
5
+ import { createNativeFragment } from './common/create-native-fragment.js';
6
+ /** Explicit typed literals through Edit Fields JSON mode; no casts or mapping expressions. */
7
+ export function createJsonOutputCapability(input) {
8
+ if (!input.name.trim() || !input.description.trim())
9
+ throw new Error('JSON output capability requires name and description');
10
+ const capability = {
11
+ ...input,
12
+ inputPorts: () => ['main'],
13
+ outputPorts: () => ['main'],
14
+ responseReferences: () => [],
15
+ waitsForAllInputs: false,
16
+ exclusiveOutputPorts: false,
17
+ outputSchema: () => z.toJSONSchema(input.parametersSchema, { io: 'output' }),
18
+ compile: ({ planned, position }) => {
19
+ const parameters = parseNativeNodeParameters(planned, capability);
20
+ return createNativeFragment(node({
21
+ type: 'n8n-nodes-base.set',
22
+ version: 3.4,
23
+ config: {
24
+ id: planned.id,
25
+ name: planned.id,
26
+ position,
27
+ parameters: {
28
+ mode: 'raw',
29
+ jsonOutput: `={{ ${javascriptJsonLiteral(parameters)} }}`,
30
+ includeOtherFields: false,
31
+ options: { dotNotation: false },
32
+ },
33
+ },
34
+ }), ['main'], ['main']);
35
+ },
36
+ };
37
+ return capability;
38
+ }
@@ -0,0 +1,2 @@
1
+ import type { N8nNativeCapability, NativeItemExecutionOptions } from '../../types/native-capability.js';
2
+ export declare function createN8nNativeCapabilities(input?: NativeItemExecutionOptions): N8nNativeCapability[];
@@ -0,0 +1,14 @@
1
+ import { createIfCapability } from './if-capability.js';
2
+ import { createMergeAppendCapability } from './merge-append-capability.js';
3
+ import { createResponseAssertionCapability } from './response-assertion-capability.js';
4
+ import { createStopAndErrorCapability } from './stop-and-error-capability.js';
5
+ export function createN8nNativeCapabilities(input = {}) {
6
+ if (input.itemMode !== undefined && input.itemMode !== 'linked')
7
+ throw new Error('native itemMode must be linked or omitted');
8
+ return [
9
+ createIfCapability(input),
10
+ createMergeAppendCapability(),
11
+ createResponseAssertionCapability(input),
12
+ createStopAndErrorCapability(),
13
+ ];
14
+ }
@@ -0,0 +1,3 @@
1
+ import type { N8nNativeCapability } from '../../types/native-capability.js';
2
+ /** An explicit identity step; never generate a request, value or completion item. */
3
+ export declare function createPassThroughCapability(): N8nNativeCapability;
@@ -0,0 +1,30 @@
1
+ import { node } from '@n8n/workflow-sdk';
2
+ import { passThroughParametersSchema } from '../../schemas/native-capability-schemas.js';
3
+ import { createNativeFragment } from './common/create-native-fragment.js';
4
+ /** An explicit identity step; never generate a request, value or completion item. */
5
+ export function createPassThroughCapability() {
6
+ return {
7
+ name: 'pass-through',
8
+ description: 'n8n No Operation: forward all input items unchanged with their original links. Main input/output, no configuration or new data. Can provide a common entry before a fan-out. This does not merge branches, collect results or replace a missing API.',
9
+ parametersSchema: passThroughParametersSchema,
10
+ inputPorts: () => ['main'],
11
+ outputPorts: () => ['main'],
12
+ responseReferences: () => [],
13
+ waitsForAllInputs: false,
14
+ exclusiveOutputPorts: false,
15
+ compile: ({ planned, position }) => {
16
+ passThroughParametersSchema.parse(planned.parameters);
17
+ const fragment = createNativeFragment(node({
18
+ type: 'n8n-nodes-base.noOp',
19
+ version: 1,
20
+ config: {
21
+ id: planned.id,
22
+ name: planned.id,
23
+ position,
24
+ parameters: {},
25
+ },
26
+ }), ['main'], ['main']);
27
+ return { ...fragment, preservesInputItems: true };
28
+ },
29
+ };
30
+ }
@@ -0,0 +1,3 @@
1
+ import type { N8nNativeCapability } from '../../types/native-capability.js';
2
+ import type { CreateResponseArrayCapabilityInput } from '../../types/array-iteration.js';
3
+ export declare function createResponseArrayCapability(input: CreateResponseArrayCapabilityInput): N8nNativeCapability;
@@ -0,0 +1,73 @@
1
+ import { createResponseArrayItemSchema } from '@openapi-flow/core';
2
+ import { createResponseArrayParametersSchema } from '../../schemas/response-array-schema.js';
3
+ import { createArrayNodeFragment } from './arrays/create-array-node-fragment.js';
4
+ export function createResponseArrayCapability(input) {
5
+ if (input.itemMode !== undefined && input.itemMode !== 'linked')
6
+ throw new Error('response array capability: itemMode must be linked or omitted');
7
+ const linked = input.itemMode === 'linked';
8
+ const materials = new Map(input.materials.map((material) => [material.callId, material]));
9
+ if (!materials.size ||
10
+ materials.size !== input.materials.length ||
11
+ input.materials.some((material) => !material.callId.trim()))
12
+ throw new Error('response array capability requires unique API materials');
13
+ const parametersSchema = createResponseArrayParametersSchema([
14
+ ...materials.keys(),
15
+ ]);
16
+ function source(parameters) {
17
+ const material = materials.get(parameters.sourceNodeId);
18
+ if (!material)
19
+ throw new Error(`response array: unknown sourceNodeId ${parameters.sourceNodeId}`);
20
+ createResponseArrayItemSchema(material.operation, parameters.pointer);
21
+ return material;
22
+ }
23
+ return {
24
+ name: 'split-api-response-array',
25
+ description: 'Split a declared OAS response array into one unchanged JSON item per element using n8n Split Out. Output is {item: element}. Downstream bound requests must use linked item mode. An empty array creates no downstream items.',
26
+ parametersSchema,
27
+ inputPorts: () => ['main'],
28
+ outputPorts: () => ['main'],
29
+ responseReferences: (values) => {
30
+ const parameters = parametersSchema.parse(values);
31
+ source(parameters);
32
+ return [
33
+ {
34
+ source: 'response',
35
+ nodeId: parameters.sourceNodeId,
36
+ pointer: parameters.pointer,
37
+ },
38
+ ];
39
+ },
40
+ waitsForAllInputs: false,
41
+ exclusiveOutputPorts: false,
42
+ outputSchema: (values) => {
43
+ const parameters = parametersSchema.parse(values);
44
+ return {
45
+ type: 'object',
46
+ properties: {
47
+ item: createResponseArrayItemSchema(source(parameters).operation, parameters.pointer),
48
+ },
49
+ required: ['item'],
50
+ additionalProperties: false,
51
+ };
52
+ },
53
+ compile: ({ planned, position, apiNodeNames }) => {
54
+ const parameters = parametersSchema.parse(planned.parameters);
55
+ const material = source(parameters);
56
+ if (!Object.hasOwn(apiNodeNames, material.callId) ||
57
+ !apiNodeNames[material.callId].trim())
58
+ throw new Error(`apiNodeNames is missing ${material.callId}`);
59
+ return createArrayNodeFragment({
60
+ planned,
61
+ position,
62
+ parameters,
63
+ linked,
64
+ source: {
65
+ kind: 'api-response',
66
+ nodeId: material.callId,
67
+ nodeName: apiNodeNames[material.callId],
68
+ operation: material.operation,
69
+ },
70
+ });
71
+ },
72
+ };
73
+ }
@@ -0,0 +1,3 @@
1
+ import type { N8nNativeCapability } from '../../types/native-capability.js';
2
+ import type { CreateResponseCollectionCapabilityInput } from '../../types/response-collection.js';
3
+ export declare function createResponseCollectionCapability(input: CreateResponseCollectionCapabilityInput): N8nNativeCapability;