@salespark/route-utils 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -12
- package/dist/index.d.ts +24 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -16
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -21,10 +21,10 @@ Supports both **CommonJS** and **ESM** imports.
|
|
|
21
21
|
|
|
22
22
|
```ts
|
|
23
23
|
// ESM
|
|
24
|
-
import { wrapRoute, createResponder, makeRouteUtils, resolveRouteResponse,
|
|
24
|
+
import { wrapRoute, createResponder, makeRouteUtils, resolveRouteResponse, errorSanitizer } from "@salespark/route-utils";
|
|
25
25
|
|
|
26
26
|
// CommonJS
|
|
27
|
-
const { wrapRoute, createResponder, makeRouteUtils, resolveRouteResponse,
|
|
27
|
+
const { wrapRoute, createResponder, makeRouteUtils, resolveRouteResponse, errorSanitizer } = require("@salespark/route-utils");
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
---
|
|
@@ -58,9 +58,13 @@ All route handlers must return an object with the following structure:
|
|
|
58
58
|
### Status Rules
|
|
59
59
|
|
|
60
60
|
- ✅ `status: true` → Success: The HTTP response will send **only the `data` directly** (e.g., `res.json(data)` for 200, or no content for 204).
|
|
61
|
-
- ❌ `status: false` → Failure: The HTTP response will send **only
|
|
61
|
+
- ❌ `status: false` → Failure: The HTTP response will send **only a safe error payload** (e.g., `res.json({ error: "...", message: "..." })` for 400 or other codes).
|
|
62
62
|
- 🚨 Missing `status` → Treated as malformed response (`500` with basic error message).
|
|
63
63
|
|
|
64
|
+
#### Security note (failures)
|
|
65
|
+
|
|
66
|
+
When `status: false`, **the response never exposes sensitive error data**. If `data` is an `Error` instance, the payload is sanitized and **does not include stack traces or raw error objects**. By default, only a generic message is returned. You can explicitly allow `Error.message` when needed via `createResponder` options.
|
|
67
|
+
|
|
64
68
|
### Default HTTP Mapping
|
|
65
69
|
|
|
66
70
|
- Success with data → `200 OK` (sends data directly)
|
|
@@ -75,7 +79,7 @@ All route handlers must return an object with the following structure:
|
|
|
75
79
|
```ts
|
|
76
80
|
import { makeRouteUtils } from "@salespark/route-utils";
|
|
77
81
|
|
|
78
|
-
const { wrapRoute, createResponder, resolveRouteResponse,
|
|
82
|
+
const { wrapRoute, createResponder, resolveRouteResponse, errorSanitizer } = makeRouteUtils({
|
|
79
83
|
logger: console.error, // or rollbar.error, sentry.captureException, etc.
|
|
80
84
|
tagPrefix: "/routes/producers", // optional prefix for logs
|
|
81
85
|
});
|
|
@@ -91,7 +95,7 @@ const { wrapRoute, createResponder, resolveRouteResponse, errorSanatizer } = mak
|
|
|
91
95
|
- `wrapRoute`
|
|
92
96
|
- `createResponder`
|
|
93
97
|
- `resolveRouteResponse`
|
|
94
|
-
- `
|
|
98
|
+
- `errorSanitizer`
|
|
95
99
|
|
|
96
100
|
---
|
|
97
101
|
|
|
@@ -122,6 +126,12 @@ router.get("/achievements", validateAuth, async (req, res) => {
|
|
|
122
126
|
const respond = createResponder(res, { tag: "GET /achievements" });
|
|
123
127
|
await respond(() => ops.getProducerAchievements(res.locals.auth.producer_id));
|
|
124
128
|
});
|
|
129
|
+
|
|
130
|
+
// Allow exposing Error.message (optional override)
|
|
131
|
+
router.get("/debug", async (req, res) => {
|
|
132
|
+
const respond = createResponder(res, { allowErrorMessage: true });
|
|
133
|
+
await respond(() => ops.debugRoute());
|
|
134
|
+
});
|
|
125
135
|
```
|
|
126
136
|
|
|
127
137
|
---
|
|
@@ -133,16 +143,19 @@ const response = await ops.doSomething();
|
|
|
133
143
|
if (!resolveRouteResponse(res, response)) {
|
|
134
144
|
res.status(500).json({ status: false, error: "No response sent" });
|
|
135
145
|
}
|
|
146
|
+
|
|
147
|
+
// Optional: allow Error.message when response.data is an Error instance
|
|
148
|
+
resolveRouteResponse(res, response, { allowErrorMessage: true });
|
|
136
149
|
```
|
|
137
150
|
|
|
138
151
|
---
|
|
139
152
|
|
|
140
|
-
### `
|
|
153
|
+
### `errorSanitizer`
|
|
141
154
|
|
|
142
155
|
Sanitizes error output to avoid leaking sensitive data. It tries `error.reason`, then `error.message`, then falls back to a safe default.
|
|
143
156
|
|
|
144
157
|
```ts
|
|
145
|
-
const { createResponder,
|
|
158
|
+
const { createResponder, errorSanitizer } = require("@salespark/route-utils");
|
|
146
159
|
|
|
147
160
|
router.post("/something-awesome", async (req, res) => {
|
|
148
161
|
try {
|
|
@@ -154,7 +167,7 @@ router.post("/something-awesome", async (req, res) => {
|
|
|
154
167
|
|
|
155
168
|
// Error handling
|
|
156
169
|
} catch (error) {
|
|
157
|
-
res.status(500).send(
|
|
170
|
+
res.status(500).send(errorSanitizer(error)).end();
|
|
158
171
|
}
|
|
159
172
|
});
|
|
160
173
|
|
|
@@ -166,12 +179,12 @@ router.post("/something-awesome", async (req, res) => {
|
|
|
166
179
|
res.status(200).send(response).end();
|
|
167
180
|
})
|
|
168
181
|
.catch((err) => {
|
|
169
|
-
res.status(400).send(
|
|
182
|
+
res.status(400).send(errorSanitizer(err)).end();
|
|
170
183
|
});
|
|
171
184
|
|
|
172
185
|
// Error handling
|
|
173
186
|
} catch (error) {
|
|
174
|
-
res.status(500).send(
|
|
187
|
+
res.status(500).send(errorSanitizer(error)).end();
|
|
175
188
|
}
|
|
176
189
|
});
|
|
177
190
|
```
|
|
@@ -280,5 +293,5 @@ MIT © [SalesPark](https://salespark.io)
|
|
|
280
293
|
|
|
281
294
|
---
|
|
282
295
|
|
|
283
|
-
_Document version:
|
|
284
|
-
_Last update:
|
|
296
|
+
_Document version: 6_
|
|
297
|
+
_Last update: 28-03-2026_
|
package/dist/index.d.ts
CHANGED
|
@@ -55,7 +55,7 @@ export interface ApiResponse<T = unknown, M = unknown> {
|
|
|
55
55
|
* History:
|
|
56
56
|
* 18-03-2026: Created
|
|
57
57
|
****************************************************************************************************************/
|
|
58
|
-
export declare const
|
|
58
|
+
export declare const errorSanitizer: (error: unknown, options?: {
|
|
59
59
|
maxLength?: number;
|
|
60
60
|
allowErrorMessage?: boolean;
|
|
61
61
|
}) => {
|
|
@@ -66,7 +66,7 @@ export declare const errorSanatizer: (error: unknown, options?: {
|
|
|
66
66
|
* Builds helper functions bound to a default logger and tag prefix for consistent route handling.
|
|
67
67
|
* @param {LoggerFn} logger - Optional logger for reporting unexpected shapes or errors
|
|
68
68
|
* @param {string} tagPrefix - Optional prefix appended to generated log tags
|
|
69
|
-
* @returns {object} - Helper bundle: wrapRoute, createResponder, resolveRouteResponse,
|
|
69
|
+
* @returns {object} - Helper bundle: wrapRoute, createResponder, resolveRouteResponse, errorSanitizer
|
|
70
70
|
* History:
|
|
71
71
|
* 16-08-2025: Created
|
|
72
72
|
****************************************************************************************************************/
|
|
@@ -81,9 +81,12 @@ export declare const makeRouteUtils: ({ logger, tagPrefix, }?: {
|
|
|
81
81
|
createResponder: (res: ResLike, options?: {
|
|
82
82
|
tag?: string;
|
|
83
83
|
logger?: LoggerFn;
|
|
84
|
+
allowErrorMessage?: boolean;
|
|
84
85
|
}) => (workFn: () => Promise<ApiResponse> | ApiResponse) => Promise<boolean>;
|
|
85
|
-
resolveRouteResponse: (res: ResLike, response: any
|
|
86
|
-
|
|
86
|
+
resolveRouteResponse: (res: ResLike, response: any, options?: {
|
|
87
|
+
allowErrorMessage?: boolean;
|
|
88
|
+
}) => boolean;
|
|
89
|
+
errorSanitizer: (error: unknown, options?: {
|
|
87
90
|
maxLength?: number;
|
|
88
91
|
allowErrorMessage?: boolean;
|
|
89
92
|
}) => {
|
|
@@ -95,12 +98,17 @@ export declare const makeRouteUtils: ({ logger, tagPrefix, }?: {
|
|
|
95
98
|
* Normalizes a route response, applies headers/status, and prevents double sends when headers are already sent.
|
|
96
99
|
* @param {ResLike} res - Express-like response object
|
|
97
100
|
* @param {ApiResponse} response - ApiResponse payload with a required boolean status
|
|
101
|
+
* @param {object} options - Optional overrides for responder behavior
|
|
102
|
+
* @param {boolean} options.allowErrorMessage - Allow exposing Error.message when response.data is an Error
|
|
98
103
|
* @returns {boolean} - True if a response was sent; false when res is invalid
|
|
99
104
|
* History:
|
|
100
105
|
* 16-08-2025: Created
|
|
101
106
|
* 21-08-2025: Changed response method to directly use response.data
|
|
107
|
+
* 27-03-2026: Implemented allowErrorMessage option for error responses
|
|
102
108
|
****************************************************************************************************************/
|
|
103
|
-
export declare const resolveRouteResponse: (res: ResLike, response: any
|
|
109
|
+
export declare const resolveRouteResponse: (res: ResLike, response: any, options?: {
|
|
110
|
+
allowErrorMessage?: boolean;
|
|
111
|
+
}) => boolean;
|
|
104
112
|
export declare const wrapRoute: (handler: (req: any, res: ResLike) => Promise<ApiResponse> | ApiResponse, options?: {
|
|
105
113
|
tag?: string;
|
|
106
114
|
logger?: LoggerFn;
|
|
@@ -108,6 +116,7 @@ export declare const wrapRoute: (handler: (req: any, res: ResLike) => Promise<Ap
|
|
|
108
116
|
export declare const createResponder: (res: ResLike, options?: {
|
|
109
117
|
tag?: string;
|
|
110
118
|
logger?: LoggerFn;
|
|
119
|
+
allowErrorMessage?: boolean;
|
|
111
120
|
}) => (workFn: () => Promise<ApiResponse> | ApiResponse) => Promise<boolean>;
|
|
112
121
|
/** Default export bundle (optional convenience) */
|
|
113
122
|
declare const _default: {
|
|
@@ -122,9 +131,12 @@ declare const _default: {
|
|
|
122
131
|
createResponder: (res: ResLike, options?: {
|
|
123
132
|
tag?: string;
|
|
124
133
|
logger?: LoggerFn;
|
|
134
|
+
allowErrorMessage?: boolean;
|
|
125
135
|
}) => (workFn: () => Promise<ApiResponse> | ApiResponse) => Promise<boolean>;
|
|
126
|
-
resolveRouteResponse: (res: ResLike, response: any
|
|
127
|
-
|
|
136
|
+
resolveRouteResponse: (res: ResLike, response: any, options?: {
|
|
137
|
+
allowErrorMessage?: boolean;
|
|
138
|
+
}) => boolean;
|
|
139
|
+
errorSanitizer: (error: unknown, options?: {
|
|
128
140
|
maxLength?: number;
|
|
129
141
|
allowErrorMessage?: boolean;
|
|
130
142
|
}) => {
|
|
@@ -138,14 +150,17 @@ declare const _default: {
|
|
|
138
150
|
createResponder: (res: ResLike, options?: {
|
|
139
151
|
tag?: string;
|
|
140
152
|
logger?: LoggerFn;
|
|
153
|
+
allowErrorMessage?: boolean;
|
|
141
154
|
}) => (workFn: () => Promise<ApiResponse> | ApiResponse) => Promise<boolean>;
|
|
142
|
-
|
|
155
|
+
errorSanitizer: (error: unknown, options?: {
|
|
143
156
|
maxLength?: number;
|
|
144
157
|
allowErrorMessage?: boolean;
|
|
145
158
|
}) => {
|
|
146
159
|
error: string;
|
|
147
160
|
};
|
|
148
|
-
resolveRouteResponse: (res: ResLike, response: any
|
|
161
|
+
resolveRouteResponse: (res: ResLike, response: any, options?: {
|
|
162
|
+
allowErrorMessage?: boolean;
|
|
163
|
+
}) => boolean;
|
|
149
164
|
};
|
|
150
165
|
export default _default;
|
|
151
166
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;kHAmBkH;AAElH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -20,9 +20,30 @@
|
|
|
20
20
|
* 16-08-2025: Initial version
|
|
21
21
|
****************************************************************************************************************/
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.createResponder = exports.wrapRoute = exports.resolveRouteResponse = exports.makeRouteUtils = exports.
|
|
23
|
+
exports.createResponder = exports.wrapRoute = exports.resolveRouteResponse = exports.makeRouteUtils = exports.errorSanitizer = void 0;
|
|
24
24
|
/** No-op logger (silent). Used when no logger function is provided. */
|
|
25
25
|
const noopLogger = () => { };
|
|
26
|
+
/****************************************************************************************************************
|
|
27
|
+
* ##: Detect error-like objects
|
|
28
|
+
* Identifies plain objects that look like serialized Errors (stack/name/message).
|
|
29
|
+
* @param {unknown} value - Value to inspect
|
|
30
|
+
* @returns {boolean} - True when the value looks like an Error
|
|
31
|
+
* History:
|
|
32
|
+
* 28-03-2026: Created
|
|
33
|
+
****************************************************************************************************************/
|
|
34
|
+
const isErrorLike = (value) => {
|
|
35
|
+
if (!value || typeof value !== "object")
|
|
36
|
+
return false;
|
|
37
|
+
const err = value;
|
|
38
|
+
const hasStack = typeof err.stack === "string" && err.stack.trim();
|
|
39
|
+
if (hasStack)
|
|
40
|
+
return true;
|
|
41
|
+
const hasName = typeof err.name === "string" && err.name.trim();
|
|
42
|
+
const hasMessage = typeof err.message === "string" && err.message.trim();
|
|
43
|
+
if (hasName && hasMessage)
|
|
44
|
+
return /Error$/.test(err.name);
|
|
45
|
+
return false;
|
|
46
|
+
};
|
|
26
47
|
/****************************************************************************************************************
|
|
27
48
|
* ##: Read error message for sanitizer
|
|
28
49
|
* Extracts a safe message from error input, preferring string reason or message.
|
|
@@ -31,8 +52,11 @@ const noopLogger = () => { };
|
|
|
31
52
|
* @returns {string | undefined} - Safe message string or undefined when no safe message is available
|
|
32
53
|
* History:
|
|
33
54
|
* 18-03-2026: Created
|
|
55
|
+
* 28-03-2026: Updated to respect allowErrorMessage flag for Error instances
|
|
34
56
|
****************************************************************************************************************/
|
|
35
57
|
const readErrorMessage = (error, allowErrorMessage) => {
|
|
58
|
+
if (!allowErrorMessage && isErrorLike(error))
|
|
59
|
+
return undefined;
|
|
36
60
|
if (error instanceof Error)
|
|
37
61
|
return allowErrorMessage ? error.message : undefined;
|
|
38
62
|
if (typeof error === "string")
|
|
@@ -74,19 +98,50 @@ const sanitizeMessage = (message, maxLength) => {
|
|
|
74
98
|
* History:
|
|
75
99
|
* 18-03-2026: Created
|
|
76
100
|
****************************************************************************************************************/
|
|
77
|
-
const
|
|
101
|
+
const errorSanitizer = (error, options = {}) => {
|
|
78
102
|
const allowErrorMessage = options.allowErrorMessage === true;
|
|
79
103
|
const maxLength = Number.isFinite(options.maxLength) && options.maxLength > 0 ? Math.floor(options.maxLength) : 500;
|
|
80
104
|
const message = readErrorMessage(error, allowErrorMessage);
|
|
81
105
|
return { error: message ? sanitizeMessage(message, maxLength) : "Unexpected error" };
|
|
82
106
|
};
|
|
83
|
-
exports.
|
|
107
|
+
exports.errorSanitizer = errorSanitizer;
|
|
108
|
+
/****************************************************************************************************************
|
|
109
|
+
* ##: Build safe error response body
|
|
110
|
+
* Avoids leaking Error details by default, with an optional override to expose Error.message.
|
|
111
|
+
* @param {unknown} raw - Raw error payload returned by the handler
|
|
112
|
+
* @param {object} options - Optional overrides for sanitizer behavior
|
|
113
|
+
* @param {number} options.maxLength - Maximum length for the output message
|
|
114
|
+
* @param {boolean} options.allowErrorMessage - Allow exposing Error.message when raw is an Error instance
|
|
115
|
+
* @returns {{ error: string; message?: string }} - Safe error response payload
|
|
116
|
+
* History:
|
|
117
|
+
* 27-03-2026: Created
|
|
118
|
+
****************************************************************************************************************/
|
|
119
|
+
const buildErrorBody = (raw, options = {}) => {
|
|
120
|
+
const maxLength = Number.isFinite(options.maxLength) && options.maxLength > 0 ? Math.floor(options.maxLength) : 500;
|
|
121
|
+
if (raw instanceof Error || isErrorLike(raw)) {
|
|
122
|
+
const safeMessage = options.allowErrorMessage ? readErrorMessage(raw, true) : undefined;
|
|
123
|
+
return { error: "UnexpectedError", message: safeMessage ? sanitizeMessage(safeMessage, maxLength) : "Unexpected error" };
|
|
124
|
+
}
|
|
125
|
+
if (raw && typeof raw === "object") {
|
|
126
|
+
const err = raw;
|
|
127
|
+
const errorValue = typeof err.error === "string" && err.error.trim() ? err.error : undefined;
|
|
128
|
+
const messageValue = typeof err.message === "string" && err.message.trim() ? err.message : undefined;
|
|
129
|
+
if (errorValue || messageValue) {
|
|
130
|
+
return {
|
|
131
|
+
...(errorValue ? { error: sanitizeMessage(errorValue, maxLength) } : {}),
|
|
132
|
+
...(messageValue ? { message: sanitizeMessage(messageValue, maxLength) } : {}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const message = typeof raw === "string" ? raw : "Request failed";
|
|
137
|
+
return { error: "RequestFailed", message: sanitizeMessage(message, maxLength) };
|
|
138
|
+
};
|
|
84
139
|
/****************************************************************************************************************
|
|
85
140
|
* ##: Create route utility helpers with defaults
|
|
86
141
|
* Builds helper functions bound to a default logger and tag prefix for consistent route handling.
|
|
87
142
|
* @param {LoggerFn} logger - Optional logger for reporting unexpected shapes or errors
|
|
88
143
|
* @param {string} tagPrefix - Optional prefix appended to generated log tags
|
|
89
|
-
* @returns {object} - Helper bundle: wrapRoute, createResponder, resolveRouteResponse,
|
|
144
|
+
* @returns {object} - Helper bundle: wrapRoute, createResponder, resolveRouteResponse, errorSanitizer
|
|
90
145
|
* History:
|
|
91
146
|
* 16-08-2025: Created
|
|
92
147
|
****************************************************************************************************************/
|
|
@@ -133,14 +188,16 @@ const makeRouteUtils = ({ logger = noopLogger, tagPrefix = "", } = {}) => {
|
|
|
133
188
|
* @returns {Function} - Work executor: (workFn) => Promise<true>
|
|
134
189
|
* History:
|
|
135
190
|
* 16-08-2025: Created
|
|
191
|
+
* 27-03-2026: Implemented allowErrorMessage option for in-route responders
|
|
136
192
|
****************************************************************************************************************/
|
|
137
193
|
const createResponder = (res, options = {}) => {
|
|
138
194
|
const tagBase = options.tag;
|
|
139
195
|
const routeLogger = typeof options.logger === "function" ? options.logger : logger;
|
|
196
|
+
const allowErrorMessage = options.allowErrorMessage === true;
|
|
140
197
|
return async (workFn) => {
|
|
141
198
|
try {
|
|
142
199
|
const response = await workFn();
|
|
143
|
-
if ((0, exports.resolveRouteResponse)(res, response))
|
|
200
|
+
if ((0, exports.resolveRouteResponse)(res, response, { allowErrorMessage }))
|
|
144
201
|
return true; // Responded successfully
|
|
145
202
|
// Unexpected shape
|
|
146
203
|
routeLogger({ message: "Unexpected response shape", response }, tagBase || "createResponder");
|
|
@@ -159,7 +216,7 @@ const makeRouteUtils = ({ logger = noopLogger, tagPrefix = "", } = {}) => {
|
|
|
159
216
|
}
|
|
160
217
|
};
|
|
161
218
|
};
|
|
162
|
-
return { wrapRoute, createResponder, resolveRouteResponse: exports.resolveRouteResponse,
|
|
219
|
+
return { wrapRoute, createResponder, resolveRouteResponse: exports.resolveRouteResponse, errorSanitizer: exports.errorSanitizer };
|
|
163
220
|
};
|
|
164
221
|
exports.makeRouteUtils = makeRouteUtils;
|
|
165
222
|
/****************************************************************************************************************
|
|
@@ -167,12 +224,15 @@ exports.makeRouteUtils = makeRouteUtils;
|
|
|
167
224
|
* Normalizes a route response, applies headers/status, and prevents double sends when headers are already sent.
|
|
168
225
|
* @param {ResLike} res - Express-like response object
|
|
169
226
|
* @param {ApiResponse} response - ApiResponse payload with a required boolean status
|
|
227
|
+
* @param {object} options - Optional overrides for responder behavior
|
|
228
|
+
* @param {boolean} options.allowErrorMessage - Allow exposing Error.message when response.data is an Error
|
|
170
229
|
* @returns {boolean} - True if a response was sent; false when res is invalid
|
|
171
230
|
* History:
|
|
172
231
|
* 16-08-2025: Created
|
|
173
232
|
* 21-08-2025: Changed response method to directly use response.data
|
|
233
|
+
* 27-03-2026: Implemented allowErrorMessage option for error responses
|
|
174
234
|
****************************************************************************************************************/
|
|
175
|
-
const resolveRouteResponse = (res, response) => {
|
|
235
|
+
const resolveRouteResponse = (res, response, options = {}) => {
|
|
176
236
|
try {
|
|
177
237
|
// Guard: ensure `res` looks like a valid Express-like response object
|
|
178
238
|
if (!res || typeof res.status !== "function" || typeof res.send !== "function")
|
|
@@ -220,14 +280,7 @@ const resolveRouteResponse = (res, response) => {
|
|
|
220
280
|
// Error path
|
|
221
281
|
if (isFail) {
|
|
222
282
|
const raw = response.data;
|
|
223
|
-
const errBody = raw
|
|
224
|
-
? { error: raw.name || "Error", message: raw.message }
|
|
225
|
-
: raw && typeof raw === "object"
|
|
226
|
-
? {
|
|
227
|
-
...(raw.error ? { error: raw.error } : {}),
|
|
228
|
-
...(raw.message ? { message: raw.message } : {}),
|
|
229
|
-
}
|
|
230
|
-
: { error: "RequestFailed", message: typeof raw === "string" ? raw : "Request failed" };
|
|
283
|
+
const errBody = buildErrorBody(raw, { allowErrorMessage: options.allowErrorMessage });
|
|
231
284
|
res.status(http).json(errBody);
|
|
232
285
|
return true;
|
|
233
286
|
}
|
|
@@ -261,7 +314,7 @@ exports.default = {
|
|
|
261
314
|
makeRouteUtils: exports.makeRouteUtils,
|
|
262
315
|
wrapRoute: exports.wrapRoute,
|
|
263
316
|
createResponder: exports.createResponder,
|
|
264
|
-
|
|
317
|
+
errorSanitizer: exports.errorSanitizer,
|
|
265
318
|
resolveRouteResponse: exports.resolveRouteResponse,
|
|
266
319
|
};
|
|
267
320
|
//# 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;;;;;;;;;;;;;;;;;;;kHAmBkH;;;AAgClH,uEAAuE;AACvE,MAAM,UAAU,GAAa,GAAG,EAAE,GAAE,CAAC,CAAC;AAEtC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salespark/route-utils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Vendor-agnostic helpers for Express route handlers with normalized responses and optional logging.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"repository": {
|
|
28
28
|
"type": "git",
|
|
29
|
-
"url": "https://github.com/salespark
|
|
29
|
+
"url": "https://github.com/FBlade/salespark-route-utils.git"
|
|
30
30
|
},
|
|
31
31
|
"publishConfig": {
|
|
32
32
|
"access": "public"
|