@veloxts/router 0.3.2 → 0.3.4
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 +78 -21
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/rest/adapter.d.ts +37 -4
- package/dist/rest/adapter.d.ts.map +1 -1
- package/dist/rest/adapter.js +87 -26
- package/dist/rest/adapter.js.map +1 -1
- package/dist/rest/index.d.ts +1 -1
- package/dist/rest/index.d.ts.map +1 -1
- package/dist/rest/index.js +7 -1
- package/dist/rest/index.js.map +1 -1
- package/dist/rest/naming.d.ts.map +1 -1
- package/dist/rest/naming.js +49 -13
- package/dist/rest/naming.js.map +1 -1
- package/package.json +8 -7
package/README.md
CHANGED
|
@@ -133,8 +133,24 @@ const userProcedures = defineProcedures('users', {
|
|
|
133
133
|
return ctx.db.user.create({ data: input });
|
|
134
134
|
}),
|
|
135
135
|
|
|
136
|
-
//
|
|
136
|
+
// PUT /api/users/:id - Full update
|
|
137
137
|
updateUser: procedure()
|
|
138
|
+
.input(z.object({
|
|
139
|
+
id: z.string().uuid(),
|
|
140
|
+
name: z.string().min(1),
|
|
141
|
+
email: z.string().email(),
|
|
142
|
+
}))
|
|
143
|
+
.output(UserSchema)
|
|
144
|
+
.mutation(async ({ input, ctx }) => {
|
|
145
|
+
const { id, ...data } = input;
|
|
146
|
+
return ctx.db.user.update({
|
|
147
|
+
where: { id },
|
|
148
|
+
data,
|
|
149
|
+
});
|
|
150
|
+
}),
|
|
151
|
+
|
|
152
|
+
// PATCH /api/users/:id - Partial update
|
|
153
|
+
patchUser: procedure()
|
|
138
154
|
.input(z.object({
|
|
139
155
|
id: z.string().uuid(),
|
|
140
156
|
name: z.string().min(1).optional(),
|
|
@@ -148,6 +164,15 @@ const userProcedures = defineProcedures('users', {
|
|
|
148
164
|
data,
|
|
149
165
|
});
|
|
150
166
|
}),
|
|
167
|
+
|
|
168
|
+
// DELETE /api/users/:id
|
|
169
|
+
deleteUser: procedure()
|
|
170
|
+
.input(z.object({ id: z.string().uuid() }))
|
|
171
|
+
.output(z.object({ success: z.boolean() }))
|
|
172
|
+
.mutation(async ({ input, ctx }) => {
|
|
173
|
+
await ctx.db.user.delete({ where: { id: input.id } });
|
|
174
|
+
return { success: true };
|
|
175
|
+
}),
|
|
151
176
|
});
|
|
152
177
|
```
|
|
153
178
|
|
|
@@ -155,21 +180,35 @@ const userProcedures = defineProcedures('users', {
|
|
|
155
180
|
|
|
156
181
|
VeloxTS automatically generates REST endpoints from procedure names using **naming conventions**:
|
|
157
182
|
|
|
158
|
-
###
|
|
183
|
+
### Supported Naming Patterns
|
|
159
184
|
|
|
160
|
-
| Procedure Name | HTTP Method | REST Path | Notes |
|
|
161
|
-
|
|
162
|
-
| `getUser` | GET | `/users/:id` | Single resource |
|
|
163
|
-
| `listUsers` | GET | `/users` | Collection |
|
|
164
|
-
| `
|
|
185
|
+
| Procedure Name | HTTP Method | REST Path | Status Code | Notes |
|
|
186
|
+
|---------------|-------------|-----------|-------------|-------|
|
|
187
|
+
| `getUser` | GET | `/users/:id` | 200 | Single resource |
|
|
188
|
+
| `listUsers` | GET | `/users` | 200 | Collection |
|
|
189
|
+
| `findUsers` | GET | `/users` | 200 | Search/filter |
|
|
190
|
+
| `createUser` | POST | `/users` | 201 | Create resource |
|
|
191
|
+
| `addUser` | POST | `/users` | 201 | Create resource |
|
|
192
|
+
| `updateUser` | PUT | `/users/:id` | 200 | Full update |
|
|
193
|
+
| `editUser` | PUT | `/users/:id` | 200 | Full update |
|
|
194
|
+
| `patchUser` | PATCH | `/users/:id` | 200 | Partial update |
|
|
195
|
+
| `deleteUser` | DELETE | `/users/:id` | 200/204 | Delete resource |
|
|
196
|
+
| `removeUser` | DELETE | `/users/:id` | 200/204 | Delete resource |
|
|
165
197
|
|
|
166
|
-
###
|
|
198
|
+
### Input Gathering
|
|
167
199
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
200
|
+
Different HTTP methods gather inputs from different request parts:
|
|
201
|
+
|
|
202
|
+
- **GET/DELETE**: `params` (route parameters) + `query` (query string)
|
|
203
|
+
- **POST**: `body` only
|
|
204
|
+
- **PUT/PATCH**: `params` (route parameters) + `body`
|
|
205
|
+
|
|
206
|
+
### Status Codes
|
|
207
|
+
|
|
208
|
+
- **GET**: 200 OK
|
|
209
|
+
- **POST**: 201 Created
|
|
210
|
+
- **PUT/PATCH**: 200 OK
|
|
211
|
+
- **DELETE**: 200 OK (with response body) or 204 No Content (if handler returns null)
|
|
173
212
|
|
|
174
213
|
### Custom REST Paths
|
|
175
214
|
|
|
@@ -461,8 +500,27 @@ export const userProcedures = defineProcedures('users', {
|
|
|
461
500
|
return ctx.db.user.create({ data: input });
|
|
462
501
|
}),
|
|
463
502
|
|
|
464
|
-
// PUT /users/:id
|
|
465
|
-
|
|
503
|
+
// PUT /users/:id
|
|
504
|
+
updateUser: procedure()
|
|
505
|
+
.input(z.object({
|
|
506
|
+
id: z.string().uuid(),
|
|
507
|
+
name: z.string().min(1).max(100),
|
|
508
|
+
email: z.string().email(),
|
|
509
|
+
}))
|
|
510
|
+
.output(UserSchema)
|
|
511
|
+
.mutation(async ({ input, ctx }) => {
|
|
512
|
+
const { id, ...data } = input;
|
|
513
|
+
return ctx.db.user.update({ where: { id }, data });
|
|
514
|
+
}),
|
|
515
|
+
|
|
516
|
+
// DELETE /users/:id
|
|
517
|
+
deleteUser: procedure()
|
|
518
|
+
.input(z.object({ id: z.string().uuid() }))
|
|
519
|
+
.output(z.object({ success: z.boolean() }))
|
|
520
|
+
.mutation(async ({ input, ctx }) => {
|
|
521
|
+
await ctx.db.user.delete({ where: { id: input.id } });
|
|
522
|
+
return { success: true };
|
|
523
|
+
}),
|
|
466
524
|
});
|
|
467
525
|
```
|
|
468
526
|
|
|
@@ -613,21 +671,20 @@ await registerRestRoutes(app.server, {
|
|
|
613
671
|
// Generates: GET /api/v1/users/:id
|
|
614
672
|
```
|
|
615
673
|
|
|
616
|
-
##
|
|
617
|
-
|
|
618
|
-
The current v0.1.0 release supports:
|
|
674
|
+
## Current Features
|
|
619
675
|
|
|
620
676
|
**Included:**
|
|
621
677
|
- Query procedures (GET)
|
|
622
|
-
- Mutation procedures (POST)
|
|
678
|
+
- Mutation procedures (POST, PUT, PATCH, DELETE)
|
|
679
|
+
- Full REST verb support with smart input gathering
|
|
680
|
+
- Proper HTTP status codes (201, 204, etc.)
|
|
623
681
|
- Input/output validation with Zod
|
|
624
682
|
- Naming convention-based REST mapping
|
|
625
683
|
- Custom REST path overrides
|
|
626
684
|
- tRPC adapter for type-safe internal calls
|
|
627
685
|
- Middleware support
|
|
628
686
|
|
|
629
|
-
**
|
|
630
|
-
- Full REST verbs (PUT, PATCH, DELETE)
|
|
687
|
+
**Planned for Future Releases:**
|
|
631
688
|
- Nested resource routing
|
|
632
689
|
- OpenAPI/Swagger documentation generation
|
|
633
690
|
- Rate limiting middleware
|
package/dist/index.d.ts
CHANGED
|
@@ -37,13 +37,14 @@
|
|
|
37
37
|
*
|
|
38
38
|
* @module @veloxts/router
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
/** Router package version */
|
|
41
|
+
export declare const ROUTER_VERSION: string;
|
|
41
42
|
export type { CompiledProcedure, ContextExtensions, ContextFactory, ExtendedContext, HttpMethod, InferProcedureContext, InferProcedureInput, InferProcedureOutput, InferProcedureTypes, MiddlewareArgs, MiddlewareFunction, MiddlewareNext, MiddlewareResult, ProcedureCollection, ProcedureHandler, ProcedureHandlerArgs, ProcedureRecord, ProcedureType, RestRouteOverride, } from './types.js';
|
|
42
43
|
export { PROCEDURE_METHOD_MAP, } from './types.js';
|
|
43
44
|
export { defineProcedures, executeProcedure, isCompiledProcedure, isProcedureCollection, procedure, } from './procedure/builder.js';
|
|
44
45
|
export type { BuilderRuntimeState, InferProcedures, InferSchemaOutput, ProcedureBuilder, ProcedureBuilderState, ProcedureDefinitions, ValidSchema, } from './procedure/types.js';
|
|
45
46
|
export type { RestAdapterOptions, RestMapping, RestRoute } from './rest/index.js';
|
|
46
|
-
export {
|
|
47
|
+
export { rest, createRoutesRegistrar, buildRestPath, followsNamingConvention, generateRestRoutes, getRouteSummary, inferResourceName, parseNamingConvention, registerRestRoutes, } from './rest/index.js';
|
|
47
48
|
export type { AnyRouter, InferAppRouter, TRPCInstance, TRPCPluginOptions, } from './trpc/index.js';
|
|
48
49
|
export { buildTRPCRouter, createAppRouter, createTRPC, createTRPCContextFactory, registerTRPCPlugin, veloxErrorToTRPCError, } from './trpc/index.js';
|
|
49
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAQH,6BAA6B;AAC7B,eAAO,MAAM,cAAc,EAAE,MAA+C,CAAC;AAO7E,YAAY,EAEV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EAEnB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAEhB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAEL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,GACV,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAEV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAS9B,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAEL,IAAI,EAEJ,qBAAqB,EAErB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAMzB,YAAY,EAEV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,eAAe,EACf,eAAe,EACf,UAAU,EACV,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -37,8 +37,12 @@
|
|
|
37
37
|
*
|
|
38
38
|
* @module @veloxts/router
|
|
39
39
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
import { createRequire } from 'node:module';
|
|
41
|
+
// Read version from package.json dynamically
|
|
42
|
+
const require = createRequire(import.meta.url);
|
|
43
|
+
const packageJson = require('../package.json');
|
|
44
|
+
/** Router package version */
|
|
45
|
+
export const ROUTER_VERSION = packageJson.version ?? '0.0.0-unknown';
|
|
42
46
|
export {
|
|
43
47
|
// Constants
|
|
44
48
|
PROCEDURE_METHOD_MAP, } from './types.js';
|
|
@@ -48,7 +52,13 @@ PROCEDURE_METHOD_MAP, } from './types.js';
|
|
|
48
52
|
export {
|
|
49
53
|
// Builder functions
|
|
50
54
|
defineProcedures, executeProcedure, isCompiledProcedure, isProcedureCollection, procedure, } from './procedure/builder.js';
|
|
51
|
-
export {
|
|
55
|
+
export {
|
|
56
|
+
// Succinct API (preferred)
|
|
57
|
+
rest,
|
|
58
|
+
// Legacy API (deprecated)
|
|
59
|
+
createRoutesRegistrar,
|
|
60
|
+
// Internal utilities
|
|
61
|
+
buildRestPath, followsNamingConvention, generateRestRoutes, getRouteSummary, inferResourceName, parseNamingConvention, registerRestRoutes, } from './rest/index.js';
|
|
52
62
|
export {
|
|
53
63
|
// tRPC utilities
|
|
54
64
|
buildTRPCRouter, createAppRouter, createTRPC, createTRPCContextFactory, registerTRPCPlugin, veloxErrorToTRPCError, } from './trpc/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AA+B7E,OAAO;AACL,YAAY;AACZ,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,OAAO;AACL,oBAAoB;AACpB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,GACV,MAAM,wBAAwB,CAAC;AAoBhC,OAAO;AACL,2BAA2B;AAC3B,IAAI;AACJ,0BAA0B;AAC1B,qBAAqB;AACrB,qBAAqB;AACrB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAazB,OAAO;AACL,iBAAiB;AACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
package/dist/rest/adapter.d.ts
CHANGED
|
@@ -104,21 +104,54 @@ export declare function getRouteSummary(collections: ProcedureCollection[], pref
|
|
|
104
104
|
* @param options - Registration options
|
|
105
105
|
* @returns A function that registers routes on a Fastify instance
|
|
106
106
|
*
|
|
107
|
+
* @deprecated Use `rest()` instead. This alias will be removed in v0.9.
|
|
108
|
+
*
|
|
107
109
|
* @example
|
|
108
110
|
* ```typescript
|
|
109
|
-
* import {
|
|
110
|
-
* import {
|
|
111
|
+
* import { veloxApp } from '@veloxts/core';
|
|
112
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
111
113
|
*
|
|
112
114
|
* const users = defineProcedures('users', {
|
|
113
115
|
* listUsers: procedure().query(async () => []),
|
|
114
116
|
* });
|
|
115
117
|
*
|
|
116
|
-
* const app = await
|
|
118
|
+
* const app = await veloxApp();
|
|
117
119
|
*
|
|
118
|
-
* app.routes(
|
|
120
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
119
121
|
*
|
|
120
122
|
* await app.start();
|
|
121
123
|
* ```
|
|
122
124
|
*/
|
|
123
125
|
export declare function createRoutesRegistrar(collections: ProcedureCollection[], options?: RestAdapterOptions): (server: FastifyInstance) => void;
|
|
126
|
+
/**
|
|
127
|
+
* Creates a routes registrar for REST endpoints (succinct API)
|
|
128
|
+
*
|
|
129
|
+
* This is the preferred way to register procedure collections as REST routes.
|
|
130
|
+
* Use with `app.routes()` for a fluent API experience.
|
|
131
|
+
*
|
|
132
|
+
* @param collections - Procedure collections to register as REST routes
|
|
133
|
+
* @param options - REST adapter options (prefix, validation, etc.)
|
|
134
|
+
* @returns A function that registers routes on a Fastify instance
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* import { veloxApp } from '@veloxts/core';
|
|
139
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
140
|
+
*
|
|
141
|
+
* const users = defineProcedures('users', {
|
|
142
|
+
* listUsers: procedure().query(async () => []),
|
|
143
|
+
* createUser: procedure()
|
|
144
|
+
* .input(z.object({ name: z.string() }))
|
|
145
|
+
* .mutation(async ({ input }) => ({ id: '1', ...input })),
|
|
146
|
+
* });
|
|
147
|
+
*
|
|
148
|
+
* const app = await veloxApp();
|
|
149
|
+
*
|
|
150
|
+
* // Succinct registration
|
|
151
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
152
|
+
*
|
|
153
|
+
* await app.start();
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare function rest(collections: ProcedureCollection[], options?: RestAdapterOptions): (server: FastifyInstance) => void;
|
|
124
157
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOtF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,kBAAkB;IAClB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAClF;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAAE,CAW/E;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOtF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,kBAAkB;IAClB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAClF;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAAE,CAW/E;AA6KD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,GAAE,kBAAuB,GAC/B,IAAI,CA8BN;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,mBAAmB,EAAE,EAClC,MAAM,SAAS,GACd,KAAK,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBnF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,GAAE,kBAAuB,GAC/B,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAInC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,IAAI,CAClB,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,GAAE,kBAAuB,GAC/B,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAInC"}
|
package/dist/rest/adapter.js
CHANGED
|
@@ -68,10 +68,6 @@ function generateRouteForProcedure(name, procedure, namespace) {
|
|
|
68
68
|
// Try to infer from naming convention
|
|
69
69
|
const mapping = parseNamingConvention(name, procedure.type);
|
|
70
70
|
if (mapping) {
|
|
71
|
-
// MVP: Only allow GET and POST
|
|
72
|
-
if (mapping.method !== 'GET' && mapping.method !== 'POST') {
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
71
|
return {
|
|
76
72
|
method: mapping.method,
|
|
77
73
|
path: buildRestPath(namespace, mapping),
|
|
@@ -92,7 +88,8 @@ function generateRouteForProcedure(name, procedure, namespace) {
|
|
|
92
88
|
* 1. Extracts input from request (params, query, body)
|
|
93
89
|
* 2. Gets context from request decorator
|
|
94
90
|
* 3. Executes the procedure (validation, middleware, handler)
|
|
95
|
-
* 4.
|
|
91
|
+
* 4. Sets appropriate HTTP status code
|
|
92
|
+
* 5. Returns the result
|
|
96
93
|
*/
|
|
97
94
|
function createRouteHandler(route) {
|
|
98
95
|
return async (request, reply) => {
|
|
@@ -102,9 +99,22 @@ function createRouteHandler(route) {
|
|
|
102
99
|
const ctx = getContextFromRequest(request);
|
|
103
100
|
// Execute the procedure
|
|
104
101
|
const result = await executeProcedure(route.procedure, input, ctx);
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
102
|
+
// Set appropriate HTTP status codes based on method and result
|
|
103
|
+
switch (route.method) {
|
|
104
|
+
case 'POST':
|
|
105
|
+
// 201 Created for new resources
|
|
106
|
+
if (route.procedureName.startsWith('create') || route.procedureName.startsWith('add')) {
|
|
107
|
+
reply.status(201);
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
case 'DELETE':
|
|
111
|
+
// 204 No Content if result is null/undefined/empty, otherwise 200 OK
|
|
112
|
+
if (result === null || result === undefined) {
|
|
113
|
+
reply.status(204);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
// GET, PUT, PATCH default to 200 OK (Fastify default)
|
|
108
118
|
}
|
|
109
119
|
return result;
|
|
110
120
|
};
|
|
@@ -120,19 +130,29 @@ function isPlainObject(value) {
|
|
|
120
130
|
*
|
|
121
131
|
* - GET: Merge params and query
|
|
122
132
|
* - POST: Use body
|
|
133
|
+
* - PUT/PATCH: Merge params (for ID) and body (for data)
|
|
134
|
+
* - DELETE: Merge params and query (no body per REST conventions)
|
|
123
135
|
*/
|
|
124
136
|
function gatherInput(request, route) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
...query
|
|
132
|
-
|
|
137
|
+
const params = isPlainObject(request.params) ? request.params : {};
|
|
138
|
+
const query = isPlainObject(request.query) ? request.query : {};
|
|
139
|
+
const body = isPlainObject(request.body) ? request.body : {};
|
|
140
|
+
switch (route.method) {
|
|
141
|
+
case 'GET':
|
|
142
|
+
// GET: params (for :id) + query (for filters/pagination)
|
|
143
|
+
return { ...params, ...query };
|
|
144
|
+
case 'DELETE':
|
|
145
|
+
// DELETE: params (for :id) + query (for options), no body per REST conventions
|
|
146
|
+
return { ...params, ...query };
|
|
147
|
+
case 'PUT':
|
|
148
|
+
case 'PATCH':
|
|
149
|
+
// PUT/PATCH: params (for :id) + body (for data)
|
|
150
|
+
return { ...params, ...body };
|
|
151
|
+
case 'POST':
|
|
152
|
+
default:
|
|
153
|
+
// POST: body only (no ID in params for creates)
|
|
154
|
+
return request.body;
|
|
133
155
|
}
|
|
134
|
-
// POST, PUT, PATCH, DELETE: Use body
|
|
135
|
-
return request.body;
|
|
136
156
|
}
|
|
137
157
|
/**
|
|
138
158
|
* Extract context from Fastify request
|
|
@@ -203,10 +223,14 @@ export function registerRestRoutes(server, collections, options = {}) {
|
|
|
203
223
|
case 'POST':
|
|
204
224
|
server.post(fullPath, handler);
|
|
205
225
|
break;
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
226
|
+
case 'PUT':
|
|
227
|
+
server.put(fullPath, handler);
|
|
228
|
+
break;
|
|
229
|
+
case 'PATCH':
|
|
230
|
+
server.patch(fullPath, handler);
|
|
231
|
+
break;
|
|
232
|
+
case 'DELETE':
|
|
233
|
+
server.delete(fullPath, handler);
|
|
210
234
|
break;
|
|
211
235
|
}
|
|
212
236
|
}
|
|
@@ -246,18 +270,20 @@ export function getRouteSummary(collections, prefix = '/api') {
|
|
|
246
270
|
* @param options - Registration options
|
|
247
271
|
* @returns A function that registers routes on a Fastify instance
|
|
248
272
|
*
|
|
273
|
+
* @deprecated Use `rest()` instead. This alias will be removed in v0.9.
|
|
274
|
+
*
|
|
249
275
|
* @example
|
|
250
276
|
* ```typescript
|
|
251
|
-
* import {
|
|
252
|
-
* import {
|
|
277
|
+
* import { veloxApp } from '@veloxts/core';
|
|
278
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
253
279
|
*
|
|
254
280
|
* const users = defineProcedures('users', {
|
|
255
281
|
* listUsers: procedure().query(async () => []),
|
|
256
282
|
* });
|
|
257
283
|
*
|
|
258
|
-
* const app = await
|
|
284
|
+
* const app = await veloxApp();
|
|
259
285
|
*
|
|
260
|
-
* app.routes(
|
|
286
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
261
287
|
*
|
|
262
288
|
* await app.start();
|
|
263
289
|
* ```
|
|
@@ -267,4 +293,39 @@ export function createRoutesRegistrar(collections, options = {}) {
|
|
|
267
293
|
registerRestRoutes(server, collections, options);
|
|
268
294
|
};
|
|
269
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* Creates a routes registrar for REST endpoints (succinct API)
|
|
298
|
+
*
|
|
299
|
+
* This is the preferred way to register procedure collections as REST routes.
|
|
300
|
+
* Use with `app.routes()` for a fluent API experience.
|
|
301
|
+
*
|
|
302
|
+
* @param collections - Procedure collections to register as REST routes
|
|
303
|
+
* @param options - REST adapter options (prefix, validation, etc.)
|
|
304
|
+
* @returns A function that registers routes on a Fastify instance
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```typescript
|
|
308
|
+
* import { veloxApp } from '@veloxts/core';
|
|
309
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
310
|
+
*
|
|
311
|
+
* const users = defineProcedures('users', {
|
|
312
|
+
* listUsers: procedure().query(async () => []),
|
|
313
|
+
* createUser: procedure()
|
|
314
|
+
* .input(z.object({ name: z.string() }))
|
|
315
|
+
* .mutation(async ({ input }) => ({ id: '1', ...input })),
|
|
316
|
+
* });
|
|
317
|
+
*
|
|
318
|
+
* const app = await veloxApp();
|
|
319
|
+
*
|
|
320
|
+
* // Succinct registration
|
|
321
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
322
|
+
*
|
|
323
|
+
* await app.start();
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
export function rest(collections, options = {}) {
|
|
327
|
+
return (server) => {
|
|
328
|
+
registerRestRoutes(server, collections, options);
|
|
329
|
+
};
|
|
330
|
+
}
|
|
270
331
|
//# sourceMappingURL=adapter.js.map
|
package/dist/rest/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAoB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA8BnE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA+B;IAChE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAChC,IAAY,EACZ,SAA4B,EAC5B,SAAiB;IAEjB,uCAAuC;IACvC,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;QAExC,8CAA8C;QAC9C,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,aAAa,EAAE,IAAI;gBACnB,SAAS;aACV,CAAC;QACJ,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;gBAC5C,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC;gBAC3D,aAAa,EAAE,IAAI;gBACnB,SAAS;aACV,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,sCAAsC;IACtC,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,OAAO,EAAE,CAAC;QACZ
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/rest/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/rest/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @module rest
|
|
5
5
|
*/
|
|
6
6
|
export type { RestAdapterOptions, RestRoute } from './adapter.js';
|
|
7
|
-
export { createRoutesRegistrar, generateRestRoutes, getRouteSummary, registerRestRoutes, } from './adapter.js';
|
|
7
|
+
export { rest, createRoutesRegistrar, generateRestRoutes, getRouteSummary, registerRestRoutes, } from './adapter.js';
|
|
8
8
|
export type { RestMapping } from './naming.js';
|
|
9
9
|
export { buildRestPath, followsNamingConvention, inferResourceName, parseNamingConvention, } from './naming.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/rest/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAEL,IAAI,EAEJ,qBAAqB,EAErB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
|
package/dist/rest/index.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* @module rest
|
|
5
5
|
*/
|
|
6
6
|
// REST adapter - public API
|
|
7
|
-
export {
|
|
7
|
+
export {
|
|
8
|
+
// Succinct API (preferred)
|
|
9
|
+
rest,
|
|
10
|
+
// Legacy API (deprecated)
|
|
11
|
+
createRoutesRegistrar,
|
|
12
|
+
// Internal utilities
|
|
13
|
+
generateRestRoutes, getRouteSummary, registerRestRoutes, } from './adapter.js';
|
|
8
14
|
export { buildRestPath, followsNamingConvention, inferResourceName, parseNamingConvention, } from './naming.js';
|
|
9
15
|
//# sourceMappingURL=index.js.map
|
package/dist/rest/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,4BAA4B;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,4BAA4B;AAC5B,OAAO;AACL,2BAA2B;AAC3B,IAAI;AACJ,0BAA0B;AAC1B,qBAAqB;AACrB,qBAAqB;AACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/rest/naming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM7D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/rest/naming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM7D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAgHD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAoBhG;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAU7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQlE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAElF"}
|
package/dist/rest/naming.js
CHANGED
|
@@ -10,20 +10,21 @@
|
|
|
10
10
|
// Naming Patterns
|
|
11
11
|
// ============================================================================
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* REST naming patterns - Full verb support
|
|
14
14
|
*
|
|
15
15
|
* Pattern matching is done by prefix:
|
|
16
|
-
* - get<Resource> -> GET /:id
|
|
17
|
-
* - list<Resources> -> GET /
|
|
18
|
-
* - find<Resource> -> GET /
|
|
19
|
-
* - create<Resource> -> POST /
|
|
20
|
-
* - add<Resource> -> POST /
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* -
|
|
24
|
-
* - delete<Resource> -> DELETE /:id
|
|
16
|
+
* - get<Resource> -> GET /:id (single resource)
|
|
17
|
+
* - list<Resources> -> GET / (collection)
|
|
18
|
+
* - find<Resource> -> GET / (search/filter)
|
|
19
|
+
* - create<Resource> -> POST / (create new)
|
|
20
|
+
* - add<Resource> -> POST / (alias for create)
|
|
21
|
+
* - update<Resource> -> PUT /:id (full update)
|
|
22
|
+
* - edit<Resource> -> PUT /:id (alias for update)
|
|
23
|
+
* - patch<Resource> -> PATCH /:id (partial update)
|
|
24
|
+
* - delete<Resource> -> DELETE /:id (remove resource)
|
|
25
|
+
* - remove<Resource> -> DELETE /:id (alias for delete)
|
|
25
26
|
*/
|
|
26
|
-
const
|
|
27
|
+
const NAMING_PATTERNS = [
|
|
27
28
|
// GET with ID - single resource retrieval
|
|
28
29
|
{
|
|
29
30
|
pattern: /^get([A-Z][a-zA-Z]*)$/,
|
|
@@ -59,6 +60,41 @@ const MVP_NAMING_PATTERNS = [
|
|
|
59
60
|
hasIdParam: false,
|
|
60
61
|
procedureType: 'mutation',
|
|
61
62
|
},
|
|
63
|
+
// PUT - full update
|
|
64
|
+
{
|
|
65
|
+
pattern: /^update([A-Z][a-zA-Z]*)$/,
|
|
66
|
+
method: 'PUT',
|
|
67
|
+
hasIdParam: true,
|
|
68
|
+
procedureType: 'mutation',
|
|
69
|
+
},
|
|
70
|
+
// PUT - edit resource (alias)
|
|
71
|
+
{
|
|
72
|
+
pattern: /^edit([A-Z][a-zA-Z]*)$/,
|
|
73
|
+
method: 'PUT',
|
|
74
|
+
hasIdParam: true,
|
|
75
|
+
procedureType: 'mutation',
|
|
76
|
+
},
|
|
77
|
+
// PATCH - partial update
|
|
78
|
+
{
|
|
79
|
+
pattern: /^patch([A-Z][a-zA-Z]*)$/,
|
|
80
|
+
method: 'PATCH',
|
|
81
|
+
hasIdParam: true,
|
|
82
|
+
procedureType: 'mutation',
|
|
83
|
+
},
|
|
84
|
+
// DELETE - remove resource
|
|
85
|
+
{
|
|
86
|
+
pattern: /^delete([A-Z][a-zA-Z]*)$/,
|
|
87
|
+
method: 'DELETE',
|
|
88
|
+
hasIdParam: true,
|
|
89
|
+
procedureType: 'mutation',
|
|
90
|
+
},
|
|
91
|
+
// DELETE - remove resource (alias)
|
|
92
|
+
{
|
|
93
|
+
pattern: /^remove([A-Z][a-zA-Z]*)$/,
|
|
94
|
+
method: 'DELETE',
|
|
95
|
+
hasIdParam: true,
|
|
96
|
+
procedureType: 'mutation',
|
|
97
|
+
},
|
|
62
98
|
];
|
|
63
99
|
// ============================================================================
|
|
64
100
|
// Parsing Functions
|
|
@@ -86,7 +122,7 @@ const MVP_NAMING_PATTERNS = [
|
|
|
86
122
|
* ```
|
|
87
123
|
*/
|
|
88
124
|
export function parseNamingConvention(name, type) {
|
|
89
|
-
for (const pattern of
|
|
125
|
+
for (const pattern of NAMING_PATTERNS) {
|
|
90
126
|
// Check if procedure type matches
|
|
91
127
|
if (pattern.procedureType !== type) {
|
|
92
128
|
continue;
|
|
@@ -143,7 +179,7 @@ export function buildRestPath(namespace, mapping) {
|
|
|
143
179
|
* ```
|
|
144
180
|
*/
|
|
145
181
|
export function inferResourceName(name) {
|
|
146
|
-
for (const pattern of
|
|
182
|
+
for (const pattern of NAMING_PATTERNS) {
|
|
147
183
|
const match = pattern.pattern.exec(name);
|
|
148
184
|
if (match) {
|
|
149
185
|
return match[1];
|
package/dist/rest/naming.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/rest/naming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkCH,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/rest/naming.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veloxts/router",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Procedure definitions with tRPC and REST routing for VeloxTS framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,17 +14,18 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@trpc/server": "11.7.2",
|
|
16
16
|
"fastify": "5.6.2",
|
|
17
|
-
"@veloxts/core": "0.3.
|
|
18
|
-
"@veloxts/validation": "0.3.
|
|
17
|
+
"@veloxts/core": "0.3.4",
|
|
18
|
+
"@veloxts/validation": "0.3.4"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
+
"@vitest/coverage-v8": "4.0.15",
|
|
21
22
|
"typescript": "5.9.3",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
23
|
+
"vitest": "4.0.15",
|
|
24
|
+
"zod": "3.24.4"
|
|
24
25
|
},
|
|
25
26
|
"peerDependencies": {
|
|
26
|
-
"
|
|
27
|
-
"
|
|
27
|
+
"fastify": "^5.0.0",
|
|
28
|
+
"zod": "^3.24.0"
|
|
28
29
|
},
|
|
29
30
|
"peerDependenciesMeta": {
|
|
30
31
|
"zod": {
|