@veloxts/velox 0.6.58 → 0.6.60

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/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @veloxts/velox
2
2
 
3
+ ## 0.6.60
4
+
5
+ ### Patch Changes
6
+
7
+ - feat(create): add tRPC-specific CLAUDE.md and improve AI-native features
8
+ - Updated dependencies
9
+ - @veloxts/auth@0.6.60
10
+ - @veloxts/core@0.6.60
11
+ - @veloxts/orm@0.6.60
12
+ - @veloxts/router@0.6.60
13
+ - @veloxts/validation@0.6.60
14
+
15
+ ## 0.6.59
16
+
17
+ ### Patch Changes
18
+
19
+ - refactor(ecosystem): Laravel-style API refinements & added missing unit tests
20
+ - Updated dependencies
21
+ - @veloxts/auth@0.6.59
22
+ - @veloxts/core@0.6.59
23
+ - @veloxts/orm@0.6.59
24
+ - @veloxts/router@0.6.59
25
+ - @veloxts/validation@0.6.59
26
+
3
27
  ## 0.6.58
4
28
 
5
29
  ### Patch Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Velox TS Framework
2
2
 
3
- > **Early Preview (v0.6.x)** - APIs are stabilizing but may still change. Use with caution in production.
3
+ > **Early Preview (v0.6.x)** - APIs are stabilizing but may still change. Do not use in production yet.
4
4
 
5
5
  ## Type-safe full-stack without the build step
6
6
 
@@ -24,8 +24,11 @@ Your web app is running at `http://localhost:8080`.
24
24
  For adding to an existing project:
25
25
 
26
26
  ```bash
27
- npm install @veloxts/velox zod
28
- npm install -D @veloxts/cli tsx typescript prisma @prisma/client
27
+ # Runtime dependencies
28
+ npm install @veloxts/velox @veloxts/cli @prisma/client zod
29
+
30
+ # Development dependencies
31
+ npm install -D tsx typescript prisma
29
32
  ```
30
33
 
31
34
  Note: Manual setup requires Prisma 7 configuration with driver adapters. See [@veloxts/orm](https://www.npmjs.com/package/@veloxts/orm) for details.
@@ -33,15 +36,35 @@ Note: Manual setup requires Prisma 7 configuration with driver adapters. See [@v
33
36
  ## What's Included
34
37
 
35
38
  This umbrella package re-exports:
36
- - `@veloxts/core` - App bootstrap, plugins, DI
37
- - `@veloxts/router` - Procedures, REST adapter, tRPC
38
- - `@veloxts/orm` - Prisma database plugin
39
- - `@veloxts/auth` - Authentication & authorization
40
- - `@veloxts/validation` - Zod integration
41
- - `@veloxts/mcp` - exposes project context to AI assistants
42
- - `@veloxts/web` - React Server Components for full-stack web apps
43
-
44
- Separate packages: `@veloxts/cli`, `@veloxts/client`, `create-velox-app`
39
+
40
+ - `@veloxts/core` - App bootstrap, plugins, DI container
41
+ - `@veloxts/router` - Procedures, REST adapter, tRPC integration
42
+ - `@veloxts/orm` - Prisma database plugin with driver adapters
43
+ - `@veloxts/auth` - JWT/session authentication, guards, rate limiting
44
+ - `@veloxts/validation` - Zod schema utilities and integration
45
+
46
+ ## Separate Packages
47
+
48
+ Install these separately based on your needs:
49
+
50
+ | Package | Description |
51
+ |---------|-------------|
52
+ | `@veloxts/cli` | Developer CLI (`velox dev`, `velox make`, `velox migrate`) |
53
+ | `@veloxts/client` | Type-safe frontend API client |
54
+ | `@veloxts/web` | React Server Components with Vinxi |
55
+ | `@veloxts/mcp` | Model Context Protocol server for AI assistants |
56
+ | `create-velox-app` | Project scaffolder |
57
+
58
+ ## Ecosystem Add-ons (Experimental)
59
+
60
+ | Package | Description |
61
+ |---------|-------------|
62
+ | `@veloxts/cache` | Multi-driver caching (memory, Redis) |
63
+ | `@veloxts/queue` | Background job processing (sync, BullMQ) |
64
+ | `@veloxts/mail` | Email sending (SMTP, Resend, React Email) |
65
+ | `@veloxts/storage` | File storage abstraction (local, S3/R2) |
66
+ | `@veloxts/scheduler` | Cron task scheduling |
67
+ | `@veloxts/events` | Real-time broadcasting (WebSocket, SSE) |
45
68
 
46
69
  ## License
47
70
 
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Meta-package Export Tests
3
+ *
4
+ * Verifies that all expected exports from @veloxts/velox are accessible
5
+ * and that the re-export mechanism works correctly.
6
+ */
7
+ export {};
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Meta-package Export Tests
3
+ *
4
+ * Verifies that all expected exports from @veloxts/velox are accessible
5
+ * and that the re-export mechanism works correctly.
6
+ */
7
+ import { describe, expect, expectTypeOf, it } from 'vitest';
8
+ // Import from subpath exports
9
+ import * as auth from '../auth.js';
10
+ import * as core from '../core.js';
11
+ // Import everything from main entry point
12
+ import * as velox from '../index.js';
13
+ import * as orm from '../orm.js';
14
+ import * as router from '../router.js';
15
+ import * as validation from '../validation.js';
16
+ // ============================================================================
17
+ // Main Entry Point Exports
18
+ // ============================================================================
19
+ describe('Main entry point (@veloxts/velox)', () => {
20
+ describe('Core exports', () => {
21
+ it('should export veloxApp factory', () => {
22
+ expect(velox.veloxApp).toBeDefined();
23
+ expect(typeof velox.veloxApp).toBe('function');
24
+ });
25
+ it('should export Container class', () => {
26
+ expect(velox.Container).toBeDefined();
27
+ });
28
+ it('should export container singleton', () => {
29
+ expect(velox.container).toBeDefined();
30
+ });
31
+ it('should export definePlugin', () => {
32
+ expect(velox.definePlugin).toBeDefined();
33
+ expect(typeof velox.definePlugin).toBe('function');
34
+ });
35
+ it('should export DI decorators', () => {
36
+ expect(velox.Injectable).toBeDefined();
37
+ expect(velox.Inject).toBeDefined();
38
+ expect(velox.Optional).toBeDefined();
39
+ expect(velox.Scope).toBeDefined();
40
+ });
41
+ it('should export token utilities', () => {
42
+ expect(velox.token).toBeDefined();
43
+ expect(velox.singleton).toBeDefined();
44
+ expect(velox.transient).toBeDefined();
45
+ });
46
+ it('should export error classes', () => {
47
+ expect(velox.VeloxError).toBeDefined();
48
+ expect(velox.ValidationError).toBeDefined();
49
+ expect(velox.NotFoundError).toBeDefined();
50
+ });
51
+ });
52
+ describe('Router exports', () => {
53
+ it('should export procedure builder', () => {
54
+ expect(velox.procedure).toBeDefined();
55
+ expect(typeof velox.procedure).toBe('function');
56
+ });
57
+ it('should export defineProcedures', () => {
58
+ expect(velox.defineProcedures).toBeDefined();
59
+ expect(typeof velox.defineProcedures).toBe('function');
60
+ });
61
+ it('should export tRPC utilities', () => {
62
+ expect(velox.trpc).toBeDefined();
63
+ });
64
+ it('should export REST adapter utilities', () => {
65
+ expect(velox.rest).toBeDefined();
66
+ });
67
+ });
68
+ describe('Validation exports', () => {
69
+ it('should export Zod (z)', () => {
70
+ expect(velox.z).toBeDefined();
71
+ expect(velox.z.string).toBeDefined();
72
+ expect(velox.z.object).toBeDefined();
73
+ });
74
+ it('should export parse utilities', () => {
75
+ expect(velox.parse).toBeDefined();
76
+ expect(velox.safeParse).toBeDefined();
77
+ expect(velox.parseAll).toBeDefined();
78
+ });
79
+ it('should export common schemas', () => {
80
+ expect(velox.emailSchema).toBeDefined();
81
+ expect(velox.uuidSchema).toBeDefined();
82
+ expect(velox.nonEmptyStringSchema).toBeDefined();
83
+ });
84
+ it('should export pagination utilities', () => {
85
+ expect(velox.paginationInputSchema).toBeDefined();
86
+ expect(velox.createPaginatedResponseSchema).toBeDefined();
87
+ });
88
+ });
89
+ describe('ORM exports', () => {
90
+ it('should export databasePlugin', () => {
91
+ expect(velox.databasePlugin).toBeDefined();
92
+ });
93
+ it('should export database utilities', () => {
94
+ expect(velox.createDatabase).toBeDefined();
95
+ });
96
+ it('should export DI tokens', () => {
97
+ expect(velox.DATABASE_CLIENT).toBeDefined();
98
+ });
99
+ });
100
+ describe('Auth exports', () => {
101
+ it('should export authPlugin', () => {
102
+ expect(velox.authPlugin).toBeDefined();
103
+ });
104
+ it('should export jwtManager', () => {
105
+ expect(velox.jwtManager).toBeDefined();
106
+ expect(typeof velox.jwtManager).toBe('function');
107
+ });
108
+ it('should export guards', () => {
109
+ expect(velox.authenticated).toBeDefined();
110
+ expect(velox.hasRole).toBeDefined();
111
+ expect(velox.hasPermission).toBeDefined();
112
+ });
113
+ it('should export session utilities', () => {
114
+ expect(velox.sessionMiddleware).toBeDefined();
115
+ expect(velox.sessionManager).toBeDefined();
116
+ expect(velox.inMemorySessionStore).toBeDefined();
117
+ });
118
+ it('should export CSRF protection', () => {
119
+ expect(velox.csrfManager).toBeDefined();
120
+ expect(velox.csrfMiddleware).toBeDefined();
121
+ });
122
+ it('should export rate limiting', () => {
123
+ expect(velox.authRateLimiter).toBeDefined();
124
+ expect(velox.rateLimitMiddleware).toBeDefined();
125
+ });
126
+ it('should export password utilities', () => {
127
+ expect(velox.passwordHasher).toBeDefined();
128
+ expect(velox.hashPassword).toBeDefined();
129
+ expect(velox.verifyPassword).toBeDefined();
130
+ });
131
+ });
132
+ });
133
+ // ============================================================================
134
+ // Subpath Exports
135
+ // ============================================================================
136
+ describe('Subpath exports', () => {
137
+ describe('@veloxts/velox/core', () => {
138
+ it('should export core functionality', () => {
139
+ expect(core.veloxApp).toBeDefined();
140
+ expect(core.Container).toBeDefined();
141
+ expect(core.definePlugin).toBeDefined();
142
+ expect(core.VeloxError).toBeDefined();
143
+ });
144
+ it('should match main entry exports for core', () => {
145
+ expect(core.veloxApp).toBe(velox.veloxApp);
146
+ expect(core.Container).toBe(velox.Container);
147
+ expect(core.definePlugin).toBe(velox.definePlugin);
148
+ });
149
+ });
150
+ describe('@veloxts/velox/validation', () => {
151
+ it('should export validation functionality', () => {
152
+ expect(validation.z).toBeDefined();
153
+ expect(validation.parse).toBeDefined();
154
+ expect(validation.safeParse).toBeDefined();
155
+ expect(validation.emailSchema).toBeDefined();
156
+ });
157
+ it('should match main entry exports for validation', () => {
158
+ expect(validation.z).toBe(velox.z);
159
+ expect(validation.parse).toBe(velox.parse);
160
+ expect(validation.emailSchema).toBe(velox.emailSchema);
161
+ });
162
+ });
163
+ describe('@veloxts/velox/orm', () => {
164
+ it('should export ORM functionality', () => {
165
+ expect(orm.databasePlugin).toBeDefined();
166
+ expect(orm.createDatabase).toBeDefined();
167
+ expect(orm.DATABASE_CLIENT).toBeDefined();
168
+ });
169
+ it('should match main entry exports for orm', () => {
170
+ expect(orm.databasePlugin).toBe(velox.databasePlugin);
171
+ expect(orm.DATABASE_CLIENT).toBe(velox.DATABASE_CLIENT);
172
+ });
173
+ });
174
+ describe('@veloxts/velox/router', () => {
175
+ it('should export router functionality', () => {
176
+ expect(router.procedure).toBeDefined();
177
+ expect(router.defineProcedures).toBeDefined();
178
+ expect(router.trpc).toBeDefined();
179
+ expect(router.rest).toBeDefined();
180
+ });
181
+ it('should match main entry exports for router', () => {
182
+ expect(router.procedure).toBe(velox.procedure);
183
+ expect(router.defineProcedures).toBe(velox.defineProcedures);
184
+ expect(router.trpc).toBe(velox.trpc);
185
+ });
186
+ });
187
+ describe('@veloxts/velox/auth', () => {
188
+ it('should export auth functionality', () => {
189
+ expect(auth.authPlugin).toBeDefined();
190
+ expect(auth.jwtManager).toBeDefined();
191
+ expect(auth.authenticated).toBeDefined();
192
+ expect(auth.sessionMiddleware).toBeDefined();
193
+ });
194
+ it('should match main entry exports for auth', () => {
195
+ expect(auth.authPlugin).toBe(velox.authPlugin);
196
+ expect(auth.jwtManager).toBe(velox.jwtManager);
197
+ expect(auth.authenticated).toBe(velox.authenticated);
198
+ });
199
+ });
200
+ });
201
+ // ============================================================================
202
+ // Integration Verification
203
+ // ============================================================================
204
+ describe('Integration verification', () => {
205
+ it('should allow creating a basic schema with z', () => {
206
+ const schema = velox.z.object({
207
+ id: velox.z.string().uuid(),
208
+ email: velox.z.string().email(),
209
+ name: velox.z.string().min(1),
210
+ });
211
+ const result = schema.safeParse({
212
+ id: '123e4567-e89b-12d3-a456-426614174000',
213
+ email: 'test@example.com',
214
+ name: 'Test User',
215
+ });
216
+ expect(result.success).toBe(true);
217
+ });
218
+ it('should allow creating a Container instance', () => {
219
+ const container = new velox.Container();
220
+ expect(container).toBeInstanceOf(velox.Container);
221
+ });
222
+ it('should allow creating tokens', () => {
223
+ const testToken = velox.token('test-token');
224
+ expect(testToken).toBeDefined();
225
+ // Token is a StringToken which is just a branded string
226
+ expect(typeof testToken).toBe('string');
227
+ });
228
+ it('should allow using parse utilities', () => {
229
+ const schema = velox.z.number().positive();
230
+ expect(() => velox.parse(schema, 42)).not.toThrow();
231
+ expect(() => velox.parse(schema, -1)).toThrow();
232
+ const safeResult = velox.safeParse(schema, 42);
233
+ expect(safeResult.success).toBe(true);
234
+ if (safeResult.success) {
235
+ expect(safeResult.data).toBe(42);
236
+ }
237
+ });
238
+ it('should allow creating error instances', () => {
239
+ const error = new velox.VeloxError('Test error message', 500, 'TEST_ERROR');
240
+ expect(error).toBeInstanceOf(Error);
241
+ expect(error).toBeInstanceOf(velox.VeloxError);
242
+ expect(error.code).toBe('TEST_ERROR');
243
+ expect(error.message).toBe('Test error message');
244
+ expect(error.statusCode).toBe(500);
245
+ });
246
+ });
247
+ // ============================================================================
248
+ // Export Count Verification
249
+ // ============================================================================
250
+ describe('Export completeness', () => {
251
+ it('should have a substantial number of exports', () => {
252
+ const exportCount = Object.keys(velox).length;
253
+ // Meta-package should re-export many items from 5 packages
254
+ expect(exportCount).toBeGreaterThan(50);
255
+ });
256
+ it('should have exports from all subpackages', () => {
257
+ // Verify at least one unique export from each package
258
+ expect(velox.veloxApp).toBeDefined(); // core
259
+ expect(velox.z).toBeDefined(); // validation
260
+ expect(velox.databasePlugin).toBeDefined(); // orm
261
+ expect(velox.procedure).toBeDefined(); // router
262
+ expect(velox.jwtManager).toBeDefined(); // auth
263
+ });
264
+ });
265
+ // ============================================================================
266
+ // Type Export Tests (compile-time verification with expectTypeOf)
267
+ // ============================================================================
268
+ describe('Type exports', () => {
269
+ describe('Core types', () => {
270
+ it('should export VeloxApp type', () => {
271
+ expectTypeOf().toBeObject();
272
+ });
273
+ it('should export Container type', () => {
274
+ expectTypeOf().toBeObject();
275
+ });
276
+ it('should export BaseContext type', () => {
277
+ expectTypeOf().toBeObject();
278
+ });
279
+ it('should export InjectionToken type', () => {
280
+ // InjectionToken is a union type
281
+ expectTypeOf().not.toBeNever();
282
+ });
283
+ });
284
+ describe('Auth types', () => {
285
+ it('should export User type', () => {
286
+ expectTypeOf().toBeObject();
287
+ });
288
+ it('should export TokenPayload type', () => {
289
+ expectTypeOf().toBeObject();
290
+ });
291
+ it('should export JwtConfig type', () => {
292
+ expectTypeOf().toBeObject();
293
+ });
294
+ it('should export GuardFunction type', () => {
295
+ // GuardFunction is a function type
296
+ expectTypeOf().toBeFunction();
297
+ });
298
+ });
299
+ describe('Router types', () => {
300
+ it('should export CompiledProcedure type', () => {
301
+ expectTypeOf().toBeObject();
302
+ });
303
+ it('should export ProcedureCollection type', () => {
304
+ expectTypeOf().toBeObject();
305
+ });
306
+ });
307
+ describe('Validation types', () => {
308
+ it('should export InferOutput type utility', () => {
309
+ // InferOutput extracts the output type from a schema
310
+ const schema = velox.z.object({ id: velox.z.string() });
311
+ expectTypeOf().toEqualTypeOf();
312
+ });
313
+ it('should export SafeParseResult type', () => {
314
+ expectTypeOf().not.toBeNever();
315
+ });
316
+ });
317
+ });
318
+ // ============================================================================
319
+ // Export Count Per Submodule (Regression Protection)
320
+ // ============================================================================
321
+ describe('Export count per submodule', () => {
322
+ // These counts serve as regression protection - if exports are accidentally
323
+ // removed, these tests will fail and alert developers.
324
+ it('should have expected number of core exports', () => {
325
+ const coreExportCount = Object.keys(core).length;
326
+ // Core has ~50+ exports (classes, functions, types, decorators)
327
+ expect(coreExportCount).toBeGreaterThanOrEqual(45);
328
+ });
329
+ it('should have expected number of validation exports', () => {
330
+ const validationExportCount = Object.keys(validation).length;
331
+ // Validation has ~35+ exports (z, schemas, utilities)
332
+ expect(validationExportCount).toBeGreaterThanOrEqual(30);
333
+ });
334
+ it('should have expected number of orm exports', () => {
335
+ const ormExportCount = Object.keys(orm).length;
336
+ // ORM has ~25+ exports (plugin, utilities, types)
337
+ expect(ormExportCount).toBeGreaterThanOrEqual(20);
338
+ });
339
+ it('should have expected number of router exports', () => {
340
+ const routerExportCount = Object.keys(router).length;
341
+ // Router has ~70+ exports (procedures, REST, tRPC, OpenAPI)
342
+ expect(routerExportCount).toBeGreaterThanOrEqual(65);
343
+ });
344
+ it('should have expected number of auth exports', () => {
345
+ const authExportCount = Object.keys(auth).length;
346
+ // Auth has ~70+ exports (JWT, sessions, guards, CSRF, rate limiting)
347
+ expect(authExportCount).toBeGreaterThanOrEqual(65);
348
+ });
349
+ it('should log export counts for debugging', () => {
350
+ // This test always passes but logs counts for visibility
351
+ const counts = {
352
+ core: Object.keys(core).length,
353
+ validation: Object.keys(validation).length,
354
+ orm: Object.keys(orm).length,
355
+ router: Object.keys(router).length,
356
+ auth: Object.keys(auth).length,
357
+ total: Object.keys(velox).length,
358
+ };
359
+ // Log to help debug if thresholds need adjustment
360
+ console.log('Export counts:', counts);
361
+ expect(true).toBe(true);
362
+ });
363
+ });
364
+ // ============================================================================
365
+ // Negative Tests (Verify Internals NOT Exported)
366
+ // ============================================================================
367
+ describe('Internal implementation details should NOT be exported', () => {
368
+ describe('Core internals', () => {
369
+ it('should not expose internal container implementation details', () => {
370
+ // These are implementation details that should not be public API
371
+ expect(velox.ContainerImpl).toBeUndefined();
372
+ expect(velox._internalContainer).toBeUndefined();
373
+ expect(velox.__private).toBeUndefined();
374
+ });
375
+ it('should not expose internal metadata keys', () => {
376
+ expect(velox.INJECTABLE_METADATA).toBeUndefined();
377
+ expect(velox.INJECT_METADATA).toBeUndefined();
378
+ });
379
+ });
380
+ describe('Router internals', () => {
381
+ it('should not expose internal procedure building utilities', () => {
382
+ expect(velox._buildProcedure).toBeUndefined();
383
+ expect(velox.InternalBuilder).toBeUndefined();
384
+ });
385
+ it('should not expose internal REST adapter internals', () => {
386
+ expect(velox._restAdapterInternal).toBeUndefined();
387
+ });
388
+ });
389
+ describe('Auth internals', () => {
390
+ it('should not expose internal token handling', () => {
391
+ expect(velox._signToken).toBeUndefined();
392
+ expect(velox._verifyToken).toBeUndefined();
393
+ });
394
+ it('should not expose internal session store implementation', () => {
395
+ expect(velox.SessionStoreImpl).toBeUndefined();
396
+ expect(velox._sessionStorage).toBeUndefined();
397
+ });
398
+ });
399
+ describe('ORM internals', () => {
400
+ it('should not expose internal database connection handling', () => {
401
+ expect(velox._dbConnection).toBeUndefined();
402
+ expect(velox.InternalPrismaClient).toBeUndefined();
403
+ });
404
+ });
405
+ describe('Validation internals', () => {
406
+ it('should not expose internal schema utilities', () => {
407
+ expect(velox._schemaRegistry).toBeUndefined();
408
+ expect(velox.InternalValidator).toBeUndefined();
409
+ });
410
+ });
411
+ describe('General naming conventions', () => {
412
+ it('should not have any exports starting with underscore', () => {
413
+ const underscoreExports = Object.keys(velox).filter((key) => key.startsWith('_'));
414
+ expect(underscoreExports).toEqual([]);
415
+ });
416
+ it('should not have any exports containing "Internal" (case-insensitive)', () => {
417
+ const internalExports = Object.keys(velox).filter((key) => key.toLowerCase().includes('internal'));
418
+ expect(internalExports).toEqual([]);
419
+ });
420
+ it('should not have any exports containing "Private" (case-insensitive)', () => {
421
+ const privateExports = Object.keys(velox).filter((key) => key.toLowerCase().includes('private'));
422
+ expect(privateExports).toEqual([]);
423
+ });
424
+ it('should not have any exports containing "Impl" suffix', () => {
425
+ const implExports = Object.keys(velox).filter((key) => key.endsWith('Impl'));
426
+ expect(implExports).toEqual([]);
427
+ });
428
+ });
429
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veloxts/velox",
3
- "version": "0.6.58",
3
+ "version": "0.6.60",
4
4
  "description": "Complete VeloxTS framework - batteries included",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -39,14 +39,15 @@
39
39
  "CHANGELOG.md"
40
40
  ],
41
41
  "dependencies": {
42
- "@veloxts/core": "0.6.58",
43
- "@veloxts/router": "0.6.58",
44
- "@veloxts/orm": "0.6.58",
45
- "@veloxts/validation": "0.6.58",
46
- "@veloxts/auth": "0.6.58"
42
+ "@veloxts/core": "0.6.60",
43
+ "@veloxts/orm": "0.6.60",
44
+ "@veloxts/validation": "0.6.60",
45
+ "@veloxts/router": "0.6.60",
46
+ "@veloxts/auth": "0.6.60"
47
47
  },
48
48
  "devDependencies": {
49
- "typescript": "5.9.3"
49
+ "typescript": "5.9.3",
50
+ "vitest": "4.0.16"
50
51
  },
51
52
  "peerDependencies": {
52
53
  "zod": "^3.25.0"
@@ -76,6 +77,9 @@
76
77
  "build": "tsc",
77
78
  "dev": "tsc --watch",
78
79
  "type-check": "tsc --noEmit",
79
- "clean": "rm -rf dist tsconfig.tsbuildinfo"
80
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
81
+ "test": "vitest run",
82
+ "test:watch": "vitest",
83
+ "test:coverage": "vitest run --coverage"
80
84
  }
81
85
  }