@beehexa/hexasync-template-model 2608.8.3 → 2608.15.1
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/componentKey.d.ts +26 -0
- package/dist/componentKey.d.ts.map +1 -0
- package/dist/componentKey.js +32 -0
- package/dist/componentKey.js.map +1 -0
- package/dist/connectorSupport.d.ts +123 -0
- package/dist/connectorSupport.d.ts.map +1 -0
- package/dist/connectorSupport.js +116 -0
- package/dist/connectorSupport.js.map +1 -0
- package/dist/flowRender.d.ts +89 -0
- package/dist/flowRender.d.ts.map +1 -0
- package/dist/flowRender.js +316 -0
- package/dist/flowRender.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/nodeAddress.d.ts +105 -0
- package/dist/nodeAddress.d.ts.map +1 -0
- package/dist/nodeAddress.js +195 -0
- package/dist/nodeAddress.js.map +1 -0
- package/dist/references.d.ts +51 -1
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +91 -4
- package/dist/references.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node's address — [AD-33](AD-33-node-addressing.md), decided by Jazz on 2026-08-10.
|
|
3
|
+
*
|
|
4
|
+
* An address is the **path to the node**, segments joined by `:`. It replaces three schemes that three
|
|
5
|
+
* implementations invented independently, two of which were positional:
|
|
6
|
+
*
|
|
7
|
+
* | | scheme | how it failed |
|
|
8
|
+
* | --- | --- | --- |
|
|
9
|
+
* | VS Code extension | `n0`, `s0n0`, `g0`, `c0` | ordinal — every id shifts when step order changes |
|
|
10
|
+
* | CLI + dashboard | `<stage>_<stepKey>`, plus `_D_<n>` / `_IF_<n>` for branches | stable for authored steps; the **branch counter is positional** |
|
|
11
|
+
*
|
|
12
|
+
* A counter re-numbers on an edit that renamed nothing, which is exactly the breakage a click contract exists to
|
|
13
|
+
* prevent. A path does not: the diamond at `…:key_STEP:next:if` keeps that address however many steps are added
|
|
14
|
+
* around it. **That is the whole argument**, and it is why AD-33 replaced an earlier recommendation to standardise
|
|
15
|
+
* on `_D_<n>` — a recommendation that was itself the defect it criticised.
|
|
16
|
+
*
|
|
17
|
+
* ### Why this is in `model` and not in a flow package
|
|
18
|
+
*
|
|
19
|
+
* `objects:id_X:metrics:id_Y:facet:Z` is not a flow. It addresses **any** node in a profile, so it serves three
|
|
20
|
+
* consumers at once: a diagram's click target, a provenance anchor, and the citation FR-24–28 needs for an MCP
|
|
21
|
+
* resource. A flow package owning the scheme would force the other two to invent a second one.
|
|
22
|
+
*
|
|
23
|
+
* ### Two layers, because mermaid cannot hold a `:`
|
|
24
|
+
*
|
|
25
|
+
* | layer | form | example |
|
|
26
|
+
* | --- | --- | --- |
|
|
27
|
+
* | canonical address | `:`-joined | `pullers:id_**XPullerId**:pullSteps:key_GET_ORDERS:next:if` |
|
|
28
|
+
* | rendered mermaid id | `:` → `__`, then sanitised | `pullers__id___XPullerId____pullSteps__key_GET_ORDERS__next__if` |
|
|
29
|
+
*
|
|
30
|
+
* The projection is safe because of a measurement, re-taken 2026-08-10 over every array-valued step stage in the
|
|
31
|
+
* corpus (5,819 authored `key` values, 12,366 including `output.yaml`): **0 contain `:`** and **0 contain `__`**, in
|
|
32
|
+
* both populations. So `__` is an unambiguous segment boundary and the round trip is lossless.
|
|
33
|
+
*
|
|
34
|
+
* ⚠️ The same re-measurement corrected AD-33's third claim: **1** key is not `[A-Za-z0-9_]` —
|
|
35
|
+
* `!CHECK_EXISTS_ITEMS` — and the `!` is the composer's REMOVAL directive, not part of the name. Hence rule 6 and
|
|
36
|
+
* `normalizeComponentKey` below. Read raw, that address would name a node the composer deletes.
|
|
37
|
+
*/
|
|
38
|
+
import { normalizeComponentKey } from './componentKey.js';
|
|
39
|
+
/** The separator between address segments. Measured absent from all 2,144+ authored keys. */
|
|
40
|
+
export const ADDRESS_SEPARATOR = ':';
|
|
41
|
+
/** What a `:` becomes when rendered into a mermaid id, which admits only `[A-Za-z0-9_]`. */
|
|
42
|
+
export const RENDERED_SEPARATOR = '__';
|
|
43
|
+
/** A key segment — `pullers`, `pullSteps`, `next`, `if`. */
|
|
44
|
+
export const keySegment = (name) => ({
|
|
45
|
+
kind: 'key',
|
|
46
|
+
name,
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* An identity segment, from a component's raw `id` or `key` value.
|
|
50
|
+
*
|
|
51
|
+
* ### `id_` carries the AUTHORED value, tokens and all
|
|
52
|
+
*
|
|
53
|
+
* Jazz's own example is `pullers:id_**LightspeedXSeriesPullerId**`, not the composed GUID. An address describes the
|
|
54
|
+
* **source**, and the authored form is identical across environments where a resolved GUID is not. It renders as
|
|
55
|
+
* `id___LightspeedXSeriesPullerId__`, which is ugly and harmless: nothing parses a rendered id for navigation,
|
|
56
|
+
* because the node index carries file, location and source text.
|
|
57
|
+
*
|
|
58
|
+
* Returns `undefined` for an absent identity, and for a value whose `!` marks it **removed** — a node the composer
|
|
59
|
+
* deletes has no address in the composed document, and minting one would be a citation to something that is not
|
|
60
|
+
* there.
|
|
61
|
+
*/
|
|
62
|
+
export function identitySegment(raw, which) {
|
|
63
|
+
const normalized = normalizeComponentKey(raw);
|
|
64
|
+
if (!normalized || normalized.id === '' || normalized.removes)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (carriesSeparator(normalized.id))
|
|
67
|
+
return undefined;
|
|
68
|
+
return which === 'id'
|
|
69
|
+
? { kind: 'id', value: normalized.id }
|
|
70
|
+
: { kind: 'componentKey', value: normalized.id };
|
|
71
|
+
}
|
|
72
|
+
/** A dictionary tail, e.g. a metric facet's key. */
|
|
73
|
+
export function entrySegment(raw) {
|
|
74
|
+
const normalized = normalizeComponentKey(raw);
|
|
75
|
+
if (!normalized || normalized.id === '' || normalized.removes)
|
|
76
|
+
return undefined;
|
|
77
|
+
if (carriesSeparator(normalized.id))
|
|
78
|
+
return undefined;
|
|
79
|
+
return { kind: 'entry', value: normalized.id };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A value that cannot be a segment, because it carries the separator.
|
|
83
|
+
*
|
|
84
|
+
* AD-33's `:`-freedom measurement covers **step keys** — 0 of 12,366 — and rule 5's "dictionary tail" has no such
|
|
85
|
+
* measurement. The corpus already contains one: `pullers[0].pullSteps[0].data.queries.date_modified:min`. Accepted
|
|
86
|
+
* verbatim, `entrySegment('date_modified:min')` makes a 7-segment path yield 8 segments, so `addressSegments` and
|
|
87
|
+
* `addressMatches` split at the wrong place — and `nodeAddress([keySegment('pullers'), identitySegment('X:pullSteps:key_Y', 'id')])`
|
|
88
|
+
* is byte-identical to the address of step `Y` in stage `pullSteps` of puller `X`.
|
|
89
|
+
*
|
|
90
|
+
* Nothing is broken today, and that is exactly why this is a guard rather than a comment: the algebra should be
|
|
91
|
+
* structurally safe, not statistically safe. A refused segment is dropped, which is the same treatment a removed
|
|
92
|
+
* component gets — an address that would be ambiguous is worse than a shorter one.
|
|
93
|
+
*/
|
|
94
|
+
function carriesSeparator(value) {
|
|
95
|
+
return value.includes(ADDRESS_SEPARATOR);
|
|
96
|
+
}
|
|
97
|
+
/** One segment's canonical text. */
|
|
98
|
+
function textOf(segment) {
|
|
99
|
+
switch (segment.kind) {
|
|
100
|
+
case 'key':
|
|
101
|
+
return segment.name;
|
|
102
|
+
case 'id':
|
|
103
|
+
return `id_${segment.value}`;
|
|
104
|
+
case 'componentKey':
|
|
105
|
+
return `key_${segment.value}`;
|
|
106
|
+
case 'entry':
|
|
107
|
+
return segment.value;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The canonical address for a path.
|
|
112
|
+
*
|
|
113
|
+
* `undefined` segments are dropped rather than rendered as blanks, so a caller can pass
|
|
114
|
+
* `identitySegment(step.key, 'key')` without first checking it — a step with no key still gets the address of the
|
|
115
|
+
* stage that holds it, which is a true statement about a lesser-known node rather than an address with a hole in it.
|
|
116
|
+
*
|
|
117
|
+
* A segment whose TEXT is empty is dropped for the same reason, and this is the structural home of that rule (Story
|
|
118
|
+
* 4.6 review, LOW-1). `identitySegment` already refuses an empty id, but `keySegment('')` is a defined segment holding
|
|
119
|
+
* no text, so an empty `collection` or an empty base string produced `:creationSteps:key_FORM` — an address whose
|
|
120
|
+
* separator claims a level that was never there. That was first patched at one call site in `frontend-flow`; the class
|
|
121
|
+
* belongs here, where every caller gets it. Whitespace counts as empty: a segment of spaces is not a level either.
|
|
122
|
+
*/
|
|
123
|
+
export function nodeAddress(segments) {
|
|
124
|
+
return segments
|
|
125
|
+
.filter((s) => s !== undefined)
|
|
126
|
+
.map(textOf)
|
|
127
|
+
.filter((text) => text.trim() !== '')
|
|
128
|
+
.join(ADDRESS_SEPARATOR);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* The rendered form for a mermaid node id.
|
|
132
|
+
*
|
|
133
|
+
* Two steps, in this order: `:` → `__`, then sanitise anything still outside `[A-Za-z0-9_]`. Sanitising first would
|
|
134
|
+
* turn a stray character into `_` and make it indistinguishable from a separator.
|
|
135
|
+
*/
|
|
136
|
+
export function renderedNodeId(address) {
|
|
137
|
+
return address
|
|
138
|
+
.split(ADDRESS_SEPARATOR)
|
|
139
|
+
.join(RENDERED_SEPARATOR)
|
|
140
|
+
.replace(/[^A-Za-z0-9_]/g, '_');
|
|
141
|
+
}
|
|
142
|
+
/** The segments of a canonical address, as text. */
|
|
143
|
+
export function addressSegments(address) {
|
|
144
|
+
return address === '' ? [] : address.split(ADDRESS_SEPARATOR);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Does `address` name this node, or one inside it?
|
|
148
|
+
*
|
|
149
|
+
* **Whole-segment**, which is what makes AD-33's prefix-capture fix structural rather than a rule. The corpus has
|
|
150
|
+
* **924 pairs** of unique step keys where one prefixes another, and fixture 01 contains one directly:
|
|
151
|
+
* `SAVE_SALES_RETURN` and `SAVE_SALES_RETURN_DETAILS`, both named in one Scriban expression. As segments they are
|
|
152
|
+
* simply different, so `includes()`-style capture cannot happen — no word-boundary regex, no side payload map.
|
|
153
|
+
*/
|
|
154
|
+
export function addressMatches(address, candidate) {
|
|
155
|
+
/**
|
|
156
|
+
* An EMPTY address matches nothing (Story 4.1 review, LOW-4). `[].every(...)` is `true`, so an empty `address`
|
|
157
|
+
* previously "contained" every node in the profile — and it is reachable: `nodeAddress([])` and a path whose only
|
|
158
|
+
* segment was refused both return `''`. A node with no address is not an ancestor of anything.
|
|
159
|
+
*/
|
|
160
|
+
if (address === '' || candidate === '')
|
|
161
|
+
return false;
|
|
162
|
+
if (address === candidate)
|
|
163
|
+
return true;
|
|
164
|
+
const own = addressSegments(address);
|
|
165
|
+
const other = addressSegments(candidate);
|
|
166
|
+
if (other.length <= own.length)
|
|
167
|
+
return false;
|
|
168
|
+
return own.every((segment, index) => other[index] === segment);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The address, among those a caller already knows, that a rendered mermaid id refers to.
|
|
172
|
+
*
|
|
173
|
+
* ### There is deliberately NO reverse function, and the first draft of this module had one
|
|
174
|
+
*
|
|
175
|
+
* `addressOfRenderedId` looked reasonable and was unsound. It reversed `__` → `:` and accepted the result if it
|
|
176
|
+
* re-rendered to the same id — but that check proves round-trip *consistency*, not *uniqueness*, and the projection
|
|
177
|
+
* is genuinely many-to-one once sanitisation is involved. Its own test caught it: both
|
|
178
|
+
*
|
|
179
|
+
* ```
|
|
180
|
+
* pullers:id_**XPullerId**:pullSteps:key_GET_ORDERS:next:if ← the real address
|
|
181
|
+
* pullers:id:_XPullerId::pullSteps:key_GET_ORDERS:next:if ← a different node entirely
|
|
182
|
+
* ```
|
|
183
|
+
*
|
|
184
|
+
* render to `pullers__id___XPullerId____pullSteps__key_GET_ORDERS__next__if`. So it would have returned the second
|
|
185
|
+
* for a click on the first: precisely the wrong-node navigation its own docblock claimed to prevent.
|
|
186
|
+
*
|
|
187
|
+
* The direction that IS sound is forward-only, and it is all a consumer needs — Story 4.1 AC-4 puts the address on
|
|
188
|
+
* every node in the index, so a click handler always has the candidates in hand and never has to invert anything.
|
|
189
|
+
*/
|
|
190
|
+
export function addressForRenderedId(rendered, known) {
|
|
191
|
+
const matches = known.filter((address) => renderedNodeId(address) === rendered);
|
|
192
|
+
// Two known addresses rendering alike is not a node to navigate to — it is an ambiguity to report as none.
|
|
193
|
+
return matches.length === 1 ? matches[0] : undefined;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=nodeAddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeAddress.js","sourceRoot":"","sources":["../src/nodeAddress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,4FAA4F;AAC5F,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAmBvC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAkB,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,KAAK;IACX,IAAI;CACL,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAY,EACZ,KAAmB;IAEnB,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,OAAO;QAC3D,OAAO,SAAS,CAAC;IACnB,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,OAAO,KAAK,KAAK,IAAI;QACnB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE;QACtC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,OAAO;QAC3D,OAAO,SAAS,CAAC;IACnB,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAC3C,CAAC;AAED,oCAAoC;AACpC,SAAS,MAAM,CAAC,OAAuB;IACrC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,KAAK;YACR,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,KAAK,IAAI;YACP,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,cAAc;YACjB,OAAO,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CACzB,QAAiD;IAEjD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SACnD,GAAG,CAAC,MAAM,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SACpC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,OAAO;SACX,KAAK,CAAC,iBAAiB,CAAC;SACxB,IAAI,CAAC,kBAAkB,CAAC;SACxB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB;IAC/D;;;;OAIG;IACH,IAAI,OAAO,KAAK,EAAE,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,KAAwB;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,QAAQ,CAClD,CAAC;IACF,2GAA2G;IAC3G,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
|
package/dist/references.d.ts
CHANGED
|
@@ -69,6 +69,23 @@ export interface ReferenceProperty {
|
|
|
69
69
|
* "not a component reference" instead of "a reference that is broken".
|
|
70
70
|
*/
|
|
71
71
|
readonly tokenFormOnly?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Collections whose OWN entries this property does not reference from (FR-47, Story 1.7).
|
|
74
|
+
*
|
|
75
|
+
* A property name can mean two different things depending on where it sits. `connectorId` in a step
|
|
76
|
+
* argument names a connection in this project and resolves 413/413. `connectorId` on a `connectors[]`
|
|
77
|
+
* entry is the entry's own **platform** identity — the connector product it reaches — and points at
|
|
78
|
+
* nothing in the workspace, exactly as its legacy spelling `providerId` does (measured 0/27, which is why
|
|
79
|
+
* `providerId` sits in `NON_REFERENCE_ID_PROPERTIES`).
|
|
80
|
+
*
|
|
81
|
+
* Without this, FR-3's rename would give every converted connection a dangling-reference finding, and
|
|
82
|
+
* FR-2's own promise — that writing the modern spelling produces no error — would be broken by the rule
|
|
83
|
+
* registry immediately after the schema stopped breaking it.
|
|
84
|
+
*
|
|
85
|
+
* Position, not value: the value is a well-formed id either way, so no amount of inspecting it can tell
|
|
86
|
+
* the two apart. The enclosing collection is the only thing that can.
|
|
87
|
+
*/
|
|
88
|
+
readonly opaqueInCollections?: readonly string[];
|
|
72
89
|
}
|
|
73
90
|
export declare const REFERENCE_PROPERTY_LIST: readonly ReferenceProperty[];
|
|
74
91
|
/** What a property means at one position: whether it references, and what it points into. */
|
|
@@ -85,7 +102,13 @@ export interface ReferenceKind {
|
|
|
85
102
|
* in `entityId`, or `entityType: SELF`. That is a distinct answer from "a reference that does not
|
|
86
103
|
* resolve", and collapsing the two is what puts diagnostics on correct files.
|
|
87
104
|
*/
|
|
88
|
-
export declare function resolveReferenceKind(property: string, value: string, siblings?: Record<string, unknown
|
|
105
|
+
export declare function resolveReferenceKind(property: string, value: string, siblings?: Record<string, unknown>,
|
|
106
|
+
/**
|
|
107
|
+
* The collection whose entry this property sits inside — `connectors`, `pullers`, `objects`, … — as the
|
|
108
|
+
* walker already tracks it. Optional so existing callers keep compiling; supplying it is what lets a
|
|
109
|
+
* property mean one thing in a step argument and another on a component of its own collection (FR-47).
|
|
110
|
+
*/
|
|
111
|
+
enclosingCollection?: string): ReferenceKind | undefined;
|
|
89
112
|
/** Fast membership test for the walk in `queries.ts`. */
|
|
90
113
|
export declare const REFERENCE_PROPERTIES: readonly string[];
|
|
91
114
|
export declare const referencePropertyFor: (property: string) => ReferenceProperty | undefined;
|
|
@@ -147,4 +170,31 @@ export declare const nestedReferenceBlockFor: (property: string) => ReferencePro
|
|
|
147
170
|
export declare const COLLECTIONS_KEYED_BY_REFERENCE: ReadonlyMap<string, string>;
|
|
148
171
|
/** The property name reported for a reference carried by a component's own key. */
|
|
149
172
|
export declare const KEY_REFERENCE_PROPERTY = "(key)";
|
|
173
|
+
/**
|
|
174
|
+
* The connector a connection names — `connectorId` first, `providerId` second (FR-1, AD-24).
|
|
175
|
+
*
|
|
176
|
+
* The read order exists in four places: `BaseStepExecutor` (untyped), `ConnectorDefinition.ResolvedConnectorId`
|
|
177
|
+
* (typed), `WebhookPartitioner` (via the accessor) and — found missing by the Epic 1 review — the CLI's task
|
|
178
|
+
* tooling. FR-1 says *every* runtime path, and the CLI reading only the legacy spelling meant a
|
|
179
|
+
* `connectorId`-only connection, exactly what FR-3's rename produces at scale, hard-stopped task generation
|
|
180
|
+
* with *"Connector undefined not found"*.
|
|
181
|
+
*
|
|
182
|
+
* Blank counts as absent, matching the untyped path: `Guid.Empty` has no equivalent here, but an empty string
|
|
183
|
+
* does, and a half-written `connectorId: ""` must not beat a real legacy value.
|
|
184
|
+
*/
|
|
185
|
+
export declare function resolvedConnectorIdOf(connection: {
|
|
186
|
+
connectorId?: unknown;
|
|
187
|
+
providerId?: unknown;
|
|
188
|
+
} | null | undefined): string | undefined;
|
|
189
|
+
/**
|
|
190
|
+
* An identity that is STILL a token after composition — the variable failed, and `VAR-1` owns that.
|
|
191
|
+
*
|
|
192
|
+
* ⛔ A NAME for `isTokenForm`, not a second implementation. It shipped as a byte-identical copy of the regex
|
|
193
|
+
* 350 lines above its original, in the file whose own docstring says *"ONE definition, deliberately … Epic 1's
|
|
194
|
+
* review found what happens when a rule this small gets written three times."* Found by the Epic 2 review; kept
|
|
195
|
+
* as an alias rather than deleted because the two names say different things at their call sites — one asks
|
|
196
|
+
* "is this the shape a reference resolves in", the other "did substitution fail here".
|
|
197
|
+
*/
|
|
198
|
+
export declare const isUnresolvedToken: (value: string) => boolean;
|
|
199
|
+
export declare function isWellFormedConnectorIdentity(value: string): boolean;
|
|
150
200
|
//# sourceMappingURL=references.d.ts.map
|
package/dist/references.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AA6CH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,OACb,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1D,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qGAAqG;AACrG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qFAAqF;IACrF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uFAAuF;IACvF,QAAQ,CAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAmBD,eAAO,MAAM,uBAAuB,EAAE,SAAS,iBAAiB,EAqD/D,CAAC;AAEF,6FAA6F;AAC7F,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAClC;;;;GAIG;AACH,mBAAmB,CAAC,EAAE,MAAM,GAC3B,aAAa,GAAG,SAAS,CAoC3B;AAED,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EACF,CAAC;AAIjD,eAAO,MAAM,oBAAoB,GAC/B,UAAU,MAAM,KACf,iBAAiB,GAAG,SAAkC,CAAC;AAE1D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EASxD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,iBAAiB,EAI/D,CAAC;AAMF,eAAO,MAAM,uBAAuB,GAClC,UAAU,MAAM,KACf,iBAAiB,GAAG,SAAyC,CAAC;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAyBnE,CAAC;AAEL,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EACR;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACnE,MAAM,GAAG,SAAS,CAgBpB;AAqBD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,UA7WK,MAAM,KAAG,OA6WA,CAAC;AAE7C,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMpE"}
|
package/dist/references.js
CHANGED
|
@@ -73,9 +73,14 @@
|
|
|
73
73
|
* The lesson generalises: a reference is a property, a target collection AND a value shape. Any
|
|
74
74
|
* future re-derivation must assert all three, or it will score a wrong answer at 100% again.
|
|
75
75
|
*/
|
|
76
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Values that are `**Token**` form — the only shape a conditional reference resolves in.
|
|
78
|
+
*
|
|
79
|
+
* TRIMMED, as of the Epic 2 review. It was not, while a second copy of this predicate 350 lines below was — so
|
|
80
|
+
* a quoted `" **Token** "` was a token to one and a literal to the other. One definition, one answer.
|
|
81
|
+
*/
|
|
77
82
|
const TOKEN_FORM = /^\*\*[^*]+\*\*$/;
|
|
78
|
-
export const isTokenForm = (value) => TOKEN_FORM.test(value);
|
|
83
|
+
export const isTokenForm = (value) => TOKEN_FORM.test(value.trim());
|
|
79
84
|
/** `entityType` → the collection an `entityId` beside it points into. */
|
|
80
85
|
const ENTITY_TYPE_TARGETS = new Map([
|
|
81
86
|
['TASK', 'objects'],
|
|
@@ -117,7 +122,13 @@ export const REFERENCE_PROPERTY_LIST = [
|
|
|
117
122
|
// One target, three spellings. See the CORRECTED note above.
|
|
118
123
|
{ property: 'connectionId', collection: 'connectors' },
|
|
119
124
|
{ property: 'fromConnectionId', collection: 'connectors' },
|
|
120
|
-
|
|
125
|
+
// ...except on a `connectors[]` entry, where it is that connection's own platform identity rather
|
|
126
|
+
// than a reference to one. See `opaqueInCollections` on `ReferenceProperty`.
|
|
127
|
+
{
|
|
128
|
+
property: 'connectorId',
|
|
129
|
+
collection: 'connectors',
|
|
130
|
+
opaqueInCollections: ['connectors'],
|
|
131
|
+
},
|
|
121
132
|
{
|
|
122
133
|
property: 'entityId',
|
|
123
134
|
tokenFormOnly: true,
|
|
@@ -146,12 +157,24 @@ export const REFERENCE_PROPERTY_LIST = [
|
|
|
146
157
|
* in `entityId`, or `entityType: SELF`. That is a distinct answer from "a reference that does not
|
|
147
158
|
* resolve", and collapsing the two is what puts diagnostics on correct files.
|
|
148
159
|
*/
|
|
149
|
-
export function resolveReferenceKind(property, value, siblings
|
|
160
|
+
export function resolveReferenceKind(property, value, siblings,
|
|
161
|
+
/**
|
|
162
|
+
* The collection whose entry this property sits inside — `connectors`, `pullers`, `objects`, … — as the
|
|
163
|
+
* walker already tracks it. Optional so existing callers keep compiling; supplying it is what lets a
|
|
164
|
+
* property mean one thing in a step argument and another on a component of its own collection (FR-47).
|
|
165
|
+
*/
|
|
166
|
+
enclosingCollection) {
|
|
150
167
|
const entry = BY_NAME.get(property);
|
|
151
168
|
if (!entry)
|
|
152
169
|
return undefined;
|
|
153
170
|
if (entry.tokenFormOnly && !isTokenForm(value))
|
|
154
171
|
return undefined;
|
|
172
|
+
// Checked BEFORE the discriminator: position decides whether there is a reference at all, and only then
|
|
173
|
+
// does anything ask what it points into.
|
|
174
|
+
if (enclosingCollection !== undefined &&
|
|
175
|
+
entry.opaqueInCollections?.includes(enclosingCollection)) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
155
178
|
if (!entry.discriminator) {
|
|
156
179
|
return {
|
|
157
180
|
property,
|
|
@@ -278,4 +301,68 @@ export const COLLECTIONS_KEYED_BY_REFERENCE = new Map([
|
|
|
278
301
|
]);
|
|
279
302
|
/** The property name reported for a reference carried by a component's own key. */
|
|
280
303
|
export const KEY_REFERENCE_PROPERTY = '(key)';
|
|
304
|
+
/**
|
|
305
|
+
* The connector a connection names — `connectorId` first, `providerId` second (FR-1, AD-24).
|
|
306
|
+
*
|
|
307
|
+
* The read order exists in four places: `BaseStepExecutor` (untyped), `ConnectorDefinition.ResolvedConnectorId`
|
|
308
|
+
* (typed), `WebhookPartitioner` (via the accessor) and — found missing by the Epic 1 review — the CLI's task
|
|
309
|
+
* tooling. FR-1 says *every* runtime path, and the CLI reading only the legacy spelling meant a
|
|
310
|
+
* `connectorId`-only connection, exactly what FR-3's rename produces at scale, hard-stopped task generation
|
|
311
|
+
* with *"Connector undefined not found"*.
|
|
312
|
+
*
|
|
313
|
+
* Blank counts as absent, matching the untyped path: `Guid.Empty` has no equivalent here, but an empty string
|
|
314
|
+
* does, and a half-written `connectorId: ""` must not beat a real legacy value.
|
|
315
|
+
*/
|
|
316
|
+
export function resolvedConnectorIdOf(connection) {
|
|
317
|
+
const usable = (value) => {
|
|
318
|
+
const text = typeof value === 'string'
|
|
319
|
+
? value
|
|
320
|
+
: typeof value === 'number'
|
|
321
|
+
? String(value)
|
|
322
|
+
: undefined;
|
|
323
|
+
if (text === undefined || text.trim() === '')
|
|
324
|
+
return undefined;
|
|
325
|
+
// All-zeros counts as absent, matching `ConnectorIdentity.IsDeclared` in C#. The Epic 1 review found the
|
|
326
|
+
// two sides disagreeing about exactly this literal.
|
|
327
|
+
return text.trim() === '00000000-0000-0000-0000-000000000000'
|
|
328
|
+
? undefined
|
|
329
|
+
: text;
|
|
330
|
+
};
|
|
331
|
+
return usable(connection?.connectorId) ?? usable(connection?.providerId);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* A connector identity that is written but cannot be used (FR-9, Story 2.1).
|
|
335
|
+
*
|
|
336
|
+
* "Well formed" means a GUID. Not a name, not a slug, not a URL — the platform's connector registry is keyed by
|
|
337
|
+
* GUID, so anything else cannot resolve however plausible it looks.
|
|
338
|
+
*
|
|
339
|
+
* ⛔ ONE definition, deliberately. The same rule is expressed as a `pattern` in the shipped connection schema
|
|
340
|
+
* and as `ConnectorIdentity` in C#, and Epic 1's review found what happens when a rule this small gets written
|
|
341
|
+
* three times: the copies disagreed about an all-zeros GUID and nobody noticed, because the disagreeing input
|
|
342
|
+
* was the one case no suite covered. The schema, the rule and the runtime must answer the same question the
|
|
343
|
+
* same way.
|
|
344
|
+
*
|
|
345
|
+
* A compose-time TOKEN is not judged here. In composed output an unresolved `**Token**` means the VARIABLE
|
|
346
|
+
* failed to resolve, which `VAR-1` already reports — and two findings for one cause is how a Problems panel
|
|
347
|
+
* stops being read.
|
|
348
|
+
*/
|
|
349
|
+
const GUID = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
350
|
+
/**
|
|
351
|
+
* An identity that is STILL a token after composition — the variable failed, and `VAR-1` owns that.
|
|
352
|
+
*
|
|
353
|
+
* ⛔ A NAME for `isTokenForm`, not a second implementation. It shipped as a byte-identical copy of the regex
|
|
354
|
+
* 350 lines above its original, in the file whose own docstring says *"ONE definition, deliberately … Epic 1's
|
|
355
|
+
* review found what happens when a rule this small gets written three times."* Found by the Epic 2 review; kept
|
|
356
|
+
* as an alias rather than deleted because the two names say different things at their call sites — one asks
|
|
357
|
+
* "is this the shape a reference resolves in", the other "did substitution fail here".
|
|
358
|
+
*/
|
|
359
|
+
export const isUnresolvedToken = isTokenForm;
|
|
360
|
+
export function isWellFormedConnectorIdentity(value) {
|
|
361
|
+
const trimmed = value.trim();
|
|
362
|
+
if (!GUID.test(trimmed))
|
|
363
|
+
return false;
|
|
364
|
+
// All-zeros is what an undeclared identity deserialises to on the typed side. It parses as a GUID and names
|
|
365
|
+
// no connector, so it is "absent" rather than "malformed" — `resolvedConnectorIdOf` already declines it.
|
|
366
|
+
return trimmed !== '00000000-0000-0000-0000-000000000000';
|
|
367
|
+
}
|
|
281
368
|
//# sourceMappingURL=references.js.map
|
package/dist/references.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"references.js","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH
|
|
1
|
+
{"version":3,"file":"references.js","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"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"}
|