@revenexx/studio-integrations 1.1.1 → 1.3.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/CHANGELOG.md +638 -0
  2. package/README.md +3 -1
  3. package/dist/module.json +1 -1
  4. package/dist/runtime/components/Integrations/CredentialCreateDialog.vue +6 -18
  5. package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +13 -23
  6. package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue +7 -6
  7. package/dist/runtime/components/Integrations/DeadLettersPanel.vue +15 -4
  8. package/dist/runtime/components/Integrations/ExpressionInput.d.vue.ts +4 -0
  9. package/dist/runtime/components/Integrations/ExpressionInput.vue +45 -19
  10. package/dist/runtime/components/Integrations/ExpressionInput.vue.d.ts +4 -0
  11. package/dist/runtime/components/Integrations/GroupFrameView.vue +5 -4
  12. package/dist/runtime/components/Integrations/LoadingAnnouncement.d.vue.ts +38 -0
  13. package/dist/runtime/components/Integrations/LoadingAnnouncement.vue +16 -0
  14. package/dist/runtime/components/Integrations/LoadingAnnouncement.vue.d.ts +38 -0
  15. package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue +10 -2
  16. package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +5 -1
  17. package/dist/runtime/components/Integrations/NodeConfigField.vue +88 -1
  18. package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +5 -1
  19. package/dist/runtime/components/Integrations/NodeInspector.d.vue.ts +7 -3
  20. package/dist/runtime/components/Integrations/NodeInspector.vue +125 -54
  21. package/dist/runtime/components/Integrations/NodeInspector.vue.d.ts +7 -3
  22. package/dist/runtime/components/Integrations/NodeVersionMoveDialog.d.vue.ts +21 -0
  23. package/dist/runtime/components/Integrations/NodeVersionMoveDialog.vue +133 -0
  24. package/dist/runtime/components/Integrations/NodeVersionMoveDialog.vue.d.ts +21 -0
  25. package/dist/runtime/components/Integrations/RunActionsMenu.vue +2 -1
  26. package/dist/runtime/components/Integrations/RunDetailPanel.vue +5 -17
  27. package/dist/runtime/components/Integrations/RunResponseModal.d.vue.ts +30 -8
  28. package/dist/runtime/components/Integrations/RunResponseModal.vue +92 -24
  29. package/dist/runtime/components/Integrations/RunResponseModal.vue.d.ts +30 -8
  30. package/dist/runtime/components/Integrations/RunsTable.d.vue.ts +61 -3
  31. package/dist/runtime/components/Integrations/RunsTable.vue +129 -18
  32. package/dist/runtime/components/Integrations/RunsTable.vue.d.ts +61 -3
  33. package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue +10 -1
  34. package/dist/runtime/components/Integrations/StateNamespaceCreateDialog.d.vue.ts +16 -0
  35. package/dist/runtime/components/Integrations/StateNamespaceCreateDialog.vue +111 -0
  36. package/dist/runtime/components/Integrations/StateNamespaceCreateDialog.vue.d.ts +16 -0
  37. package/dist/runtime/components/Integrations/StickyNoteView.vue +1 -1
  38. package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +18 -3
  39. package/dist/runtime/components/Integrations/WorkflowDeleteDialog.d.vue.ts +18 -0
  40. package/dist/runtime/components/Integrations/WorkflowDeleteDialog.vue +70 -0
  41. package/dist/runtime/components/Integrations/WorkflowDeleteDialog.vue.d.ts +18 -0
  42. package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue +2 -1
  43. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue +4 -4
  44. package/dist/runtime/components/Integrations/WorkflowEditor.vue +78 -30
  45. package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue +17 -6
  46. package/dist/runtime/components/Integrations/WorkflowNodeView.vue +17 -21
  47. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +8 -11
  48. package/dist/runtime/components/Integrations/WorkflowStateNamespacesDialog.d.vue.ts +13 -0
  49. package/dist/runtime/components/Integrations/WorkflowStateNamespacesDialog.vue +216 -0
  50. package/dist/runtime/components/Integrations/WorkflowStateNamespacesDialog.vue.d.ts +13 -0
  51. package/dist/runtime/components/Integrations/WorkflowTriggerView.vue +6 -7
  52. package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue +7 -7
  53. package/dist/runtime/components/Integrations/WorkflowsTable.vue +10 -48
  54. package/dist/runtime/components/Integrations/canvasSides.d.ts +48 -0
  55. package/dist/runtime/components/Integrations/canvasSides.js +22 -0
  56. package/dist/runtime/composables/useCredentialTypes.js +2 -6
  57. package/dist/runtime/composables/useIntegrationsAudit.js +2 -2
  58. package/dist/runtime/composables/useIntegrationsCredentials.js +4 -8
  59. package/dist/runtime/composables/useIntegrationsDeadLetters.d.ts +4 -0
  60. package/dist/runtime/composables/useIntegrationsDeadLetters.js +16 -1
  61. package/dist/runtime/composables/useIntegrationsNodes.js +2 -2
  62. package/dist/runtime/composables/useIntegrationsRevisions.js +2 -6
  63. package/dist/runtime/composables/useIntegrationsRuns.d.ts +4 -15
  64. package/dist/runtime/composables/useIntegrationsRuns.js +49 -34
  65. package/dist/runtime/composables/useIntegrationsSchedules.js +2 -2
  66. package/dist/runtime/composables/useIntegrationsSecrets.js +2 -6
  67. package/dist/runtime/composables/useIntegrationsTemplates.js +7 -5
  68. package/dist/runtime/composables/useIntegrationsTriggers.js +2 -2
  69. package/dist/runtime/composables/useIntegrationsWorkflows.js +10 -7
  70. package/dist/runtime/composables/useNodeConfigResolve.js +2 -2
  71. package/dist/runtime/composables/useOAuthConnect.d.ts +42 -0
  72. package/dist/runtime/composables/useOAuthConnect.js +33 -0
  73. package/dist/runtime/data/expressionEditor.d.ts +17 -5
  74. package/dist/runtime/data/expressionEditor.js +11 -5
  75. package/dist/runtime/data/handleId.d.ts +61 -1
  76. package/dist/runtime/data/handleId.js +8 -1
  77. package/dist/runtime/data/integrationNodeCatalog.d.ts +25 -0
  78. package/dist/runtime/data/integrationNodeCatalog.js +8 -0
  79. package/dist/runtime/data/nodeVersionMove.d.ts +72 -0
  80. package/dist/runtime/data/nodeVersionMove.js +65 -0
  81. package/dist/runtime/data/payloadForm.js +3 -2
  82. package/dist/runtime/i18n/messages/de.json +79 -12
  83. package/dist/runtime/i18n/messages/en.json +79 -12
  84. package/dist/runtime/pages/integrations/audit.vue +7 -6
  85. package/dist/runtime/pages/integrations/credentials.vue +9 -21
  86. package/dist/runtime/pages/integrations/index.vue +55 -8
  87. package/dist/runtime/pages/integrations/runs.vue +116 -7
  88. package/dist/runtime/pages/integrations/secrets.vue +2 -1
  89. package/dist/runtime/pages/integrations/templates/[slug].vue +2 -1
  90. package/dist/runtime/pages/integrations/templates/index.vue +18 -15
  91. package/dist/runtime/pages/integrations/workflows/[id].vue +169 -24
  92. package/dist/runtime/pages/integrations/workflows/index.vue +23 -4
  93. package/dist/runtime/types/integrations.d.ts +49 -1
  94. package/dist/runtime/utils/apiError.d.ts +21 -1
  95. package/dist/runtime/utils/apiError.js +1 -1
  96. package/dist/runtime/utils/buildSettle.d.ts +68 -0
  97. package/dist/runtime/utils/buildSettle.js +29 -0
  98. package/dist/runtime/utils/clipboard.d.ts +33 -0
  99. package/dist/runtime/utils/clipboard.js +11 -0
  100. package/dist/runtime/utils/deepClone.d.ts +41 -0
  101. package/dist/runtime/utils/deepClone.js +3 -0
  102. package/dist/runtime/utils/formatDuration.d.ts +44 -0
  103. package/dist/runtime/utils/formatDuration.js +13 -0
  104. package/dist/runtime/utils/nodeDisplayName.d.ts +22 -0
  105. package/dist/runtime/utils/nodeDisplayName.js +6 -0
  106. package/dist/runtime/utils/notify.d.ts +1 -1
  107. package/dist/runtime/utils/runEnvelope.d.ts +31 -0
  108. package/dist/runtime/utils/runEnvelope.js +12 -0
  109. package/dist/runtime/utils/runFeedQuery.d.ts +135 -0
  110. package/dist/runtime/utils/runFeedQuery.js +66 -0
  111. package/dist/runtime/utils/runOutputs.d.ts +33 -0
  112. package/dist/runtime/utils/runOutputs.js +10 -0
  113. package/dist/runtime/utils/settingCondition.d.ts +48 -0
  114. package/dist/runtime/utils/settingCondition.js +84 -0
  115. package/dist/runtime/utils/stateNamespaceName.d.ts +23 -0
  116. package/dist/runtime/utils/stateNamespaceName.js +8 -0
  117. package/dist/runtime/utils/validationFindings.d.ts +26 -3
  118. package/dist/runtime/utils/validationFindings.js +18 -3
  119. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The engine's grammar for a state namespace (PO-374), mirrored in the browser
3
+ * so a name it would refuse is rejected while the author types rather than as a
4
+ * 422 about `blob.state.0` on save.
5
+ *
6
+ * One copy on purpose. Two surfaces declare namespaces — the workflow's State
7
+ * dialog and the picker inside a node's state setting — and a grammar spelled
8
+ * once per surface is one that widens or narrows in a single place, leaving the
9
+ * other accepting names the engine has stopped taking.
10
+ */
11
+ export declare const STATE_NAMESPACE_PATTERN: RegExp;
12
+ /**
13
+ * Which message a typed namespace name earns, as a translation key — or `null`
14
+ * when there is nothing to say. Both callers show the same sentence for the same
15
+ * mistake, which is the other half of holding the grammar in one place.
16
+ *
17
+ * An empty field returns `null`: nobody has answered yet, and a rejection shown
18
+ * before the first keystroke reads as a rejection of the dialog.
19
+ *
20
+ * @param name what the author has typed, trimmed here rather than by the caller
21
+ * @param taken the names the workflow already declares
22
+ */
23
+ export declare function stateNamespaceErrorKey(name: string, taken: string[]): string | null;
@@ -0,0 +1,8 @@
1
+ export const STATE_NAMESPACE_PATTERN = /^[a-z][a-z0-9]*([._-][a-z0-9]+)*$/;
2
+ export function stateNamespaceErrorKey(name, taken) {
3
+ const value = name.trim();
4
+ if (!value) return null;
5
+ if (!STATE_NAMESPACE_PATTERN.test(value)) return "integration.workflows.state.error.invalidName";
6
+ if (taken.includes(value)) return "integration.workflows.state.error.nameExists";
7
+ return null;
8
+ }
@@ -38,8 +38,10 @@ export interface FindingNodeGroup {
38
38
  /** The node's human label; `null` when `nodeId` is. */
39
39
  label: string | null;
40
40
  /**
41
- * One compact entry per finding, in order and de-duplicated: the config key
42
- * the path ends in, falling back to the message when the path carries none.
41
+ * One compact entry per finding, in order and de-duplicated by config key: the
42
+ * setting's name as `fieldLabelOf` gives it — the manifest's label for the banner,
43
+ * the bare key where a caller asks for that — falling back to the message when the
44
+ * path carries no config key at all.
43
45
  * **Empty when `nodeId` is `null`** — read `messages` instead.
44
46
  */
45
47
  fields: string[];
@@ -53,6 +55,27 @@ export interface FindingNodeGroup {
53
55
  * two of them prints `revenexx:business-central-create-customer` at the user.
54
56
  */
55
57
  export declare function nodeDisplayLabel(node: WorkflowNode): string;
58
+ /**
59
+ * What a setting is called, for somebody reading *about* it.
60
+ *
61
+ * The same lookup {@link nodeDisplayLabel} does for the node, one level down: the
62
+ * manifest carries a bilingual `label` per config field, and the node's own settings
63
+ * form already renders it. The banner did not ask, so it printed the blob path's last
64
+ * segment — `companyId` beside a form that says **Firma**, in an otherwise German
65
+ * screen, for the same field (PO-401).
66
+ *
67
+ * **The key is the fallback and never the wrong answer.** A workflow can outlive the
68
+ * manifest version it was saved against, and a package can be gone entirely; then there
69
+ * is no label to resolve, and the raw key is worse to read but still names the setting
70
+ * the operator has to find. Falling back to the finding's *message* — what this module
71
+ * does for a finding with no field key at all — was refused here: it turns a short list
72
+ * of names into a list of sentences exactly when the banner is already hardest to read.
73
+ *
74
+ * **For reading about, not for finding by.** `findingsByNodeField` deliberately does NOT
75
+ * use this. Its keys are how the configuration dialog attaches a message to an input, so
76
+ * a translated one would stop matching the field it belongs to.
77
+ */
78
+ export declare function fieldDisplayLabel(node: WorkflowNode, fieldKey: string): string;
56
79
  /**
57
80
  * The setting a finding is about: the config key its path ends in.
58
81
  *
@@ -71,7 +94,7 @@ export declare function findingFieldKey(path: string): string | null;
71
94
  * `null` nodeId), rendered after the node groups — it has no node to hide
72
95
  * behind, and dropping it would lose an issue the user has to fix.
73
96
  */
74
- export declare function groupFindingsByNode(findings: readonly ValidationFinding[], nodes: readonly WorkflowNode[], labelOf?: (node: WorkflowNode) => string): FindingNodeGroup[];
97
+ export declare function groupFindingsByNode(findings: readonly ValidationFinding[], nodes: readonly WorkflowNode[], labelOf?: (node: WorkflowNode) => string, fieldLabelOf?: (node: WorkflowNode, fieldKey: string) => string): FindingNodeGroup[];
75
98
  /**
76
99
  * Node id → config key → the message to show AT that setting
77
100
  * (specs/node-configuration.md AC-8).
@@ -5,6 +5,11 @@ export function nodeDisplayLabel(node) {
5
5
  const manifest = findManifest(node.nodeSlug, node.nodeVersion);
6
6
  return resolveLocalized(node.name) || resolveLocalized(manifest?.name) || node.nodeSlug;
7
7
  }
8
+ export function fieldDisplayLabel(node, fieldKey) {
9
+ const manifest = findManifest(node.nodeSlug, node.nodeVersion);
10
+ const field = manifest?.config?.find((f) => f.key === fieldKey);
11
+ return resolveLocalized(field?.label) || fieldKey;
12
+ }
8
13
  export function findingFieldKey(path) {
9
14
  const m = /^blob\.nodes\.\d+\.config\.([^.[]+)/.exec(path);
10
15
  return m ? m[1] : null;
@@ -13,10 +18,11 @@ function findingNode(path, nodes) {
13
18
  const m = /^blob\.nodes\.(\d+)\b/.exec(path);
14
19
  return m ? nodes[Number(m[1])] : void 0;
15
20
  }
16
- export function groupFindingsByNode(findings, nodes, labelOf = nodeDisplayLabel) {
21
+ export function groupFindingsByNode(findings, nodes, labelOf = nodeDisplayLabel, fieldLabelOf = fieldDisplayLabel) {
17
22
  const nodeGroups = [];
18
23
  const orphans = [];
19
24
  const byNodeId = /* @__PURE__ */ new Map();
25
+ const seenKeys = /* @__PURE__ */ new Map();
20
26
  for (const finding of findings) {
21
27
  const node = findingNode(finding.path, nodes);
22
28
  if (!node) {
@@ -29,8 +35,17 @@ export function groupFindingsByNode(findings, nodes, labelOf = nodeDisplayLabel)
29
35
  byNodeId.set(node.id, group);
30
36
  nodeGroups.push(group);
31
37
  }
32
- const field = findingFieldKey(finding.path) ?? finding.message;
33
- if (!group.fields.includes(field)) group.fields.push(field);
38
+ const key = findingFieldKey(finding.path);
39
+ if (key === null) {
40
+ if (!group.fields.includes(finding.message)) group.fields.push(finding.message);
41
+ } else {
42
+ const seen = seenKeys.get(node.id) ?? /* @__PURE__ */ new Set();
43
+ seenKeys.set(node.id, seen);
44
+ if (!seen.has(key)) {
45
+ seen.add(key);
46
+ group.fields.push(fieldLabelOf(node, key));
47
+ }
48
+ }
34
49
  group.messages.push(finding.message);
35
50
  }
36
51
  return [...nodeGroups, ...orphans];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revenexx/studio-integrations",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "description": "Integration Studio (core: workflows, node editor, runs, schedules, credentials, secrets, audit) as a standalone, publishable Nuxt module.",
6
6
  "repository": {