@fjell/express-router 4.4.53 → 4.4.55
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/MIGRATION_v3.md +255 -0
- package/README.md +26 -0
- package/dist/CItemRouter.d.ts.map +1 -1
- package/dist/CItemRouter.js +35 -30
- package/dist/CItemRouter.js.map +2 -2
- package/dist/Instance.d.ts +3 -3
- package/dist/Instance.d.ts.map +1 -1
- package/dist/Instance.js.map +2 -2
- package/dist/InstanceFactory.d.ts +1 -1
- package/dist/InstanceFactory.d.ts.map +1 -1
- package/dist/InstanceFactory.js.map +2 -2
- package/dist/ItemRouter.d.ts +11 -1
- package/dist/ItemRouter.d.ts.map +1 -1
- package/dist/ItemRouter.js +143 -158
- package/dist/ItemRouter.js.map +3 -3
- package/dist/PItemRouter.d.ts.map +1 -1
- package/dist/PItemRouter.js +36 -44
- package/dist/PItemRouter.js.map +2 -2
- package/dist/createApp.d.ts +13 -0
- package/dist/createApp.d.ts.map +1 -0
- package/dist/createApp.js +27 -0
- package/dist/createApp.js.map +7 -0
- package/dist/errorHandler.d.ts +52 -0
- package/dist/errorHandler.d.ts.map +1 -0
- package/dist/errorHandler.js +220 -0
- package/dist/errorHandler.js.map +7 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +2 -2
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +5 -5
- package/dist/Operations.d.ts +0 -2
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -1
- /package/dist/{Operations.js.map → types.js.map} +0 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { isActionError } from "@fjell/core";
|
|
2
|
+
import LibLogger from "./logger.js";
|
|
3
|
+
const logger = LibLogger.get("express-router", "errorHandler");
|
|
4
|
+
class FjellErrorHandler {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
this.options = {
|
|
8
|
+
includeStackTrace: process.env.NODE_ENV === "development",
|
|
9
|
+
logErrors: true,
|
|
10
|
+
...options
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get appropriate HTTP status code for error
|
|
15
|
+
*/
|
|
16
|
+
getHttpStatusForError(code) {
|
|
17
|
+
const statusMap = {
|
|
18
|
+
"VALIDATION_ERROR": 400,
|
|
19
|
+
"NOT_FOUND": 404,
|
|
20
|
+
"PERMISSION_ERROR": 403,
|
|
21
|
+
"UNAUTHORIZED": 401,
|
|
22
|
+
"BUSINESS_LOGIC_ERROR": 422,
|
|
23
|
+
"ACTION_NOT_FOUND": 404,
|
|
24
|
+
"DUPLICATE_ERROR": 409,
|
|
25
|
+
"RATE_LIMIT_EXCEEDED": 429,
|
|
26
|
+
"INTERNAL_ERROR": 500
|
|
27
|
+
};
|
|
28
|
+
return statusMap[code] || 500;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert generic errors to ErrorInfo structure
|
|
32
|
+
*/
|
|
33
|
+
convertToErrorInfo(error, req) {
|
|
34
|
+
if (this.options.customErrorMapper) {
|
|
35
|
+
const mapped = this.options.customErrorMapper(error);
|
|
36
|
+
if (mapped) {
|
|
37
|
+
return this.enhanceErrorInfo(mapped, req);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (error.status || error.statusCode) {
|
|
41
|
+
const status = error.status || error.statusCode;
|
|
42
|
+
const technical2 = {
|
|
43
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
44
|
+
requestId: this.getRequestId(req)
|
|
45
|
+
};
|
|
46
|
+
if (this.options.includeStackTrace && error.stack) {
|
|
47
|
+
technical2.stackTrace = error.stack;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
code: this.getErrorCodeForStatus(status),
|
|
51
|
+
message: error.message || this.getDefaultMessageForStatus(status),
|
|
52
|
+
operation: {
|
|
53
|
+
type: this.getOperationTypeFromRequest(req),
|
|
54
|
+
name: req.path,
|
|
55
|
+
params: { ...req.body, ...req.query, ...req.params }
|
|
56
|
+
},
|
|
57
|
+
context: {
|
|
58
|
+
itemType: this.extractItemType(req.path)
|
|
59
|
+
},
|
|
60
|
+
technical: technical2
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const technical = {
|
|
64
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
65
|
+
requestId: this.getRequestId(req)
|
|
66
|
+
};
|
|
67
|
+
if (this.options.includeStackTrace && error.stack) {
|
|
68
|
+
technical.stackTrace = error.stack;
|
|
69
|
+
}
|
|
70
|
+
if (error.cause) {
|
|
71
|
+
technical.cause = error.cause;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
code: "INTERNAL_ERROR",
|
|
75
|
+
message: error.message || "An unexpected error occurred",
|
|
76
|
+
operation: {
|
|
77
|
+
type: this.getOperationTypeFromRequest(req),
|
|
78
|
+
name: req.path,
|
|
79
|
+
params: { ...req.body, ...req.query, ...req.params }
|
|
80
|
+
},
|
|
81
|
+
context: {
|
|
82
|
+
itemType: this.extractItemType(req.path)
|
|
83
|
+
},
|
|
84
|
+
technical
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Enhance error info with request context
|
|
89
|
+
*/
|
|
90
|
+
enhanceErrorInfo(errorInfo, req) {
|
|
91
|
+
const technical = {
|
|
92
|
+
timestamp: errorInfo.technical?.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
|
|
93
|
+
requestId: this.getRequestId(req)
|
|
94
|
+
};
|
|
95
|
+
if (this.options.includeStackTrace && errorInfo.technical?.stackTrace) {
|
|
96
|
+
technical.stackTrace = errorInfo.technical.stackTrace;
|
|
97
|
+
}
|
|
98
|
+
if (errorInfo.technical?.cause) {
|
|
99
|
+
technical.cause = errorInfo.technical.cause;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
...errorInfo,
|
|
103
|
+
technical
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Extract operation type from request
|
|
108
|
+
*/
|
|
109
|
+
getOperationTypeFromRequest(req) {
|
|
110
|
+
const path = req.path.toLowerCase();
|
|
111
|
+
const method = req.method.toLowerCase();
|
|
112
|
+
if (path.includes("/action/")) return "action";
|
|
113
|
+
if (path.includes("/allaction/")) return "allAction";
|
|
114
|
+
if (path.includes("/facet/")) return "facet";
|
|
115
|
+
if (path.includes("/allfacet/")) return "allFacet";
|
|
116
|
+
if (path.includes("/find/")) return method === "get" ? "findOne" : "find";
|
|
117
|
+
if (path.includes("/upsert")) return "upsert";
|
|
118
|
+
switch (method) {
|
|
119
|
+
case "get":
|
|
120
|
+
return path.match(/\/\d+$/) ? "get" : "all";
|
|
121
|
+
case "post":
|
|
122
|
+
return "create";
|
|
123
|
+
case "put":
|
|
124
|
+
case "patch":
|
|
125
|
+
return "update";
|
|
126
|
+
case "delete":
|
|
127
|
+
return "remove";
|
|
128
|
+
default:
|
|
129
|
+
return "get";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Extract item type from path
|
|
134
|
+
*/
|
|
135
|
+
extractItemType(path) {
|
|
136
|
+
const segments = path.split("/").filter((s) => s && !s.match(/^\d+$/));
|
|
137
|
+
return segments[segments.length - 1] || "unknown";
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get request ID from headers or generate one
|
|
141
|
+
*/
|
|
142
|
+
getRequestId(req) {
|
|
143
|
+
return req.headers["x-request-id"] || req.headers["x-trace-id"] || `req-${Date.now()}`;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get error code for HTTP status
|
|
147
|
+
*/
|
|
148
|
+
getErrorCodeForStatus(status) {
|
|
149
|
+
const codeMap = {
|
|
150
|
+
400: "VALIDATION_ERROR",
|
|
151
|
+
401: "UNAUTHORIZED",
|
|
152
|
+
403: "PERMISSION_ERROR",
|
|
153
|
+
404: "NOT_FOUND",
|
|
154
|
+
409: "DUPLICATE_ERROR",
|
|
155
|
+
422: "BUSINESS_LOGIC_ERROR",
|
|
156
|
+
429: "RATE_LIMIT_EXCEEDED",
|
|
157
|
+
500: "INTERNAL_ERROR"
|
|
158
|
+
};
|
|
159
|
+
return codeMap[status] || "INTERNAL_ERROR";
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get default message for HTTP status
|
|
163
|
+
*/
|
|
164
|
+
getDefaultMessageForStatus(status) {
|
|
165
|
+
const messageMap = {
|
|
166
|
+
400: "Bad Request",
|
|
167
|
+
401: "Unauthorized",
|
|
168
|
+
403: "Forbidden",
|
|
169
|
+
404: "Not Found",
|
|
170
|
+
409: "Conflict",
|
|
171
|
+
422: "Unprocessable Entity",
|
|
172
|
+
429: "Too Many Requests",
|
|
173
|
+
500: "Internal Server Error"
|
|
174
|
+
};
|
|
175
|
+
return messageMap[status] || "Error";
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Express error handler middleware
|
|
179
|
+
*/
|
|
180
|
+
handle = (err, req, res, next) => {
|
|
181
|
+
if (res.headersSent) {
|
|
182
|
+
return next(err);
|
|
183
|
+
}
|
|
184
|
+
let errorInfo;
|
|
185
|
+
let statusCode;
|
|
186
|
+
if (isActionError(err)) {
|
|
187
|
+
errorInfo = this.enhanceErrorInfo(err.errorInfo, req);
|
|
188
|
+
statusCode = this.getHttpStatusForError(errorInfo.code);
|
|
189
|
+
} else {
|
|
190
|
+
errorInfo = this.convertToErrorInfo(err, req);
|
|
191
|
+
statusCode = this.getHttpStatusForError(errorInfo.code);
|
|
192
|
+
}
|
|
193
|
+
if (this.options.logErrors) {
|
|
194
|
+
logger.error("Request error", {
|
|
195
|
+
errorInfo,
|
|
196
|
+
request: {
|
|
197
|
+
method: req.method,
|
|
198
|
+
path: req.path,
|
|
199
|
+
headers: req.headers,
|
|
200
|
+
body: req.body,
|
|
201
|
+
query: req.query,
|
|
202
|
+
params: req.params
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
res.status(statusCode).json({
|
|
207
|
+
success: false,
|
|
208
|
+
error: errorInfo
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function createErrorHandler(options) {
|
|
213
|
+
const handler = new FjellErrorHandler(options);
|
|
214
|
+
return handler.handle;
|
|
215
|
+
}
|
|
216
|
+
export {
|
|
217
|
+
FjellErrorHandler,
|
|
218
|
+
createErrorHandler
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/errorHandler.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextFunction, Request, Response } from 'express';\nimport { ErrorInfo, isActionError } from '@fjell/core';\nimport LibLogger from './logger.js';\n\nconst logger = LibLogger.get('express-router', 'errorHandler');\n\nexport interface ErrorHandlerOptions {\n includeStackTrace?: boolean;\n logErrors?: boolean;\n customErrorMapper?: (error: any) => ErrorInfo | null;\n}\n\nexport class FjellErrorHandler {\n constructor(private options: ErrorHandlerOptions = {}) {\n this.options = {\n includeStackTrace: process.env.NODE_ENV === 'development',\n logErrors: true,\n ...options\n };\n }\n\n /**\n * Get appropriate HTTP status code for error\n */\n private getHttpStatusForError(code: string): number {\n const statusMap: Record<string, number> = {\n 'VALIDATION_ERROR': 400,\n 'NOT_FOUND': 404,\n 'PERMISSION_ERROR': 403,\n 'UNAUTHORIZED': 401,\n 'BUSINESS_LOGIC_ERROR': 422,\n 'ACTION_NOT_FOUND': 404,\n 'DUPLICATE_ERROR': 409,\n 'RATE_LIMIT_EXCEEDED': 429,\n 'INTERNAL_ERROR': 500,\n };\n\n return statusMap[code] || 500;\n }\n\n /**\n * Convert generic errors to ErrorInfo structure\n */\n private convertToErrorInfo(error: any, req: Request): ErrorInfo {\n // Check if custom mapper can handle this error\n if (this.options.customErrorMapper) {\n const mapped = this.options.customErrorMapper(error);\n if (mapped) {\n return this.enhanceErrorInfo(mapped, req);\n }\n }\n\n // Handle common HTTP errors\n if (error.status || error.statusCode) {\n const status = error.status || error.statusCode;\n const technical: ErrorInfo['technical'] = {\n timestamp: new Date().toISOString(),\n requestId: this.getRequestId(req)\n };\n \n if (this.options.includeStackTrace && error.stack) {\n technical.stackTrace = error.stack;\n }\n\n return {\n code: this.getErrorCodeForStatus(status),\n message: error.message || this.getDefaultMessageForStatus(status),\n operation: {\n type: this.getOperationTypeFromRequest(req),\n name: req.path,\n params: { ...req.body, ...req.query, ...req.params }\n },\n context: {\n itemType: this.extractItemType(req.path)\n },\n technical\n };\n }\n\n // Default error structure\n const technical: ErrorInfo['technical'] = {\n timestamp: new Date().toISOString(),\n requestId: this.getRequestId(req)\n };\n \n if (this.options.includeStackTrace && error.stack) {\n technical.stackTrace = error.stack;\n }\n \n if (error.cause) {\n technical.cause = error.cause;\n }\n\n return {\n code: 'INTERNAL_ERROR',\n message: error.message || 'An unexpected error occurred',\n operation: {\n type: this.getOperationTypeFromRequest(req),\n name: req.path,\n params: { ...req.body, ...req.query, ...req.params }\n },\n context: {\n itemType: this.extractItemType(req.path)\n },\n technical\n };\n }\n\n /**\n * Enhance error info with request context\n */\n private enhanceErrorInfo(errorInfo: ErrorInfo, req: Request): ErrorInfo {\n const technical: ErrorInfo['technical'] = {\n timestamp: errorInfo.technical?.timestamp || new Date().toISOString(),\n requestId: this.getRequestId(req)\n };\n\n if (this.options.includeStackTrace && errorInfo.technical?.stackTrace) {\n technical.stackTrace = errorInfo.technical.stackTrace;\n }\n\n if (errorInfo.technical?.cause) {\n technical.cause = errorInfo.technical.cause;\n }\n\n return {\n ...errorInfo,\n technical\n };\n }\n\n /**\n * Extract operation type from request\n */\n private getOperationTypeFromRequest(req: Request): ErrorInfo['operation']['type'] {\n const path = req.path.toLowerCase();\n const method = req.method.toLowerCase();\n\n // Pattern matching for operation types\n if (path.includes('/action/')) return 'action';\n if (path.includes('/allaction/')) return 'allAction';\n if (path.includes('/facet/')) return 'facet';\n if (path.includes('/allfacet/')) return 'allFacet';\n if (path.includes('/find/')) return method === 'get' ? 'findOne' : 'find';\n if (path.includes('/upsert')) return 'upsert';\n \n // Method-based detection\n switch (method) {\n case 'get':\n return path.match(/\\/\\d+$/) ? 'get' : 'all';\n case 'post':\n return 'create';\n case 'put':\n case 'patch':\n return 'update';\n case 'delete':\n return 'remove';\n default:\n return 'get';\n }\n }\n\n /**\n * Extract item type from path\n */\n private extractItemType(path: string): string {\n const segments = path.split('/').filter(s => s && !s.match(/^\\d+$/));\n return segments[segments.length - 1] || 'unknown';\n }\n\n /**\n * Get request ID from headers or generate one\n */\n private getRequestId(req: Request): string {\n return (req.headers['x-request-id'] ||\n req.headers['x-trace-id'] ||\n `req-${Date.now()}`) as string;\n }\n\n /**\n * Get error code for HTTP status\n */\n private getErrorCodeForStatus(status: number): string {\n const codeMap: Record<number, string> = {\n 400: 'VALIDATION_ERROR',\n 401: 'UNAUTHORIZED',\n 403: 'PERMISSION_ERROR',\n 404: 'NOT_FOUND',\n 409: 'DUPLICATE_ERROR',\n 422: 'BUSINESS_LOGIC_ERROR',\n 429: 'RATE_LIMIT_EXCEEDED',\n 500: 'INTERNAL_ERROR',\n };\n return codeMap[status] || 'INTERNAL_ERROR';\n }\n\n /**\n * Get default message for HTTP status\n */\n private getDefaultMessageForStatus(status: number): string {\n const messageMap: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 409: 'Conflict',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n };\n return messageMap[status] || 'Error';\n }\n\n /**\n * Express error handler middleware\n */\n handle = (err: any, req: Request, res: Response, next: NextFunction): void => {\n if (res.headersSent) {\n return next(err);\n }\n\n let errorInfo: ErrorInfo;\n let statusCode: number;\n\n if (isActionError(err)) {\n // This is already a structured Fjell error\n errorInfo = this.enhanceErrorInfo(err.errorInfo, req);\n statusCode = this.getHttpStatusForError(errorInfo.code);\n } else {\n // Convert to ErrorInfo structure\n errorInfo = this.convertToErrorInfo(err, req);\n statusCode = this.getHttpStatusForError(errorInfo.code);\n }\n\n // Log the error if configured\n if (this.options.logErrors) {\n logger.error('Request error', {\n errorInfo,\n request: {\n method: req.method,\n path: req.path,\n headers: req.headers,\n body: req.body,\n query: req.query,\n params: req.params\n }\n });\n }\n\n // Send structured error response\n res.status(statusCode).json({\n success: false,\n error: errorInfo\n });\n };\n}\n\n/**\n * Export convenience function\n */\nexport function createErrorHandler(options?: ErrorHandlerOptions) {\n const handler = new FjellErrorHandler(options);\n return handler.handle;\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["technical"]
|
|
7
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,5 +4,8 @@ export * from "./PItemRouter.js";
|
|
|
4
4
|
export * from './Instance.js';
|
|
5
5
|
export * from './InstanceFactory.js';
|
|
6
6
|
export * from './Registry.js';
|
|
7
|
-
export
|
|
7
|
+
export * from './errorHandler.js';
|
|
8
|
+
export * from './types.js';
|
|
9
|
+
export * from './createApp.js';
|
|
10
|
+
export type { Operations } from '@fjell/lib';
|
|
8
11
|
//# 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,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAG9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAG/B,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,4 +4,7 @@ export * from "./PItemRouter.js";
|
|
|
4
4
|
export * from "./Instance.js";
|
|
5
5
|
export * from "./InstanceFactory.js";
|
|
6
6
|
export * from "./Registry.js";
|
|
7
|
+
export * from "./errorHandler.js";
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
export * from "./createApp.js";
|
|
7
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * from \"./ItemRouter.js\";\nexport * from \"./CItemRouter.js\";\nexport * from \"./PItemRouter.js\";\n\n// Registry components\nexport * from './Instance.js';\nexport * from './InstanceFactory.js';\nexport * from './Registry.js';\nexport type { Operations } from '
|
|
5
|
-
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
4
|
+
"sourcesContent": ["export * from \"./ItemRouter.js\";\nexport * from \"./CItemRouter.js\";\nexport * from \"./PItemRouter.js\";\n\n// Registry components\nexport * from './Instance.js';\nexport * from './InstanceFactory.js';\nexport * from './Registry.js';\n\n// Error handling\nexport * from './errorHandler.js';\nexport * from './types.js';\nexport * from './createApp.js';\n\n// Re-export Operations type from @fjell/lib for convenience\nexport type { Operations } from '@fjell/lib';\n"],
|
|
5
|
+
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ErrorInfo } from '@fjell/core';
|
|
2
|
+
/**
|
|
3
|
+
* Successful API response structure
|
|
4
|
+
*/
|
|
5
|
+
export interface SuccessResponse<T = any> {
|
|
6
|
+
success: true;
|
|
7
|
+
data: T;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Error API response structure
|
|
11
|
+
*/
|
|
12
|
+
export interface ErrorResponse {
|
|
13
|
+
success: false;
|
|
14
|
+
error: ErrorInfo;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generic API response type
|
|
18
|
+
*/
|
|
19
|
+
export type ApiResponse<T = any> = SuccessResponse<T> | ErrorResponse;
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjell/express-router",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.55",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"express",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"docs:test": "cd docs && npm run test"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@fjell/core": "^4.4.
|
|
38
|
-
"@fjell/lib": "^4.4.
|
|
39
|
-
"@fjell/logging": "^4.4.
|
|
40
|
-
"@fjell/registry": "^4.4.
|
|
37
|
+
"@fjell/core": "^4.4.49",
|
|
38
|
+
"@fjell/lib": "^4.4.57",
|
|
39
|
+
"@fjell/logging": "^4.4.49",
|
|
40
|
+
"@fjell/registry": "^4.4.51",
|
|
41
41
|
"deepmerge": "^4.3.1",
|
|
42
42
|
"express": "^5.1.0"
|
|
43
43
|
},
|
package/dist/Operations.d.ts
DELETED
package/dist/Operations.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../src/Operations.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/Operations.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=Operations.js.map
|
|
File without changes
|