tool-output-guard 0.3.0
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/README.md +291 -0
- package/dist/__tests__/create-guard.test.d.ts +2 -0
- package/dist/__tests__/create-guard.test.d.ts.map +1 -0
- package/dist/__tests__/create-guard.test.js +101 -0
- package/dist/__tests__/create-guard.test.js.map +1 -0
- package/dist/__tests__/detection/schema-detection.test.d.ts +2 -0
- package/dist/__tests__/detection/schema-detection.test.d.ts.map +1 -0
- package/dist/__tests__/detection/schema-detection.test.js +127 -0
- package/dist/__tests__/detection/schema-detection.test.js.map +1 -0
- package/dist/__tests__/guard.test.d.ts +2 -0
- package/dist/__tests__/guard.test.d.ts.map +1 -0
- package/dist/__tests__/guard.test.js +155 -0
- package/dist/__tests__/guard.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +67 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/validate.test.d.ts +2 -0
- package/dist/__tests__/validate.test.d.ts.map +1 -0
- package/dist/__tests__/validate.test.js +67 -0
- package/dist/__tests__/validate.test.js.map +1 -0
- package/dist/__tests__/validation/json-schema-validator.test.d.ts +2 -0
- package/dist/__tests__/validation/json-schema-validator.test.d.ts.map +1 -0
- package/dist/__tests__/validation/json-schema-validator.test.js +223 -0
- package/dist/__tests__/validation/json-schema-validator.test.js.map +1 -0
- package/dist/__tests__/validation/zod-validator.test.d.ts +2 -0
- package/dist/__tests__/validation/zod-validator.test.d.ts.map +1 -0
- package/dist/__tests__/validation/zod-validator.test.js +118 -0
- package/dist/__tests__/validation/zod-validator.test.js.map +1 -0
- package/dist/__tests__/violations/violations.test.d.ts +2 -0
- package/dist/__tests__/violations/violations.test.d.ts.map +1 -0
- package/dist/__tests__/violations/violations.test.js +101 -0
- package/dist/__tests__/violations/violations.test.js.map +1 -0
- package/dist/create-guard.d.ts +3 -0
- package/dist/create-guard.d.ts.map +1 -0
- package/dist/create-guard.js +34 -0
- package/dist/create-guard.js.map +1 -0
- package/dist/detection/index.d.ts +10 -0
- package/dist/detection/index.d.ts.map +1 -0
- package/dist/detection/index.js +38 -0
- package/dist/detection/index.js.map +1 -0
- package/dist/detection/json-schema.d.ts +2 -0
- package/dist/detection/json-schema.d.ts.map +1 -0
- package/dist/detection/json-schema.js +10 -0
- package/dist/detection/json-schema.js.map +1 -0
- package/dist/detection/typebox.d.ts +2 -0
- package/dist/detection/typebox.d.ts.map +1 -0
- package/dist/detection/typebox.js +10 -0
- package/dist/detection/typebox.js.map +1 -0
- package/dist/detection/zod.d.ts +2 -0
- package/dist/detection/zod.d.ts.map +1 -0
- package/dist/detection/zod.js +11 -0
- package/dist/detection/zod.js.map +1 -0
- package/dist/guard-tools.d.ts +3 -0
- package/dist/guard-tools.d.ts.map +1 -0
- package/dist/guard-tools.js +24 -0
- package/dist/guard-tools.js.map +1 -0
- package/dist/guard.d.ts +3 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +24 -0
- package/dist/guard.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/strategies/index.d.ts +4 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +154 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +3 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +9 -0
- package/dist/validate.js.map +1 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +21 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/json-schema-validator.d.ts +6 -0
- package/dist/validation/json-schema-validator.d.ts.map +1 -0
- package/dist/validation/json-schema-validator.js +195 -0
- package/dist/validation/json-schema-validator.js.map +1 -0
- package/dist/validation/zod-validator.d.ts +3 -0
- package/dist/validation/zod-validator.d.ts.map +1 -0
- package/dist/validation/zod-validator.js +64 -0
- package/dist/validation/zod-validator.js.map +1 -0
- package/dist/violations/index.d.ts +6 -0
- package/dist/violations/index.d.ts.map +1 -0
- package/dist/violations/index.js +69 -0
- package/dist/violations/index.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# tool-output-guard
|
|
2
|
+
|
|
3
|
+
Runtime validator for tool execution results against schemas (Zod, JSON Schema, TypeBox).
|
|
4
|
+
|
|
5
|
+
Validates data returned by LLM tool calls, MCP tools, or any async function against a schema you provide. Automatically detects the schema format — just pass your schema and the library handles the rest.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install tool-output-guard
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Zod is an optional peer dependency. Install it only if you use Zod schemas:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install zod
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { guard } from 'tool-output-guard';
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
|
|
25
|
+
const WeatherSchema = z.object({
|
|
26
|
+
temperature: z.number(),
|
|
27
|
+
unit: z.enum(['celsius', 'fahrenheit']),
|
|
28
|
+
description: z.string(),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const getWeather = guard(
|
|
32
|
+
async (city: string) => {
|
|
33
|
+
return { temperature: 22, unit: 'celsius', description: 'Sunny' };
|
|
34
|
+
},
|
|
35
|
+
WeatherSchema,
|
|
36
|
+
{ onInvalid: 'throw' },
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const result = await getWeather('London');
|
|
40
|
+
// result is typed and validated against WeatherSchema
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Core API
|
|
44
|
+
|
|
45
|
+
### `guard(toolFn, schema, options?)`
|
|
46
|
+
|
|
47
|
+
Wraps an async tool function with output validation. The returned function has the same call signature as the original.
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { guard } from 'tool-output-guard';
|
|
51
|
+
import { z } from 'zod';
|
|
52
|
+
|
|
53
|
+
const schema = z.object({ id: z.number(), name: z.string() });
|
|
54
|
+
|
|
55
|
+
const getUserTool = guard(
|
|
56
|
+
async (id: number) => fetchUser(id),
|
|
57
|
+
schema,
|
|
58
|
+
{
|
|
59
|
+
onInvalid: 'throw',
|
|
60
|
+
onValidationPass: (data) => console.log('valid:', data),
|
|
61
|
+
onValidationFail: (violations) => console.error('invalid:', violations),
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const user = await getUserTool(42);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### `validate(output, schema, options?)`
|
|
69
|
+
|
|
70
|
+
Standalone validation of any value against a schema. Returns a `ValidationResult<T>` discriminated union.
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { validate } from 'tool-output-guard';
|
|
74
|
+
|
|
75
|
+
const result = validate({ id: 1, name: 'Alice' }, schema);
|
|
76
|
+
|
|
77
|
+
if (result.success) {
|
|
78
|
+
console.log(result.data); // typed as T
|
|
79
|
+
} else {
|
|
80
|
+
console.error(result.violations); // Violation[]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### `createGuard(schema, options?)`
|
|
85
|
+
|
|
86
|
+
Factory that creates a reusable `Guard<T>` instance with `validate()` and `wrap()` methods.
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { createGuard } from 'tool-output-guard';
|
|
90
|
+
|
|
91
|
+
const guard = createGuard(schema, { onInvalid: 'fallback', fallbackValue: defaultUser });
|
|
92
|
+
|
|
93
|
+
// Validate a value directly
|
|
94
|
+
const result = guard.validate(someData);
|
|
95
|
+
|
|
96
|
+
// Wrap a tool function
|
|
97
|
+
const safeFetch = guard.wrap((args: { id: number }) => fetchUser(args.id));
|
|
98
|
+
const user = await safeFetch({ id: 42 });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### `guardTools(toolMap, schemaMap, options?)`
|
|
102
|
+
|
|
103
|
+
Wraps an entire map of tool functions in a single call — one schema per tool.
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { guardTools } from 'tool-output-guard';
|
|
107
|
+
|
|
108
|
+
const tools = {
|
|
109
|
+
getUser: async (id: number) => fetchUser(id),
|
|
110
|
+
getWeather: async (city: string) => fetchWeather(city),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const schemas = {
|
|
114
|
+
getUser: userSchema,
|
|
115
|
+
getWeather: weatherSchema,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const guardedTools = guardTools(tools, schemas, { onInvalid: 'throw' });
|
|
119
|
+
// Each tool in guardedTools is now validated against its schema
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Failure Strategies
|
|
123
|
+
|
|
124
|
+
Set `onInvalid` in `GuardOptions` to control what happens when validation fails:
|
|
125
|
+
|
|
126
|
+
| Strategy | Behavior |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `'throw'` (default) | Throws `ValidationError` with full violation details |
|
|
129
|
+
| `'fallback'` | Returns `options.fallbackValue` (must be provided) |
|
|
130
|
+
| `'error-result'` | Returns `{ __error: true, violations: [...] }` for LLM consumption |
|
|
131
|
+
| `'coerce-and-warn'` | Attempts type coercion (string→number etc.), warns on changes, re-validates |
|
|
132
|
+
| `'strip-extra'` | Strips properties not defined in the JSON Schema before returning |
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
// fallback
|
|
136
|
+
guard(fn, schema, { onInvalid: 'fallback', fallbackValue: defaultValue });
|
|
137
|
+
|
|
138
|
+
// error-result — useful for LLM agents that can reason about errors
|
|
139
|
+
guard(fn, schema, { onInvalid: 'error-result' });
|
|
140
|
+
|
|
141
|
+
// coerce-and-warn — auto-fix common API type mismatches
|
|
142
|
+
guard(fn, schema, { onInvalid: 'coerce-and-warn' });
|
|
143
|
+
|
|
144
|
+
// strip-extra — remove unexpected fields
|
|
145
|
+
guard(fn, schema, { onInvalid: 'strip-extra' });
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Violation Format
|
|
149
|
+
|
|
150
|
+
Each `Violation` in a `ValidationResult` contains:
|
|
151
|
+
|
|
152
|
+
| Field | Type | Description |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| `path` | `string` | JSONPath-style: `$.user.address[0].street` |
|
|
155
|
+
| `severity` | `'error' \| 'warning'` | Errors block validation; warnings on coerced fields |
|
|
156
|
+
| `code` | `ViolationCode` | See below |
|
|
157
|
+
| `expected` | `string` | What the schema expected |
|
|
158
|
+
| `received` | `string` | What was actually received |
|
|
159
|
+
| `receivedValue` | `unknown` | The actual value |
|
|
160
|
+
| `coercedValue` | `unknown` | The coerced value (if applicable) |
|
|
161
|
+
| `message` | `string` | Human-readable message |
|
|
162
|
+
| `llmMessage` | `string` | LLM-friendly message (more verbose, action-oriented) |
|
|
163
|
+
|
|
164
|
+
### Violation Codes
|
|
165
|
+
|
|
166
|
+
| Code | When |
|
|
167
|
+
|---|---|
|
|
168
|
+
| `WRONG_TYPE` | Field has the wrong JavaScript type |
|
|
169
|
+
| `MISSING_REQUIRED` | A required field is absent |
|
|
170
|
+
| `UNKNOWN_FIELD` | A field is present but not in the schema |
|
|
171
|
+
| `CONSTRAINT_VIOLATION` | Number/string/array constraint failed (min, max, length, etc.) |
|
|
172
|
+
| `ENUM_MISMATCH` | Value is not one of the allowed enum values |
|
|
173
|
+
| `PATTERN_MISMATCH` | String does not match the required regex pattern |
|
|
174
|
+
| `COERCED` | Value was automatically coerced to the expected type |
|
|
175
|
+
|
|
176
|
+
## Violation Utilities
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
import {
|
|
180
|
+
buildViolation,
|
|
181
|
+
buildPath,
|
|
182
|
+
formatViolationMessage,
|
|
183
|
+
formatViolationsForLLM,
|
|
184
|
+
} from 'tool-output-guard';
|
|
185
|
+
|
|
186
|
+
// Build a path string from parts
|
|
187
|
+
buildPath(['user', 'address', 0, 'street']); // => '$.user.address[0].street'
|
|
188
|
+
|
|
189
|
+
// Format a single violation for humans
|
|
190
|
+
formatViolationMessage(violation); // => '[ERROR] $.name (WRONG_TYPE): Expected string, got number'
|
|
191
|
+
|
|
192
|
+
// Format all violations for LLM consumption
|
|
193
|
+
formatViolationsForLLM(violations);
|
|
194
|
+
// => 'Tool output validation failed with 2 violation(s):\n\n1. ...\n2. ...\n\nPlease fix...'
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## ValidationError
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
import { ValidationError } from 'tool-output-guard';
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
await guardedTool(args);
|
|
204
|
+
} catch (err) {
|
|
205
|
+
if (err instanceof ValidationError) {
|
|
206
|
+
console.error(err.violations); // Violation[]
|
|
207
|
+
console.error(err.toolName); // string | undefined
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Available Exports
|
|
213
|
+
|
|
214
|
+
### Types
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
import type {
|
|
218
|
+
Violation,
|
|
219
|
+
ViolationSeverity,
|
|
220
|
+
ViolationCode,
|
|
221
|
+
ValidationResult,
|
|
222
|
+
LLMValidationError,
|
|
223
|
+
FailureStrategy,
|
|
224
|
+
CoercionConfig,
|
|
225
|
+
GuardOptions,
|
|
226
|
+
Guard,
|
|
227
|
+
GuardToolsOptions,
|
|
228
|
+
} from 'tool-output-guard';
|
|
229
|
+
|
|
230
|
+
import { ValidationError } from 'tool-output-guard';
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Schema Detection
|
|
234
|
+
|
|
235
|
+
Detect which schema format an object uses. Detection is performed once and cached via `WeakMap`.
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
import {
|
|
239
|
+
detectSchema,
|
|
240
|
+
isZodSchema,
|
|
241
|
+
isTypeBoxSchema,
|
|
242
|
+
isJSONSchema,
|
|
243
|
+
} from 'tool-output-guard';
|
|
244
|
+
|
|
245
|
+
import type { SchemaType, DetectedSchema } from 'tool-output-guard';
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### `detectSchema(schema: unknown): DetectedSchema`
|
|
249
|
+
|
|
250
|
+
Auto-detect the schema format. Returns a `DetectedSchema` with `type` (`'zod' | 'typebox' | 'json-schema'`) and the original `schema`. Throws `TypeError` if the format is not recognized.
|
|
251
|
+
|
|
252
|
+
Priority order: Zod > TypeBox > JSON Schema.
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
import { z } from 'zod';
|
|
256
|
+
import { Type } from '@sinclair/typebox';
|
|
257
|
+
|
|
258
|
+
detectSchema(z.string());
|
|
259
|
+
// => { type: 'zod', schema: [ZodString] }
|
|
260
|
+
|
|
261
|
+
detectSchema(Type.Object({ name: Type.String() }));
|
|
262
|
+
// => { type: 'typebox', schema: { [Symbol(TypeBox.Kind)]: 'Object', ... } }
|
|
263
|
+
|
|
264
|
+
detectSchema({ type: 'object', properties: { name: { type: 'string' } } });
|
|
265
|
+
// => { type: 'json-schema', schema: { type: 'object', ... } }
|
|
266
|
+
|
|
267
|
+
detectSchema({ foo: 'bar' });
|
|
268
|
+
// => throws TypeError
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Supported Schemas
|
|
272
|
+
|
|
273
|
+
| Schema Library | Detection Method | Version |
|
|
274
|
+
|---|---|---|
|
|
275
|
+
| [Zod](https://zod.dev) | `_def` property + `safeParse` method | v3 / v4 |
|
|
276
|
+
| [JSON Schema](https://json-schema.org) | `$schema`, `type`, `properties`, or combinators | draft-07 / 2020-12 |
|
|
277
|
+
| [TypeBox](https://github.com/sinclairzx81/typebox) | `Symbol.for('TypeBox.Kind')` property | v0.34+ |
|
|
278
|
+
|
|
279
|
+
Schema format is auto-detected at guard creation time and cached. You never need to specify which format you are using.
|
|
280
|
+
|
|
281
|
+
### Supported JSON Schema Keywords
|
|
282
|
+
|
|
283
|
+
`type`, `required`, `properties`, `items`, `enum`, `const`, `minimum`, `maximum`, `exclusiveMinimum`, `exclusiveMaximum`, `minLength`, `maxLength`, `pattern`, `minItems`, `maxItems`, `additionalProperties`, `anyOf`, `oneOf`, `allOf`.
|
|
284
|
+
|
|
285
|
+
## Node.js Compatibility
|
|
286
|
+
|
|
287
|
+
Requires Node.js >= 18.
|
|
288
|
+
|
|
289
|
+
## License
|
|
290
|
+
|
|
291
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-guard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/create-guard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const create_guard_1 = require("../create-guard");
|
|
6
|
+
const types_1 = require("../types");
|
|
7
|
+
const TemperatureSchema = zod_1.z.object({
|
|
8
|
+
value: zod_1.z.number(),
|
|
9
|
+
unit: zod_1.z.enum(['C', 'F', 'K']),
|
|
10
|
+
});
|
|
11
|
+
const validTemp = { value: 100, unit: 'C' };
|
|
12
|
+
(0, vitest_1.describe)('createGuard() — validate method', () => {
|
|
13
|
+
(0, vitest_1.it)('returns success: true for valid data', () => {
|
|
14
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema);
|
|
15
|
+
const result = g.validate(validTemp);
|
|
16
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
17
|
+
if (result.success) {
|
|
18
|
+
(0, vitest_1.expect)(result.data).toEqual(validTemp);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('returns success: false for invalid data', () => {
|
|
22
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema);
|
|
23
|
+
const result = g.validate({ value: 'hot', unit: 'X' });
|
|
24
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
25
|
+
if (!result.success) {
|
|
26
|
+
(0, vitest_1.expect)(result.violations.length).toBeGreaterThan(0);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)('exposes the schema', () => {
|
|
30
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema);
|
|
31
|
+
(0, vitest_1.expect)(g.schema).toBe(TemperatureSchema);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('exposes the options', () => {
|
|
34
|
+
const options = { onInvalid: 'fallback', fallbackValue: validTemp };
|
|
35
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema, options);
|
|
36
|
+
(0, vitest_1.expect)(g.options).toEqual(options);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.describe)('createGuard() — wrap method', () => {
|
|
40
|
+
(0, vitest_1.it)('returns valid data from wrapped function', async () => {
|
|
41
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema);
|
|
42
|
+
const toolFn = async () => validTemp;
|
|
43
|
+
const wrapped = g.wrap(toolFn);
|
|
44
|
+
const result = await wrapped(null);
|
|
45
|
+
(0, vitest_1.expect)(result).toEqual(validTemp);
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('throws ValidationError by default for invalid data', async () => {
|
|
48
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema);
|
|
49
|
+
const toolFn = async () => ({ value: 'hot', unit: 'X' });
|
|
50
|
+
const wrapped = g.wrap(toolFn);
|
|
51
|
+
await (0, vitest_1.expect)(wrapped(null)).rejects.toBeInstanceOf(types_1.ValidationError);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('respects onInvalid: fallback', async () => {
|
|
54
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema, {
|
|
55
|
+
onInvalid: 'fallback',
|
|
56
|
+
fallbackValue: validTemp,
|
|
57
|
+
});
|
|
58
|
+
const toolFn = async () => ({ value: 'bad', unit: 'X' });
|
|
59
|
+
const wrapped = g.wrap(toolFn);
|
|
60
|
+
const result = await wrapped(null);
|
|
61
|
+
(0, vitest_1.expect)(result).toEqual(validTemp);
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)('calls onValidationPass on success', async () => {
|
|
64
|
+
const onPass = vitest_1.vi.fn();
|
|
65
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema, { onValidationPass: onPass });
|
|
66
|
+
const toolFn = async () => validTemp;
|
|
67
|
+
const wrapped = g.wrap(toolFn);
|
|
68
|
+
await wrapped(null);
|
|
69
|
+
(0, vitest_1.expect)(onPass).toHaveBeenCalledWith(validTemp);
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)('calls onValidationFail on failure', async () => {
|
|
72
|
+
const onFail = vitest_1.vi.fn();
|
|
73
|
+
const g = (0, create_guard_1.createGuard)(TemperatureSchema, {
|
|
74
|
+
onValidationFail: onFail,
|
|
75
|
+
onInvalid: 'fallback',
|
|
76
|
+
fallbackValue: validTemp,
|
|
77
|
+
});
|
|
78
|
+
const toolFn = async () => ({ value: 'bad', unit: 'X' });
|
|
79
|
+
const wrapped = g.wrap(toolFn);
|
|
80
|
+
await wrapped(null);
|
|
81
|
+
(0, vitest_1.expect)(onFail).toHaveBeenCalledTimes(1);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.describe)('createGuard() — JSON Schema', () => {
|
|
85
|
+
const schema = {
|
|
86
|
+
type: 'object',
|
|
87
|
+
required: ['id'],
|
|
88
|
+
properties: { id: { type: 'number' } },
|
|
89
|
+
};
|
|
90
|
+
(0, vitest_1.it)('validates valid data against JSON Schema', () => {
|
|
91
|
+
const g = (0, create_guard_1.createGuard)(schema);
|
|
92
|
+
const result = g.validate({ id: 1 });
|
|
93
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)('reports violations for invalid data against JSON Schema', () => {
|
|
96
|
+
const g = (0, create_guard_1.createGuard)(schema);
|
|
97
|
+
const result = g.validate({ id: 'abc' });
|
|
98
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=create-guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-guard.test.js","sourceRoot":"","sources":["../../src/__tests__/create-guard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-detection.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/detection/schema-detection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
6
|
+
const index_1 = require("../../detection/index");
|
|
7
|
+
(0, vitest_1.describe)('isZodSchema', () => {
|
|
8
|
+
(0, vitest_1.it)('returns true for z.string()', () => {
|
|
9
|
+
(0, vitest_1.expect)((0, index_1.isZodSchema)(zod_1.z.string())).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
(0, vitest_1.it)('returns true for z.object()', () => {
|
|
12
|
+
(0, vitest_1.expect)((0, index_1.isZodSchema)(zod_1.z.object({ name: zod_1.z.string() }))).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.it)('returns false for a plain JSON Schema object (no safeParse)', () => {
|
|
15
|
+
(0, vitest_1.expect)((0, index_1.isZodSchema)({ type: 'string' })).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
(0, vitest_1.it)('returns false for null', () => {
|
|
18
|
+
(0, vitest_1.expect)((0, index_1.isZodSchema)(null)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
(0, vitest_1.it)('returns false for a string', () => {
|
|
21
|
+
(0, vitest_1.expect)((0, index_1.isZodSchema)('string')).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('returns false for a TypeBox schema', () => {
|
|
24
|
+
(0, vitest_1.expect)((0, index_1.isZodSchema)(typebox_1.Type.String())).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.describe)('isJSONSchema', () => {
|
|
28
|
+
(0, vitest_1.it)('returns true for { type: "string" }', () => {
|
|
29
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ type: 'string' })).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.it)('returns true for a schema with $schema keyword', () => {
|
|
32
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ $schema: 'http://json-schema.org/draft-07/schema' })).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('returns true for a schema with properties', () => {
|
|
35
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ properties: { name: { type: 'string' } } })).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('returns true for a schema with items', () => {
|
|
38
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ items: { type: 'number' } })).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('returns true for a schema with allOf', () => {
|
|
41
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ allOf: [] })).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('returns true for a schema with anyOf', () => {
|
|
44
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ anyOf: [] })).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)('returns true for a schema with oneOf', () => {
|
|
47
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({ oneOf: [] })).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.it)('returns false for null', () => {
|
|
50
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)(null)).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)('returns false for a non-object primitive', () => {
|
|
53
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)('string')).toBe(false);
|
|
54
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)(42)).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('returns false for an empty object (no recognized JSON Schema keywords)', () => {
|
|
57
|
+
(0, vitest_1.expect)((0, index_1.isJSONSchema)({})).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.describe)('isTypeBoxSchema', () => {
|
|
61
|
+
(0, vitest_1.it)('returns true for Type.String()', () => {
|
|
62
|
+
(0, vitest_1.expect)((0, index_1.isTypeBoxSchema)(typebox_1.Type.String())).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)('returns true for Type.Object()', () => {
|
|
65
|
+
(0, vitest_1.expect)((0, index_1.isTypeBoxSchema)(typebox_1.Type.Object({ name: typebox_1.Type.String() }))).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('returns false for a plain JSON Schema object (no TypeBox.Kind symbol)', () => {
|
|
68
|
+
(0, vitest_1.expect)((0, index_1.isTypeBoxSchema)({ type: 'string' })).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)('returns false for null', () => {
|
|
71
|
+
(0, vitest_1.expect)((0, index_1.isTypeBoxSchema)(null)).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.it)('returns false for a Zod schema', () => {
|
|
74
|
+
(0, vitest_1.expect)((0, index_1.isTypeBoxSchema)(zod_1.z.string())).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
(0, vitest_1.describe)('detectSchema', () => {
|
|
78
|
+
(0, vitest_1.it)('detects a Zod schema', () => {
|
|
79
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)(zod_1.z.string()).type).toBe('zod');
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)('detects a Zod object schema', () => {
|
|
82
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)(zod_1.z.object({ x: zod_1.z.number() })).type).toBe('zod');
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('detects a TypeBox schema', () => {
|
|
85
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)(typebox_1.Type.String()).type).toBe('typebox');
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)('detects a TypeBox object schema', () => {
|
|
88
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)(typebox_1.Type.Object({ name: typebox_1.Type.String() })).type).toBe('typebox');
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)('detects a plain JSON Schema object', () => {
|
|
91
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)({ type: 'string' }).type).toBe('json-schema');
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)('detects a JSON Schema with $schema keyword', () => {
|
|
94
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)({ $schema: 'http://json-schema.org/draft-07/schema' }).type).toBe('json-schema');
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.it)('throws TypeError for null', () => {
|
|
97
|
+
(0, vitest_1.expect)(() => (0, index_1.detectSchema)(null)).toThrow(TypeError);
|
|
98
|
+
(0, vitest_1.expect)(() => (0, index_1.detectSchema)(null)).toThrow('schema must be a non-null object');
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.it)('throws TypeError for a string', () => {
|
|
101
|
+
(0, vitest_1.expect)(() => (0, index_1.detectSchema)('string')).toThrow(TypeError);
|
|
102
|
+
(0, vitest_1.expect)(() => (0, index_1.detectSchema)('string')).toThrow('schema must be a non-null object');
|
|
103
|
+
});
|
|
104
|
+
(0, vitest_1.it)('throws TypeError for an unrecognised object', () => {
|
|
105
|
+
(0, vitest_1.expect)(() => (0, index_1.detectSchema)({ foo: 'bar' })).toThrow(TypeError);
|
|
106
|
+
(0, vitest_1.expect)(() => (0, index_1.detectSchema)({ foo: 'bar' })).toThrow('does not match Zod, TypeBox, or JSON Schema format');
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.it)('caches result — same DetectedSchema object returned for same input', () => {
|
|
109
|
+
const schema = zod_1.z.string();
|
|
110
|
+
const first = (0, index_1.detectSchema)(schema);
|
|
111
|
+
const second = (0, index_1.detectSchema)(schema);
|
|
112
|
+
(0, vitest_1.expect)(first).toBe(second);
|
|
113
|
+
});
|
|
114
|
+
(0, vitest_1.it)('Zod takes priority over JSON Schema (Zod schemas can have a "type" property internally)', () => {
|
|
115
|
+
// A Zod schema satisfies isZodSchema but might also partially match isJSONSchema.
|
|
116
|
+
// detectSchema must return 'zod', not 'json-schema'.
|
|
117
|
+
const zodSchema = zod_1.z.string();
|
|
118
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)(zodSchema).type).toBe('zod');
|
|
119
|
+
});
|
|
120
|
+
(0, vitest_1.it)('TypeBox takes priority over JSON Schema (TypeBox schemas have a "type" property)', () => {
|
|
121
|
+
// TypeBox schemas include a "type" field, which would make isJSONSchema return true.
|
|
122
|
+
// But detectSchema must return 'typebox' because TypeBox.Kind symbol is present.
|
|
123
|
+
const tbSchema = typebox_1.Type.String();
|
|
124
|
+
(0, vitest_1.expect)((0, index_1.detectSchema)(tbSchema).type).toBe('typebox');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=schema-detection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-detection.test.js","sourceRoot":"","sources":["../../../src/__tests__/detection/schema-detection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/guard.test.ts"],"names":[],"mappings":""}
|