@ontrails/core 1.0.0-beta.13 → 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.
Files changed (287) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +17 -0
  3. package/README.md +19 -14
  4. package/dist/branded.d.ts +1 -1
  5. package/dist/branded.d.ts.map +1 -1
  6. package/dist/branded.js +1 -1
  7. package/dist/branded.js.map +1 -1
  8. package/dist/context.d.ts +13 -1
  9. package/dist/context.d.ts.map +1 -1
  10. package/dist/context.js +19 -3
  11. package/dist/context.js.map +1 -1
  12. package/dist/contour.d.ts +81 -0
  13. package/dist/contour.d.ts.map +1 -0
  14. package/dist/contour.js +176 -0
  15. package/dist/contour.js.map +1 -0
  16. package/dist/cross-schema.d.ts +18 -0
  17. package/dist/cross-schema.d.ts.map +1 -0
  18. package/dist/cross-schema.js +29 -0
  19. package/dist/cross-schema.js.map +1 -0
  20. package/dist/derive.d.ts +6 -0
  21. package/dist/derive.d.ts.map +1 -1
  22. package/dist/derive.js +29 -5
  23. package/dist/derive.js.map +1 -1
  24. package/dist/draft.d.ts +28 -0
  25. package/dist/draft.d.ts.map +1 -0
  26. package/dist/draft.js +157 -0
  27. package/dist/draft.js.map +1 -0
  28. package/dist/errors.d.ts +62 -4
  29. package/dist/errors.d.ts.map +1 -1
  30. package/dist/errors.js +44 -1
  31. package/dist/errors.js.map +1 -1
  32. package/dist/execute.d.ts +26 -9
  33. package/dist/execute.d.ts.map +1 -1
  34. package/dist/execute.js +441 -20
  35. package/dist/execute.js.map +1 -1
  36. package/dist/fire.d.ts +43 -0
  37. package/dist/fire.d.ts.map +1 -0
  38. package/dist/fire.js +185 -0
  39. package/dist/fire.js.map +1 -0
  40. package/dist/index.d.ts +33 -17
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +26 -12
  43. package/dist/index.js.map +1 -1
  44. package/dist/internal/cross-batch.d.ts +44 -0
  45. package/dist/internal/cross-batch.d.ts.map +1 -0
  46. package/dist/internal/cross-batch.js +58 -0
  47. package/dist/internal/cross-batch.js.map +1 -0
  48. package/dist/internal/fork-ctx.d.ts +41 -0
  49. package/dist/internal/fork-ctx.d.ts.map +1 -0
  50. package/dist/internal/fork-ctx.js +47 -0
  51. package/dist/internal/fork-ctx.js.map +1 -0
  52. package/dist/internal/signal-ref.d.ts +15 -0
  53. package/dist/internal/signal-ref.d.ts.map +1 -0
  54. package/dist/internal/signal-ref.js +41 -0
  55. package/dist/internal/signal-ref.js.map +1 -0
  56. package/dist/internal/topo-saves.d.ts +53 -0
  57. package/dist/internal/topo-saves.d.ts.map +1 -0
  58. package/dist/internal/topo-saves.js +449 -0
  59. package/dist/internal/topo-saves.js.map +1 -0
  60. package/dist/internal/topo-snapshots.d.ts +57 -0
  61. package/dist/internal/topo-snapshots.d.ts.map +1 -0
  62. package/dist/internal/topo-snapshots.js +372 -0
  63. package/dist/internal/topo-snapshots.js.map +1 -0
  64. package/dist/internal/topo-store-read.d.ts +70 -0
  65. package/dist/internal/topo-store-read.d.ts.map +1 -0
  66. package/dist/internal/topo-store-read.js +221 -0
  67. package/dist/internal/topo-store-read.js.map +1 -0
  68. package/dist/internal/topo-store.d.ts +26 -0
  69. package/dist/internal/topo-store.d.ts.map +1 -0
  70. package/dist/internal/topo-store.js +621 -0
  71. package/dist/internal/topo-store.js.map +1 -0
  72. package/dist/internal/tracing.d.ts +98 -0
  73. package/dist/internal/tracing.d.ts.map +1 -0
  74. package/dist/internal/tracing.js +102 -0
  75. package/dist/internal/tracing.js.map +1 -0
  76. package/dist/internal/trails-db.d.ts +16 -0
  77. package/dist/internal/trails-db.d.ts.map +1 -0
  78. package/dist/internal/trails-db.js +118 -0
  79. package/dist/internal/trails-db.js.map +1 -0
  80. package/dist/internal/zod-wrappers.d.ts +40 -0
  81. package/dist/internal/zod-wrappers.d.ts.map +1 -0
  82. package/dist/internal/zod-wrappers.js +59 -0
  83. package/dist/internal/zod-wrappers.js.map +1 -0
  84. package/dist/layer.d.ts +22 -5
  85. package/dist/layer.d.ts.map +1 -1
  86. package/dist/layer.js +20 -3
  87. package/dist/layer.js.map +1 -1
  88. package/dist/path-security.d.ts +1 -1
  89. package/dist/path-security.d.ts.map +1 -1
  90. package/dist/path-security.js +1 -1
  91. package/dist/path-security.js.map +1 -1
  92. package/dist/resilience.d.ts +1 -1
  93. package/dist/resilience.d.ts.map +1 -1
  94. package/dist/resilience.js +3 -3
  95. package/dist/resilience.js.map +1 -1
  96. package/dist/resource-config.d.ts +22 -0
  97. package/dist/resource-config.d.ts.map +1 -0
  98. package/dist/resource-config.js +210 -0
  99. package/dist/resource-config.js.map +1 -0
  100. package/dist/resource.d.ts +74 -0
  101. package/dist/resource.d.ts.map +1 -0
  102. package/dist/resource.js +61 -0
  103. package/dist/resource.js.map +1 -0
  104. package/dist/run.d.ts +4 -3
  105. package/dist/run.d.ts.map +1 -1
  106. package/dist/run.js +5 -4
  107. package/dist/run.js.map +1 -1
  108. package/dist/serialization.d.ts.map +1 -1
  109. package/dist/serialization.js +2 -1
  110. package/dist/serialization.js.map +1 -1
  111. package/dist/store/accessor-protocol.d.ts +51 -0
  112. package/dist/store/accessor-protocol.d.ts.map +1 -0
  113. package/dist/store/accessor-protocol.js +2 -0
  114. package/dist/store/accessor-protocol.js.map +1 -0
  115. package/dist/store/index.d.ts +2 -0
  116. package/dist/store/index.d.ts.map +1 -0
  117. package/dist/store/index.js +2 -0
  118. package/dist/store/index.js.map +1 -0
  119. package/dist/surface-filter.d.ts +13 -0
  120. package/dist/surface-filter.d.ts.map +1 -0
  121. package/dist/surface-filter.js +76 -0
  122. package/dist/surface-filter.js.map +1 -0
  123. package/dist/topo-store.d.ts +62 -0
  124. package/dist/topo-store.d.ts.map +1 -0
  125. package/dist/topo-store.js +319 -0
  126. package/dist/topo-store.js.map +1 -0
  127. package/dist/topo.d.ts +23 -9
  128. package/dist/topo.d.ts.map +1 -1
  129. package/dist/topo.js +175 -46
  130. package/dist/topo.js.map +1 -1
  131. package/dist/trail.d.ts +86 -19
  132. package/dist/trail.d.ts.map +1 -1
  133. package/dist/trail.js +59 -4
  134. package/dist/trail.js.map +1 -1
  135. package/dist/trails/derive-trail.d.ts +66 -0
  136. package/dist/trails/derive-trail.d.ts.map +1 -0
  137. package/dist/trails/derive-trail.js +378 -0
  138. package/dist/trails/derive-trail.js.map +1 -0
  139. package/dist/trails/index.d.ts +5 -0
  140. package/dist/trails/index.d.ts.map +1 -0
  141. package/dist/trails/index.js +3 -0
  142. package/dist/trails/index.js.map +1 -0
  143. package/dist/trails/ingest.d.ts +24 -0
  144. package/dist/trails/ingest.d.ts.map +1 -0
  145. package/dist/trails/ingest.js +63 -0
  146. package/dist/trails/ingest.js.map +1 -0
  147. package/dist/transport-error-map.d.ts +106 -0
  148. package/dist/transport-error-map.d.ts.map +1 -0
  149. package/dist/transport-error-map.js +24 -0
  150. package/dist/transport-error-map.js.map +1 -0
  151. package/dist/type-checks.test-d.d.ts +71 -0
  152. package/dist/type-checks.test-d.d.ts.map +1 -0
  153. package/dist/type-checks.test-d.js +12 -0
  154. package/dist/type-checks.test-d.js.map +1 -0
  155. package/dist/type-utils.d.ts +11 -2
  156. package/dist/type-utils.d.ts.map +1 -1
  157. package/dist/type-utils.js.map +1 -1
  158. package/dist/types.d.ts +113 -7
  159. package/dist/types.d.ts.map +1 -1
  160. package/dist/types.js.map +1 -1
  161. package/dist/validate-established-topo.d.ts +76 -0
  162. package/dist/validate-established-topo.d.ts.map +1 -0
  163. package/dist/validate-established-topo.js +43 -0
  164. package/dist/validate-established-topo.js.map +1 -0
  165. package/dist/validate-topo.d.ts.map +1 -1
  166. package/dist/validate-topo.js +27 -8
  167. package/dist/validate-topo.js.map +1 -1
  168. package/dist/workspace.d.ts +1 -1
  169. package/dist/workspace.d.ts.map +1 -1
  170. package/dist/workspace.js +1 -1
  171. package/dist/workspace.js.map +1 -1
  172. package/package.json +10 -1
  173. package/src/__tests__/branded.test.ts +5 -5
  174. package/src/__tests__/context.test.ts +3 -3
  175. package/src/__tests__/contour.test.ts +263 -0
  176. package/src/__tests__/derive-trail.test.ts +668 -0
  177. package/src/__tests__/derive.test.ts +58 -1
  178. package/src/__tests__/errors.test.ts +118 -0
  179. package/src/__tests__/execute.test.ts +1179 -141
  180. package/src/__tests__/fire.test.ts +1056 -0
  181. package/src/__tests__/fork-ctx.test.ts +83 -0
  182. package/src/__tests__/ingest.test.ts +191 -0
  183. package/src/__tests__/{gate.test.ts → layer.test.ts} +21 -21
  184. package/src/__tests__/path-security.test.ts +7 -7
  185. package/src/__tests__/resilience.test.ts +8 -8
  186. package/src/__tests__/resource.test.ts +204 -0
  187. package/src/__tests__/run.test.ts +13 -13
  188. package/src/__tests__/service-config.test.ts +28 -32
  189. package/src/__tests__/surface-filter.test.ts +196 -0
  190. package/src/__tests__/topo-store-read.test.ts +256 -0
  191. package/src/__tests__/topo-store.test.ts +869 -0
  192. package/src/__tests__/topo.test.ts +350 -54
  193. package/src/__tests__/trail.test.ts +189 -24
  194. package/src/__tests__/trails-db.test.ts +198 -0
  195. package/src/__tests__/transport-error-map.test.ts +82 -0
  196. package/src/__tests__/type-utils.test.ts +29 -1
  197. package/src/__tests__/validate-topo.test.ts +305 -16
  198. package/src/__tests__/workspace.test.ts +6 -6
  199. package/src/__tests__/zod-wrappers.test.ts +62 -0
  200. package/src/branded.ts +1 -1
  201. package/src/context.ts +24 -4
  202. package/src/contour.ts +344 -0
  203. package/src/cross-schema.ts +36 -0
  204. package/src/derive.ts +39 -8
  205. package/src/draft.ts +338 -0
  206. package/src/errors.ts +62 -18
  207. package/src/execute.ts +840 -29
  208. package/src/fire.ts +295 -0
  209. package/src/index.ts +142 -26
  210. package/src/internal/cross-batch.ts +77 -0
  211. package/src/internal/fork-ctx.ts +69 -0
  212. package/src/internal/signal-ref.ts +87 -0
  213. package/src/internal/topo-snapshots.ts +517 -0
  214. package/src/internal/topo-store-read.ts +481 -0
  215. package/src/internal/topo-store.ts +1192 -0
  216. package/src/internal/tracing.ts +187 -0
  217. package/src/internal/trails-db.ts +187 -0
  218. package/src/internal/zod-wrappers.ts +78 -0
  219. package/src/layer.ts +50 -0
  220. package/src/path-security.ts +1 -1
  221. package/src/resilience.ts +3 -3
  222. package/src/{provision-config.ts → resource-config.ts} +109 -123
  223. package/src/resource.ts +155 -0
  224. package/src/run.ts +5 -4
  225. package/src/serialization.ts +2 -0
  226. package/src/store/accessor-protocol.ts +56 -0
  227. package/src/store/index.ts +4 -0
  228. package/src/surface-filter.ts +182 -0
  229. package/src/topo-store.ts +510 -0
  230. package/src/topo.ts +328 -57
  231. package/src/trail.ts +199 -31
  232. package/src/trails/derive-trail.ts +842 -0
  233. package/src/trails/index.ts +9 -0
  234. package/src/trails/ingest.ts +146 -0
  235. package/src/transport-error-map.ts +56 -0
  236. package/src/type-checks.test-d.ts +106 -0
  237. package/src/type-utils.ts +17 -2
  238. package/src/types.ts +148 -11
  239. package/src/validate-established-topo.ts +63 -0
  240. package/src/validate-topo.ts +37 -9
  241. package/src/workspace.ts +1 -1
  242. package/tsconfig.tests.json +10 -0
  243. package/tsconfig.tsbuildinfo +1 -1
  244. package/dist/adapters.d.ts +0 -39
  245. package/dist/adapters.d.ts.map +0 -1
  246. package/dist/adapters.js +0 -2
  247. package/dist/adapters.js.map +0 -1
  248. package/dist/dispatch.d.ts +0 -27
  249. package/dist/dispatch.d.ts.map +0 -1
  250. package/dist/dispatch.js +0 -34
  251. package/dist/dispatch.js.map +0 -1
  252. package/dist/event.d.ts +0 -8
  253. package/dist/event.d.ts.map +0 -1
  254. package/dist/event.js +0 -7
  255. package/dist/event.js.map +0 -1
  256. package/dist/gate.d.ts +0 -17
  257. package/dist/gate.d.ts.map +0 -1
  258. package/dist/gate.js +0 -21
  259. package/dist/gate.js.map +0 -1
  260. package/dist/health.d.ts +0 -18
  261. package/dist/health.d.ts.map +0 -1
  262. package/dist/health.js +0 -5
  263. package/dist/health.js.map +0 -1
  264. package/dist/job.d.ts +0 -24
  265. package/dist/job.d.ts.map +0 -1
  266. package/dist/job.js +0 -17
  267. package/dist/job.js.map +0 -1
  268. package/dist/provision-config.d.ts +0 -22
  269. package/dist/provision-config.d.ts.map +0 -1
  270. package/dist/provision-config.js +0 -210
  271. package/dist/provision-config.js.map +0 -1
  272. package/dist/provision.d.ts +0 -71
  273. package/dist/provision.d.ts.map +0 -1
  274. package/dist/provision.js +0 -56
  275. package/dist/provision.js.map +0 -1
  276. package/dist/service-config.d.ts +0 -22
  277. package/dist/service-config.d.ts.map +0 -1
  278. package/dist/service-config.js +0 -210
  279. package/dist/service-config.js.map +0 -1
  280. package/dist/service.d.ts +0 -71
  281. package/dist/service.d.ts.map +0 -1
  282. package/dist/service.js +0 -56
  283. package/dist/service.js.map +0 -1
  284. package/src/__tests__/service.test.ts +0 -197
  285. package/src/event.ts +0 -15
  286. package/src/gate.ts +0 -44
  287. package/src/provision.ts +0 -148
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod';
2
+ import type { AnyContour } from '../contour.js';
3
+ import type { AnyResource } from '../resource.js';
4
+ import type { Trail, TrailSpec } from '../trail.js';
5
+ import type { Implementation } from '../types.js';
6
+ /**
7
+ * CRUD-shaped operations the base trail derivation helper understands.
8
+ */
9
+ export type DeriveTrailOperation = 'create' | 'read' | 'update' | 'delete' | 'list';
10
+ type ContourInput<TContour extends AnyContour> = z.input<TContour>;
11
+ type ContourOutput<TContour extends AnyContour> = z.output<TContour>;
12
+ type ContourFieldKey<TContour extends AnyContour> = Extract<keyof ContourOutput<TContour>, string>;
13
+ type IdentityKey<TContour extends AnyContour> = Extract<TContour['identity'], keyof ContourInput<TContour> & string>;
14
+ type GeneratedKey<TContour extends AnyContour, TGenerated extends readonly ContourFieldKey<TContour>[] | undefined> = TGenerated extends readonly ContourFieldKey<TContour>[] ? TGenerated[number] : never;
15
+ type CreateInputOf<TContour extends AnyContour, TGenerated extends readonly ContourFieldKey<TContour>[] | undefined> = Omit<ContourInput<TContour>, Extract<GeneratedKey<TContour, TGenerated>, keyof ContourInput<TContour>>>;
16
+ type ReadInputOf<TContour extends AnyContour> = Pick<ContourInput<TContour>, IdentityKey<TContour>>;
17
+ type UpdateInputOf<TContour extends AnyContour, TGenerated extends readonly ContourFieldKey<TContour>[] | undefined> = ReadInputOf<TContour> & Partial<Omit<CreateInputOf<TContour, TGenerated>, IdentityKey<TContour>>>;
18
+ type ListInputOf<TContour extends AnyContour> = Partial<ContourInput<TContour>>;
19
+ /**
20
+ * Input shape derived for one operation against one contour.
21
+ */
22
+ export type DeriveTrailInput<TContour extends AnyContour, TOperation extends DeriveTrailOperation, TGenerated extends readonly ContourFieldKey<TContour>[] | undefined = readonly ContourFieldKey<TContour>[] | undefined> = TOperation extends 'create' ? CreateInputOf<TContour, TGenerated> : TOperation extends 'read' | 'delete' ? ReadInputOf<TContour> : TOperation extends 'update' ? UpdateInputOf<TContour, TGenerated> : ListInputOf<TContour>;
23
+ /**
24
+ * Output shape derived for one operation against one contour.
25
+ */
26
+ export type DeriveTrailOutput<TContour extends AnyContour, TOperation extends DeriveTrailOperation> = TOperation extends 'delete' ? undefined : TOperation extends 'list' ? ContourOutput<TContour>[] : ContourOutput<TContour>;
27
+ /**
28
+ * Extra authored data accepted by `deriveTrail()` in addition to the
29
+ * operation-derived contract pieces.
30
+ *
31
+ * `blaze` is optional for single-resource calls: when omitted, the helper
32
+ * synthesizes a default blaze that delegates to the resource's accessor via
33
+ * the structural {@link StoreAccessorProtocol}. When multiple resources are
34
+ * declared, an explicit `blaze` is required.
35
+ */
36
+ export interface DeriveTrailSpec<TContour extends AnyContour, TOperation extends DeriveTrailOperation, TGenerated extends readonly ContourFieldKey<TContour>[] | undefined = readonly ContourFieldKey<TContour>[] | undefined> extends Omit<TrailSpec<DeriveTrailInput<TContour, TOperation, TGenerated>, DeriveTrailOutput<TContour, TOperation>>, 'blaze' | 'contours' | 'examples' | 'input' | 'intent' | 'output' | 'resources'> {
37
+ /**
38
+ * Implementation of the trail. Optional for single-resource calls: when
39
+ * omitted, the helper derives a default blaze from the resource accessor
40
+ * for standard CRUD operations.
41
+ */
42
+ readonly blaze?: Implementation<DeriveTrailInput<TContour, TOperation, TGenerated>, DeriveTrailOutput<TContour, TOperation>>;
43
+ /**
44
+ * Server-managed fields that should not be writable through derived create
45
+ * and update inputs.
46
+ */
47
+ readonly generated?: TGenerated;
48
+ /**
49
+ * Resource dependency declared on the derived trail. Pass a single
50
+ * resource for default-blaze synthesis, or an array for multi-resource
51
+ * trails that must provide an explicit `blaze`.
52
+ */
53
+ readonly resource: AnyResource | readonly AnyResource[];
54
+ }
55
+ /**
56
+ * Mechanically project one CRUD-shaped trail from a contour declaration.
57
+ *
58
+ * When `spec.blaze` is omitted and the call declares a single resource, the
59
+ * helper derives a default blaze that dispatches to the resource accessor
60
+ * through the structural {@link StoreAccessorProtocol}. Multi-resource calls
61
+ * must supply an explicit blaze and are rejected with {@link DerivationError}
62
+ * at construction time when they do not.
63
+ */
64
+ export declare const deriveTrail: <TContour extends AnyContour, TOperation extends DeriveTrailOperation, TGenerated extends readonly ContourFieldKey<TContour>[] | undefined = readonly ContourFieldKey<TContour>[] | undefined>(contour: TContour, operation: TOperation, spec: DeriveTrailSpec<TContour, TOperation, TGenerated>) => Trail<DeriveTrailInput<TContour, TOperation, TGenerated>, DeriveTrailOutput<TContour, TOperation>>;
65
+ export {};
66
+ //# sourceMappingURL=derive-trail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive-trail.d.ts","sourceRoot":"","sources":["../../src/trails/derive-trail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,378 @@
1
+ import { z } from 'zod';
2
+ import { DerivationError, InternalError, isTrailsError, NotFoundError, } from '../errors.js';
3
+ import { stripDefaultsFromShape } from '../internal/zod-wrappers.js';
4
+ import { Result } from '../result.js';
5
+ import { trail } from '../trail.js';
6
+ const operationIntent = {
7
+ create: 'write',
8
+ delete: 'destroy',
9
+ list: 'read',
10
+ read: 'read',
11
+ update: 'write',
12
+ };
13
+ const describeDeriveTrailResourceDeclaration = (resourceCount) => resourceCount === 0
14
+ ? 'no resources are declared'
15
+ : 'multiple resources are declared';
16
+ const titleCase = (value) => value.length === 0 ? value : value.slice(0, 1).toUpperCase() + value.slice(1);
17
+ const uniqueStrings = (values) => Object.freeze([...(values === undefined ? [] : new Set(values))]);
18
+ const buildFieldMask = (fields) => Object.fromEntries(fields.map((field) => [field, true]));
19
+ const asObjectSchema = (schema) => schema;
20
+ const unsupportedOperation = (operation) => {
21
+ throw new DerivationError(`Unsupported deriveTrail() operation: ${String(operation)}`);
22
+ };
23
+ const omitFields = (schema, fields) => {
24
+ const objectSchema = asObjectSchema(schema);
25
+ return fields.length === 0
26
+ ? objectSchema
27
+ : objectSchema.omit(buildFieldMask(fields));
28
+ };
29
+ const pickFields = (schema, fields) => asObjectSchema(schema).pick(buildFieldMask(fields));
30
+ const toPartialSchema = (schema) => asObjectSchema(schema)
31
+ .extend(stripDefaultsFromShape(schema))
32
+ .partial();
33
+ const normalizeResources = (resource) => Object.freeze(Array.isArray(resource) ? [...resource] : [resource]);
34
+ const identityInputSchema = (contour) => pickFields(contour, [contour.identity]);
35
+ const createInputSchema = (contour, generated) => omitFields(contour, generated);
36
+ const updateInputSchema = (contour, generated) => {
37
+ const mutableSchema = omitFields(contour, [...generated, contour.identity]);
38
+ const identitySchema = asObjectSchema(identityInputSchema(contour));
39
+ return identitySchema.extend(toPartialSchema(mutableSchema).shape);
40
+ };
41
+ const listInputSchema = (contour) => toPartialSchema(contour);
42
+ const deriveInputSchema = (contour, operation, generated) => {
43
+ switch (operation) {
44
+ case 'create': {
45
+ return createInputSchema(contour, generated);
46
+ }
47
+ case 'read':
48
+ case 'delete': {
49
+ return identityInputSchema(contour);
50
+ }
51
+ case 'update': {
52
+ return updateInputSchema(contour, generated);
53
+ }
54
+ case 'list': {
55
+ return listInputSchema(contour);
56
+ }
57
+ default: {
58
+ return unsupportedOperation(operation);
59
+ }
60
+ }
61
+ };
62
+ const deriveOutputSchema = (contour, operation) => {
63
+ switch (operation) {
64
+ case 'delete': {
65
+ return z.void();
66
+ }
67
+ case 'list': {
68
+ return contour.array();
69
+ }
70
+ case 'create':
71
+ case 'read':
72
+ case 'update': {
73
+ return contour;
74
+ }
75
+ default: {
76
+ return unsupportedOperation(operation);
77
+ }
78
+ }
79
+ };
80
+ const pickValueFields = (example, fields) => Object.fromEntries(fields.flatMap((field) => Object.hasOwn(example, field) ? [[field, example[field]]] : []));
81
+ const omitValueFields = (example, fields) => {
82
+ const omitted = new Set(fields);
83
+ return Object.fromEntries(Object.entries(example).filter(([field]) => !omitted.has(field)));
84
+ };
85
+ const formatExampleName = (contour, operation, example, index) => {
86
+ const identifier = example[contour.identity];
87
+ const suffix = identifier === undefined ? String(index + 1) : String(identifier);
88
+ return `${titleCase(operation)} ${contour.name} ${suffix}`;
89
+ };
90
+ /**
91
+ * Derive a single trail example from a contour fixture.
92
+ *
93
+ * @remarks
94
+ * For `list` operations, each derived example wraps a single fixture in an
95
+ * array (`expected: [example]`) and uses the fixture's identity as input
96
+ * filters. This means the expected output is always a one-element array,
97
+ * which may not match the real accessor behavior when multiple fixtures
98
+ * share the same filter. A custom `blaze` with hand-authored examples is
99
+ * required for multi-result list assertions.
100
+ */
101
+ const deriveExample = (contour, operation, example, index, generated) => {
102
+ const name = formatExampleName(contour, operation, example, index);
103
+ const identity = pickValueFields(example, [contour.identity]);
104
+ switch (operation) {
105
+ case 'create': {
106
+ return {
107
+ expected: example,
108
+ input: omitValueFields(example, generated),
109
+ name,
110
+ };
111
+ }
112
+ case 'read': {
113
+ return {
114
+ expected: example,
115
+ input: identity,
116
+ name,
117
+ };
118
+ }
119
+ case 'update': {
120
+ return {
121
+ expected: example,
122
+ input: {
123
+ ...omitValueFields(example, [...generated, contour.identity]),
124
+ ...identity,
125
+ },
126
+ name,
127
+ };
128
+ }
129
+ case 'delete': {
130
+ return {
131
+ input: identity,
132
+ name,
133
+ };
134
+ }
135
+ case 'list': {
136
+ return {
137
+ expected: [example],
138
+ input: {},
139
+ name,
140
+ };
141
+ }
142
+ default: {
143
+ return unsupportedOperation(operation);
144
+ }
145
+ }
146
+ };
147
+ const deriveExamples = (contour, operation, generated) => {
148
+ if (contour.examples === undefined || contour.examples.length === 0) {
149
+ return undefined;
150
+ }
151
+ // List examples use a single example with all fixtures in expected,
152
+ // since input: {} returns the full set from a seeded mock. Expected
153
+ // values keep generated fields (createdAt, etc.) because the mock
154
+ // populates them — stripping them would fail output schema validation.
155
+ if (operation === 'list') {
156
+ return Object.freeze([
157
+ {
158
+ expected: contour.examples,
159
+ input: {},
160
+ name: `${contour.name} list example`,
161
+ },
162
+ ]);
163
+ }
164
+ return Object.freeze(contour.examples.map((example, index) => deriveExample(contour, operation, example, index, generated)));
165
+ };
166
+ const wrapUnexpected = (contourName, operation, error) => {
167
+ if (isTrailsError(error)) {
168
+ return error;
169
+ }
170
+ const cause = error instanceof Error ? error : new Error(String(error));
171
+ return new InternalError(`deriveTrail("${contourName}.${operation}") synthesized blaze failed: ${cause.message}`, { cause });
172
+ };
173
+ const notFoundError = (contourName, id) => new NotFoundError(`deriveTrail("${contourName}"): entity "${String(id)}" not found`);
174
+ const resolveAccessor = (contour, operation, resource, ctx) => {
175
+ try {
176
+ const connection = resource.from(ctx);
177
+ if (connection === undefined || connection === null) {
178
+ return new InternalError(`deriveTrail("${contour.name}.${operation}"): resource "${resource.id}" produced no connection`);
179
+ }
180
+ const accessor = connection[contour.name];
181
+ if (accessor === undefined) {
182
+ return new InternalError(`deriveTrail("${contour.name}.${operation}"): resource "${resource.id}" does not expose an accessor for "${contour.name}"`);
183
+ }
184
+ return accessor;
185
+ }
186
+ catch (error) {
187
+ return wrapUnexpected(contour.name, operation, error);
188
+ }
189
+ };
190
+ const extractIdentity = (contour, input) => {
191
+ const record = input;
192
+ return record[contour.identity];
193
+ };
194
+ const callRead = async (contour, accessor, input) => {
195
+ if (typeof accessor.get !== 'function') {
196
+ return Result.err(new InternalError(`deriveTrail("${contour.name}.read"): accessor is missing a \`get\` method`));
197
+ }
198
+ try {
199
+ const id = extractIdentity(contour, input);
200
+ const entity = await accessor.get(id);
201
+ if (entity === null || entity === undefined) {
202
+ return Result.err(notFoundError(contour.name, id));
203
+ }
204
+ return Result.ok(entity);
205
+ }
206
+ catch (error) {
207
+ return Result.err(wrapUnexpected(contour.name, 'read', error));
208
+ }
209
+ };
210
+ const callCreate = async (contour, accessor, input, ctx) => {
211
+ try {
212
+ if (typeof accessor.insert === 'function') {
213
+ const created = await accessor.insert(input);
214
+ return Result.ok(created);
215
+ }
216
+ // Fallback: tabular contract allows `upsert` when `insert` is absent.
217
+ // The warden flags this at build time via a pattern rule (trl-251).
218
+ if (typeof accessor.upsert !== 'function') {
219
+ return Result.err(new InternalError(`deriveTrail("${contour.name}.create"): accessor is missing both \`insert\` and \`upsert\``));
220
+ }
221
+ ctx.logger?.debug(`deriveTrail("${contour.name}.create"): accessor has no \`insert\`; falling back to \`upsert\``);
222
+ const created = await accessor.upsert(input);
223
+ return Result.ok(created);
224
+ }
225
+ catch (error) {
226
+ return Result.err(wrapUnexpected(contour.name, 'create', error));
227
+ }
228
+ };
229
+ /**
230
+ * Strip framework-managed generated fields from a merged payload so that
231
+ * the update-via-upsert fallback doesn't carry stale managed values.
232
+ *
233
+ * Only strips fields that appear in the `generated` array — user-defined
234
+ * fields with the same name (e.g. an API `version` string) are preserved.
235
+ */
236
+ const stripGeneratedFields = (payload, generated, identity) => {
237
+ if (generated.length === 0) {
238
+ return payload;
239
+ }
240
+ const managedKeys = new Set(generated);
241
+ return Object.fromEntries(Object.entries(payload).filter(([key]) => key === identity || !managedKeys.has(key)));
242
+ };
243
+ /**
244
+ * Fallback for accessors that lack a native `update`: read the current
245
+ * entity, merge the patch, strip any `version` field so versioned tables
246
+ * keep `update`'s "does not participate in optimistic concurrency" semantic,
247
+ * then `upsert`.
248
+ */
249
+ const updateViaReadAndUpsert = async (contour, accessor, id, patch, generated) => {
250
+ if (typeof accessor.get !== 'function') {
251
+ return Result.err(new InternalError(`deriveTrail("${contour.name}.update"): accessor is missing both \`update\` and \`get\``));
252
+ }
253
+ if (typeof accessor.upsert !== 'function') {
254
+ return Result.err(new InternalError(`deriveTrail("${contour.name}.update"): accessor is missing both \`update\` and \`upsert\``));
255
+ }
256
+ const current = await accessor.get(id);
257
+ if (current === null || current === undefined) {
258
+ return Result.err(notFoundError(contour.name, id));
259
+ }
260
+ const merged = stripGeneratedFields({ ...current, ...patch }, generated, contour.identity);
261
+ const updated = await accessor.upsert(merged);
262
+ return Result.ok(updated);
263
+ };
264
+ const callUpdate = async (contour, accessor, input, generated) => {
265
+ const id = extractIdentity(contour, input);
266
+ const patch = Object.fromEntries(Object.entries(input).filter(([field]) => field !== contour.identity));
267
+ try {
268
+ if (typeof accessor.update === 'function') {
269
+ const updated = await accessor.update(id, patch);
270
+ if (updated === null || updated === undefined) {
271
+ return Result.err(notFoundError(contour.name, id));
272
+ }
273
+ return Result.ok(updated);
274
+ }
275
+ return await updateViaReadAndUpsert(contour, accessor, id, patch, generated);
276
+ }
277
+ catch (error) {
278
+ return Result.err(wrapUnexpected(contour.name, 'update', error));
279
+ }
280
+ };
281
+ const callDelete = async (contour, accessor, input) => {
282
+ if (typeof accessor.remove !== 'function') {
283
+ return Result.err(new InternalError(`deriveTrail("${contour.name}.delete"): accessor is missing a \`remove\` method`));
284
+ }
285
+ try {
286
+ const id = extractIdentity(contour, input);
287
+ await accessor.remove(id);
288
+ // `{ deleted: false }` is a no-op on an absent row, not an error —
289
+ // matches the accessor's documented semantic.
290
+ return Result.ok();
291
+ }
292
+ catch (error) {
293
+ return Result.err(wrapUnexpected(contour.name, 'delete', error));
294
+ }
295
+ };
296
+ /**
297
+ * Default `list` synthesis passes the entire input as the filter bag. The
298
+ * derived input type is `Partial<ContourInput>` which matches the accessor's
299
+ * filter shape field-for-field. Pagination controls are not derived — callers
300
+ * that need pagination must provide an explicit blaze.
301
+ */
302
+ const callList = async (contour, accessor, input) => {
303
+ if (typeof accessor.list !== 'function') {
304
+ return Result.err(new InternalError(`deriveTrail("${contour.name}.list"): accessor is missing a \`list\` method`));
305
+ }
306
+ try {
307
+ const listed = await accessor.list(input);
308
+ return Result.ok([...listed]);
309
+ }
310
+ catch (error) {
311
+ return Result.err(wrapUnexpected(contour.name, 'list', error));
312
+ }
313
+ };
314
+ const synthesizeDefaultBlaze = (contour, operation, resource, generated) => {
315
+ const impl = (input, ctx) => {
316
+ const accessor = resolveAccessor(contour, operation, resource, ctx);
317
+ if (accessor instanceof Error) {
318
+ return Promise.resolve(Result.err(accessor));
319
+ }
320
+ switch (operation) {
321
+ case 'create': {
322
+ return callCreate(contour, accessor, input, ctx);
323
+ }
324
+ case 'read': {
325
+ return callRead(contour, accessor, input);
326
+ }
327
+ case 'update': {
328
+ return callUpdate(contour, accessor, input, generated);
329
+ }
330
+ case 'delete': {
331
+ return callDelete(contour, accessor, input);
332
+ }
333
+ case 'list': {
334
+ return callList(contour, accessor, input);
335
+ }
336
+ default: {
337
+ return unsupportedOperation(operation);
338
+ }
339
+ }
340
+ };
341
+ return impl;
342
+ };
343
+ /**
344
+ * Mechanically project one CRUD-shaped trail from a contour declaration.
345
+ *
346
+ * When `spec.blaze` is omitted and the call declares a single resource, the
347
+ * helper derives a default blaze that dispatches to the resource accessor
348
+ * through the structural {@link StoreAccessorProtocol}. Multi-resource calls
349
+ * must supply an explicit blaze and are rejected with {@link DerivationError}
350
+ * at construction time when they do not.
351
+ */
352
+ export const deriveTrail = (contour, operation, spec) => {
353
+ const resources = normalizeResources(spec.resource);
354
+ const generated = uniqueStrings(spec.generated);
355
+ let blaze;
356
+ if (typeof spec.blaze === 'function') {
357
+ ({ blaze } = spec);
358
+ }
359
+ else if (resources.length === 1) {
360
+ blaze = synthesizeDefaultBlaze(contour, operation, resources[0], generated);
361
+ }
362
+ else {
363
+ throw new DerivationError(`deriveTrail("${contour.name}.${operation}") requires an explicit \`blaze\` when ${describeDeriveTrailResourceDeclaration(resources.length)} — default synthesis is single-resource only`);
364
+ }
365
+ const { blaze: _blaze, resource: _resource, generated: _generated, ...trailSpec } = spec;
366
+ const derivedSpec = {
367
+ ...trailSpec,
368
+ blaze,
369
+ contours: [contour],
370
+ examples: deriveExamples(contour, operation, generated),
371
+ input: deriveInputSchema(contour, operation, generated),
372
+ intent: operationIntent[operation],
373
+ output: deriveOutputSchema(contour, operation),
374
+ resources,
375
+ };
376
+ return trail(`${contour.name}.${operation}`, derivedSpec);
377
+ };
378
+ //# sourceMappingURL=derive-trail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive-trail.js","sourceRoot":"","sources":["../../src/trails/derive-trail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { deriveTrail } from './derive-trail.js';
2
+ export type { DeriveTrailInput, DeriveTrailOperation, DeriveTrailOutput, DeriveTrailSpec, } from './derive-trail.js';
3
+ export { ingest } from './ingest.js';
4
+ export type { IngestOptions, IngestTransform } from './ingest.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { deriveTrail } from './derive-trail.js';
2
+ export { ingest } from './ingest.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import type { Layer } from '../layer.js';
3
+ import type { Signal } from '../signal.js';
4
+ import type { Trail, TrailSpec } from '../trail.js';
5
+ import type { TrailContext } from '../types.js';
6
+ type SchemaValue<TSchema extends z.ZodType> = z.output<TSchema>;
7
+ type SignalRef<TSignal> = string | Signal<TSignal>;
8
+ interface IngestBaseOptions<TSchema extends z.ZodType, TSignal> extends Omit<TrailSpec<SchemaValue<TSchema>, void>, 'blaze' | 'examples' | 'fires' | 'input' | 'intent' | 'output' | 'pattern'> {
9
+ /** Override the derived trail id. Defaults to `${signal}.ingest`. */
10
+ readonly id?: string | undefined;
11
+ /** Validated external payload shape. */
12
+ readonly schema: TSchema;
13
+ /** Signal to emit after verification and optional transformation. */
14
+ readonly signal: SignalRef<TSignal>;
15
+ /** Optional per-trail verification layer, e.g. HMAC signature checks. */
16
+ readonly verify?: Layer | undefined;
17
+ }
18
+ export type IngestTransform<TInput, TSignal> = (payload: TInput, ctx: TrailContext) => TSignal | Promise<TSignal>;
19
+ export interface IngestOptions<TSchema extends z.ZodType, TSignal> extends IngestBaseOptions<TSchema, TSignal> {
20
+ readonly transform?: IngestTransform<SchemaValue<TSchema>, TSignal> | undefined;
21
+ }
22
+ export declare const ingest: <TSchema extends z.ZodType, TSignal = SchemaValue<TSchema>>(options: IngestOptions<TSchema, TSignal>) => Trail<SchemaValue<TSchema>, void>;
23
+ export {};
24
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/trails/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,KAAK,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK,WAAW,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChE,KAAK,SAAS,CAAC,OAAO,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAMnD,UAAU,iBAAiB,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,CAAE,SAAQ,IAAI,CAC1E,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EACrC,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAC3E;IACC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,IAAI,CAC7C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,YAAY,KACd,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,aAAa,CAC5B,OAAO,SAAS,CAAC,CAAC,OAAO,EACzB,OAAO,CACP,SAAQ,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,SAAS,CAAC,EACf,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAC9C,SAAS,CAAC;CACf;AAiED,eAAO,MAAM,MAAM,GACjB,OAAO,SAAS,CAAC,CAAC,OAAO,EACzB,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,EAE9B,SAAS,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,KACvC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,CA+BlC,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+ import { InternalError } from '../errors.js';
3
+ import { composeLayers } from '../layer.js';
4
+ import { Result } from '../result.js';
5
+ import { trail } from '../trail.js';
6
+ const resolveSignalId = (signalRef) => typeof signalRef === 'string' ? signalRef : signalRef.id;
7
+ const deriveExampleName = (signalId, index) => `Ingest ${signalId} ${index + 1}`;
8
+ const deriveExamples = (schema, signalId) => {
9
+ const { examples } = schema;
10
+ if (examples === undefined || examples.length === 0) {
11
+ return undefined;
12
+ }
13
+ return Object.freeze(examples.map((example, index) => ({
14
+ input: example,
15
+ name: deriveExampleName(signalId, index),
16
+ })));
17
+ };
18
+ const createIngestBlaze = (signalRef, signalId, trailId, transform) => async (input, ctx) => {
19
+ if (ctx.fire === undefined) {
20
+ return Result.err(new InternalError(`ingest("${trailId}") requires topo-backed execution to emit "${signalId}"`));
21
+ }
22
+ try {
23
+ const payload = transform === undefined
24
+ ? input
25
+ : await transform(input, ctx);
26
+ const fired = typeof signalRef === 'string'
27
+ ? await ctx.fire(signalRef, payload)
28
+ : await ctx.fire(signalRef, payload);
29
+ return fired.isErr() ? Result.err(fired.error) : Result.ok();
30
+ }
31
+ catch (error) {
32
+ const message = `ingest("${trailId}"): ${error instanceof Error ? error.message : String(error)}`;
33
+ return Result.err(error instanceof Error
34
+ ? new InternalError(message, { cause: error })
35
+ : new InternalError(message));
36
+ }
37
+ };
38
+ export const ingest = (options) => {
39
+ const signalId = resolveSignalId(options.signal);
40
+ const id = options.id ?? `${signalId}.ingest`;
41
+ const { id: _id, schema, signal, transform, verify, ...trailSpec } = options;
42
+ const baseBlaze = createIngestBlaze(signal, signalId, id, transform);
43
+ const baseTrail = trail(id, {
44
+ ...trailSpec,
45
+ blaze: baseBlaze,
46
+ examples: deriveExamples(schema, signalId),
47
+ fires: [signal],
48
+ input: schema,
49
+ intent: 'write',
50
+ output: z.void(),
51
+ pattern: 'ingest',
52
+ });
53
+ if (verify === undefined) {
54
+ return baseTrail;
55
+ }
56
+ // Verification is a per-factory concern, so compose it locally instead of
57
+ // mutating runner-wide layer configuration.
58
+ return Object.freeze({
59
+ ...baseTrail,
60
+ blaze: composeLayers([verify], baseTrail, baseTrail.blaze),
61
+ });
62
+ };
63
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/trails/ingest.ts"],"names":[],"mappings":"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"}