@ontrails/core 1.0.0-beta.14 → 1.0.0-beta.15
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 +11 -0
- package/README.md +17 -13
- package/dist/branded.d.ts +1 -1
- package/dist/branded.d.ts.map +1 -1
- package/dist/branded.js +1 -1
- package/dist/branded.js.map +1 -1
- package/dist/context.d.ts +13 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +19 -3
- package/dist/context.js.map +1 -1
- package/dist/contour.d.ts +81 -0
- package/dist/contour.d.ts.map +1 -0
- package/dist/contour.js +176 -0
- package/dist/contour.js.map +1 -0
- package/dist/cross-schema.d.ts +18 -0
- package/dist/cross-schema.d.ts.map +1 -0
- package/dist/cross-schema.js +29 -0
- package/dist/cross-schema.js.map +1 -0
- package/dist/draft.d.ts +5 -5
- package/dist/draft.d.ts.map +1 -1
- package/dist/draft.js +28 -27
- package/dist/draft.js.map +1 -1
- package/dist/errors.d.ts +62 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +44 -1
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +26 -9
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +441 -20
- package/dist/execute.js.map +1 -1
- package/dist/fire.d.ts +43 -0
- package/dist/fire.d.ts.map +1 -0
- package/dist/fire.js +185 -0
- package/dist/fire.js.map +1 -0
- package/dist/index.d.ts +31 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -13
- package/dist/index.js.map +1 -1
- package/dist/internal/cross-batch.d.ts +44 -0
- package/dist/internal/cross-batch.d.ts.map +1 -0
- package/dist/internal/cross-batch.js +58 -0
- package/dist/internal/cross-batch.js.map +1 -0
- package/dist/internal/fork-ctx.d.ts +41 -0
- package/dist/internal/fork-ctx.d.ts.map +1 -0
- package/dist/internal/fork-ctx.js +47 -0
- package/dist/internal/fork-ctx.js.map +1 -0
- package/dist/internal/signal-ref.d.ts +15 -0
- package/dist/internal/signal-ref.d.ts.map +1 -0
- package/dist/internal/signal-ref.js +41 -0
- package/dist/internal/signal-ref.js.map +1 -0
- package/dist/internal/topo-saves.d.ts +8 -2
- package/dist/internal/topo-saves.d.ts.map +1 -1
- package/dist/internal/topo-saves.js +162 -23
- package/dist/internal/topo-saves.js.map +1 -1
- package/dist/internal/topo-snapshots.d.ts +57 -0
- package/dist/internal/topo-snapshots.d.ts.map +1 -0
- package/dist/internal/topo-snapshots.js +372 -0
- package/dist/internal/topo-snapshots.js.map +1 -0
- package/dist/internal/topo-store-read.d.ts +23 -20
- package/dist/internal/topo-store-read.d.ts.map +1 -1
- package/dist/internal/topo-store-read.js +82 -83
- package/dist/internal/topo-store-read.js.map +1 -1
- package/dist/internal/topo-store.d.ts +19 -5
- package/dist/internal/topo-store.d.ts.map +1 -1
- package/dist/internal/topo-store.js +174 -124
- package/dist/internal/topo-store.js.map +1 -1
- package/dist/internal/tracing.d.ts +98 -0
- package/dist/internal/tracing.d.ts.map +1 -0
- package/dist/internal/tracing.js +102 -0
- package/dist/internal/tracing.js.map +1 -0
- package/dist/internal/trails-db.d.ts +2 -2
- package/dist/internal/trails-db.d.ts.map +1 -1
- package/dist/internal/trails-db.js +8 -8
- package/dist/internal/trails-db.js.map +1 -1
- package/dist/internal/zod-wrappers.d.ts +40 -0
- package/dist/internal/zod-wrappers.d.ts.map +1 -0
- package/dist/internal/zod-wrappers.js +59 -0
- package/dist/internal/zod-wrappers.js.map +1 -0
- package/dist/layer.d.ts +22 -5
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +20 -3
- package/dist/layer.js.map +1 -1
- package/dist/path-security.d.ts +1 -1
- package/dist/path-security.d.ts.map +1 -1
- package/dist/path-security.js +1 -1
- package/dist/path-security.js.map +1 -1
- package/dist/resilience.d.ts +1 -1
- package/dist/resilience.d.ts.map +1 -1
- package/dist/resilience.js +3 -3
- package/dist/resilience.js.map +1 -1
- package/dist/resource-config.d.ts +22 -0
- package/dist/resource-config.d.ts.map +1 -0
- package/dist/resource-config.js +210 -0
- package/dist/resource-config.js.map +1 -0
- package/dist/resource.d.ts +74 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +61 -0
- package/dist/resource.js.map +1 -0
- package/dist/run.d.ts +4 -3
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +5 -4
- package/dist/run.js.map +1 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2 -1
- package/dist/serialization.js.map +1 -1
- package/dist/store/accessor-protocol.d.ts +51 -0
- package/dist/store/accessor-protocol.d.ts.map +1 -0
- package/dist/store/accessor-protocol.js +2 -0
- package/dist/store/accessor-protocol.js.map +1 -0
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -0
- package/dist/surface-filter.d.ts +13 -0
- package/dist/surface-filter.d.ts.map +1 -0
- package/dist/surface-filter.js +76 -0
- package/dist/surface-filter.js.map +1 -0
- package/dist/topo-store.d.ts +36 -22
- package/dist/topo-store.d.ts.map +1 -1
- package/dist/topo-store.js +215 -71
- package/dist/topo-store.js.map +1 -1
- package/dist/topo.d.ts +23 -9
- package/dist/topo.d.ts.map +1 -1
- package/dist/topo.js +175 -46
- package/dist/topo.js.map +1 -1
- package/dist/trail.d.ts +86 -19
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +59 -4
- package/dist/trail.js.map +1 -1
- package/dist/trails/derive-trail.d.ts +66 -0
- package/dist/trails/derive-trail.d.ts.map +1 -0
- package/dist/trails/derive-trail.js +378 -0
- package/dist/trails/derive-trail.js.map +1 -0
- package/dist/trails/index.d.ts +5 -0
- package/dist/trails/index.d.ts.map +1 -0
- package/dist/trails/index.js +3 -0
- package/dist/trails/index.js.map +1 -0
- package/dist/trails/ingest.d.ts +24 -0
- package/dist/trails/ingest.d.ts.map +1 -0
- package/dist/trails/ingest.js +63 -0
- package/dist/trails/ingest.js.map +1 -0
- package/dist/transport-error-map.d.ts +106 -0
- package/dist/transport-error-map.d.ts.map +1 -0
- package/dist/transport-error-map.js +24 -0
- package/dist/transport-error-map.js.map +1 -0
- package/dist/type-checks.test-d.d.ts +71 -0
- package/dist/type-checks.test-d.d.ts.map +1 -0
- package/dist/type-checks.test-d.js +12 -0
- package/dist/type-checks.test-d.js.map +1 -0
- package/dist/type-utils.d.ts +11 -2
- package/dist/type-utils.d.ts.map +1 -1
- package/dist/type-utils.js.map +1 -1
- package/dist/types.d.ts +113 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validate-established-topo.js +2 -2
- package/dist/validate-established-topo.js.map +1 -1
- package/dist/validate-topo.d.ts.map +1 -1
- package/dist/validate-topo.js +24 -7
- package/dist/validate-topo.js.map +1 -1
- package/dist/workspace.d.ts +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -1
- package/dist/workspace.js.map +1 -1
- package/package.json +8 -2
- package/src/__tests__/branded.test.ts +5 -5
- package/src/__tests__/context.test.ts +3 -3
- package/src/__tests__/contour.test.ts +263 -0
- package/src/__tests__/derive-trail.test.ts +668 -0
- package/src/__tests__/errors.test.ts +118 -0
- package/src/__tests__/execute.test.ts +1179 -141
- package/src/__tests__/fire.test.ts +1056 -0
- package/src/__tests__/fork-ctx.test.ts +83 -0
- package/src/__tests__/ingest.test.ts +191 -0
- package/src/__tests__/{gate.test.ts → layer.test.ts} +21 -21
- package/src/__tests__/path-security.test.ts +7 -7
- package/src/__tests__/resilience.test.ts +8 -8
- package/src/__tests__/resource.test.ts +204 -0
- package/src/__tests__/run.test.ts +13 -13
- package/src/__tests__/service-config.test.ts +28 -32
- package/src/__tests__/surface-filter.test.ts +196 -0
- package/src/__tests__/topo-store-read.test.ts +41 -36
- package/src/__tests__/topo-store.test.ts +493 -93
- package/src/__tests__/topo.test.ts +350 -54
- package/src/__tests__/trail.test.ts +189 -24
- package/src/__tests__/trails-db.test.ts +32 -25
- package/src/__tests__/transport-error-map.test.ts +82 -0
- package/src/__tests__/type-utils.test.ts +29 -1
- package/src/__tests__/validate-topo.test.ts +147 -25
- package/src/__tests__/workspace.test.ts +6 -6
- package/src/__tests__/zod-wrappers.test.ts +62 -0
- package/src/branded.ts +1 -1
- package/src/context.ts +24 -4
- package/src/contour.ts +344 -0
- package/src/cross-schema.ts +36 -0
- package/src/draft.ts +56 -52
- package/src/errors.ts +62 -18
- package/src/execute.ts +840 -29
- package/src/fire.ts +295 -0
- package/src/index.ts +116 -29
- package/src/internal/cross-batch.ts +77 -0
- package/src/internal/fork-ctx.ts +69 -0
- package/src/internal/signal-ref.ts +87 -0
- package/src/internal/topo-snapshots.ts +517 -0
- package/src/internal/topo-store-read.ts +140 -132
- package/src/internal/topo-store.ts +291 -186
- package/src/internal/tracing.ts +187 -0
- package/src/internal/trails-db.ts +9 -11
- package/src/internal/zod-wrappers.ts +78 -0
- package/src/layer.ts +50 -0
- package/src/path-security.ts +1 -1
- package/src/resilience.ts +3 -3
- package/src/{provision-config.ts → resource-config.ts} +109 -123
- package/src/resource.ts +155 -0
- package/src/run.ts +5 -4
- package/src/serialization.ts +2 -0
- package/src/store/accessor-protocol.ts +56 -0
- package/src/store/index.ts +4 -0
- package/src/surface-filter.ts +182 -0
- package/src/topo-store.ts +313 -104
- package/src/topo.ts +328 -57
- package/src/trail.ts +199 -31
- package/src/trails/derive-trail.ts +842 -0
- package/src/trails/index.ts +9 -0
- package/src/trails/ingest.ts +146 -0
- package/src/transport-error-map.ts +56 -0
- package/src/type-checks.test-d.ts +106 -0
- package/src/type-utils.ts +17 -2
- package/src/types.ts +148 -11
- package/src/validate-established-topo.ts +2 -2
- package/src/validate-topo.ts +32 -8
- package/src/workspace.ts +1 -1
- package/tsconfig.tests.json +10 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/adapters.d.ts +0 -39
- package/dist/adapters.d.ts.map +0 -1
- package/dist/adapters.js +0 -2
- package/dist/adapters.js.map +0 -1
- package/dist/dispatch.d.ts +0 -27
- package/dist/dispatch.d.ts.map +0 -1
- package/dist/dispatch.js +0 -34
- package/dist/dispatch.js.map +0 -1
- package/dist/event.d.ts +0 -8
- package/dist/event.d.ts.map +0 -1
- package/dist/event.js +0 -7
- package/dist/event.js.map +0 -1
- package/dist/gate.d.ts +0 -17
- package/dist/gate.d.ts.map +0 -1
- package/dist/gate.js +0 -21
- package/dist/gate.js.map +0 -1
- package/dist/health.d.ts +0 -18
- package/dist/health.d.ts.map +0 -1
- package/dist/health.js +0 -5
- package/dist/health.js.map +0 -1
- package/dist/job.d.ts +0 -24
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -17
- package/dist/job.js.map +0 -1
- package/dist/provision-config.d.ts +0 -22
- package/dist/provision-config.d.ts.map +0 -1
- package/dist/provision-config.js +0 -210
- package/dist/provision-config.js.map +0 -1
- package/dist/provision.d.ts +0 -71
- package/dist/provision.d.ts.map +0 -1
- package/dist/provision.js +0 -56
- package/dist/provision.js.map +0 -1
- package/dist/service-config.d.ts +0 -22
- package/dist/service-config.d.ts.map +0 -1
- package/dist/service-config.js +0 -210
- package/dist/service-config.js.map +0 -1
- package/dist/service.d.ts +0 -71
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -56
- package/dist/service.js.map +0 -1
- package/src/__tests__/service.test.ts +0 -197
- package/src/event.ts +0 -15
- package/src/gate.ts +0 -44
- package/src/internal/topo-saves.ts +0 -429
- package/src/provision.ts +0 -148
|
@@ -6,18 +6,19 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
|
+
ConflictError,
|
|
9
10
|
createMockTopoStore,
|
|
11
|
+
createTopoSnapshot,
|
|
10
12
|
createTopoStore,
|
|
11
|
-
|
|
13
|
+
resource,
|
|
12
14
|
Result,
|
|
13
15
|
signal,
|
|
14
16
|
topo,
|
|
15
17
|
topoStore,
|
|
16
18
|
trail,
|
|
17
19
|
} from '../index.js';
|
|
18
|
-
import {
|
|
19
|
-
import type {
|
|
20
|
-
import { persistEstablishedTopoSave } from '../internal/topo-store.js';
|
|
20
|
+
import { pinTopoSnapshot } from '../internal/topo-snapshots.js';
|
|
21
|
+
import type { TopoSnapshot } from '../internal/topo-snapshots.js';
|
|
21
22
|
import { openWriteTrailsDb } from '../internal/trails-db.js';
|
|
22
23
|
|
|
23
24
|
const noop = () => Result.ok({ ok: true });
|
|
@@ -40,7 +41,7 @@ const requireValue = <T>(value: T | undefined, message: string): T => {
|
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
const exampleApp = () => {
|
|
43
|
-
const dbMain =
|
|
44
|
+
const dbMain = resource('db.main', {
|
|
44
45
|
create: () => Result.ok({ source: 'factory' }),
|
|
45
46
|
description: 'Primary database',
|
|
46
47
|
health: () => Result.ok({ ok: true }),
|
|
@@ -66,21 +67,20 @@ const exampleApp = () => {
|
|
|
66
67
|
],
|
|
67
68
|
input: z.object({ name: z.string() }),
|
|
68
69
|
output: z.object({ id: z.string(), ok: z.boolean() }),
|
|
69
|
-
|
|
70
|
+
resources: [dbMain],
|
|
70
71
|
});
|
|
71
72
|
|
|
72
73
|
const entityList = trail('entity.list', {
|
|
73
74
|
blaze: noop,
|
|
74
75
|
crosses: ['entity.add'],
|
|
75
76
|
description: 'List entities',
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
},
|
|
77
|
+
/* oxlint-disable-next-line require-await -- test stub */
|
|
78
|
+
detours: [{ on: ConflictError, recover: async () => Result.ok() }],
|
|
79
79
|
idempotent: true,
|
|
80
80
|
input: z.object({}),
|
|
81
81
|
intent: 'read',
|
|
82
82
|
output: z.object({ ok: z.boolean() }),
|
|
83
|
-
|
|
83
|
+
resources: [dbMain],
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
return topo('projection-app', {
|
|
@@ -108,35 +108,38 @@ describe('read-only topo store', () => {
|
|
|
108
108
|
|
|
109
109
|
const seedStore = (): {
|
|
110
110
|
readonly rootDir: string;
|
|
111
|
-
readonly
|
|
111
|
+
readonly snapshot: TopoSnapshot;
|
|
112
112
|
} => {
|
|
113
113
|
const rootDir = makeRoot();
|
|
114
114
|
const db = openWriteTrailsDb({ rootDir });
|
|
115
115
|
|
|
116
116
|
try {
|
|
117
|
-
const result =
|
|
117
|
+
const result = createTopoSnapshot(exampleApp(), {
|
|
118
118
|
createdAt: '2026-04-03T14:00:00.000Z',
|
|
119
119
|
gitSha: 'abc123',
|
|
120
|
+
rootDir,
|
|
120
121
|
});
|
|
121
122
|
if (result.isErr()) {
|
|
122
123
|
throw result.error;
|
|
123
124
|
}
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
return { rootDir,
|
|
125
|
+
const snapshot = result.value;
|
|
126
|
+
pinTopoSnapshot(db, { id: snapshot.id, name: 'baseline' });
|
|
127
|
+
return { rootDir, snapshot };
|
|
127
128
|
} finally {
|
|
128
129
|
db.close();
|
|
129
130
|
}
|
|
130
131
|
};
|
|
131
132
|
|
|
132
|
-
test('lists
|
|
133
|
-
const { rootDir,
|
|
133
|
+
test('lists snapshot-scoped trails and resources through typed accessors', () => {
|
|
134
|
+
const { rootDir, snapshot } = seedStore();
|
|
134
135
|
const store = createTopoStore({ rootDir });
|
|
135
136
|
|
|
136
|
-
expect(store.
|
|
137
|
-
expect(store.
|
|
137
|
+
expect(store.snapshots.latest()?.id).toBe(snapshot.id);
|
|
138
|
+
expect(store.snapshots.get({ pin: 'baseline' })?.id).toBe(snapshot.id);
|
|
138
139
|
|
|
139
|
-
expect(
|
|
140
|
+
expect(
|
|
141
|
+
store.trails.list({ snapshot: { snapshotId: snapshot.id } })
|
|
142
|
+
).toEqual([
|
|
140
143
|
expect.objectContaining({
|
|
141
144
|
description: 'Add a new entity',
|
|
142
145
|
exampleCount: 1,
|
|
@@ -153,7 +156,9 @@ describe('read-only topo store', () => {
|
|
|
153
156
|
}),
|
|
154
157
|
]);
|
|
155
158
|
|
|
156
|
-
expect(
|
|
159
|
+
expect(
|
|
160
|
+
store.resources.list({ snapshot: { snapshotId: snapshot.id } })
|
|
161
|
+
).toEqual([
|
|
157
162
|
expect.objectContaining({
|
|
158
163
|
description: 'Primary database',
|
|
159
164
|
health: 'available',
|
|
@@ -164,48 +169,48 @@ describe('read-only topo store', () => {
|
|
|
164
169
|
});
|
|
165
170
|
|
|
166
171
|
test('filters trails by intent', () => {
|
|
167
|
-
const { rootDir,
|
|
172
|
+
const { rootDir, snapshot } = seedStore();
|
|
168
173
|
const store = createTopoStore({ rootDir });
|
|
169
174
|
|
|
170
175
|
const writeTrails = store.trails.list({
|
|
171
176
|
intent: 'write',
|
|
172
|
-
|
|
177
|
+
snapshot: { snapshotId: snapshot.id },
|
|
173
178
|
});
|
|
174
179
|
expect(writeTrails).toHaveLength(1);
|
|
175
180
|
expect(writeTrails[0]?.id).toBe('entity.add');
|
|
176
181
|
|
|
177
182
|
const readTrails = store.trails.list({
|
|
178
183
|
intent: 'read',
|
|
179
|
-
|
|
184
|
+
snapshot: { snapshotId: snapshot.id },
|
|
180
185
|
});
|
|
181
186
|
expect(readTrails).toHaveLength(1);
|
|
182
187
|
expect(readTrails[0]?.id).toBe('entity.list');
|
|
183
188
|
});
|
|
184
189
|
|
|
185
190
|
test('returns detailed trail and export views, plus a query escape hatch', () => {
|
|
186
|
-
const { rootDir,
|
|
191
|
+
const { rootDir, snapshot } = seedStore();
|
|
187
192
|
const store = createTopoStore({ rootDir });
|
|
188
193
|
|
|
189
194
|
const detail = store.trails.get('entity.list', {
|
|
190
|
-
|
|
195
|
+
snapshot: { snapshotId: snapshot.id },
|
|
191
196
|
});
|
|
192
197
|
expect(detail).toEqual(
|
|
193
198
|
expect.objectContaining({
|
|
194
199
|
crosses: ['entity.add'],
|
|
195
|
-
detours: {
|
|
200
|
+
detours: [{ maxAttempts: 1, on: 'ConflictError' }],
|
|
196
201
|
id: 'entity.list',
|
|
197
|
-
|
|
202
|
+
resources: ['db.main'],
|
|
198
203
|
})
|
|
199
204
|
);
|
|
200
205
|
expect(detail?.examples).toEqual([]);
|
|
201
206
|
|
|
202
207
|
const exported = store.exports.get({ pin: 'baseline' });
|
|
203
|
-
expect(exported?.
|
|
204
|
-
expect(exported?.
|
|
208
|
+
expect(exported?.snapshot.id).toBe(snapshot.id);
|
|
209
|
+
expect(exported?.surfaceHash).toHaveLength(64);
|
|
205
210
|
|
|
206
211
|
const rows = store.query<{ id: string }>(
|
|
207
|
-
'SELECT id FROM topo_trails WHERE
|
|
208
|
-
[
|
|
212
|
+
'SELECT id FROM topo_trails WHERE snapshot_id = ? ORDER BY id ASC',
|
|
213
|
+
[snapshot.id]
|
|
209
214
|
);
|
|
210
215
|
expect(rows).toEqual([{ id: 'entity.add' }, { id: 'entity.list' }]);
|
|
211
216
|
});
|
|
@@ -214,12 +219,12 @@ describe('read-only topo store', () => {
|
|
|
214
219
|
const rootDir = makeRoot();
|
|
215
220
|
const store = createTopoStore({ rootDir });
|
|
216
221
|
|
|
217
|
-
expect(() => store.
|
|
222
|
+
expect(() => store.snapshots.latest()).toThrow('No saved topo state found');
|
|
218
223
|
expect(() => store.trails.list()).toThrow('No saved topo state found');
|
|
219
224
|
expect(() => store.exports.get()).toThrow('No saved topo state found');
|
|
220
225
|
});
|
|
221
226
|
|
|
222
|
-
test('exposes a
|
|
227
|
+
test('exposes a resource factory and mock for topoStore', async () => {
|
|
223
228
|
const { rootDir } = seedStore();
|
|
224
229
|
|
|
225
230
|
const created = await expectOk(
|
|
@@ -231,10 +236,10 @@ describe('read-only topo store', () => {
|
|
|
231
236
|
})
|
|
232
237
|
);
|
|
233
238
|
|
|
234
|
-
expect(created.
|
|
239
|
+
expect(created.snapshots.latest()).toBeDefined();
|
|
235
240
|
expect(
|
|
236
241
|
created.query<{ count: number }>(
|
|
237
|
-
'SELECT COUNT(*) as count FROM
|
|
242
|
+
'SELECT COUNT(*) as count FROM topo_snapshots'
|
|
238
243
|
)[0]?.count
|
|
239
244
|
).toBe(1);
|
|
240
245
|
|