@ontrails/core 1.0.0-beta.3 → 1.0.0-beta.32

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 (249) hide show
  1. package/CHANGELOG.md +323 -8
  2. package/README.md +114 -33
  3. package/package.json +11 -1
  4. package/src/activation-provenance.ts +111 -0
  5. package/src/activation-source-compatibility.ts +430 -0
  6. package/src/activation-source-projection.ts +221 -0
  7. package/src/activation-source.ts +91 -0
  8. package/src/blob-ref.ts +51 -0
  9. package/src/branded.ts +1 -1
  10. package/src/compose-batch.ts +69 -0
  11. package/src/compose-schema.ts +36 -0
  12. package/src/context.ts +44 -10
  13. package/src/contour.ts +346 -0
  14. package/src/derive.ts +250 -19
  15. package/src/detours.ts +8 -0
  16. package/src/diagnostics.ts +21 -0
  17. package/src/draft.ts +350 -0
  18. package/src/error-projection.ts +51 -0
  19. package/src/errors.ts +335 -48
  20. package/src/execute.ts +1577 -0
  21. package/src/fire.ts +1169 -0
  22. package/src/glob.ts +81 -0
  23. package/src/index.ts +526 -35
  24. package/src/internal/fork-ctx.ts +69 -0
  25. package/src/layer-projection.ts +193 -0
  26. package/src/layer.ts +43 -6
  27. package/src/observe.ts +361 -0
  28. package/src/path-scope.ts +66 -0
  29. package/src/path-security.ts +1 -1
  30. package/src/permits.ts +12 -0
  31. package/src/redaction/patterns.ts +6 -3
  32. package/src/resilience.ts +11 -11
  33. package/src/resource-config.ts +792 -0
  34. package/src/resource.ts +194 -0
  35. package/src/result.ts +18 -0
  36. package/src/run.ts +76 -0
  37. package/src/schedule-runtime.ts +689 -0
  38. package/src/schedule.ts +326 -0
  39. package/src/serialization.ts +92 -55
  40. package/src/signal-diagnostics.ts +633 -0
  41. package/src/signal-ref.ts +87 -0
  42. package/src/signal.ts +104 -0
  43. package/src/store/accessor-protocol.ts +56 -0
  44. package/src/store/index.ts +4 -0
  45. package/src/structured-examples.ts +248 -0
  46. package/src/surface-derivation.ts +91 -0
  47. package/src/surface-filter.ts +101 -0
  48. package/src/surface-versioning.ts +42 -0
  49. package/src/topo.ts +769 -67
  50. package/src/tracing.ts +345 -0
  51. package/src/trail-id-glob.ts +15 -0
  52. package/src/trail.ts +1168 -30
  53. package/src/trails/derive-trail.ts +842 -0
  54. package/src/trails/index.ts +9 -0
  55. package/src/trails/ingest.ts +139 -0
  56. package/src/trails-db.ts +206 -0
  57. package/src/transport-error-map.ts +174 -0
  58. package/src/type-utils.ts +87 -0
  59. package/src/types.ts +254 -12
  60. package/src/validate-established-topo.ts +69 -0
  61. package/src/validate-topo.ts +414 -56
  62. package/src/validation.ts +152 -4
  63. package/src/version-marker.ts +716 -0
  64. package/src/version-resolution.ts +308 -0
  65. package/src/version-runtime.ts +120 -0
  66. package/src/webhook.ts +278 -0
  67. package/src/workspace.ts +162 -1
  68. package/src/zod-wrappers.ts +72 -0
  69. package/.turbo/turbo-build.log +0 -1
  70. package/.turbo/turbo-lint.log +0 -3
  71. package/.turbo/turbo-typecheck.log +0 -1
  72. package/dist/adapters.d.ts +0 -39
  73. package/dist/adapters.d.ts.map +0 -1
  74. package/dist/adapters.js +0 -2
  75. package/dist/adapters.js.map +0 -1
  76. package/dist/blob-ref.d.ts +0 -20
  77. package/dist/blob-ref.d.ts.map +0 -1
  78. package/dist/blob-ref.js +0 -22
  79. package/dist/blob-ref.js.map +0 -1
  80. package/dist/branded.d.ts +0 -36
  81. package/dist/branded.d.ts.map +0 -1
  82. package/dist/branded.js +0 -89
  83. package/dist/branded.js.map +0 -1
  84. package/dist/collections.d.ts +0 -31
  85. package/dist/collections.d.ts.map +0 -1
  86. package/dist/collections.js +0 -60
  87. package/dist/collections.js.map +0 -1
  88. package/dist/context.d.ts +0 -10
  89. package/dist/context.d.ts.map +0 -1
  90. package/dist/context.js +0 -15
  91. package/dist/context.js.map +0 -1
  92. package/dist/derive.d.ts +0 -33
  93. package/dist/derive.d.ts.map +0 -1
  94. package/dist/derive.js +0 -125
  95. package/dist/derive.js.map +0 -1
  96. package/dist/errors.d.ts +0 -83
  97. package/dist/errors.d.ts.map +0 -1
  98. package/dist/errors.js +0 -142
  99. package/dist/errors.js.map +0 -1
  100. package/dist/event.d.ts +0 -45
  101. package/dist/event.d.ts.map +0 -1
  102. package/dist/event.js +0 -17
  103. package/dist/event.js.map +0 -1
  104. package/dist/fetch.d.ts +0 -15
  105. package/dist/fetch.d.ts.map +0 -1
  106. package/dist/fetch.js +0 -102
  107. package/dist/fetch.js.map +0 -1
  108. package/dist/guards.d.ts +0 -17
  109. package/dist/guards.d.ts.map +0 -1
  110. package/dist/guards.js +0 -25
  111. package/dist/guards.js.map +0 -1
  112. package/dist/health.d.ts +0 -18
  113. package/dist/health.d.ts.map +0 -1
  114. package/dist/health.js +0 -5
  115. package/dist/health.js.map +0 -1
  116. package/dist/hike.d.ts +0 -36
  117. package/dist/hike.d.ts.map +0 -1
  118. package/dist/hike.js +0 -20
  119. package/dist/hike.js.map +0 -1
  120. package/dist/index.d.ts +0 -36
  121. package/dist/index.d.ts.map +0 -1
  122. package/dist/index.js +0 -40
  123. package/dist/index.js.map +0 -1
  124. package/dist/job.d.ts +0 -24
  125. package/dist/job.d.ts.map +0 -1
  126. package/dist/job.js +0 -17
  127. package/dist/job.js.map +0 -1
  128. package/dist/layer.d.ts +0 -17
  129. package/dist/layer.d.ts.map +0 -1
  130. package/dist/layer.js +0 -21
  131. package/dist/layer.js.map +0 -1
  132. package/dist/path-security.d.ts +0 -28
  133. package/dist/path-security.d.ts.map +0 -1
  134. package/dist/path-security.js +0 -63
  135. package/dist/path-security.js.map +0 -1
  136. package/dist/patterns/bulk.d.ts +0 -15
  137. package/dist/patterns/bulk.d.ts.map +0 -1
  138. package/dist/patterns/bulk.js +0 -14
  139. package/dist/patterns/bulk.js.map +0 -1
  140. package/dist/patterns/change.d.ts +0 -10
  141. package/dist/patterns/change.d.ts.map +0 -1
  142. package/dist/patterns/change.js +0 -10
  143. package/dist/patterns/change.js.map +0 -1
  144. package/dist/patterns/date-range.d.ts +0 -10
  145. package/dist/patterns/date-range.d.ts.map +0 -1
  146. package/dist/patterns/date-range.js +0 -10
  147. package/dist/patterns/date-range.js.map +0 -1
  148. package/dist/patterns/index.d.ts +0 -9
  149. package/dist/patterns/index.d.ts.map +0 -1
  150. package/dist/patterns/index.js +0 -9
  151. package/dist/patterns/index.js.map +0 -1
  152. package/dist/patterns/pagination.d.ts +0 -18
  153. package/dist/patterns/pagination.d.ts.map +0 -1
  154. package/dist/patterns/pagination.js +0 -18
  155. package/dist/patterns/pagination.js.map +0 -1
  156. package/dist/patterns/progress.d.ts +0 -11
  157. package/dist/patterns/progress.d.ts.map +0 -1
  158. package/dist/patterns/progress.js +0 -11
  159. package/dist/patterns/progress.js.map +0 -1
  160. package/dist/patterns/sorting.d.ts +0 -13
  161. package/dist/patterns/sorting.d.ts.map +0 -1
  162. package/dist/patterns/sorting.js +0 -10
  163. package/dist/patterns/sorting.js.map +0 -1
  164. package/dist/patterns/status.d.ts +0 -15
  165. package/dist/patterns/status.d.ts.map +0 -1
  166. package/dist/patterns/status.js +0 -9
  167. package/dist/patterns/status.js.map +0 -1
  168. package/dist/patterns/timestamps.d.ts +0 -10
  169. package/dist/patterns/timestamps.d.ts.map +0 -1
  170. package/dist/patterns/timestamps.js +0 -10
  171. package/dist/patterns/timestamps.js.map +0 -1
  172. package/dist/redaction/index.d.ts +0 -4
  173. package/dist/redaction/index.d.ts.map +0 -1
  174. package/dist/redaction/index.js +0 -3
  175. package/dist/redaction/index.js.map +0 -1
  176. package/dist/redaction/patterns.d.ts +0 -9
  177. package/dist/redaction/patterns.d.ts.map +0 -1
  178. package/dist/redaction/patterns.js +0 -39
  179. package/dist/redaction/patterns.js.map +0 -1
  180. package/dist/redaction/redactor.d.ts +0 -27
  181. package/dist/redaction/redactor.d.ts.map +0 -1
  182. package/dist/redaction/redactor.js +0 -89
  183. package/dist/redaction/redactor.js.map +0 -1
  184. package/dist/resilience.d.ts +0 -34
  185. package/dist/resilience.d.ts.map +0 -1
  186. package/dist/resilience.js +0 -164
  187. package/dist/resilience.js.map +0 -1
  188. package/dist/result.d.ts +0 -57
  189. package/dist/result.d.ts.map +0 -1
  190. package/dist/result.js +0 -156
  191. package/dist/result.js.map +0 -1
  192. package/dist/serialization.d.ts +0 -27
  193. package/dist/serialization.d.ts.map +0 -1
  194. package/dist/serialization.js +0 -153
  195. package/dist/serialization.js.map +0 -1
  196. package/dist/topo.d.ts +0 -18
  197. package/dist/topo.d.ts.map +0 -1
  198. package/dist/topo.js +0 -80
  199. package/dist/topo.js.map +0 -1
  200. package/dist/trail.d.ts +0 -83
  201. package/dist/trail.d.ts.map +0 -1
  202. package/dist/trail.js +0 -16
  203. package/dist/trail.js.map +0 -1
  204. package/dist/types.d.ts +0 -46
  205. package/dist/types.d.ts.map +0 -1
  206. package/dist/types.js +0 -2
  207. package/dist/types.js.map +0 -1
  208. package/dist/validate-topo.d.ts +0 -24
  209. package/dist/validate-topo.d.ts.map +0 -1
  210. package/dist/validate-topo.js +0 -156
  211. package/dist/validate-topo.js.map +0 -1
  212. package/dist/validation.d.ts +0 -27
  213. package/dist/validation.d.ts.map +0 -1
  214. package/dist/validation.js +0 -134
  215. package/dist/validation.js.map +0 -1
  216. package/dist/workspace.d.ts +0 -25
  217. package/dist/workspace.d.ts.map +0 -1
  218. package/dist/workspace.js +0 -57
  219. package/dist/workspace.js.map +0 -1
  220. package/src/__tests__/blob-ref.test.ts +0 -103
  221. package/src/__tests__/branded.test.ts +0 -148
  222. package/src/__tests__/collections.test.ts +0 -126
  223. package/src/__tests__/context.test.ts +0 -66
  224. package/src/__tests__/derive.test.ts +0 -203
  225. package/src/__tests__/errors.test.ts +0 -309
  226. package/src/__tests__/event.test.ts +0 -82
  227. package/src/__tests__/fetch.test.ts +0 -217
  228. package/src/__tests__/guards.test.ts +0 -102
  229. package/src/__tests__/hike.test.ts +0 -117
  230. package/src/__tests__/job.test.ts +0 -98
  231. package/src/__tests__/layer.test.ts +0 -224
  232. package/src/__tests__/path-security.test.ts +0 -114
  233. package/src/__tests__/patterns.test.ts +0 -273
  234. package/src/__tests__/redaction.test.ts +0 -244
  235. package/src/__tests__/resilience.test.ts +0 -246
  236. package/src/__tests__/result.test.ts +0 -155
  237. package/src/__tests__/serialization.test.ts +0 -401
  238. package/src/__tests__/topo.test.ts +0 -220
  239. package/src/__tests__/trail.test.ts +0 -179
  240. package/src/__tests__/validate-topo.test.ts +0 -280
  241. package/src/__tests__/validation.test.ts +0 -283
  242. package/src/__tests__/workspace.test.ts +0 -183
  243. package/src/adapters.ts +0 -68
  244. package/src/event.ts +0 -77
  245. package/src/health.ts +0 -23
  246. package/src/hike.ts +0 -77
  247. package/src/job.ts +0 -20
  248. package/tsconfig.json +0 -9
  249. package/tsconfig.tsbuildinfo +0 -1
@@ -1,24 +0,0 @@
1
- /**
2
- * Structural validation for a Topo graph.
3
- *
4
- * Checks hike follows references, example input validity, event origin
5
- * references, and output schema completeness. Returns a Result with all
6
- * issues collected into a single ValidationError.
7
- */
8
- import { ValidationError } from './errors.js';
9
- import { Result } from './result.js';
10
- import type { Topo } from './topo.js';
11
- export interface TopoIssue {
12
- readonly trailId: string;
13
- readonly rule: string;
14
- readonly message: string;
15
- }
16
- /**
17
- * Validate the structural integrity of a Topo graph.
18
- *
19
- * Checks follows references, example inputs, event origins, and output
20
- * schema presence. Returns `Result.ok()` when no issues are found, or
21
- * `Result.err(ValidationError)` with all issues in the error context.
22
- */
23
- export declare const validateTopo: (topo: Topo) => Result<void, ValidationError>;
24
- //# sourceMappingURL=validate-topo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-topo.d.ts","sourceRoot":"","sources":["../src/validate-topo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQtC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA+JD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,IAAI,KAAG,MAAM,CAAC,IAAI,EAAE,eAAe,CAmBrE,CAAC"}
@@ -1,156 +0,0 @@
1
- /**
2
- * Structural validation for a Topo graph.
3
- *
4
- * Checks hike follows references, example input validity, event origin
5
- * references, and output schema completeness. Returns a Result with all
6
- * issues collected into a single ValidationError.
7
- */
8
- import { ValidationError } from './errors.js';
9
- import { Result } from './result.js';
10
- import { validateInput } from './validation.js';
11
- // ---------------------------------------------------------------------------
12
- // Validators
13
- // ---------------------------------------------------------------------------
14
- const WHITE = 0;
15
- const GRAY = 1;
16
- const BLACK = 2;
17
- /** Build an adjacency list and initial color map from hikes. */
18
- const buildFollowGraph = (hikes) => {
19
- const graph = new Map();
20
- for (const [id, h] of hikes) {
21
- graph.set(id, h.follows);
22
- }
23
- const color = new Map();
24
- for (const id of graph.keys()) {
25
- color.set(id, WHITE);
26
- }
27
- return { color, graph };
28
- };
29
- /** Detect multi-node cycles in the hike follow graph via DFS. */
30
- const detectFollowCycles = (hikes) => {
31
- const issues = [];
32
- const { color, graph } = buildFollowGraph(hikes);
33
- const dfs = (node, path) => {
34
- color.set(node, GRAY);
35
- for (const next of graph.get(node) ?? []) {
36
- if (!graph.has(next)) {
37
- continue;
38
- }
39
- const c = color.get(next) ?? WHITE;
40
- if (c === GRAY) {
41
- const cycle = [...path.slice(path.indexOf(next)), next];
42
- issues.push({
43
- message: `Cycle detected: ${cycle.join(' → ')}`,
44
- rule: 'follow-cycle',
45
- trailId: next,
46
- });
47
- }
48
- else if (c === WHITE) {
49
- dfs(next, [...path, next]);
50
- }
51
- }
52
- color.set(node, BLACK);
53
- };
54
- for (const id of graph.keys()) {
55
- if (color.get(id) === WHITE) {
56
- dfs(id, [id]);
57
- }
58
- }
59
- return issues;
60
- };
61
- const checkFollows = (hikes, topo) => {
62
- const issues = [];
63
- for (const [id, hike] of hikes) {
64
- for (const followId of hike.follows) {
65
- if (followId === id) {
66
- issues.push({
67
- message: `Hike follows itself`,
68
- rule: 'no-self-follow',
69
- trailId: id,
70
- });
71
- }
72
- else if (!topo.has(followId)) {
73
- issues.push({
74
- message: `Follows "${followId}" which is not in the topo`,
75
- rule: 'follows-exist',
76
- trailId: id,
77
- });
78
- }
79
- }
80
- }
81
- issues.push(...detectFollowCycles(hikes));
82
- return issues;
83
- };
84
- const checkOneExample = (id, example, inputSchema, hasOutput) => {
85
- const issues = [];
86
- const result = validateInput(inputSchema, example.input);
87
- if (result.isErr() && example.error !== 'ValidationError') {
88
- issues.push({
89
- message: `Example "${example.name}" input does not parse against schema`,
90
- rule: 'example-input-valid',
91
- trailId: id,
92
- });
93
- }
94
- if (example.expected !== undefined && !hasOutput) {
95
- issues.push({
96
- message: `Example "${example.name}" has expected output but trail has no output schema`,
97
- rule: 'output-schema-present',
98
- trailId: id,
99
- });
100
- }
101
- return issues;
102
- };
103
- const checkExamples = (trails) => {
104
- const issues = [];
105
- for (const [id, trail] of trails) {
106
- if (!trail.examples) {
107
- continue;
108
- }
109
- for (const example of trail.examples) {
110
- issues.push(...checkOneExample(id, example, trail.input, !!trail.output));
111
- }
112
- }
113
- return issues;
114
- };
115
- const checkEventOrigins = (events, topo) => {
116
- const issues = [];
117
- for (const [id, evt] of events) {
118
- if (!evt.from) {
119
- continue;
120
- }
121
- for (const originId of evt.from) {
122
- if (!topo.has(originId)) {
123
- issues.push({
124
- message: `Event origin "${originId}" is not in the topo`,
125
- rule: 'event-origin-exists',
126
- trailId: id,
127
- });
128
- }
129
- }
130
- }
131
- return issues;
132
- };
133
- // ---------------------------------------------------------------------------
134
- // Public API
135
- // ---------------------------------------------------------------------------
136
- /**
137
- * Validate the structural integrity of a Topo graph.
138
- *
139
- * Checks follows references, example inputs, event origins, and output
140
- * schema presence. Returns `Result.ok()` when no issues are found, or
141
- * `Result.err(ValidationError)` with all issues in the error context.
142
- */
143
- export const validateTopo = (topo) => {
144
- const issues = [
145
- ...checkFollows(topo.hikes, topo),
146
- ...checkExamples(topo.trails),
147
- ...checkEventOrigins(topo.events, topo),
148
- ];
149
- if (issues.length === 0) {
150
- return Result.ok();
151
- }
152
- return Result.err(new ValidationError(`Topo validation failed with ${issues.length} issue(s)`, {
153
- context: { issues },
154
- }));
155
- };
156
- //# sourceMappingURL=validate-topo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-topo.js","sourceRoot":"","sources":["../src/validate-topo.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Validation utilities for @ontrails/core
3
- *
4
- * Wraps Zod parsing into Result types and provides JSON Schema conversion
5
- * for trail input schemas.
6
- */
7
- import type { z } from 'zod';
8
- import { ValidationError } from './errors.js';
9
- import { Result } from './result.js';
10
- type JsonSchema = Record<string, unknown>;
11
- type JsonSchemaConverter = (schema: z.ZodType) => JsonSchema;
12
- /** Format each ZodIssue as "path: message" (or just "message" for root). */
13
- export declare const formatZodIssues: (issues: z.ZodIssue[]) => string[];
14
- /** Parse unknown data against a Zod schema, returning a Result. */
15
- export declare const validateInput: <T>(schema: z.ZodType<T>, data: unknown) => Result<T, ValidationError>;
16
- /** Parse unknown data against a Zod schema, returning a Result suitable for output validation. */
17
- export declare const validateOutput: <T>(schema: z.ZodType<T>, data: unknown) => Result<T, ValidationError>;
18
- /**
19
- * Convert common Zod types to a JSON Schema object.
20
- *
21
- * Uses Zod v4's `_zod.def` and `_zod.traits` for introspection.
22
- * Covers: string, number, boolean, object, array, enum, optional,
23
- * default, union, literal, nullable, and describe.
24
- */
25
- export declare const zodToJsonSchema: JsonSchemaConverter;
26
- export {};
27
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,KAAK,mBAAmB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC;AAe7D,4EAA4E;AAC5E,eAAO,MAAM,eAAe,GAAI,QAAQ,CAAC,CAAC,QAAQ,EAAE,KAAG,MAAM,EAIzD,CAAC;AAML,mEAAmE;AACnE,eAAO,MAAM,aAAa,GAAI,CAAC,EAC7B,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,OAAO,KACZ,MAAM,CAAC,CAAC,EAAE,eAAe,CAY3B,CAAC;AAMF,kGAAkG;AAClG,eAAO,MAAM,cAAc,GAAI,CAAC,EAC9B,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,OAAO,KACZ,MAAM,CAAC,CAAC,EAAE,eAAe,CAY3B,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,mBA8E7B,CAAC"}
@@ -1,134 +0,0 @@
1
- /**
2
- * Validation utilities for @ontrails/core
3
- *
4
- * Wraps Zod parsing into Result types and provides JSON Schema conversion
5
- * for trail input schemas.
6
- */
7
- import { ValidationError } from './errors.js';
8
- import { Result } from './result.js';
9
- // ---------------------------------------------------------------------------
10
- // Internal helpers (defined before usage)
11
- // ---------------------------------------------------------------------------
12
- const isOptionalLike = (s) => {
13
- const defType = s._zod.def['type'];
14
- return defType === 'optional' || defType === 'default';
15
- };
16
- // ---------------------------------------------------------------------------
17
- // Issue formatting
18
- // ---------------------------------------------------------------------------
19
- /** Format each ZodIssue as "path: message" (or just "message" for root). */
20
- export const formatZodIssues = (issues) => issues.map((issue) => {
21
- const path = issue.path.join('.');
22
- return path ? `${path}: ${issue.message}` : issue.message;
23
- });
24
- // ---------------------------------------------------------------------------
25
- // Input validation
26
- // ---------------------------------------------------------------------------
27
- /** Parse unknown data against a Zod schema, returning a Result. */
28
- export const validateInput = (schema, data) => {
29
- const parsed = schema.safeParse(data);
30
- if (parsed.success) {
31
- return Result.ok(parsed.data);
32
- }
33
- const messages = formatZodIssues(parsed.error.issues);
34
- return Result.err(new ValidationError(messages.join('; '), {
35
- cause: parsed.error,
36
- context: { issues: parsed.error.issues },
37
- }));
38
- };
39
- // ---------------------------------------------------------------------------
40
- // Output validation
41
- // ---------------------------------------------------------------------------
42
- /** Parse unknown data against a Zod schema, returning a Result suitable for output validation. */
43
- export const validateOutput = (schema, data) => {
44
- const parsed = schema.safeParse(data);
45
- if (parsed.success) {
46
- return Result.ok(parsed.data);
47
- }
48
- const messages = formatZodIssues(parsed.error.issues);
49
- return Result.err(new ValidationError(`Output validation failed: ${messages.join('; ')}`, {
50
- cause: parsed.error,
51
- context: { issues: parsed.error.issues },
52
- }));
53
- };
54
- // ---------------------------------------------------------------------------
55
- // Zod → JSON Schema (public API)
56
- // ---------------------------------------------------------------------------
57
- /**
58
- * Convert common Zod types to a JSON Schema object.
59
- *
60
- * Uses Zod v4's `_zod.def` and `_zod.traits` for introspection.
61
- * Covers: string, number, boolean, object, array, enum, optional,
62
- * default, union, literal, nullable, and describe.
63
- */
64
- export const zodToJsonSchema = (schema) => {
65
- const s = schema;
66
- const collectObjectFields = (shape) => {
67
- const properties = {};
68
- const required = [];
69
- for (const [key, value] of Object.entries(shape)) {
70
- properties[key] = zodToJsonSchema(value);
71
- if (!isOptionalLike(value)) {
72
- required.push(key);
73
- }
74
- }
75
- return { properties, required };
76
- };
77
- const convertObject = (value) => {
78
- const shape = value._zod.def['shape'];
79
- if (!shape) {
80
- return { type: 'object' };
81
- }
82
- const { properties, required } = collectObjectFields(shape);
83
- const result = { properties, type: 'object' };
84
- if (required.length > 0) {
85
- result['required'] = required;
86
- }
87
- return result;
88
- };
89
- const zodConverters = {
90
- array: (value) => {
91
- const element = value._zod.def['element'];
92
- return { items: zodToJsonSchema(element), type: 'array' };
93
- },
94
- boolean: () => ({ type: 'boolean' }),
95
- default: (value) => {
96
- const inner = value._zod.def['innerType'];
97
- const innerSchema = zodToJsonSchema(inner);
98
- const rawDefault = value._zod.def['defaultValue'];
99
- innerSchema['default'] =
100
- typeof rawDefault === 'function' ? rawDefault() : rawDefault;
101
- return innerSchema;
102
- },
103
- enum: (value) => {
104
- const entries = value._zod.def['entries'];
105
- return { enum: Object.values(entries), type: 'string' };
106
- },
107
- literal: (value) => {
108
- const values = value._zod.def['values'];
109
- return { const: values[0] };
110
- },
111
- nullable: (value) => {
112
- const inner = value._zod.def['innerType'];
113
- return { anyOf: [zodToJsonSchema(inner), { type: 'null' }] };
114
- },
115
- number: () => ({ type: 'number' }),
116
- object: convertObject,
117
- optional: (value) => {
118
- const inner = value._zod.def['innerType'];
119
- return zodToJsonSchema(inner);
120
- },
121
- string: () => ({ type: 'string' }),
122
- union: (value) => {
123
- const options = value._zod.def['options'];
124
- return { anyOf: options.map((option) => zodToJsonSchema(option)) };
125
- },
126
- };
127
- const converter = zodConverters[s._zod.def['type']];
128
- const base = converter ? converter(s) : {};
129
- if (s.description) {
130
- base['description'] = s.description;
131
- }
132
- return base;
133
- };
134
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Workspace detection utilities.
3
- *
4
- * Walks the filesystem to find monorepo workspace roots and provides
5
- * helpers for working with paths relative to a workspace.
6
- */
7
- import { NotFoundError } from './errors.js';
8
- import { Result } from './result.js';
9
- /**
10
- * Walks up from `startDir` (defaults to `process.cwd()`) looking for a
11
- * `package.json` that contains a `"workspaces"` field.
12
- *
13
- * Returns the directory path of the workspace root on success, or a
14
- * `NotFoundError` if no workspace root is found.
15
- */
16
- export declare const findWorkspaceRoot: (startDir?: string) => Promise<Result<string, NotFoundError>>;
17
- /**
18
- * Returns `true` if `filePath` is inside `workspaceRoot`.
19
- */
20
- export declare const isInsideWorkspace: (filePath: string, workspaceRoot: string) => boolean;
21
- /**
22
- * Returns the relative path from `workspaceRoot` to `filePath`.
23
- */
24
- export declare const getRelativePath: (filePath: string, workspaceRoot: string) => string;
25
- //# sourceMappingURL=workspace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAqBvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,MAAM,EAChB,eAAe,MAAM,KACpB,OAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,eAAe,MAAM,KACpB,MAA6D,CAAC"}
package/dist/workspace.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * Workspace detection utilities.
3
- *
4
- * Walks the filesystem to find monorepo workspace roots and provides
5
- * helpers for working with paths relative to a workspace.
6
- */
7
- import { resolve, relative, dirname, join, isAbsolute } from 'node:path';
8
- import { NotFoundError } from './errors.js';
9
- import { Result } from './result.js';
10
- /** Check if a directory has a package.json with a `workspaces` field. */
11
- const hasWorkspacesField = async (dir) => {
12
- const pkgPath = join(dir, 'package.json');
13
- const file = Bun.file(pkgPath);
14
- if (!(await file.exists())) {
15
- return false;
16
- }
17
- try {
18
- const pkg = await file.json();
19
- return typeof pkg === 'object' && pkg !== null && 'workspaces' in pkg;
20
- }
21
- catch {
22
- return false;
23
- }
24
- };
25
- /**
26
- * Walks up from `startDir` (defaults to `process.cwd()`) looking for a
27
- * `package.json` that contains a `"workspaces"` field.
28
- *
29
- * Returns the directory path of the workspace root on success, or a
30
- * `NotFoundError` if no workspace root is found.
31
- */
32
- export const findWorkspaceRoot = async (startDir) => {
33
- let current = resolve(startDir ?? process.cwd());
34
- // eslint-disable-next-line no-constant-condition
35
- while (true) {
36
- if (await hasWorkspacesField(current)) {
37
- return Result.ok(current);
38
- }
39
- const parent = dirname(current);
40
- if (parent === current) {
41
- return Result.err(new NotFoundError(`No workspace root found from "${startDir ?? process.cwd()}"`));
42
- }
43
- current = parent;
44
- }
45
- };
46
- /**
47
- * Returns `true` if `filePath` is inside `workspaceRoot`.
48
- */
49
- export const isInsideWorkspace = (filePath, workspaceRoot) => {
50
- const rel = relative(resolve(workspaceRoot), resolve(filePath));
51
- return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);
52
- };
53
- /**
54
- * Returns the relative path from `workspaceRoot` to `filePath`.
55
- */
56
- export const getRelativePath = (filePath, workspaceRoot) => relative(resolve(workspaceRoot), resolve(filePath));
57
- //# sourceMappingURL=workspace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,KAAK,EAAE,GAAW,EAAoB,EAAE;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACvC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,YAAY,IAAI,GAAG,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,QAAiB,EACuB,EAAE;IAC1C,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEjD,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,aAAa,CACf,iCAAiC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAC9D,CACF,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,QAAgB,EAChB,aAAqB,EACZ,EAAE;IACX,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAgB,EAChB,aAAqB,EACb,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -1,103 +0,0 @@
1
- import { describe, test, expect } from 'bun:test';
2
-
3
- import { createBlobRef, isBlobRef } from '../blob-ref';
4
-
5
- describe('BlobRef', () => {
6
- const sampleData = new Uint8Array([137, 80, 78, 71]);
7
-
8
- describe('createBlobRef', () => {
9
- test('returns a frozen object with the provided fields', () => {
10
- const ref = createBlobRef({
11
- data: sampleData,
12
- mimeType: 'image/png',
13
- name: 'image.png',
14
- size: 4,
15
- });
16
-
17
- expect(ref.name).toBe('image.png');
18
- expect(ref.mimeType).toBe('image/png');
19
- expect(ref.size).toBe(4);
20
- expect(ref.data).toBe(sampleData);
21
- expect(Object.isFrozen(ref)).toBe(true);
22
- });
23
-
24
- test('works with ReadableStream data', () => {
25
- const stream = new ReadableStream<Uint8Array>({
26
- start(controller) {
27
- controller.enqueue(sampleData);
28
- controller.close();
29
- },
30
- });
31
-
32
- const ref = createBlobRef({
33
- data: stream,
34
- mimeType: 'video/mp4',
35
- name: 'video.mp4',
36
- size: 1024,
37
- });
38
-
39
- expect(ref.data).toBeInstanceOf(ReadableStream);
40
- });
41
- });
42
-
43
- describe('isBlobRef', () => {
44
- test('returns true for a valid BlobRef with Uint8Array data', () => {
45
- const ref = createBlobRef({
46
- data: sampleData,
47
- mimeType: 'application/octet-stream',
48
- name: 'file.bin',
49
- size: 4,
50
- });
51
-
52
- expect(isBlobRef(ref)).toBe(true);
53
- });
54
-
55
- test('returns true for a valid BlobRef with ReadableStream data', () => {
56
- const stream = new ReadableStream<Uint8Array>();
57
- const ref = createBlobRef({
58
- data: stream,
59
- mimeType: 'application/octet-stream',
60
- name: 'file.bin',
61
- size: 0,
62
- });
63
-
64
- expect(isBlobRef(ref)).toBe(true);
65
- });
66
-
67
- test('returns true for a plain object matching the shape', () => {
68
- expect(
69
- isBlobRef({
70
- data: new Uint8Array(),
71
- mimeType: 'application/pdf',
72
- name: 'doc.pdf',
73
- size: 999,
74
- })
75
- ).toBe(true);
76
- });
77
-
78
- test('returns false for null', () => {
79
- expect(isBlobRef(null)).toBe(false);
80
- });
81
-
82
- test('returns false for a string', () => {
83
- expect(isBlobRef('not a blob')).toBe(false);
84
- });
85
-
86
- test('returns false when name is missing', () => {
87
- expect(
88
- isBlobRef({ data: new Uint8Array(), mimeType: 'text/plain', size: 0 })
89
- ).toBe(false);
90
- });
91
-
92
- test('returns false when data is a plain object', () => {
93
- expect(
94
- isBlobRef({
95
- data: {},
96
- mimeType: 'text/plain',
97
- name: 'x',
98
- size: 0,
99
- })
100
- ).toBe(false);
101
- });
102
- });
103
- });