@revenexx/studio-integrations 0.5.1 → 0.7.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 (171) hide show
  1. package/CHANGELOG.md +428 -0
  2. package/README.md +48 -4
  3. package/dist/module.d.mts +17 -1
  4. package/dist/module.json +1 -1
  5. package/dist/module.mjs +10 -2
  6. package/dist/runtime/components/Integrations/CredentialCreateDialog.vue +43 -41
  7. package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +123 -50
  8. package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue +108 -71
  9. package/dist/runtime/components/Integrations/CredentialTypePicker.vue +12 -15
  10. package/dist/runtime/components/Integrations/DeadLettersPanel.vue +18 -17
  11. package/dist/runtime/components/Integrations/EventTypeCombobox.d.vue.ts +1 -0
  12. package/dist/runtime/components/Integrations/EventTypeCombobox.vue +7 -4
  13. package/dist/runtime/components/Integrations/EventTypeCombobox.vue.d.ts +1 -0
  14. package/dist/runtime/components/Integrations/ExpressionInput.d.vue.ts +4 -0
  15. package/dist/runtime/components/Integrations/ExpressionInput.vue +67 -37
  16. package/dist/runtime/components/Integrations/ExpressionInput.vue.d.ts +4 -0
  17. package/dist/runtime/components/Integrations/GroupFrameView.vue +30 -20
  18. package/dist/runtime/components/Integrations/Layout.vue +48 -4
  19. package/dist/runtime/components/Integrations/NodeConfigDynamicField.vue +23 -23
  20. package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue +11 -13
  21. package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +2 -0
  22. package/dist/runtime/components/Integrations/NodeConfigField.vue +187 -93
  23. package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +2 -0
  24. package/dist/runtime/components/Integrations/NodeInspector.d.vue.ts +6 -0
  25. package/dist/runtime/components/Integrations/NodeInspector.vue +1157 -376
  26. package/dist/runtime/components/Integrations/NodeInspector.vue.d.ts +6 -0
  27. package/dist/runtime/components/Integrations/NodeLogo.d.vue.ts +12 -0
  28. package/dist/runtime/components/Integrations/NodeLogo.vue +2 -30
  29. package/dist/runtime/components/Integrations/NodeLogo.vue.d.ts +12 -0
  30. package/dist/runtime/components/Integrations/NodeMark.d.vue.ts +15 -0
  31. package/dist/runtime/components/Integrations/NodeMark.vue +79 -0
  32. package/dist/runtime/components/Integrations/NodeMark.vue.d.ts +15 -0
  33. package/dist/runtime/components/Integrations/NodeOutputSchema.d.vue.ts +21 -0
  34. package/dist/runtime/components/Integrations/NodeOutputSchema.vue +43 -0
  35. package/dist/runtime/components/Integrations/NodeOutputSchema.vue.d.ts +21 -0
  36. package/dist/runtime/components/Integrations/NodePalette.vue +122 -55
  37. package/dist/runtime/components/Integrations/QueryBuilder.vue +46 -38
  38. package/dist/runtime/components/Integrations/RunActionsMenu.vue +38 -12
  39. package/dist/runtime/components/Integrations/RunDetailPanel.vue +114 -62
  40. package/dist/runtime/components/Integrations/RunPayloadInput.vue +27 -13
  41. package/dist/runtime/components/Integrations/RunResponseModal.vue +11 -10
  42. package/dist/runtime/components/Integrations/RunsTable.d.vue.ts +0 -1
  43. package/dist/runtime/components/Integrations/RunsTable.vue +38 -16
  44. package/dist/runtime/components/Integrations/RunsTable.vue.d.ts +0 -1
  45. package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue +8 -7
  46. package/dist/runtime/components/Integrations/Sidebar.vue +14 -10
  47. package/dist/runtime/components/Integrations/StickyNoteView.d.vue.ts +14 -4
  48. package/dist/runtime/components/Integrations/StickyNoteView.vue +38 -23
  49. package/dist/runtime/components/Integrations/StickyNoteView.vue.d.ts +14 -4
  50. package/dist/runtime/components/Integrations/TemplateCard.d.vue.ts +18 -0
  51. package/dist/runtime/components/Integrations/TemplateCard.vue +119 -0
  52. package/dist/runtime/components/Integrations/TemplateCard.vue.d.ts +18 -0
  53. package/dist/runtime/components/Integrations/TemplateFlowPreview.d.vue.ts +2 -2
  54. package/dist/runtime/components/Integrations/TemplateFlowPreview.vue +16 -18
  55. package/dist/runtime/components/Integrations/TemplateFlowPreview.vue.d.ts +2 -2
  56. package/dist/runtime/components/Integrations/WorkflowContextMenu.vue +34 -33
  57. package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +52 -67
  58. package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue +8 -7
  59. package/dist/runtime/components/Integrations/WorkflowEdgeView.d.vue.ts +18 -4
  60. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue +29 -11
  61. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue.d.ts +18 -4
  62. package/dist/runtime/components/Integrations/WorkflowEditor.d.vue.ts +20 -1
  63. package/dist/runtime/components/Integrations/WorkflowEditor.vue +240 -116
  64. package/dist/runtime/components/Integrations/WorkflowEditor.vue.d.ts +20 -1
  65. package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue +28 -43
  66. package/dist/runtime/components/Integrations/WorkflowIconPicker.d.vue.ts +19 -1
  67. package/dist/runtime/components/Integrations/WorkflowIconPicker.vue +17 -7
  68. package/dist/runtime/components/Integrations/WorkflowIconPicker.vue.d.ts +19 -1
  69. package/dist/runtime/components/Integrations/WorkflowNodeView.d.vue.ts +4 -0
  70. package/dist/runtime/components/Integrations/WorkflowNodeView.vue +198 -56
  71. package/dist/runtime/components/Integrations/WorkflowNodeView.vue.d.ts +4 -0
  72. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +56 -59
  73. package/dist/runtime/components/Integrations/WorkflowSettingsDialog.vue +28 -21
  74. package/dist/runtime/components/Integrations/WorkflowTagsInput.d.vue.ts +1 -0
  75. package/dist/runtime/components/Integrations/WorkflowTagsInput.vue +15 -9
  76. package/dist/runtime/components/Integrations/WorkflowTagsInput.vue.d.ts +1 -0
  77. package/dist/runtime/components/Integrations/WorkflowTriggerView.vue +15 -10
  78. package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue +50 -36
  79. package/dist/runtime/components/Integrations/WorkflowsTable.vue +126 -48
  80. package/dist/runtime/composables/integrationsApi.js +4 -2
  81. package/dist/runtime/composables/useCredentialTypes.js +8 -6
  82. package/dist/runtime/composables/useIntegrationsAudit.js +4 -3
  83. package/dist/runtime/composables/useIntegrationsCredentials.js +10 -8
  84. package/dist/runtime/composables/useIntegrationsDeadLetters.js +7 -6
  85. package/dist/runtime/composables/useIntegrationsFocus.d.ts +12 -0
  86. package/dist/runtime/composables/useIntegrationsLocale.d.ts +26 -0
  87. package/dist/runtime/composables/useIntegrationsLocale.js +8 -0
  88. package/dist/runtime/composables/useIntegrationsNodes.js +7 -5
  89. package/dist/runtime/composables/useIntegrationsRealtime.d.ts +149 -0
  90. package/dist/runtime/composables/useIntegrationsRealtime.js +80 -0
  91. package/dist/runtime/composables/useIntegrationsRevisions.js +9 -7
  92. package/dist/runtime/composables/useIntegrationsRuns.d.ts +1 -1
  93. package/dist/runtime/composables/useIntegrationsRuns.js +14 -7
  94. package/dist/runtime/composables/useIntegrationsSchedules.d.ts +4 -0
  95. package/dist/runtime/composables/useIntegrationsSchedules.js +10 -3
  96. package/dist/runtime/composables/useIntegrationsSecrets.js +14 -9
  97. package/dist/runtime/composables/useIntegrationsT.d.ts +35 -0
  98. package/dist/runtime/composables/useIntegrationsT.js +9 -0
  99. package/dist/runtime/composables/useIntegrationsTemplates.d.ts +3 -3
  100. package/dist/runtime/composables/useIntegrationsTemplates.js +28 -16
  101. package/dist/runtime/composables/useIntegrationsTriggers.js +10 -8
  102. package/dist/runtime/composables/useIntegrationsWorkflows.js +13 -7
  103. package/dist/runtime/composables/useLoadGate.d.ts +17 -0
  104. package/dist/runtime/composables/useLoadGate.js +8 -0
  105. package/dist/runtime/composables/useNodeConfigResolve.js +2 -1
  106. package/dist/runtime/data/branchReorder.d.ts +37 -0
  107. package/dist/runtime/data/branchReorder.js +71 -0
  108. package/dist/runtime/data/handleId.d.ts +23 -0
  109. package/dist/runtime/data/handleId.js +6 -0
  110. package/dist/runtime/data/integrationNodeCatalog.d.ts +41 -0
  111. package/dist/runtime/data/integrationNodeCatalog.js +14 -0
  112. package/dist/runtime/data/integrationTemplates.d.ts +48 -0
  113. package/dist/runtime/data/integrationTemplates.js +21 -0
  114. package/dist/runtime/data/integrationWorkflowSamples.js +1 -1
  115. package/dist/runtime/data/nodeIcons.d.ts +2 -0
  116. package/dist/runtime/data/nodeIcons.js +73 -0
  117. package/dist/runtime/data/nodeInputData.d.ts +16 -4
  118. package/dist/runtime/data/nodeInputData.js +4 -0
  119. package/dist/runtime/data/payloadForm.d.ts +9 -2
  120. package/dist/runtime/data/payloadForm.js +29 -4
  121. package/dist/runtime/data/portTone.d.ts +17 -0
  122. package/dist/runtime/data/portTone.js +7 -0
  123. package/dist/runtime/data/webhookAuth.d.ts +18 -0
  124. package/dist/runtime/data/webhookAuth.js +19 -0
  125. package/dist/runtime/data/workflowIconCatalog.js +4 -6
  126. package/dist/runtime/i18n/messages/de.json +1207 -0
  127. package/dist/runtime/i18n/messages/en.json +1207 -0
  128. package/dist/runtime/i18n/translate.d.ts +83 -0
  129. package/dist/runtime/i18n/translate.js +41 -0
  130. package/dist/runtime/pages/integrations/audit.vue +140 -37
  131. package/dist/runtime/pages/integrations/credentials/oauth-complete.vue +9 -6
  132. package/dist/runtime/pages/integrations/credentials.vue +180 -64
  133. package/dist/runtime/pages/integrations/index.vue +91 -92
  134. package/dist/runtime/pages/integrations/runs.vue +33 -21
  135. package/dist/runtime/pages/integrations/schedules.vue +88 -23
  136. package/dist/runtime/pages/integrations/secrets.vue +57 -35
  137. package/dist/runtime/pages/integrations/templates/[slug].vue +119 -88
  138. package/dist/runtime/pages/integrations/templates/index.vue +82 -103
  139. package/dist/runtime/pages/integrations/workflows/[id].vue +344 -91
  140. package/dist/runtime/pages/integrations/workflows/index.vue +23 -5
  141. package/dist/runtime/plugins/locale.d.ts +10 -0
  142. package/dist/runtime/plugins/locale.js +6 -0
  143. package/dist/runtime/plugins/realtime.client.d.ts +32 -0
  144. package/dist/runtime/plugins/realtime.client.js +4 -0
  145. package/dist/runtime/types/integrations.d.ts +65 -6
  146. package/dist/runtime/utils/apiError.d.ts +47 -0
  147. package/dist/runtime/utils/apiError.js +32 -0
  148. package/dist/runtime/utils/cockpitSources.d.ts +153 -0
  149. package/dist/runtime/utils/cockpitSources.js +14 -0
  150. package/dist/runtime/utils/credentialState.d.ts +24 -1
  151. package/dist/runtime/utils/credentialState.js +26 -11
  152. package/dist/runtime/utils/loadGate.d.ts +61 -0
  153. package/dist/runtime/utils/loadGate.js +22 -0
  154. package/dist/runtime/utils/localize.d.ts +46 -4
  155. package/dist/runtime/utils/localize.js +34 -7
  156. package/dist/runtime/utils/notify.d.ts +59 -0
  157. package/dist/runtime/utils/notify.js +21 -0
  158. package/dist/runtime/utils/pollBudget.d.ts +72 -0
  159. package/dist/runtime/utils/pollBudget.js +17 -0
  160. package/dist/runtime/utils/revenexxCredentialSource.d.ts +26 -0
  161. package/dist/runtime/utils/revenexxCredentialSource.js +8 -0
  162. package/dist/runtime/utils/schedule.d.ts +116 -0
  163. package/dist/runtime/utils/schedule.js +219 -0
  164. package/dist/runtime/utils/statusStyle.d.ts +26 -2
  165. package/dist/runtime/utils/statusStyle.js +9 -1
  166. package/dist/runtime/utils/validationFindings.d.ts +101 -0
  167. package/dist/runtime/utils/validationFindings.js +54 -0
  168. package/dist/runtime/utils/whenIdle.d.ts +42 -0
  169. package/dist/runtime/utils/whenIdle.js +12 -0
  170. package/dist/types.d.mts +2 -6
  171. package/package.json +10 -3
@@ -20,6 +20,12 @@ type __VLS_Props = {
20
20
  dynamicOutputs?: Record<string, NodeManifestOutput[]>;
21
21
  /** Workflow id — enables sampling real values from the latest run. */
22
22
  workflowId?: number | string;
23
+ /**
24
+ * Config key → why the LAST SAVE refused it. Not live validation: the server
25
+ * is the only judge, so a fix shows once it is saved. Absent for a node the
26
+ * last save had no complaint about.
27
+ */
28
+ refusedFields?: Record<string, string>;
23
29
  };
24
30
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
25
31
  close: () => any;
@@ -1,3 +1,15 @@
1
+ /**
2
+ * @deprecated Use `NodeMark` directly. This is a thin back-compat shim kept so
3
+ * that hosts still referencing the auto-registered `<IntegrationsNodeLogo>`
4
+ * (e.g. integrations/studio-ui `local-nodes.vue`) keep resolving the component
5
+ * after PO-194 renamed NodeLogo → NodeMark. Auto-registered components are
6
+ * public API surface for the hosts, so a silent delete breaks them at a
7
+ * different repo's build, invisible to this repo's CI.
8
+ *
9
+ * The old NodeLogo rendered "logo OR glyph, logo preferred" — exactly
10
+ * `NodeMark`'s `logo-only` behaviour (logo when present, glyph fallback). Drop
11
+ * this shim one release after the hosts have migrated to `NodeMark`.
12
+ */
1
13
  import type { NodeManifest } from '../../types/integrations.js';
2
14
  type __VLS_Props = {
3
15
  manifest: NodeManifest | null;
@@ -1,38 +1,10 @@
1
1
  <script setup>
2
- import { computed, ref, watch } from "vue";
3
- import * as Lucide from "lucide-vue-next";
4
- const props = defineProps({
2
+ defineProps({
5
3
  manifest: { type: [Object, null], required: true },
6
4
  size: { type: Number, required: false, default: 16 }
7
5
  });
8
- const failed = ref(false);
9
- watch(() => props.manifest?.slug, () => {
10
- failed.value = false;
11
- });
12
- const logoSrc = computed(() => {
13
- const imgs = props.manifest?.images ?? [];
14
- const logo = imgs.find((i) => i.category === "logo") ?? imgs[0];
15
- return logo?.src ?? null;
16
- });
17
- const glyph = computed(() => {
18
- const name = props.manifest?.icon;
19
- if (!name) return Lucide.Box;
20
- const cleaned = (name.includes(":") ? name.split(":").pop() : name).split("-").map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join("");
21
- return Lucide[cleaned] || Lucide.Box;
22
- });
23
6
  </script>
24
7
 
25
8
  <template>
26
- <img
27
- v-if="logoSrc && !failed"
28
- :src="logoSrc"
29
- :width="size"
30
- :height="size"
31
- class="shrink-0 rounded-[3px] object-contain"
32
- :style="{ width: `${size}px`, height: `${size}px` }"
33
- alt=""
34
- loading="lazy"
35
- @error="failed = true"
36
- >
37
- <component :is="glyph" v-else :size="size" />
9
+ <IntegrationsNodeMark :manifest="manifest" :size="size" logo-only />
38
10
  </template>
@@ -1,3 +1,15 @@
1
+ /**
2
+ * @deprecated Use `NodeMark` directly. This is a thin back-compat shim kept so
3
+ * that hosts still referencing the auto-registered `<IntegrationsNodeLogo>`
4
+ * (e.g. integrations/studio-ui `local-nodes.vue`) keep resolving the component
5
+ * after PO-194 renamed NodeLogo → NodeMark. Auto-registered components are
6
+ * public API surface for the hosts, so a silent delete breaks them at a
7
+ * different repo's build, invisible to this repo's CI.
8
+ *
9
+ * The old NodeLogo rendered "logo OR glyph, logo preferred" — exactly
10
+ * `NodeMark`'s `logo-only` behaviour (logo when present, glyph fallback). Drop
11
+ * this shim one release after the hosts have migrated to `NodeMark`.
12
+ */
1
13
  import type { NodeManifest } from '../../types/integrations.js';
2
14
  type __VLS_Props = {
3
15
  manifest: NodeManifest | null;
@@ -0,0 +1,15 @@
1
+ import type { NodeManifest } from '../../types/integrations.js';
2
+ type __VLS_Props = {
3
+ manifest: NodeManifest | null;
4
+ size?: number;
5
+ /** Render only the vendor logo (folder/group rows), never the glyph+badge composite. */
6
+ logoOnly?: boolean;
7
+ /** Overlay the vendor logo as a corner badge. Off in rows that already name the vendor. */
8
+ badge?: boolean;
9
+ };
10
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ size: number;
12
+ badge: boolean;
13
+ logoOnly: boolean;
14
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
+ export default _default;
@@ -0,0 +1,79 @@
1
+ <script setup>
2
+ import { computed, ref, watch } from "vue";
3
+ import { nodeIcon } from "../../data/nodeIcons";
4
+ const props = defineProps({
5
+ manifest: { type: [Object, null], required: true },
6
+ size: { type: Number, required: false, default: 16 },
7
+ logoOnly: { type: Boolean, required: false, default: false },
8
+ badge: { type: Boolean, required: false, default: true }
9
+ });
10
+ const failed = ref(false);
11
+ const { load: reloadCatalog } = useIntegrationsNodes();
12
+ const refreshed = ref(false);
13
+ watch(() => props.manifest?.slug, () => {
14
+ failed.value = false;
15
+ refreshed.value = false;
16
+ });
17
+ function onImageError() {
18
+ if (!refreshed.value) {
19
+ refreshed.value = true;
20
+ void reloadCatalog(true);
21
+ return;
22
+ }
23
+ failed.value = true;
24
+ }
25
+ function onImageLoad() {
26
+ refreshed.value = false;
27
+ }
28
+ const logoSrc = computed(() => {
29
+ const imgs = props.manifest?.images ?? [];
30
+ const logo = imgs.find((i) => i.category === "logo") ?? imgs[0];
31
+ return logo?.src ?? null;
32
+ });
33
+ const hasIcon = computed(() => typeof props.manifest?.icon === "string" && props.manifest.icon.trim() !== "");
34
+ const glyph = computed(() => nodeIcon(props.manifest?.icon));
35
+ const logoOk = computed(() => !!logoSrc.value && !failed.value);
36
+ const logoPrimary = computed(() => logoOk.value && (props.logoOnly || !hasIcon.value));
37
+ const composite = computed(() => props.badge && !props.logoOnly && logoOk.value && hasIcon.value);
38
+ const badgeSize = computed(() => Math.max(12, Math.round(props.size * 0.72)));
39
+ </script>
40
+
41
+ <template>
42
+ <!-- Logo as the primary mark (folder rows, or a node without its own glyph). -->
43
+ <img
44
+ v-if="logoPrimary"
45
+ :src="logoSrc"
46
+ :width="size"
47
+ :height="size"
48
+ class="shrink-0 rounded-[3px] object-contain"
49
+ :style="{ width: `${size}px`, height: `${size}px` }"
50
+ alt=""
51
+ loading="lazy"
52
+ @error="onImageError"
53
+ @load="onImageLoad"
54
+ >
55
+ <!-- Per-node glyph, with the vendor logo as a plated corner badge when present. -->
56
+ <span
57
+ v-else
58
+ class="relative inline-flex shrink-0"
59
+ :style="{ width: `${size}px`, height: `${size}px` }"
60
+ >
61
+ <component :is="glyph" :size="size" :stroke-width="2.25" />
62
+ <!-- The badge deliberately sits 3px OUTSIDE this box (integrations-ui
63
+ geometry): it overlaps the glyph's corner instead of shrinking the
64
+ glyph. Consequence for call sites — a chip hosting a mark has to leave
65
+ its overflow visible; an `overflow-hidden` wrapper clips the badge. -->
66
+ <img
67
+ v-if="composite"
68
+ :src="logoSrc"
69
+ :width="badgeSize"
70
+ :height="badgeSize"
71
+ class="absolute rounded-[3px] bg-white object-contain p-px ring-1 ring-black/10"
72
+ :style="{ width: `${badgeSize}px`, height: `${badgeSize}px`, right: '-3px', bottom: '-3px' }"
73
+ alt=""
74
+ loading="lazy"
75
+ @error="onImageError"
76
+ @load="onImageLoad"
77
+ >
78
+ </span>
79
+ </template>
@@ -0,0 +1,15 @@
1
+ import type { NodeManifest } from '../../types/integrations.js';
2
+ type __VLS_Props = {
3
+ manifest: NodeManifest | null;
4
+ size?: number;
5
+ /** Render only the vendor logo (folder/group rows), never the glyph+badge composite. */
6
+ logoOnly?: boolean;
7
+ /** Overlay the vendor logo as a corner badge. Off in rows that already name the vendor. */
8
+ badge?: boolean;
9
+ };
10
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ size: number;
12
+ badge: boolean;
13
+ logoOnly: boolean;
14
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import type { PortEntry } from '../../data/nodeInputData.js';
2
+ /**
3
+ * The ports a node hands downstream, with their declared fields and whatever
4
+ * sample value is known for each.
5
+ *
6
+ * Rendered from one place — the Output tab (specs/node-configuration.md AC-4). It
7
+ * keeps its own file for readability rather than for reuse: the schema list is
8
+ * a self-contained tree with its own type glyphs and sample formatting, and
9
+ * inlining it would bury the tab's own markup.
10
+ *
11
+ * It was briefly read from a second place, an always-visible summary strip
12
+ * above the form. That was AC-5, retired before it ever held — see the Gaps
13
+ * section of the spec. Do not go looking for the second call site.
14
+ */
15
+ type __VLS_Props = {
16
+ ports: PortEntry[];
17
+ /** Sample preview for a port, or for one field of it; null when unknown. */
18
+ valueAt: (port: string, field?: string) => string | null;
19
+ };
20
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
+ export default _default;
@@ -0,0 +1,43 @@
1
+ <script setup>
2
+ import { portDotClass } from "../../data/portTone";
3
+ defineProps({
4
+ ports: { type: Array, required: true },
5
+ valueAt: { type: Function, required: true }
6
+ });
7
+ const t = useIntegrationsT();
8
+ const TYPE_GLYPHS = {
9
+ string: { char: "A", cls: "text-sky-600" },
10
+ number: { char: "#", cls: "text-amber-600" },
11
+ integer: { char: "#", cls: "text-amber-600" },
12
+ boolean: { char: "\u2713", cls: "text-emerald-600" },
13
+ object: { char: "{}", cls: "text-violet-600" },
14
+ array: { char: "[]", cls: "text-violet-600" }
15
+ };
16
+ function typeGlyph(dataType) {
17
+ return dataType ? TYPE_GLYPHS[dataType] ?? null : null;
18
+ }
19
+ </script>
20
+
21
+ <template>
22
+ <div>
23
+ <div v-for="p in ports" :key="p.name" class="mb-3 space-y-1">
24
+ <div class="flex items-center gap-1.5">
25
+ <span class="size-1.5 rounded-full" :class="portDotClass(p.kind, p.name)" />
26
+ <span class="text-[10px] font-medium uppercase tracking-wider text-muted-foreground">{{ p.name }}</span>
27
+ </div>
28
+ <div v-if="p.fields.length" class="space-y-0.5">
29
+ <div v-for="f in p.fields" :key="f.name" class="flex min-w-0 items-baseline gap-1 font-mono text-[11px]">
30
+ <span v-if="typeGlyph(f.dataType)" class="shrink-0 font-semibold" :class="typeGlyph(f.dataType).cls">{{ typeGlyph(f.dataType).char }}</span>
31
+ <span class="shrink-0 text-slate-700">{{ f.name }}</span>
32
+ <span v-if="valueAt(p.name, f.name) !== null" class="min-w-0 truncate text-slate-400">: {{ valueAt(p.name, f.name) }}</span>
33
+ </div>
34
+ </div>
35
+ <p v-else class="text-[11px] leading-snug text-muted-foreground">
36
+ {{ t("integration.nodeInspector.output.schema.noFields") }}<template v-if="valueAt(p.name) !== null">{{ t("integration.nodeInspector.output.schema.sampledSuffix") }} <span class="font-mono">{{ valueAt(p.name) }}</span></template>.
37
+ </p>
38
+ </div>
39
+ <p v-if="!ports.length" class="text-xs leading-snug text-muted-foreground">
40
+ {{ t("integration.nodeInspector.output.schema.noOutputs") }}
41
+ </p>
42
+ </div>
43
+ </template>
@@ -0,0 +1,21 @@
1
+ import type { PortEntry } from '../../data/nodeInputData.js';
2
+ /**
3
+ * The ports a node hands downstream, with their declared fields and whatever
4
+ * sample value is known for each.
5
+ *
6
+ * Rendered from one place — the Output tab (specs/node-configuration.md AC-4). It
7
+ * keeps its own file for readability rather than for reuse: the schema list is
8
+ * a self-contained tree with its own type glyphs and sample formatting, and
9
+ * inlining it would bury the tab's own markup.
10
+ *
11
+ * It was briefly read from a second place, an always-visible summary strip
12
+ * above the form. That was AC-5, retired before it ever held — see the Gaps
13
+ * section of the spec. Do not go looking for the second call site.
14
+ */
15
+ type __VLS_Props = {
16
+ ports: PortEntry[];
17
+ /** Sample preview for a port, or for one field of it; null when unknown. */
18
+ valueAt: (port: string, field?: string) => string | null;
19
+ };
20
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
+ export default _default;