@stacksjs/bun-router 0.0.5 → 0.0.7
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/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/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 +1 -1
- 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 +375 -227
- 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 +3 -2
- 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 +1524 -0
- package/src/router/server.ts +429 -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/url.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Named-route URL generation
|
|
3
|
+
*
|
|
4
|
+
* A module-level registry of `name → path` populated by both `Router` and
|
|
5
|
+
* `FluentRouter` whenever a route is given a name. `url(name, params)`
|
|
6
|
+
* resolves a registered name into a URL with path parameters substituted
|
|
7
|
+
* and unmatched params appended as a query string.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Register a named-route path. Called by Router/FluentRouter when a route
|
|
11
|
+
* gets a `.name()`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerNamedRoute(name: string, path: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Look up a registered named-route path without parameter substitution.
|
|
16
|
+
* Mostly useful for tests and tooling.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getNamedRoutePath(name: string): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Returns a snapshot of every registered named-route. The map itself is not
|
|
21
|
+
* exposed so callers can't mutate the registry.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getNamedRoutes(): ReadonlyMap<string, string>;
|
|
24
|
+
/**
|
|
25
|
+
* Clear the registry. Provided for tests; production code should not need it.
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearNamedRoutes(): void;
|
|
28
|
+
export interface UrlOptions {
|
|
29
|
+
/**
|
|
30
|
+
* Return a fully-qualified URL using `process.env.APP_URL` (falling back to
|
|
31
|
+
* `http://localhost`) instead of a path. Defaults to `false`.
|
|
32
|
+
*/
|
|
33
|
+
absolute?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Override the base used for `absolute: true`. Wins over `APP_URL`.
|
|
36
|
+
*/
|
|
37
|
+
base?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate a URL for a named route.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* router.get('/users/{id}', handler).name('users.show')
|
|
45
|
+
*
|
|
46
|
+
* url('users.show', { id: 42 })
|
|
47
|
+
* // → '/users/42'
|
|
48
|
+
*
|
|
49
|
+
* url('users.show', { id: 42, tab: 'profile' })
|
|
50
|
+
* // → '/users/42?tab=profile'
|
|
51
|
+
*
|
|
52
|
+
* url('users.show', { id: 42 }, { absolute: true })
|
|
53
|
+
* // → 'https://app.example/users/42' (when APP_URL=https://app.example)
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function url(name: string, params?: Record<string, string | number | boolean>, options?: UrlOptions): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './query-preservation';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Parameter Preservation
|
|
3
|
+
*
|
|
4
|
+
* Automatically preserves specified query parameters across navigation.
|
|
5
|
+
* This is useful for maintaining state like siteId, theme, locale, etc.
|
|
6
|
+
*/
|
|
7
|
+
export interface QueryPreservationConfig {
|
|
8
|
+
/**
|
|
9
|
+
* Whether query preservation is enabled
|
|
10
|
+
* Default: true when preserve array is non-empty
|
|
11
|
+
*/
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Query parameters to preserve across navigation
|
|
15
|
+
* Example: ['siteId', 'theme', 'locale']
|
|
16
|
+
*/
|
|
17
|
+
preserve?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Query parameters to never preserve (takes precedence over preserve)
|
|
20
|
+
* Example: ['_t', 'utm_source']
|
|
21
|
+
*/
|
|
22
|
+
exclude?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* URL patterns where preservation should apply
|
|
25
|
+
* Default: all internal links (same origin)
|
|
26
|
+
* Example: ['/dashboard/*', '/admin/*']
|
|
27
|
+
*/
|
|
28
|
+
routes?: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Default configuration
|
|
32
|
+
*/
|
|
33
|
+
export declare const defaultQueryPreservationConfig: QueryPreservationConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Generate the client-side script for query preservation
|
|
36
|
+
* This script intercepts link clicks and preserves specified query params
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateQueryPreservationScript(config: QueryPreservationConfig): string;
|
|
39
|
+
/**
|
|
40
|
+
* Inject the query preservation script into HTML content
|
|
41
|
+
* Inserts before </head> or </body> if </head> not found
|
|
42
|
+
*/
|
|
43
|
+
export declare function injectQueryPreservationScript(html: string, config: QueryPreservationConfig): string;
|
|
44
|
+
/**
|
|
45
|
+
* Build a URL with preserved query parameters
|
|
46
|
+
* Server-side utility for generating links
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildUrlWithPreservedParams(path: string, currentUrl: string | URL, config: QueryPreservationConfig, additionalParams?: Record<string, string>): string;
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ActionHandler, ActionHandlerClass, RouteHandler } from './types';
|
|
2
|
+
export * from './utils/query-preservation';
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes a path by ensuring it starts with a forward slash and has no trailing slash
|
|
5
|
+
* @param path The path to normalize
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizePath(path: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a string path to an action path for dynamic imports
|
|
10
|
+
* @param path The path to convert (e.g., 'Actions/Home/IndexAction')
|
|
11
|
+
*/
|
|
12
|
+
export declare function toActionPath(path: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if a handler is a class constructor implementing ActionHandlerClass
|
|
15
|
+
* @param handler The handler to check
|
|
16
|
+
*/
|
|
17
|
+
export declare function isActionClass(handler: ActionHandler): handler is new () => ActionHandlerClass;
|
|
18
|
+
/**
|
|
19
|
+
* Checks if a handler is a route handler function
|
|
20
|
+
* @param handler The handler to check
|
|
21
|
+
*/
|
|
22
|
+
export declare function isRouteHandler(handler: ActionHandler): handler is RouteHandler;
|
|
23
|
+
/**
|
|
24
|
+
* Extracts named parameters from a path pattern
|
|
25
|
+
* @param pattern The path pattern (e.g., '/users/{id}/posts/{postId}')
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractParamNames(pattern: string): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Creates a regex pattern from a path pattern
|
|
30
|
+
* @param pattern The path pattern
|
|
31
|
+
*/
|
|
32
|
+
export declare function createPathRegex(pattern: string): RegExp;
|
|
33
|
+
/**
|
|
34
|
+
* Matches a path against a pattern and extracts parameters
|
|
35
|
+
* @param pattern The path pattern (e.g., '/users/{id}')
|
|
36
|
+
* @param path The actual path (e.g., '/users/123')
|
|
37
|
+
* @param params Output parameter object that will contain extracted parameters
|
|
38
|
+
* @param constraints Optional constraints for route parameters
|
|
39
|
+
* @returns Boolean indicating whether the path matches the pattern
|
|
40
|
+
*/
|
|
41
|
+
export declare function matchPath(pattern: string, path: string, params: Record<string, string>, constraints?: Record<string, string>): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Joins path segments ensuring proper formatting
|
|
44
|
+
* @param segments Path segments to join
|
|
45
|
+
*/
|
|
46
|
+
export declare function joinPaths(...segments: string[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Validates a route path format
|
|
49
|
+
* @param path The path to validate
|
|
50
|
+
*/
|
|
51
|
+
export declare function validatePath(path: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a file exists at the given path
|
|
54
|
+
* @param path The file path to check
|
|
55
|
+
*/
|
|
56
|
+
export declare function fileExists(path: string): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Resolve a view name to an actual file path
|
|
59
|
+
* @param viewName The view name (without extension)
|
|
60
|
+
* @param viewsPath The base path for views
|
|
61
|
+
* @param extensions File extensions to try
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveViewPath(viewName: string, viewsPath: string, extensions: string[]): Promise<string | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Basic HTML template processing - replaces {{ varName }} with the corresponding value
|
|
66
|
+
* @param template The HTML template string
|
|
67
|
+
* @param data The data to inject into the template
|
|
68
|
+
*/
|
|
69
|
+
export declare function processHtmlTemplate(template: string, data: Record<string, any>): string;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request/Response Enhancements - Validation System
|
|
3
|
+
*
|
|
4
|
+
* Laravel-style validation with custom rules and error handling
|
|
5
|
+
*/
|
|
6
|
+
import type { EnhancedRequest, NextFunction } from '../types';
|
|
7
|
+
export interface ValidationRule {
|
|
8
|
+
name: string;
|
|
9
|
+
validate: (value: any, parameters: string[], field: string, data: Record<string, any>) => Promise<boolean> | boolean;
|
|
10
|
+
message: string | ((_field: string, _parameters: string[]) => string);
|
|
11
|
+
}
|
|
12
|
+
export interface ValidationRules {
|
|
13
|
+
[field: string]: string | ValidationRule[];
|
|
14
|
+
}
|
|
15
|
+
export interface ValidationErrors {
|
|
16
|
+
[field: string]: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface ValidatorConfig {
|
|
19
|
+
stopOnFirstFailure?: boolean;
|
|
20
|
+
customMessages?: Record<string, string>;
|
|
21
|
+
customAttributes?: Record<string, string>;
|
|
22
|
+
bail?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Built-in validation rules
|
|
26
|
+
*/
|
|
27
|
+
export declare const BuiltInRules: Record<string, ValidationRule>;
|
|
28
|
+
/**
|
|
29
|
+
* Database validation rules (require external implementation)
|
|
30
|
+
*/
|
|
31
|
+
export declare const DatabaseRules: Record<string, ValidationRule>;
|
|
32
|
+
/**
|
|
33
|
+
* Main validator class
|
|
34
|
+
*/
|
|
35
|
+
export declare class Validator {
|
|
36
|
+
private rules;
|
|
37
|
+
private config;
|
|
38
|
+
constructor(config?: ValidatorConfig);
|
|
39
|
+
/**
|
|
40
|
+
* Register validation rules
|
|
41
|
+
*/
|
|
42
|
+
registerRule(rule: ValidationRule): void;
|
|
43
|
+
/**
|
|
44
|
+
* Register multiple validation rules
|
|
45
|
+
*/
|
|
46
|
+
registerRules(rules: Record<string, ValidationRule>): void;
|
|
47
|
+
/**
|
|
48
|
+
* Parse validation rule string
|
|
49
|
+
*/
|
|
50
|
+
private parseRuleString;
|
|
51
|
+
/**
|
|
52
|
+
* Validate data against rules
|
|
53
|
+
*/
|
|
54
|
+
validate(data: Record<string, any>, rules: ValidationRules): Promise<ValidationErrors>;
|
|
55
|
+
/**
|
|
56
|
+
* Validate and throw exception if validation fails
|
|
57
|
+
*/
|
|
58
|
+
validateOrFail(data: Record<string, any>, rules: ValidationRules): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get nested value from object using dot notation
|
|
61
|
+
*/
|
|
62
|
+
private getNestedValue;
|
|
63
|
+
/**
|
|
64
|
+
* Format error message
|
|
65
|
+
*/
|
|
66
|
+
private formatErrorMessage;
|
|
67
|
+
/**
|
|
68
|
+
* Replace placeholders in error messages
|
|
69
|
+
*/
|
|
70
|
+
private replacePlaceholders;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Global validator instance
|
|
74
|
+
*/
|
|
75
|
+
export declare const globalValidator: Validator;
|
|
76
|
+
/**
|
|
77
|
+
* Validation middleware factory
|
|
78
|
+
*/
|
|
79
|
+
export declare function createValidationMiddleware(rules: ValidationRules, config?: ValidatorConfig): (req: EnhancedRequest, next: NextFunction) => Promise<Response | null>;
|
|
80
|
+
/**
|
|
81
|
+
* Validation rule builder for fluent API
|
|
82
|
+
*/
|
|
83
|
+
export declare class ValidationRuleBuilder {
|
|
84
|
+
private rules;
|
|
85
|
+
required(): this;
|
|
86
|
+
string(): this;
|
|
87
|
+
number(): this;
|
|
88
|
+
integer(): this;
|
|
89
|
+
boolean(): this;
|
|
90
|
+
email(): this;
|
|
91
|
+
url(): this;
|
|
92
|
+
min(value: number): this;
|
|
93
|
+
max(value: number): this;
|
|
94
|
+
between(min: number, max: number): this;
|
|
95
|
+
in(...values: string[]): this;
|
|
96
|
+
notIn(...values: string[]): this;
|
|
97
|
+
regex(pattern: string): this;
|
|
98
|
+
alpha(): this;
|
|
99
|
+
alphaNum(): this;
|
|
100
|
+
alphaDash(): this;
|
|
101
|
+
date(): this;
|
|
102
|
+
after(date: string): this;
|
|
103
|
+
before(date: string): this;
|
|
104
|
+
confirmed(field?: string): this;
|
|
105
|
+
same(field: string): this;
|
|
106
|
+
different(field: string): this;
|
|
107
|
+
json(): this;
|
|
108
|
+
uuid(): this;
|
|
109
|
+
array(): this;
|
|
110
|
+
object(): this;
|
|
111
|
+
unique(table: string, column?: string): this;
|
|
112
|
+
exists(table: string, column?: string): this;
|
|
113
|
+
custom(ruleName: string, ...parameters: string[]): this;
|
|
114
|
+
build(): string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Factory function to create validation rule builder
|
|
118
|
+
*/
|
|
119
|
+
export declare function rule(): ValidationRuleBuilder;
|
|
120
|
+
/**
|
|
121
|
+
* Validation helper functions
|
|
122
|
+
*/
|
|
123
|
+
export declare const ValidationHelpers: {
|
|
124
|
+
/**
|
|
125
|
+
* Create validation rules object
|
|
126
|
+
*/
|
|
127
|
+
rules(rules: Record<string, string | ValidationRuleBuilder>): ValidationRules;
|
|
128
|
+
/**
|
|
129
|
+
* Validate single value
|
|
130
|
+
*/
|
|
131
|
+
validateValue(value: any, rules: string, field?: string): Promise<string[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Check if value passes validation
|
|
134
|
+
*/
|
|
135
|
+
passes(value: any, rules: string): Promise<boolean>;
|
|
136
|
+
/**
|
|
137
|
+
* Check if value fails validation
|
|
138
|
+
*/
|
|
139
|
+
fails(value: any, rules: string): Promise<boolean>;
|
|
140
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Clustering
|
|
3
|
+
*
|
|
4
|
+
* Native WebSocket clustering across workers with high-performance optimizations
|
|
5
|
+
*/
|
|
6
|
+
import type { ServerWebSocket } from 'bun';
|
|
7
|
+
import type { Buffer } from 'node:buffer';
|
|
8
|
+
export interface WebSocketClusterConfig {
|
|
9
|
+
workers?: number;
|
|
10
|
+
maxConnections?: number;
|
|
11
|
+
heartbeatInterval?: number;
|
|
12
|
+
compression?: boolean;
|
|
13
|
+
backpressureLimit?: number;
|
|
14
|
+
closeOnBackpressureLimit?: boolean;
|
|
15
|
+
idleTimeout?: number;
|
|
16
|
+
maxPayloadLength?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ClusterMessage {
|
|
19
|
+
type: 'broadcast' | 'direct' | 'join' | 'leave' | 'heartbeat' | 'stats';
|
|
20
|
+
workerId?: string;
|
|
21
|
+
targetId?: string;
|
|
22
|
+
roomId?: string;
|
|
23
|
+
data?: any;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}
|
|
26
|
+
export interface WebSocketConnection {
|
|
27
|
+
id: string;
|
|
28
|
+
workerId: string;
|
|
29
|
+
socket: ServerWebSocket<any>;
|
|
30
|
+
rooms: Set<string>;
|
|
31
|
+
metadata: Record<string, any>;
|
|
32
|
+
lastHeartbeat: number;
|
|
33
|
+
connected: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface WebSocketRoom {
|
|
36
|
+
id: string;
|
|
37
|
+
connections: Set<string>;
|
|
38
|
+
metadata: Record<string, any>;
|
|
39
|
+
created: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ClusterStats {
|
|
42
|
+
totalConnections: number;
|
|
43
|
+
totalRooms: number;
|
|
44
|
+
workerStats: Record<string, {
|
|
45
|
+
connections: number;
|
|
46
|
+
rooms: number;
|
|
47
|
+
memoryUsage: number;
|
|
48
|
+
uptime: number;
|
|
49
|
+
}>;
|
|
50
|
+
messagesSent: number;
|
|
51
|
+
messagesReceived: number;
|
|
52
|
+
bytesTransferred: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* WebSocket cluster manager for distributing connections across workers
|
|
56
|
+
*/
|
|
57
|
+
export declare class WebSocketCluster {
|
|
58
|
+
private config;
|
|
59
|
+
private workers;
|
|
60
|
+
private connections;
|
|
61
|
+
private rooms;
|
|
62
|
+
private messageHandlers;
|
|
63
|
+
private stats;
|
|
64
|
+
private heartbeatTimer?;
|
|
65
|
+
private isMainWorker;
|
|
66
|
+
private workerId;
|
|
67
|
+
constructor(config?: WebSocketClusterConfig);
|
|
68
|
+
/**
|
|
69
|
+
* Create WebSocket server with clustering support
|
|
70
|
+
*/
|
|
71
|
+
createServer(options?: {
|
|
72
|
+
port?: number;
|
|
73
|
+
hostname?: string;
|
|
74
|
+
onConnection?: (ws: ServerWebSocket<any>, request: Request) => void;
|
|
75
|
+
onMessage?: (ws: ServerWebSocket<any>, message: string | Buffer) => void;
|
|
76
|
+
onClose?: (ws: ServerWebSocket<any>, code?: number, reason?: string) => void;
|
|
77
|
+
onError?: (ws: ServerWebSocket<any>, error: Error) => void;
|
|
78
|
+
}): any;
|
|
79
|
+
/**
|
|
80
|
+
* Join a connection to a room
|
|
81
|
+
*/
|
|
82
|
+
joinRoom(connectionId: string, roomId: string, metadata?: Record<string, any>): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Remove a connection from a room
|
|
85
|
+
*/
|
|
86
|
+
leaveRoom(connectionId: string, roomId: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Broadcast message to all connections in a room
|
|
89
|
+
*/
|
|
90
|
+
broadcastToRoom(roomId: string, message: string | Buffer, excludeConnectionId?: string): number;
|
|
91
|
+
/**
|
|
92
|
+
* Send message to specific connection
|
|
93
|
+
*/
|
|
94
|
+
sendToConnection(connectionId: string, message: string | Buffer): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Get cluster statistics
|
|
97
|
+
*/
|
|
98
|
+
getStats(): ClusterStats;
|
|
99
|
+
/**
|
|
100
|
+
* Get connections in a room
|
|
101
|
+
*/
|
|
102
|
+
getRoomConnections(roomId: string): string[];
|
|
103
|
+
/**
|
|
104
|
+
* Get rooms for a connection
|
|
105
|
+
*/
|
|
106
|
+
getConnectionRooms(connectionId: string): string[];
|
|
107
|
+
/**
|
|
108
|
+
* Close connection
|
|
109
|
+
*/
|
|
110
|
+
closeConnection(connectionId: string, code?: number, reason?: string): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Shutdown cluster
|
|
113
|
+
*/
|
|
114
|
+
shutdown(): void;
|
|
115
|
+
/**
|
|
116
|
+
* Generate unique connection ID
|
|
117
|
+
*/
|
|
118
|
+
private generateConnectionId;
|
|
119
|
+
/**
|
|
120
|
+
* Generate unique worker ID
|
|
121
|
+
*/
|
|
122
|
+
private generateWorkerId;
|
|
123
|
+
/**
|
|
124
|
+
* Initialize statistics
|
|
125
|
+
*/
|
|
126
|
+
private initializeStats;
|
|
127
|
+
/**
|
|
128
|
+
* Setup worker communication
|
|
129
|
+
*/
|
|
130
|
+
private setupWorkerCommunication;
|
|
131
|
+
/**
|
|
132
|
+
* Handle messages from other workers
|
|
133
|
+
*/
|
|
134
|
+
private handleWorkerMessage;
|
|
135
|
+
/**
|
|
136
|
+
* Handle cluster messages from connections
|
|
137
|
+
*/
|
|
138
|
+
private handleClusterMessage;
|
|
139
|
+
/**
|
|
140
|
+
* Broadcast message to all workers
|
|
141
|
+
*/
|
|
142
|
+
private broadcastToWorkers;
|
|
143
|
+
/**
|
|
144
|
+
* Start heartbeat timer
|
|
145
|
+
*/
|
|
146
|
+
private startHeartbeat;
|
|
147
|
+
/**
|
|
148
|
+
* Update worker statistics
|
|
149
|
+
*/
|
|
150
|
+
private updateWorkerStats;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* WebSocket cluster factory
|
|
154
|
+
*/
|
|
155
|
+
export declare class WebSocketClusterFactory {
|
|
156
|
+
/**
|
|
157
|
+
* Create WebSocket cluster with default configuration
|
|
158
|
+
*/
|
|
159
|
+
static create(config?: WebSocketClusterConfig): WebSocketCluster;
|
|
160
|
+
/**
|
|
161
|
+
* Create high-performance cluster for production
|
|
162
|
+
*/
|
|
163
|
+
static createHighPerformance(): WebSocketCluster;
|
|
164
|
+
/**
|
|
165
|
+
* Create development cluster with debugging
|
|
166
|
+
*/
|
|
167
|
+
static createDevelopment(): WebSocketCluster;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* WebSocket cluster helpers
|
|
171
|
+
*/
|
|
172
|
+
export declare const WebSocketClusterHelpers: {
|
|
173
|
+
/**
|
|
174
|
+
* Create room-based chat system
|
|
175
|
+
*/
|
|
176
|
+
createChatSystem: (cluster: WebSocketCluster) => any;
|
|
177
|
+
/**
|
|
178
|
+
* Create real-time notifications system
|
|
179
|
+
*/
|
|
180
|
+
createNotificationSystem: (cluster: WebSocketCluster) => any;
|
|
181
|
+
/**
|
|
182
|
+
* Create presence system
|
|
183
|
+
*/
|
|
184
|
+
createPresenceSystem: (cluster: WebSocketCluster) => any;
|
|
185
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/bun-router",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.7",
|
|
5
5
|
"description": "A fast, type-safe router for Bun.",
|
|
6
6
|
"author": "Chris Breuer <chris@stacksjs.org>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -54,7 +54,8 @@
|
|
|
54
54
|
},
|
|
55
55
|
"files": [
|
|
56
56
|
"README.md",
|
|
57
|
-
"dist"
|
|
57
|
+
"dist",
|
|
58
|
+
"src"
|
|
58
59
|
],
|
|
59
60
|
"scripts": {
|
|
60
61
|
"build": "bun --bun build.ts && bun run compile",
|