@xbg.solutions/backend-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/core/src/app.d.ts +28 -0
- package/lib/core/src/app.d.ts.map +1 -0
- package/lib/core/src/app.js +188 -0
- package/lib/core/src/app.js.map +1 -0
- package/lib/core/src/base/BaseController.d.ts +108 -0
- package/lib/core/src/base/BaseController.d.ts.map +1 -0
- package/lib/core/src/base/BaseController.js +307 -0
- package/lib/core/src/base/BaseController.js.map +1 -0
- package/lib/core/src/base/BaseEntity.d.ts +92 -0
- package/lib/core/src/base/BaseEntity.d.ts.map +1 -0
- package/lib/core/src/base/BaseEntity.js +143 -0
- package/lib/core/src/base/BaseEntity.js.map +1 -0
- package/lib/core/src/base/BaseRepository.d.ts +124 -0
- package/lib/core/src/base/BaseRepository.d.ts.map +1 -0
- package/lib/core/src/base/BaseRepository.js +414 -0
- package/lib/core/src/base/BaseRepository.js.map +1 -0
- package/lib/core/src/base/BaseService.d.ts +89 -0
- package/lib/core/src/base/BaseService.d.ts.map +1 -0
- package/lib/core/src/base/BaseService.js +342 -0
- package/lib/core/src/base/BaseService.js.map +1 -0
- package/lib/core/src/base/index.d.ts +8 -0
- package/lib/core/src/base/index.d.ts.map +1 -0
- package/lib/core/src/base/index.js +24 -0
- package/lib/core/src/base/index.js.map +1 -0
- package/lib/core/src/config/app.config.d.ts +70 -0
- package/lib/core/src/config/app.config.d.ts.map +1 -0
- package/lib/core/src/config/app.config.js +106 -0
- package/lib/core/src/config/app.config.js.map +1 -0
- package/lib/core/src/config/auth.config.d.ts +54 -0
- package/lib/core/src/config/auth.config.d.ts.map +1 -0
- package/lib/core/src/config/auth.config.js +88 -0
- package/lib/core/src/config/auth.config.js.map +1 -0
- package/lib/core/src/config/cache.config.d.ts +47 -0
- package/lib/core/src/config/cache.config.d.ts.map +1 -0
- package/lib/core/src/config/cache.config.js +225 -0
- package/lib/core/src/config/cache.config.js.map +1 -0
- package/lib/core/src/config/communications.config.d.ts +175 -0
- package/lib/core/src/config/communications.config.d.ts.map +1 -0
- package/lib/core/src/config/communications.config.js +219 -0
- package/lib/core/src/config/communications.config.js.map +1 -0
- package/lib/core/src/config/database.config.d.ts +68 -0
- package/lib/core/src/config/database.config.d.ts.map +1 -0
- package/lib/core/src/config/database.config.js +95 -0
- package/lib/core/src/config/database.config.js.map +1 -0
- package/lib/core/src/config/firebase-event-mapping.config.d.ts +41 -0
- package/lib/core/src/config/firebase-event-mapping.config.d.ts.map +1 -0
- package/lib/core/src/config/firebase-event-mapping.config.js +180 -0
- package/lib/core/src/config/firebase-event-mapping.config.js.map +1 -0
- package/lib/core/src/config/firestore.config.d.ts +61 -0
- package/lib/core/src/config/firestore.config.d.ts.map +1 -0
- package/lib/core/src/config/firestore.config.js +74 -0
- package/lib/core/src/config/firestore.config.js.map +1 -0
- package/lib/core/src/config/index.d.ts +15 -0
- package/lib/core/src/config/index.d.ts.map +1 -0
- package/lib/core/src/config/index.js +41 -0
- package/lib/core/src/config/index.js.map +1 -0
- package/lib/core/src/config/maps.config.d.ts +31 -0
- package/lib/core/src/config/maps.config.d.ts.map +1 -0
- package/lib/core/src/config/maps.config.js +50 -0
- package/lib/core/src/config/maps.config.js.map +1 -0
- package/lib/core/src/config/middleware.config.d.ts +57 -0
- package/lib/core/src/config/middleware.config.d.ts.map +1 -0
- package/lib/core/src/config/middleware.config.js +68 -0
- package/lib/core/src/config/middleware.config.js.map +1 -0
- package/lib/core/src/config/tokens.config.d.ts +53 -0
- package/lib/core/src/config/tokens.config.d.ts.map +1 -0
- package/lib/core/src/config/tokens.config.js +129 -0
- package/lib/core/src/config/tokens.config.js.map +1 -0
- package/lib/core/src/generator/generator.d.ts +38 -0
- package/lib/core/src/generator/generator.d.ts.map +1 -0
- package/lib/core/src/generator/generator.js +159 -0
- package/lib/core/src/generator/generator.js.map +1 -0
- package/lib/core/src/generator/index.d.ts +7 -0
- package/lib/core/src/generator/index.d.ts.map +1 -0
- package/lib/core/src/generator/index.js +23 -0
- package/lib/core/src/generator/index.js.map +1 -0
- package/lib/core/src/generator/parser.d.ts +10 -0
- package/lib/core/src/generator/parser.d.ts.map +1 -0
- package/lib/core/src/generator/parser.js +197 -0
- package/lib/core/src/generator/parser.js.map +1 -0
- package/lib/core/src/generator/types.d.ts +112 -0
- package/lib/core/src/generator/types.d.ts.map +1 -0
- package/lib/core/src/generator/types.js +7 -0
- package/lib/core/src/generator/types.js.map +1 -0
- package/lib/core/src/index.d.ts +19 -0
- package/lib/core/src/index.d.ts.map +1 -0
- package/lib/core/src/index.js +46 -0
- package/lib/core/src/index.js.map +1 -0
- package/lib/core/src/middleware/auth.middleware.d.ts +57 -0
- package/lib/core/src/middleware/auth.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/auth.middleware.js +256 -0
- package/lib/core/src/middleware/auth.middleware.js.map +1 -0
- package/lib/core/src/middleware/cors.middleware.d.ts +13 -0
- package/lib/core/src/middleware/cors.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/cors.middleware.js +50 -0
- package/lib/core/src/middleware/cors.middleware.js.map +1 -0
- package/lib/core/src/middleware/error.middleware.d.ts +46 -0
- package/lib/core/src/middleware/error.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/error.middleware.js +174 -0
- package/lib/core/src/middleware/error.middleware.js.map +1 -0
- package/lib/core/src/middleware/index.d.ts +11 -0
- package/lib/core/src/middleware/index.d.ts.map +1 -0
- package/lib/core/src/middleware/index.js +27 -0
- package/lib/core/src/middleware/index.js.map +1 -0
- package/lib/core/src/middleware/logging.middleware.d.ts +10 -0
- package/lib/core/src/middleware/logging.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/logging.middleware.js +87 -0
- package/lib/core/src/middleware/logging.middleware.js.map +1 -0
- package/lib/core/src/middleware/rateLimit.middleware.d.ts +26 -0
- package/lib/core/src/middleware/rateLimit.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/rateLimit.middleware.js +105 -0
- package/lib/core/src/middleware/rateLimit.middleware.js.map +1 -0
- package/lib/core/src/middleware/requestId.middleware.d.ts +11 -0
- package/lib/core/src/middleware/requestId.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/requestId.middleware.js +26 -0
- package/lib/core/src/middleware/requestId.middleware.js.map +1 -0
- package/lib/core/src/middleware/validation.middleware.d.ts +25 -0
- package/lib/core/src/middleware/validation.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/validation.middleware.js +133 -0
- package/lib/core/src/middleware/validation.middleware.js.map +1 -0
- package/lib/core/src/types/errors.d.ts +119 -0
- package/lib/core/src/types/errors.d.ts.map +1 -0
- package/lib/core/src/types/errors.js +210 -0
- package/lib/core/src/types/errors.js.map +1 -0
- package/lib/utils-cache-connector/src/cache-connector.d.ts +139 -0
- package/lib/utils-cache-connector/src/cache-connector.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/cache-connector.js +277 -0
- package/lib/utils-cache-connector/src/cache-connector.js.map +1 -0
- package/lib/utils-cache-connector/src/index.d.ts +52 -0
- package/lib/utils-cache-connector/src/index.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/index.js +103 -0
- package/lib/utils-cache-connector/src/index.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts +95 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.js +120 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts +58 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js +418 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts +57 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.js +217 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts +21 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.js +42 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts +64 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.js +414 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/types.d.ts +342 -0
- package/lib/utils-cache-connector/src/types.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/types.js +8 -0
- package/lib/utils-cache-connector/src/types.js.map +1 -0
- package/lib/utils-events/src/event-bus.d.ts +42 -0
- package/lib/utils-events/src/event-bus.d.ts.map +1 -0
- package/lib/utils-events/src/event-bus.js +93 -0
- package/lib/utils-events/src/event-bus.js.map +1 -0
- package/lib/utils-events/src/event-types.d.ts +146 -0
- package/lib/utils-events/src/event-types.d.ts.map +1 -0
- package/lib/utils-events/src/event-types.js +49 -0
- package/lib/utils-events/src/event-types.js.map +1 -0
- package/lib/utils-events/src/index.d.ts +7 -0
- package/lib/utils-events/src/index.d.ts.map +1 -0
- package/lib/utils-events/src/index.js +11 -0
- package/lib/utils-events/src/index.js.map +1 -0
- package/lib/utils-logger/src/index.d.ts +12 -0
- package/lib/utils-logger/src/index.d.ts.map +1 -0
- package/lib/utils-logger/src/index.js +29 -0
- package/lib/utils-logger/src/index.js.map +1 -0
- package/lib/utils-logger/src/logger-types.d.ts +32 -0
- package/lib/utils-logger/src/logger-types.d.ts.map +1 -0
- package/lib/utils-logger/src/logger-types.js +17 -0
- package/lib/utils-logger/src/logger-types.js.map +1 -0
- package/lib/utils-logger/src/logger.d.ts +42 -0
- package/lib/utils-logger/src/logger.d.ts.map +1 -0
- package/lib/utils-logger/src/logger.js +123 -0
- package/lib/utils-logger/src/logger.js.map +1 -0
- package/package.json +49 -0
- package/src/templates/controller.hbs +48 -0
- package/src/templates/entity.hbs +80 -0
- package/src/templates/repository.hbs +56 -0
- package/src/templates/service.hbs +108 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @xbg/backend-core
|
|
4
|
+
* Core framework for XBG backend projects
|
|
5
|
+
*
|
|
6
|
+
* Exports base classes, middleware, configuration, types, and code generator
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.parseEntitySpecification = exports.createGenerator = exports.CodeGenerator = exports.startServer = exports.registerControllers = exports.createApp = void 0;
|
|
24
|
+
// Base classes
|
|
25
|
+
__exportStar(require("./base/BaseEntity"), exports);
|
|
26
|
+
__exportStar(require("./base/BaseRepository"), exports);
|
|
27
|
+
__exportStar(require("./base/BaseService"), exports);
|
|
28
|
+
__exportStar(require("./base/BaseController"), exports);
|
|
29
|
+
// Middleware
|
|
30
|
+
__exportStar(require("./middleware"), exports);
|
|
31
|
+
// Configuration
|
|
32
|
+
__exportStar(require("./config"), exports);
|
|
33
|
+
// Types
|
|
34
|
+
__exportStar(require("./types/errors"), exports);
|
|
35
|
+
// App factory
|
|
36
|
+
var app_1 = require("./app");
|
|
37
|
+
Object.defineProperty(exports, "createApp", { enumerable: true, get: function () { return app_1.createApp; } });
|
|
38
|
+
Object.defineProperty(exports, "registerControllers", { enumerable: true, get: function () { return app_1.registerControllers; } });
|
|
39
|
+
Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return app_1.startServer; } });
|
|
40
|
+
// Code generator
|
|
41
|
+
var generator_1 = require("./generator/generator");
|
|
42
|
+
Object.defineProperty(exports, "CodeGenerator", { enumerable: true, get: function () { return generator_1.CodeGenerator; } });
|
|
43
|
+
Object.defineProperty(exports, "createGenerator", { enumerable: true, get: function () { return generator_1.createGenerator; } });
|
|
44
|
+
var parser_1 = require("./generator/parser");
|
|
45
|
+
Object.defineProperty(exports, "parseEntitySpecification", { enumerable: true, get: function () { return parser_1.parseEntitySpecification; } });
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,oDAAkC;AAClC,wDAAsC;AACtC,qDAAmC;AACnC,wDAAsC;AAEtC,aAAa;AACb,+CAA6B;AAE7B,gBAAgB;AAChB,2CAAyB;AAEzB,QAAQ;AACR,iDAA+B;AAE/B,cAAc;AACd,6BAAoE;AAA3D,gGAAA,SAAS,OAAA;AAAE,0GAAA,mBAAmB,OAAA;AAAE,kGAAA,WAAW,OAAA;AAGpD,iBAAiB;AACjB,mDAAuE;AAA9D,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AACvC,6CAA8D;AAArD,kHAAA,wBAAwB,OAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Middleware
|
|
3
|
+
* Integrates with the token handler utility
|
|
4
|
+
*/
|
|
5
|
+
import { Request, Response, NextFunction } from 'express';
|
|
6
|
+
import type { ITokenHandler } from '@xbg/utils-token-handler';
|
|
7
|
+
export interface AuthenticatedRequest extends Request {
|
|
8
|
+
user?: {
|
|
9
|
+
uid: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
role?: string;
|
|
12
|
+
customClaims?: Record<string, any>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Authentication middleware factory
|
|
17
|
+
* Verifies JWT tokens and attaches user to request
|
|
18
|
+
*/
|
|
19
|
+
export declare function createAuthMiddleware(options: {
|
|
20
|
+
tokenHandler: ITokenHandler;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
roles?: string[];
|
|
23
|
+
}): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
24
|
+
/**
|
|
25
|
+
* Optional authentication middleware
|
|
26
|
+
* Attaches user if token is present but doesn't require it
|
|
27
|
+
*/
|
|
28
|
+
export declare function optionalAuth(tokenHandler: ITokenHandler): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
29
|
+
/**
|
|
30
|
+
* Required authentication middleware
|
|
31
|
+
* Requires valid token
|
|
32
|
+
*/
|
|
33
|
+
export declare function requiredAuth(tokenHandler: ITokenHandler): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
34
|
+
/**
|
|
35
|
+
* Role-based authentication middleware
|
|
36
|
+
* Requires valid token and specific roles
|
|
37
|
+
*/
|
|
38
|
+
export declare function requireRoles(tokenHandler: ITokenHandler, roles: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
39
|
+
/**
|
|
40
|
+
* Admin-only middleware
|
|
41
|
+
* Pass custom admin roles array to match your project's role names.
|
|
42
|
+
* Default: ['admin']
|
|
43
|
+
*/
|
|
44
|
+
export declare function requireAdmin(tokenHandler: ITokenHandler, adminRoles?: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if user owns resource
|
|
47
|
+
* Pass adminRoles to configure which roles bypass the ownership check.
|
|
48
|
+
* Default: ['admin']
|
|
49
|
+
*/
|
|
50
|
+
export declare function requireOwnership(getUserIdFromResource: (req: Request) => string | undefined, adminRoles?: string[]): (req: AuthenticatedRequest, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
51
|
+
/**
|
|
52
|
+
* API Key authentication middleware
|
|
53
|
+
* For service-to-service communication.
|
|
54
|
+
* Uses timing-safe comparison to prevent timing attacks.
|
|
55
|
+
*/
|
|
56
|
+
export declare function requireApiKey(validApiKeys: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
57
|
+
//# sourceMappingURL=auth.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,CAAC,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,YAAY,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,IACe,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDAwE9D;AAqBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,SAjGnC,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDAmG9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,SAzGnC,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDA2G9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,SAjHpD,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDAmH9D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,GAAE,MAAM,EAAc,SA1HrE,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDA4H9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,EAC3D,UAAU,GAAE,MAAM,EAAc,IAElB,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDAmC3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IACpC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDA6B9D"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication Middleware
|
|
4
|
+
* Integrates with the token handler utility
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.createAuthMiddleware = createAuthMiddleware;
|
|
41
|
+
exports.optionalAuth = optionalAuth;
|
|
42
|
+
exports.requiredAuth = requiredAuth;
|
|
43
|
+
exports.requireRoles = requireRoles;
|
|
44
|
+
exports.requireAdmin = requireAdmin;
|
|
45
|
+
exports.requireOwnership = requireOwnership;
|
|
46
|
+
exports.requireApiKey = requireApiKey;
|
|
47
|
+
const crypto = __importStar(require("crypto"));
|
|
48
|
+
const utils_logger_1 = require("@xbg/utils-logger");
|
|
49
|
+
const errors_1 = require("../types/errors");
|
|
50
|
+
/**
|
|
51
|
+
* Authentication middleware factory
|
|
52
|
+
* Verifies JWT tokens and attaches user to request
|
|
53
|
+
*/
|
|
54
|
+
function createAuthMiddleware(options) {
|
|
55
|
+
return async (req, res, next) => {
|
|
56
|
+
var _a, _b, _c, _d;
|
|
57
|
+
try {
|
|
58
|
+
const token = extractTokenFromHeader(req);
|
|
59
|
+
if (!token) {
|
|
60
|
+
if (options.required !== false) {
|
|
61
|
+
return res.status(401).json({
|
|
62
|
+
success: false,
|
|
63
|
+
error: {
|
|
64
|
+
code: 'UNAUTHORIZED',
|
|
65
|
+
message: 'Authentication required',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return next();
|
|
70
|
+
}
|
|
71
|
+
// Verify token using token handler (includes blacklist check)
|
|
72
|
+
const verificationResult = await options.tokenHandler.verifyAndUnpack(token, utils_logger_1.logger);
|
|
73
|
+
if (!verificationResult.isValid) {
|
|
74
|
+
return res.status(401).json({
|
|
75
|
+
success: false,
|
|
76
|
+
error: {
|
|
77
|
+
code: verificationResult.isBlacklisted ? 'TOKEN_REVOKED' : 'INVALID_TOKEN',
|
|
78
|
+
message: verificationResult.error || 'Invalid or expired token',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Attach user to request
|
|
83
|
+
req.user = {
|
|
84
|
+
uid: verificationResult.token.authUID,
|
|
85
|
+
email: verificationResult.token.email || undefined,
|
|
86
|
+
role: ((_a = verificationResult.token.customClaims) === null || _a === void 0 ? void 0 : _a.role) || 'user',
|
|
87
|
+
customClaims: verificationResult.token.customClaims,
|
|
88
|
+
};
|
|
89
|
+
// Check role requirements
|
|
90
|
+
if (options.roles && options.roles.length > 0) {
|
|
91
|
+
const userRole = (_b = req.user) === null || _b === void 0 ? void 0 : _b.role;
|
|
92
|
+
if (!userRole || !options.roles.includes(userRole)) {
|
|
93
|
+
return res.status(403).json({
|
|
94
|
+
success: false,
|
|
95
|
+
error: {
|
|
96
|
+
code: 'FORBIDDEN',
|
|
97
|
+
message: 'Insufficient permissions',
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
utils_logger_1.logger.debug('User authenticated', {
|
|
103
|
+
uid: (_c = req.user) === null || _c === void 0 ? void 0 : _c.uid,
|
|
104
|
+
role: (_d = req.user) === null || _d === void 0 ? void 0 : _d.role,
|
|
105
|
+
});
|
|
106
|
+
return next();
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
110
|
+
const authError = new errors_1.AuthError('Authentication failed', error);
|
|
111
|
+
utils_logger_1.logger.error(authError.message, err);
|
|
112
|
+
return res.status(500).json({
|
|
113
|
+
success: false,
|
|
114
|
+
error: {
|
|
115
|
+
code: 'AUTH_ERROR',
|
|
116
|
+
message: 'Authentication failed',
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Extract token from Authorization header
|
|
124
|
+
*/
|
|
125
|
+
function extractTokenFromHeader(req) {
|
|
126
|
+
const authHeader = req.headers.authorization;
|
|
127
|
+
if (!authHeader) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const parts = authHeader.split(' ');
|
|
131
|
+
if (parts.length !== 2 || parts[0] !== 'Bearer') {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
return parts[1];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Optional authentication middleware
|
|
138
|
+
* Attaches user if token is present but doesn't require it
|
|
139
|
+
*/
|
|
140
|
+
function optionalAuth(tokenHandler) {
|
|
141
|
+
return createAuthMiddleware({ tokenHandler, required: false });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Required authentication middleware
|
|
145
|
+
* Requires valid token
|
|
146
|
+
*/
|
|
147
|
+
function requiredAuth(tokenHandler) {
|
|
148
|
+
return createAuthMiddleware({ tokenHandler, required: true });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Role-based authentication middleware
|
|
152
|
+
* Requires valid token and specific roles
|
|
153
|
+
*/
|
|
154
|
+
function requireRoles(tokenHandler, roles) {
|
|
155
|
+
return createAuthMiddleware({ tokenHandler, required: true, roles });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Admin-only middleware
|
|
159
|
+
* Pass custom admin roles array to match your project's role names.
|
|
160
|
+
* Default: ['admin']
|
|
161
|
+
*/
|
|
162
|
+
function requireAdmin(tokenHandler, adminRoles = ['admin']) {
|
|
163
|
+
return requireRoles(tokenHandler, adminRoles);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check if user owns resource
|
|
167
|
+
* Pass adminRoles to configure which roles bypass the ownership check.
|
|
168
|
+
* Default: ['admin']
|
|
169
|
+
*/
|
|
170
|
+
function requireOwnership(getUserIdFromResource, adminRoles = ['admin']) {
|
|
171
|
+
return async (req, res, next) => {
|
|
172
|
+
var _a, _b;
|
|
173
|
+
try {
|
|
174
|
+
const userId = (_a = req.user) === null || _a === void 0 ? void 0 : _a.uid;
|
|
175
|
+
const resourceUserId = getUserIdFromResource(req);
|
|
176
|
+
if (!userId || !resourceUserId || userId !== resourceUserId) {
|
|
177
|
+
// Allow if user has an admin role
|
|
178
|
+
if (((_b = req.user) === null || _b === void 0 ? void 0 : _b.role) && adminRoles.includes(req.user.role)) {
|
|
179
|
+
return next();
|
|
180
|
+
}
|
|
181
|
+
return res.status(403).json({
|
|
182
|
+
success: false,
|
|
183
|
+
error: {
|
|
184
|
+
code: 'FORBIDDEN',
|
|
185
|
+
message: 'Access denied to this resource',
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return next();
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
193
|
+
const authError = new errors_1.AuthError('Failed to verify resource ownership', error);
|
|
194
|
+
utils_logger_1.logger.error(authError.message, err);
|
|
195
|
+
return res.status(500).json({
|
|
196
|
+
success: false,
|
|
197
|
+
error: {
|
|
198
|
+
code: 'AUTHORIZATION_ERROR',
|
|
199
|
+
message: 'Failed to verify resource ownership',
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* API Key authentication middleware
|
|
207
|
+
* For service-to-service communication.
|
|
208
|
+
* Uses timing-safe comparison to prevent timing attacks.
|
|
209
|
+
*/
|
|
210
|
+
function requireApiKey(validApiKeys) {
|
|
211
|
+
return async (req, res, next) => {
|
|
212
|
+
try {
|
|
213
|
+
const apiKey = req.headers['x-api-key'];
|
|
214
|
+
if (!apiKey || !timingSafeIncludes(validApiKeys, apiKey)) {
|
|
215
|
+
return res.status(401).json({
|
|
216
|
+
success: false,
|
|
217
|
+
error: {
|
|
218
|
+
code: 'INVALID_API_KEY',
|
|
219
|
+
message: 'Invalid or missing API key',
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return next();
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
227
|
+
const authError = new errors_1.AuthError('API key validation failed', error);
|
|
228
|
+
utils_logger_1.logger.error(authError.message, err);
|
|
229
|
+
return res.status(500).json({
|
|
230
|
+
success: false,
|
|
231
|
+
error: {
|
|
232
|
+
code: 'AUTH_ERROR',
|
|
233
|
+
message: 'API key validation failed',
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Timing-safe comparison of an API key against a list of valid keys.
|
|
241
|
+
* Prevents timing side-channel attacks that could leak key information.
|
|
242
|
+
*/
|
|
243
|
+
function timingSafeIncludes(validKeys, candidate) {
|
|
244
|
+
const candidateBuffer = Buffer.from(candidate);
|
|
245
|
+
let found = false;
|
|
246
|
+
for (const key of validKeys) {
|
|
247
|
+
const keyBuffer = Buffer.from(key);
|
|
248
|
+
if (candidateBuffer.length === keyBuffer.length) {
|
|
249
|
+
if (crypto.timingSafeEqual(candidateBuffer, keyBuffer)) {
|
|
250
|
+
found = true;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return found;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=auth.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.middleware.js","sourceRoot":"","sources":["../../../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS Middleware Configuration
|
|
3
|
+
*/
|
|
4
|
+
import cors from 'cors';
|
|
5
|
+
/**
|
|
6
|
+
* Create CORS middleware with configuration
|
|
7
|
+
*/
|
|
8
|
+
export declare function createCorsMiddleware(): (req: cors.CorsRequest, res: {
|
|
9
|
+
statusCode?: number | undefined;
|
|
10
|
+
setHeader(key: string, value: string): any;
|
|
11
|
+
end(): any;
|
|
12
|
+
}, next: (err?: any) => any) => void;
|
|
13
|
+
//# sourceMappingURL=cors.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.middleware.d.ts","sourceRoot":"","sources":["../../../../src/middleware/cors.middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB;;GAEG;AACH,wBAAgB,oBAAoB;cAqC4I,CAAC;;;aAAmH,CAAC,uBADpS"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CORS Middleware Configuration
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createCorsMiddleware = createCorsMiddleware;
|
|
10
|
+
const cors_1 = __importDefault(require("cors"));
|
|
11
|
+
const app_config_1 = require("../config/app.config");
|
|
12
|
+
const middleware_config_1 = require("../config/middleware.config");
|
|
13
|
+
/**
|
|
14
|
+
* Create CORS middleware with configuration
|
|
15
|
+
*/
|
|
16
|
+
function createCorsMiddleware() {
|
|
17
|
+
return (0, cors_1.default)({
|
|
18
|
+
origin: (origin, callback) => {
|
|
19
|
+
// Allow requests with no origin (mobile apps, Postman, etc.)
|
|
20
|
+
if (!origin) {
|
|
21
|
+
return callback(null, true);
|
|
22
|
+
}
|
|
23
|
+
// Check if origin is allowed
|
|
24
|
+
if (app_config_1.APP_CONFIG.api.corsOrigins.includes(origin)) {
|
|
25
|
+
return callback(null, true);
|
|
26
|
+
}
|
|
27
|
+
// In development, allow all localhost origins
|
|
28
|
+
if (app_config_1.APP_CONFIG.app.environment === 'development' && origin.includes('localhost')) {
|
|
29
|
+
return callback(null, true);
|
|
30
|
+
}
|
|
31
|
+
callback(new Error('Not allowed by CORS'));
|
|
32
|
+
},
|
|
33
|
+
credentials: middleware_config_1.MIDDLEWARE_CONFIG.cors.credentials,
|
|
34
|
+
maxAge: middleware_config_1.MIDDLEWARE_CONFIG.cors.maxAge,
|
|
35
|
+
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
|
|
36
|
+
allowedHeaders: [
|
|
37
|
+
'Content-Type',
|
|
38
|
+
'Authorization',
|
|
39
|
+
'X-Request-ID',
|
|
40
|
+
'X-API-Key',
|
|
41
|
+
],
|
|
42
|
+
exposedHeaders: [
|
|
43
|
+
'X-Request-ID',
|
|
44
|
+
'X-Total-Count',
|
|
45
|
+
'X-Page',
|
|
46
|
+
'X-Page-Size',
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=cors.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.middleware.js","sourceRoot":"","sources":["../../../../src/middleware/cors.middleware.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AASH,oDAoCC;AA3CD,gDAAwB;AACxB,qDAAkD;AAClD,mEAAgE;AAEhE;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,IAAA,cAAI,EAAC;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC3B,6DAA6D;YAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,6BAA6B;YAC7B,IAAI,uBAAU,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChD,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,8CAA8C;YAC9C,IAAI,uBAAU,CAAC,GAAG,CAAC,WAAW,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjF,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,QAAQ,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,WAAW,EAAE,qCAAiB,CAAC,IAAI,CAAC,WAAW;QAC/C,MAAM,EAAE,qCAAiB,CAAC,IAAI,CAAC,MAAM;QACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;QAC7D,cAAc,EAAE;YACd,cAAc;YACd,eAAe;YACf,cAAc;YACd,WAAW;SACZ;QACD,cAAc,EAAE;YACd,cAAc;YACd,eAAe;YACf,QAAQ;YACR,aAAa;SACd;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handling Middleware
|
|
3
|
+
* Global error handler and custom error classes
|
|
4
|
+
*/
|
|
5
|
+
import { Request, Response, NextFunction } from 'express';
|
|
6
|
+
/**
|
|
7
|
+
* Custom application errors
|
|
8
|
+
*/
|
|
9
|
+
export declare class AppError extends Error {
|
|
10
|
+
code: string;
|
|
11
|
+
message: string;
|
|
12
|
+
statusCode: number;
|
|
13
|
+
details?: Record<string, any> | undefined;
|
|
14
|
+
constructor(code: string, message: string, statusCode?: number, details?: Record<string, any> | undefined);
|
|
15
|
+
}
|
|
16
|
+
export declare class NotFoundError extends AppError {
|
|
17
|
+
constructor(resource: string, id?: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class ValidationError extends AppError {
|
|
20
|
+
constructor(message: string, details?: Record<string, any>);
|
|
21
|
+
}
|
|
22
|
+
export declare class UnauthorizedError extends AppError {
|
|
23
|
+
constructor(message?: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class ForbiddenError extends AppError {
|
|
26
|
+
constructor(message?: string);
|
|
27
|
+
}
|
|
28
|
+
export declare class ConflictError extends AppError {
|
|
29
|
+
constructor(message: string, details?: Record<string, any>);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Global error handling middleware
|
|
33
|
+
* Must be registered last in middleware chain
|
|
34
|
+
*/
|
|
35
|
+
export declare function errorHandler(): (err: Error, req: Request, res: Response, _next: NextFunction) => Response<any, Record<string, any>>;
|
|
36
|
+
/**
|
|
37
|
+
* 404 Not Found handler
|
|
38
|
+
* For unmatched routes
|
|
39
|
+
*/
|
|
40
|
+
export declare function notFoundHandler(): (req: Request, res: Response) => void;
|
|
41
|
+
/**
|
|
42
|
+
* Async handler wrapper
|
|
43
|
+
* Catches async errors and passes to error middleware
|
|
44
|
+
*/
|
|
45
|
+
export declare function asyncHandler(fn: (req: Request, res: Response, next: NextFunction) => Promise<any>): (req: Request, res: Response, next: NextFunction) => void;
|
|
46
|
+
//# sourceMappingURL=error.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.middleware.d.ts","sourceRoot":"","sources":["../../../../src/middleware/error.middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;gBAH7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAA;CAMvC;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;CAS1C;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAI3D;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,SAA4B;CAIhD;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,OAAO,SAAkB;CAItC;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAI3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,KAClB,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,OAAO,YAAY,wCA4ErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,KACrB,KAAK,OAAO,EAAE,KAAK,QAAQ,UAsBpC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,CAAC,IACxF,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UAGxD"}
|