@uipath/maestro-builder-sdk 6.18.3 → 6.18.4

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 CHANGED
@@ -204,9 +204,9 @@ could hand you spans for a version you do not have.
204
204
  | `ran` | function | `dist/core/expr.d.ts:95-141` | Expressions and types | Did this step run? |
205
205
  | `rawNode` | function | `dist/core/node-classes.d.ts:180-242` | Supporting types | Place a node this SDK has no factory for, carrying its definition verbatim (`uipath.exotic.thing@2.1` and the manifest… |
206
206
  | `RawReference` | type | `dist/core/lookups.d.ts:190-198` | Supporting types | |
207
- | `refuseLookupToken` | function | `dist/core/lookups.d.ts:207-223` | Generated descriptors | Refuse a lookup token where the family cannot resolve one. |
208
207
  | `RemoteA2aToolRef` | interface | `dist/core/actions.d.ts:1745-1765` | Supporting types | A remote A2A (agent-to-agent) endpoint the agent may delegate to. |
209
208
  | `resolvedValue` | function | `dist/core/lookups.d.ts:172-179` | Generated descriptors | The recorded id for a token, or `undefined`. |
209
+ | `resolveEventWhere` | function | `dist/core/lookups.d.ts:207-224` | Generated descriptors | An event subscription's `where` with every lookup token swapped for the id `registry prepare --resolve` recorded, or a… |
210
210
  | `ReturnFieldType` | type | `dist/core/actions.d.ts:1317-1334` | Supporting types | A JSON-schema-ish type for one field of a step's declared `returns`. |
211
211
  | `ReturnOptions` | interface | `dist/flow-sdk.d.ts:397-428` | Option shapes | `.return(...)`-specific options. |
212
212
  | `rpaWorkflow` | function | `dist/core/actions.d.ts:2841-2885` | Actions | Invoke a deployed RPA (robotic process automation) workflow — a classic UI-automation process, published to… |
@@ -3,6 +3,7 @@ import { authoredCaseVersion, CASE_FORMAT_PROFILE, CASE_SCHEMA_VERSIONS } from '
3
3
  import { schemaVersionRefusal } from '../schema-version.js';
4
4
  import { caseJsonPreservation, caseJsonPreservationErrors } from './preserve.js';
5
5
  import { EQUALS_EXPR_DIALECT, checkConnectorContract, checkConnectorLookups, checkConnectorSchema, } from '../core/connector-checks.js';
6
+ import { checkEventResolution } from '../core/event-checks.js';
6
7
  const TYPE_NAMES = new Set(Object.values(types));
7
8
  // audit-case-coverage: rule-slot table start
8
9
  // This runtime table must equal the committed matrix's rejected cells. The audit
@@ -288,6 +289,9 @@ function checkLibraryConnectors(built, opts, diags) {
288
289
  const refused = opts.subscriptionError?.(kind, sub);
289
290
  if (refused !== undefined)
290
291
  diags.push({ level: 'error', code: refused.code, message: `${where}: ${refused.message}`, where: at });
292
+ // A `where` lookup nobody recorded: Flow's LOOKUP_UNRESOLVED warning, from the
293
+ // shared event rules. Only `resolutions` is passed, so nothing else in them fires.
294
+ checkEventResolution(sub, where, kind, { resolutions: opts.resolutions ?? {} }, (code, message) => diags.push({ level: 'error', code, message, where: at }), (code, message) => diags.push({ level: 'warning', code, message, where: at }));
291
295
  };
292
296
  const rules = (conditions, where) => {
293
297
  for (const c of conditions)
@@ -11,7 +11,7 @@
11
11
  import { IdGen } from './ids.js';
12
12
  import { buildConnectorInputs, nestConnectorBody, transportHttpMethod } from '../core/connector-inputs.js';
13
13
  import { EQUALS_EXPR_DIALECT } from '../core/connector-checks.js';
14
- import { refuseLookupToken } from '../core/lookups.js';
14
+ import { resolveEventWhere } from '../core/lookups.js';
15
15
  import { resolveCaseSubscription } from './subscription.js';
16
16
  import { CASE_FORMAT_PROFILE, CASE_SCHEMA_VERSIONS } from './format-profile.js';
17
17
  import { resolveSchemaVersion } from '../schema-version.js';
@@ -902,16 +902,13 @@ function resolvedSubscriptionBag(kind, spec, resolver, elementId) {
902
902
  return {
903
903
  serviceType: kind === 'trigger' ? CASE_FORMAT_PROFILE.eventServiceType : CASE_FORMAT_PROFILE.waitConnectorServiceType,
904
904
  context,
905
- inputs: [eventInput(spec.where ?? {}, elementId)],
905
+ inputs: [eventInput(resolveEventWhere(spec.where, resolver.library.lookupResolutions, `${kind === 'trigger' ? 'event trigger' : 'wait-for-connector'} "${elementId}"`), elementId)],
906
906
  outputs: connectorOutputs(rc, elementId, resolver),
907
907
  bindings: [],
908
908
  };
909
909
  }
910
+ /** The subscription's `body` input; `where` has its lookups already resolved (`resolveEventWhere`). */
910
911
  function eventInput(where, elementId) {
911
- // Case compile does not read resolutions.json (Flow does); a token here
912
- // would be emitted raw where the connector expects an id.
913
- for (const [field, value] of Object.entries(where))
914
- refuseLookupToken(value, 'case', field);
915
912
  return Object.keys(where).length
916
913
  ? { name: 'body', type: 'json', target: 'body', body: { queryParams: where }, var: 'vbody', id: 'vbody', elementId }
917
914
  : { name: 'body', type: 'json', target: 'body', value: '', var: 'vbody', id: 'vbody', elementId };
@@ -205,20 +205,21 @@ type RawReference = {
205
205
  */
206
206
  export declare function lookupSpecOf(reference: RawReference, invariant?: ReadonlySet<string>): LookupSpec | undefined;
207
207
  /**
208
- * Refuse a lookup token where the family cannot resolve one.
209
- *
210
- * Connector-activity inputs resolve their lookups in every family through
211
- * `buildConnectorInputs` (`core/connector-inputs.ts`), which reads
212
- * `connectors-local/resolutions.json`. This guard is for the sites that do not
213
- * go through it yet: a Case event subscription's `where`, whose values Case
214
- * copies into its emitted payload verbatim. A token reaching one would be
215
- * embedded as `{"__lookup": {…}}` where the connector expects an id, which is
216
- * silent wrongness, so it is refused instead.
217
- *
218
- * @param value - A connector input value.
219
- * @param family - The authoring family, for the message.
220
- * @param field - The input name, for the message.
221
- * @throws If `value` is an unresolved {@link LookupToken}.
208
+ * An event subscription's `where` with every lookup token swapped for the id
209
+ * `registry prepare --resolve` recorded, or a throw naming the first one nobody
210
+ * recorded.
211
+ *
212
+ * The id is looked up under the token's own node type, which for an event
213
+ * lookup is the EVENT form `prepare` stores it under. Emitting a placeholder for
214
+ * a value nobody resolved would subscribe the trigger to the wrong folder,
215
+ * channel or queue, so an unrecorded token is refused, never passed through.
216
+ * Shared by Flow's and Case's serializers, so both resolve and refuse alike.
217
+ *
218
+ * @param where - The authored `where`.
219
+ * @param resolutions - The library's recorded resolutions (`library.lookupResolutions`).
220
+ * @param site - How the caller names the subscription, prefixed to the refusal.
221
+ * @returns The `where` with ids in place of tokens.
222
+ * @throws If a token has no recorded resolution.
222
223
  */
223
- export declare function refuseLookupToken(value: unknown, family: string, field: string): void;
224
+ export declare function resolveEventWhere(where: Record<string, unknown> | undefined, resolutions: LookupResolutions, site: string): Record<string, unknown>;
224
225
  export {};
@@ -259,30 +259,33 @@ function byAlias(lookupName) {
259
259
  return 'by' + words.map((w) => w[0].toUpperCase() + w.slice(1)).join('');
260
260
  }
261
261
  /**
262
- * Refuse a lookup token where the family cannot resolve one.
262
+ * An event subscription's `where` with every lookup token swapped for the id
263
+ * `registry prepare --resolve` recorded, or a throw naming the first one nobody
264
+ * recorded.
263
265
  *
264
- * Connector-activity inputs resolve their lookups in every family through
265
- * `buildConnectorInputs` (`core/connector-inputs.ts`), which reads
266
- * `connectors-local/resolutions.json`. This guard is for the sites that do not
267
- * go through it yet: a Case event subscription's `where`, whose values Case
268
- * copies into its emitted payload verbatim. A token reaching one would be
269
- * embedded as `{"__lookup": {…}}` where the connector expects an id, which is
270
- * silent wrongness, so it is refused instead.
266
+ * The id is looked up under the token's own node type, which for an event
267
+ * lookup is the EVENT form `prepare` stores it under. Emitting a placeholder for
268
+ * a value nobody resolved would subscribe the trigger to the wrong folder,
269
+ * channel or queue, so an unrecorded token is refused, never passed through.
270
+ * Shared by Flow's and Case's serializers, so both resolve and refuse alike.
271
271
  *
272
- * @param value - A connector input value.
273
- * @param family - The authoring family, for the message.
274
- * @param field - The input name, for the message.
275
- * @throws If `value` is an unresolved {@link LookupToken}.
272
+ * @param where - The authored `where`.
273
+ * @param resolutions - The library's recorded resolutions (`library.lookupResolutions`).
274
+ * @param site - How the caller names the subscription, prefixed to the refusal.
275
+ * @returns The `where` with ids in place of tokens.
276
+ * @throws If a token has no recorded resolution.
276
277
  */
277
- export function refuseLookupToken(value, family, field) {
278
- if (!isLookupToken(value))
279
- return;
280
- const { nodeType, by, value: wanted } = value.__lookup;
281
- throw new Error(`${family}: input "${field}" is a lookup(), which ${family} cannot resolve — ` +
282
- `only Flow reads connectors-local/resolutions.json today, so this would be ` +
283
- `emitted as a raw token where the connector expects an id.\n` +
284
- `Resolve it first and pass the value:\n` +
285
- ` ${prepareCommand()} ${nodeType.replace(/^uipath\.connector\.(?:trigger\.|event\.)?/, '').replace(/\.([^.]+)$/, ' --action $1')} \\\n` +
286
- ` --resolve ${field}:${by}=${String(wanted)}\n` +
287
- `then read the id out of connectors-local/resolutions.json.`);
278
+ export function resolveEventWhere(where, resolutions, site) {
279
+ const out = {};
280
+ for (const [key, value] of Object.entries(where ?? {})) {
281
+ if (!isLookupToken(value)) {
282
+ out[key] = value;
283
+ continue;
284
+ }
285
+ const resolved = resolvedValue(value, resolutions);
286
+ if (resolved === undefined)
287
+ throw new Error(`${site}: \`where.${key}\` ` + unresolvedLookupMessage(value));
288
+ out[key] = resolved;
289
+ }
290
+ return out;
288
291
  }
package/dist/serialize.js CHANGED
@@ -44,7 +44,7 @@ export function connectorInputErrors(rc, inputs, resolutions = {}, lookups = {})
44
44
  render: (value) => renderDeep(value, NO_RENAME),
45
45
  });
46
46
  }
47
- import { isLookupToken, resolvedValue, unresolvedLookupMessage, } from './core/lookups.js';
47
+ import { isLookupToken, resolveEventWhere, } from './core/lookups.js';
48
48
  import { declaredScriptShape, inferScriptShape } from './core/script-return.js';
49
49
  import { migrateToSchemaVersion } from './migrate.js';
50
50
  import { FLOW_SCHEMA_VERSIONS } from './format-profile.js';
@@ -4127,19 +4127,7 @@ function eventDetail(rc, sub, nodeId, opts, site) {
4127
4127
  // `prepare --resolve` stored under the EVENT-form node type — or refused.
4128
4128
  // Same rule as connector inputs: emitting a placeholder for a value nobody
4129
4129
  // resolved would subscribe the trigger to the wrong folder/channel/queue.
4130
- const eventResolutions = opts.library?.lookupResolutions ?? {};
4131
- const where = {};
4132
- for (const [k, v] of Object.entries(sub.where ?? {})) {
4133
- if (!isLookupToken(v)) {
4134
- where[k] = v;
4135
- continue;
4136
- }
4137
- const resolved = resolvedValue(v, eventResolutions);
4138
- if (resolved === undefined) {
4139
- throw new Error(`event node "${nodeId}": \`where.${k}\` ` + unresolvedLookupMessage(v));
4140
- }
4141
- where[k] = resolved;
4142
- }
4130
+ const where = resolveEventWhere(sub.where, opts.library?.lookupResolutions ?? {}, `event node "${nodeId}"`);
4143
4131
  // A subscription's parameters do not all travel in the same slot. The
4144
4132
  // connector declares which, and the library bakes it per field as `bucket`:
4145
4133
  // measured against designer-authored triggers, Jira's `project`/`issuetype`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/maestro-builder-sdk",
3
- "version": "6.18.3",
3
+ "version": "6.18.4",
4
4
  "description": "Build UiPath Flow, Case, and BPMN artifacts by writing TypeScript.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://docs.uipath.com/maestro",
@@ -92,5 +92,5 @@
92
92
  "@types/node": "^22.7.0",
93
93
  "esbuild": "^0.28.1"
94
94
  },
95
- "gitref": "e2e0a41da39b08bb97a105483f436232f0e36c2e"
95
+ "gitref": "35ff6e86b7aecb0b5c76663b6650a0924a8b7f6e"
96
96
  }