@veloxts/router 0.3.4 → 0.3.6
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 +6 -5
- package/dist/index.js.map +1 -1
- package/dist/procedure/builder.d.ts.map +1 -1
- package/dist/procedure/builder.js +118 -4
- package/dist/procedure/builder.js.map +1 -1
- package/dist/procedure/types.d.ts +67 -1
- package/dist/procedure/types.d.ts.map +1 -1
- package/dist/rest/adapter.d.ts +74 -11
- package/dist/rest/adapter.d.ts.map +1 -1
- package/dist/rest/adapter.js +124 -22
- package/dist/rest/adapter.js.map +1 -1
- package/dist/rest/index.d.ts +3 -3
- package/dist/rest/index.d.ts.map +1 -1
- package/dist/rest/index.js +4 -4
- package/dist/rest/index.js.map +1 -1
- package/dist/rest/naming.d.ts +26 -1
- package/dist/rest/naming.d.ts.map +1 -1
- package/dist/rest/naming.js +36 -0
- package/dist/rest/naming.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 +79 -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, ParentResourceConfig, 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 {
|
|
49
|
+
export { buildNestedRestPath, 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,oBAAoB,EAEpB,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,mBAAmB,EACnB,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,6 +46,7 @@ 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
|
// ============================================================================
|
|
@@ -53,12 +54,12 @@ export {
|
|
|
53
54
|
// Builder functions
|
|
54
55
|
defineProcedures, executeProcedure, isCompiledProcedure, isProcedureCollection, procedure, } from './procedure/builder.js';
|
|
55
56
|
export {
|
|
56
|
-
// Succinct API (preferred)
|
|
57
|
-
rest,
|
|
58
|
-
// Legacy API (deprecated)
|
|
59
|
-
createRoutesRegistrar,
|
|
60
57
|
// Internal utilities
|
|
61
|
-
|
|
58
|
+
buildNestedRestPath, buildRestPath,
|
|
59
|
+
// Legacy API (deprecated)
|
|
60
|
+
createRoutesRegistrar, followsNamingConvention, generateRestRoutes, getRouteSummary, inferResourceName, parseNamingConvention, registerRestRoutes,
|
|
61
|
+
// Succinct API (preferred)
|
|
62
|
+
rest, } from './rest/index.js';
|
|
62
63
|
export {
|
|
63
64
|
// tRPC utilities
|
|
64
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;AAmC7E,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,mBAAmB,EACnB,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,EAIjB,mBAAmB,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,eAAe,EAEf,gBAAgB,EAChB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAyEpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAS3E;AA8ND;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,71 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module procedure/builder
|
|
9
9
|
*/
|
|
10
|
+
import { GuardError } from '../errors.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Utility Functions
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Derives the default parent parameter name from a namespace
|
|
16
|
+
*
|
|
17
|
+
* Converts a plural namespace to a singular form and appends 'Id'.
|
|
18
|
+
* Uses simple heuristics for common English pluralization patterns.
|
|
19
|
+
*
|
|
20
|
+
* @param namespace - The parent resource namespace (e.g., 'posts', 'users')
|
|
21
|
+
* @returns The parameter name (e.g., 'postId', 'userId')
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* deriveParentParamName('posts') // 'postId'
|
|
26
|
+
* deriveParentParamName('users') // 'userId'
|
|
27
|
+
* deriveParentParamName('categories') // 'categoryId'
|
|
28
|
+
* deriveParentParamName('data') // 'dataId' (no change for non-plural)
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
function deriveParentParamName(namespace) {
|
|
34
|
+
// Handle common irregular plurals
|
|
35
|
+
const irregulars = {
|
|
36
|
+
people: 'person',
|
|
37
|
+
children: 'child',
|
|
38
|
+
men: 'man',
|
|
39
|
+
women: 'woman',
|
|
40
|
+
mice: 'mouse',
|
|
41
|
+
geese: 'goose',
|
|
42
|
+
teeth: 'tooth',
|
|
43
|
+
feet: 'foot',
|
|
44
|
+
data: 'datum',
|
|
45
|
+
criteria: 'criterion',
|
|
46
|
+
phenomena: 'phenomenon',
|
|
47
|
+
};
|
|
48
|
+
const lower = namespace.toLowerCase();
|
|
49
|
+
if (irregulars[lower]) {
|
|
50
|
+
return `${irregulars[lower]}Id`;
|
|
51
|
+
}
|
|
52
|
+
// Handle common English pluralization patterns
|
|
53
|
+
let singular = namespace;
|
|
54
|
+
if (namespace.endsWith('ies') && namespace.length > 3) {
|
|
55
|
+
// categories -> category
|
|
56
|
+
singular = namespace.slice(0, -3) + 'y';
|
|
57
|
+
}
|
|
58
|
+
else if (namespace.endsWith('es') && namespace.length > 2) {
|
|
59
|
+
// Check for -shes, -ches, -xes, -zes, -sses patterns
|
|
60
|
+
const beforeEs = namespace.slice(-4, -2);
|
|
61
|
+
if (['sh', 'ch'].includes(beforeEs) || ['x', 'z', 's'].includes(namespace.slice(-3, -2))) {
|
|
62
|
+
singular = namespace.slice(0, -2);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// classes -> class (double s + es)
|
|
66
|
+
singular = namespace.slice(0, -1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (namespace.endsWith('s') && namespace.length > 1 && !namespace.endsWith('ss')) {
|
|
70
|
+
// Simple plural: users -> user, posts -> post
|
|
71
|
+
singular = namespace.slice(0, -1);
|
|
72
|
+
}
|
|
73
|
+
return `${singular}Id`;
|
|
74
|
+
}
|
|
10
75
|
// ============================================================================
|
|
11
76
|
// Builder Factory
|
|
12
77
|
// ============================================================================
|
|
@@ -36,7 +101,9 @@ export function procedure() {
|
|
|
36
101
|
inputSchema: undefined,
|
|
37
102
|
outputSchema: undefined,
|
|
38
103
|
middlewares: [],
|
|
104
|
+
guards: [],
|
|
39
105
|
restOverride: undefined,
|
|
106
|
+
parentResource: undefined,
|
|
40
107
|
});
|
|
41
108
|
}
|
|
42
109
|
// ============================================================================
|
|
@@ -85,6 +152,18 @@ function createBuilder(state) {
|
|
|
85
152
|
middlewares: [...state.middlewares, typedMiddleware],
|
|
86
153
|
});
|
|
87
154
|
},
|
|
155
|
+
/**
|
|
156
|
+
* Adds an authorization guard
|
|
157
|
+
*
|
|
158
|
+
* Accepts guards with partial context types (contravariant).
|
|
159
|
+
* Guards typed for `{ auth?: AuthContext }` work with full `BaseContext`.
|
|
160
|
+
*/
|
|
161
|
+
guard(guardDef) {
|
|
162
|
+
return createBuilder({
|
|
163
|
+
...state,
|
|
164
|
+
guards: [...state.guards, guardDef],
|
|
165
|
+
});
|
|
166
|
+
},
|
|
88
167
|
/**
|
|
89
168
|
* Sets REST route override
|
|
90
169
|
*/
|
|
@@ -94,6 +173,19 @@ function createBuilder(state) {
|
|
|
94
173
|
restOverride: config,
|
|
95
174
|
});
|
|
96
175
|
},
|
|
176
|
+
/**
|
|
177
|
+
* Declares a parent resource for nested routes
|
|
178
|
+
*/
|
|
179
|
+
parent(namespace, paramName) {
|
|
180
|
+
const parentConfig = {
|
|
181
|
+
namespace,
|
|
182
|
+
paramName: paramName ?? deriveParentParamName(namespace),
|
|
183
|
+
};
|
|
184
|
+
return createBuilder({
|
|
185
|
+
...state,
|
|
186
|
+
parentResource: parentConfig,
|
|
187
|
+
});
|
|
188
|
+
},
|
|
97
189
|
/**
|
|
98
190
|
* Finalizes as a query procedure
|
|
99
191
|
*/
|
|
@@ -131,7 +223,9 @@ function compileProcedure(type, handler, state) {
|
|
|
131
223
|
inputSchema: state.inputSchema,
|
|
132
224
|
outputSchema: state.outputSchema,
|
|
133
225
|
middlewares: typedMiddlewares,
|
|
226
|
+
guards: state.guards,
|
|
134
227
|
restOverride: state.restOverride,
|
|
228
|
+
parentResource: state.parentResource,
|
|
135
229
|
// Store pre-compiled executor for performance
|
|
136
230
|
_precompiledExecutor: precompiledExecutor,
|
|
137
231
|
};
|
|
@@ -252,11 +346,30 @@ export function defineProcedures(namespace, procedures) {
|
|
|
252
346
|
* ```
|
|
253
347
|
*/
|
|
254
348
|
export async function executeProcedure(procedure, rawInput, ctx) {
|
|
255
|
-
// Step 1:
|
|
349
|
+
// Step 1: Execute guards if any
|
|
350
|
+
if (procedure.guards.length > 0) {
|
|
351
|
+
// Defensive check: ensure request and reply exist in context
|
|
352
|
+
// These are required for guard execution but may be missing in test contexts
|
|
353
|
+
const request = ctx.request;
|
|
354
|
+
const reply = ctx.reply;
|
|
355
|
+
if (!request || !reply) {
|
|
356
|
+
throw new GuardError('context', 'Guard execution requires request and reply in context. ' +
|
|
357
|
+
'Ensure the procedure is being called from a valid HTTP context.', 500);
|
|
358
|
+
}
|
|
359
|
+
for (const guard of procedure.guards) {
|
|
360
|
+
const passed = await guard.check(ctx, request, reply);
|
|
361
|
+
if (!passed) {
|
|
362
|
+
const statusCode = guard.statusCode ?? 403;
|
|
363
|
+
const message = guard.message ?? `Guard "${guard.name}" check failed`;
|
|
364
|
+
throw new GuardError(guard.name, message, statusCode);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Step 2: Validate input if schema provided
|
|
256
369
|
const input = procedure.inputSchema
|
|
257
370
|
? procedure.inputSchema.parse(rawInput)
|
|
258
371
|
: rawInput;
|
|
259
|
-
// Step
|
|
372
|
+
// Step 3: Execute handler (with or without middleware)
|
|
260
373
|
let result;
|
|
261
374
|
if (procedure._precompiledExecutor) {
|
|
262
375
|
// PERFORMANCE: Use pre-compiled middleware chain executor
|
|
@@ -270,7 +383,7 @@ export async function executeProcedure(procedure, rawInput, ctx) {
|
|
|
270
383
|
// Fallback: Build middleware chain dynamically (should not normally happen)
|
|
271
384
|
result = await executeMiddlewareChainFallback(procedure.middlewares, input, ctx, async () => procedure.handler({ input, ctx }));
|
|
272
385
|
}
|
|
273
|
-
// Step
|
|
386
|
+
// Step 4: Validate output if schema provided
|
|
274
387
|
if (procedure.outputSchema) {
|
|
275
388
|
return procedure.outputSchema.parse(result);
|
|
276
389
|
}
|
|
@@ -324,7 +437,8 @@ export function isCompiledProcedure(value) {
|
|
|
324
437
|
const obj = value;
|
|
325
438
|
return ((obj.type === 'query' || obj.type === 'mutation') &&
|
|
326
439
|
typeof obj.handler === 'function' &&
|
|
327
|
-
Array.isArray(obj.middlewares)
|
|
440
|
+
Array.isArray(obj.middlewares) &&
|
|
441
|
+
Array.isArray(obj.guards));
|
|
328
442
|
}
|
|
329
443
|
/**
|
|
330
444
|
* 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, ParentResourceConfig, 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
|
*
|
|
@@ -153,6 +186,35 @@ export interface ProcedureBuilder<TInput = unknown, TOutput = unknown, TContext
|
|
|
153
186
|
* ```
|
|
154
187
|
*/
|
|
155
188
|
rest(config: RestRouteOverride): ProcedureBuilder<TInput, TOutput, TContext>;
|
|
189
|
+
/**
|
|
190
|
+
* Declares a parent resource for nested routes
|
|
191
|
+
*
|
|
192
|
+
* When a procedure has a parent resource, the REST path will be nested
|
|
193
|
+
* under the parent: `/${parentNamespace}/:${parentParam}/${childNamespace}/:id`
|
|
194
|
+
*
|
|
195
|
+
* The input schema should include the parent parameter (e.g., `postId`) for
|
|
196
|
+
* proper type safety and runtime validation.
|
|
197
|
+
*
|
|
198
|
+
* @param namespace - Parent resource namespace (e.g., 'posts', 'users')
|
|
199
|
+
* @param paramName - Optional custom parameter name (default: `${singularNamespace}Id`)
|
|
200
|
+
* @returns Same builder (no type changes)
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* // Generates: GET /posts/:postId/comments/:id
|
|
205
|
+
* const getComment = procedure()
|
|
206
|
+
* .parent('posts')
|
|
207
|
+
* .input(z.object({ postId: z.string(), id: z.string() }))
|
|
208
|
+
* .query(async ({ input }) => { ... });
|
|
209
|
+
*
|
|
210
|
+
* // With custom param name: GET /posts/:post_id/comments/:id
|
|
211
|
+
* const getComment = procedure()
|
|
212
|
+
* .parent('posts', 'post_id')
|
|
213
|
+
* .input(z.object({ post_id: z.string(), id: z.string() }))
|
|
214
|
+
* .query(async ({ input }) => { ... });
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
parent(namespace: string, paramName?: string): ProcedureBuilder<TInput, TOutput, TContext>;
|
|
156
218
|
/**
|
|
157
219
|
* Finalizes the procedure as a query (read-only operation)
|
|
158
220
|
*
|
|
@@ -205,8 +267,12 @@ export interface BuilderRuntimeState {
|
|
|
205
267
|
outputSchema?: ValidSchema;
|
|
206
268
|
/** Middleware chain */
|
|
207
269
|
middlewares: MiddlewareFunction<unknown, BaseContext, BaseContext, unknown>[];
|
|
270
|
+
/** Guards to execute before handler */
|
|
271
|
+
guards: GuardLike<unknown>[];
|
|
208
272
|
/** REST route override */
|
|
209
273
|
restOverride?: RestRouteOverride;
|
|
274
|
+
/** Parent resource configuration for nested routes */
|
|
275
|
+
parentResource?: ParentResourceConfig;
|
|
210
276
|
}
|
|
211
277
|
/**
|
|
212
278
|
* Type for the procedures object passed to defineProcedures
|
|
@@ -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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"}
|