@getsoda/core 0.1.1 → 0.2.0

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.
Files changed (115) hide show
  1. package/README.md +58 -0
  2. package/dist/app/app.d.ts +17 -1
  3. package/dist/app/app.d.ts.map +1 -1
  4. package/dist/app/app.js +29 -10
  5. package/dist/app/app.js.map +1 -1
  6. package/dist/di/container.d.ts +5 -0
  7. package/dist/di/container.d.ts.map +1 -1
  8. package/dist/di/container.js +15 -1
  9. package/dist/di/container.js.map +1 -1
  10. package/dist/di/graph.d.ts +2 -2
  11. package/dist/di/graph.d.ts.map +1 -1
  12. package/dist/di/graph.js +20 -10
  13. package/dist/di/graph.js.map +1 -1
  14. package/dist/http/arguments.d.ts +20 -2
  15. package/dist/http/arguments.d.ts.map +1 -1
  16. package/dist/http/arguments.js +29 -0
  17. package/dist/http/arguments.js.map +1 -1
  18. package/dist/http/body.d.ts +28 -0
  19. package/dist/http/body.d.ts.map +1 -1
  20. package/dist/http/body.js +96 -1
  21. package/dist/http/body.js.map +1 -1
  22. package/dist/http/context-key.d.ts +33 -0
  23. package/dist/http/context-key.d.ts.map +1 -0
  24. package/dist/http/context-key.js +37 -0
  25. package/dist/http/context-key.js.map +1 -0
  26. package/dist/http/context.d.ts +37 -3
  27. package/dist/http/context.d.ts.map +1 -1
  28. package/dist/http/context.js +63 -5
  29. package/dist/http/context.js.map +1 -1
  30. package/dist/http/cookies.d.ts +49 -0
  31. package/dist/http/cookies.d.ts.map +1 -0
  32. package/dist/http/cookies.js +77 -0
  33. package/dist/http/cookies.js.map +1 -0
  34. package/dist/http/cors.d.ts +41 -0
  35. package/dist/http/cors.d.ts.map +1 -0
  36. package/dist/http/cors.js +97 -0
  37. package/dist/http/cors.js.map +1 -0
  38. package/dist/http/index.d.ts +7 -1
  39. package/dist/http/index.d.ts.map +1 -1
  40. package/dist/http/index.js +4 -1
  41. package/dist/http/index.js.map +1 -1
  42. package/dist/http/middleware.d.ts +56 -0
  43. package/dist/http/middleware.d.ts.map +1 -0
  44. package/dist/http/middleware.js +83 -0
  45. package/dist/http/middleware.js.map +1 -0
  46. package/dist/http/parsers.d.ts +3 -0
  47. package/dist/http/parsers.d.ts.map +1 -1
  48. package/dist/http/parsers.js +2 -1
  49. package/dist/http/parsers.js.map +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/jwt/algorithms.d.ts +19 -0
  55. package/dist/jwt/algorithms.d.ts.map +1 -0
  56. package/dist/jwt/algorithms.js +60 -0
  57. package/dist/jwt/algorithms.js.map +1 -0
  58. package/dist/jwt/errors.d.ts +24 -0
  59. package/dist/jwt/errors.d.ts.map +1 -0
  60. package/dist/jwt/errors.js +14 -0
  61. package/dist/jwt/errors.js.map +1 -0
  62. package/dist/jwt/guard.d.ts +30 -0
  63. package/dist/jwt/guard.d.ts.map +1 -0
  64. package/dist/jwt/guard.js +61 -0
  65. package/dist/jwt/guard.js.map +1 -0
  66. package/dist/jwt/index.d.ts +14 -0
  67. package/dist/jwt/index.d.ts.map +1 -0
  68. package/dist/jwt/index.js +10 -0
  69. package/dist/jwt/index.js.map +1 -0
  70. package/dist/jwt/module.d.ts +36 -0
  71. package/dist/jwt/module.d.ts.map +1 -0
  72. package/dist/jwt/module.js +38 -0
  73. package/dist/jwt/module.js.map +1 -0
  74. package/dist/jwt/service.d.ts +66 -0
  75. package/dist/jwt/service.d.ts.map +1 -0
  76. package/dist/jwt/service.js +138 -0
  77. package/dist/jwt/service.js.map +1 -0
  78. package/dist/logger/console-logger.d.ts +28 -0
  79. package/dist/logger/console-logger.d.ts.map +1 -0
  80. package/dist/logger/console-logger.js +87 -0
  81. package/dist/logger/console-logger.js.map +1 -0
  82. package/dist/logger/index.d.ts +9 -0
  83. package/dist/logger/index.d.ts.map +1 -0
  84. package/dist/logger/index.js +7 -0
  85. package/dist/logger/index.js.map +1 -0
  86. package/dist/logger/logger.d.ts +55 -0
  87. package/dist/logger/logger.d.ts.map +1 -0
  88. package/dist/logger/logger.js +66 -0
  89. package/dist/logger/logger.js.map +1 -0
  90. package/dist/routing/types.d.ts +1 -1
  91. package/dist/routing/types.d.ts.map +1 -1
  92. package/package.json +6 -12
  93. package/src/app/app.ts +53 -12
  94. package/src/di/container.ts +24 -2
  95. package/src/di/graph.ts +26 -11
  96. package/src/http/arguments.ts +42 -2
  97. package/src/http/body.ts +142 -1
  98. package/src/http/context-key.ts +35 -0
  99. package/src/http/context.ts +94 -8
  100. package/src/http/cookies.ts +96 -0
  101. package/src/http/cors.ts +143 -0
  102. package/src/http/index.ts +7 -1
  103. package/src/http/middleware.ts +124 -0
  104. package/src/http/parsers.ts +2 -1
  105. package/src/index.ts +1 -0
  106. package/src/jwt/algorithms.ts +113 -0
  107. package/src/jwt/errors.ts +30 -0
  108. package/src/jwt/guard.ts +74 -0
  109. package/src/jwt/index.ts +14 -0
  110. package/src/jwt/module.ts +58 -0
  111. package/src/jwt/service.ts +216 -0
  112. package/src/logger/console-logger.ts +119 -0
  113. package/src/logger/index.ts +9 -0
  114. package/src/logger/logger.ts +96 -0
  115. package/src/routing/types.ts +1 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @module
3
+ * CORS middleware.
4
+ *
5
+ * Follows Hono's `cors()` and the `cors` package Nest uses, with two differences:
6
+ *
7
+ * - only a real preflight (`OPTIONS` with `Access-Control-Request-Method`, as
8
+ * the Fetch spec defines it) is answered here; other `OPTIONS` requests reach
9
+ * the application and its own `OPTIONS` routes;
10
+ * - `credentials: true` with `origin: '*'` is rejected when the middleware is
11
+ * created: browsers refuse that pair, so it could never work.
12
+ *
13
+ * Response headers are set in place: Bun's responses always have mutable headers.
14
+ *
15
+ * ```ts
16
+ * cors({ origin: ['https://app.example.com'], credentials: true, maxAge: 600 })
17
+ * ```
18
+ */
19
+ const DEFAULT_METHODS = ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'];
20
+ const createOriginCheck = (origin) => {
21
+ if (typeof origin === 'function') {
22
+ return origin;
23
+ }
24
+ if (typeof origin === 'string') {
25
+ return (requested) => requested === origin;
26
+ }
27
+ const allowed = new Set(origin);
28
+ return (requested) => allowed.has(requested);
29
+ };
30
+ const appendVary = (headers, value) => {
31
+ const current = headers.get('vary');
32
+ if (current === null) {
33
+ headers.set('vary', value);
34
+ }
35
+ else if (current !== '*' && !current.toLowerCase().split(/\s*,\s*/).includes(value.toLowerCase())) {
36
+ headers.set('vary', `${current}, ${value}`);
37
+ }
38
+ };
39
+ /**
40
+ * Creates the CORS middleware. Throws a `TypeError` for options browsers would refuse.
41
+ */
42
+ export const cors = (options = {}) => {
43
+ const origin = options.origin ?? '*';
44
+ const any = origin === '*';
45
+ if (any && options.credentials === true) {
46
+ throw new TypeError("cors(): credentials cannot be used with origin '*', browsers reject that combination; list the allowed origins instead");
47
+ }
48
+ const isAllowed = any ? () => true : createOriginCheck(origin);
49
+ const methods = (options.methods ?? DEFAULT_METHODS).join(', ');
50
+ const allowedHeaders = options.allowedHeaders?.join(', ');
51
+ const exposedHeaders = options.exposedHeaders?.join(', ');
52
+ const maxAge = options.maxAge === undefined ? undefined : String(options.maxAge);
53
+ /** Headers every CORS response of an allowed origin gets. */
54
+ const applyCommon = (headers, requested, req) => {
55
+ if (requested !== null && isAllowed(requested, req)) {
56
+ headers.set('access-control-allow-origin', any ? '*' : requested);
57
+ if (options.credentials === true) {
58
+ headers.set('access-control-allow-credentials', 'true');
59
+ }
60
+ }
61
+ // The response depends on Origin as soon as it is not the same for every origin.
62
+ if (!any) {
63
+ appendVary(headers, 'Origin');
64
+ }
65
+ };
66
+ return async (req, next) => {
67
+ const requested = req.headers.get('origin');
68
+ const preflight = req.method === 'OPTIONS' && requested !== null && req.headers.has('access-control-request-method');
69
+ if (preflight) {
70
+ const headers = new Headers();
71
+ applyCommon(headers, requested, req);
72
+ if (headers.has('access-control-allow-origin')) {
73
+ headers.set('access-control-allow-methods', methods);
74
+ const requestedHeaders = req.headers.get('access-control-request-headers');
75
+ const allowHeaders = allowedHeaders ?? requestedHeaders ?? '';
76
+ if (allowHeaders !== '') {
77
+ headers.set('access-control-allow-headers', allowHeaders);
78
+ }
79
+ if (allowedHeaders === undefined && requestedHeaders !== null) {
80
+ appendVary(headers, 'Access-Control-Request-Headers');
81
+ }
82
+ if (maxAge !== undefined) {
83
+ headers.set('access-control-max-age', maxAge);
84
+ }
85
+ }
86
+ return new Response(null, { status: 204, headers });
87
+ }
88
+ const response = await next();
89
+ const headers = response.headers;
90
+ applyCommon(headers, requested, req);
91
+ if (exposedHeaders !== undefined && headers.has('access-control-allow-origin')) {
92
+ headers.set('access-control-expose-headers', exposedHeaders);
93
+ }
94
+ return response;
95
+ };
96
+ };
97
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/http/cors.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,11 @@
2
2
  * @module
3
3
  * HTTP layer for Soda: controllers, route decorators, request context, validation, exceptions.
4
4
  */
5
- export { body, context, header, param, query } from './arguments.ts';
5
+ export { body, context, cookie, form, header, param, query, value } from './arguments.ts';
6
6
  export type { Argument, ArgumentFor, ArgumentKind, ArgumentValues } from './arguments.ts';
7
7
  export { Context } from './context.ts';
8
+ export { CookieSigner, signed } from './cookies.ts';
9
+ export { ContextKey } from './context-key.ts';
8
10
  export type { ContextParams, ParamNameOf } from './context.ts';
9
11
  export { All, Controller, Delete, Get, Head, Header, HttpCode, Options, Patch, Post, Put, Route } from './decorators.ts';
10
12
  export type { ArgumentsRouteDecorator, MethodMetadataDecorator, MethodRouteDecoratorFactory, RouteDecorator, RouteDecoratorFactory, RouteHandlerMethod, } from './decorators.ts';
@@ -21,4 +23,8 @@ export type { AnyParams, PathParams } from './types.ts';
21
23
  export { Catch, createDecorator, UseFilters, UseGuards, UseInterceptors } from './enhancers.ts';
22
24
  export type { CallHandler, CanActivate, ClassOrMethodDecorator, Enhancers, ExceptionFilter, FilterFunction, FilterLike, Guard, GuardFunction, Interceptor, InterceptorFunction, InterceptorLike, MetadataDecorator, } from './enhancers.ts';
23
25
  export type { RouteInfo } from './context.ts';
26
+ export { cors } from './cors.ts';
27
+ export type { CorsOptions } from './cors.ts';
28
+ export type { Middleware, MiddlewareFunction, NestMiddleware, Next } from './middleware.ts';
29
+ export type { FormFields, FormLimits, FormValue } from './body.ts';
24
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACxH,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EACd,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC3D,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACvE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC/F,YAAY,EACV,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACzF,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACxH,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EACd,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC3D,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACvE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC/F,YAAY,EACV,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3F,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
@@ -2,12 +2,15 @@
2
2
  * @module
3
3
  * HTTP layer for Soda: controllers, route decorators, request context, validation, exceptions.
4
4
  */
5
- export { body, context, header, param, query } from './arguments.js';
5
+ export { body, context, cookie, form, header, param, query, value } from './arguments.js';
6
6
  export { Context } from './context.js';
7
+ export { CookieSigner, signed } from './cookies.js';
8
+ export { ContextKey } from './context-key.js';
7
9
  export { All, Controller, Delete, Get, Head, Header, HttpCode, Options, Patch, Post, Put, Route } from './decorators.js';
8
10
  export { ControllerError } from './errors.js';
9
11
  export { BadRequestException, ConflictException, ForbiddenException, HttpException, InternalServerErrorException, NotFoundException, PayloadTooLargeException, ServiceUnavailableException, TooManyRequestsException, UnauthorizedException, UnprocessableEntityException, UnsupportedMediaTypeException, } from './exceptions.js';
10
12
  export { boolean, int, number, uuid } from './parsers.js';
11
13
  export { buildRoutes, controllerRoutes } from './routes.js';
12
14
  export { Catch, createDecorator, UseFilters, UseGuards, UseInterceptors } from './enhancers.js';
15
+ export { cors } from './cors.js';
13
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AASxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AASxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAiB/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @module
3
+ * Application middleware: runs around every request, before routing.
4
+ *
5
+ * Unlike guards and interceptors, which belong to a route, middleware sees
6
+ * every request: unknown paths (404), wrong methods (405), CORS preflights.
7
+ * That is where CORS, request ids, access logs or compression belong.
8
+ *
9
+ * ```ts
10
+ * const requestId: MiddlewareFunction = async (req, next) => {
11
+ * const response = await next()
12
+ *
13
+ * response.headers.set('x-request-id', crypto.randomUUID())
14
+ *
15
+ * return response
16
+ * }
17
+ *
18
+ * await createApp(AppModule, { middleware: [cors({ origin: 'https://app.example.com' }), requestId] })
19
+ * ```
20
+ *
21
+ * As guards: a class is created once by the container (root module) and gets
22
+ * lifecycle hooks, a function runs where `inject()` works, an instance is used as is.
23
+ */
24
+ import type { Constructor } from '../di/index.ts';
25
+ import type { NativeHandler } from '../routing/index.ts';
26
+ /** Continues with the next middleware, then the route. */
27
+ export type Next = () => Promise<Response>;
28
+ /** Class middleware. Like Nest's `NestMiddleware`, for the Fetch API. */
29
+ export interface NestMiddleware {
30
+ use(req: Request, next: Next): Response | Promise<Response>;
31
+ }
32
+ /** Function middleware; `inject()` works inside it, before the first `await`. */
33
+ export type MiddlewareFunction = (req: Request, next: Next) => Response | Promise<Response>;
34
+ /** What `middleware` accepts. */
35
+ export type Middleware = Constructor<NestMiddleware> | NestMiddleware | MiddlewareFunction;
36
+ type Step = (req: Request, next: Next) => Response | Promise<Response>;
37
+ /**
38
+ * Turns middleware declarations into steps. Classes are created now, inside
39
+ * `runInContext`, and passed to `onCreate` for their lifecycle hooks.
40
+ */
41
+ export declare const resolveMiddleware: (middleware: readonly Middleware[], runInContext: <R>(fn: () => R) => R, onCreate: (instance: unknown) => void) => Step[];
42
+ /**
43
+ * Wraps `handler` with the middleware steps, first one outermost.
44
+ * Errors of middleware go to `onError`, which builds the response.
45
+ */
46
+ export declare const withMiddleware: <R extends Request>(steps: readonly Step[], handler: (req: R) => Response | Promise<Response>, onError: (error: unknown, req: Request) => Response) => ((req: R) => Promise<Response>);
47
+ /**
48
+ * Applies middleware to every native route and to the fallback of a compiled table.
49
+ * Without middleware, the table is returned unchanged: no wrapper on the request path.
50
+ */
51
+ export declare const applyMiddleware: (steps: readonly Step[], routes: Record<string, NativeHandler>, fetch: (req: Request) => Response | Promise<Response>, onError: (error: unknown, req: Request) => Response) => {
52
+ routes: Record<string, NativeHandler>;
53
+ fetch: (req: Request) => Response | Promise<Response>;
54
+ };
55
+ export {};
56
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/http/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,0DAA0D;AAC1D,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE1C,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC5D;AAED,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE3F,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,kBAAkB,CAAA;AAE1F,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAWtE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,eAChB,SAAS,UAAU,EAAE,gBACnB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,YACzB,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,KACpC,IAAI,EAqBN,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,OAAO,SACvC,SAAS,IAAI,EAAE,WACb,CAAC,GAAG,EAAE,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,WACxC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,QAAQ,KAClD,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAShC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,UACnB,SAAS,IAAI,EAAE,UACd,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAC9B,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,WAC5C,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,QAAQ,KAClD;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAYhG,CAAA"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @module
3
+ * Application middleware: runs around every request, before routing.
4
+ *
5
+ * Unlike guards and interceptors, which belong to a route, middleware sees
6
+ * every request: unknown paths (404), wrong methods (405), CORS preflights.
7
+ * That is where CORS, request ids, access logs or compression belong.
8
+ *
9
+ * ```ts
10
+ * const requestId: MiddlewareFunction = async (req, next) => {
11
+ * const response = await next()
12
+ *
13
+ * response.headers.set('x-request-id', crypto.randomUUID())
14
+ *
15
+ * return response
16
+ * }
17
+ *
18
+ * await createApp(AppModule, { middleware: [cors({ origin: 'https://app.example.com' }), requestId] })
19
+ * ```
20
+ *
21
+ * As guards: a class is created once by the container (root module) and gets
22
+ * lifecycle hooks, a function runs where `inject()` works, an instance is used as is.
23
+ */
24
+ /** Runs a step, turning a synchronous throw into a rejection. */
25
+ const settle = (step) => {
26
+ try {
27
+ return Promise.resolve(step());
28
+ }
29
+ catch (error) {
30
+ return Promise.reject(error);
31
+ }
32
+ };
33
+ /**
34
+ * Turns middleware declarations into steps. Classes are created now, inside
35
+ * `runInContext`, and passed to `onCreate` for their lifecycle hooks.
36
+ */
37
+ export const resolveMiddleware = (middleware, runInContext, onCreate) => {
38
+ const steps = [];
39
+ for (const entry of middleware) {
40
+ if (typeof entry === 'function' && typeof entry.prototype?.use === 'function') {
41
+ const instance = runInContext(() => new entry());
42
+ onCreate(instance);
43
+ steps.push((req, next) => instance.use(req, next));
44
+ }
45
+ else if (typeof entry === 'function') {
46
+ const fn = entry;
47
+ steps.push((req, next) => runInContext(() => fn(req, next)));
48
+ }
49
+ else if (typeof entry === 'object' && entry !== null && typeof entry.use === 'function') {
50
+ steps.push((req, next) => entry.use(req, next));
51
+ }
52
+ else {
53
+ throw new TypeError(`Invalid middleware: ${String(entry)} is neither a function nor an object with use()`);
54
+ }
55
+ }
56
+ return steps;
57
+ };
58
+ /**
59
+ * Wraps `handler` with the middleware steps, first one outermost.
60
+ * Errors of middleware go to `onError`, which builds the response.
61
+ */
62
+ export const withMiddleware = (steps, handler, onError) => {
63
+ const count = steps.length;
64
+ return (req) => {
65
+ const call = (index) => index === count ? settle(() => handler(req)) : settle(() => steps[index](req, () => call(index + 1)));
66
+ return call(0).catch((error) => onError(error, req));
67
+ };
68
+ };
69
+ /**
70
+ * Applies middleware to every native route and to the fallback of a compiled table.
71
+ * Without middleware, the table is returned unchanged: no wrapper on the request path.
72
+ */
73
+ export const applyMiddleware = (steps, routes, fetch, onError) => {
74
+ if (steps.length === 0) {
75
+ return { routes, fetch };
76
+ }
77
+ const wrapped = {};
78
+ for (const key of Object.keys(routes)) {
79
+ wrapped[key] = withMiddleware(steps, routes[key], onError);
80
+ }
81
+ return { routes: wrapped, fetch: withMiddleware(steps, fetch, onError) };
82
+ };
83
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/http/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAqBH,iEAAiE;AACjE,MAAM,MAAM,GAAG,CAAC,IAAwC,EAAqB,EAAE;IAC7E,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,UAAiC,EACjC,YAAmC,EACnC,QAAqC,EAC7B,EAAE;IACV,MAAM,KAAK,GAAW,EAAE,CAAA;IAExB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,OAAQ,KAAK,CAAC,SAAiD,EAAE,GAAG,KAAK,UAAU,EAAE,CAAC;YACvH,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,IAAK,KAAqC,EAAE,CAAC,CAAA;YAEjF,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAClB,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;QACpD,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,KAA2B,CAAA;YAEtC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9D,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YAC1F,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,SAAS,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;QAC5G,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAsB,EACtB,OAAiD,EACjD,OAAmD,EAClB,EAAE;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;IAE1B,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,CAAC,KAAa,EAAqB,EAAE,CAChD,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAExG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAsB,EACtB,MAAqC,EACrC,KAAqD,EACrD,OAAmD,EAC+C,EAAE;IACpG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,MAAM,OAAO,GAAkC,EAAE,CAAA;IAEjD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAA;AAC1E,CAAC,CAAA"}
@@ -10,6 +10,7 @@
10
10
  * ctx.query('page', int({ optional: true })) // number | undefined
11
11
  * ```
12
12
  */
13
+ import { BadRequestException } from './exceptions.ts';
13
14
  import type { InferOutput, StandardSchemaV1 } from './schema.ts';
14
15
  /**
15
16
  * Turns a raw string (`undefined` when absent) into a value, or throws an `HttpException`.
@@ -28,6 +29,8 @@ export interface ParserOptions {
28
29
  type Result<T, O extends ParserOptions> = O extends {
29
30
  readonly optional: true;
30
31
  } ? T | undefined : T;
32
+ /** The `400` of a value that is missing or not what a parser expects. */
33
+ export declare const failure: (name: string, expected: string) => BadRequestException;
31
34
  /**
32
35
  * Integer within `Number.MAX_SAFE_INTEGER`. Unlike Nest's `ParseIntPipe`,
33
36
  * `'99999999999999999999'` is rejected instead of being silently rounded.
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/http/parsers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEhE;;GAEG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,CAAA;CAC/D;AAED,0EAA0E;AAC1E,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAA;AAEhF,8BAA8B;AAC9B,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAE3G,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,aAAa,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAA;AAiCnG;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAS9D,CAAA;AAEhC,uDAAuD;AACvD,eAAO,MAAM,MAAM,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CASjE,CAAA;AAEhC,6BAA6B;AAC7B,eAAO,MAAM,OAAO,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAGhG,CAAA;AAEH,6CAA6C;AAC7C,eAAO,MAAM,IAAI,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAC6B,CAAA;AAE5H;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,KAAG,MAAM,CAAC,CAAC,CACK,CAAA"}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/http/parsers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEhE;;GAEG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,CAAA;CAC/D;AAED,0EAA0E;AAC1E,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAA;AAEhF,8BAA8B;AAC9B,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAE3G,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,aAAa,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAA;AAMnG,yEAAyE;AACzE,eAAO,MAAM,OAAO,SAAU,MAAM,YAAY,MAAM,KAAG,mBAC6B,CAAA;AA0BtF;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAS9D,CAAA;AAEhC,uDAAuD;AACvD,eAAO,MAAM,MAAM,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CASjE,CAAA;AAEhC,6BAA6B;AAC7B,eAAO,MAAM,OAAO,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAGhG,CAAA;AAEH,6CAA6C;AAC7C,eAAO,MAAM,IAAI,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,YAAY,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAC6B,CAAA;AAE5H;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,KAAG,MAAM,CAAC,CAAC,CACK,CAAA"}
@@ -15,7 +15,8 @@ import { isStandardSchema, validateSync } from './schema.js';
15
15
  const INTEGER = /^-?\d+$/;
16
16
  const NUMBER = /^-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
17
17
  const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
- const failure = (name, expected) => new BadRequestException(`Validation failed for "${name}" (${expected} is expected)`);
18
+ /** The `400` of a value that is missing or not what a parser expects. */
19
+ export const failure = (name, expected) => new BadRequestException(`Validation failed for "${name}" (${expected} is expected)`);
19
20
  const createParser = (expected, convert, options) => ({
20
21
  parse: (value, name) => {
21
22
  if (value === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/http/parsers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/http/parsers.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -33,5 +33,6 @@
33
33
  export * from './app/index.ts';
34
34
  export * from './di/index.ts';
35
35
  export * from './http/index.ts';
36
+ export * from './logger/index.ts';
36
37
  export * from './routing/index.ts';
37
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -33,5 +33,6 @@
33
33
  export * from './app/index.js';
34
34
  export * from './di/index.js';
35
35
  export * from './http/index.js';
36
+ export * from './logger/index.js';
36
37
  export * from './routing/index.js';
37
38
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @module
3
+ * JWS algorithms (RFC 7518) on WebCrypto, and the keys they take.
4
+ */
5
+ import type { webcrypto } from 'node:crypto';
6
+ /** Algorithms a token can be signed with. `none` is not one of them. */
7
+ export type JwtAlgorithm = 'HS256' | 'HS384' | 'HS512' | 'RS256' | 'RS384' | 'RS512' | 'PS256' | 'PS384' | 'PS512' | 'ES256' | 'ES384' | 'ES512' | 'EdDSA';
8
+ /**
9
+ * A key: a `CryptoKey`, a JWK, a PEM string (`PRIVATE KEY` in PKCS #8 or
10
+ * `PUBLIC KEY` in SPKI), or the secret of an HMAC algorithm.
11
+ */
12
+ export type JwtKey = CryptoKey | webcrypto.JsonWebKey | string;
13
+ export declare const isJwtAlgorithm: (value: unknown) => value is JwtAlgorithm;
14
+ export declare const isHmac: (algorithm: JwtAlgorithm) => boolean;
15
+ /** Imports `key` once for `usage` with `algorithm`. */
16
+ export declare const importKey: (key: JwtKey, algorithm: JwtAlgorithm, usage: 'sign' | 'verify') => Promise<CryptoKey>;
17
+ export declare const signBytes: (algorithm: JwtAlgorithm, key: CryptoKey, data: Uint8Array<ArrayBuffer>) => Promise<Uint8Array<ArrayBuffer>>;
18
+ export declare const verifyBytes: (algorithm: JwtAlgorithm, key: CryptoKey, signature: Uint8Array<ArrayBuffer>, data: Uint8Array<ArrayBuffer>) => Promise<boolean>;
19
+ //# sourceMappingURL=algorithms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.d.ts","sourceRoot":"","sources":["../../src/jwt/algorithms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,wEAAwE;AACxE,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,CAAA;AAEX;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC,UAAU,GAAG,MAAM,CAAA;AAwC9D,eAAO,MAAM,cAAc,UAAW,OAAO,KAAG,KAAK,IAAI,YAA6E,CAAA;AAEtI,eAAO,MAAM,MAAM,cAAe,YAAY,KAAG,OAAqC,CAAA;AAKtF,uDAAuD;AACvD,eAAO,MAAM,SAAS,QAAe,MAAM,aAAa,YAAY,SAAS,MAAM,GAAG,QAAQ,KAAG,OAAO,CAAC,SAAS,CA2BjH,CAAA;AAED,eAAO,MAAM,SAAS,cAAqB,YAAY,OAAO,SAAS,QAAQ,UAAU,CAAC,WAAW,CAAC,KAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CACvD,CAAA;AAEjF,eAAO,MAAM,WAAW,cACX,YAAY,OAClB,SAAS,aACH,UAAU,CAAC,WAAW,CAAC,QAC5B,UAAU,CAAC,WAAW,CAAC,KAC5B,OAAO,CAAC,OAAO,CAA2E,CAAA"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @module
3
+ * JWS algorithms (RFC 7518) on WebCrypto, and the keys they take.
4
+ */
5
+ /** Import parameters, and the signing parameters where they differ. */
6
+ const ALGORITHMS = {
7
+ HS256: hmac('SHA-256'),
8
+ HS384: hmac('SHA-384'),
9
+ HS512: hmac('SHA-512'),
10
+ RS256: rsa('RSASSA-PKCS1-v1_5', 'SHA-256'),
11
+ RS384: rsa('RSASSA-PKCS1-v1_5', 'SHA-384'),
12
+ RS512: rsa('RSASSA-PKCS1-v1_5', 'SHA-512'),
13
+ PS256: pss('SHA-256', 32),
14
+ PS384: pss('SHA-384', 48),
15
+ PS512: pss('SHA-512', 64),
16
+ ES256: ecdsa('P-256', 'SHA-256'),
17
+ ES384: ecdsa('P-384', 'SHA-384'),
18
+ ES512: ecdsa('P-521', 'SHA-512'),
19
+ EdDSA: { key: { name: 'Ed25519' }, sign: { name: 'Ed25519' } },
20
+ };
21
+ function hmac(hash) {
22
+ const params = { name: 'HMAC', hash };
23
+ return { key: params, sign: params };
24
+ }
25
+ function rsa(name, hash) {
26
+ return { key: { name, hash }, sign: { name } };
27
+ }
28
+ function pss(hash, saltLength) {
29
+ return { key: { name: 'RSA-PSS', hash }, sign: { name: 'RSA-PSS', saltLength } };
30
+ }
31
+ function ecdsa(namedCurve, hash) {
32
+ return { key: { name: 'ECDSA', namedCurve }, sign: { name: 'ECDSA', hash } };
33
+ }
34
+ export const isJwtAlgorithm = (value) => typeof value === 'string' && Object.hasOwn(ALGORITHMS, value);
35
+ export const isHmac = (algorithm) => algorithm.startsWith('HS');
36
+ const pemBody = (pem) => Uint8Array.fromBase64(pem.replace(/-----(?:BEGIN|END) [A-Z ]+-----/g, '').replace(/\s/g, ''));
37
+ /** Imports `key` once for `usage` with `algorithm`. */
38
+ export const importKey = async (key, algorithm, usage) => {
39
+ const params = ALGORITHMS[algorithm].key;
40
+ if (key instanceof CryptoKey) {
41
+ return key;
42
+ }
43
+ if (typeof key === 'object') {
44
+ return crypto.subtle.importKey('jwk', key, params, false, [usage]);
45
+ }
46
+ if (isHmac(algorithm)) {
47
+ return crypto.subtle.importKey('raw', new TextEncoder().encode(key), params, false, [usage]);
48
+ }
49
+ if (key.includes('-----BEGIN PRIVATE KEY-----') && usage === 'sign') {
50
+ return crypto.subtle.importKey('pkcs8', pemBody(key), params, false, [usage]);
51
+ }
52
+ if (key.includes('-----BEGIN PUBLIC KEY-----') && usage === 'verify') {
53
+ return crypto.subtle.importKey('spki', pemBody(key), params, false, [usage]);
54
+ }
55
+ throw new TypeError(`A ${algorithm} key must be a CryptoKey, a JWK or a PEM string: ` +
56
+ (usage === 'sign' ? 'a PKCS #8 "PRIVATE KEY" to sign' : 'an SPKI "PUBLIC KEY" to verify'));
57
+ };
58
+ export const signBytes = async (algorithm, key, data) => new Uint8Array(await crypto.subtle.sign(ALGORITHMS[algorithm].sign, key, data));
59
+ export const verifyBytes = (algorithm, key, signature, data) => crypto.subtle.verify(ALGORITHMS[algorithm].sign, key, signature, data);
60
+ //# sourceMappingURL=algorithms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.js","sourceRoot":"","sources":["../../src/jwt/algorithms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @module
3
+ * Why a token was refused.
4
+ */
5
+ export type JwtErrorCode =
6
+ /** Not three base64url parts holding JSON objects. */
7
+ 'malformed'
8
+ /** Signed with another algorithm than the one configured, or with critical extensions. */
9
+ | 'algorithm'
10
+ /** The signature does not match. */
11
+ | 'signature'
12
+ /** `exp` is past. */
13
+ | 'expired'
14
+ /** `nbf` is still to come. */
15
+ | 'not-active'
16
+ /** A registered claim has the wrong type, or `iss` or `aud` is not the expected one. */
17
+ | 'claims';
18
+ /** A token that `JwtService.verify()` refused. */
19
+ export declare class JwtError extends Error {
20
+ readonly code: JwtErrorCode;
21
+ readonly name = "JwtError";
22
+ constructor(code: JwtErrorCode, message: string);
23
+ }
24
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/jwt/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY;AACtB,sDAAsD;AACpD,WAAW;AACb,0FAA0F;GACxF,WAAW;AACb,oCAAoC;GAClC,WAAW;AACb,qBAAqB;GACnB,SAAS;AACX,8BAA8B;GAC5B,YAAY;AACd,wFAAwF;GACtF,QAAQ,CAAA;AAEZ,kDAAkD;AAClD,qBAAa,QAAS,SAAQ,KAAK;IAI/B,QAAQ,CAAC,IAAI,EAAE,YAAY;IAH7B,SAAkB,IAAI,cAAa;IAEnC,YACW,IAAI,EAAE,YAAY,EAC3B,OAAO,EAAE,MAAM,EAGhB;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @module
3
+ * Why a token was refused.
4
+ */
5
+ /** A token that `JwtService.verify()` refused. */
6
+ export class JwtError extends Error {
7
+ code;
8
+ name = 'JwtError';
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.code = code;
12
+ }
13
+ }
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/jwt/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,kDAAkD;AAClD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAItB,IAAI;IAHG,IAAI,GAAG,UAAU,CAAA;IAEnC,YACW,IAAkB,EAC3B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;oBAHL,IAAI;IAIf,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @module
3
+ * `JwtGuard`: lets in requests carrying a valid token, the way
4
+ * `AuthGuard('jwt')` of `@nestjs/passport` does.
5
+ */
6
+ import type { Context } from '../http/context.ts';
7
+ import { ContextKey } from '../http/context-key.ts';
8
+ import type { CanActivate } from '../http/enhancers.ts';
9
+ import type { JwtPayload } from './service.ts';
10
+ /** Payload of the token `JwtGuard` accepted: `ctx.get(JWT_PAYLOAD)` or `value(JWT_PAYLOAD)`. */
11
+ export declare const JWT_PAYLOAD: ContextKey<JwtPayload>;
12
+ /**
13
+ * Accepts a request whose token `JwtService` verifies, read from
14
+ * `Authorization: Bearer <token>` or, without that header, from the cookie
15
+ * named by the `cookie` option of `JwtModule`. The payload goes to
16
+ * {@link JWT_PAYLOAD}; anything else is a `401`.
17
+ *
18
+ * ```ts
19
+ * @Get('me', [value(JWT_PAYLOAD)])
20
+ * @UseGuards(JwtGuard)
21
+ * me(payload: JwtPayload) {}
22
+ * ```
23
+ *
24
+ * Needs `JwtModule` imported in the controller's module, or registered as global.
25
+ */
26
+ export declare class JwtGuard implements CanActivate {
27
+ #private;
28
+ canActivate(ctx: Context): Promise<boolean>;
29
+ }
30
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/jwt/guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAKvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,gGAAgG;AAChG,eAAO,MAAM,WAAW,wBAA2C,CAAA;AAQnE;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAS,YAAW,WAAW;;IAIpC,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BhD;CACF"}