n8n-editor-ui 1.78.0 → 1.79.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.
Files changed (95) hide show
  1. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-eVUE5od5.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DWFDE-uq.js} +1 -1
  2. package/dist/assets/{AuthView-D1tEXMXA.js → AuthView-BWy2AXVx.js} +2 -2
  3. package/dist/assets/{CanvasChat-BLb-TUbz.js → CanvasChat-BsICzNGY.js} +5 -4
  4. package/dist/assets/{CanvasControls-BN3S3-fQ.js → CanvasControls-BYFrPavs.js} +1 -1
  5. package/dist/assets/{ChangePasswordView-V1JTrEew.js → ChangePasswordView-CCLiIUKZ.js} +3 -3
  6. package/dist/assets/CollectionParameter-B3ZH0i1M.js +4 -0
  7. package/dist/assets/{ConcurrentExecutionsHeader-BNA8q-8c.js → ConcurrentExecutionsHeader-B2EowTfB.js} +2 -2
  8. package/dist/assets/{CredentialsView-AQksN2m1.js → CredentialsView-D432ux-I.js} +4 -4
  9. package/dist/assets/{ErrorView-CLT4S_BD.js → ErrorView-9_LZzUF-.js} +1 -1
  10. package/dist/assets/{ExecutionsView-qI0J-9KP.js → ExecutionsView-BIxxUIkR.js} +5 -5
  11. package/dist/assets/{FileSaver.min-B-zoCBIE.js → FileSaver.min-B1V6jKo8.js} +1 -1
  12. package/dist/assets/{FixedCollectionParameter-DQeeV-mE.js → FixedCollectionParameter-YMjaDcrW.js} +1 -1
  13. package/dist/assets/{ForgotMyPasswordView-BYvqdrhp.js → ForgotMyPasswordView-BOt01WDb.js} +3 -3
  14. package/dist/assets/{Logo-CmkNIoey.js → Logo-DCNJYrds.js} +1 -1
  15. package/dist/assets/{MainHeader-rUYFpqrO.js → MainHeader-KzaLIjdh.js} +10 -9
  16. package/dist/assets/{MainSidebar-Djaxwdmm.css → MainSidebar-BQVC8zBU.css} +13 -13
  17. package/dist/assets/{MainSidebar-B9_KVa79.js → MainSidebar-DOmlVdj3.js} +10 -10
  18. package/dist/assets/{NodeCreation-CWLKVrNb.js → NodeCreation-DY007rCJ.js} +4 -4
  19. package/dist/assets/{NodeCreator-CzIIkTTW.js → NodeCreator-DOXRU1eU.js} +5 -4
  20. package/dist/assets/{NodeViewSwitcher-Det3o0gl.css → NodeViewSwitcher-9WCdidKb.css} +23 -23
  21. package/dist/assets/{NodeViewSwitcher-BUNM0KZ6.js → NodeViewSwitcher-mdZWG63-.js} +75 -61
  22. package/dist/assets/{ProjectCardBadge-BbA_Exq8.js → ProjectCardBadge-ncOmPQT3.js} +1 -1
  23. package/dist/assets/{ProjectHeader-DlgpDOwX.js → ProjectHeader-B2g2JlKl.js} +1 -1
  24. package/dist/assets/{ProjectSettings-DqEtmmAS.js → ProjectSettings-AKqh1FtB.js} +2 -2
  25. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-DL91BcV8.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-Dl-7_27h.js} +7 -4
  26. package/dist/assets/{ResourcesListLayout-D2ZxA1Uw.js → ResourcesListLayout-ByR63gYP.js} +1 -1
  27. package/dist/assets/{useRunWorkflow-B-O5w0ED.js → RunDataAi-ccnApOYE.js} +4 -320
  28. package/dist/assets/{RunDataJson-UkDmIQKn.js → RunDataJson-BKSpe5ct.js} +16 -14
  29. package/dist/assets/{RunDataJsonActions-BqDvrghZ.js → RunDataJsonActions-2mr7NT2e.js} +4 -5
  30. package/dist/assets/{RunDataSearch-UNQ4_4vM.js → RunDataSearch-Cr7Vco2g.js} +1 -1
  31. package/dist/assets/{RunDataTable-BdbNPKnU.js → RunDataTable-Di4ZRdsP.js} +2 -2
  32. package/dist/assets/{SamlOnboarding-Rzkh3AGB.js → SamlOnboarding-C6A4K5y_.js} +3 -3
  33. package/dist/assets/{SettingsApiView-C27ofqQf.js → SettingsApiView-lxJDg42B.js} +1 -1
  34. package/dist/assets/{SettingsCommunityNodesView-CWp_YPSH.js → SettingsCommunityNodesView-YkXQrq1A.js} +5 -4
  35. package/dist/assets/{SettingsExternalSecrets-BytZbZef.js → SettingsExternalSecrets-Cyrb1_mA.js} +1 -1
  36. package/dist/assets/{SettingsLdapView-DvNozRM0.js → SettingsLdapView-BiBAQFE3.js} +1 -1
  37. package/dist/assets/{SettingsLogStreamingView-C4Y3N6rF.js → SettingsLogStreamingView-B1xZpAcm.js} +1 -1
  38. package/dist/assets/{SettingsPersonalView--Z9y3dtC.js → SettingsPersonalView-D0iryycz.js} +1 -1
  39. package/dist/assets/{SettingsSourceControl-BElByx3w.js → SettingsSourceControl-B3SU8Cq3.js} +1 -1
  40. package/dist/assets/{SettingsSso-DUOhZeok.js → SettingsSso-DX4TKTsQ.js} +1 -1
  41. package/dist/assets/{SettingsUsageAndPlan-DTw2vCOM.js → SettingsUsageAndPlan-DawDrfF4.js} +1 -1
  42. package/dist/assets/{SettingsUsersView-B2lC671-.js → SettingsUsersView-BQWBJqPE.js} +1 -1
  43. package/dist/assets/{SettingsView-tGXgBeZb.js → SettingsView-BNDKNELZ.js} +1 -1
  44. package/dist/assets/{SetupView-BB-PMekL.js → SetupView-C4Eo3Exo.js} +3 -3
  45. package/dist/assets/{SetupWorkflowCredentialsButton-B7i_jYti.js → SetupWorkflowCredentialsButton-D5_n7ODz.js} +1 -1
  46. package/dist/assets/{SetupWorkflowFromTemplateView-Co52TGFE.js → SetupWorkflowFromTemplateView-BhrvXdVP.js} +3 -3
  47. package/dist/assets/{SigninView-B8lcx39e.js → SigninView-Hl7bzZyS.js} +3 -3
  48. package/dist/assets/{SignoutView-CamkX68g.js → SignoutView-BTZ7B2eU.js} +1 -1
  49. package/dist/assets/{SignupView-D9e7FiEj.js → SignupView-BzD--VKr.js} +3 -3
  50. package/dist/assets/{TemplateDetails-C0RPBtYu.js → TemplateDetails-CE4hKdqt.js} +1 -1
  51. package/dist/assets/{TemplateList-B6jscn2o.js → TemplateList-C40kkbIk.js} +1 -1
  52. package/dist/assets/{TemplatesCollectionView-9fi4vQ1-.js → TemplatesCollectionView-qnbaiTtg.js} +5 -5
  53. package/dist/assets/{TemplatesSearchView-VlRyjuTl.js → TemplatesSearchView-CxGzeepB.js} +3 -3
  54. package/dist/assets/{TemplatesView-CgQelQ-w.js → TemplatesView-CLnu-Vk0.js} +1 -1
  55. package/dist/assets/{TemplatesWorkflowView-BhhfuZZ9.js → TemplatesWorkflowView-DSUDCqLB.js} +5 -5
  56. package/dist/assets/{TestDefinitionEditView-Cv4ImQQb.js → TestDefinitionEditView-Cr91OHJq.js} +4 -3
  57. package/dist/assets/{TestDefinitionListView-CywmtGBZ.js → TestDefinitionListView-CHtb_wVa.js} +1 -1
  58. package/dist/assets/{TestDefinitionRootView-BhZESeJD.js → TestDefinitionRootView-qwBGRGcA.js} +1 -1
  59. package/dist/assets/{VariablesView-B_Ju8Kay.js → VariablesView-DbieMKqP.js} +2 -2
  60. package/dist/assets/{WorkerView-Lif0hJie.js → WorkerView-CGoEdLP1.js} +6 -5
  61. package/dist/assets/{WorkflowActivator-Bv0WPJm3.js → WorkflowActivator-DDV__yRf.js} +2 -2
  62. package/dist/assets/{WorkflowExecutionsInfoAccordion-DitIU6bv.js → WorkflowExecutionsInfoAccordion-BtuCDilo.js} +1 -1
  63. package/dist/assets/{WorkflowExecutionsLandingPage-vuyCAPrk.js → WorkflowExecutionsLandingPage-BY-k0RSJ.js} +2 -2
  64. package/dist/assets/{WorkflowExecutionsPreview-DN_WSVD_.js → WorkflowExecutionsPreview-CyaPgz0p.js} +5 -5
  65. package/dist/assets/{WorkflowExecutionsView-BhFMyj3l.js → WorkflowExecutionsView-BiJSnqfz.js} +5 -5
  66. package/dist/assets/{WorkflowHistory-XSHcXPVZ.js → WorkflowHistory-DPFTyd0-.js} +3 -3
  67. package/dist/assets/{WorkflowOnboardingView-DdujIOw8.js → WorkflowOnboardingView-CvM7VnUz.js} +1 -1
  68. package/dist/assets/{WorkflowPreview-YDi-9g3Y.js → WorkflowPreview-AXxLG6z_.js} +1 -1
  69. package/dist/assets/{WorkflowsView-BLTTQnV3.js → WorkflowsView-CJfwV6KM.js} +7 -7
  70. package/dist/assets/_commonjs-dynamic-modules-TGKdzP3c.js +6 -0
  71. package/dist/assets/{easyAiWorkflowUtils-WSNP3eeS.js → easyAiWorkflowUtils-Bgzcbe9I.js} +2 -2
  72. package/dist/assets/global-link-actions-ilTTGVxi.js +5 -0
  73. package/dist/assets/import-curl-BmGzfSSE.js +5 -0
  74. package/dist/assets/{index-BwoviwZU.js → index-DCrfHAqy.js} +1818 -1741
  75. package/dist/assets/{index-DFFkAkMx.css → index-xKO0gQfI.css} +23 -19
  76. package/dist/assets/pushConnection.store-BfRLeHNn.js +238 -0
  77. package/dist/assets/{templateActions-CDiqnge9.js → templateActions-B1TLkU9O.js} +1 -1
  78. package/dist/assets/{useBeforeUnload-BQCxN-bM.js → useBeforeUnload-QUAV6NNZ.js} +1 -1
  79. package/dist/assets/{useCanvasOperations-DQSiUE8i.js → useCanvasMapping-B7TPBzRe.js} +3362 -3174
  80. package/dist/assets/{useCanvasOperations-CKa4_bqL.css → useCanvasMapping-DeC609A4.css} +213 -160
  81. package/dist/assets/{useExecutionDebugging-BlSzHQ7f.js → useExecutionDebugging-Cgdyxfi_.js} +1 -1
  82. package/dist/assets/{useExecutionHelpers-DpNwTiuj.js → useExecutionHelpers-CN4pMvuh.js} +1 -1
  83. package/dist/assets/useImportCurlCommand-D-HLU11j.js +9055 -0
  84. package/dist/assets/{usePushConnection-ioPocbvz.js → usePushConnection-DNb5nQKO.js} +4 -3
  85. package/dist/assets/useRunWorkflow-DTE_Nd7p.js +616 -0
  86. package/dist/assets/{useWorkflowActivate-CbVB4JlR.js → useWorkflowActivate-FRUHj-WT.js} +1 -1
  87. package/dist/index.html +2 -2
  88. package/dist/tree-sitter-bash.wasm +0 -0
  89. package/dist/tree-sitter.wasm +0 -0
  90. package/package.json +1 -1
  91. package/vite.config.mts +14 -1
  92. package/dist/assets/CollectionParameter-C28x26Fy.js +0 -4
  93. package/dist/assets/pushConnection.store-BlMyXexG.js +0 -117
  94. package/dist/assets/usePinnedData-E0jv55-6.js +0 -274
  95. /package/dist/assets/{useRunWorkflow-DWoFsQdi.css → RunDataAi-DWoFsQdi.css} +0 -0
@@ -1,6 +1,7 @@
1
- import { g7 as makeRestApiRequest, R as defineStore, Z as useRootStore, d as defineComponent, cT as resolveDirective, c as openBlock, h as createElementBlock, ax as withDirectives, j as createBaseVNode, t as toDisplayString, l as unref, g as useI18n, a4 as useWorkflowHelpers, bp as useNodeHelpers, a as useToast, bR as useCredentialsStore, bo as useNodeTypesStore, p as useSettingsStore, K as useUIStore, T as useWorkflowsStore, eX as useAssistantStore, au as usePostHog, r as ref, bT as AI_CREDITS_EXPERIMENT, g8 as parse, g9 as hasTrimmedItem, ga as codeNodeEditorEventBus, af as WORKFLOW_SETTINGS_MODAL_KEY, dR as generateNodesGraph, ap as h, d3 as getTriggerNodeServiceName, gb as hasTrimmedData, aT as useExternalHooks, aj as useTelemetry, gc as clearPopupWindowState } from "./index-BwoviwZU.js";
2
- import { u as usePushConnectionStore, g as globalLinkActionsEventBus } from "./pushConnection.store-BlMyXexG.js";
3
- import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-WSNP3eeS.js";
1
+ import { g5 as makeRestApiRequest, R as defineStore, Z as useRootStore, d as defineComponent, cT as resolveDirective, c as openBlock, h as createElementBlock, ax as withDirectives, j as createBaseVNode, t as toDisplayString, l as unref, g as useI18n, a4 as useWorkflowHelpers, bp as useNodeHelpers, a as useToast, bS as useCredentialsStore, bo as useNodeTypesStore, p as useSettingsStore, K as useUIStore, T as useWorkflowsStore, eX as useAssistantStore, au as usePostHog, r as ref, bU as AI_CREDITS_EXPERIMENT, g6 as parse, g7 as hasTrimmedItem, g8 as codeNodeEditorEventBus, af as WORKFLOW_SETTINGS_MODAL_KEY, dR as generateNodesGraph, ap as h, d3 as getTriggerNodeServiceName, g9 as hasTrimmedData, aT as useExternalHooks, aj as useTelemetry, ga as clearPopupWindowState } from "./index-DCrfHAqy.js";
2
+ import { g as globalLinkActionsEventBus } from "./global-link-actions-ilTTGVxi.js";
3
+ import { u as usePushConnectionStore } from "./pushConnection.store-BfRLeHNn.js";
4
+ import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-Bgzcbe9I.js";
4
5
  const GET_STATUS_ENDPOINT = "/orchestration/worker/status";
5
6
  const sendGetWorkerStatus = async (context) => {
6
7
  await makeRestApiRequest(context, "POST", GET_STATUS_ENDPOINT);
@@ -0,0 +1,616 @@
1
+ import { gh as baseSlice, gi as toString, bo as useNodeTypesStore, q as computed, l as unref, eM as isSubNodeType, Z as useRootStore, T as useWorkflowsStore, a as useToast, gj as PIN_DATA_NODE_TYPES_DENYLIST, bg as getNodeOutputs, bh as NodeConnectionType, gk as jsonStringify, gl as toMegaBytes, gm as stringSizeInBytes, ch as jsonParse, g as useI18n, aj as useTelemetry, aT as useExternalHooks, eN as useDataSchema, gn as MAX_PINNED_DATA_SIZE, go as MAX_WORKFLOW_SIZE, gp as MAX_EXPECTED_REQUEST_SIZE, bp as useNodeHelpers, a4 as useWorkflowHelpers, p as useSettingsStore, K as useUIStore, at as useExecutionsStore, b7 as CHAT_TRIGGER_NODE_TYPE, bj as get, gq as SINGLE_WEBHOOK_TRIGGERS, gr as displayForm, cL as isEmpty, dR as generateNodesGraph } from "./index-DCrfHAqy.js";
2
+ import { u as usePushConnectionStore } from "./pushConnection.store-BfRLeHNn.js";
3
+ function castSlice(array, start, end) {
4
+ var length = array.length;
5
+ end = end === void 0 ? length : end;
6
+ return !start && end >= length ? array : baseSlice(array, start, end);
7
+ }
8
+ var rsAstralRange$1 = "\\ud800-\\udfff", rsComboMarksRange$1 = "\\u0300-\\u036f", reComboHalfMarksRange$1 = "\\ufe20-\\ufe2f", rsComboSymbolsRange$1 = "\\u20d0-\\u20ff", rsComboRange$1 = rsComboMarksRange$1 + reComboHalfMarksRange$1 + rsComboSymbolsRange$1, rsVarRange$1 = "\\ufe0e\\ufe0f";
9
+ var rsZWJ$1 = "\\u200d";
10
+ var reHasUnicode = RegExp("[" + rsZWJ$1 + rsAstralRange$1 + rsComboRange$1 + rsVarRange$1 + "]");
11
+ function hasUnicode(string) {
12
+ return reHasUnicode.test(string);
13
+ }
14
+ function asciiToArray(string) {
15
+ return string.split("");
16
+ }
17
+ var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = "\\ufe0e\\ufe0f";
18
+ var rsAstral = "[" + rsAstralRange + "]", rsCombo = "[" + rsComboRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsZWJ = "\\u200d";
19
+ var reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")";
20
+ var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g");
21
+ function unicodeToArray(string) {
22
+ return string.match(reUnicode) || [];
23
+ }
24
+ function stringToArray(string) {
25
+ return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
26
+ }
27
+ function createCaseFirst(methodName) {
28
+ return function(string) {
29
+ string = toString(string);
30
+ var strSymbols = hasUnicode(string) ? stringToArray(string) : void 0;
31
+ var chr = strSymbols ? strSymbols[0] : string.charAt(0);
32
+ var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1);
33
+ return chr[methodName]() + trailing;
34
+ };
35
+ }
36
+ var upperFirst = createCaseFirst("toUpperCase");
37
+ function capitalize(string) {
38
+ return upperFirst(toString(string).toLowerCase());
39
+ }
40
+ function useNodeType(options = {}) {
41
+ const nodeTypesStore = useNodeTypesStore();
42
+ const nodeType = computed(() => {
43
+ if (options.nodeType) {
44
+ return unref(options.nodeType);
45
+ }
46
+ const activeNode = unref(options.node);
47
+ if (activeNode) {
48
+ return nodeTypesStore.getNodeType(activeNode.type, activeNode.typeVersion);
49
+ }
50
+ return null;
51
+ });
52
+ const isSubNodeType$1 = computed(() => isSubNodeType(nodeType.value));
53
+ const isMultipleOutputsNodeType = computed(() => {
54
+ const outputs = nodeType.value?.outputs;
55
+ if (typeof outputs === "string") return false;
56
+ return (outputs ?? []).length > 1;
57
+ });
58
+ return {
59
+ nodeType,
60
+ isSubNodeType: isSubNodeType$1,
61
+ isMultipleOutputsNodeType
62
+ };
63
+ }
64
+ function usePinnedData(node, options = {}) {
65
+ const rootStore = useRootStore();
66
+ const workflowsStore = useWorkflowsStore();
67
+ const toast = useToast();
68
+ const i18n = useI18n();
69
+ const telemetry = useTelemetry();
70
+ const externalHooks = useExternalHooks();
71
+ const { getInputDataWithPinned } = useDataSchema();
72
+ const { isSubNodeType: isSubNodeType2, isMultipleOutputsNodeType } = useNodeType({
73
+ node
74
+ });
75
+ const data = computed(() => {
76
+ const targetNode = unref(node);
77
+ return targetNode ? workflowsStore.pinDataByNodeName(targetNode.name) : void 0;
78
+ });
79
+ const hasData = computed(() => {
80
+ const targetNode = unref(node);
81
+ return !!targetNode && typeof data.value !== "undefined";
82
+ });
83
+ const isValidNodeType = computed(() => {
84
+ const targetNode = unref(node);
85
+ return !!targetNode && !isSubNodeType2.value && !isMultipleOutputsNodeType.value && !PIN_DATA_NODE_TYPES_DENYLIST.includes(targetNode.type);
86
+ });
87
+ function canPinNode(checkDataEmpty = false, outputIndex) {
88
+ const targetNode = unref(node);
89
+ if (targetNode === null || PIN_DATA_NODE_TYPES_DENYLIST.includes(targetNode.type)) return false;
90
+ const nodeType = useNodeTypesStore().getNodeType(targetNode.type, targetNode.typeVersion);
91
+ const dataToPin = getInputDataWithPinned(targetNode);
92
+ if (!nodeType || checkDataEmpty && dataToPin.length === 0) return false;
93
+ const workflow = workflowsStore.getCurrentWorkflow();
94
+ const outputs = getNodeOutputs(workflow, targetNode, nodeType).map(
95
+ (output) => typeof output === "string" ? { type: output } : output
96
+ );
97
+ const mainOutputs = outputs.filter(
98
+ (output) => output.type === NodeConnectionType.Main && output.category !== "error"
99
+ );
100
+ let indexAcceptable = true;
101
+ if (outputIndex !== void 0) {
102
+ const output = outputs[outputIndex];
103
+ if (outputs[outputIndex] === void 0) return false;
104
+ indexAcceptable = output.type === NodeConnectionType.Main && output.category !== "error";
105
+ }
106
+ return mainOutputs.length === 1 && indexAcceptable;
107
+ }
108
+ function isValidJSON(data2) {
109
+ try {
110
+ JSON.parse(data2);
111
+ return true;
112
+ } catch (error) {
113
+ const title = i18n.baseText("runData.editOutputInvalid");
114
+ const toRemove = new RegExp(/JSON\.parse:|of the JSON data/, "g");
115
+ const message = error.message.replace(toRemove, "").trim();
116
+ const positionMatchRegEx = /at position (\d+)/;
117
+ const positionMatch = error.message.match(positionMatchRegEx);
118
+ error.message = message.charAt(0).toUpperCase() + message.slice(1);
119
+ error.message = error.message.replace(
120
+ "Unexpected token ' in JSON",
121
+ i18n.baseText("runData.editOutputInvalid.singleQuote")
122
+ );
123
+ if (positionMatch) {
124
+ const position = parseInt(positionMatch[1], 10);
125
+ const lineBreaksUpToPosition = (data2.slice(0, position).match(/\n/g) || []).length;
126
+ error.message = error.message.replace(
127
+ positionMatchRegEx,
128
+ i18n.baseText("runData.editOutputInvalid.atPosition", {
129
+ interpolate: {
130
+ position: `${position}`
131
+ }
132
+ })
133
+ );
134
+ error.message = `${i18n.baseText("runData.editOutputInvalid.onLine", {
135
+ interpolate: {
136
+ line: `${lineBreaksUpToPosition + 1}`
137
+ }
138
+ })} ${error.message}`;
139
+ }
140
+ toast.showError(error, title);
141
+ return false;
142
+ }
143
+ }
144
+ function getMaxPinnedDataSize() {
145
+ return window.maxPinnedDataSize ?? MAX_PINNED_DATA_SIZE;
146
+ }
147
+ function isValidSize(data2) {
148
+ const targetNode = unref(node);
149
+ if (!targetNode) {
150
+ return false;
151
+ }
152
+ if (typeof data2 === "object") data2 = JSON.stringify(data2);
153
+ const { pinData: currentPinData, ...workflow } = workflowsStore.getCurrentWorkflow();
154
+ const workflowJson = jsonStringify(workflow, { replaceCircularRefs: true });
155
+ const newPinData = { ...currentPinData, [targetNode.name]: data2 };
156
+ const newPinDataSize = workflowsStore.getPinDataSize(newPinData);
157
+ if (newPinDataSize > getMaxPinnedDataSize()) {
158
+ toast.showError(
159
+ new Error(
160
+ i18n.baseText("ndv.pinData.error.tooLarge.description", {
161
+ interpolate: {
162
+ size: toMegaBytes(newPinDataSize),
163
+ limit: toMegaBytes(getMaxPinnedDataSize())
164
+ }
165
+ })
166
+ ),
167
+ i18n.baseText("ndv.pinData.error.tooLarge.title")
168
+ );
169
+ return false;
170
+ }
171
+ const workflowSize = stringSizeInBytes(workflowJson) + newPinDataSize;
172
+ const limit = MAX_WORKFLOW_SIZE - MAX_EXPECTED_REQUEST_SIZE;
173
+ if (workflowSize > limit) {
174
+ toast.showError(
175
+ new Error(
176
+ i18n.baseText("ndv.pinData.error.tooLargeWorkflow.description", {
177
+ interpolate: { size: toMegaBytes(workflowSize), limit: toMegaBytes(limit) }
178
+ })
179
+ ),
180
+ i18n.baseText("ndv.pinData.error.tooLargeWorkflow.title")
181
+ );
182
+ return false;
183
+ }
184
+ return true;
185
+ }
186
+ function onSetDataSuccess({ source }) {
187
+ const targetNode = unref(node);
188
+ const displayMode = unref(options.displayMode);
189
+ const runIndex = unref(options.runIndex);
190
+ const telemetryPayload = {
191
+ pinning_source: source,
192
+ node_type: targetNode?.type,
193
+ push_ref: rootStore.pushRef,
194
+ data_size: stringSizeInBytes(data.value),
195
+ view: displayMode,
196
+ run_index: runIndex
197
+ };
198
+ void externalHooks.run("runData.onDataPinningSuccess", telemetryPayload);
199
+ telemetry.track("Ndv data pinning success", telemetryPayload);
200
+ }
201
+ function onSetDataError({
202
+ errorType,
203
+ source
204
+ }) {
205
+ const targetNode = unref(node);
206
+ const displayMode = unref(options.displayMode);
207
+ const runIndex = unref(options.runIndex);
208
+ telemetry.track("Ndv data pinning failure", {
209
+ pinning_source: source,
210
+ node_type: targetNode?.type,
211
+ push_ref: rootStore.pushRef,
212
+ data_size: stringSizeInBytes(data.value),
213
+ view: displayMode,
214
+ run_index: runIndex,
215
+ error_type: errorType
216
+ });
217
+ }
218
+ function setData(data2, source) {
219
+ const targetNode = unref(node);
220
+ if (!targetNode) {
221
+ return;
222
+ }
223
+ if (typeof data2 === "string") {
224
+ if (!isValidJSON(data2)) {
225
+ onSetDataError({ errorType: "invalid-json", source });
226
+ throw new Error("Invalid JSON");
227
+ }
228
+ data2 = jsonParse(data2);
229
+ }
230
+ if (!isValidSize(data2)) {
231
+ onSetDataError({ errorType: "data-too-large", source });
232
+ throw new Error("Data too large");
233
+ }
234
+ workflowsStore.pinData({ node: targetNode, data: data2 });
235
+ onSetDataSuccess({ source });
236
+ }
237
+ function onUnsetData({ source }) {
238
+ const targetNode = unref(node);
239
+ const runIndex = unref(options.runIndex);
240
+ telemetry.track("User unpinned ndv data", {
241
+ node_type: targetNode?.type,
242
+ push_ref: rootStore.pushRef,
243
+ run_index: runIndex,
244
+ source,
245
+ data_size: stringSizeInBytes(data.value)
246
+ });
247
+ }
248
+ function unsetData(source) {
249
+ const targetNode = unref(node);
250
+ if (!targetNode) {
251
+ return;
252
+ }
253
+ onUnsetData({ source });
254
+ workflowsStore.unpinData({ node: targetNode });
255
+ }
256
+ return {
257
+ data,
258
+ hasData,
259
+ isValidNodeType,
260
+ canPinNode,
261
+ setData,
262
+ onSetDataSuccess,
263
+ onSetDataError,
264
+ unsetData,
265
+ onUnsetData,
266
+ isValidJSON,
267
+ isValidSize
268
+ };
269
+ }
270
+ const getDirtyNodeNames = (runData, getParametersLastUpdate) => {
271
+ const dirtyNodeNames = Object.entries(runData).reduce((acc, [nodeName, tasks]) => {
272
+ if (!tasks.length) return acc;
273
+ const updatedAt = getParametersLastUpdate(nodeName) ?? 0;
274
+ if (updatedAt > tasks[0].startTime) {
275
+ acc.push(nodeName);
276
+ }
277
+ return acc;
278
+ }, []);
279
+ return dirtyNodeNames.length ? dirtyNodeNames : void 0;
280
+ };
281
+ function useRunWorkflow(useRunWorkflowOpts) {
282
+ const nodeHelpers = useNodeHelpers();
283
+ const workflowHelpers = useWorkflowHelpers({ router: useRunWorkflowOpts.router });
284
+ const i18n = useI18n();
285
+ const toast = useToast();
286
+ const telemetry = useTelemetry();
287
+ const externalHooks = useExternalHooks();
288
+ const settingsStore = useSettingsStore();
289
+ const rootStore = useRootStore();
290
+ const pushConnectionStore = usePushConnectionStore();
291
+ const uiStore = useUIStore();
292
+ const workflowsStore = useWorkflowsStore();
293
+ const executionsStore = useExecutionsStore();
294
+ async function runWorkflowApi(runData) {
295
+ if (!pushConnectionStore.isConnected) {
296
+ throw new Error(i18n.baseText("workflowRun.noActiveConnectionToTheServer"));
297
+ }
298
+ workflowsStore.subWorkflowExecutionError = null;
299
+ uiStore.addActiveAction("workflowRunning");
300
+ let response;
301
+ try {
302
+ response = await workflowsStore.runWorkflow(runData);
303
+ } catch (error) {
304
+ uiStore.removeActiveAction("workflowRunning");
305
+ throw error;
306
+ }
307
+ if (response.executionId !== void 0) {
308
+ workflowsStore.activeExecutionId = response.executionId;
309
+ }
310
+ if (response.waitingForWebhook === true && useWorkflowsStore().nodesIssuesExist) {
311
+ uiStore.removeActiveAction("workflowRunning");
312
+ throw new Error(i18n.baseText("workflowRun.showError.resolveOutstandingIssues"));
313
+ }
314
+ if (response.waitingForWebhook === true) {
315
+ workflowsStore.executionWaitingForWebhook = true;
316
+ }
317
+ return response;
318
+ }
319
+ async function runWorkflow(options) {
320
+ const workflow = workflowHelpers.getCurrentWorkflow();
321
+ if (uiStore.isActionActive["workflowRunning"]) {
322
+ return;
323
+ }
324
+ toast.clearAllStickyNotifications();
325
+ try {
326
+ let directParentNodes = [];
327
+ if (options.destinationNode !== void 0) {
328
+ directParentNodes = workflow.getParentNodes(
329
+ options.destinationNode,
330
+ NodeConnectionType.Main,
331
+ -1
332
+ );
333
+ }
334
+ const runData = workflowsStore.getWorkflowRunData;
335
+ if (workflowsStore.isNewWorkflow) {
336
+ await workflowHelpers.saveCurrentWorkflow();
337
+ }
338
+ const workflowData = await workflowHelpers.getWorkflowDataToSave();
339
+ const consolidatedData = consolidateRunDataAndStartNodes(
340
+ directParentNodes,
341
+ runData,
342
+ workflowData.pinData,
343
+ workflow
344
+ );
345
+ const { startNodeNames } = consolidatedData;
346
+ const destinationNodeType = options.destinationNode ? workflowsStore.getNodeByName(options.destinationNode)?.type : "";
347
+ let { runData: newRunData } = consolidatedData;
348
+ let executedNode;
349
+ let triggerToStartFrom;
350
+ if (startNodeNames.length === 0 && "destinationNode" in options && options.destinationNode !== void 0) {
351
+ executedNode = options.destinationNode;
352
+ startNodeNames.push(options.destinationNode);
353
+ } else if (options.triggerNode && options.nodeData) {
354
+ startNodeNames.push(
355
+ ...workflow.getChildNodes(options.triggerNode, NodeConnectionType.Main, 1)
356
+ );
357
+ newRunData = { [options.triggerNode]: [options.nodeData] };
358
+ executedNode = options.triggerNode;
359
+ }
360
+ if (options.triggerNode) {
361
+ triggerToStartFrom = {
362
+ name: options.triggerNode,
363
+ data: options.nodeData
364
+ };
365
+ }
366
+ if (options.destinationNode && (workflowsStore.checkIfNodeHasChatParent(options.destinationNode) || destinationNodeType === CHAT_TRIGGER_NODE_TYPE) && options.source !== "RunData.ManualChatMessage") {
367
+ const startNode = workflow.getStartNode(options.destinationNode);
368
+ if (startNode && startNode.type === CHAT_TRIGGER_NODE_TYPE) {
369
+ const chatHasInputData = nodeHelpers.getNodeInputData(startNode, 0, 0, "input")?.length > 0;
370
+ const chatHasPinData = !!workflowData.pinData?.[startNode.name];
371
+ if (!chatHasInputData && !chatHasPinData) {
372
+ workflowsStore.chatPartialExecutionDestinationNode = options.destinationNode;
373
+ workflowsStore.setPanelOpen("chat", true);
374
+ return;
375
+ }
376
+ }
377
+ }
378
+ const triggers = workflowData.nodes.filter(
379
+ (node) => node.type.toLowerCase().includes("trigger") && !node.disabled
380
+ );
381
+ if (!options.destinationNode && options.source !== "RunData.ManualChatMessage" && workflowData.nodes.some((node) => node.type === CHAT_TRIGGER_NODE_TYPE)) {
382
+ const otherTriggers = triggers.filter((node) => node.type !== CHAT_TRIGGER_NODE_TYPE);
383
+ if (otherTriggers.length) {
384
+ const chatTriggerNode = workflowData.nodes.find(
385
+ (node) => node.type === CHAT_TRIGGER_NODE_TYPE
386
+ );
387
+ if (chatTriggerNode) {
388
+ chatTriggerNode.disabled = true;
389
+ }
390
+ }
391
+ }
392
+ const startNodes = startNodeNames.map((name) => {
393
+ let sourceData = get(runData, [name, 0, "source", 0], null);
394
+ if (sourceData === null) {
395
+ const parentNodes = workflow.getParentNodes(name, NodeConnectionType.Main, 1);
396
+ const executeData = workflowHelpers.executeData(
397
+ parentNodes,
398
+ name,
399
+ NodeConnectionType.Main,
400
+ 0
401
+ );
402
+ sourceData = get(executeData, ["source", NodeConnectionType.Main, 0], null);
403
+ }
404
+ return {
405
+ name,
406
+ sourceData
407
+ };
408
+ });
409
+ const singleWebhookTrigger = triggers.find(
410
+ (node) => SINGLE_WEBHOOK_TRIGGERS.includes(node.type)
411
+ );
412
+ if (singleWebhookTrigger && workflowsStore.isWorkflowActive && !workflowData.pinData?.[singleWebhookTrigger.name]) {
413
+ toast.showMessage({
414
+ title: i18n.baseText("workflowRun.showError.deactivate"),
415
+ message: i18n.baseText("workflowRun.showError.productionActive", {
416
+ interpolate: { nodeName: singleWebhookTrigger.name }
417
+ }),
418
+ type: "error"
419
+ });
420
+ return void 0;
421
+ }
422
+ const isPartialExecution = options.destinationNode !== void 0;
423
+ const settingsStore2 = useSettingsStore();
424
+ const version = settingsStore2.partialExecutionVersion;
425
+ const startRunData = {
426
+ workflowData,
427
+ // With the new partial execution version the backend decides what run
428
+ // data to use and what to ignore.
429
+ runData: !isPartialExecution ? (
430
+ // if it's a full execution we don't want to send any run data
431
+ void 0
432
+ ) : version === 2 ? (
433
+ // With the new partial execution version the backend decides
434
+ //what run data to use and what to ignore.
435
+ runData ?? void 0
436
+ ) : (
437
+ // for v0 we send the run data the FE constructed
438
+ newRunData
439
+ ),
440
+ startNodes,
441
+ triggerToStartFrom
442
+ };
443
+ if ("destinationNode" in options) {
444
+ startRunData.destinationNode = options.destinationNode;
445
+ }
446
+ if (startRunData.runData) {
447
+ startRunData.dirtyNodeNames = getDirtyNodeNames(
448
+ startRunData.runData,
449
+ workflowsStore.getParametersLastUpdate
450
+ );
451
+ }
452
+ const executionData = {
453
+ id: "__IN_PROGRESS__",
454
+ finished: false,
455
+ mode: "manual",
456
+ status: "running",
457
+ createdAt: /* @__PURE__ */ new Date(),
458
+ startedAt: /* @__PURE__ */ new Date(),
459
+ stoppedAt: void 0,
460
+ workflowId: workflow.id,
461
+ executedNode,
462
+ triggerNode: triggerToStartFrom?.name,
463
+ data: {
464
+ resultData: {
465
+ runData: startRunData.runData ?? {},
466
+ pinData: workflowData.pinData,
467
+ workflowData
468
+ }
469
+ },
470
+ workflowData: {
471
+ id: workflowsStore.workflowId,
472
+ name: workflowData.name,
473
+ active: workflowData.active,
474
+ createdAt: 0,
475
+ updatedAt: 0,
476
+ ...workflowData
477
+ }
478
+ };
479
+ workflowsStore.setWorkflowExecutionData(executionData);
480
+ nodeHelpers.updateNodesExecutionIssues();
481
+ workflowHelpers.setDocumentTitle(workflow.name, "EXECUTING");
482
+ const runWorkflowApiResponse = await runWorkflowApi(startRunData);
483
+ const pinData = workflowData.pinData ?? {};
484
+ const getTestUrl = /* @__PURE__ */ (() => {
485
+ return (node) => {
486
+ const path = node.parameters.path || node.parameters.options?.path || node.webhookId;
487
+ return `${rootStore.formTestUrl}/${path}`;
488
+ };
489
+ })();
490
+ try {
491
+ displayForm({
492
+ nodes: workflowData.nodes,
493
+ runData: workflowsStore.getWorkflowExecution?.data?.resultData?.runData,
494
+ destinationNode: options.destinationNode,
495
+ pinData,
496
+ directParentNodes,
497
+ source: options.source,
498
+ getTestUrl
499
+ });
500
+ } catch (error) {
501
+ }
502
+ await externalHooks.run("workflowRun.runWorkflow", {
503
+ nodeName: options.destinationNode,
504
+ source: options.source
505
+ });
506
+ return runWorkflowApiResponse;
507
+ } catch (error) {
508
+ workflowHelpers.setDocumentTitle(workflow.name, "ERROR");
509
+ toast.showError(error, i18n.baseText("workflowRun.showError.title"));
510
+ return void 0;
511
+ }
512
+ }
513
+ function consolidateRunDataAndStartNodes(directParentNodes, runData, pinData, workflow) {
514
+ const startNodeNames = /* @__PURE__ */ new Set();
515
+ let newRunData;
516
+ if (runData !== null && Object.keys(runData).length !== 0) {
517
+ newRunData = {};
518
+ for (const directParentNode of directParentNodes) {
519
+ const parentNodes = workflow.getParentNodes(directParentNode, NodeConnectionType.Main);
520
+ if (workflow.nodes[directParentNode].disabled) continue;
521
+ parentNodes.push(directParentNode);
522
+ for (const parentNode of parentNodes) {
523
+ if (!runData[parentNode]?.length && !pinData?.[parentNode]?.length || runData[parentNode]?.[0]?.error !== void 0) {
524
+ startNodeNames.add(parentNode);
525
+ break;
526
+ }
527
+ if (runData[parentNode] && !runData[parentNode]?.[0]?.error) {
528
+ newRunData[parentNode] = runData[parentNode]?.slice(0, 1);
529
+ }
530
+ }
531
+ }
532
+ if (isEmpty(newRunData)) {
533
+ newRunData = void 0;
534
+ }
535
+ }
536
+ return { runData: newRunData, startNodeNames: [...startNodeNames] };
537
+ }
538
+ async function stopCurrentExecution() {
539
+ const executionId = workflowsStore.activeExecutionId;
540
+ if (executionId === null) {
541
+ return;
542
+ }
543
+ try {
544
+ await executionsStore.stopCurrentExecution(executionId);
545
+ } catch (error) {
546
+ const execution = await workflowsStore.getExecution(executionId);
547
+ if (execution === void 0) {
548
+ toast.showMessage({
549
+ title: i18n.baseText("nodeView.showMessage.stopExecutionCatch.unsaved.title"),
550
+ message: i18n.baseText("nodeView.showMessage.stopExecutionCatch.unsaved.message"),
551
+ type: "success"
552
+ });
553
+ } else if (execution?.finished) {
554
+ const executedData = {
555
+ data: execution.data,
556
+ finished: execution.finished,
557
+ mode: execution.mode,
558
+ startedAt: execution.startedAt,
559
+ stoppedAt: execution.stoppedAt
560
+ };
561
+ workflowsStore.setWorkflowExecutionData(executedData);
562
+ toast.showMessage({
563
+ title: i18n.baseText("nodeView.showMessage.stopExecutionCatch.title"),
564
+ message: i18n.baseText("nodeView.showMessage.stopExecutionCatch.message"),
565
+ type: "success"
566
+ });
567
+ } else {
568
+ toast.showError(error, i18n.baseText("nodeView.showError.stopExecution.title"));
569
+ }
570
+ } finally {
571
+ workflowsStore.markExecutionAsStopped();
572
+ }
573
+ }
574
+ async function stopWaitingForWebhook() {
575
+ try {
576
+ await workflowsStore.removeTestWebhook(workflowsStore.workflowId);
577
+ } catch (error) {
578
+ toast.showError(error, i18n.baseText("nodeView.showError.stopWaitingForWebhook.title"));
579
+ return;
580
+ }
581
+ }
582
+ async function runEntireWorkflow(source, triggerNode) {
583
+ const workflow = workflowHelpers.getCurrentWorkflow();
584
+ void workflowHelpers.getWorkflowDataToSave().then((workflowData) => {
585
+ const telemetryPayload = {
586
+ workflow_id: workflow.id,
587
+ node_graph_string: JSON.stringify(
588
+ generateNodesGraph(
589
+ workflowData,
590
+ workflowHelpers.getNodeTypes(),
591
+ { isCloudDeployment: settingsStore.isCloudDeployment }
592
+ ).nodeGraph
593
+ ),
594
+ button_type: source
595
+ };
596
+ telemetry.track("User clicked execute workflow button", telemetryPayload);
597
+ void externalHooks.run("nodeView.onRunWorkflow", telemetryPayload);
598
+ });
599
+ void runWorkflow({ triggerNode });
600
+ }
601
+ return {
602
+ consolidateRunDataAndStartNodes,
603
+ runEntireWorkflow,
604
+ runWorkflow,
605
+ runWorkflowApi,
606
+ stopCurrentExecution,
607
+ stopWaitingForWebhook
608
+ };
609
+ }
610
+ export {
611
+ useRunWorkflow as a,
612
+ useNodeType as b,
613
+ capitalize as c,
614
+ upperFirst as d,
615
+ usePinnedData as u
616
+ };
@@ -1,4 +1,4 @@
1
- import { r as ref, b as useRouter, a4 as useWorkflowHelpers, T as useWorkflowsStore, K as useUIStore, a as useToast, a2 as useNpsSurveyStore, X as PLACEHOLDER_EMPTY_WORKFLOW_ID, aT as useExternalHooks, aI as useStorage, gg as LOCAL_STORAGE_ACTIVATION_FLAG, gh as WORKFLOW_ACTIVE_MODAL_KEY, aj as useTelemetry, g as useI18n } from "./index-BwoviwZU.js";
1
+ import { r as ref, b as useRouter, a4 as useWorkflowHelpers, T as useWorkflowsStore, K as useUIStore, a as useToast, a2 as useNpsSurveyStore, X as PLACEHOLDER_EMPTY_WORKFLOW_ID, aT as useExternalHooks, aI as useStorage, gf as LOCAL_STORAGE_ACTIVATION_FLAG, gg as WORKFLOW_ACTIVE_MODAL_KEY, aj as useTelemetry, g as useI18n } from "./index-DCrfHAqy.js";
2
2
  function useWorkflowActivate() {
3
3
  const updatingWorkflowActivation = ref(false);
4
4
  const router = useRouter();
package/dist/index.html CHANGED
@@ -16,8 +16,8 @@
16
16
  <script>!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled getFeatureFlag onFeatureFlags reloadFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[])</script>
17
17
 
18
18
  <title>n8n.io - Workflow Automation</title>
19
- <script type="module" crossorigin src="/{{BASE_PATH}}/assets/index-BwoviwZU.js"></script>
20
- <link rel="stylesheet" crossorigin href="/{{BASE_PATH}}/assets/index-DFFkAkMx.css">
19
+ <script type="module" crossorigin src="/{{BASE_PATH}}/assets/index-DCrfHAqy.js"></script>
20
+ <link rel="stylesheet" crossorigin href="/{{BASE_PATH}}/assets/index-xKO0gQfI.css">
21
21
  </head>
22
22
  <body>
23
23
  <noscript>
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-editor-ui",
3
- "version": "1.78.0",
3
+ "version": "1.79.1",
4
4
  "description": "Workflow Editor UI for n8n",
5
5
  "main": "index.js",
6
6
  "license": "SEE LICENSE IN LICENSE.md",