@fishka/express 0.9.23 → 0.9.25

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 (50) hide show
  1. package/README.md +227 -106
  2. package/dist/cjs/auth/auth.utils.d.ts +20 -12
  3. package/dist/cjs/auth/auth.utils.js +35 -29
  4. package/dist/cjs/auth/auth.utils.js.map +1 -1
  5. package/dist/cjs/error-handling.d.ts +21 -0
  6. package/dist/cjs/error-handling.js +64 -0
  7. package/dist/cjs/error-handling.js.map +1 -1
  8. package/dist/cjs/index.d.ts +1 -2
  9. package/dist/cjs/index.js +1 -2
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/request-utils.d.ts +29 -0
  12. package/dist/cjs/request-utils.js +115 -0
  13. package/dist/cjs/request-utils.js.map +1 -0
  14. package/dist/cjs/thread-local/thread-local-storage-middleware.d.ts +1 -1
  15. package/dist/cjs/thread-local/thread-local-storage-middleware.js +14 -2
  16. package/dist/cjs/thread-local/thread-local-storage-middleware.js.map +1 -1
  17. package/dist/cjs/utils/type-validators.d.ts +1 -1
  18. package/dist/cjs/utils/type-validators.js +1 -1
  19. package/dist/cjs/utils/type-validators.js.map +1 -1
  20. package/dist/esm/auth/auth.utils.d.ts +20 -12
  21. package/dist/esm/auth/auth.utils.js +35 -29
  22. package/dist/esm/auth/auth.utils.js.map +1 -1
  23. package/dist/esm/error-handling.d.ts +21 -0
  24. package/dist/esm/error-handling.js +63 -0
  25. package/dist/esm/error-handling.js.map +1 -1
  26. package/dist/esm/index.d.ts +1 -2
  27. package/dist/esm/index.js +1 -2
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/request-utils.d.ts +29 -0
  30. package/dist/esm/request-utils.js +77 -0
  31. package/dist/esm/request-utils.js.map +1 -0
  32. package/dist/esm/thread-local/thread-local-storage-middleware.d.ts +1 -1
  33. package/dist/esm/thread-local/thread-local-storage-middleware.js +15 -3
  34. package/dist/esm/thread-local/thread-local-storage-middleware.js.map +1 -1
  35. package/dist/esm/utils/type-validators.d.ts +1 -1
  36. package/dist/esm/utils/type-validators.js +1 -1
  37. package/dist/esm/utils/type-validators.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/cjs/route-table.d.ts +0 -30
  40. package/dist/cjs/route-table.js +0 -40
  41. package/dist/cjs/route-table.js.map +0 -1
  42. package/dist/cjs/router.d.ts +0 -86
  43. package/dist/cjs/router.js +0 -220
  44. package/dist/cjs/router.js.map +0 -1
  45. package/dist/esm/route-table.d.ts +0 -30
  46. package/dist/esm/route-table.js +0 -36
  47. package/dist/esm/route-table.js.map +0 -1
  48. package/dist/esm/router.d.ts +0 -86
  49. package/dist/esm/router.js +0 -184
  50. package/dist/esm/router.js.map +0 -1
@@ -3,6 +3,8 @@ import { HttpError } from './api.types';
3
3
  import { getExpressApiConfig } from './config';
4
4
  import { HTTP_BAD_REQUEST, HTTP_INTERNAL_SERVER_ERROR } from './http-status-codes';
5
5
  import { getRequestLocalStorage } from './thread-local/thread-local-storage';
6
+ // Track if async errors patch is already applied
7
+ let asyncErrorsPatchApplied = false;
6
8
  /**
7
9
  * Converts any error into a standardized API response format.
8
10
  * - HttpError: Uses the error's status code and message
@@ -95,6 +97,67 @@ export async function catchAllMiddleware(error, _, res, next) {
95
97
  res.status(apiResponse.status);
96
98
  res.send(apiResponse);
97
99
  }
100
+ /**
101
+ * Patches Express to automatically catch errors from async route handlers.
102
+ * Call this once at application startup, before defining routes.
103
+ *
104
+ * After patching, you can use async handlers without try/catch:
105
+ * @example
106
+ * patchExpressAsyncErrors();
107
+ *
108
+ * const app = express();
109
+ *
110
+ * app.get('/users', async (req, res) => {
111
+ * const user = await getUser(); // если упадёт - catchAllMiddleware поймает
112
+ * res.json(user);
113
+ * });
114
+ *
115
+ * app.use(catchAllMiddleware);
116
+ *
117
+ * Note: This patches Express internal API. Works with Express 4.x and 5.x.
118
+ * Safe to call multiple times - patch applies only once.
119
+ */
120
+ export function patchExpressAsyncErrors() {
121
+ if (asyncErrorsPatchApplied) {
122
+ return;
123
+ }
124
+ asyncErrorsPatchApplied = true;
125
+ // We use require here to access Express internals
126
+ // This is the only way to patch the Layer prototype
127
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
128
+ const express = require('express');
129
+ // Get the Layer constructor from Express internals
130
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
131
+ const Layer = express.Router?.constructor || getLayerFromExpress();
132
+ if (!Layer || !Layer.prototype) {
133
+ console.warn('patchExpressAsyncErrors: Could not find Express Layer prototype');
134
+ return;
135
+ }
136
+ const originalHandle = Layer.prototype.handle_request;
137
+ Layer.prototype.handle_request = function handle_request(req, res, next) {
138
+ const result = originalHandle.call(this, req, res, next);
139
+ // If result is a Promise, catch errors and pass to next()
140
+ if (result !== null && typeof result === 'object' && typeof result.catch === 'function') {
141
+ result.catch(next);
142
+ }
143
+ return result;
144
+ };
145
+ }
146
+ /**
147
+ * Helper function to get Layer from Express internals.
148
+ * This is needed because Express doesn't export Layer directly.
149
+ */
150
+ function getLayerFromExpress() {
151
+ try {
152
+ // Try to require the layer module directly
153
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
154
+ const layerModule = require('express/lib/router/layer');
155
+ return layerModule.default || layerModule;
156
+ }
157
+ catch {
158
+ return undefined;
159
+ }
160
+ }
98
161
  /**
99
162
  * Installs process-level handlers for errors and graceful shutdown.
100
163
  * Call once at application startup, before app.listen().
@@ -1 +1 @@
1
- {"version":3,"file":"error-handling.js","sourceRoot":"","sources":["../../src/error-handling.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error-handling.js","sourceRoot":"","sources":["../../src/error-handling.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,7 @@ export * from './error-handling';
8
8
  export * from './http-status-codes';
9
9
  export * from './rate-limit/in-memory-rate-limiter';
10
10
  export * from './rate-limit/rate-limit.types';
11
- export * from './route-table';
12
- export * from './router';
11
+ export * from './request-utils';
13
12
  export * from './thread-local/thread-local-storage';
14
13
  export * from './thread-local/thread-local-storage-middleware';
15
14
  export * from './utils/express.utils';
package/dist/esm/index.js CHANGED
@@ -8,8 +8,7 @@ export * from './error-handling';
8
8
  export * from './http-status-codes';
9
9
  export * from './rate-limit/in-memory-rate-limiter';
10
10
  export * from './rate-limit/rate-limit.types';
11
- export * from './route-table';
12
- export * from './router';
11
+ export * from './request-utils';
13
12
  export * from './thread-local/thread-local-storage';
14
13
  export * from './thread-local/thread-local-storage-middleware';
15
14
  export * from './utils/express.utils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,qCAAqC,CAAC;AACpD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { Assertion } from '@fishka/assertions';
2
+ import { ParamValidator } from './api.types';
3
+ import { ExpressRequest } from './utils/express.utils';
4
+ /**
5
+ * Get and validate a path parameter from Express request.
6
+ * @param req - Express Request object
7
+ * @param name - Name of the path parameter
8
+ * @param validator - Optional validator. If not provided, returns the raw string value.
9
+ * @returns Validated value of type T (or string if no validator)
10
+ * @throws {HttpError} 400 Bad Request if validation fails
11
+ */
12
+ export declare function pathParam<T = string>(req: ExpressRequest, name: string, validator?: ParamValidator<T>): T;
13
+ /**
14
+ * Get and validate a query parameter from Express request.
15
+ * @param req - Express Request object
16
+ * @param name - Name of the query parameter
17
+ * @param validator - Optional validator. If not provided, returns the raw string value or undefined.
18
+ * @returns Validated value of type T.
19
+ * @throws {HttpError} 400 Bad Request if validation fails
20
+ */
21
+ export declare function queryParam<T = string>(req: ExpressRequest, name: string, validator?: ParamValidator<T>): T;
22
+ /**
23
+ * Get and validate the request body.
24
+ * @param req - Express Request object
25
+ * @param validator - Validator function or object assertion
26
+ * @returns Validated body of type T
27
+ * @throws {HttpError} 400 Bad Request if validation fails
28
+ */
29
+ export declare function body<T>(req: ExpressRequest, validator: Assertion<T>): T;
@@ -0,0 +1,77 @@
1
+ import { getMessageFromError, truthy, validateObject } from '@fishka/assertions';
2
+ import * as url from 'url';
3
+ import { assertHttp, HttpError } from './api.types';
4
+ import { HTTP_BAD_REQUEST } from './http-status-codes';
5
+ /**
6
+ * Validates a parameter with optional validator.
7
+ */
8
+ function validateParam(name, value, validator) {
9
+ try {
10
+ const result = validator ? validator(value) : truthy(value, `Missing required parameter: ${name}`);
11
+ return result;
12
+ }
13
+ catch (error) {
14
+ if (error instanceof HttpError)
15
+ throw error;
16
+ throw new HttpError(HTTP_BAD_REQUEST, `Parameter validation failed: ${name}. ${getMessageFromError(error)}`);
17
+ }
18
+ }
19
+ /**
20
+ * Get and validate a path parameter from Express request.
21
+ * @param req - Express Request object
22
+ * @param name - Name of the path parameter
23
+ * @param validator - Optional validator. If not provided, returns the raw string value.
24
+ * @returns Validated value of type T (or string if no validator)
25
+ * @throws {HttpError} 400 Bad Request if validation fails
26
+ */
27
+ export function pathParam(req, name, validator) {
28
+ const rawValue = req.params[name];
29
+ return validateParam(name, rawValue, validator);
30
+ }
31
+ /**
32
+ * Get and validate a query parameter from Express request.
33
+ * @param req - Express Request object
34
+ * @param name - Name of the query parameter
35
+ * @param validator - Optional validator. If not provided, returns the raw string value or undefined.
36
+ * @returns Validated value of type T.
37
+ * @throws {HttpError} 400 Bad Request if validation fails
38
+ */
39
+ export function queryParam(req, name, validator) {
40
+ const parsedUrl = url.parse(req.originalUrl, true);
41
+ const rawValue = parsedUrl.query[name];
42
+ const value = Array.isArray(rawValue) ? rawValue[0] : rawValue;
43
+ return validateParam(name, value, validator);
44
+ }
45
+ /**
46
+ * Get and validate the request body.
47
+ * @param req - Express Request object
48
+ * @param validator - Validator function or object assertion
49
+ * @returns Validated body of type T
50
+ * @throws {HttpError} 400 Bad Request if validation fails
51
+ */
52
+ export function body(req, validator) {
53
+ const apiRequest = req.body;
54
+ try {
55
+ // Handle validation based on whether the validator is an object or function
56
+ if (typeof validator === 'function') {
57
+ // It's a ValueAssertion (function) - call it directly
58
+ validator(apiRequest);
59
+ }
60
+ else {
61
+ // It's an ObjectAssertion - use validateObject
62
+ const objectValidator = validator;
63
+ const isEmptyValidator = Object.keys(objectValidator).length === 0;
64
+ const errorMessage = validateObject(apiRequest, objectValidator, `${HTTP_BAD_REQUEST}: request body`, {
65
+ failOnUnknownFields: !isEmptyValidator,
66
+ });
67
+ assertHttp(!errorMessage, HTTP_BAD_REQUEST, errorMessage || 'Request body validation failed');
68
+ }
69
+ return apiRequest;
70
+ }
71
+ catch (error) {
72
+ if (error instanceof HttpError)
73
+ throw error;
74
+ throw new HttpError(HTTP_BAD_REQUEST, getMessageFromError(error));
75
+ }
76
+ }
77
+ //# sourceMappingURL=request-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-utils.js","sourceRoot":"","sources":["../../src/request-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,mBAAmB,EAAmB,MAAM,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;GAEG;AACH,SAAS,aAAa,CAAI,IAAY,EAAE,KAAc,EAAE,SAAwC;IAC9F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,+BAA+B,IAAI,EAAE,CAAC,CAAC;QACnG,OAAO,MAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,KAAK,CAAC;QAC5C,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,gCAAgC,IAAI,KAAK,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAa,GAAmB,EAAE,IAAY,EAAE,SAA6B;IACpG,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAA8B,CAAC;IAC/D,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAa,GAAmB,EAAE,IAAY,EAAE,SAA6B;IACrG,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/D,OAAO,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAI,GAAmB,EAAE,SAAuB;IAClE,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;IAE5B,IAAI,CAAC;QACH,4EAA4E;QAC5E,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,sDAAsD;YACrD,SAAkC,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,+CAA+C;YAC/C,MAAM,eAAe,GAAG,SAA+B,CAAC;YACxD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,gBAAgB,gBAAgB,EAAE;gBACpG,mBAAmB,EAAE,CAAC,gBAAgB;aACvC,CAAC,CAAC;YACH,UAAU,CAAC,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,IAAI,gCAAgC,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,UAAe,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,KAAK,CAAC;QAC5C,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -2,7 +2,7 @@ import { ExpressFunction } from '../utils/express.utils';
2
2
  /**
3
3
  * Creates middleware that initializes thread-local storage for each request.
4
4
  * Automatically generates a unique request ID and makes it available throughout
5
- * the request lifecycle.
5
+ * the request lifecycle. Also adds the request ID to response headers.
6
6
  *
7
7
  * @returns Express middleware function
8
8
  */
@@ -1,15 +1,15 @@
1
1
  import { randomUUID } from 'crypto';
2
2
  import { getExpressApiConfig } from '../config';
3
- import { runWithRequestTlsData } from './thread-local-storage';
3
+ import { getRequestLocalStorage, runWithRequestTlsData } from './thread-local-storage';
4
4
  /**
5
5
  * Creates middleware that initializes thread-local storage for each request.
6
6
  * Automatically generates a unique request ID and makes it available throughout
7
- * the request lifecycle.
7
+ * the request lifecycle. Also adds the request ID to response headers.
8
8
  *
9
9
  * @returns Express middleware function
10
10
  */
11
11
  export function createTlsMiddleware() {
12
- return async (req, _res, next) => {
12
+ return async (req, res, next) => {
13
13
  const config = getExpressApiConfig();
14
14
  const headerName = config.requestIdHeader;
15
15
  // If requestIdHeader is not set, skip request ID generation entirely
@@ -20,6 +20,18 @@ export function createTlsMiddleware() {
20
20
  const headerId = config.trustRequestIdHeader ? req.headers[headerName] : undefined;
21
21
  const existingId = req.requestId || headerId;
22
22
  const requestId = typeof existingId === 'string' ? existingId : randomUUID();
23
+ // Add response hook to set request ID header before response is sent
24
+ const originalSend = res.send.bind(res);
25
+ res.send = function (body) {
26
+ // Only set header if not already set
27
+ if (!res.getHeader(headerName)) {
28
+ const tls = getRequestLocalStorage();
29
+ if (tls?.requestId) {
30
+ res.setHeader(headerName, tls.requestId);
31
+ }
32
+ }
33
+ return originalSend(body);
34
+ };
23
35
  // Run the next handler within the TLS context
24
36
  await runWithRequestTlsData({
25
37
  requestId,
@@ -1 +1 @@
1
- {"version":3,"file":"thread-local-storage-middleware.js","sourceRoot":"","sources":["../../../src/thread-local/thread-local-storage-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,EAAE,GAAmB,EAAE,IAAqB,EAAE,IAAkB,EAAiB,EAAE;QAC7F,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAE1C,qEAAqE;QACrE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,MAAM,UAAU,GAAI,GAA+B,CAAC,SAAS,IAAI,QAAQ,CAAC;QAC1E,MAAM,SAAS,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAE7E,8CAA8C;QAC9C,MAAM,qBAAqB,CACzB;YACE,SAAS;SACV,EACD,KAAK,IAAI,EAAE;YACT,IAAI,EAAE,CAAC;QACT,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"thread-local-storage-middleware.js","sourceRoot":"","sources":["../../../src/thread-local/thread-local-storage-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEvF;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,EAAE,GAAmB,EAAE,GAAoB,EAAE,IAAkB,EAAiB,EAAE;QAC5F,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAE1C,qEAAqE;QACrE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,MAAM,UAAU,GAAI,GAA+B,CAAC,SAAS,IAAI,QAAQ,CAAC;QAC1E,MAAM,SAAS,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAE7E,qEAAqE;QACrE,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,GAAG,UAAU,IAAa;YAChC,qCAAqC;YACrC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;gBACrC,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC;oBACnB,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,8CAA8C;QAC9C,MAAM,qBAAqB,CACzB;YACE,SAAS;SACV,EACD,KAAK,IAAI,EAAE;YACT,IAAI,EAAE,CAAC;QACT,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { ParamValidator } from '../api.types';
6
6
  /** Makes validator optional - returns undefined if value missing */
7
- export declare function optional<T>(validator: ParamValidator<T>): ParamValidator<T | undefined>;
7
+ export declare function optional<T>(validator?: ParamValidator<T>): ParamValidator<T | undefined>;
8
8
  /** Operator that transforms string to T */
9
9
  export type ParamOperator<T> = (value: string) => T;
10
10
  /** Operator that transforms T to R */
@@ -9,7 +9,7 @@ export function optional(validator) {
9
9
  if (value === undefined || value === null || value === '') {
10
10
  return undefined;
11
11
  }
12
- return validator(value);
12
+ return validator ? validator(value) : value;
13
13
  };
14
14
  }
15
15
  export function transform(...operators) {
@@ -1 +1 @@
1
- {"version":3,"file":"type-validators.js","sourceRoot":"","sources":["../../../src/utils/type-validators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type-validators.js","sourceRoot":"","sources":["../../../src/utils/type-validators.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishka/express",
3
- "version": "0.9.23",
3
+ "version": "0.9.25",
4
4
  "description": "Express.js extension with built-in validation, and type safety",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -1,30 +0,0 @@
1
- import { DeleteEndpoint, GetEndpoint, PatchEndpoint, PostEndpoint, PutEndpoint, RequestContext } from './router';
2
- import { ExpressRouter } from './utils/express.utils';
3
- /**
4
- * Helper utility for organizing and mounting routes.
5
- * Provides a fluent interface for registering multiple handlers.
6
- */
7
- export declare class RouteTable {
8
- private readonly app;
9
- constructor(app: ExpressRouter);
10
- /** Register a GET endpoint. */
11
- get<Result>(path: string, endpoint: GetEndpoint<Result>): this;
12
- /** Register a GET endpoint with function shorthand. */
13
- get<Result>(path: string, run: (ctx: RequestContext) => Result | Promise<Result>): this;
14
- /** Register a POST endpoint. */
15
- post<Result = void>(path: string, endpoint: PostEndpoint<Result>): this;
16
- /** Register a POST endpoint with function shorthand. */
17
- post<Result = void>(path: string, run: (ctx: RequestContext) => Result | Promise<Result>): this;
18
- /** Register a PATCH endpoint. */
19
- patch<Result = void>(path: string, endpoint: PatchEndpoint<Result>): this;
20
- /** Register a PATCH endpoint with function shorthand. */
21
- patch<Result = void>(path: string, run: (ctx: RequestContext) => Result | Promise<Result>): this;
22
- /** Register a PUT endpoint. */
23
- put<Result = void>(path: string, endpoint: PutEndpoint<Result>): this;
24
- /** Register a PUT endpoint with function shorthand. */
25
- put<Result = void>(path: string, run: (ctx: RequestContext) => Result | Promise<Result>): this;
26
- /** Register a DELETE endpoint with a full endpoint object. */
27
- delete(path: string, endpoint: DeleteEndpoint): this;
28
- /** Register a DELETE endpoint with function shorthand. */
29
- delete(path: string, run: (ctx: RequestContext) => void | Promise<void>): this;
30
- }
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RouteTable = void 0;
4
- const router_1 = require("./router");
5
- /**
6
- * Helper utility for organizing and mounting routes.
7
- * Provides a fluent interface for registering multiple handlers.
8
- */
9
- class RouteTable {
10
- constructor(app) {
11
- this.app = app;
12
- }
13
- get(path, endpointOrRun) {
14
- const endpoint = typeof endpointOrRun === 'function' ? { run: endpointOrRun } : endpointOrRun;
15
- (0, router_1.mount)(this.app, { method: 'get', endpoint: endpoint, path });
16
- return this;
17
- }
18
- post(path, endpointOrRun) {
19
- const endpoint = typeof endpointOrRun === 'function' ? { run: endpointOrRun } : endpointOrRun;
20
- (0, router_1.mount)(this.app, { method: 'post', endpoint: endpoint, path });
21
- return this;
22
- }
23
- patch(path, endpointOrRun) {
24
- const endpoint = typeof endpointOrRun === 'function' ? { run: endpointOrRun } : endpointOrRun;
25
- (0, router_1.mount)(this.app, { method: 'patch', endpoint: endpoint, path });
26
- return this;
27
- }
28
- put(path, endpointOrRun) {
29
- const endpoint = typeof endpointOrRun === 'function' ? { run: endpointOrRun } : endpointOrRun;
30
- (0, router_1.mount)(this.app, { method: 'put', endpoint: endpoint, path });
31
- return this;
32
- }
33
- delete(path, endpointOrRun) {
34
- const endpoint = typeof endpointOrRun === 'function' ? { run: endpointOrRun } : endpointOrRun;
35
- (0, router_1.mount)(this.app, { method: 'delete', endpoint: endpoint, path });
36
- return this;
37
- }
38
- }
39
- exports.RouteTable = RouteTable;
40
- //# sourceMappingURL=route-table.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"route-table.js","sourceRoot":"","sources":["../../src/route-table.ts"],"names":[],"mappings":";;;AAAA,qCAAwH;AAGxH;;;GAGG;AACH,MAAa,UAAU;IACrB,YAA6B,GAAkB;QAAlB,QAAG,GAAH,GAAG,CAAe;IAAG,CAAC;IAQnD,GAAG,CACD,IAAY,EACZ,aAAwF;QAExF,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9F,IAAA,cAAK,EAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAgC,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,IAAI,CACF,IAAY,EACZ,aAAyF;QAEzF,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9F,IAAA,cAAK,EAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAiC,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,KAAK,CACH,IAAY,EACZ,aAA0F;QAE1F,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9F,IAAA,cAAK,EAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAkC,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,GAAG,CACD,IAAY,EACZ,aAAwF;QAExF,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9F,IAAA,cAAK,EAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAgC,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,MAAM,CAAC,IAAY,EAAE,aAA+E;QAClG,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9F,IAAA,cAAK,EAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA1ED,gCA0EC"}
@@ -1,86 +0,0 @@
1
- import { Assertion } from '@fishka/assertions';
2
- import { ParamValidator } from './api.types';
3
- import { AuthUser } from './auth/auth.types';
4
- import { ExpressRequest, ExpressResponse, ExpressRouter } from './utils/express.utils';
5
- /**
6
- * Generic middleware hook for endpoint execution.
7
- * Allows custom logic like transaction management, authorization checks, etc.
8
- */
9
- export type EndpointMiddleware<Context = RequestContext> = (run: () => Promise<unknown>, context: Context) => Promise<unknown>;
10
- /** Generic request context passed to all handlers. Database-agnostic and extensible. */
11
- export interface RequestContext {
12
- /** Express Request object. */
13
- req: ExpressRequest;
14
- /** Express Response object. */
15
- res: ExpressResponse;
16
- /** Authenticated user (if any). Populated by auth middleware. */
17
- authUser?: AuthUser;
18
- /**
19
- * Get and validate a path parameter.
20
- * @param name - Name of the path parameter
21
- * @param validator - Optional validator. If not provided, returns the raw string value.
22
- * @returns Validated value of type T (or string if no validator)
23
- * @throws {HttpError} 400 Bad Request if validation fails
24
- */
25
- path<T = string>(name: string, validator?: ParamValidator<T>): T;
26
- /**
27
- * Get and validate a query parameter.
28
- * @param name - Name of the query parameter
29
- * @param validator - Optional validator. If not provided, returns the raw string value or undefined.
30
- * @returns Validated value of type T.
31
- * @throws {HttpError} 400 Bad Request if validation fails
32
- */
33
- query<T = string>(name: string, validator?: ParamValidator<T>): T;
34
- /**
35
- * Get and validate the request body.
36
- * @param validator - Validator function or object assertion
37
- * @returns Validated body of type T
38
- * @throws {HttpError} 400 Bad Request if validation fails
39
- */
40
- body<T>(validator: Assertion<T>): T;
41
- /**
42
- * Generic state storage for middleware to attach data.
43
- * Allows middleware to pass information to handlers and other middleware.
44
- */
45
- state: Map<string, unknown>;
46
- }
47
- /** Base interface with common endpoint properties. */
48
- export interface EndpointBase<Result = unknown> {
49
- /** Optional middleware to execute before the handler. */
50
- middlewares?: Array<EndpointMiddleware>;
51
- /** Handler function. Can be sync or async. */
52
- run: (ctx: RequestContext) => Result | Promise<Result>;
53
- }
54
- /** Descriptor for GET list routes. */
55
- export type GetListEndpoint<ResultElementType> = EndpointBase<Array<ResultElementType>>;
56
- /** Descriptor for GET routes. */
57
- export type GetEndpoint<Result> = EndpointBase<Result>;
58
- /** Descriptor for POST routes. */
59
- export type PostEndpoint<Result = void> = EndpointBase<Result>;
60
- /** Same as POST. Used for full object updates. */
61
- export type PutEndpoint<Result = void> = EndpointBase<Result>;
62
- /** Same as PUT. While PUT is used for the whole object update, PATCH is used for a partial update. */
63
- export type PatchEndpoint<Result = void> = EndpointBase<Result>;
64
- /** Descriptor for DELETE routes. */
65
- export type DeleteEndpoint = EndpointBase<void>;
66
- /** Union type for all route registration info objects. */
67
- export type RouteRegistrationInfo = ({
68
- method: 'get';
69
- endpoint: GetEndpoint<unknown> | GetListEndpoint<unknown>;
70
- } | {
71
- method: 'post';
72
- endpoint: PostEndpoint<unknown>;
73
- } | {
74
- method: 'patch';
75
- endpoint: PatchEndpoint<unknown>;
76
- } | {
77
- method: 'put';
78
- endpoint: PutEndpoint<unknown>;
79
- } | {
80
- method: 'delete';
81
- endpoint: DeleteEndpoint;
82
- }) & {
83
- path: string;
84
- };
85
- /** Mounts a route with the given method, endpoint, and path. */
86
- export declare function mount(app: ExpressRouter, { method, endpoint, path }: RouteRegistrationInfo): void;