@groundbrick/express-adapter 0.0.1

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 (58) hide show
  1. package/README.md +449 -0
  2. package/dist/core/BaseController.d.ts +23 -0
  3. package/dist/core/BaseController.d.ts.map +1 -0
  4. package/dist/core/BaseController.js +50 -0
  5. package/dist/core/BaseController.js.map +1 -0
  6. package/dist/core/ExpressApp.d.ts +20 -0
  7. package/dist/core/ExpressApp.d.ts.map +1 -0
  8. package/dist/core/ExpressApp.js +183 -0
  9. package/dist/core/ExpressApp.js.map +1 -0
  10. package/dist/index.d.ts +9 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +11 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/middleware/ErrorHandler.d.ts +8 -0
  15. package/dist/middleware/ErrorHandler.d.ts.map +1 -0
  16. package/dist/middleware/ErrorHandler.js +64 -0
  17. package/dist/middleware/ErrorHandler.js.map +1 -0
  18. package/dist/middleware/JwtMiddleware.d.ts +17 -0
  19. package/dist/middleware/JwtMiddleware.d.ts.map +1 -0
  20. package/dist/middleware/JwtMiddleware.js +140 -0
  21. package/dist/middleware/JwtMiddleware.js.map +1 -0
  22. package/dist/middleware/RequestLogger.d.ts +8 -0
  23. package/dist/middleware/RequestLogger.d.ts.map +1 -0
  24. package/dist/middleware/RequestLogger.js +39 -0
  25. package/dist/middleware/RequestLogger.js.map +1 -0
  26. package/dist/middleware/ResponseFormatter.d.ts +5 -0
  27. package/dist/middleware/ResponseFormatter.d.ts.map +1 -0
  28. package/dist/middleware/ResponseFormatter.js +39 -0
  29. package/dist/middleware/ResponseFormatter.js.map +1 -0
  30. package/dist/types/ApiResponse.d.ts +17 -0
  31. package/dist/types/ApiResponse.d.ts.map +1 -0
  32. package/dist/types/ApiResponse.js +2 -0
  33. package/dist/types/ApiResponse.js.map +1 -0
  34. package/dist/types/Auth.d.ts +21 -0
  35. package/dist/types/Auth.d.ts.map +1 -0
  36. package/dist/types/Auth.js +2 -0
  37. package/dist/types/Auth.js.map +1 -0
  38. package/dist/types/Controller.d.ts +23 -0
  39. package/dist/types/Controller.d.ts.map +1 -0
  40. package/dist/types/Controller.js +2 -0
  41. package/dist/types/Controller.js.map +1 -0
  42. package/dist/types/ExpressConfig.d.ts +35 -0
  43. package/dist/types/ExpressConfig.d.ts.map +1 -0
  44. package/dist/types/ExpressConfig.js +2 -0
  45. package/dist/types/ExpressConfig.js.map +1 -0
  46. package/dist/types/RouteHandler.d.ts +9 -0
  47. package/dist/types/RouteHandler.d.ts.map +1 -0
  48. package/dist/types/RouteHandler.js +2 -0
  49. package/dist/types/RouteHandler.js.map +1 -0
  50. package/dist/types/index.d.ts +56 -0
  51. package/dist/types/index.d.ts.map +1 -0
  52. package/dist/types/index.js +2 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/utils/index.d.ts +53 -0
  55. package/dist/utils/index.d.ts.map +1 -0
  56. package/dist/utils/index.js +263 -0
  57. package/dist/utils/index.js.map +1 -0
  58. package/package.json +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auth.d.ts","sourceRoot":"","sources":["../../src/types/Auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/types/Auth.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { Logger } from '@groundbrick/logger';
2
+ import type { RouteHandler } from './RouteHandler.js';
3
+ /**
4
+ * Base interface for all controllers
5
+ */
6
+ export interface IController {
7
+ /**
8
+ * Logger instance
9
+ */
10
+ logger: Logger;
11
+ }
12
+ /**
13
+ * Base interface that includes the asyncHandler method
14
+ */
15
+ export interface IBaseController extends IController {
16
+ /**
17
+ * Wraps a request handler with error handling and async support
18
+ * @param handler The route handler function
19
+ * @returns A wrapped handler function
20
+ */
21
+ asyncHandler: (handler: RouteHandler) => RouteHandler;
22
+ }
23
+ //# sourceMappingURL=Controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Controller.d.ts","sourceRoot":"","sources":["../../src/types/Controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAChD;;;;OAIG;IACH,YAAY,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;CACzD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Controller.js","sourceRoot":"","sources":["../../src/types/Controller.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { LoggerConfig } from '@groundbrick/logger';
2
+ export interface ExpressConfig {
3
+ port?: number;
4
+ host?: string;
5
+ cors?: {
6
+ origin?: string | string[] | boolean | ((origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => void);
7
+ credentials?: boolean;
8
+ methods?: string[];
9
+ allowedHeaders?: string[];
10
+ };
11
+ security?: {
12
+ helmet?: boolean;
13
+ rateLimit?: {
14
+ windowMs?: number;
15
+ max?: number;
16
+ message?: string;
17
+ };
18
+ };
19
+ compression?: boolean;
20
+ bodyParser?: {
21
+ json?: {
22
+ limit?: string;
23
+ };
24
+ urlencoded?: {
25
+ limit?: string;
26
+ extended?: boolean;
27
+ };
28
+ };
29
+ logger?: Partial<LoggerConfig>;
30
+ trustProxy?: boolean;
31
+ static?: {
32
+ [path: string]: string;
33
+ };
34
+ }
35
+ //# sourceMappingURL=ExpressConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpressConfig.d.ts","sourceRoot":"","sources":["../../src/types/ExpressConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;QACtI,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE;YACV,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,GAAG,CAAC,EAAE,MAAM,CAAC;YACb,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;KACH,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE;YACL,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,UAAU,CAAC,EAAE;YACX,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,OAAO,CAAC;SACpB,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExpressConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpressConfig.js","sourceRoot":"","sources":["../../src/types/ExpressConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { Request, Response, NextFunction } from 'express';
2
+ export type RouteHandler<T = any> = (req: Request, res: Response, next: NextFunction) => Promise<Response | void>;
3
+ export interface RouteDefinition {
4
+ method: 'get' | 'post' | 'put' | 'patch' | 'delete';
5
+ path: string;
6
+ handler: RouteHandler;
7
+ middleware?: Array<(req: Request, res: Response, next: NextFunction) => void>;
8
+ }
9
+ //# sourceMappingURL=RouteHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteHandler.d.ts","sourceRoot":"","sources":["../../src/types/RouteHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG/D,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,GAAG,IAAI,CAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAEpH,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC;CACjF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteHandler.js","sourceRoot":"","sources":["../../src/types/RouteHandler.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import type { Request, Response, NextFunction } from 'express';
2
+ import type { Logger } from '@groundbrick/logger';
3
+ import type { DatabaseClient } from '@groundbrick/db-core';
4
+ import { JwtPayload } from './Auth.js';
5
+ export type { ExpressConfig } from './ExpressConfig.js';
6
+ export type { ApiResponse } from './ApiResponse.js';
7
+ export type { RouteHandler, RouteDefinition } from './RouteHandler.js';
8
+ export type { JwtMiddlewareConfig, JwtPayload, AuthenticatedRequest } from './Auth.js';
9
+ export type { IController, IBaseController } from './Controller.js';
10
+ export interface ServiceContext {
11
+ [key: string]: unknown;
12
+ }
13
+ export interface LoggerMiddlewareConfig {
14
+ includeBody?: boolean;
15
+ includeHeaders?: boolean;
16
+ excludePaths?: string[];
17
+ logRequests?: boolean;
18
+ logResponses?: boolean;
19
+ context?: string;
20
+ }
21
+ export interface DatabaseMiddlewareConfig {
22
+ healthCheckInterval?: number;
23
+ reconnectOnError?: boolean;
24
+ context?: string;
25
+ }
26
+ export interface ServiceContextConfig {
27
+ services: ServiceContext;
28
+ context?: string;
29
+ }
30
+ export interface ErrorHandlerConfig {
31
+ includeStack?: boolean;
32
+ logErrors?: boolean;
33
+ context?: string;
34
+ logger?: Logger;
35
+ onError?: (error: Error, req: Request, res: Response) => void;
36
+ }
37
+ export interface ValidationError {
38
+ field: string;
39
+ message: string;
40
+ value?: unknown;
41
+ }
42
+ export type AsyncRequestHandler = (req: Request, res: Response, next: NextFunction) => Promise<void | Response>;
43
+ export type RequestHandler = (req: Request, res: Response, next: NextFunction) => void | Response | Promise<void | Response>;
44
+ declare global {
45
+ namespace Express {
46
+ interface Request {
47
+ user?: JwtPayload;
48
+ token?: string;
49
+ services?: ServiceContext;
50
+ db?: DatabaseClient;
51
+ requestId?: string;
52
+ startTime?: number;
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGpE,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,MAAM,mBAAmB,GAAG,CAChC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAE9B,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAGhD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE,UAAU,CAAC;YAClB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,cAAc,CAAC;YAC1B,EAAE,CAAC,EAAE,cAAc,CAAC;YACpB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB;KACF;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import type { Request, Response } from 'express';
2
+ import type { ValidationError } from '../types/index.js';
3
+ export declare class ResponseHelper {
4
+ static success<T>(res: Response, data?: T, message?: string, statusCode?: number): Response;
5
+ static error(res: Response, message: string, statusCode?: number, code?: string, details?: unknown): Response;
6
+ static validation(res: Response, errors: ValidationError[]): Response;
7
+ static paginated<T>(res: Response, data: T[], pagination: {
8
+ page: number;
9
+ limit: number;
10
+ total: number;
11
+ }, message?: string): Response;
12
+ static created<T>(res: Response, data: T, message?: string): Response;
13
+ static noContent(res: Response): Response;
14
+ static notFound(res: Response, message?: string): Response;
15
+ static badRequest(res: Response, message?: string): Response;
16
+ static unauthorized(res: Response, message?: string, code?: string): Response;
17
+ static forbidden(res: Response, message?: string, code?: string): Response;
18
+ static conflict(res: Response, message?: string): Response;
19
+ static serverError(res: Response, message?: string): Response;
20
+ }
21
+ export declare class ValidationHelper {
22
+ static validateRequired(data: Record<string, unknown>, fields: string[]): ValidationError[];
23
+ static validateEmail(email: string): ValidationError | null;
24
+ static validateLength(field: string, value: string, min?: number, max?: number): ValidationError | null;
25
+ static validateNumeric(field: string, value: unknown, min?: number, max?: number): ValidationError | null;
26
+ static validateEnum<T extends string>(field: string, value: unknown, allowedValues: T[]): ValidationError | null;
27
+ }
28
+ export declare class PaginationHelper {
29
+ static parsePagination(req: Request): {
30
+ page: number;
31
+ limit: number;
32
+ offset: number;
33
+ };
34
+ static parseSort(req: Request, allowedFields?: string[]): {
35
+ sortBy?: string;
36
+ sortOrder: 'ASC' | 'DESC';
37
+ };
38
+ static parseFilters(req: Request, allowedFilters?: string[]): Record<string, unknown>;
39
+ }
40
+ export declare class RequestHelper {
41
+ static getClientIp(req: Request): string;
42
+ static getUserAgent(req: Request): string;
43
+ static isJsonRequest(req: Request): boolean;
44
+ static getContentType(req: Request): string;
45
+ static extractBearerToken(req: Request): string | null;
46
+ }
47
+ export declare class SecurityHelper {
48
+ static sanitizeInput(input: string): string;
49
+ static isValidUuid(uuid: string): boolean;
50
+ static maskEmail(email: string): string;
51
+ static generateSecureToken(length?: number): string;
52
+ }
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMtE,qBAAa,cAAc;IACvB,MAAM,CAAC,OAAO,CAAC,CAAC,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,CAAC,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,SAAM,GACjB,QAAQ;IAcX,MAAM,CAAC,KAAK,CACR,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,UAAU,SAAM,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,GAClB,QAAQ;IAiBX,MAAM,CAAC,UAAU,CACb,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,eAAe,EAAE,GAC1B,QAAQ;IAgBX,MAAM,CAAC,SAAS,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,CAAC,EAAE,EACT,UAAU,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACjB,EACD,OAAO,CAAC,EAAE,MAAM,GACjB,QAAQ;IAkBX,MAAM,CAAC,OAAO,CAAC,CAAC,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,CAAC,EACP,OAAO,SAAkC,GAC1C,QAAQ;IAIX,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ;IAIzC,MAAM,CAAC,QAAQ,CACX,GAAG,EAAE,QAAQ,EACb,OAAO,SAAuB,GAC/B,QAAQ;IAIX,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,SAAsD,GAAG,QAAQ;IAIzG,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,SAAiB,EAAE,IAAI,SAAiB,GAAG,QAAQ;IAK7F,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,SAAc,EAAE,IAAI,SAAc,GAAG,QAAQ;IAIpF,MAAM,CAAC,QAAQ,CACX,GAAG,EAAE,QAAQ,EACb,OAAO,SAA4B,GACpC,QAAQ;IAIX,MAAM,CAAC,WAAW,CACd,GAAG,EAAE,QAAQ,EACb,OAAO,SAA0B,GAClC,QAAQ;CAGd;AAMD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,gBAAgB,CACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,EAAE,GACjB,eAAe,EAAE;IAiBpB,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAY3D,MAAM,CAAC,cAAc,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACb,eAAe,GAAG,IAAI;IAoBzB,MAAM,CAAC,eAAe,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACb,eAAe,GAAG,IAAI;IA8BzB,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,MAAM,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,CAAC,EAAE,GACnB,eAAe,GAAG,IAAI;CAU5B;AAMD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG;QAClC,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAClB;IAQD,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG;QAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;KAC7B;IAYD,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAmB5F;AAMD,qBAAa,aAAa;IACtB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAWxC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAIzC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI3C,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAI3C,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;CAOzD;AAMD,qBAAa,cAAc;IACvB,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAO3C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKzC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQvC,MAAM,CAAC,mBAAmB,CAAC,MAAM,SAAK,GAAG,MAAM;CAQlD"}
@@ -0,0 +1,263 @@
1
+ // ============================================================================
2
+ // RESPONSE HELPERS
3
+ // ============================================================================
4
+ export class ResponseHelper {
5
+ static success(res, data, message, statusCode = 200) {
6
+ const response = {
7
+ success: true,
8
+ data,
9
+ message,
10
+ meta: {
11
+ timestamp: new Date().toISOString(),
12
+ requestId: res.req.requestId
13
+ }
14
+ };
15
+ return res.status(statusCode).json(response);
16
+ }
17
+ static error(res, message, statusCode = 400, code, details) {
18
+ const response = {
19
+ success: false,
20
+ error: {
21
+ message,
22
+ ...(code && { code }),
23
+ ...(typeof details === 'object' && details !== null ? { details } : {})
24
+ },
25
+ meta: {
26
+ timestamp: new Date().toISOString(),
27
+ requestId: res.req.requestId
28
+ }
29
+ };
30
+ return res.status(statusCode).json(response);
31
+ }
32
+ static validation(res, errors) {
33
+ const response = {
34
+ success: false,
35
+ error: 'Validation failed',
36
+ details: {
37
+ validationErrors: errors
38
+ },
39
+ meta: {
40
+ timestamp: new Date().toISOString(),
41
+ requestId: res.req.requestId
42
+ }
43
+ };
44
+ return res.status(422).json(response);
45
+ }
46
+ static paginated(res, data, pagination, message) {
47
+ const response = {
48
+ success: true,
49
+ data,
50
+ message,
51
+ meta: {
52
+ timestamp: new Date().toISOString(),
53
+ requestId: res.req.requestId,
54
+ pagination: {
55
+ ...pagination,
56
+ pages: Math.ceil(pagination.total / pagination.limit)
57
+ }
58
+ }
59
+ };
60
+ return res.status(200).json(response);
61
+ }
62
+ static created(res, data, message = 'Resource created successfully') {
63
+ return this.success(res, data, message, 201);
64
+ }
65
+ static noContent(res) {
66
+ return res.status(204).send();
67
+ }
68
+ static notFound(res, message = 'Resource not found') {
69
+ return this.error(res, message, 404);
70
+ }
71
+ static badRequest(res, message = "Request is invalid or missing some required data.") {
72
+ return this.error(res, message, 400);
73
+ }
74
+ static unauthorized(res, message = 'Unauthorized', code = 'UNAUTHORIZED') {
75
+ return this.error(res, message, 401, code);
76
+ }
77
+ static forbidden(res, message = 'Forbidden', code = 'FORBIDDEN') {
78
+ return this.error(res, message, 403, code);
79
+ }
80
+ static conflict(res, message = 'Resource already exists') {
81
+ return this.error(res, message, 409);
82
+ }
83
+ static serverError(res, message = 'Internal server error') {
84
+ return this.error(res, message, 500);
85
+ }
86
+ }
87
+ // ============================================================================
88
+ // VALIDATION HELPERS
89
+ // ============================================================================
90
+ export class ValidationHelper {
91
+ static validateRequired(data, fields) {
92
+ const errors = [];
93
+ for (const field of fields) {
94
+ const value = data[field];
95
+ if (value === undefined || value === null || value === '') {
96
+ errors.push({
97
+ field,
98
+ message: `${field} is required`,
99
+ value
100
+ });
101
+ }
102
+ }
103
+ return errors;
104
+ }
105
+ static validateEmail(email) {
106
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
107
+ if (!emailRegex.test(email)) {
108
+ return {
109
+ field: 'email',
110
+ message: 'Invalid email format',
111
+ value: email
112
+ };
113
+ }
114
+ return null;
115
+ }
116
+ static validateLength(field, value, min, max) {
117
+ if (min && value.length < min) {
118
+ return {
119
+ field,
120
+ message: `${field} must be at least ${min} characters long`,
121
+ value
122
+ };
123
+ }
124
+ if (max && value.length > max) {
125
+ return {
126
+ field,
127
+ message: `${field} must be no more than ${max} characters long`,
128
+ value
129
+ };
130
+ }
131
+ return null;
132
+ }
133
+ static validateNumeric(field, value, min, max) {
134
+ const numValue = Number(value);
135
+ if (isNaN(numValue)) {
136
+ return {
137
+ field,
138
+ message: `${field} must be a valid number`,
139
+ value
140
+ };
141
+ }
142
+ if (min !== undefined && numValue < min) {
143
+ return {
144
+ field,
145
+ message: `${field} must be at least ${min}`,
146
+ value
147
+ };
148
+ }
149
+ if (max !== undefined && numValue > max) {
150
+ return {
151
+ field,
152
+ message: `${field} must be no more than ${max}`,
153
+ value
154
+ };
155
+ }
156
+ return null;
157
+ }
158
+ static validateEnum(field, value, allowedValues) {
159
+ if (!allowedValues.includes(value)) {
160
+ return {
161
+ field,
162
+ message: `${field} must be one of: ${allowedValues.join(', ')}`,
163
+ value
164
+ };
165
+ }
166
+ return null;
167
+ }
168
+ }
169
+ // ============================================================================
170
+ // PAGINATION HELPERS
171
+ // ============================================================================
172
+ export class PaginationHelper {
173
+ static parsePagination(req) {
174
+ const page = Math.max(1, parseInt(req.query.page) || 1);
175
+ const limit = Math.min(100, Math.max(1, parseInt(req.query.limit) || 20));
176
+ const offset = (page - 1) * limit;
177
+ return { page, limit, offset };
178
+ }
179
+ static parseSort(req, allowedFields = []) {
180
+ const sortBy = req.query.sortBy;
181
+ const sortOrder = req.query.sortOrder?.toUpperCase() === 'DESC' ? 'DESC' : 'ASC';
182
+ // Validate sort field if allowed fields provided
183
+ if (sortBy && allowedFields.length > 0 && !allowedFields.includes(sortBy)) {
184
+ throw new Error(`Invalid sort field. Allowed fields: ${allowedFields.join(', ')}`);
185
+ }
186
+ return { sortBy, sortOrder };
187
+ }
188
+ static parseFilters(req, allowedFilters = []) {
189
+ const filters = {};
190
+ for (const [key, value] of Object.entries(req.query)) {
191
+ // Skip pagination and sorting params
192
+ if (['page', 'limit', 'sortBy', 'sortOrder'].includes(key)) {
193
+ continue;
194
+ }
195
+ // Check if filter is allowed
196
+ if (allowedFilters.length > 0 && !allowedFilters.includes(key)) {
197
+ continue;
198
+ }
199
+ filters[key] = value;
200
+ }
201
+ return filters;
202
+ }
203
+ }
204
+ // ============================================================================
205
+ // REQUEST HELPERS
206
+ // ============================================================================
207
+ export class RequestHelper {
208
+ static getClientIp(req) {
209
+ return (req.headers['x-forwarded-for'] ||
210
+ req.headers['x-real-ip'] ||
211
+ req.connection?.remoteAddress ||
212
+ req.socket?.remoteAddress ||
213
+ req.ip ||
214
+ 'unknown').split(',')[0].trim();
215
+ }
216
+ static getUserAgent(req) {
217
+ return req.headers['user-agent'] || 'unknown';
218
+ }
219
+ static isJsonRequest(req) {
220
+ return req.is('application/json') !== false;
221
+ }
222
+ static getContentType(req) {
223
+ return req.headers['content-type'] || 'unknown';
224
+ }
225
+ static extractBearerToken(req) {
226
+ const authHeader = req.headers.authorization;
227
+ if (authHeader && authHeader.startsWith('Bearer ')) {
228
+ return authHeader.substring(7);
229
+ }
230
+ return null;
231
+ }
232
+ }
233
+ // ============================================================================
234
+ // SECURITY HELPERS
235
+ // ============================================================================
236
+ export class SecurityHelper {
237
+ static sanitizeInput(input) {
238
+ return input
239
+ .replace(/[<>]/g, '') // Remove HTML tags
240
+ .replace(/['"]/g, '') // Remove quotes
241
+ .trim();
242
+ }
243
+ static isValidUuid(uuid) {
244
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
245
+ return uuidRegex.test(uuid);
246
+ }
247
+ static maskEmail(email) {
248
+ const [localPart, domain] = email.split('@');
249
+ if (localPart.length <= 2) {
250
+ return `${localPart}***@${domain}`;
251
+ }
252
+ return `${localPart.substring(0, 2)}***@${domain}`;
253
+ }
254
+ static generateSecureToken(length = 32) {
255
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
256
+ let token = '';
257
+ for (let i = 0; i < length; i++) {
258
+ token += chars.charAt(Math.floor(Math.random() * chars.length));
259
+ }
260
+ return token;
261
+ }
262
+ }
263
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@groundbrick/express-adapter",
3
+ "version": "0.0.1",
4
+ "description": "Express.js integration adapter with middleware, controllers, and error handling",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist/**/*",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc --build",
22
+ "dev": "tsc --watch",
23
+ "clean": "rm -rf dist *.tsbuildinfo",
24
+ "lint": "eslint src/**/*.ts",
25
+ "lint:fix": "eslint src/**/*.ts --fix"
26
+ },
27
+ "keywords": [
28
+ "typescript",
29
+ "express",
30
+ "middleware",
31
+ "controller",
32
+ "microframework",
33
+ "rest-api",
34
+ "error-handling",
35
+ "authentication"
36
+ ],
37
+ "author": "Cleiton Marques <cleiton.marques@200.systems>",
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/200Systems/bitbrick-microframework.git",
42
+ "directory": "packages/express-adapter"
43
+ },
44
+ "dependencies": {
45
+ "@groundbrick/db-core": "workspace:*",
46
+ "@groundbrick/logger": "workspace:*",
47
+ "@groundbrick/service-base": "workspace:*",
48
+ "@types/ms": "^2.1.0"
49
+ },
50
+ "peerDependencies": {
51
+ "compression": "^1.7.4",
52
+ "cookie-parser": "^1.4.6",
53
+ "cors": "^2.8.5",
54
+ "express": "^4.21.2",
55
+ "express-rate-limit": "^7.1.0",
56
+ "helmet": "^7.1.0",
57
+ "jsonwebtoken": "^9.0.0"
58
+ },
59
+ "devDependencies": {
60
+ "@types/compression": "^1.7.0",
61
+ "@types/cookie-parser": "^1.4.9",
62
+ "@types/cors": "^2.8.0",
63
+ "@types/express": "^4.17.23",
64
+ "@types/jsonwebtoken": "^9.0.0",
65
+ "@types/node": "^20.10.0",
66
+ "compression": "^1.7.4",
67
+ "cookie-parser": "^1.4.7",
68
+ "cors": "^2.8.5",
69
+ "express": "^4.21.2",
70
+ "express-rate-limit": "^7.1.0",
71
+ "helmet": "^7.1.0",
72
+ "jsonwebtoken": "^9.0.0",
73
+ "typescript": "^5.8.3"
74
+ },
75
+ "engines": {
76
+ "node": ">=18.0.0"
77
+ },
78
+ "publishConfig": {
79
+ "access": "public"
80
+ }
81
+ }