@stacksjs/bun-router 0.0.4 → 0.0.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/README.md +2 -2
- package/dist/auth.d.ts +134 -0
- package/dist/cache/lru-cache.d.ts +139 -0
- package/dist/cache/middleware-memoization.d.ts +151 -0
- package/dist/cache/route-cache-warmer.d.ts +161 -0
- package/dist/cache/sqlite-cache.d.ts +209 -0
- package/dist/cache/streaming-cache.d.ts +132 -0
- package/dist/chunk-jhsk5c5b.js +15758 -0
- package/dist/cli/colors.d.ts +15 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/middleware.d.ts +31 -0
- package/dist/cli/openapi.d.ts +17 -0
- package/dist/cli/router.d.ts +15 -0
- package/dist/cli/routes.d.ts +29 -0
- package/dist/cli/utils.d.ts +74 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -2
- package/dist/config.d.ts +7 -0
- package/dist/container/container.d.ts +273 -0
- package/dist/container/contextual-binding.d.ts +240 -0
- package/dist/container/decorators.d.ts +141 -0
- package/dist/container/service-provider.d.ts +285 -0
- package/dist/development/hot-reload.d.ts +187 -0
- package/dist/development/index.d.ts +167 -0
- package/dist/development/performance-profiler.d.ts +217 -0
- package/dist/development/route-debugger.d.ts +154 -0
- package/dist/development/route-inspector.d.ts +211 -0
- package/dist/development/typescript-utilities.d.ts +209 -0
- package/dist/docs.d.ts +11 -0
- package/dist/errors/circuit-breaker.d.ts +195 -0
- package/dist/errors/error-handler.d.ts +88 -0
- package/dist/errors/error-reporting.d.ts +144 -0
- package/dist/errors/exceptions.d.ts +184 -0
- package/dist/errors/graceful-degradation.d.ts +154 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/router-errors.d.ts +110 -0
- package/dist/file-serving/static-files.d.ts +143 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +320 -206
- package/dist/middleware/auth.d.ts +63 -0
- package/dist/middleware/content_security_policy.d.ts +53 -0
- package/dist/middleware/cors.d.ts +5 -0
- package/dist/middleware/csrf.d.ts +7 -0
- package/dist/middleware/ddos_protection.d.ts +39 -0
- package/dist/middleware/file_security.d.ts +26 -0
- package/dist/middleware/file_upload.d.ts +38 -0
- package/dist/middleware/helmet.d.ts +54 -0
- package/dist/middleware/index.d.ts +44 -0
- package/dist/middleware/input_validation.d.ts +45 -0
- package/dist/middleware/json_body.d.ts +4 -0
- package/dist/middleware/performance_alerting.d.ts +87 -0
- package/dist/middleware/performance_dashboard.d.ts +87 -0
- package/dist/middleware/performance_monitor.d.ts +209 -0
- package/dist/middleware/pipeline.d.ts +131 -0
- package/dist/middleware/rate_limit.d.ts +36 -0
- package/dist/middleware/request_id.d.ts +4 -0
- package/dist/middleware/request_signing.d.ts +153 -0
- package/dist/middleware/request_tracer.d.ts +72 -0
- package/dist/middleware/response_cache.d.ts +97 -0
- package/dist/middleware/security.d.ts +69 -0
- package/dist/middleware/security_suite.d.ts +46 -0
- package/dist/middleware/session.d.ts +23 -0
- package/dist/model-binding/index.d.ts +2 -0
- package/dist/model-binding/model-middleware.d.ts +118 -0
- package/dist/model-binding/model-registry.d.ts +164 -0
- package/dist/model-binding.d.ts +185 -0
- package/dist/model-resolver-factory.d.ts +31 -0
- package/dist/observability/correlation.d.ts +187 -0
- package/dist/observability/health-checks.d.ts +186 -0
- package/dist/observability/index.d.ts +60 -0
- package/dist/observability/integration.d.ts +147 -0
- package/dist/observability/metrics.d.ts +184 -0
- package/dist/observability/tracing.d.ts +187 -0
- package/dist/optimization/bun-utilities.d.ts +224 -0
- package/dist/query-builder-integration.d.ts +36 -0
- package/dist/request/context.d.ts +34 -0
- package/dist/request/enhanced-request.d.ts +213 -0
- package/dist/request/macros.d.ts +300 -0
- package/dist/response/macros.d.ts +245 -0
- package/dist/response/response-factory.d.ts +133 -0
- package/dist/router/api-routes.d.ts +5 -0
- package/dist/router/file-based-routing.d.ts +118 -0
- package/dist/router/file-streaming.d.ts +5 -0
- package/dist/router/fluent-router.d.ts +315 -0
- package/dist/router/fluent-routing.d.ts +271 -0
- package/dist/router/group-organization.d.ts +5 -0
- package/dist/router/handler-resolver.d.ts +24 -0
- package/dist/router/http-methods.d.ts +10 -0
- package/dist/router/index.d.ts +113 -0
- package/dist/router/middleware-groups.d.ts +94 -0
- package/dist/router/middleware-integration.d.ts +112 -0
- package/dist/router/middleware.d.ts +5 -0
- package/dist/router/model-binding.d.ts +5 -0
- package/dist/router/optimized-route-matching.d.ts +6 -0
- package/dist/router/route-building.d.ts +5 -0
- package/dist/router/route-compiler.d.ts +153 -0
- package/dist/router/route-matching.d.ts +5 -0
- package/dist/router/route-trie.d.ts +114 -0
- package/dist/router/router.d.ts +276 -0
- package/dist/router/server.d.ts +5 -0
- package/dist/router/validation-integration.d.ts +170 -0
- package/dist/router/view-rendering.d.ts +5 -0
- package/dist/router/websocket.d.ts +5 -0
- package/dist/routing/route-caching.d.ts +129 -0
- package/dist/routing/route-throttling.d.ts +150 -0
- package/dist/routing/subdomain-routing.d.ts +206 -0
- package/dist/session/database-store.d.ts +51 -0
- package/dist/session/file-store.d.ts +22 -0
- package/dist/session/index.d.ts +106 -0
- package/dist/session/memory-store.d.ts +21 -0
- package/dist/session/redis-store.d.ts +31 -0
- package/dist/streaming/index.d.ts +3 -0
- package/dist/streaming/sse-handler.d.ts +138 -0
- package/dist/streaming/stream-handler.d.ts +114 -0
- package/dist/testing/auth-testing.d.ts +156 -0
- package/dist/testing/file-upload-testing.d.ts +190 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/middleware-testing.d.ts +138 -0
- package/dist/testing/model-binding-testing.d.ts +186 -0
- package/dist/testing/performance-testing.d.ts +235 -0
- package/dist/testing/test-client.d.ts +117 -0
- package/dist/testing/test-request.d.ts +85 -0
- package/dist/testing/test-response.d.ts +90 -0
- package/dist/testing/types.d.ts +207 -0
- package/dist/testing/websocket-testing.d.ts +227 -0
- package/dist/types/controller-types.d.ts +208 -0
- package/dist/types/core.d.ts +543 -0
- package/dist/types/middleware-types.d.ts +227 -0
- package/dist/types/request-response-augmentation.d.ts +261 -0
- package/dist/types/route-inference.d.ts +168 -0
- package/dist/types.d.ts +1776 -0
- package/dist/url.d.ts +56 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/query-preservation.d.ts +48 -0
- package/dist/utils.d.ts +69 -0
- package/dist/validation/validator.d.ts +140 -0
- package/dist/websocket/clustering.d.ts +185 -0
- package/package.json +18 -4
- package/src/auth.ts +469 -0
- package/src/cache/lru-cache.ts +457 -0
- package/src/cache/middleware-memoization.ts +531 -0
- package/src/cache/route-cache-warmer.ts +486 -0
- package/src/cache/sqlite-cache.ts +783 -0
- package/src/cache/streaming-cache.ts +572 -0
- package/src/cli/colors.ts +29 -0
- package/src/cli/index.ts +287 -0
- package/src/cli/middleware.ts +291 -0
- package/src/cli/openapi.ts +407 -0
- package/src/cli/router.ts +188 -0
- package/src/cli/routes.ts +265 -0
- package/src/cli/utils.ts +531 -0
- package/src/cli.ts +5 -0
- package/src/config.ts +322 -0
- package/src/container/container.ts +740 -0
- package/src/container/contextual-binding.ts +603 -0
- package/src/container/decorators.ts +359 -0
- package/src/container/service-provider.ts +596 -0
- package/src/development/hot-reload.ts +673 -0
- package/src/development/index.ts +499 -0
- package/src/development/performance-profiler.ts +717 -0
- package/src/development/route-debugger.ts +527 -0
- package/src/development/route-inspector.ts +749 -0
- package/src/development/typescript-utilities.ts +678 -0
- package/src/docs.ts +397 -0
- package/src/errors/circuit-breaker.ts +732 -0
- package/src/errors/error-handler.ts +569 -0
- package/src/errors/error-reporting.ts +672 -0
- package/src/errors/exceptions.ts +536 -0
- package/src/errors/graceful-degradation.ts +621 -0
- package/src/errors/index.ts +21 -0
- package/src/errors/router-errors.ts +632 -0
- package/src/file-serving/static-files.ts +581 -0
- package/src/index.ts +14 -0
- package/src/middleware/auth.ts +219 -0
- package/src/middleware/content_security_policy.ts +215 -0
- package/src/middleware/cors.ts +74 -0
- package/src/middleware/csrf.ts +108 -0
- package/src/middleware/ddos_protection.ts +255 -0
- package/src/middleware/file_security.ts +191 -0
- package/src/middleware/file_upload.ts +264 -0
- package/src/middleware/helmet.ts +268 -0
- package/src/middleware/index.ts +117 -0
- package/src/middleware/input_validation.ts +449 -0
- package/src/middleware/json_body.ts +37 -0
- package/src/middleware/performance_alerting.ts +538 -0
- package/src/middleware/performance_dashboard.ts +661 -0
- package/src/middleware/performance_monitor.ts +943 -0
- package/src/middleware/pipeline.ts +489 -0
- package/src/middleware/rate_limit.ts +245 -0
- package/src/middleware/request_id.ts +36 -0
- package/src/middleware/request_signing.ts +636 -0
- package/src/middleware/request_tracer.ts +636 -0
- package/src/middleware/response_cache.ts +743 -0
- package/src/middleware/security.ts +482 -0
- package/src/middleware/security_suite.ts +257 -0
- package/src/middleware/session.ts +91 -0
- package/src/model-binding/index.ts +18 -0
- package/src/model-binding/model-middleware.ts +425 -0
- package/src/model-binding/model-registry.ts +550 -0
- package/src/model-binding.ts +370 -0
- package/src/model-resolver-factory.ts +106 -0
- package/src/observability/correlation.ts +691 -0
- package/src/observability/health-checks.ts +729 -0
- package/src/observability/index.ts +184 -0
- package/src/observability/integration.ts +548 -0
- package/src/observability/metrics.ts +753 -0
- package/src/observability/tracing.ts +638 -0
- package/src/optimization/bun-utilities.ts +778 -0
- package/src/query-builder-integration.ts +137 -0
- package/src/request/context.ts +62 -0
- package/src/request/enhanced-request.ts +857 -0
- package/src/request/macros.ts +688 -0
- package/src/response/macros.ts +612 -0
- package/src/response/response-factory.ts +588 -0
- package/src/router/api-routes.ts +243 -0
- package/src/router/file-based-routing.ts +670 -0
- package/src/router/file-streaming.ts +372 -0
- package/src/router/fluent-router.ts +927 -0
- package/src/router/fluent-routing.ts +797 -0
- package/src/router/group-organization.ts +213 -0
- package/src/router/handler-resolver.ts +291 -0
- package/src/router/http-methods.ts +377 -0
- package/src/router/index.ts +185 -0
- package/src/router/middleware-groups.ts +222 -0
- package/src/router/middleware-integration.ts +399 -0
- package/src/router/middleware.ts +231 -0
- package/src/router/model-binding.ts +215 -0
- package/src/router/optimized-route-matching.ts +253 -0
- package/src/router/route-building.ts +212 -0
- package/src/router/route-compiler.ts +702 -0
- package/src/router/route-matching.ts +349 -0
- package/src/router/route-trie.ts +464 -0
- package/src/router/router.ts +1508 -0
- package/src/router/server.ts +406 -0
- package/src/router/validation-integration.ts +443 -0
- package/src/router/view-rendering.ts +233 -0
- package/src/router/websocket.ts +100 -0
- package/src/routing/route-caching.ts +402 -0
- package/src/routing/route-throttling.ts +469 -0
- package/src/routing/subdomain-routing.ts +492 -0
- package/src/session/database-store.ts +109 -0
- package/src/session/file-store.ts +148 -0
- package/src/session/index.ts +244 -0
- package/src/session/memory-store.ts +88 -0
- package/src/session/redis-store.ts +93 -0
- package/src/streaming/index.ts +17 -0
- package/src/streaming/sse-handler.ts +482 -0
- package/src/streaming/stream-handler.ts +552 -0
- package/src/testing/auth-testing.ts +446 -0
- package/src/testing/file-upload-testing.ts +543 -0
- package/src/testing/index.ts +10 -0
- package/src/testing/middleware-testing.ts +322 -0
- package/src/testing/model-binding-testing.ts +645 -0
- package/src/testing/performance-testing.ts +738 -0
- package/src/testing/test-client.ts +310 -0
- package/src/testing/test-request.ts +315 -0
- package/src/testing/test-response.ts +332 -0
- package/src/testing/types.ts +224 -0
- package/src/testing/websocket-testing.ts +590 -0
- package/src/types/controller-types.ts +385 -0
- package/src/types/core.ts +683 -0
- package/src/types/middleware-types.ts +419 -0
- package/src/types/request-response-augmentation.ts +489 -0
- package/src/types/route-inference.ts +357 -0
- package/src/types.ts +2049 -0
- package/src/url.ts +126 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/query-preservation.ts +201 -0
- package/src/utils.ts +327 -0
- package/src/validation/validator.ts +685 -0
- package/src/websocket/clustering.ts +762 -0
- package/dist/chunk-cjdekj87.js +0 -25886
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { EnhancedRequest, MiddlewareHandler, NextFunction } from '../types';
|
|
2
|
+
import type { MiddlewareTestContext } from './types';
|
|
3
|
+
import { mock, spyOn } from 'bun:test';
|
|
4
|
+
/**
|
|
5
|
+
* Middleware testing utilities
|
|
6
|
+
*/
|
|
7
|
+
export declare class MiddlewareTester {
|
|
8
|
+
private middleware;
|
|
9
|
+
private context;
|
|
10
|
+
constructor(middleware: MiddlewareHandler);
|
|
11
|
+
private createContext;
|
|
12
|
+
/**
|
|
13
|
+
* Set up the test request
|
|
14
|
+
*/
|
|
15
|
+
withRequest(request: EnhancedRequest): MiddlewareTester;
|
|
16
|
+
/**
|
|
17
|
+
* Set up a custom next function
|
|
18
|
+
*/
|
|
19
|
+
withNext(nextFn: NextFunction): MiddlewareTester;
|
|
20
|
+
/**
|
|
21
|
+
* Set up an error context
|
|
22
|
+
*/
|
|
23
|
+
withError(error: Error): MiddlewareTester;
|
|
24
|
+
/**
|
|
25
|
+
* Execute the middleware and return the result
|
|
26
|
+
*/
|
|
27
|
+
execute(): Promise<Response | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Assert that next was called
|
|
30
|
+
*/
|
|
31
|
+
expectNextCalled(times?: number): MiddlewareTester;
|
|
32
|
+
/**
|
|
33
|
+
* Assert that next was not called
|
|
34
|
+
*/
|
|
35
|
+
expectNextNotCalled(): MiddlewareTester;
|
|
36
|
+
/**
|
|
37
|
+
* Assert that middleware threw an error
|
|
38
|
+
*/
|
|
39
|
+
expectError(errorMessage?: string): MiddlewareTester;
|
|
40
|
+
/**
|
|
41
|
+
* Get the test context
|
|
42
|
+
*/
|
|
43
|
+
getContext(): MiddlewareTestContext;
|
|
44
|
+
/**
|
|
45
|
+
* Reset the middleware tester
|
|
46
|
+
*/
|
|
47
|
+
reset(): MiddlewareTester;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a middleware tester
|
|
51
|
+
*/
|
|
52
|
+
export declare function testMiddleware(middleware: MiddlewareHandler): MiddlewareTester;
|
|
53
|
+
/**
|
|
54
|
+
* Mock middleware factory
|
|
55
|
+
*/
|
|
56
|
+
export declare const mockMiddleware: {
|
|
57
|
+
/**
|
|
58
|
+
* Create a middleware that always calls next
|
|
59
|
+
*/
|
|
60
|
+
passthrough: () => MiddlewareHandler;
|
|
61
|
+
/**
|
|
62
|
+
* Create a middleware that returns a response without calling next
|
|
63
|
+
*/
|
|
64
|
+
response: (status?: number, body?: any) => MiddlewareHandler;
|
|
65
|
+
/**
|
|
66
|
+
* Create a middleware that throws an error
|
|
67
|
+
*/
|
|
68
|
+
error: (message?: string) => MiddlewareHandler;
|
|
69
|
+
/**
|
|
70
|
+
* Create a middleware that modifies the request
|
|
71
|
+
*/
|
|
72
|
+
modifyRequest: (modifier: (req: EnhancedRequest) => void) => MiddlewareHandler;
|
|
73
|
+
/**
|
|
74
|
+
* Create a middleware that adds context
|
|
75
|
+
*/
|
|
76
|
+
addContext: (key: string, value: any) => MiddlewareHandler;
|
|
77
|
+
/**
|
|
78
|
+
* Create an authentication middleware mock
|
|
79
|
+
*/
|
|
80
|
+
auth: (user?: any) => MiddlewareHandler;
|
|
81
|
+
/**
|
|
82
|
+
* Create a rate limiting middleware mock
|
|
83
|
+
*/
|
|
84
|
+
rateLimit: (shouldLimit?: boolean) => MiddlewareHandler;
|
|
85
|
+
/**
|
|
86
|
+
* Create a CORS middleware mock
|
|
87
|
+
*/
|
|
88
|
+
cors: (origin?: string) => MiddlewareHandler;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Middleware chain tester
|
|
92
|
+
*/
|
|
93
|
+
export declare class MiddlewareChainTester {
|
|
94
|
+
private middlewares;
|
|
95
|
+
private request;
|
|
96
|
+
private finalHandler;
|
|
97
|
+
constructor(middlewares: MiddlewareHandler[]);
|
|
98
|
+
/**
|
|
99
|
+
* Set the request for the chain
|
|
100
|
+
*/
|
|
101
|
+
withRequest(request: EnhancedRequest): MiddlewareChainTester;
|
|
102
|
+
/**
|
|
103
|
+
* Set the final handler
|
|
104
|
+
*/
|
|
105
|
+
withFinalHandler(handler: () => Promise<Response>): MiddlewareChainTester;
|
|
106
|
+
/**
|
|
107
|
+
* Execute the middleware chain
|
|
108
|
+
*/
|
|
109
|
+
execute(): Promise<Response | null>;
|
|
110
|
+
/**
|
|
111
|
+
* Get execution order of middlewares
|
|
112
|
+
*/
|
|
113
|
+
getExecutionOrder(): number[];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a middleware chain tester
|
|
117
|
+
*/
|
|
118
|
+
export declare function testMiddlewareChain(middlewares: MiddlewareHandler[]): MiddlewareChainTester;
|
|
119
|
+
/**
|
|
120
|
+
* Spy on middleware execution
|
|
121
|
+
*/
|
|
122
|
+
export declare function spyOnMiddleware(middleware: MiddlewareHandler): ReturnType<typeof spyOn>;
|
|
123
|
+
/**
|
|
124
|
+
* Create a middleware spy that tracks calls
|
|
125
|
+
*/
|
|
126
|
+
export declare function createMiddlewareSpy(): {
|
|
127
|
+
middleware: MiddlewareHandler;
|
|
128
|
+
spy: ReturnType<typeof mock>;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Test middleware performance
|
|
132
|
+
*/
|
|
133
|
+
export declare function benchmarkMiddleware(middleware: MiddlewareHandler, iterations?: number): Promise<{
|
|
134
|
+
averageTime: number;
|
|
135
|
+
minTime: number;
|
|
136
|
+
maxTime: number;
|
|
137
|
+
totalTime: number;
|
|
138
|
+
}>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { EnhancedRequest } from '../types';
|
|
2
|
+
import type { ModelBindingTestOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Generic mock model base class for type annotations
|
|
5
|
+
*/
|
|
6
|
+
export declare class GenericMockModel {
|
|
7
|
+
id: any;
|
|
8
|
+
attributes: Record<string, any>;
|
|
9
|
+
constructor(data?: Record<string, any>);
|
|
10
|
+
static modelName: string;
|
|
11
|
+
static find(_id: any): Promise<GenericMockModel | null>;
|
|
12
|
+
static findOrFail(_id: any): Promise<GenericMockModel>;
|
|
13
|
+
static where(_conditions: Record<string, any>): Promise<GenericMockModel[]>;
|
|
14
|
+
static create(_data: Record<string, any>): Promise<GenericMockModel>;
|
|
15
|
+
save(): Promise<GenericMockModel>;
|
|
16
|
+
delete(): Promise<void>;
|
|
17
|
+
toJSON(): Record<string, any>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Mock User class for type annotations
|
|
21
|
+
*/
|
|
22
|
+
export declare class MockUserClass {
|
|
23
|
+
id: number;
|
|
24
|
+
email: string;
|
|
25
|
+
name: string;
|
|
26
|
+
constructor(data?: {
|
|
27
|
+
id: number;
|
|
28
|
+
email?: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
});
|
|
31
|
+
static find(_id: any): Promise<MockUserClass | null>;
|
|
32
|
+
static findOrFail(_id: any): Promise<MockUserClass>;
|
|
33
|
+
toJSON(): Record<string, any>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Mock Post class for type annotations
|
|
37
|
+
*/
|
|
38
|
+
export declare class MockPostClass {
|
|
39
|
+
id: number;
|
|
40
|
+
title: string;
|
|
41
|
+
content: string;
|
|
42
|
+
userId: number;
|
|
43
|
+
constructor(data?: {
|
|
44
|
+
id: number;
|
|
45
|
+
title?: string;
|
|
46
|
+
content?: string;
|
|
47
|
+
userId?: number;
|
|
48
|
+
});
|
|
49
|
+
static find(_id: any): Promise<MockPostClass | null>;
|
|
50
|
+
static findOrFail(_id: any): Promise<MockPostClass>;
|
|
51
|
+
belongsTo(_userId: number): Promise<boolean>;
|
|
52
|
+
toJSON(): Record<string, any>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Model binding testing utilities
|
|
56
|
+
*/
|
|
57
|
+
export declare class ModelBindingTester {
|
|
58
|
+
private request;
|
|
59
|
+
private options;
|
|
60
|
+
constructor(options?: ModelBindingTestOptions);
|
|
61
|
+
/**
|
|
62
|
+
* Set the request for testing
|
|
63
|
+
*/
|
|
64
|
+
withRequest(request: EnhancedRequest): ModelBindingTester;
|
|
65
|
+
/**
|
|
66
|
+
* Set route parameters
|
|
67
|
+
*/
|
|
68
|
+
withParams(params: Record<string, string>): ModelBindingTester;
|
|
69
|
+
/**
|
|
70
|
+
* Set the model class to test
|
|
71
|
+
*/
|
|
72
|
+
withModel(modelClass: any): ModelBindingTester;
|
|
73
|
+
/**
|
|
74
|
+
* Set the route key for model binding
|
|
75
|
+
*/
|
|
76
|
+
withRouteKey(routeKey: string): ModelBindingTester;
|
|
77
|
+
/**
|
|
78
|
+
* Set constraints for model binding
|
|
79
|
+
*/
|
|
80
|
+
withConstraints(constraints: Record<string, any>): ModelBindingTester;
|
|
81
|
+
/**
|
|
82
|
+
* Set a custom resolver function
|
|
83
|
+
*/
|
|
84
|
+
withResolver(resolver: (value: string) => Promise<any>): ModelBindingTester;
|
|
85
|
+
/**
|
|
86
|
+
* Test model resolution
|
|
87
|
+
*/
|
|
88
|
+
testResolution(paramValue: string): Promise<any>;
|
|
89
|
+
/**
|
|
90
|
+
* Test model not found scenario
|
|
91
|
+
*/
|
|
92
|
+
testNotFound(paramValue: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Get the configured request
|
|
95
|
+
*/
|
|
96
|
+
getRequest(): EnhancedRequest;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Mock model factories
|
|
100
|
+
*/
|
|
101
|
+
export declare const modelMocks: {
|
|
102
|
+
/**
|
|
103
|
+
* Create a mock model class
|
|
104
|
+
*/
|
|
105
|
+
createModel: (name: string, attributes?: Record<string, any>) => typeof GenericMockModel;
|
|
106
|
+
/**
|
|
107
|
+
* Create a User model mock
|
|
108
|
+
*/
|
|
109
|
+
User: typeof MockUserClass;
|
|
110
|
+
/**
|
|
111
|
+
* Create a Post model mock
|
|
112
|
+
*/
|
|
113
|
+
Post: typeof MockPostClass;
|
|
114
|
+
};
|
|
115
|
+
/** Model constraint function type */
|
|
116
|
+
export type ModelConstraintFn = (_model: any, _request: EnhancedRequest) => Promise<boolean>;
|
|
117
|
+
/** Simple model constraint function type (no request) */
|
|
118
|
+
export type SimpleModelConstraintFn = (_model: any) => Promise<boolean>;
|
|
119
|
+
/**
|
|
120
|
+
* Model binding constraint helpers
|
|
121
|
+
*/
|
|
122
|
+
export declare const constraintHelpers: {
|
|
123
|
+
belongsTo: (userIdField?: string) => ModelConstraintFn;
|
|
124
|
+
belongsToUser: () => ModelConstraintFn;
|
|
125
|
+
published: () => SimpleModelConstraintFn;
|
|
126
|
+
visible: () => SimpleModelConstraintFn;
|
|
127
|
+
custom: (constraintFn: ModelConstraintFn) => ModelConstraintFn;
|
|
128
|
+
combine: (...constraints: ModelConstraintFn[]) => ModelConstraintFn;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Model resolver factory for testing
|
|
132
|
+
*/
|
|
133
|
+
export declare class ModelResolverTester {
|
|
134
|
+
private resolvers;
|
|
135
|
+
/**
|
|
136
|
+
* Register a model resolver
|
|
137
|
+
*/
|
|
138
|
+
register(key: string, resolver: (value: string) => Promise<any>): ModelResolverTester;
|
|
139
|
+
/**
|
|
140
|
+
* Register a model class resolver
|
|
141
|
+
*/
|
|
142
|
+
registerModel(key: string, modelClass: any): ModelResolverTester;
|
|
143
|
+
/**
|
|
144
|
+
* Test model resolution
|
|
145
|
+
*/
|
|
146
|
+
resolve(key: string, value: string): Promise<any>;
|
|
147
|
+
/**
|
|
148
|
+
* Test all registered resolvers
|
|
149
|
+
*/
|
|
150
|
+
testAll(testValue?: string): Promise<Record<string, any>>;
|
|
151
|
+
/**
|
|
152
|
+
* Get all registered resolver keys
|
|
153
|
+
*/
|
|
154
|
+
getKeys(): string[];
|
|
155
|
+
/**
|
|
156
|
+
* Clear all resolvers
|
|
157
|
+
*/
|
|
158
|
+
clear(): ModelResolverTester;
|
|
159
|
+
}
|
|
160
|
+
/** Route handler function type */
|
|
161
|
+
export type RouteHandlerFn = (_request: EnhancedRequest) => Promise<Response>;
|
|
162
|
+
/** Binding middleware function type */
|
|
163
|
+
export type BindingMiddlewareFn = (request: EnhancedRequest, next: () => Promise<Response>) => Promise<Response>;
|
|
164
|
+
/**
|
|
165
|
+
* Route model binding test helpers
|
|
166
|
+
*/
|
|
167
|
+
export declare const routeModelHelpers: {
|
|
168
|
+
testRoute: (path: string, params: Record<string, string>, modelBindings: Record<string, any>) => Promise<EnhancedRequest>;
|
|
169
|
+
createHandler: (expectedModels: string[]) => RouteHandlerFn;
|
|
170
|
+
testBindingMiddleware: (bindings: Record<string, any>) => BindingMiddlewareFn;
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Factory functions
|
|
174
|
+
*/
|
|
175
|
+
export declare function createModelBindingTester(options?: ModelBindingTestOptions): ModelBindingTester;
|
|
176
|
+
export declare function createModelResolverTester(): ModelResolverTester;
|
|
177
|
+
/** User scope constraint function */
|
|
178
|
+
export type UserScopeConstraint = (_model: any, _user: any) => Promise<boolean>;
|
|
179
|
+
/**
|
|
180
|
+
* Test utilities for scoped model binding
|
|
181
|
+
*/
|
|
182
|
+
export declare const scopedBindingHelpers: {
|
|
183
|
+
testUserScoped: (model: any, user: any, constraint?: UserScopeConstraint) => Promise<boolean>;
|
|
184
|
+
testRoleAccess: (model: any, user: any, requiredRoles: string[]) => Promise<boolean>;
|
|
185
|
+
testPermissionAccess: (model: any, user: any, requiredPermissions: string[]) => Promise<boolean>;
|
|
186
|
+
};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import type { EnhancedRequest } from '../types';
|
|
2
|
+
import type { TestClient } from './test-client';
|
|
3
|
+
import type { LoadTestConfig, PerformanceMetrics } from './types';
|
|
4
|
+
/** Route handler benchmark result */
|
|
5
|
+
export interface RouteHandlerBenchmarkResult {
|
|
6
|
+
averageTime: number;
|
|
7
|
+
minTime: number;
|
|
8
|
+
maxTime: number;
|
|
9
|
+
totalTime: number;
|
|
10
|
+
throughput: number;
|
|
11
|
+
}
|
|
12
|
+
/** Middleware benchmark result */
|
|
13
|
+
export interface MiddlewareBenchmarkResult {
|
|
14
|
+
averageTime: number;
|
|
15
|
+
minTime: number;
|
|
16
|
+
maxTime: number;
|
|
17
|
+
totalTime: number;
|
|
18
|
+
}
|
|
19
|
+
/** JSON serialization benchmark result */
|
|
20
|
+
export interface JsonBenchmarkResult {
|
|
21
|
+
averageTime: number;
|
|
22
|
+
minTime: number;
|
|
23
|
+
maxTime: number;
|
|
24
|
+
totalTime: number;
|
|
25
|
+
dataSize: number;
|
|
26
|
+
}
|
|
27
|
+
/** URL parsing benchmark result */
|
|
28
|
+
export interface UrlParsingBenchmarkResult {
|
|
29
|
+
averageTime: number;
|
|
30
|
+
minTime: number;
|
|
31
|
+
maxTime: number;
|
|
32
|
+
totalTime: number;
|
|
33
|
+
}
|
|
34
|
+
/** Memory test result */
|
|
35
|
+
export interface MemoryTestResult {
|
|
36
|
+
heapUsedBefore: number;
|
|
37
|
+
heapUsedAfter: number;
|
|
38
|
+
heapUsedDelta: number;
|
|
39
|
+
rssBefore: number;
|
|
40
|
+
rssAfter: number;
|
|
41
|
+
rssDelta: number;
|
|
42
|
+
}
|
|
43
|
+
/** Memory usage result */
|
|
44
|
+
export interface MemoryUsageResult<T> {
|
|
45
|
+
averageHeapUsed: number;
|
|
46
|
+
maxHeapUsed: number;
|
|
47
|
+
memoryLeakDetected: boolean;
|
|
48
|
+
results: T[];
|
|
49
|
+
}
|
|
50
|
+
/** Route handler memory leak result */
|
|
51
|
+
export interface RouteHandlerMemoryLeakResult {
|
|
52
|
+
memoryLeakDetected: boolean;
|
|
53
|
+
initialMemory: number;
|
|
54
|
+
finalMemory: number;
|
|
55
|
+
memoryGrowth: number;
|
|
56
|
+
}
|
|
57
|
+
/** Ramp up test options */
|
|
58
|
+
export interface RampUpTestOptions {
|
|
59
|
+
startConcurrency: number;
|
|
60
|
+
endConcurrency: number;
|
|
61
|
+
rampUpTime: number;
|
|
62
|
+
testDuration: number;
|
|
63
|
+
}
|
|
64
|
+
/** Ramp up test result */
|
|
65
|
+
export interface RampUpTestResult {
|
|
66
|
+
concurrency: number;
|
|
67
|
+
requestsPerSecond: number;
|
|
68
|
+
averageResponseTime: number;
|
|
69
|
+
errorRate: number;
|
|
70
|
+
}
|
|
71
|
+
/** Spike test options */
|
|
72
|
+
export interface SpikeTestOptions {
|
|
73
|
+
normalLoad: number;
|
|
74
|
+
spikeLoad: number;
|
|
75
|
+
spikeDuration: number;
|
|
76
|
+
}
|
|
77
|
+
/** Spike test result */
|
|
78
|
+
export interface SpikeTestResult {
|
|
79
|
+
normalPhase: any;
|
|
80
|
+
spikePhase: any;
|
|
81
|
+
recoveryPhase: any;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Performance testing utilities
|
|
85
|
+
*/
|
|
86
|
+
export declare class PerformanceTester {
|
|
87
|
+
private metrics;
|
|
88
|
+
private startTime;
|
|
89
|
+
private endTime;
|
|
90
|
+
/**
|
|
91
|
+
* Start performance measurement
|
|
92
|
+
*/
|
|
93
|
+
start(): PerformanceTester;
|
|
94
|
+
/**
|
|
95
|
+
* End performance measurement
|
|
96
|
+
*/
|
|
97
|
+
end(): PerformanceTester;
|
|
98
|
+
/**
|
|
99
|
+
* Record a performance metric
|
|
100
|
+
*/
|
|
101
|
+
recordMetric(metric: PerformanceMetrics): PerformanceTester;
|
|
102
|
+
/**
|
|
103
|
+
* Get elapsed time
|
|
104
|
+
*/
|
|
105
|
+
getElapsedTime(): number;
|
|
106
|
+
/**
|
|
107
|
+
* Get all recorded metrics
|
|
108
|
+
*/
|
|
109
|
+
getMetrics(): PerformanceMetrics[];
|
|
110
|
+
/**
|
|
111
|
+
* Get average response time
|
|
112
|
+
*/
|
|
113
|
+
getAverageResponseTime(): number;
|
|
114
|
+
/**
|
|
115
|
+
* Get memory usage statistics
|
|
116
|
+
*/
|
|
117
|
+
getMemoryStats(): {
|
|
118
|
+
averageHeapUsed: number;
|
|
119
|
+
maxHeapUsed: number;
|
|
120
|
+
averageRSS: number;
|
|
121
|
+
maxRSS: number;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Clear all metrics
|
|
125
|
+
*/
|
|
126
|
+
clear(): PerformanceTester;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Load testing utilities
|
|
130
|
+
*/
|
|
131
|
+
export declare class LoadTester {
|
|
132
|
+
private client;
|
|
133
|
+
private config;
|
|
134
|
+
constructor(client: TestClient, config: LoadTestConfig);
|
|
135
|
+
/**
|
|
136
|
+
* Run load test
|
|
137
|
+
*/
|
|
138
|
+
run(path: string, method?: 'GET' | 'POST' | 'PUT' | 'DELETE', requestOptions?: any): Promise<{
|
|
139
|
+
totalRequests: number;
|
|
140
|
+
successfulRequests: number;
|
|
141
|
+
failedRequests: number;
|
|
142
|
+
averageResponseTime: number;
|
|
143
|
+
requestsPerSecond: number;
|
|
144
|
+
errors: Array<{
|
|
145
|
+
error: string;
|
|
146
|
+
count: number;
|
|
147
|
+
}>;
|
|
148
|
+
}>;
|
|
149
|
+
private makeRequest;
|
|
150
|
+
}
|
|
151
|
+
/** Route matching benchmark result */
|
|
152
|
+
export interface RouteMatchingBenchmarkResult {
|
|
153
|
+
averageTime: number;
|
|
154
|
+
minTime: number;
|
|
155
|
+
maxTime: number;
|
|
156
|
+
totalTime: number;
|
|
157
|
+
matchRate: number;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Benchmark testing utilities
|
|
161
|
+
*/
|
|
162
|
+
export declare const benchmarkTests: {
|
|
163
|
+
routeHandler: (handler: (req: EnhancedRequest) => Promise<Response>, iterations?: number) => Promise<RouteHandlerBenchmarkResult>;
|
|
164
|
+
middleware: (middleware: (req: EnhancedRequest, next: () => Promise<Response | null>) => Promise<Response | null>, iterations?: number) => Promise<MiddlewareBenchmarkResult>;
|
|
165
|
+
jsonSerialization: (data: any, iterations?: number) => Promise<JsonBenchmarkResult>;
|
|
166
|
+
routeMatching: (routes: Array<{
|
|
167
|
+
path: string;
|
|
168
|
+
handler: any;
|
|
169
|
+
}>, testPaths: string[], iterations?: number) => Promise<RouteMatchingBenchmarkResult>;
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* Memory testing utilities
|
|
173
|
+
*/
|
|
174
|
+
export declare const memoryTests: {
|
|
175
|
+
measureMemoryUsage: <T>(fn: () => Promise<T> | T, iterations?: number) => Promise<MemoryUsageResult<T>>;
|
|
176
|
+
testRouteHandlerMemoryLeaks: (handler: (req: EnhancedRequest) => Promise<Response>, iterations?: number) => Promise<RouteHandlerMemoryLeakResult>;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Stress testing utilities
|
|
180
|
+
*/
|
|
181
|
+
export declare const stressTests: {
|
|
182
|
+
rampUpTest: (client: TestClient, path: string, options: RampUpTestOptions) => Promise<RampUpTestResult[]>;
|
|
183
|
+
spikeTest: (client: TestClient, path: string, options: SpikeTestOptions) => Promise<SpikeTestResult>;
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Performance assertion helpers
|
|
187
|
+
*/
|
|
188
|
+
export declare const performanceAssertions: {
|
|
189
|
+
/**
|
|
190
|
+
* Assert response time is within acceptable range
|
|
191
|
+
*/
|
|
192
|
+
responseTimeWithin: (actualTime: number, maxTime: number) => void;
|
|
193
|
+
/**
|
|
194
|
+
* Assert throughput meets minimum requirements
|
|
195
|
+
*/
|
|
196
|
+
throughputAtLeast: (actualThroughput: number, minThroughput: number) => void;
|
|
197
|
+
/**
|
|
198
|
+
* Assert error rate is acceptable
|
|
199
|
+
*/
|
|
200
|
+
errorRateBelow: (errorRate: number, maxErrorRate: number) => void;
|
|
201
|
+
/**
|
|
202
|
+
* Assert memory usage is within limits
|
|
203
|
+
*/
|
|
204
|
+
memoryUsageWithin: (actualUsage: number, maxUsage: number) => void;
|
|
205
|
+
/**
|
|
206
|
+
* Assert no memory leaks detected
|
|
207
|
+
*/
|
|
208
|
+
noMemoryLeaks: (memoryGrowth: number, threshold?: number) => void;
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* Factory functions
|
|
212
|
+
*/
|
|
213
|
+
export declare function createPerformanceTester(): PerformanceTester;
|
|
214
|
+
export declare function createLoadTester(client: TestClient, config: LoadTestConfig): LoadTester;
|
|
215
|
+
/**
|
|
216
|
+
* Performance test utilities
|
|
217
|
+
*/
|
|
218
|
+
export declare const performanceUtils: {
|
|
219
|
+
/**
|
|
220
|
+
* Get current memory usage
|
|
221
|
+
*/
|
|
222
|
+
getCurrentMemoryUsage: () => PerformanceMetrics["memoryUsage"];
|
|
223
|
+
/**
|
|
224
|
+
* Get CPU usage
|
|
225
|
+
*/
|
|
226
|
+
getCPUUsage: () => PerformanceMetrics["cpuUsage"];
|
|
227
|
+
/**
|
|
228
|
+
* Create performance metric snapshot
|
|
229
|
+
*/
|
|
230
|
+
createMetricSnapshot: (responseTime: number) => PerformanceMetrics;
|
|
231
|
+
/**
|
|
232
|
+
* Format performance results for display
|
|
233
|
+
*/
|
|
234
|
+
formatResults: (results: any) => string;
|
|
235
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { Router } from '../router/router';
|
|
2
|
+
import type { TestResponseWrapper } from './test-response';
|
|
3
|
+
import type { TestClientConfig, TestRequestOptions } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Test client for making HTTP requests to router instances
|
|
6
|
+
*/
|
|
7
|
+
export declare class TestClient {
|
|
8
|
+
private router;
|
|
9
|
+
private config;
|
|
10
|
+
private defaultHeaders;
|
|
11
|
+
constructor(router: Router, config?: TestClientConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Make a GET request
|
|
14
|
+
*/
|
|
15
|
+
get(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
16
|
+
/**
|
|
17
|
+
* Make a POST request
|
|
18
|
+
*/
|
|
19
|
+
post(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
20
|
+
/**
|
|
21
|
+
* Make a PUT request
|
|
22
|
+
*/
|
|
23
|
+
put(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
24
|
+
/**
|
|
25
|
+
* Make a PATCH request
|
|
26
|
+
*/
|
|
27
|
+
patch(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
28
|
+
/**
|
|
29
|
+
* Make a DELETE request
|
|
30
|
+
*/
|
|
31
|
+
delete(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
32
|
+
/**
|
|
33
|
+
* Make an OPTIONS request
|
|
34
|
+
*/
|
|
35
|
+
options(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
36
|
+
/**
|
|
37
|
+
* Make a HEAD request
|
|
38
|
+
*/
|
|
39
|
+
head(path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
40
|
+
/**
|
|
41
|
+
* Make a request with custom method
|
|
42
|
+
*/
|
|
43
|
+
request(method: string, path: string, options?: TestRequestOptions): Promise<TestResponseWrapper>;
|
|
44
|
+
/**
|
|
45
|
+
* Handle request through the router
|
|
46
|
+
*/
|
|
47
|
+
private handleRequest;
|
|
48
|
+
/**
|
|
49
|
+
* Find matching route for the request
|
|
50
|
+
*/
|
|
51
|
+
private findMatchingRoute;
|
|
52
|
+
/**
|
|
53
|
+
* Simple path matching with parameter extraction
|
|
54
|
+
*/
|
|
55
|
+
private matchPath;
|
|
56
|
+
/**
|
|
57
|
+
* Execute middleware chain and route handler
|
|
58
|
+
*/
|
|
59
|
+
private executeMiddlewareChain;
|
|
60
|
+
/**
|
|
61
|
+
* Execute route handler
|
|
62
|
+
*/
|
|
63
|
+
private executeHandler;
|
|
64
|
+
/**
|
|
65
|
+
* Set default headers for all requests
|
|
66
|
+
*/
|
|
67
|
+
setDefaultHeaders(headers: Record<string, string>): TestClient;
|
|
68
|
+
/**
|
|
69
|
+
* Set authorization header for all requests
|
|
70
|
+
*/
|
|
71
|
+
auth(token: string, type?: 'Bearer' | 'Basic'): TestClient;
|
|
72
|
+
/**
|
|
73
|
+
* Set user agent for all requests
|
|
74
|
+
*/
|
|
75
|
+
userAgent(userAgent: string): TestClient;
|
|
76
|
+
/**
|
|
77
|
+
* Create a new test client with additional configuration
|
|
78
|
+
*/
|
|
79
|
+
withConfig(config: Partial<TestClientConfig>): TestClient;
|
|
80
|
+
/**
|
|
81
|
+
* Create a new test client with additional headers
|
|
82
|
+
*/
|
|
83
|
+
withHeaders(headers: Record<string, string>): TestClient;
|
|
84
|
+
/**
|
|
85
|
+
* Get the router instance
|
|
86
|
+
*/
|
|
87
|
+
getRouter(): Router;
|
|
88
|
+
/**
|
|
89
|
+
* Get client configuration
|
|
90
|
+
*/
|
|
91
|
+
getConfig(): TestClientConfig;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a test client for a router
|
|
95
|
+
*/
|
|
96
|
+
export declare function createTestClient(router: Router, config?: TestClientConfig): TestClient;
|
|
97
|
+
/**
|
|
98
|
+
* Test client factory with fluent API
|
|
99
|
+
*/
|
|
100
|
+
export declare const testClient: {
|
|
101
|
+
/**
|
|
102
|
+
* Create a test client for a router
|
|
103
|
+
*/
|
|
104
|
+
for: (router: Router, config?: TestClientConfig) => TestClient;
|
|
105
|
+
/**
|
|
106
|
+
* Create a test client with specific configuration
|
|
107
|
+
*/
|
|
108
|
+
withConfig: (config: TestClientConfig) => (router: Router) => TestClient;
|
|
109
|
+
/**
|
|
110
|
+
* Create a test client with authentication
|
|
111
|
+
*/
|
|
112
|
+
withAuth: (token: string, type?: "Bearer" | "Basic") => (router: Router) => TestClient;
|
|
113
|
+
/**
|
|
114
|
+
* Create a test client with custom headers
|
|
115
|
+
*/
|
|
116
|
+
withHeaders: (headers: Record<string, string>) => (router: Router) => TestClient;
|
|
117
|
+
};
|