@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.
- package/dist/api-index.md +185 -184
- package/dist/api-members.md +506 -473
- package/dist/check.js +358 -695
- package/dist/cli/commands/flow.js +3 -0
- package/dist/compile-cli.js +51 -0
- package/dist/core/actions.d.ts +132 -765
- package/dist/core/actions.js +1 -307
- package/dist/core/binding-identity.d.ts +22 -0
- package/dist/core/binding-identity.js +28 -0
- package/dist/core/context-index.d.ts +34 -0
- package/dist/core/context-index.js +38 -0
- package/dist/core/definitionless-node-types.d.ts +16 -0
- package/dist/core/definitionless-node-types.js +16 -0
- package/dist/core/error-port.d.ts +6 -0
- package/dist/core/error-port.js +9 -0
- package/dist/core/form-field-type.d.ts +33 -0
- package/dist/core/form-field-type.js +30 -0
- package/dist/core/hitl-routing.d.ts +8 -0
- package/dist/core/hitl-routing.js +17 -1
- package/dist/core/node-classes.d.ts +4 -63
- package/dist/core/node-classes.js +0 -112
- package/dist/core/nodes/family.d.ts +36 -0
- package/dist/core/nodes/family.js +1 -0
- package/dist/core/nodes/node-type.d.ts +136 -0
- package/dist/core/nodes/node-type.js +1 -0
- package/dist/core/nodes/registry.d.ts +57 -0
- package/dist/core/nodes/registry.js +122 -0
- package/dist/core/nodes/versioned.d.ts +50 -0
- package/dist/core/nodes/versioned.js +46 -0
- package/dist/core/process-resource-sort-order.d.ts +40 -0
- package/dist/core/process-resource-sort-order.js +44 -0
- package/dist/core/typed-raw-node.d.ts +13 -62
- package/dist/core/typed-raw-node.js +40 -154
- package/dist/core/wire-expr.d.ts +27 -0
- package/dist/core/wire-expr.js +34 -0
- package/dist/decompile-cli.js +11 -1
- package/dist/decompile.d.ts +8 -3
- package/dist/decompile.js +665 -354
- package/dist/flow-definitions.d.ts +10 -0
- package/dist/flow-definitions.js +35 -0
- package/dist/flow-expr-check.js +1 -1
- package/dist/flow-node-registry.d.ts +13 -0
- package/dist/flow-node-registry.js +19 -0
- package/dist/flow-node-type.d.ts +192 -0
- package/dist/flow-node-type.js +1 -0
- package/dist/flow-sdk.d.ts +40 -1
- package/dist/flow-sdk.js +29 -2
- package/dist/flow-step-tree.js +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/merge-cli.js +25 -8
- package/dist/merge-roundtrip.d.ts +81 -0
- package/dist/merge-roundtrip.js +404 -0
- package/dist/merge.d.ts +35 -6
- package/dist/merge.js +124 -24
- package/dist/node-placement.d.ts +93 -0
- package/dist/node-placement.js +163 -0
- package/dist/nodes/data-fabric/flow/check.d.ts +13 -0
- package/dist/nodes/data-fabric/flow/check.js +164 -0
- package/dist/nodes/data-fabric/flow/factories.d.ts +113 -0
- package/dist/nodes/data-fabric/flow/factories.js +134 -0
- package/dist/nodes/data-fabric/flow/family.d.ts +7 -0
- package/dist/nodes/data-fabric/flow/family.js +9 -0
- package/dist/nodes/data-fabric/flow/index.d.ts +8 -0
- package/dist/nodes/data-fabric/flow/index.js +8 -0
- package/dist/nodes/data-fabric/flow/raw.d.ts +32 -0
- package/dist/nodes/data-fabric/flow/raw.js +100 -0
- package/dist/nodes/data-fabric/flow/shared.d.ts +77 -0
- package/dist/nodes/data-fabric/flow/shared.js +174 -0
- package/dist/nodes/data-fabric/flow/spec.d.ts +238 -0
- package/dist/nodes/data-fabric/flow/spec.js +1 -0
- package/dist/nodes/data-fabric/flow/verbs.d.ts +29 -0
- package/dist/nodes/data-fabric/flow/verbs.js +239 -0
- package/dist/nodes/delay/flow/check.d.ts +16 -0
- package/dist/nodes/delay/flow/check.js +86 -0
- package/dist/nodes/delay/flow/factories.d.ts +28 -0
- package/dist/nodes/delay/flow/factories.js +38 -0
- package/dist/nodes/delay/flow/family.d.ts +3 -0
- package/dist/nodes/delay/flow/family.js +8 -0
- package/dist/nodes/delay/flow/index.d.ts +3 -0
- package/dist/nodes/delay/flow/index.js +3 -0
- package/dist/nodes/delay/flow/node-type.d.ts +13 -0
- package/dist/nodes/delay/flow/node-type.js +71 -0
- package/dist/nodes/delay/flow/spec.d.ts +43 -0
- package/dist/nodes/delay/flow/spec.js +16 -0
- package/dist/nodes/document/flow/factories.d.ts +27 -0
- package/dist/nodes/document/flow/factories.js +30 -0
- package/dist/nodes/document/flow/family.d.ts +3 -0
- package/dist/nodes/document/flow/family.js +7 -0
- package/dist/nodes/document/flow/index.d.ts +3 -0
- package/dist/nodes/document/flow/index.js +3 -0
- package/dist/nodes/document/flow/node-type.d.ts +14 -0
- package/dist/nodes/document/flow/node-type.js +150 -0
- package/dist/nodes/document/flow/spec.d.ts +65 -0
- package/dist/nodes/document/flow/spec.js +1 -0
- package/dist/nodes/mock/flow/factories.d.ts +51 -0
- package/dist/nodes/mock/flow/factories.js +47 -0
- package/dist/nodes/mock/flow/family.d.ts +3 -0
- package/dist/nodes/mock/flow/family.js +7 -0
- package/dist/nodes/mock/flow/index.d.ts +2 -0
- package/dist/nodes/mock/flow/index.js +2 -0
- package/dist/nodes/mock/flow/node-type.d.ts +11 -0
- package/dist/nodes/mock/flow/node-type.js +51 -0
- package/dist/nodes/script/flow/check.d.ts +19 -0
- package/dist/nodes/script/flow/check.js +49 -0
- package/dist/nodes/script/flow/factories.d.ts +14 -0
- package/dist/nodes/script/flow/factories.js +15 -0
- package/dist/nodes/script/flow/family.d.ts +3 -0
- package/dist/nodes/script/flow/family.js +8 -0
- package/dist/nodes/script/flow/index.d.ts +3 -0
- package/dist/nodes/script/flow/index.js +3 -0
- package/dist/nodes/script/flow/node-type.d.ts +7 -0
- package/dist/nodes/script/flow/node-type.js +125 -0
- package/dist/nodes/script/flow/spec.d.ts +52 -0
- package/dist/nodes/script/flow/spec.js +1 -0
- package/dist/nodes/transform/flow/check.d.ts +6 -0
- package/dist/nodes/transform/flow/check.js +229 -0
- package/dist/nodes/transform/flow/factories.d.ts +52 -0
- package/dist/nodes/transform/flow/factories.js +53 -0
- package/dist/nodes/transform/flow/family.d.ts +3 -0
- package/dist/nodes/transform/flow/family.js +8 -0
- package/dist/nodes/transform/flow/index.d.ts +3 -0
- package/dist/nodes/transform/flow/index.js +3 -0
- package/dist/nodes/transform/flow/node-type.d.ts +7 -0
- package/dist/nodes/transform/flow/node-type.js +245 -0
- package/dist/nodes/transform/flow/spec.d.ts +116 -0
- package/dist/nodes/transform/flow/spec.js +10 -0
- package/dist/raw-node-advice.d.ts +16 -0
- package/dist/raw-node-advice.js +36 -0
- package/dist/raw-node.d.ts +71 -0
- package/dist/raw-node.js +116 -0
- package/dist/registry/uip/pipeline-front-door.js +5 -3
- package/dist/serialize.js +246 -549
- 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>;
|