@mastra/schema-compat 0.0.0-fix-message-list-args-missing-20250807205055 → 0.0.0-fix-zod-to-json-schema-ref-strategy-20250910193441

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 (63) hide show
  1. package/CHANGELOG.md +89 -1
  2. package/README.md +0 -4
  3. package/dist/chunk-7YUR5KZ5.cjs +34 -0
  4. package/dist/chunk-7YUR5KZ5.cjs.map +1 -0
  5. package/dist/chunk-GWTUXMDD.js +28 -0
  6. package/dist/chunk-GWTUXMDD.js.map +1 -0
  7. package/dist/index.cjs +842 -83
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +10 -8
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +841 -84
  12. package/dist/index.js.map +1 -1
  13. package/dist/provider-compats/anthropic.d.ts +6 -4
  14. package/dist/provider-compats/anthropic.d.ts.map +1 -1
  15. package/dist/provider-compats/deepseek.d.ts +6 -4
  16. package/dist/provider-compats/deepseek.d.ts.map +1 -1
  17. package/dist/provider-compats/google.d.ts +6 -4
  18. package/dist/provider-compats/google.d.ts.map +1 -1
  19. package/dist/provider-compats/meta.d.ts +6 -4
  20. package/dist/provider-compats/meta.d.ts.map +1 -1
  21. package/dist/provider-compats/openai-reasoning.d.ts +6 -4
  22. package/dist/provider-compats/openai-reasoning.d.ts.map +1 -1
  23. package/dist/provider-compats/openai.d.ts +6 -4
  24. package/dist/provider-compats/openai.d.ts.map +1 -1
  25. package/dist/schema-compatibility-v3.d.ts +319 -0
  26. package/dist/schema-compatibility-v3.d.ts.map +1 -0
  27. package/dist/schema-compatibility-v4.d.ts +310 -0
  28. package/dist/schema-compatibility-v4.d.ts.map +1 -0
  29. package/dist/schema-compatibility.d.ts +76 -133
  30. package/dist/schema-compatibility.d.ts.map +1 -1
  31. package/dist/types.d.ts +6 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/utils-test-suite.d.ts +2 -0
  34. package/dist/utils-test-suite.d.ts.map +1 -0
  35. package/dist/utils.d.ts +17 -5
  36. package/dist/utils.d.ts.map +1 -1
  37. package/dist/zod-to-json.cjs +12 -0
  38. package/dist/zod-to-json.cjs.map +1 -0
  39. package/dist/zod-to-json.d.ts +6 -0
  40. package/dist/zod-to-json.d.ts.map +1 -0
  41. package/dist/zod-to-json.js +3 -0
  42. package/dist/zod-to-json.js.map +1 -0
  43. package/dist/zodTypes.d.ts +21 -0
  44. package/dist/zodTypes.d.ts.map +1 -0
  45. package/package.json +31 -8
  46. package/.turbo/turbo-build.log +0 -4
  47. package/eslint.config.js +0 -6
  48. package/src/index.ts +0 -39
  49. package/src/provider-compats/anthropic.ts +0 -43
  50. package/src/provider-compats/deepseek.ts +0 -35
  51. package/src/provider-compats/google.ts +0 -63
  52. package/src/provider-compats/meta.ts +0 -36
  53. package/src/provider-compats/openai-reasoning.ts +0 -91
  54. package/src/provider-compats/openai.ts +0 -55
  55. package/src/provider-compats.test.ts +0 -407
  56. package/src/schema-compatibility.test.ts +0 -487
  57. package/src/schema-compatibility.ts +0 -594
  58. package/src/utils.test.ts +0 -460
  59. package/src/utils.ts +0 -205
  60. package/tsconfig.build.json +0 -9
  61. package/tsconfig.json +0 -5
  62. package/tsup.config.ts +0 -17
  63. package/vitest.config.ts +0 -7
@@ -1,407 +0,0 @@
1
- import { MockLanguageModelV1 } from 'ai/test';
2
- import { describe, it, expect } from 'vitest';
3
- import { z } from 'zod';
4
- import {
5
- AnthropicSchemaCompatLayer,
6
- OpenAISchemaCompatLayer,
7
- OpenAIReasoningSchemaCompatLayer,
8
- GoogleSchemaCompatLayer,
9
- DeepSeekSchemaCompatLayer,
10
- MetaSchemaCompatLayer,
11
- } from './index';
12
-
13
- describe('Provider Compatibility Classes', () => {
14
- const mockModels = {
15
- anthropic: new MockLanguageModelV1({
16
- modelId: 'claude-3-sonnet-20240229',
17
- doGenerate: async () => ({ response: { id: 'test' } }) as any,
18
- }),
19
- openai: new MockLanguageModelV1({
20
- modelId: 'openai/gpt-4',
21
- doGenerate: async () => ({ response: { id: 'test' } }) as any,
22
- }),
23
- openaiReasoning: new MockLanguageModelV1({
24
- modelId: 'openai/o3-mini',
25
- doGenerate: async () => ({ response: { id: 'test' } }) as any,
26
- }),
27
- google: new MockLanguageModelV1({
28
- modelId: 'gemini-pro',
29
- doGenerate: async () => ({ response: { id: 'test' } }) as any,
30
- }),
31
- deepseek: new MockLanguageModelV1({
32
- modelId: 'deepseek-chat',
33
- doGenerate: async () => ({ response: { id: 'test' } }) as any,
34
- }),
35
- meta: new MockLanguageModelV1({
36
- modelId: 'llama-3.1-405b-instruct',
37
- doGenerate: async () => ({ response: { id: 'test' } }) as any,
38
- }),
39
- };
40
-
41
- describe('AnthropicSchemaCompatLayer', () => {
42
- it('should apply for Anthropic models', () => {
43
- const compat = new AnthropicSchemaCompatLayer({
44
- modelId: mockModels.anthropic.modelId,
45
- supportsStructuredOutputs: mockModels.anthropic.supportsStructuredOutputs ?? false,
46
- provider: mockModels.anthropic.provider,
47
- });
48
- expect(compat.shouldApply()).toBe(true);
49
- });
50
-
51
- it('should not apply for non-Anthropic models', () => {
52
- const compat = new AnthropicSchemaCompatLayer({
53
- modelId: mockModels.openai.modelId,
54
- supportsStructuredOutputs: mockModels.openai.supportsStructuredOutputs ?? false,
55
- provider: mockModels.openai.provider,
56
- });
57
- expect(compat.shouldApply()).toBe(false);
58
- });
59
-
60
- it('should return correct schema target', () => {
61
- const compat = new AnthropicSchemaCompatLayer({
62
- modelId: mockModels.anthropic.modelId,
63
- supportsStructuredOutputs: mockModels.anthropic.supportsStructuredOutputs ?? false,
64
- provider: mockModels.anthropic.provider,
65
- });
66
- expect(compat.getSchemaTarget()).toBe('jsonSchema7');
67
- });
68
-
69
- it('should process schemas correctly', () => {
70
- const compat = new AnthropicSchemaCompatLayer({
71
- modelId: mockModels.anthropic.modelId,
72
- supportsStructuredOutputs: mockModels.anthropic.supportsStructuredOutputs ?? false,
73
- provider: mockModels.anthropic.provider,
74
- });
75
- const schema = z.object({
76
- text: z.string().min(1).max(100),
77
- count: z.number().min(1),
78
- });
79
-
80
- const result = compat.processToAISDKSchema(schema);
81
-
82
- expect(result).toHaveProperty('jsonSchema');
83
- expect(result).toHaveProperty('validate');
84
-
85
- const validData = {
86
- text: 'Hello, world!',
87
- count: 10,
88
- };
89
-
90
- const validationResult = result.validate!(validData);
91
- expect(typeof validationResult).toBe('object');
92
- expect(validationResult).toHaveProperty('success');
93
- });
94
- });
95
-
96
- describe('OpenAISchemaCompatLayer', () => {
97
- it('should apply for OpenAI models without structured outputs support', () => {
98
- const compat = new OpenAISchemaCompatLayer({
99
- modelId: mockModels.openai.modelId,
100
- supportsStructuredOutputs: mockModels.openai.supportsStructuredOutputs ?? false,
101
- provider: mockModels.openai.provider,
102
- });
103
- expect(compat.shouldApply()).toBe(true);
104
- });
105
-
106
- it('should return correct schema target', () => {
107
- const compat = new OpenAISchemaCompatLayer({
108
- modelId: mockModels.openai.modelId,
109
- supportsStructuredOutputs: mockModels.openai.supportsStructuredOutputs ?? false,
110
- provider: mockModels.openai.provider,
111
- });
112
- expect(compat.getSchemaTarget()).toBe('jsonSchema7');
113
- });
114
-
115
- it('should process complex schemas', () => {
116
- const compat = new OpenAISchemaCompatLayer({
117
- modelId: mockModels.openai.modelId,
118
- supportsStructuredOutputs: mockModels.openai.supportsStructuredOutputs ?? false,
119
- provider: mockModels.openai.provider,
120
- });
121
- const schema = z.object({
122
- user: z.object({
123
- name: z.string().email(),
124
- preferences: z.array(z.enum(['dark', 'light'])),
125
- }),
126
- settings: z.record(z.boolean()),
127
- });
128
-
129
- const result = compat.processToAISDKSchema(schema);
130
-
131
- const validData = {
132
- user: {
133
- name: 'John Doe',
134
- preferences: ['dark'],
135
- },
136
- settings: {
137
- public: true,
138
- featured: false,
139
- },
140
- };
141
-
142
- expect(result).toHaveProperty('jsonSchema');
143
- expect(result).toHaveProperty('validate');
144
-
145
- const validationResult = result.validate!(validData);
146
- expect(typeof validationResult).toBe('object');
147
- expect(validationResult).toHaveProperty('success');
148
- });
149
- });
150
-
151
- describe('OpenAIReasoningSchemaCompatLayer', () => {
152
- it('should have consistent behavior', () => {
153
- const compat = new OpenAIReasoningSchemaCompatLayer({
154
- modelId: mockModels.openaiReasoning.modelId,
155
- supportsStructuredOutputs: mockModels.openaiReasoning.supportsStructuredOutputs ?? false,
156
- provider: mockModels.openaiReasoning.provider,
157
- });
158
- expect(compat.shouldApply()).toBe(true);
159
- });
160
-
161
- it('should return correct schema target', () => {
162
- const compat = new OpenAIReasoningSchemaCompatLayer({
163
- modelId: mockModels.openaiReasoning.modelId,
164
- supportsStructuredOutputs: mockModels.openaiReasoning.supportsStructuredOutputs ?? false,
165
- provider: mockModels.openaiReasoning.provider,
166
- });
167
- expect(compat.getSchemaTarget()).toBe('openApi3');
168
- });
169
- });
170
-
171
- describe('GoogleSchemaCompatLayer', () => {
172
- it('should have consistent behavior', () => {
173
- const compat = new GoogleSchemaCompatLayer({
174
- modelId: mockModels.google.modelId,
175
- supportsStructuredOutputs: mockModels.google.supportsStructuredOutputs ?? false,
176
- provider: mockModels.google.provider,
177
- });
178
- expect(typeof compat.shouldApply()).toBe('boolean');
179
- });
180
-
181
- it('should return correct schema target', () => {
182
- const compat = new GoogleSchemaCompatLayer({
183
- modelId: mockModels.google.modelId,
184
- supportsStructuredOutputs: mockModels.google.supportsStructuredOutputs ?? false,
185
- provider: mockModels.google.provider,
186
- });
187
- expect(compat.getSchemaTarget()).toBe('jsonSchema7');
188
- });
189
-
190
- it('should handle date types correctly', () => {
191
- const compat = new GoogleSchemaCompatLayer({
192
- modelId: mockModels.google.modelId,
193
- supportsStructuredOutputs: mockModels.google.supportsStructuredOutputs ?? false,
194
- provider: mockModels.google.provider,
195
- });
196
- const schema = z.object({
197
- startDate: z.date(),
198
- endDate: z.date().optional(),
199
- title: z.string(),
200
- });
201
-
202
- const result = compat.processToAISDKSchema(schema);
203
-
204
- expect(result).toHaveProperty('jsonSchema');
205
- expect(result).toHaveProperty('validate');
206
-
207
- const validData = {
208
- startDate: new Date(),
209
- title: 'Hello, world!',
210
- };
211
-
212
- const validationResult = result.validate!(validData);
213
- expect(typeof validationResult).toBe('object');
214
- expect(validationResult).toHaveProperty('success');
215
- });
216
- });
217
-
218
- describe('DeepSeekSchemaCompatLayer', () => {
219
- it('should apply for DeepSeek models', () => {
220
- const compat = new DeepSeekSchemaCompatLayer({
221
- modelId: mockModels.deepseek.modelId,
222
- supportsStructuredOutputs: mockModels.deepseek.supportsStructuredOutputs ?? false,
223
- provider: mockModels.deepseek.provider,
224
- });
225
- expect(compat.shouldApply()).toBe(true);
226
- });
227
-
228
- it('should not apply for non-DeepSeek models', () => {
229
- const compat = new DeepSeekSchemaCompatLayer({
230
- modelId: mockModels.openai.modelId,
231
- supportsStructuredOutputs: mockModels.openai.supportsStructuredOutputs ?? false,
232
- provider: mockModels.openai.provider,
233
- });
234
- expect(compat.shouldApply()).toBe(false);
235
- });
236
-
237
- it('should return correct schema target', () => {
238
- const compat = new DeepSeekSchemaCompatLayer({
239
- modelId: mockModels.deepseek.modelId,
240
- supportsStructuredOutputs: mockModels.deepseek.supportsStructuredOutputs ?? false,
241
- provider: mockModels.deepseek.provider,
242
- });
243
- expect(compat.getSchemaTarget()).toBe('jsonSchema7');
244
- });
245
-
246
- it('should handle string constraints', () => {
247
- const compat = new DeepSeekSchemaCompatLayer({
248
- modelId: mockModels.deepseek.modelId,
249
- supportsStructuredOutputs: mockModels.deepseek.supportsStructuredOutputs ?? false,
250
- provider: mockModels.deepseek.provider,
251
- });
252
- const schema = z.object({
253
- email: z.string().email(),
254
- url: z.string().url(),
255
- uuid: z.string().uuid(),
256
- text: z.string().min(10).max(1000),
257
- });
258
-
259
- const result = compat.processToAISDKSchema(schema);
260
-
261
- expect(result).toHaveProperty('jsonSchema');
262
- expect(result).toHaveProperty('validate');
263
-
264
- const validData = {
265
- email: 'john@example.com',
266
- url: 'https://example.com',
267
- uuid: '123e4567-e89b-12d3-a456-426614174000',
268
- text: 'Hello, world!',
269
- };
270
-
271
- const validationResult = result.validate!(validData);
272
- expect(typeof validationResult).toBe('object');
273
- expect(validationResult).toHaveProperty('success');
274
- });
275
- });
276
-
277
- describe('MetaSchemaCompatLayer', () => {
278
- it('should have consistent behavior', () => {
279
- const compat = new MetaSchemaCompatLayer({
280
- modelId: mockModels.meta.modelId,
281
- supportsStructuredOutputs: mockModels.meta.supportsStructuredOutputs ?? false,
282
- provider: mockModels.meta.provider,
283
- });
284
- expect(typeof compat.shouldApply()).toBe('boolean');
285
- });
286
-
287
- it('should return correct schema target', () => {
288
- const compat = new MetaSchemaCompatLayer({
289
- modelId: mockModels.meta.modelId,
290
- supportsStructuredOutputs: mockModels.meta.supportsStructuredOutputs ?? false,
291
- provider: mockModels.meta.provider,
292
- });
293
- expect(compat.getSchemaTarget()).toBe('jsonSchema7');
294
- });
295
-
296
- it('should handle array and union types', () => {
297
- const compat = new MetaSchemaCompatLayer({
298
- modelId: mockModels.meta.modelId,
299
- supportsStructuredOutputs: mockModels.meta.supportsStructuredOutputs ?? false,
300
- provider: mockModels.meta.provider,
301
- });
302
- const schema = z.object({
303
- tags: z.array(z.string()).min(1).max(10),
304
- status: z.union([z.literal('active'), z.literal('inactive')]),
305
- priority: z.enum(['low', 'medium', 'high']),
306
- });
307
-
308
- const result = compat.processToAISDKSchema(schema);
309
-
310
- expect(result).toHaveProperty('jsonSchema');
311
- expect(result).toHaveProperty('validate');
312
-
313
- const validData = {
314
- tags: ['tag1'],
315
- status: 'active',
316
- priority: 'high',
317
- };
318
-
319
- const validationResult = result.validate!(validData);
320
- expect(typeof validationResult).toBe('object');
321
- expect(validationResult).toHaveProperty('success');
322
- });
323
- });
324
-
325
- describe('Integration tests', () => {
326
- it('should handle schema processing across providers', () => {
327
- const complexSchema = z.object({
328
- user: z.object({
329
- name: z.string().min(1).max(100),
330
- email: z.string().email(),
331
- age: z.number().min(0).max(120).optional(),
332
- }),
333
- preferences: z.object({
334
- theme: z.enum(['light', 'dark']),
335
- notifications: z.boolean(),
336
- language: z.string().regex(/^[a-z]{2}$/),
337
- }),
338
- tags: z.array(z.string()).min(1).max(5),
339
- metadata: z.record(z.union([z.string(), z.number(), z.boolean()])),
340
- createdAt: z.date(),
341
- settings: z
342
- .object({
343
- public: z.boolean(),
344
- featured: z.boolean().optional(),
345
- })
346
- .optional(),
347
- });
348
-
349
- const providers = [
350
- new AnthropicSchemaCompatLayer({
351
- modelId: mockModels.anthropic.modelId,
352
- supportsStructuredOutputs: mockModels.anthropic.supportsStructuredOutputs ?? false,
353
- provider: mockModels.anthropic.provider,
354
- }),
355
- new OpenAISchemaCompatLayer({
356
- modelId: mockModels.openai.modelId,
357
- supportsStructuredOutputs: mockModels.openai.supportsStructuredOutputs ?? false,
358
- provider: mockModels.openai.provider,
359
- }),
360
- new OpenAIReasoningSchemaCompatLayer({
361
- modelId: mockModels.openaiReasoning.modelId,
362
- supportsStructuredOutputs: mockModels.openaiReasoning.supportsStructuredOutputs ?? false,
363
- provider: mockModels.openaiReasoning.provider,
364
- }),
365
- new GoogleSchemaCompatLayer({
366
- modelId: mockModels.google.modelId,
367
- supportsStructuredOutputs: mockModels.google.supportsStructuredOutputs ?? false,
368
- provider: mockModels.google.provider,
369
- }),
370
- new MetaSchemaCompatLayer({
371
- modelId: mockModels.meta.modelId,
372
- supportsStructuredOutputs: mockModels.meta.supportsStructuredOutputs ?? false,
373
- provider: mockModels.meta.provider,
374
- }),
375
- ];
376
-
377
- providers.forEach(provider => {
378
- const result = provider.processToAISDKSchema(complexSchema);
379
-
380
- expect(result).toHaveProperty('jsonSchema');
381
- expect(result).toHaveProperty('validate');
382
- expect(typeof result.validate).toBe('function');
383
-
384
- const validData = {
385
- user: {
386
- name: 'John Doe',
387
- email: 'john@example.com',
388
- },
389
- preferences: {
390
- theme: 'dark' as const,
391
- notifications: true,
392
- language: 'en',
393
- },
394
- tags: ['tag1'],
395
- metadata: {
396
- key1: 'value1',
397
- },
398
- createdAt: new Date(),
399
- };
400
-
401
- const validationResult = result.validate!(validData);
402
- expect(typeof validationResult).toBe('object');
403
- expect(validationResult).toHaveProperty('success');
404
- });
405
- });
406
- });
407
- });