@veloxts/router 0.3.3 → 0.3.5
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/dist/errors.d.ts +89 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +96 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/procedure/builder.d.ts.map +1 -1
- package/dist/procedure/builder.js +39 -4
- package/dist/procedure/builder.js.map +1 -1
- package/dist/procedure/types.d.ts +36 -1
- package/dist/procedure/types.d.ts.map +1 -1
- package/dist/rest/adapter.d.ts +103 -7
- package/dist/rest/adapter.d.ts.map +1 -1
- package/dist/rest/adapter.js +123 -9
- package/dist/rest/adapter.js.map +1 -1
- package/dist/rest/index.d.ts +2 -2
- 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/trpc/adapter.d.ts +1 -0
- package/dist/trpc/adapter.d.ts.map +1 -1
- package/dist/trpc/adapter.js +13 -0
- package/dist/trpc/adapter.js.map +1 -1
- package/dist/types.d.ts +37 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -2
- package/dist/types.js.map +1 -1
- package/package.json +17 -3
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for @veloxts/router
|
|
3
|
+
*
|
|
4
|
+
* Provides specialized error types for the routing system, including
|
|
5
|
+
* guard authorization failures.
|
|
6
|
+
*
|
|
7
|
+
* @module errors
|
|
8
|
+
*/
|
|
9
|
+
import { VeloxError } from '@veloxts/core';
|
|
10
|
+
/**
|
|
11
|
+
* Error codes specific to the router package
|
|
12
|
+
*/
|
|
13
|
+
export type RouterErrorCode = 'GUARD_FAILED' | 'UNAUTHORIZED' | 'FORBIDDEN';
|
|
14
|
+
/**
|
|
15
|
+
* Guard error response type for API responses
|
|
16
|
+
*/
|
|
17
|
+
export interface GuardErrorResponse {
|
|
18
|
+
error: 'GuardError';
|
|
19
|
+
message: string;
|
|
20
|
+
statusCode: number;
|
|
21
|
+
code: 'GUARD_FAILED';
|
|
22
|
+
guardName: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Error thrown when a guard check fails
|
|
26
|
+
*
|
|
27
|
+
* Used to signal authorization failures in a type-safe way without
|
|
28
|
+
* mutating error objects. Integrates with the VeloxTS error system
|
|
29
|
+
* and provides proper HTTP status codes.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // In guard execution
|
|
34
|
+
* if (!passed) {
|
|
35
|
+
* throw new GuardError('authenticated', 'Authentication required', 401);
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // In error handler
|
|
42
|
+
* if (isGuardError(error)) {
|
|
43
|
+
* reply.status(error.statusCode).send({
|
|
44
|
+
* error: 'GuardError',
|
|
45
|
+
* message: error.message,
|
|
46
|
+
* guardName: error.guardName,
|
|
47
|
+
* });
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class GuardError extends VeloxError<'GUARD_FAILED'> {
|
|
52
|
+
/**
|
|
53
|
+
* Name of the guard that failed
|
|
54
|
+
*/
|
|
55
|
+
readonly guardName: string;
|
|
56
|
+
/**
|
|
57
|
+
* Creates a new GuardError instance
|
|
58
|
+
*
|
|
59
|
+
* @param guardName - Name of the guard that failed (for debugging)
|
|
60
|
+
* @param message - Human-readable error message
|
|
61
|
+
* @param statusCode - HTTP status code (default: 403 Forbidden)
|
|
62
|
+
*/
|
|
63
|
+
constructor(guardName: string, message: string, statusCode?: number);
|
|
64
|
+
/**
|
|
65
|
+
* Converts guard error to JSON format for API responses
|
|
66
|
+
*
|
|
67
|
+
* @returns Guard error response with guard name
|
|
68
|
+
*/
|
|
69
|
+
toJSON(): GuardErrorResponse;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Type guard to check if an error is a GuardError
|
|
73
|
+
*
|
|
74
|
+
* @param error - Error to check
|
|
75
|
+
* @returns true if error is a GuardError instance
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* try {
|
|
80
|
+
* await executeProcedure(proc, input, ctx);
|
|
81
|
+
* } catch (error) {
|
|
82
|
+
* if (isGuardError(error)) {
|
|
83
|
+
* console.log(`Guard "${error.guardName}" failed:`, error.message);
|
|
84
|
+
* }
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function isGuardError(error: unknown): error is GuardError;
|
|
89
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,cAAc,GAAG,WAAW,CAAC;AAM5E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,UAAW,SAAQ,UAAU,CAAC,cAAc,CAAC;IACxD;;OAEG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC;;;;;;OAMG;gBACS,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY;IAWxE;;;;OAIG;IACM,MAAM,IAAI,kBAAkB;CAStC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for @veloxts/router
|
|
3
|
+
*
|
|
4
|
+
* Provides specialized error types for the routing system, including
|
|
5
|
+
* guard authorization failures.
|
|
6
|
+
*
|
|
7
|
+
* @module errors
|
|
8
|
+
*/
|
|
9
|
+
import { VeloxError } from '@veloxts/core';
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when a guard check fails
|
|
12
|
+
*
|
|
13
|
+
* Used to signal authorization failures in a type-safe way without
|
|
14
|
+
* mutating error objects. Integrates with the VeloxTS error system
|
|
15
|
+
* and provides proper HTTP status codes.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // In guard execution
|
|
20
|
+
* if (!passed) {
|
|
21
|
+
* throw new GuardError('authenticated', 'Authentication required', 401);
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // In error handler
|
|
28
|
+
* if (isGuardError(error)) {
|
|
29
|
+
* reply.status(error.statusCode).send({
|
|
30
|
+
* error: 'GuardError',
|
|
31
|
+
* message: error.message,
|
|
32
|
+
* guardName: error.guardName,
|
|
33
|
+
* });
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export class GuardError extends VeloxError {
|
|
38
|
+
/**
|
|
39
|
+
* Name of the guard that failed
|
|
40
|
+
*/
|
|
41
|
+
guardName;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new GuardError instance
|
|
44
|
+
*
|
|
45
|
+
* @param guardName - Name of the guard that failed (for debugging)
|
|
46
|
+
* @param message - Human-readable error message
|
|
47
|
+
* @param statusCode - HTTP status code (default: 403 Forbidden)
|
|
48
|
+
*/
|
|
49
|
+
constructor(guardName, message, statusCode = 403) {
|
|
50
|
+
super(message, statusCode, 'GUARD_FAILED');
|
|
51
|
+
this.name = 'GuardError';
|
|
52
|
+
this.guardName = guardName;
|
|
53
|
+
// Maintains proper stack trace for where error was thrown (V8 only)
|
|
54
|
+
if (Error.captureStackTrace) {
|
|
55
|
+
Error.captureStackTrace(this, GuardError);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Converts guard error to JSON format for API responses
|
|
60
|
+
*
|
|
61
|
+
* @returns Guard error response with guard name
|
|
62
|
+
*/
|
|
63
|
+
toJSON() {
|
|
64
|
+
return {
|
|
65
|
+
error: 'GuardError',
|
|
66
|
+
message: this.message,
|
|
67
|
+
statusCode: this.statusCode,
|
|
68
|
+
code: 'GUARD_FAILED',
|
|
69
|
+
guardName: this.guardName,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Type Guards
|
|
75
|
+
// ============================================================================
|
|
76
|
+
/**
|
|
77
|
+
* Type guard to check if an error is a GuardError
|
|
78
|
+
*
|
|
79
|
+
* @param error - Error to check
|
|
80
|
+
* @returns true if error is a GuardError instance
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* try {
|
|
85
|
+
* await executeProcedure(proc, input, ctx);
|
|
86
|
+
* } catch (error) {
|
|
87
|
+
* if (isGuardError(error)) {
|
|
88
|
+
* console.log(`Guard "${error.guardName}" failed:`, error.message);
|
|
89
|
+
* }
|
|
90
|
+
* }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export function isGuardError(error) {
|
|
94
|
+
return error instanceof GuardError;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA0B3C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,UAAW,SAAQ,UAA0B;IACxD;;OAEG;IACa,SAAS,CAAS;IAElC;;;;;;OAMG;IACH,YAAY,SAAiB,EAAE,OAAe,EAAE,aAAqB,GAAG;QACtE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,oEAAoE;QACpE,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACM,MAAM;QACb,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,UAAU,CAAC;AACrC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -39,12 +39,14 @@
|
|
|
39
39
|
*/
|
|
40
40
|
/** Router package version */
|
|
41
41
|
export declare const ROUTER_VERSION: string;
|
|
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
|
+
export type { CompiledProcedure, ContextExtensions, ContextFactory, ExtendedContext, GuardLike, HttpMethod, InferProcedureContext, InferProcedureInput, InferProcedureOutput, InferProcedureTypes, MiddlewareArgs, MiddlewareFunction, MiddlewareNext, MiddlewareResult, ProcedureCollection, ProcedureHandler, ProcedureHandlerArgs, ProcedureRecord, ProcedureType, RestRouteOverride, } from './types.js';
|
|
43
43
|
export { PROCEDURE_METHOD_MAP, } from './types.js';
|
|
44
|
+
export type { GuardErrorResponse, RouterErrorCode } from './errors.js';
|
|
45
|
+
export { GuardError, isGuardError } from './errors.js';
|
|
44
46
|
export { defineProcedures, executeProcedure, isCompiledProcedure, isProcedureCollection, procedure, } from './procedure/builder.js';
|
|
45
47
|
export type { BuilderRuntimeState, InferProcedures, InferSchemaOutput, ProcedureBuilder, ProcedureBuilderState, ProcedureDefinitions, ValidSchema, } from './procedure/types.js';
|
|
46
48
|
export type { RestAdapterOptions, RestMapping, RestRoute } from './rest/index.js';
|
|
47
|
-
export { buildRestPath, createRoutesRegistrar, followsNamingConvention, generateRestRoutes, getRouteSummary, inferResourceName, parseNamingConvention, registerRestRoutes, } from './rest/index.js';
|
|
49
|
+
export { buildRestPath, createRoutesRegistrar, followsNamingConvention, generateRestRoutes, getRouteSummary, inferResourceName, parseNamingConvention, registerRestRoutes, rest, } from './rest/index.js';
|
|
48
50
|
export type { AnyRouter, InferAppRouter, TRPCInstance, TRPCPluginOptions, } from './trpc/index.js';
|
|
49
51
|
export { buildTRPCRouter, createAppRouter, createTRPC, createTRPCContextFactory, registerTRPCPlugin, veloxErrorToTRPCError, } from './trpc/index.js';
|
|
50
52
|
//# 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;AAQH,6BAA6B;AAC7B,eAAO,MAAM,cAAc,EAAE,MAA+C,CAAC;AAO7E,YAAY,EAEV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,
|
|
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,EAEf,SAAS,EACT,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,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMvD,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,aAAa,EAEb,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAElB,IAAI,GACL,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
|
@@ -46,13 +46,20 @@ export const ROUTER_VERSION = packageJson.version ?? '0.0.0-unknown';
|
|
|
46
46
|
export {
|
|
47
47
|
// Constants
|
|
48
48
|
PROCEDURE_METHOD_MAP, } from './types.js';
|
|
49
|
+
export { GuardError, isGuardError } from './errors.js';
|
|
49
50
|
// ============================================================================
|
|
50
51
|
// Procedure Builder
|
|
51
52
|
// ============================================================================
|
|
52
53
|
export {
|
|
53
54
|
// Builder functions
|
|
54
55
|
defineProcedures, executeProcedure, isCompiledProcedure, isProcedureCollection, procedure, } from './procedure/builder.js';
|
|
55
|
-
export {
|
|
56
|
+
export {
|
|
57
|
+
// Internal utilities
|
|
58
|
+
buildRestPath,
|
|
59
|
+
// Legacy API (deprecated)
|
|
60
|
+
createRoutesRegistrar, followsNamingConvention, generateRestRoutes, getRouteSummary, inferResourceName, parseNamingConvention, registerRestRoutes,
|
|
61
|
+
// Succinct API (preferred)
|
|
62
|
+
rest, } from './rest/index.js';
|
|
56
63
|
export {
|
|
57
64
|
// tRPC utilities
|
|
58
65
|
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,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;
|
|
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;AAiC7E,OAAO;AACL,YAAY;AACZ,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvD,+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,qBAAqB;AACrB,aAAa;AACb,0BAA0B;AAC1B,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB;AAClB,2BAA2B;AAC3B,IAAI,GACL,MAAM,iBAAiB,CAAC;AAazB,OAAO;AACL,iBAAiB;AACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/procedure/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/procedure/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,KAAK,EACV,iBAAiB,EAGjB,mBAAmB,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,eAAe,EAEf,gBAAgB,EAChB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAQ3E;AA8MD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,SAAS,oBAAoB,EACvE,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,WAAW,GACtB,mBAAmB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAKnD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,SAAS,WAAW,EAClF,SAAS,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACvD,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,CAyDlB;AAkDD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAa9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAYlF"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module procedure/builder
|
|
9
9
|
*/
|
|
10
|
+
import { GuardError } from '../errors.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Builder Factory
|
|
12
13
|
// ============================================================================
|
|
@@ -36,6 +37,7 @@ export function procedure() {
|
|
|
36
37
|
inputSchema: undefined,
|
|
37
38
|
outputSchema: undefined,
|
|
38
39
|
middlewares: [],
|
|
40
|
+
guards: [],
|
|
39
41
|
restOverride: undefined,
|
|
40
42
|
});
|
|
41
43
|
}
|
|
@@ -85,6 +87,18 @@ function createBuilder(state) {
|
|
|
85
87
|
middlewares: [...state.middlewares, typedMiddleware],
|
|
86
88
|
});
|
|
87
89
|
},
|
|
90
|
+
/**
|
|
91
|
+
* Adds an authorization guard
|
|
92
|
+
*
|
|
93
|
+
* Accepts guards with partial context types (contravariant).
|
|
94
|
+
* Guards typed for `{ auth?: AuthContext }` work with full `BaseContext`.
|
|
95
|
+
*/
|
|
96
|
+
guard(guardDef) {
|
|
97
|
+
return createBuilder({
|
|
98
|
+
...state,
|
|
99
|
+
guards: [...state.guards, guardDef],
|
|
100
|
+
});
|
|
101
|
+
},
|
|
88
102
|
/**
|
|
89
103
|
* Sets REST route override
|
|
90
104
|
*/
|
|
@@ -131,6 +145,7 @@ function compileProcedure(type, handler, state) {
|
|
|
131
145
|
inputSchema: state.inputSchema,
|
|
132
146
|
outputSchema: state.outputSchema,
|
|
133
147
|
middlewares: typedMiddlewares,
|
|
148
|
+
guards: state.guards,
|
|
134
149
|
restOverride: state.restOverride,
|
|
135
150
|
// Store pre-compiled executor for performance
|
|
136
151
|
_precompiledExecutor: precompiledExecutor,
|
|
@@ -252,11 +267,30 @@ export function defineProcedures(namespace, procedures) {
|
|
|
252
267
|
* ```
|
|
253
268
|
*/
|
|
254
269
|
export async function executeProcedure(procedure, rawInput, ctx) {
|
|
255
|
-
// Step 1:
|
|
270
|
+
// Step 1: Execute guards if any
|
|
271
|
+
if (procedure.guards.length > 0) {
|
|
272
|
+
// Defensive check: ensure request and reply exist in context
|
|
273
|
+
// These are required for guard execution but may be missing in test contexts
|
|
274
|
+
const request = ctx.request;
|
|
275
|
+
const reply = ctx.reply;
|
|
276
|
+
if (!request || !reply) {
|
|
277
|
+
throw new GuardError('context', 'Guard execution requires request and reply in context. ' +
|
|
278
|
+
'Ensure the procedure is being called from a valid HTTP context.', 500);
|
|
279
|
+
}
|
|
280
|
+
for (const guard of procedure.guards) {
|
|
281
|
+
const passed = await guard.check(ctx, request, reply);
|
|
282
|
+
if (!passed) {
|
|
283
|
+
const statusCode = guard.statusCode ?? 403;
|
|
284
|
+
const message = guard.message ?? `Guard "${guard.name}" check failed`;
|
|
285
|
+
throw new GuardError(guard.name, message, statusCode);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Step 2: Validate input if schema provided
|
|
256
290
|
const input = procedure.inputSchema
|
|
257
291
|
? procedure.inputSchema.parse(rawInput)
|
|
258
292
|
: rawInput;
|
|
259
|
-
// Step
|
|
293
|
+
// Step 3: Execute handler (with or without middleware)
|
|
260
294
|
let result;
|
|
261
295
|
if (procedure._precompiledExecutor) {
|
|
262
296
|
// PERFORMANCE: Use pre-compiled middleware chain executor
|
|
@@ -270,7 +304,7 @@ export async function executeProcedure(procedure, rawInput, ctx) {
|
|
|
270
304
|
// Fallback: Build middleware chain dynamically (should not normally happen)
|
|
271
305
|
result = await executeMiddlewareChainFallback(procedure.middlewares, input, ctx, async () => procedure.handler({ input, ctx }));
|
|
272
306
|
}
|
|
273
|
-
// Step
|
|
307
|
+
// Step 4: Validate output if schema provided
|
|
274
308
|
if (procedure.outputSchema) {
|
|
275
309
|
return procedure.outputSchema.parse(result);
|
|
276
310
|
}
|
|
@@ -324,7 +358,8 @@ export function isCompiledProcedure(value) {
|
|
|
324
358
|
const obj = value;
|
|
325
359
|
return ((obj.type === 'query' || obj.type === 'mutation') &&
|
|
326
360
|
typeof obj.handler === 'function' &&
|
|
327
|
-
Array.isArray(obj.middlewares)
|
|
361
|
+
Array.isArray(obj.middlewares) &&
|
|
362
|
+
Array.isArray(obj.guards));
|
|
328
363
|
}
|
|
329
364
|
/**
|
|
330
365
|
* Type guard to check if a value is a procedure collection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/procedure/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/procedure/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { BaseContext } from '@veloxts/core';
|
|
13
13
|
import type { ZodType, ZodTypeDef } from 'zod';
|
|
14
|
-
import type { CompiledProcedure, MiddlewareFunction, ProcedureHandler, RestRouteOverride } from '../types.js';
|
|
14
|
+
import type { CompiledProcedure, GuardLike, MiddlewareFunction, ProcedureHandler, RestRouteOverride } from '../types.js';
|
|
15
15
|
/**
|
|
16
16
|
* Internal state type that accumulates type information through the builder chain
|
|
17
17
|
*
|
|
@@ -137,6 +137,39 @@ export interface ProcedureBuilder<TInput = unknown, TOutput = unknown, TContext
|
|
|
137
137
|
* ```
|
|
138
138
|
*/
|
|
139
139
|
use<TNewContext extends BaseContext = TContext>(middleware: MiddlewareFunction<TInput, TContext, TNewContext, TOutput>): ProcedureBuilder<TInput, TOutput, TNewContext>;
|
|
140
|
+
/**
|
|
141
|
+
* Adds an authorization guard to the procedure
|
|
142
|
+
*
|
|
143
|
+
* Guards are executed before the handler and middleware chain.
|
|
144
|
+
* If the guard check fails, a 401/403 error is returned.
|
|
145
|
+
*
|
|
146
|
+
* Guards are compatible with @veloxts/auth guards (authenticated, hasRole, etc.)
|
|
147
|
+
* but can be any object implementing the GuardLike interface.
|
|
148
|
+
*
|
|
149
|
+
* The guard type parameter accepts guards that require a subset of the current
|
|
150
|
+
* context (contravariant). This allows guards typed for `{ auth?: AuthContext }`
|
|
151
|
+
* to work with the full `BaseContext` since BaseContext extends that shape.
|
|
152
|
+
*
|
|
153
|
+
* @template TGuardContext - The context type required by the guard (must be a subset of TContext)
|
|
154
|
+
* @param guard - Guard definition to apply
|
|
155
|
+
* @returns Same builder (no type changes)
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* import { authenticated, hasRole } from '@veloxts/auth';
|
|
160
|
+
*
|
|
161
|
+
* // Require authentication
|
|
162
|
+
* procedure()
|
|
163
|
+
* .guard(authenticated)
|
|
164
|
+
* .query(async ({ ctx }) => { ... });
|
|
165
|
+
*
|
|
166
|
+
* // Require admin role
|
|
167
|
+
* procedure()
|
|
168
|
+
* .guard(hasRole('admin'))
|
|
169
|
+
* .mutation(async ({ input, ctx }) => { ... });
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
guard<TGuardContext extends Partial<TContext>>(guard: GuardLike<TGuardContext>): ProcedureBuilder<TInput, TOutput, TContext>;
|
|
140
173
|
/**
|
|
141
174
|
* Configures REST route override
|
|
142
175
|
*
|
|
@@ -205,6 +238,8 @@ export interface BuilderRuntimeState {
|
|
|
205
238
|
outputSchema?: ValidSchema;
|
|
206
239
|
/** Middleware chain */
|
|
207
240
|
middlewares: MiddlewareFunction<unknown, BaseContext, BaseContext, unknown>[];
|
|
241
|
+
/** Guards to execute before handler */
|
|
242
|
+
guards: GuardLike<unknown>[];
|
|
208
243
|
/** REST route override */
|
|
209
244
|
restOverride?: RestRouteOverride;
|
|
210
245
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/procedure/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/procedure/types.ts"],"names":[],"mappings":"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"}
|
package/dist/rest/adapter.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module rest/adapter
|
|
9
9
|
*/
|
|
10
|
-
import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
|
|
10
|
+
import type { FastifyInstance, FastifyPluginAsync, FastifyReply, FastifyRequest } from 'fastify';
|
|
11
11
|
import type { CompiledProcedure, HttpMethod, ProcedureCollection } from '../types.js';
|
|
12
12
|
/**
|
|
13
13
|
* REST route definition generated from a procedure
|
|
@@ -24,13 +24,35 @@ export interface RestRoute {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Options for REST route registration
|
|
27
|
+
*
|
|
28
|
+
* When using `server.register(rest(...), options)`, the `prefix` option is
|
|
29
|
+
* handled by Fastify's built-in prefix mechanism. When using the legacy
|
|
30
|
+
* `rest(...)(server)` pattern, the prefix is applied manually.
|
|
27
31
|
*/
|
|
28
32
|
export interface RestAdapterOptions {
|
|
29
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* API prefix for routes.
|
|
35
|
+
*
|
|
36
|
+
* - With `server.register()`: Use Fastify's built-in prefix option instead
|
|
37
|
+
* - With legacy `rest(...)(server)`: Prefix is applied manually (default: '/api')
|
|
38
|
+
*
|
|
39
|
+
* @default '/api' (legacy mode only)
|
|
40
|
+
*/
|
|
30
41
|
prefix?: string;
|
|
31
42
|
/** Custom error handler */
|
|
32
43
|
onError?: (error: unknown, request: FastifyRequest, reply: FastifyReply) => void;
|
|
33
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Internal options used during route registration
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
interface InternalRegistrationOptions extends RestAdapterOptions {
|
|
50
|
+
/**
|
|
51
|
+
* When true, the prefix is handled by Fastify's register() mechanism
|
|
52
|
+
* and should not be manually prepended to routes.
|
|
53
|
+
*/
|
|
54
|
+
_prefixHandledByFastify?: boolean;
|
|
55
|
+
}
|
|
34
56
|
/**
|
|
35
57
|
* Generate REST routes from a procedure collection
|
|
36
58
|
*
|
|
@@ -78,7 +100,7 @@ export declare function generateRestRoutes(collection: ProcedureCollection): Res
|
|
|
78
100
|
* // POST /api/users -> createUser
|
|
79
101
|
* ```
|
|
80
102
|
*/
|
|
81
|
-
export declare function registerRestRoutes(server: FastifyInstance, collections: ProcedureCollection[], options?:
|
|
103
|
+
export declare function registerRestRoutes(server: FastifyInstance, collections: ProcedureCollection[], options?: InternalRegistrationOptions): void;
|
|
82
104
|
/**
|
|
83
105
|
* Get a summary of routes that would be generated from collections
|
|
84
106
|
*
|
|
@@ -104,21 +126,95 @@ export declare function getRouteSummary(collections: ProcedureCollection[], pref
|
|
|
104
126
|
* @param options - Registration options
|
|
105
127
|
* @returns A function that registers routes on a Fastify instance
|
|
106
128
|
*
|
|
129
|
+
* @deprecated Use `rest()` instead. This alias will be removed in v0.9.
|
|
130
|
+
*
|
|
107
131
|
* @example
|
|
108
132
|
* ```typescript
|
|
109
|
-
* import {
|
|
110
|
-
* import {
|
|
133
|
+
* import { veloxApp } from '@veloxts/core';
|
|
134
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
111
135
|
*
|
|
112
136
|
* const users = defineProcedures('users', {
|
|
113
137
|
* listUsers: procedure().query(async () => []),
|
|
114
138
|
* });
|
|
115
139
|
*
|
|
116
|
-
* const app = await
|
|
140
|
+
* const app = await veloxApp();
|
|
117
141
|
*
|
|
118
|
-
* app.routes(
|
|
142
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
119
143
|
*
|
|
120
144
|
* await app.start();
|
|
121
145
|
* ```
|
|
122
146
|
*/
|
|
123
147
|
export declare function createRoutesRegistrar(collections: ProcedureCollection[], options?: RestAdapterOptions): (server: FastifyInstance) => void;
|
|
148
|
+
/**
|
|
149
|
+
* Legacy callable signature for backward compatibility.
|
|
150
|
+
* @deprecated Use `server.register(rest([...]), { prefix: '/api' })` instead.
|
|
151
|
+
*/
|
|
152
|
+
type LegacyRestCallable = (server: FastifyInstance) => void;
|
|
153
|
+
/**
|
|
154
|
+
* A callable Fastify plugin type that can be used both as:
|
|
155
|
+
* - A Fastify plugin: `server.register(rest([...]), { prefix: '/api' })`
|
|
156
|
+
* - A direct callable: `rest([...])(server)` or `app.routes(rest([...]))`
|
|
157
|
+
*
|
|
158
|
+
* This type represents a function that is both:
|
|
159
|
+
* 1. A FastifyPluginAsync (for server.register())
|
|
160
|
+
* 2. A callable that returns void (for legacy app.routes() usage)
|
|
161
|
+
*/
|
|
162
|
+
export type RestPlugin = FastifyPluginAsync<RestAdapterOptions> & LegacyRestCallable;
|
|
163
|
+
/**
|
|
164
|
+
* Creates a Fastify plugin for REST endpoints from procedure collections.
|
|
165
|
+
*
|
|
166
|
+
* This is the preferred way to register procedure collections as REST routes.
|
|
167
|
+
* The function returns a dual-mode plugin that works with both modern Fastify
|
|
168
|
+
* `register()` pattern and the legacy `app.routes()` pattern.
|
|
169
|
+
*
|
|
170
|
+
* @param collections - Procedure collections to register as REST routes
|
|
171
|
+
* @param defaultOptions - Default REST adapter options (can be overridden at registration)
|
|
172
|
+
* @returns A Fastify plugin that can be used with `server.register()` or called directly
|
|
173
|
+
*
|
|
174
|
+
* @example Modern API (recommended)
|
|
175
|
+
* ```typescript
|
|
176
|
+
* import Fastify from 'fastify';
|
|
177
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
178
|
+
*
|
|
179
|
+
* const users = defineProcedures('users', {
|
|
180
|
+
* listUsers: procedure().query(async () => []),
|
|
181
|
+
* createUser: procedure()
|
|
182
|
+
* .input(z.object({ name: z.string() }))
|
|
183
|
+
* .mutation(async ({ input }) => ({ id: '1', ...input })),
|
|
184
|
+
* });
|
|
185
|
+
*
|
|
186
|
+
* const server = Fastify();
|
|
187
|
+
*
|
|
188
|
+
* // Register with Fastify's built-in prefix handling
|
|
189
|
+
* await server.register(rest([users]), { prefix: '/api' });
|
|
190
|
+
*
|
|
191
|
+
* // Generates:
|
|
192
|
+
* // GET /api/users -> listUsers
|
|
193
|
+
* // POST /api/users -> createUser
|
|
194
|
+
* ```
|
|
195
|
+
*
|
|
196
|
+
* @example Legacy API (backward compatible)
|
|
197
|
+
* ```typescript
|
|
198
|
+
* import { veloxApp } from '@veloxts/core';
|
|
199
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
200
|
+
*
|
|
201
|
+
* const app = await veloxApp();
|
|
202
|
+
*
|
|
203
|
+
* // Legacy registration with manual prefix
|
|
204
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
205
|
+
*
|
|
206
|
+
* await app.start();
|
|
207
|
+
* ```
|
|
208
|
+
*
|
|
209
|
+
* @example Merging options
|
|
210
|
+
* ```typescript
|
|
211
|
+
* // Options passed to rest() are defaults
|
|
212
|
+
* const plugin = rest([users], { onError: customHandler });
|
|
213
|
+
*
|
|
214
|
+
* // Options passed to register() override/merge with defaults
|
|
215
|
+
* await server.register(plugin, { prefix: '/v1' });
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
export declare function rest(collections: ProcedureCollection[], defaultOptions?: RestAdapterOptions): RestPlugin;
|
|
219
|
+
export {};
|
|
124
220
|
//# 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;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGjG,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;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,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;AAED;;;GAGG;AACH,UAAU,2BAA4B,SAAQ,kBAAkB;IAC9D;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAAE,CAW/E;AA2LD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,GAAE,2BAAgC,GACxC,IAAI,CAgCN;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;;;GAGG;AACH,KAAK,kBAAkB,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,wBAAgB,IAAI,CAClB,WAAW,EAAE,mBAAmB,EAAE,EAClC,cAAc,GAAE,kBAAuB,GACtC,UAAU,CAsDZ"}
|
package/dist/rest/adapter.js
CHANGED
|
@@ -148,7 +148,6 @@ function gatherInput(request, route) {
|
|
|
148
148
|
case 'PATCH':
|
|
149
149
|
// PUT/PATCH: params (for :id) + body (for data)
|
|
150
150
|
return { ...params, ...body };
|
|
151
|
-
case 'POST':
|
|
152
151
|
default:
|
|
153
152
|
// POST: body only (no ID in params for creates)
|
|
154
153
|
return request.body;
|
|
@@ -158,7 +157,8 @@ function gatherInput(request, route) {
|
|
|
158
157
|
* Extract context from Fastify request
|
|
159
158
|
*
|
|
160
159
|
* The context is decorated onto the request by @veloxts/core's onRequest hook.
|
|
161
|
-
* This function expects the context to already be present
|
|
160
|
+
* This function expects the context to already be present and also merges
|
|
161
|
+
* any auth properties added by @veloxts/auth's preHandler hook.
|
|
162
162
|
*/
|
|
163
163
|
function getContextFromRequest(request) {
|
|
164
164
|
// Type assertion is safe because @veloxts/core decorates this in onRequest hook
|
|
@@ -168,7 +168,17 @@ function getContextFromRequest(request) {
|
|
|
168
168
|
if (!requestWithContext.context) {
|
|
169
169
|
throw new ConfigurationError('Request context not found. Ensure VeloxApp is started before registering routes.');
|
|
170
170
|
}
|
|
171
|
-
|
|
171
|
+
// Merge auth properties from request if @veloxts/auth has added them
|
|
172
|
+
// This allows guards to access ctx.auth and ctx.user
|
|
173
|
+
const context = requestWithContext.context;
|
|
174
|
+
if (requestWithContext.auth !== undefined || requestWithContext.user !== undefined) {
|
|
175
|
+
return {
|
|
176
|
+
...context,
|
|
177
|
+
auth: requestWithContext.auth,
|
|
178
|
+
user: requestWithContext.user,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return context;
|
|
172
182
|
}
|
|
173
183
|
// ============================================================================
|
|
174
184
|
// Route Registration
|
|
@@ -209,11 +219,13 @@ function getContextFromRequest(request) {
|
|
|
209
219
|
* ```
|
|
210
220
|
*/
|
|
211
221
|
export function registerRestRoutes(server, collections, options = {}) {
|
|
212
|
-
const { prefix = '/api' } = options;
|
|
222
|
+
const { prefix = '/api', _prefixHandledByFastify = false } = options;
|
|
213
223
|
for (const collection of collections) {
|
|
214
224
|
const routes = generateRestRoutes(collection);
|
|
215
225
|
for (const route of routes) {
|
|
216
|
-
|
|
226
|
+
// When used with server.register(), Fastify handles the prefix automatically.
|
|
227
|
+
// When used in legacy mode, we prepend the prefix manually.
|
|
228
|
+
const fullPath = _prefixHandledByFastify ? route.path : `${prefix}${route.path}`;
|
|
217
229
|
const handler = createRouteHandler(route);
|
|
218
230
|
// Register route based on method
|
|
219
231
|
switch (route.method) {
|
|
@@ -270,18 +282,20 @@ export function getRouteSummary(collections, prefix = '/api') {
|
|
|
270
282
|
* @param options - Registration options
|
|
271
283
|
* @returns A function that registers routes on a Fastify instance
|
|
272
284
|
*
|
|
285
|
+
* @deprecated Use `rest()` instead. This alias will be removed in v0.9.
|
|
286
|
+
*
|
|
273
287
|
* @example
|
|
274
288
|
* ```typescript
|
|
275
|
-
* import {
|
|
276
|
-
* import {
|
|
289
|
+
* import { veloxApp } from '@veloxts/core';
|
|
290
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
277
291
|
*
|
|
278
292
|
* const users = defineProcedures('users', {
|
|
279
293
|
* listUsers: procedure().query(async () => []),
|
|
280
294
|
* });
|
|
281
295
|
*
|
|
282
|
-
* const app = await
|
|
296
|
+
* const app = await veloxApp();
|
|
283
297
|
*
|
|
284
|
-
* app.routes(
|
|
298
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
285
299
|
*
|
|
286
300
|
* await app.start();
|
|
287
301
|
* ```
|
|
@@ -291,4 +305,104 @@ export function createRoutesRegistrar(collections, options = {}) {
|
|
|
291
305
|
registerRestRoutes(server, collections, options);
|
|
292
306
|
};
|
|
293
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Creates a Fastify plugin for REST endpoints from procedure collections.
|
|
310
|
+
*
|
|
311
|
+
* This is the preferred way to register procedure collections as REST routes.
|
|
312
|
+
* The function returns a dual-mode plugin that works with both modern Fastify
|
|
313
|
+
* `register()` pattern and the legacy `app.routes()` pattern.
|
|
314
|
+
*
|
|
315
|
+
* @param collections - Procedure collections to register as REST routes
|
|
316
|
+
* @param defaultOptions - Default REST adapter options (can be overridden at registration)
|
|
317
|
+
* @returns A Fastify plugin that can be used with `server.register()` or called directly
|
|
318
|
+
*
|
|
319
|
+
* @example Modern API (recommended)
|
|
320
|
+
* ```typescript
|
|
321
|
+
* import Fastify from 'fastify';
|
|
322
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
323
|
+
*
|
|
324
|
+
* const users = defineProcedures('users', {
|
|
325
|
+
* listUsers: procedure().query(async () => []),
|
|
326
|
+
* createUser: procedure()
|
|
327
|
+
* .input(z.object({ name: z.string() }))
|
|
328
|
+
* .mutation(async ({ input }) => ({ id: '1', ...input })),
|
|
329
|
+
* });
|
|
330
|
+
*
|
|
331
|
+
* const server = Fastify();
|
|
332
|
+
*
|
|
333
|
+
* // Register with Fastify's built-in prefix handling
|
|
334
|
+
* await server.register(rest([users]), { prefix: '/api' });
|
|
335
|
+
*
|
|
336
|
+
* // Generates:
|
|
337
|
+
* // GET /api/users -> listUsers
|
|
338
|
+
* // POST /api/users -> createUser
|
|
339
|
+
* ```
|
|
340
|
+
*
|
|
341
|
+
* @example Legacy API (backward compatible)
|
|
342
|
+
* ```typescript
|
|
343
|
+
* import { veloxApp } from '@veloxts/core';
|
|
344
|
+
* import { rest, defineProcedures, procedure } from '@veloxts/router';
|
|
345
|
+
*
|
|
346
|
+
* const app = await veloxApp();
|
|
347
|
+
*
|
|
348
|
+
* // Legacy registration with manual prefix
|
|
349
|
+
* app.routes(rest([users], { prefix: '/api' }));
|
|
350
|
+
*
|
|
351
|
+
* await app.start();
|
|
352
|
+
* ```
|
|
353
|
+
*
|
|
354
|
+
* @example Merging options
|
|
355
|
+
* ```typescript
|
|
356
|
+
* // Options passed to rest() are defaults
|
|
357
|
+
* const plugin = rest([users], { onError: customHandler });
|
|
358
|
+
*
|
|
359
|
+
* // Options passed to register() override/merge with defaults
|
|
360
|
+
* await server.register(plugin, { prefix: '/v1' });
|
|
361
|
+
* ```
|
|
362
|
+
*/
|
|
363
|
+
export function rest(collections, defaultOptions = {}) {
|
|
364
|
+
/**
|
|
365
|
+
* The async plugin function for Fastify's register() method.
|
|
366
|
+
* When used with register(), Fastify handles the prefix automatically.
|
|
367
|
+
*/
|
|
368
|
+
const plugin = async (instance, opts) => {
|
|
369
|
+
// Merge default options with options passed to register()
|
|
370
|
+
// Options from register() take precedence
|
|
371
|
+
const mergedOptions = {
|
|
372
|
+
...defaultOptions,
|
|
373
|
+
...opts,
|
|
374
|
+
// When used via register(), Fastify handles the prefix automatically
|
|
375
|
+
// We signal this to registerRestRoutes so it doesn't double-prefix
|
|
376
|
+
_prefixHandledByFastify: true,
|
|
377
|
+
};
|
|
378
|
+
registerRestRoutes(instance, collections, mergedOptions);
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* Create a callable wrapper that supports both patterns:
|
|
382
|
+
* 1. As a Fastify plugin: server.register(rest([...]), opts)
|
|
383
|
+
* 2. As a direct call: rest([...])(server) - legacy pattern
|
|
384
|
+
*
|
|
385
|
+
* The trick is that FastifyPluginAsync expects (instance, opts) => Promise<void>
|
|
386
|
+
* but the legacy pattern expects (server) => void.
|
|
387
|
+
*
|
|
388
|
+
* We detect which mode based on the second argument:
|
|
389
|
+
* - If second arg is undefined/missing: legacy callable mode
|
|
390
|
+
* - If second arg is present: Fastify plugin mode (called by register())
|
|
391
|
+
*/
|
|
392
|
+
const dualModePlugin = (instance, opts) => {
|
|
393
|
+
// If opts is provided, we're being called by Fastify's register()
|
|
394
|
+
// In this case, return the promise from the async plugin
|
|
395
|
+
if (opts !== undefined) {
|
|
396
|
+
return plugin(instance, opts);
|
|
397
|
+
}
|
|
398
|
+
// Legacy mode: called directly as rest([...])(server)
|
|
399
|
+
// Use default options and apply prefix manually
|
|
400
|
+
registerRestRoutes(instance, collections, defaultOptions);
|
|
401
|
+
};
|
|
402
|
+
// Cast to RestPlugin - TypeScript needs help understanding this dual nature
|
|
403
|
+
// The function satisfies both signatures:
|
|
404
|
+
// - (instance, opts) => Promise<void> for Fastify register
|
|
405
|
+
// - (server) => void for legacy callable
|
|
406
|
+
return dualModePlugin;
|
|
407
|
+
}
|
|
294
408
|
//# 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;
|
|
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
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module rest
|
|
5
5
|
*/
|
|
6
|
-
export type { RestAdapterOptions, RestRoute } from './adapter.js';
|
|
7
|
-
export { createRoutesRegistrar, generateRestRoutes, getRouteSummary, registerRestRoutes, } from './adapter.js';
|
|
6
|
+
export type { RestAdapterOptions, RestPlugin, RestRoute } from './adapter.js';
|
|
7
|
+
export { createRoutesRegistrar, generateRestRoutes, getRouteSummary, registerRestRoutes, rest, } 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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAEL,qBAAqB,EAErB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAElB,IAAI,GACL,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
|
+
// Legacy API (deprecated)
|
|
9
|
+
createRoutesRegistrar,
|
|
10
|
+
// Internal utilities
|
|
11
|
+
generateRestRoutes, getRouteSummary, registerRestRoutes,
|
|
12
|
+
// Succinct API (preferred)
|
|
13
|
+
rest, } 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,0BAA0B;AAC1B,qBAAqB;AACrB,qBAAqB;AACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB;AAClB,2BAA2B;AAC3B,IAAI,GACL,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
|
package/dist/trpc/adapter.d.ts
CHANGED
|
@@ -130,6 +130,7 @@ export declare function createTRPCContextFactory(): ({ req }: {
|
|
|
130
130
|
* Convert a VeloxTS error to a tRPC error
|
|
131
131
|
*
|
|
132
132
|
* Maps VeloxTS error codes to appropriate tRPC error codes.
|
|
133
|
+
* Handles GuardError specifically to preserve guard metadata.
|
|
133
134
|
*
|
|
134
135
|
* @param error - Error to convert
|
|
135
136
|
* @param defaultCode - Default tRPC code if mapping not found
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/trpc/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAY,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/trpc/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAY,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC;AAGtC,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQ1E,QAAA,MAAM,QAAQ;;;;;EAA2C,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,WAAW,GAAG,WAAW,IAAI,OAAO,QAAQ,CAAC;AAExF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAIzC;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,EAC5B,UAAU,EAAE,mBAAmB,GAC9B,SAAS,CAWX;AA2ID;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,EAC5B,WAAW,EAAE,mBAAmB,EAAE,GACjC,SAAS,CAQX;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC;AAMvC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,KAC9B,SAAS;IAAE,GAAG,EAAE;QAAE,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,CAAA;CAAE,KAAG,WAAW,CAWlE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACrD,WAAW,GAAE,SAAS,CAAC,MAAM,CAA2B,GACvD,SAAS,CAiCX;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAEzF;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
package/dist/trpc/adapter.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @module trpc/adapter
|
|
8
8
|
*/
|
|
9
9
|
import { initTRPC, TRPCError } from '@trpc/server';
|
|
10
|
+
import { isGuardError } from '../errors.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// tRPC Initialization
|
|
12
13
|
// ============================================================================
|
|
@@ -245,6 +246,7 @@ export function createTRPCContextFactory() {
|
|
|
245
246
|
* Convert a VeloxTS error to a tRPC error
|
|
246
247
|
*
|
|
247
248
|
* Maps VeloxTS error codes to appropriate tRPC error codes.
|
|
249
|
+
* Handles GuardError specifically to preserve guard metadata.
|
|
248
250
|
*
|
|
249
251
|
* @param error - Error to convert
|
|
250
252
|
* @param defaultCode - Default tRPC code if mapping not found
|
|
@@ -264,6 +266,17 @@ export function veloxErrorToTRPCError(error, defaultCode = 'INTERNAL_SERVER_ERRO
|
|
|
264
266
|
500: 'INTERNAL_SERVER_ERROR',
|
|
265
267
|
};
|
|
266
268
|
const trpcCode = error.statusCode ? (statusToTRPC[error.statusCode] ?? defaultCode) : defaultCode;
|
|
269
|
+
// Handle GuardError specifically to preserve guard metadata
|
|
270
|
+
if (isGuardError(error)) {
|
|
271
|
+
return new TRPCError({
|
|
272
|
+
code: trpcCode,
|
|
273
|
+
message: error.message,
|
|
274
|
+
cause: {
|
|
275
|
+
code: error.code,
|
|
276
|
+
guardName: error.guardName,
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
}
|
|
267
280
|
return new TRPCError({
|
|
268
281
|
code: trpcCode,
|
|
269
282
|
message: error.message,
|
package/dist/trpc/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/trpc/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/trpc/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -17,8 +17,7 @@ export type ProcedureType = 'query' | 'mutation';
|
|
|
17
17
|
/**
|
|
18
18
|
* HTTP methods supported by the REST adapter
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
* v1.1+: Full REST (GET, POST, PUT, PATCH, DELETE)
|
|
20
|
+
* Full REST support: GET, POST, PUT, PATCH, DELETE
|
|
22
21
|
*/
|
|
23
22
|
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
24
23
|
/**
|
|
@@ -28,8 +27,9 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
|
28
27
|
* - getUser -> GET
|
|
29
28
|
* - listUsers -> GET
|
|
30
29
|
* - createUser -> POST
|
|
31
|
-
* - updateUser -> PUT
|
|
32
|
-
* -
|
|
30
|
+
* - updateUser -> PUT
|
|
31
|
+
* - patchUser -> PATCH
|
|
32
|
+
* - deleteUser -> DELETE
|
|
33
33
|
*/
|
|
34
34
|
export declare const PROCEDURE_METHOD_MAP: Record<string, HttpMethod>;
|
|
35
35
|
/**
|
|
@@ -67,6 +67,37 @@ export interface ProcedureHandlerArgs<TInput, TContext extends BaseContext = Bas
|
|
|
67
67
|
* @template TContext - The context type
|
|
68
68
|
*/
|
|
69
69
|
export type ProcedureHandler<TInput, TOutput, TContext extends BaseContext = BaseContext> = (args: ProcedureHandlerArgs<TInput, TContext>) => TOutput | Promise<TOutput>;
|
|
70
|
+
/**
|
|
71
|
+
* Guard check function type
|
|
72
|
+
*
|
|
73
|
+
* The function receives the context, request, and reply objects.
|
|
74
|
+
* Request and reply are typed as `any` to enable compatibility with more
|
|
75
|
+
* specific types (like FastifyRequest/FastifyReply from @veloxts/auth).
|
|
76
|
+
*
|
|
77
|
+
* This design allows guards defined with specific Fastify types to be
|
|
78
|
+
* used interchangeably with guards that use generic types.
|
|
79
|
+
*
|
|
80
|
+
* @template TContext - The context type the guard operates on
|
|
81
|
+
*/
|
|
82
|
+
export type GuardCheckFunction<TContext = unknown> = (ctx: TContext, request: any, reply: any) => boolean | Promise<boolean>;
|
|
83
|
+
/**
|
|
84
|
+
* Guard-like type for authorization checks
|
|
85
|
+
*
|
|
86
|
+
* This interface is compatible with @veloxts/auth guards but doesn't create
|
|
87
|
+
* a hard dependency. Any object matching this shape can be used as a guard.
|
|
88
|
+
*
|
|
89
|
+
* @template TContext - The context type the guard operates on
|
|
90
|
+
*/
|
|
91
|
+
export interface GuardLike<TContext = unknown> {
|
|
92
|
+
/** Guard name for error messages */
|
|
93
|
+
name: string;
|
|
94
|
+
/** Guard check function - returns true if access is allowed */
|
|
95
|
+
check: GuardCheckFunction<TContext>;
|
|
96
|
+
/** Custom error message (optional) */
|
|
97
|
+
message?: string;
|
|
98
|
+
/** HTTP status code on failure (default: 403) */
|
|
99
|
+
statusCode?: number;
|
|
100
|
+
}
|
|
70
101
|
/**
|
|
71
102
|
* Result returned by the next() function in middleware
|
|
72
103
|
*
|
|
@@ -184,6 +215,8 @@ export interface CompiledProcedure<TInput = unknown, TOutput = unknown, TContext
|
|
|
184
215
|
};
|
|
185
216
|
/** Middleware chain to execute before handler */
|
|
186
217
|
readonly middlewares: ReadonlyArray<MiddlewareFunction<TInput, TContext, TContext, TOutput>>;
|
|
218
|
+
/** Guards to execute before handler (checked before middleware) */
|
|
219
|
+
readonly guards: ReadonlyArray<GuardLike<TContext>>;
|
|
187
220
|
/** REST route override (if specified) */
|
|
188
221
|
readonly restOverride?: RestRouteOverride;
|
|
189
222
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjD
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* - getUser -> GET
|
|
14
14
|
* - listUsers -> GET
|
|
15
15
|
* - createUser -> POST
|
|
16
|
-
* - updateUser -> PUT
|
|
17
|
-
* -
|
|
16
|
+
* - updateUser -> PUT
|
|
17
|
+
* - patchUser -> PATCH
|
|
18
|
+
* - deleteUser -> DELETE
|
|
18
19
|
*/
|
|
19
20
|
export const PROCEDURE_METHOD_MAP = {
|
|
20
21
|
get: 'GET',
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA+B;IAC9D,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IACX,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACR,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veloxts/router",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Procedure definitions with tRPC and REST routing for VeloxTS framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,11 +11,24 @@
|
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"tsd": {
|
|
15
|
+
"directory": "src/__type-tests__",
|
|
16
|
+
"compilerOptions": {
|
|
17
|
+
"paths": {
|
|
18
|
+
"@veloxts/core": [
|
|
19
|
+
"../core/dist"
|
|
20
|
+
],
|
|
21
|
+
"@veloxts/router": [
|
|
22
|
+
"dist"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
14
27
|
"dependencies": {
|
|
15
28
|
"@trpc/server": "11.7.2",
|
|
16
29
|
"fastify": "5.6.2",
|
|
17
|
-
"@veloxts/core": "0.3.
|
|
18
|
-
"@veloxts/validation": "0.3.
|
|
30
|
+
"@veloxts/core": "0.3.5",
|
|
31
|
+
"@veloxts/validation": "0.3.5"
|
|
19
32
|
},
|
|
20
33
|
"devDependencies": {
|
|
21
34
|
"@vitest/coverage-v8": "4.0.15",
|
|
@@ -60,6 +73,7 @@
|
|
|
60
73
|
"build": "tsc",
|
|
61
74
|
"dev": "tsc --watch",
|
|
62
75
|
"type-check": "tsc --noEmit",
|
|
76
|
+
"test:types": "tsd",
|
|
63
77
|
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
64
78
|
"test": "vitest run",
|
|
65
79
|
"test:watch": "vitest",
|