@uipath/maestro-builder-sdk 6.18.10 → 6.20.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 (134) hide show
  1. package/dist/api-index.md +185 -184
  2. package/dist/api-members.md +506 -473
  3. package/dist/check.js +358 -695
  4. package/dist/cli/commands/flow.js +3 -0
  5. package/dist/compile-cli.js +51 -0
  6. package/dist/core/actions.d.ts +132 -765
  7. package/dist/core/actions.js +1 -307
  8. package/dist/core/binding-identity.d.ts +22 -0
  9. package/dist/core/binding-identity.js +28 -0
  10. package/dist/core/context-index.d.ts +34 -0
  11. package/dist/core/context-index.js +38 -0
  12. package/dist/core/definitionless-node-types.d.ts +16 -0
  13. package/dist/core/definitionless-node-types.js +16 -0
  14. package/dist/core/error-port.d.ts +6 -0
  15. package/dist/core/error-port.js +9 -0
  16. package/dist/core/form-field-type.d.ts +33 -0
  17. package/dist/core/form-field-type.js +30 -0
  18. package/dist/core/hitl-routing.d.ts +8 -0
  19. package/dist/core/hitl-routing.js +17 -1
  20. package/dist/core/node-classes.d.ts +4 -63
  21. package/dist/core/node-classes.js +0 -112
  22. package/dist/core/nodes/family.d.ts +36 -0
  23. package/dist/core/nodes/family.js +1 -0
  24. package/dist/core/nodes/node-type.d.ts +136 -0
  25. package/dist/core/nodes/node-type.js +1 -0
  26. package/dist/core/nodes/registry.d.ts +57 -0
  27. package/dist/core/nodes/registry.js +122 -0
  28. package/dist/core/nodes/versioned.d.ts +50 -0
  29. package/dist/core/nodes/versioned.js +46 -0
  30. package/dist/core/process-resource-sort-order.d.ts +40 -0
  31. package/dist/core/process-resource-sort-order.js +44 -0
  32. package/dist/core/typed-raw-node.d.ts +13 -62
  33. package/dist/core/typed-raw-node.js +40 -154
  34. package/dist/core/wire-expr.d.ts +27 -0
  35. package/dist/core/wire-expr.js +34 -0
  36. package/dist/decompile-cli.js +11 -1
  37. package/dist/decompile.d.ts +8 -3
  38. package/dist/decompile.js +665 -354
  39. package/dist/flow-definitions.d.ts +10 -0
  40. package/dist/flow-definitions.js +35 -0
  41. package/dist/flow-expr-check.js +1 -1
  42. package/dist/flow-node-registry.d.ts +13 -0
  43. package/dist/flow-node-registry.js +19 -0
  44. package/dist/flow-node-type.d.ts +192 -0
  45. package/dist/flow-node-type.js +1 -0
  46. package/dist/flow-sdk.d.ts +40 -1
  47. package/dist/flow-sdk.js +29 -2
  48. package/dist/flow-step-tree.js +2 -1
  49. package/dist/index.d.ts +2 -1
  50. package/dist/index.js +1 -0
  51. package/dist/merge-cli.js +25 -8
  52. package/dist/merge-roundtrip.d.ts +81 -0
  53. package/dist/merge-roundtrip.js +404 -0
  54. package/dist/merge.d.ts +35 -6
  55. package/dist/merge.js +124 -24
  56. package/dist/node-placement.d.ts +93 -0
  57. package/dist/node-placement.js +163 -0
  58. package/dist/nodes/data-fabric/flow/check.d.ts +13 -0
  59. package/dist/nodes/data-fabric/flow/check.js +164 -0
  60. package/dist/nodes/data-fabric/flow/factories.d.ts +113 -0
  61. package/dist/nodes/data-fabric/flow/factories.js +134 -0
  62. package/dist/nodes/data-fabric/flow/family.d.ts +7 -0
  63. package/dist/nodes/data-fabric/flow/family.js +9 -0
  64. package/dist/nodes/data-fabric/flow/index.d.ts +8 -0
  65. package/dist/nodes/data-fabric/flow/index.js +8 -0
  66. package/dist/nodes/data-fabric/flow/raw.d.ts +32 -0
  67. package/dist/nodes/data-fabric/flow/raw.js +100 -0
  68. package/dist/nodes/data-fabric/flow/shared.d.ts +77 -0
  69. package/dist/nodes/data-fabric/flow/shared.js +174 -0
  70. package/dist/nodes/data-fabric/flow/spec.d.ts +238 -0
  71. package/dist/nodes/data-fabric/flow/spec.js +1 -0
  72. package/dist/nodes/data-fabric/flow/verbs.d.ts +29 -0
  73. package/dist/nodes/data-fabric/flow/verbs.js +239 -0
  74. package/dist/nodes/delay/flow/check.d.ts +16 -0
  75. package/dist/nodes/delay/flow/check.js +86 -0
  76. package/dist/nodes/delay/flow/factories.d.ts +28 -0
  77. package/dist/nodes/delay/flow/factories.js +38 -0
  78. package/dist/nodes/delay/flow/family.d.ts +3 -0
  79. package/dist/nodes/delay/flow/family.js +8 -0
  80. package/dist/nodes/delay/flow/index.d.ts +3 -0
  81. package/dist/nodes/delay/flow/index.js +3 -0
  82. package/dist/nodes/delay/flow/node-type.d.ts +13 -0
  83. package/dist/nodes/delay/flow/node-type.js +71 -0
  84. package/dist/nodes/delay/flow/spec.d.ts +43 -0
  85. package/dist/nodes/delay/flow/spec.js +16 -0
  86. package/dist/nodes/document/flow/factories.d.ts +27 -0
  87. package/dist/nodes/document/flow/factories.js +30 -0
  88. package/dist/nodes/document/flow/family.d.ts +3 -0
  89. package/dist/nodes/document/flow/family.js +7 -0
  90. package/dist/nodes/document/flow/index.d.ts +3 -0
  91. package/dist/nodes/document/flow/index.js +3 -0
  92. package/dist/nodes/document/flow/node-type.d.ts +14 -0
  93. package/dist/nodes/document/flow/node-type.js +150 -0
  94. package/dist/nodes/document/flow/spec.d.ts +65 -0
  95. package/dist/nodes/document/flow/spec.js +1 -0
  96. package/dist/nodes/mock/flow/factories.d.ts +51 -0
  97. package/dist/nodes/mock/flow/factories.js +47 -0
  98. package/dist/nodes/mock/flow/family.d.ts +3 -0
  99. package/dist/nodes/mock/flow/family.js +7 -0
  100. package/dist/nodes/mock/flow/index.d.ts +2 -0
  101. package/dist/nodes/mock/flow/index.js +2 -0
  102. package/dist/nodes/mock/flow/node-type.d.ts +11 -0
  103. package/dist/nodes/mock/flow/node-type.js +51 -0
  104. package/dist/nodes/script/flow/check.d.ts +19 -0
  105. package/dist/nodes/script/flow/check.js +49 -0
  106. package/dist/nodes/script/flow/factories.d.ts +14 -0
  107. package/dist/nodes/script/flow/factories.js +15 -0
  108. package/dist/nodes/script/flow/family.d.ts +3 -0
  109. package/dist/nodes/script/flow/family.js +8 -0
  110. package/dist/nodes/script/flow/index.d.ts +3 -0
  111. package/dist/nodes/script/flow/index.js +3 -0
  112. package/dist/nodes/script/flow/node-type.d.ts +7 -0
  113. package/dist/nodes/script/flow/node-type.js +125 -0
  114. package/dist/nodes/script/flow/spec.d.ts +52 -0
  115. package/dist/nodes/script/flow/spec.js +1 -0
  116. package/dist/nodes/transform/flow/check.d.ts +6 -0
  117. package/dist/nodes/transform/flow/check.js +229 -0
  118. package/dist/nodes/transform/flow/factories.d.ts +52 -0
  119. package/dist/nodes/transform/flow/factories.js +53 -0
  120. package/dist/nodes/transform/flow/family.d.ts +3 -0
  121. package/dist/nodes/transform/flow/family.js +8 -0
  122. package/dist/nodes/transform/flow/index.d.ts +3 -0
  123. package/dist/nodes/transform/flow/index.js +3 -0
  124. package/dist/nodes/transform/flow/node-type.d.ts +7 -0
  125. package/dist/nodes/transform/flow/node-type.js +245 -0
  126. package/dist/nodes/transform/flow/spec.d.ts +116 -0
  127. package/dist/nodes/transform/flow/spec.js +10 -0
  128. package/dist/raw-node-advice.d.ts +16 -0
  129. package/dist/raw-node-advice.js +36 -0
  130. package/dist/raw-node.d.ts +71 -0
  131. package/dist/raw-node.js +116 -0
  132. package/dist/registry/uip/pipeline-front-door.js +5 -3
  133. package/dist/serialize.js +246 -549
  134. package/package.json +2 -2
@@ -0,0 +1,174 @@
1
+ /**
2
+ * What the four Flow Data Fabric verbs share: the `entityConfig` envelope every
3
+ * one of them serializes into, the record selector update and delete use, the
4
+ * folder-scope bindings, and the lift back to source.
5
+ *
6
+ * Moved verbatim from serialize.ts / decompile.ts (Phase 2 of
7
+ * docs/NODE_TYPE_ARCHITECTURE_DESIGN.md); the comments that explain each wire
8
+ * decision came with the code.
9
+ */
10
+ import { Expr } from '../../../core/expr.js';
11
+ export function entityConfigOf(node) {
12
+ const inputs = node?.inputs ?? {};
13
+ return (inputs.entityConfig ?? {});
14
+ }
15
+ /** `entityConfig` as every verb starts it. */
16
+ export function baseConfig(inputs) {
17
+ return { entityName: inputs.entity };
18
+ }
19
+ /**
20
+ * `recordSource` is how update and delete both name their target; the read
21
+ * step's emitted node id is rename-aware, for subflow copies.
22
+ */
23
+ export function targetRecord(cfg, record, ctx) {
24
+ const r = record;
25
+ if (typeof r.fromRead === 'string') {
26
+ cfg.recordSource = 'fromRead';
27
+ cfg.readEntityNodeId = ctx.stepNodeId(r.fromRead);
28
+ }
29
+ else {
30
+ cfg.recordSource = 'byId';
31
+ cfg.recordId = String(ctx.render(r.byId));
32
+ }
33
+ }
34
+ /** A `{ <field>: <value> }` map as the `{ field, value }` rows create and update write. */
35
+ export function fieldRows(values, ctx) {
36
+ return Object.entries(values ?? {}).map(([field, value]) => ({
37
+ field,
38
+ value: String(ctx.render(value)),
39
+ }));
40
+ }
41
+ /**
42
+ * The flat `_filters` array. `join: 'OR'` on a row STARTS a new alternative —
43
+ * `entity-vdo.ts`'s `buildQesFromEntityConfig` splits the array into runs on that
44
+ * key, ANDs within a run, and ORs the runs together. So the query model is
45
+ * disjunctive: `alt1 OR alt2 OR …`, each `alt` an AND of its rows, which is why
46
+ * `[A, B(or), C]` is `A OR (B AND C)` and not `(A OR B) AND C`.
47
+ *
48
+ * The grouped `{ logicalOperator, rows, groups }` object the authoring guide
49
+ * shows is a NEWER shape: the vendored converter the local engine runs throws
50
+ * `(filters ?? []).filter is not a function` on it, so emitting it would trade
51
+ * a working offline rung for a shape only the current platform can read. The
52
+ * array is the form both accept.
53
+ */
54
+ export function filterRows(filters, ctx) {
55
+ return filters.map((f, i) => ({
56
+ field: f.field,
57
+ operator: f.operator ?? '=',
58
+ value: String(ctx.render(f.value)),
59
+ // Never on the first row: a leading `join` starts an empty run, which the
60
+ // platform's own loop guards against, and which means nothing anyway.
61
+ ...(i > 0 && f.or ? { join: 'OR' } : {}),
62
+ }));
63
+ }
64
+ /**
65
+ * The folder scope, last in `entityConfig`. A folder-scoped entity is portable
66
+ * only with its `Entity` bindings; the half-authored form is refused by check(),
67
+ * so reaching here with both means emit both. Same id for the same (entity,
68
+ * resourceKey), so two steps on one entity share one pair rather than
69
+ * duplicating it.
70
+ */
71
+ export function applyScope(cfg, inputs, ctx) {
72
+ if (inputs.folderKey !== undefined)
73
+ cfg._folderKey = inputs.folderKey;
74
+ if (inputs.folderKey !== undefined && inputs.resourceKey !== undefined) {
75
+ cfg._resourceKey = inputs.resourceKey;
76
+ for (const entry of entityBindings(inputs.entity, inputs.folderKey, inputs.resourceKey))
77
+ ctx.bind(entry);
78
+ }
79
+ }
80
+ /**
81
+ * The two `bindings[]` rows a FOLDER-SCOPED entity needs to survive export to
82
+ * another org, and the `_resourceKey` that ties them to the node.
83
+ *
84
+ * Nothing else emits `resource: 'Entity'`: the kind is matched by
85
+ * `(resourceKey, propertyAttribute)` rather than by name, carries no
86
+ * `resourceSubType`, spells the folder attribute `folderKey` (never
87
+ * `folderPath` — a folderPath row receives the Orchestrator FQN, which the
88
+ * Data Fabric query rejects even in the source org), and puts a DISPLAY label
89
+ * in `name`. The capital `E` is load-bearing: packaging ignores a lowercase
90
+ * row, so deploy emits no override at all.
91
+ *
92
+ * A tenant-scoped entity needs none of this — it serializes as a dotted
93
+ * literal — which is why the pair is emitted only when the author supplied
94
+ * both `folderKey` and `resourceKey`.
95
+ */
96
+ function entityBindings(entity, folderKey, resourceKey) {
97
+ const base = `b${entity.replace(/[^A-Za-z0-9]/g, '')}Entity`;
98
+ return [
99
+ {
100
+ id: `${base}Name`,
101
+ name: entity,
102
+ type: 'string',
103
+ resource: 'Entity',
104
+ resourceKey,
105
+ default: entity,
106
+ propertyAttribute: 'name',
107
+ },
108
+ {
109
+ id: `${base}Folder`,
110
+ name: `${entity}Folder`,
111
+ type: 'string',
112
+ resource: 'Entity',
113
+ resourceKey,
114
+ default: folderKey,
115
+ propertyAttribute: 'folderKey',
116
+ },
117
+ ];
118
+ }
119
+ // ─── The lift ──────────────────────────────────────────────────────────────────
120
+ /**
121
+ * A serialized value back as the spec holds it. 1.3 let `recordId` and a
122
+ * create's field value be a `{ type: 'jsExpression', expression }` object as well
123
+ * as a `=js:` string; a product-authored node can carry either, and both recover
124
+ * as an expression. Anything else is TEXT — a number in a field row prints as
125
+ * `"5"`, as it always has.
126
+ */
127
+ export function liftValue(v) {
128
+ const obj = v;
129
+ if (obj && typeof obj === 'object' && obj.type === 'jsExpression')
130
+ return new Expr(String(obj.expression ?? ''));
131
+ const raw = typeof v === 'string' ? v : String(v ?? '');
132
+ return raw.startsWith('=js:') ? new Expr(raw.slice(4)) : raw;
133
+ }
134
+ /** The scope options, read back. */
135
+ export function liftScope(cfg) {
136
+ return {
137
+ entity: String(cfg.entityName ?? ''),
138
+ ...(typeof cfg._folderKey === 'string' ? { folderKey: cfg._folderKey } : {}),
139
+ ...(typeof cfg._resourceKey === 'string' ? { resourceKey: cfg._resourceKey } : {}),
140
+ };
141
+ }
142
+ /** The record selector, read back. */
143
+ export function liftRecord(cfg) {
144
+ return cfg.recordSource === 'fromRead'
145
+ ? { fromRead: String(cfg.readEntityNodeId ?? '') }
146
+ : { byId: liftValue(cfg.recordId) };
147
+ }
148
+ /** `{ field, value }` rows back as the `{ <field>: <value> }` map. */
149
+ export function liftFields(rows) {
150
+ const list = Array.isArray(rows) ? rows : [];
151
+ const out = {};
152
+ for (const r of list)
153
+ out[String(r.field ?? '')] = liftValue(r.value);
154
+ return out;
155
+ }
156
+ // ─── Printing ──────────────────────────────────────────────────────────────────
157
+ /** `entity`, then the verb's own options, then the scope — the order every verb prints in. */
158
+ export function scopeOptions(inputs, ctx) {
159
+ return {
160
+ entity: ['entity', ctx.string(inputs.entity)],
161
+ tail: [
162
+ ['folderKey', inputs.folderKey !== undefined ? ctx.string(inputs.folderKey) : undefined],
163
+ ['resourceKey', inputs.resourceKey !== undefined ? ctx.string(inputs.resourceKey) : undefined],
164
+ ],
165
+ };
166
+ }
167
+ export function printRecord(record, ctx) {
168
+ const r = record;
169
+ return typeof r.fromRead === 'string' ? `{ fromRead: ${ctx.string(r.fromRead)} }` : `{ byId: ${ctx.value(r.byId)} }`;
170
+ }
171
+ /** A field map as `{ k: v, … }` — `{ }` when empty, exactly as the decompiler always wrote it. */
172
+ export function printFields(values, ctx) {
173
+ return `{ ${Object.entries(values ?? {}).map(([k, v]) => `${ctx.key(k)}: ${ctx.value(v)}`).join(', ')} }`;
174
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * The Flow Data Fabric family's authoring types, and its four kinds' entries in
3
+ * `FlowActionSpecs` (docs/NODE_TYPE_ARCHITECTURE_DESIGN.md §4.6). Moved from
4
+ * core/actions.ts in Phase 2c; the family adds its kinds to the map here, by
5
+ * declaration merging, so `ActionSpec` gains them wherever this module is part of
6
+ * the program — the package entry re-exports it, so that is everywhere.
7
+ */
8
+ import type { Expr } from '../../../core/expr.js';
9
+ /**
10
+ * The comparison operators the Data Fabric query serializer can emit, spelled
11
+ * exactly as the file carries them.
12
+ *
13
+ * @remarks
14
+ * There is deliberately no `not in`, `not contains`, or null check — the
15
+ * serializer cannot emit them, and a filter it cannot emit takes the WHOLE
16
+ * query down rather than dropping one row. `is any of` is the legacy spelling
17
+ * of `in` and is still read, but author `in`.
18
+ */
19
+ export type DataFabricOperator = '=' | '!=' | '>' | '>=' | '<' | '<=' | 'contains' | 'starts with' | 'ends with' | 'in';
20
+ /** One filter row on a Data Fabric query — rows AND together unless `or` is set. */
21
+ export interface DataFabricFilter {
22
+ /**
23
+ * The entity column to filter on. A dotted related path (`customer.Name`) is
24
+ * capped at 3 segments and needs the canvas's `_entityFields` snapshot, which
25
+ * the SDK does not author — keep from-scratch filters on the entity's own
26
+ * columns.
27
+ */
28
+ field: string;
29
+ /** Comparison operator; `=` when omitted. */
30
+ operator?: DataFabricOperator;
31
+ /**
32
+ * The comparison value. An `Expr` re-evaluates at activation time.
33
+ *
34
+ * A choice-set column compares against the choice's numeric `numberId`, never
35
+ * its label — a label matches nothing.
36
+ */
37
+ value: string | Expr;
38
+ /**
39
+ * Start a new OR alternative at this row.
40
+ *
41
+ * @remarks
42
+ * The query model is disjunctive — `alt1 OR alt2 OR …`, each alternative an
43
+ * AND of its own rows — so `or` SPLITS the list rather than joining one row
44
+ * to the one before it. `[A, B(or), C]` is therefore `A OR (B AND C)`, not
45
+ * `(A OR B) AND C`; to get the latter, write it out as
46
+ * `(A AND C) OR (B AND C)`.
47
+ *
48
+ * Ignored on the first row, which has no earlier alternative to split from.
49
+ */
50
+ or?: boolean;
51
+ }
52
+ /** How a multi-record query orders its rows before the limit is applied. */
53
+ export interface DataFabricSort {
54
+ /** The column to order by — a real one; a sort on a missing column is not caught by `validate`. */
55
+ field: string;
56
+ /** `'asc'` when omitted. */
57
+ direction?: 'asc' | 'desc';
58
+ }
59
+ /**
60
+ * Which record a Data Fabric write targets — exactly ONE of the two forms.
61
+ *
62
+ * @remarks
63
+ * `{ byId }` names a record id, literal or expression. `{ fromRead }` names an
64
+ * earlier {@link dataFabricRead} STEP and reuses the record that step found, so
65
+ * the id never has to be carried by hand; `check` rejects a name no read step
66
+ * has. Shared by {@link dataFabricUpdate} and {@link dataFabricDelete} — the
67
+ * platform gives them the same `recordSource` shape.
68
+ */
69
+ export type DataFabricRecordRef = {
70
+ byId: string | Expr;
71
+ fromRead?: never;
72
+ } | {
73
+ fromRead: string;
74
+ byId?: never;
75
+ };
76
+ export interface DataFabricReadInputs {
77
+ /** The Data Fabric entity's name, e.g. `'Invoices'`. */
78
+ entity: string;
79
+ /** Filter rows selecting the record(s) to query. Omit to take everything the entity holds. */
80
+ filters?: DataFabricFilter[];
81
+ /**
82
+ * `'single'` publishes ONE record as the step's `output`; `'multiple'`
83
+ * publishes the matching records under `output.results`.
84
+ *
85
+ * Setting either selects the node's **1.4** definition, which is where
86
+ * `resultMode` exists at all — the SDK's pinned default is 1.0, the
87
+ * read-one-record node this family started as. Omit it and nothing changes:
88
+ * the step stays on 1.0 and reads one record, as it always did.
89
+ *
90
+ * A `'single'` read faults only on an OVER-match; zero matches completes
91
+ * normally and leaves the step's output unresolved, so treat "not found" as a
92
+ * branch rather than an error.
93
+ */
94
+ resultMode?: 'single' | 'multiple';
95
+ /**
96
+ * Row cap for a `'multiple'` query. The emitted query ALWAYS carries a limit:
97
+ * omitting this resolves to 100, and 1000 is a hard ceiling — a larger value
98
+ * truncates silently, so page with `skip` instead.
99
+ */
100
+ limit?: number;
101
+ /** Rows to skip before the limit — the paging half of `limit`. */
102
+ skip?: number;
103
+ /** Order rows before the limit applies. Without it a limited slice is arbitrary. */
104
+ sort?: DataFabricSort;
105
+ /** Only these columns. Omit for every column the entity has. */
106
+ fields?: string[];
107
+ /**
108
+ * Folder key (GUID) for a folder-scoped entity — its `folderId` from
109
+ * `uip df entities list --include-folders`.
110
+ *
111
+ * Requires `resourceKey`: `folderKey` alone serializes the folder as a
112
+ * source-org LITERAL, which looks portable and breaks on cross-org deploy, so
113
+ * `check` refuses the pair being half-authored.
114
+ */
115
+ folderKey?: string;
116
+ /**
117
+ * The key the entity's reference is registered under in the solution, from
118
+ * `uip solution resources list --kind Entity`.
119
+ *
120
+ * @remarks
121
+ * Only meaningful with `folderKey`. Supplying both emits the two
122
+ * `resource: 'Entity'` binding rows (`propertyAttribute` `name` and
123
+ * `folderKey`) that let the flow deploy to another org. Nothing mints this
124
+ * key for a hand-authored flow — if you cannot resolve one, keep the entity
125
+ * tenant-scoped and omit both.
126
+ */
127
+ resourceKey?: string;
128
+ }
129
+ export interface DataFabricCreateInputs {
130
+ /** The Data Fabric entity's name, e.g. `'Invoices'`. */
131
+ entity: string;
132
+ /**
133
+ * The columns the new record starts with, by field name. At least one is
134
+ * required — the node's schema rejects an empty field list rather than
135
+ * inserting a blank row.
136
+ */
137
+ values: Record<string, string | Expr>;
138
+ /**
139
+ * Folder key (GUID) for a folder-scoped entity — its `folderId` from
140
+ * `uip df entities list --include-folders`.
141
+ *
142
+ * Requires `resourceKey`: `folderKey` alone serializes the folder as a
143
+ * source-org LITERAL, which looks portable and breaks on cross-org deploy, so
144
+ * `check` refuses the pair being half-authored.
145
+ */
146
+ folderKey?: string;
147
+ /**
148
+ * The key the entity's reference is registered under in the solution, from
149
+ * `uip solution resources list --kind Entity`.
150
+ *
151
+ * @remarks
152
+ * Only meaningful with `folderKey`. Supplying both emits the two
153
+ * `resource: 'Entity'` binding rows (`propertyAttribute` `name` and
154
+ * `folderKey`) that let the flow deploy to another org. Nothing mints this
155
+ * key for a hand-authored flow — if you cannot resolve one, keep the entity
156
+ * tenant-scoped and omit both.
157
+ */
158
+ resourceKey?: string;
159
+ }
160
+ export interface DataFabricUpdateInputs {
161
+ /** The Data Fabric entity's name, e.g. `'Invoices'`. */
162
+ entity: string;
163
+ /** Which record to update — see {@link DataFabricRecordRef}. */
164
+ record: DataFabricRecordRef;
165
+ /**
166
+ * The columns to write, by field name. An empty string is a real write — it
167
+ * clears the column.
168
+ */
169
+ set: Record<string, string | Expr>;
170
+ /**
171
+ * Folder key (GUID) for a folder-scoped entity — its `folderId` from
172
+ * `uip df entities list --include-folders`.
173
+ *
174
+ * Requires `resourceKey`: `folderKey` alone serializes the folder as a
175
+ * source-org LITERAL, which looks portable and breaks on cross-org deploy, so
176
+ * `check` refuses the pair being half-authored.
177
+ */
178
+ folderKey?: string;
179
+ /**
180
+ * The key the entity's reference is registered under in the solution, from
181
+ * `uip solution resources list --kind Entity`.
182
+ *
183
+ * @remarks
184
+ * Only meaningful with `folderKey`. Supplying both emits the two
185
+ * `resource: 'Entity'` binding rows (`propertyAttribute` `name` and
186
+ * `folderKey`) that let the flow deploy to another org. Nothing mints this
187
+ * key for a hand-authored flow — if you cannot resolve one, keep the entity
188
+ * tenant-scoped and omit both.
189
+ */
190
+ resourceKey?: string;
191
+ }
192
+ export interface DataFabricDeleteInputs {
193
+ /** The Data Fabric entity's name, e.g. `'Invoices'`. */
194
+ entity: string;
195
+ /** Which record to delete — see {@link DataFabricRecordRef}. */
196
+ record: DataFabricRecordRef;
197
+ /**
198
+ * Folder key (GUID) for a folder-scoped entity — its `folderId` from
199
+ * `uip df entities list --include-folders`.
200
+ *
201
+ * Requires `resourceKey`: `folderKey` alone serializes the folder as a
202
+ * source-org LITERAL, which looks portable and breaks on cross-org deploy, so
203
+ * `check` refuses the pair being half-authored.
204
+ */
205
+ folderKey?: string;
206
+ /**
207
+ * The key the entity's reference is registered under in the solution, from
208
+ * `uip solution resources list --kind Entity`.
209
+ *
210
+ * @remarks
211
+ * Only meaningful with `folderKey`. Supplying both emits the two
212
+ * `resource: 'Entity'` binding rows (`propertyAttribute` `name` and
213
+ * `folderKey`) that let the flow deploy to another org. Nothing mints this
214
+ * key for a hand-authored flow — if you cannot resolve one, keep the entity
215
+ * tenant-scoped and omit both.
216
+ */
217
+ resourceKey?: string;
218
+ }
219
+ declare module '../../../core/actions.js' {
220
+ interface FlowActionSpecs {
221
+ /** The spec {@link dataFabricRead} builds. */
222
+ dataFabricRead: {
223
+ inputs: DataFabricReadInputs;
224
+ };
225
+ /** The spec {@link dataFabricCreate} builds. */
226
+ dataFabricCreate: {
227
+ inputs: DataFabricCreateInputs;
228
+ };
229
+ /** The spec {@link dataFabricUpdate} builds. */
230
+ dataFabricUpdate: {
231
+ inputs: DataFabricUpdateInputs;
232
+ };
233
+ /** The spec {@link dataFabricDelete} builds. */
234
+ dataFabricDelete: {
235
+ inputs: DataFabricDeleteInputs;
236
+ };
237
+ }
238
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The four Flow Data Fabric verbs as node types: read (1.0 and 1.4), create
3
+ * (1.3), update (1.0 and 1.3) and delete (1.3). Each version's implementation is
4
+ * the same code today — the serialized shape is identical across the bundled
5
+ * versions — so a version is one `verb(version)` call; a version that changes the
6
+ * shape gets its own implementation (design §7).
7
+ */
8
+ import type { DataFabricCreateInputs, DataFabricDeleteInputs, DataFabricReadInputs, DataFabricUpdateInputs } from './spec.js';
9
+ import type { FlowNodeType, FlowVersionedNodeType } from '../../../flow-node-type.js';
10
+ export type DataFabricReadSpec = {
11
+ kind: 'dataFabricRead';
12
+ inputs: DataFabricReadInputs;
13
+ };
14
+ export type DataFabricCreateSpec = {
15
+ kind: 'dataFabricCreate';
16
+ inputs: DataFabricCreateInputs;
17
+ };
18
+ export type DataFabricUpdateSpec = {
19
+ kind: 'dataFabricUpdate';
20
+ inputs: DataFabricUpdateInputs;
21
+ };
22
+ export type DataFabricDeleteSpec = {
23
+ kind: 'dataFabricDelete';
24
+ inputs: DataFabricDeleteInputs;
25
+ };
26
+ export declare const dataFabricRead: FlowVersionedNodeType<DataFabricReadSpec>;
27
+ export declare const dataFabricCreate: FlowNodeType<DataFabricCreateSpec>;
28
+ export declare const dataFabricUpdate: FlowVersionedNodeType<DataFabricUpdateSpec>;
29
+ export declare const dataFabricDelete: FlowNodeType<DataFabricDeleteSpec>;