@ontrails/schema 1.0.0-beta.3 → 1.0.0-beta.5
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/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +30 -0
- package/README.md +3 -3
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +17 -18
- package/dist/diff.js.map +1 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +4 -22
- package/dist/generate.js.map +1 -1
- package/dist/types.d.ts +4 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/diff.test.ts +15 -15
- package/src/__tests__/generate.test.ts +27 -29
- package/src/diff.ts +25 -22
- package/src/generate.ts +5 -27
- package/src/types.ts +4 -5
package/.turbo/turbo-lint.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @ontrails/schema
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @ontrails/core@1.0.0-beta.5
|
|
9
|
+
|
|
10
|
+
## 1.0.0-beta.4
|
|
11
|
+
|
|
12
|
+
### Major Changes
|
|
13
|
+
|
|
14
|
+
- API simplification: unified trail model, intent enum, run, metadata.
|
|
15
|
+
|
|
16
|
+
**BREAKING CHANGES:**
|
|
17
|
+
|
|
18
|
+
- `hike()` removed — use `trail()` with optional `follow: [...]` field
|
|
19
|
+
- `follows` renamed to `follow` (singular, matching `ctx.follow()`)
|
|
20
|
+
- `topo.hikes` removed — single `topo.trails` map
|
|
21
|
+
- `kind: 'hike'` removed — everything is `kind: 'trail'`
|
|
22
|
+
- `readOnly`/`destructive` booleans replaced by `intent: 'read' | 'write' | 'destroy'`
|
|
23
|
+
- `implementation` field renamed to `run`
|
|
24
|
+
- `markers` field renamed to `metadata`
|
|
25
|
+
- `testHike` renamed to `testFollows`, `HikeScenario` to `FollowScenario`
|
|
26
|
+
- `blaze()` now returns the surface handle (`Command` for CLI, `Server` for MCP)
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- Updated dependencies
|
|
31
|
+
- @ontrails/core@1.0.0-beta.4
|
|
32
|
+
|
|
3
33
|
## 1.0.0-beta.3
|
|
4
34
|
|
|
5
35
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ if (diff.hasBreaking) {
|
|
|
19
19
|
}
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
The surface map captures every trail's input/output schemas (as JSON Schema),
|
|
22
|
+
The surface map captures every trail's input/output schemas (as JSON Schema), intent and metadata, follow graph, and example counts. The hash goes into `surface.lock` -- a single committed line that CI can check for drift.
|
|
23
23
|
|
|
24
24
|
## API
|
|
25
25
|
|
|
@@ -45,9 +45,9 @@ The diff classifies every change by severity:
|
|
|
45
45
|
| Required input field added | breaking |
|
|
46
46
|
| Input/output field removed | breaking |
|
|
47
47
|
| Output field type changed | breaking |
|
|
48
|
-
| Safety
|
|
48
|
+
| Safety property changed | warning |
|
|
49
49
|
| Trail deprecated | warning |
|
|
50
|
-
|
|
|
50
|
+
| Follow changed | warning |
|
|
51
51
|
| Trail added | info |
|
|
52
52
|
| Optional input field added | info |
|
|
53
53
|
| Output field added | info |
|
package/dist/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,UAAU,EAEV,UAAU,EAEX,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,UAAU,EAEV,UAAU,EAEX,MAAM,YAAY,CAAC;AAiXpB,eAAO,MAAM,eAAe,GAC1B,MAAM,UAAU,EAChB,MAAM,UAAU,KACf,UAkBF,CAAC"}
|
package/dist/diff.js
CHANGED
|
@@ -115,10 +115,11 @@ const diffSurfaces = (acc, prev, curr) => {
|
|
|
115
115
|
};
|
|
116
116
|
/** Diff safety markers, description, and deprecation. */
|
|
117
117
|
const diffMetadata = (acc, prev, curr) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
if (prev.intent !== curr.intent) {
|
|
119
|
+
addDetail(acc, 'warning', `intent changed: ${String(prev.intent ?? 'write')} -> ${String(curr.intent ?? 'write')}`);
|
|
120
|
+
}
|
|
121
|
+
if (prev.idempotent !== curr.idempotent) {
|
|
122
|
+
addDetail(acc, 'warning', `idempotent changed: ${String(prev.idempotent ?? false)} -> ${String(curr.idempotent ?? false)}`);
|
|
122
123
|
}
|
|
123
124
|
if (prev.description !== curr.description) {
|
|
124
125
|
addDetail(acc, 'info', 'Description updated');
|
|
@@ -133,8 +134,8 @@ const diffMetadata = (acc, prev, curr) => {
|
|
|
133
134
|
addDetail(acc, 'info', 'Undeprecated');
|
|
134
135
|
}
|
|
135
136
|
};
|
|
136
|
-
/** Build a
|
|
137
|
-
const
|
|
137
|
+
/** Build a follow-changed description from added/removed arrays. */
|
|
138
|
+
const buildFollowMessage = (added, removed) => {
|
|
138
139
|
const parts = [];
|
|
139
140
|
if (added.length > 0) {
|
|
140
141
|
parts.push(`added "${added.join('", "')}"`);
|
|
@@ -142,18 +143,16 @@ const buildFollowsMessage = (added, removed) => {
|
|
|
142
143
|
if (removed.length > 0) {
|
|
143
144
|
parts.push(`removed "${removed.join('", "')}"`);
|
|
144
145
|
}
|
|
145
|
-
return `
|
|
146
|
+
return `Follow changed: ${parts.join(', ')}`;
|
|
146
147
|
};
|
|
147
|
-
/** Diff
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const added = [...
|
|
152
|
-
const removed = [...
|
|
153
|
-
.filter((f) => !currFollows.has(f))
|
|
154
|
-
.toSorted();
|
|
148
|
+
/** Diff follow arrays. */
|
|
149
|
+
const diffFollow = (acc, prev, curr) => {
|
|
150
|
+
const prevFollow = new Set(prev.follow);
|
|
151
|
+
const currFollow = new Set(curr.follow);
|
|
152
|
+
const added = [...currFollow].filter((f) => !prevFollow.has(f)).toSorted();
|
|
153
|
+
const removed = [...prevFollow].filter((f) => !currFollow.has(f)).toSorted();
|
|
155
154
|
if (added.length > 0 || removed.length > 0) {
|
|
156
|
-
addDetail(acc, 'warning',
|
|
155
|
+
addDetail(acc, 'warning', buildFollowMessage(added, removed));
|
|
157
156
|
}
|
|
158
157
|
};
|
|
159
158
|
const diffEntry = (prev, curr) => {
|
|
@@ -162,7 +161,7 @@ const diffEntry = (prev, curr) => {
|
|
|
162
161
|
diffSchemaFields(acc, 'output', prev.output, curr.output);
|
|
163
162
|
diffSurfaces(acc, prev, curr);
|
|
164
163
|
diffMetadata(acc, prev, curr);
|
|
165
|
-
|
|
164
|
+
diffFollow(acc, prev, curr);
|
|
166
165
|
if (acc.details.length === 0) {
|
|
167
166
|
return undefined;
|
|
168
167
|
}
|
|
@@ -182,7 +181,7 @@ const diffEntry = (prev, curr) => {
|
|
|
182
181
|
*
|
|
183
182
|
* Classifies each change with a severity:
|
|
184
183
|
* - `info`: new trail, optional field added, output field added, description change
|
|
185
|
-
* - `warning`: safety marker change, deprecation,
|
|
184
|
+
* - `warning`: safety marker change, deprecation, follow change
|
|
186
185
|
* - `breaking`: trail removed, required input added, field removed, type change, surface removed
|
|
187
186
|
*/
|
|
188
187
|
/** Find entries added in curr that don't exist in prev. */
|
package/dist/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
package/dist/generate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAS,IAAI,EAAS,MAAM,gBAAgB,CAAC;AAEzD,OAAO,KAAK,EAAc,UAAU,EAAmB,MAAM,YAAY,CAAC;AAkK1E;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,KAAG,UAqB/C,CAAC"}
|
package/dist/generate.js
CHANGED
|
@@ -51,11 +51,8 @@ const addSchemas = (entry, t) => {
|
|
|
51
51
|
};
|
|
52
52
|
/** Add safety markers to an entry. */
|
|
53
53
|
const addSafetyMarkers = (entry, t) => {
|
|
54
|
-
if (t.
|
|
55
|
-
entry['
|
|
56
|
-
}
|
|
57
|
-
if (t.destructive === true) {
|
|
58
|
-
entry['destructive'] = true;
|
|
54
|
+
if (t.intent !== 'write') {
|
|
55
|
+
entry['intent'] = t.intent;
|
|
59
56
|
}
|
|
60
57
|
if (t.idempotent === true) {
|
|
61
58
|
entry['idempotent'] = true;
|
|
@@ -95,19 +92,8 @@ const trailToEntry = (t) => {
|
|
|
95
92
|
};
|
|
96
93
|
addSchemas(entry, t);
|
|
97
94
|
addMetadata(entry, t, raw);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const hikeToEntry = (r) => {
|
|
101
|
-
const base = trailToEntry(r);
|
|
102
|
-
const raw = r;
|
|
103
|
-
const entry = {
|
|
104
|
-
...base,
|
|
105
|
-
follows: r.follows.toSorted(),
|
|
106
|
-
kind: 'hike',
|
|
107
|
-
};
|
|
108
|
-
// Re-check surfaces on the route itself
|
|
109
|
-
if (Array.isArray(raw['surfaces'])) {
|
|
110
|
-
entry['surfaces'] = raw['surfaces'].toSorted();
|
|
95
|
+
if (t.follow.length > 0) {
|
|
96
|
+
entry['follow'] = t.follow.toSorted();
|
|
111
97
|
}
|
|
112
98
|
return sortKeys(entry);
|
|
113
99
|
};
|
|
@@ -152,10 +138,6 @@ export const generateSurfaceMap = (topo) => {
|
|
|
152
138
|
for (const t of topo.trails.values()) {
|
|
153
139
|
entries.push(trailToEntry(t));
|
|
154
140
|
}
|
|
155
|
-
// Collect all hikes
|
|
156
|
-
for (const r of topo.hikes.values()) {
|
|
157
|
-
entries.push(hikeToEntry(r));
|
|
158
|
-
}
|
|
159
141
|
// Collect all events
|
|
160
142
|
for (const e of topo.events.values()) {
|
|
161
143
|
entries.push(eventToEntry(e));
|
package/dist/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKjD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,QAAQ,GAAG,CAAoC,GAAM,EAAK,EAAE;IAChE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC;AAEF,yEAAyE;AACzE,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,CAAC,MAAe,EAAc,EAAE;IACzD,8DAA8D;IAC9D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAa,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,GAAG,CAAe,CAAC;AACzC,CAAC,CAAC;AAEF,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,0CAA0C;AAC1C,MAAM,eAAe,GAAG,CAAC,GAA4B,EAAY,EAAE,CACjE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC,CAAE,GAAG,CAAC,UAAU,CAAc,CAAC,QAAQ,EAAE;IAC1C,CAAC,CAAC,EAAE,CAAC;AAET,wCAAwC;AACxC,MAAM,UAAU,GAAG,CACjB,KAA8B,EAC9B,CAA0B,EACpB,EAAE;IACR,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,KAAK,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,CAAC,QAAQ,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC;AAEF,sCAAsC;AACtC,MAAM,gBAAgB,GAAG,CACvB,KAA8B,EAC9B,CAA0B,EACpB,EAAE;IACR,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKjD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,QAAQ,GAAG,CAAoC,GAAM,EAAK,EAAE;IAChE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC;AAEF,yEAAyE;AACzE,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,CAAC,MAAe,EAAc,EAAE;IACzD,8DAA8D;IAC9D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAa,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,GAAG,CAAe,CAAC;AACzC,CAAC,CAAC;AAEF,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,0CAA0C;AAC1C,MAAM,eAAe,GAAG,CAAC,GAA4B,EAAY,EAAE,CACjE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC,CAAE,GAAG,CAAC,UAAU,CAAc,CAAC,QAAQ,EAAE;IAC1C,CAAC,CAAC,EAAE,CAAC;AAET,wCAAwC;AACxC,MAAM,UAAU,GAAG,CACjB,KAA8B,EAC9B,CAA0B,EACpB,EAAE;IACR,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,KAAK,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,CAAC,QAAQ,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC;AAEF,sCAAsC;AACtC,MAAM,gBAAgB,GAAG,CACvB,KAA8B,EAC9B,CAA0B,EACpB,EAAE;IACR,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC1B,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC;AAEF,+CAA+C;AAC/C,MAAM,mBAAmB,GAAG,CAC1B,KAA8B,EAC9B,CAA0B,EAC1B,GAA4B,EACtB,EAAE;IACR,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1C,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,aAAa,GAAsC,EAAE,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpD,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;IACnC,CAAC;AACH,CAAC,CAAC;AAEF,gDAAgD;AAChD,MAAM,WAAW,GAAG,CAClB,KAA8B,EAC9B,CAA0B,EAC1B,GAA4B,EACtB,EAAE;IACR,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;IACvC,CAAC;IACD,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAA0B,EAAmB,EAAE;IACnE,MAAM,GAAG,GAAG,CAAuC,CAAC;IACpD,MAAM,KAAK,GAA4B;QACrC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;KAC/B,CAAC;IAEF,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrB,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAE3B,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAA+B,CAAC;AACvD,CAAC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,cAAc,GAAG,CACrB,KAA8B,EAC9B,CAAiB,EACjB,GAA4B,EACtB,EAAE;IACR,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,KAAK,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;IACvC,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1C,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAiB,EAAmB,EAAE;IAC1D,MAAM,GAAG,GAAG,CAAuC,CAAC;IACpD,MAAM,KAAK,GAA4B;QACrC,YAAY,EAAE,CAAC;QACf,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;KAC/B,CAAC;IACF,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAA+B,CAAC;AACvD,CAAC,CAAC;AAEF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAc,EAAE;IAC3D,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,qBAAqB;IACrB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAA4B,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAmB,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,4BAA4B;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpE,OAAO;QACL,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,16 +5,15 @@
|
|
|
5
5
|
export type JsonSchema = Readonly<Record<string, unknown>>;
|
|
6
6
|
export interface SurfaceMapEntry {
|
|
7
7
|
readonly id: string;
|
|
8
|
-
readonly kind: 'trail' | '
|
|
8
|
+
readonly kind: 'trail' | 'event';
|
|
9
9
|
readonly surfaces: readonly string[];
|
|
10
10
|
readonly input?: JsonSchema | undefined;
|
|
11
11
|
readonly output?: JsonSchema | undefined;
|
|
12
|
-
readonly
|
|
13
|
-
readonly destructive?: boolean | undefined;
|
|
12
|
+
readonly intent?: 'read' | 'write' | 'destroy' | undefined;
|
|
14
13
|
readonly idempotent?: boolean | undefined;
|
|
15
14
|
readonly deprecated?: boolean | undefined;
|
|
16
15
|
readonly replacedBy?: string | undefined;
|
|
17
|
-
readonly
|
|
16
|
+
readonly follow?: readonly string[] | undefined;
|
|
18
17
|
readonly detours?: Readonly<Record<string, readonly string[]>> | undefined;
|
|
19
18
|
readonly exampleCount: number;
|
|
20
19
|
readonly description?: string | undefined;
|
|
@@ -26,7 +25,7 @@ export interface SurfaceMap {
|
|
|
26
25
|
}
|
|
27
26
|
export interface DiffEntry {
|
|
28
27
|
readonly id: string;
|
|
29
|
-
readonly kind: 'trail' | '
|
|
28
|
+
readonly kind: 'trail' | 'event';
|
|
30
29
|
readonly change: 'added' | 'removed' | 'modified';
|
|
31
30
|
readonly severity: 'info' | 'warning' | 'breaking';
|
|
32
31
|
readonly details: readonly string[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wDAAwD;AACxD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAM3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wDAAwD;AACxD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAM3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAMD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAMD,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC"}
|
package/package.json
CHANGED
|
@@ -223,13 +223,13 @@ describe('diffSurfaceMaps', () => {
|
|
|
223
223
|
});
|
|
224
224
|
|
|
225
225
|
test('safety marker changed classified as warning', () => {
|
|
226
|
-
const prev = surfaceMap([entry({ id: 'data.wipe',
|
|
227
|
-
const curr = surfaceMap([entry({ id: 'data.wipe',
|
|
226
|
+
const prev = surfaceMap([entry({ id: 'data.wipe', intent: 'read' })]);
|
|
227
|
+
const curr = surfaceMap([entry({ id: 'data.wipe', intent: 'destroy' })]);
|
|
228
228
|
const result = diffSurfaceMaps(prev, curr);
|
|
229
229
|
|
|
230
230
|
expect(result.warnings).toHaveLength(1);
|
|
231
231
|
expect(
|
|
232
|
-
result.warnings[0]?.details.some((d) => d.includes('
|
|
232
|
+
result.warnings[0]?.details.some((d) => d.includes('intent changed'))
|
|
233
233
|
).toBe(true);
|
|
234
234
|
});
|
|
235
235
|
|
|
@@ -267,30 +267,30 @@ describe('diffSurfaceMaps', () => {
|
|
|
267
267
|
).toBe(true);
|
|
268
268
|
});
|
|
269
269
|
|
|
270
|
-
test('
|
|
270
|
+
test('follow changed produces warning', () => {
|
|
271
271
|
const prev = surfaceMap([
|
|
272
272
|
entry({
|
|
273
|
-
|
|
273
|
+
follow: ['user.get', 'user.lookup'],
|
|
274
274
|
id: 'user.update',
|
|
275
|
-
kind: '
|
|
275
|
+
kind: 'trail',
|
|
276
276
|
}),
|
|
277
277
|
]);
|
|
278
278
|
const curr = surfaceMap([
|
|
279
279
|
entry({
|
|
280
|
-
|
|
280
|
+
follow: ['user.get', 'user.search'],
|
|
281
281
|
id: 'user.update',
|
|
282
|
-
kind: '
|
|
282
|
+
kind: 'trail',
|
|
283
283
|
}),
|
|
284
284
|
]);
|
|
285
285
|
const result = diffSurfaceMaps(prev, curr);
|
|
286
286
|
|
|
287
287
|
expect(result.warnings).toHaveLength(1);
|
|
288
|
-
const
|
|
289
|
-
d.includes('
|
|
288
|
+
const followDetail = result.warnings[0]?.details.find((d) =>
|
|
289
|
+
d.includes('Follow changed')
|
|
290
290
|
);
|
|
291
|
-
expect(
|
|
292
|
-
expect(
|
|
293
|
-
expect(
|
|
291
|
+
expect(followDetail).toBeDefined();
|
|
292
|
+
expect(followDetail).toContain('search');
|
|
293
|
+
expect(followDetail).toContain('lookup');
|
|
294
294
|
});
|
|
295
295
|
});
|
|
296
296
|
|
|
@@ -300,22 +300,22 @@ describe('diffSurfaceMaps', () => {
|
|
|
300
300
|
entry({
|
|
301
301
|
description: 'old',
|
|
302
302
|
id: 'a.trail',
|
|
303
|
+
intent: 'read',
|
|
303
304
|
output: {
|
|
304
305
|
properties: { removed: { type: 'string' } },
|
|
305
306
|
type: 'object',
|
|
306
307
|
},
|
|
307
|
-
readOnly: true,
|
|
308
308
|
}),
|
|
309
309
|
]);
|
|
310
310
|
const curr = surfaceMap([
|
|
311
311
|
entry({
|
|
312
312
|
description: 'new',
|
|
313
313
|
id: 'a.trail',
|
|
314
|
+
intent: 'destroy',
|
|
314
315
|
output: {
|
|
315
316
|
properties: {},
|
|
316
317
|
type: 'object',
|
|
317
318
|
},
|
|
318
|
-
readOnly: false,
|
|
319
319
|
}),
|
|
320
320
|
entry({ id: 'b.trail' }),
|
|
321
321
|
]);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, test, expect } from 'bun:test';
|
|
2
2
|
|
|
3
|
-
import { trail,
|
|
3
|
+
import { trail, event, topo, Result } from '@ontrails/core';
|
|
4
4
|
import type { Topo } from '@ontrails/core';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
@@ -44,12 +44,12 @@ describe('generateSurfaceMap', () => {
|
|
|
44
44
|
describe('entries', () => {
|
|
45
45
|
test('produces entries for all trails in the topo', () => {
|
|
46
46
|
const a = trail('a.create', {
|
|
47
|
-
implementation: noop,
|
|
48
47
|
input: z.object({ name: z.string() }),
|
|
48
|
+
run: noop,
|
|
49
49
|
});
|
|
50
50
|
const b = trail('b.list', {
|
|
51
|
-
implementation: noop,
|
|
52
51
|
input: z.object({}),
|
|
52
|
+
run: noop,
|
|
53
53
|
});
|
|
54
54
|
const tp = topoFrom({ a, b });
|
|
55
55
|
const map = generateSurfaceMap(tp);
|
|
@@ -60,16 +60,16 @@ describe('generateSurfaceMap', () => {
|
|
|
60
60
|
|
|
61
61
|
test('entries are sorted alphabetically by id', () => {
|
|
62
62
|
const z2 = trail('z.trail', {
|
|
63
|
-
implementation: noop,
|
|
64
63
|
input: z.object({}),
|
|
64
|
+
run: noop,
|
|
65
65
|
});
|
|
66
66
|
const a2 = trail('a.trail', {
|
|
67
|
-
implementation: noop,
|
|
68
67
|
input: z.object({}),
|
|
68
|
+
run: noop,
|
|
69
69
|
});
|
|
70
70
|
const m2 = trail('m.trail', {
|
|
71
|
-
implementation: noop,
|
|
72
71
|
input: z.object({}),
|
|
72
|
+
run: noop,
|
|
73
73
|
});
|
|
74
74
|
const tp = topoFrom({ a2, m2, z2 });
|
|
75
75
|
const map = generateSurfaceMap(tp);
|
|
@@ -83,9 +83,9 @@ describe('generateSurfaceMap', () => {
|
|
|
83
83
|
|
|
84
84
|
test('trail with input/output schemas produces valid JSON Schema entries', () => {
|
|
85
85
|
const t = trail('entity.create', {
|
|
86
|
-
implementation: noop,
|
|
87
86
|
input: z.object({ age: z.number(), name: z.string() }),
|
|
88
87
|
output: z.object({ id: z.string(), name: z.string() }),
|
|
88
|
+
run: noop,
|
|
89
89
|
});
|
|
90
90
|
const map = generateSurfaceMap(topoFrom({ t }));
|
|
91
91
|
const entry = getFirstEntry(map);
|
|
@@ -104,8 +104,8 @@ describe('generateSurfaceMap', () => {
|
|
|
104
104
|
|
|
105
105
|
test('trail without output schema has output undefined', () => {
|
|
106
106
|
const t = trail('fire.forget', {
|
|
107
|
-
implementation: noop,
|
|
108
107
|
input: z.object({ msg: z.string() }),
|
|
108
|
+
run: noop,
|
|
109
109
|
});
|
|
110
110
|
const tp = topoFrom({ t });
|
|
111
111
|
const map = generateSurfaceMap(tp);
|
|
@@ -113,23 +113,23 @@ describe('generateSurfaceMap', () => {
|
|
|
113
113
|
expect(map.entries[0]?.output).toBeUndefined();
|
|
114
114
|
});
|
|
115
115
|
|
|
116
|
-
test('
|
|
116
|
+
test('trail entries include follow array when non-empty', () => {
|
|
117
117
|
const base = trail('user.get', {
|
|
118
|
-
implementation: noop,
|
|
119
118
|
input: z.object({ id: z.string() }),
|
|
119
|
+
run: noop,
|
|
120
120
|
});
|
|
121
|
-
const r =
|
|
122
|
-
|
|
123
|
-
implementation: noop,
|
|
121
|
+
const r = trail('user.update', {
|
|
122
|
+
follow: ['user.get'],
|
|
124
123
|
input: z.object({ id: z.string(), name: z.string() }),
|
|
124
|
+
run: noop,
|
|
125
125
|
});
|
|
126
126
|
const tp = topoFrom({ base, r });
|
|
127
127
|
const map = generateSurfaceMap(tp);
|
|
128
|
-
const
|
|
129
|
-
expect(
|
|
128
|
+
const followEntry = map.entries.find((e) => e.id === 'user.update');
|
|
129
|
+
expect(followEntry).toBeDefined();
|
|
130
130
|
|
|
131
|
-
expect(
|
|
132
|
-
expect(
|
|
131
|
+
expect(followEntry?.kind).toBe('trail');
|
|
132
|
+
expect(followEntry?.follow).toEqual(['user.get']);
|
|
133
133
|
});
|
|
134
134
|
|
|
135
135
|
test("event entries are included with kind 'event'", () => {
|
|
@@ -149,16 +149,14 @@ describe('generateSurfaceMap', () => {
|
|
|
149
149
|
describe('metadata', () => {
|
|
150
150
|
test('safety markers are included when set', () => {
|
|
151
151
|
const t = trail('safe.trail', {
|
|
152
|
-
destructive: false,
|
|
153
152
|
idempotent: true,
|
|
154
|
-
implementation: noop,
|
|
155
153
|
input: z.object({}),
|
|
156
|
-
|
|
154
|
+
intent: 'read',
|
|
155
|
+
run: noop,
|
|
157
156
|
});
|
|
158
157
|
const entry = getFirstEntry(generateSurfaceMap(topoFrom({ t })));
|
|
159
158
|
|
|
160
|
-
expect(entry.
|
|
161
|
-
expect(entry.destructive).toBeUndefined();
|
|
159
|
+
expect(entry.intent).toBe('read');
|
|
162
160
|
expect(entry.idempotent).toBe(true);
|
|
163
161
|
});
|
|
164
162
|
|
|
@@ -169,9 +167,9 @@ describe('generateSurfaceMap', () => {
|
|
|
169
167
|
{ expected: { y: 0 }, input: { x: 0 }, name: 'zero' },
|
|
170
168
|
{ expected: { y: -2 }, input: { x: -1 }, name: 'negative' },
|
|
171
169
|
],
|
|
172
|
-
implementation: noop,
|
|
173
170
|
input: z.object({ x: z.number() }),
|
|
174
171
|
output: z.object({ y: z.number() }),
|
|
172
|
+
run: noop,
|
|
175
173
|
});
|
|
176
174
|
const tp = topoFrom({ t });
|
|
177
175
|
const map = generateSurfaceMap(tp);
|
|
@@ -185,8 +183,8 @@ describe('generateSurfaceMap', () => {
|
|
|
185
183
|
onError: ['notify.admin', 'log.error'],
|
|
186
184
|
onSuccess: ['cache.invalidate'],
|
|
187
185
|
},
|
|
188
|
-
implementation: noop,
|
|
189
186
|
input: z.object({}),
|
|
187
|
+
run: noop,
|
|
190
188
|
});
|
|
191
189
|
const entry = getFirstEntry(generateSurfaceMap(topoFrom({ t })));
|
|
192
190
|
|
|
@@ -199,8 +197,8 @@ describe('generateSurfaceMap', () => {
|
|
|
199
197
|
test('description is included when present', () => {
|
|
200
198
|
const t = trail('described', {
|
|
201
199
|
description: 'A described trail',
|
|
202
|
-
implementation: noop,
|
|
203
200
|
input: z.object({}),
|
|
201
|
+
run: noop,
|
|
204
202
|
});
|
|
205
203
|
const tp = topoFrom({ t });
|
|
206
204
|
const map = generateSurfaceMap(tp);
|
|
@@ -213,10 +211,10 @@ describe('generateSurfaceMap', () => {
|
|
|
213
211
|
test('determinism: same topo produces identical output', () => {
|
|
214
212
|
const t = trail('stable', {
|
|
215
213
|
description: 'Stable trail',
|
|
216
|
-
implementation: noop,
|
|
217
214
|
input: z.object({ a: z.string(), b: z.number() }),
|
|
215
|
+
intent: 'read',
|
|
218
216
|
output: z.object({ c: z.boolean() }),
|
|
219
|
-
|
|
217
|
+
run: noop,
|
|
220
218
|
});
|
|
221
219
|
const tp = topoFrom({ t });
|
|
222
220
|
|
|
@@ -229,8 +227,8 @@ describe('generateSurfaceMap', () => {
|
|
|
229
227
|
|
|
230
228
|
test('version is set to 1.0', () => {
|
|
231
229
|
const t = trail('v.check', {
|
|
232
|
-
implementation: noop,
|
|
233
230
|
input: z.object({}),
|
|
231
|
+
run: noop,
|
|
234
232
|
});
|
|
235
233
|
const tp = topoFrom({ t });
|
|
236
234
|
const map = generateSurfaceMap(tp);
|
|
@@ -240,8 +238,8 @@ describe('generateSurfaceMap', () => {
|
|
|
240
238
|
|
|
241
239
|
test('generatedAt is an ISO timestamp', () => {
|
|
242
240
|
const t = trail('ts.check', {
|
|
243
|
-
implementation: noop,
|
|
244
241
|
input: z.object({}),
|
|
242
|
+
run: noop,
|
|
245
243
|
});
|
|
246
244
|
const tp = topoFrom({ t });
|
|
247
245
|
const map = generateSurfaceMap(tp);
|
package/src/diff.ts
CHANGED
|
@@ -228,14 +228,19 @@ const diffMetadata = (
|
|
|
228
228
|
prev: SurfaceMapEntry,
|
|
229
229
|
curr: SurfaceMapEntry
|
|
230
230
|
): void => {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
231
|
+
if (prev.intent !== curr.intent) {
|
|
232
|
+
addDetail(
|
|
233
|
+
acc,
|
|
234
|
+
'warning',
|
|
235
|
+
`intent changed: ${String(prev.intent ?? 'write')} -> ${String(curr.intent ?? 'write')}`
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
if (prev.idempotent !== curr.idempotent) {
|
|
239
|
+
addDetail(
|
|
240
|
+
acc,
|
|
241
|
+
'warning',
|
|
242
|
+
`idempotent changed: ${String(prev.idempotent ?? false)} -> ${String(curr.idempotent ?? false)}`
|
|
243
|
+
);
|
|
239
244
|
}
|
|
240
245
|
if (prev.description !== curr.description) {
|
|
241
246
|
addDetail(acc, 'info', 'Description updated');
|
|
@@ -250,8 +255,8 @@ const diffMetadata = (
|
|
|
250
255
|
}
|
|
251
256
|
};
|
|
252
257
|
|
|
253
|
-
/** Build a
|
|
254
|
-
const
|
|
258
|
+
/** Build a follow-changed description from added/removed arrays. */
|
|
259
|
+
const buildFollowMessage = (added: string[], removed: string[]): string => {
|
|
255
260
|
const parts: string[] = [];
|
|
256
261
|
if (added.length > 0) {
|
|
257
262
|
parts.push(`added "${added.join('", "')}"`);
|
|
@@ -259,23 +264,21 @@ const buildFollowsMessage = (added: string[], removed: string[]): string => {
|
|
|
259
264
|
if (removed.length > 0) {
|
|
260
265
|
parts.push(`removed "${removed.join('", "')}"`);
|
|
261
266
|
}
|
|
262
|
-
return `
|
|
267
|
+
return `Follow changed: ${parts.join(', ')}`;
|
|
263
268
|
};
|
|
264
269
|
|
|
265
|
-
/** Diff
|
|
266
|
-
const
|
|
270
|
+
/** Diff follow arrays. */
|
|
271
|
+
const diffFollow = (
|
|
267
272
|
acc: DetailAccumulator,
|
|
268
273
|
prev: SurfaceMapEntry,
|
|
269
274
|
curr: SurfaceMapEntry
|
|
270
275
|
): void => {
|
|
271
|
-
const
|
|
272
|
-
const
|
|
273
|
-
const added = [...
|
|
274
|
-
const removed = [...
|
|
275
|
-
.filter((f) => !currFollows.has(f))
|
|
276
|
-
.toSorted();
|
|
276
|
+
const prevFollow = new Set(prev.follow);
|
|
277
|
+
const currFollow = new Set(curr.follow);
|
|
278
|
+
const added = [...currFollow].filter((f) => !prevFollow.has(f)).toSorted();
|
|
279
|
+
const removed = [...prevFollow].filter((f) => !currFollow.has(f)).toSorted();
|
|
277
280
|
if (added.length > 0 || removed.length > 0) {
|
|
278
|
-
addDetail(acc, 'warning',
|
|
281
|
+
addDetail(acc, 'warning', buildFollowMessage(added, removed));
|
|
279
282
|
}
|
|
280
283
|
};
|
|
281
284
|
|
|
@@ -289,7 +292,7 @@ const diffEntry = (
|
|
|
289
292
|
diffSchemaFields(acc, 'output', prev.output, curr.output);
|
|
290
293
|
diffSurfaces(acc, prev, curr);
|
|
291
294
|
diffMetadata(acc, prev, curr);
|
|
292
|
-
|
|
295
|
+
diffFollow(acc, prev, curr);
|
|
293
296
|
|
|
294
297
|
if (acc.details.length === 0) {
|
|
295
298
|
return undefined;
|
|
@@ -313,7 +316,7 @@ const diffEntry = (
|
|
|
313
316
|
*
|
|
314
317
|
* Classifies each change with a severity:
|
|
315
318
|
* - `info`: new trail, optional field added, output field added, description change
|
|
316
|
-
* - `warning`: safety marker change, deprecation,
|
|
319
|
+
* - `warning`: safety marker change, deprecation, follow change
|
|
317
320
|
* - `breaking`: trail removed, required input added, field removed, type change, surface removed
|
|
318
321
|
*/
|
|
319
322
|
/** Find entries added in curr that don't exist in prev. */
|
package/src/generate.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { zodToJsonSchema } from '@ontrails/core';
|
|
6
|
-
import type { Event,
|
|
6
|
+
import type { Event, Topo, Trail } from '@ontrails/core';
|
|
7
7
|
|
|
8
8
|
import type { JsonSchema, SurfaceMap, SurfaceMapEntry } from './types.js';
|
|
9
9
|
|
|
@@ -70,11 +70,8 @@ const addSafetyMarkers = (
|
|
|
70
70
|
entry: Record<string, unknown>,
|
|
71
71
|
t: Trail<unknown, unknown>
|
|
72
72
|
): void => {
|
|
73
|
-
if (t.
|
|
74
|
-
entry['
|
|
75
|
-
}
|
|
76
|
-
if (t.destructive === true) {
|
|
77
|
-
entry['destructive'] = true;
|
|
73
|
+
if (t.intent !== 'write') {
|
|
74
|
+
entry['intent'] = t.intent;
|
|
78
75
|
}
|
|
79
76
|
if (t.idempotent === true) {
|
|
80
77
|
entry['idempotent'] = true;
|
|
@@ -127,22 +124,8 @@ const trailToEntry = (t: Trail<unknown, unknown>): SurfaceMapEntry => {
|
|
|
127
124
|
addSchemas(entry, t);
|
|
128
125
|
addMetadata(entry, t, raw);
|
|
129
126
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const hikeToEntry = (r: Hike<unknown, unknown>): SurfaceMapEntry => {
|
|
134
|
-
const base = trailToEntry(r as unknown as Trail<unknown, unknown>);
|
|
135
|
-
const raw = r as unknown as Record<string, unknown>;
|
|
136
|
-
|
|
137
|
-
const entry: Record<string, unknown> = {
|
|
138
|
-
...base,
|
|
139
|
-
follows: r.follows.toSorted(),
|
|
140
|
-
kind: 'hike',
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
// Re-check surfaces on the route itself
|
|
144
|
-
if (Array.isArray(raw['surfaces'])) {
|
|
145
|
-
entry['surfaces'] = (raw['surfaces'] as string[]).toSorted();
|
|
127
|
+
if (t.follow.length > 0) {
|
|
128
|
+
entry['follow'] = t.follow.toSorted();
|
|
146
129
|
}
|
|
147
130
|
|
|
148
131
|
return sortKeys(entry) as unknown as SurfaceMapEntry;
|
|
@@ -198,11 +181,6 @@ export const generateSurfaceMap = (topo: Topo): SurfaceMap => {
|
|
|
198
181
|
entries.push(trailToEntry(t as Trail<unknown, unknown>));
|
|
199
182
|
}
|
|
200
183
|
|
|
201
|
-
// Collect all hikes
|
|
202
|
-
for (const r of topo.hikes.values()) {
|
|
203
|
-
entries.push(hikeToEntry(r as Hike<unknown, unknown>));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
184
|
// Collect all events
|
|
207
185
|
for (const e of topo.events.values()) {
|
|
208
186
|
entries.push(eventToEntry(e as Event<unknown>));
|
package/src/types.ts
CHANGED
|
@@ -15,16 +15,15 @@ export type JsonSchema = Readonly<Record<string, unknown>>;
|
|
|
15
15
|
|
|
16
16
|
export interface SurfaceMapEntry {
|
|
17
17
|
readonly id: string;
|
|
18
|
-
readonly kind: 'trail' | '
|
|
18
|
+
readonly kind: 'trail' | 'event';
|
|
19
19
|
readonly surfaces: readonly string[];
|
|
20
20
|
readonly input?: JsonSchema | undefined;
|
|
21
21
|
readonly output?: JsonSchema | undefined;
|
|
22
|
-
readonly
|
|
23
|
-
readonly destructive?: boolean | undefined;
|
|
22
|
+
readonly intent?: 'read' | 'write' | 'destroy' | undefined;
|
|
24
23
|
readonly idempotent?: boolean | undefined;
|
|
25
24
|
readonly deprecated?: boolean | undefined;
|
|
26
25
|
readonly replacedBy?: string | undefined;
|
|
27
|
-
readonly
|
|
26
|
+
readonly follow?: readonly string[] | undefined;
|
|
28
27
|
readonly detours?: Readonly<Record<string, readonly string[]>> | undefined;
|
|
29
28
|
readonly exampleCount: number;
|
|
30
29
|
readonly description?: string | undefined;
|
|
@@ -42,7 +41,7 @@ export interface SurfaceMap {
|
|
|
42
41
|
|
|
43
42
|
export interface DiffEntry {
|
|
44
43
|
readonly id: string;
|
|
45
|
-
readonly kind: 'trail' | '
|
|
44
|
+
readonly kind: 'trail' | 'event';
|
|
46
45
|
readonly change: 'added' | 'removed' | 'modified';
|
|
47
46
|
readonly severity: 'info' | 'warning' | 'breaking';
|
|
48
47
|
readonly details: readonly string[];
|